[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\nindent_size = 4\ntrim_trailing_whitespace = true\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[*.{yml,yaml}]\nindent_size = 2\n"
  },
  {
    "path": ".gitattributes",
    "content": "* text=auto eol=lf\n\n*.blade.php diff=html\n*.css diff=css\n*.html diff=html\n*.md diff=markdown\n*.php diff=php\n\n/.github export-ignore\nCHANGELOG.md export-ignore\n.styleci.yml export-ignore\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\nopen_collective: bagisto"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/1_Bug_report.md",
    "content": "---\nname: \"🐛 Bug Report\"\nabout: 'Report a general library issue.'\n---\n\n# Bug report\n\n### Title\n**Just a quick sentence to brief your trouble with Krayin CRM or something associated with it.**\n**Please be calm, short and emphasize on points.**\n\n### Issue Description\n**Description helps the developers to understand the bug. It describes the problem encountered or some after effect of some kind.**\n\n### Preconditions\n**Please provide as detailed information about your environment as possible.**\n\n    1. framework Version.\n    2. Commit id.\n\n### Steps to reproduce\n**It is important to provide a set of clear steps to reproduce this bug.If relevant please include code samples.**\n\n    1. step1\n    2. step2\n\n### Expected result\n**Tell us what should happen.**\n\n*   [Screenshots, logs or description]\n\n### Actual result\n\n>    **Tell us what happens instead.**\n\n* [points....]"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/2_Feature_request.md",
    "content": "---\nname: \"💡 Feature Request\"\nabout: 'For ideas or feature requests, please make a pull request, or open an issue'\n---\n\nThis repository is only for reporting bugs or issues. If you need support, please use\nother channels:\n\n1. Write an email - mailto:support@krayincrm.com\n\n2. Create support ticket on https://krayincrm.uvdesk.com\n\n3. Visit forums to get support from our community (https://forums.krayincrm.com)\n\nAlternatively, you may use Facebook (https://www.facebook.com/groups/krayincrm/).\n\nWe promise that more channels are coming soon!!!"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/3_Support_question.md",
    "content": "---\nname: \"❔ Support Question\"\nabout: 'This repository is only for reporting bugs or problems. If you need help, see:\n  https://github.com/krayin/laravel-crm#documentation'\n---\n\nThis repository is only for reporting bugs or issues. If you need support, please use:\n\n1. Create support ticket on https://krayincrm.uvdesk.com\n\nThanks!\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/4_Security_vulnerabilities.md",
    "content": "---\nname: \"🔒 Security Vulnerabilities\"\nabout: 'For reporting security-related issues, see: https://github.com/krayin/laravel-crm#security-vulnerabilities'\n---\n\nPLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY, SEE BELOW.\n\nIf you have security vulnerability to address related to Krayin then please write a mail to us:\n**support@krayincrm.com**"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "## Issue Reference\n<!--- Please mention issue #id or use a comma if your pull request solves multiple issues. -->\n\n## Description\n<!--- Please describe your changes in detail. -->\n\n## How To Test This?\n<!--- Please describe in detail how to test the changes made in this pull request. -->\n\n## Documentation\n- [ ] My pull request requires an update on the documentation repository.\n<!--- Please describe in detail what needs to be changed. --->\n\n## Branch Selection\n<!--- Please specify the target branch for this pull request. -->\n- [ ] Target Branch: master \n\n## Tailwind Reordering\n<!--- Please make sure all the Tailwind classes are reordered. -->"
  },
  {
    "path": ".github/workflows/admin_playwright_tests.yml",
    "content": "name: Admin | Playwright Tests\n\non: [push, pull_request]\n\npermissions:\n  contents: read\n\nenv:\n  FORCE_COLOR: 1\n\njobs:\n  admin_playwright_test:\n    runs-on: ${{ matrix.operating-systems }}\n\n    strategy:\n      fail-fast: false\n      matrix:\n        operating-systems: [ubuntu-latest]\n        php-versions: ['8.3']\n        node-version: ['22.13.1']\n        shard-index: [1,2,3,4,5,6]\n        shard-total: [6]\n\n    name: Admin | Playwright Tests | Shard ${{ matrix.shard-index }} Of ${{ matrix.shard-total }}\n\n    services:\n      mysql:\n        image: mysql:8.0\n        env:\n          MYSQL_ROOT_PASSWORD: root\n          MYSQL_DATABASE: krayin\n        ports:\n          - 3306\n        options: --health-cmd=\"mysqladmin ping\" --health-interval=10s --health-timeout=5s --health-retries=5\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: ${{ matrix.php-versions }}\n          extensions: curl, fileinfo, gd, intl, mbstring, openssl, pdo, pdo_mysql, tokenizer, zip\n          ini-values: error_reporting=E_ALL\n          tools: composer:v2\n\n      - name: Set Up Node.js\n        uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node-version }}\n\n      - name: Install Node.js Dependencies\n        run: npm install\n        working-directory: packages/Webkul/Admin\n\n      - name: Install Playwright Browsers\n        run: npx playwright install --with-deps\n        working-directory: packages/Webkul/Admin\n\n      - name: Setting Environment\n        run: |\n          cp .env.example .env\n          sed -i \"s|^\\(DB_HOST=\\s*\\).*$|\\1127.0.0.1|\" .env\n          sed -i \"s|^\\(DB_PORT=\\s*\\).*$|\\1${{ job.services.mysql.ports['3306'] }}|\" .env\n          sed -i \"s|^\\(DB_DATABASE=\\s*\\).*$|\\1krayin|\" .env\n          sed -i \"s|^\\(DB_USERNAME=\\s*\\).*$|\\1root|\" .env\n          sed -i \"s|^\\(DB_PASSWORD=\\s*\\).*$|\\1root|\" .env\n          sed -i \"s|^\\(APP_DEBUG=\\s*\\).*$|\\1true|\" .env\n          sed -i \"s|^\\(APP_URL=\\s*\\).*$|\\1http://127.0.0.1:8000|\" .env\n          cat .env\n\n      - name: Install Composer Dependencies\n        run: composer install\n\n      - name: Running Krayin Installer\n        run: php artisan krayin-crm:install --skip-env-check --skip-admin-creation\n\n      - name: Clear Laravel Caches\n        run: php artisan optimize:clear\n\n      - name: Verify Activity Binding\n        run: |\n          php artisan tinker --execute=\"\n          // 1) Laravel container binding (needed by repositories)\n          if (! app()->bound(Webkul\\\\Activity\\\\Contracts\\\\Activity::class)) {\n              throw new RuntimeException('Activity contract is NOT bound in Laravel container');\n          }\n\n          // 2) Concord model-proxy registry (needed by ActivityProxy::modelClass())\n          \\$concord = app('concord');\n          if (! \\$concord->model(Webkul\\\\Activity\\\\Contracts\\\\Activity::class)) {\n              throw new RuntimeException('Activity contract is NOT registered in Concord model registry');\n          }\n\n          dump(app()->make(Webkul\\\\Activity\\\\Contracts\\\\Activity::class)::class);\n          dump(\\$concord->model(Webkul\\\\Activity\\\\Contracts\\\\Activity::class));\n          \"\n\n      # - name: Seed Product Table\n      #   run: php artisan db:seed --class=\"Webkul\\\\Installer\\\\Database\\\\Seeders\\\\ProductTableSeeder\"\n\n      - name: Start Laravel server\n        run: |\n          php artisan serve --host=0.0.0.0 --port=8000 > server.log 2>&1 &\n          echo \"Waiting for server to start...\"\n          timeout 30 bash -c 'until curl -s http://127.0.0.1:8000 > /dev/null; do sleep 1; done'\n\n      - name: Run All Playwright Tests\n        env:\n          BASE_URL: 'http://127.0.0.1:8000'\n        run: |\n          npx playwright test --reporter=list --config=tests/e2e-pw/playwright.config.ts --shard=${{ matrix.shard-index }}/${{ matrix.shard-total }}\n        working-directory: packages/Webkul/Admin\n\n      - name: Upload Test Results\n        uses: actions/upload-artifact@v4\n        if: always()\n        with:\n          name: test-results-${{ matrix.shard-index }}-${{ github.run_id }}-${{ github.run_number }}\n          path: packages/Webkul/Admin/tests/e2e-pw/test-results\n          retention-days: 1\n"
  },
  {
    "path": ".github/workflows/auto_commits.yml",
    "content": "name: Linting Tests\n\non: [push, pull_request]\n\npermissions:\n  contents: write\n\njobs:\n  linting_tests:\n    runs-on: ${{ matrix.operating-systems }}\n\n    strategy:\n      matrix:\n        operating-systems: [ubuntu-latest]\n        php-versions: ['8.3']\n\n    name: PHP ${{ matrix.php-versions }} test on ${{ matrix.operating-systems }}\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: ${{ matrix.php-versions }}\n          tools: composer:v2\n\n      - name: Install Pint\n        run: composer global require laravel/pint\n        env:\n          COMPOSER_HOME: ${{ runner.temp }}/composer\n\n      - name: Run Pint\n        run: ${{ runner.temp }}/composer/vendor/bin/pint\n\n      - name: Commit Linted Files\n        uses: stefanzweifel/git-auto-commit-action@v5\n        with:\n          commit_message: \"chore: applied pint changes\"\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\n\non: [push, pull_request]\n\njobs:\n  tests:\n    runs-on: ${{ matrix.operating-system }}\n\n    strategy:\n      matrix:\n        operating-system: [ubuntu-latest]\n        php-versions: [\"8.3\"]\n\n    name: PHP ${{ matrix.php-versions }} test on ${{ matrix.operating-system }}\n\n    services:\n      mysql:\n        image: mysql:8.0\n        env:\n          MYSQL_ROOT_PASSWORD: root\n          MYSQL_DATABASE: krayin\n        ports:\n          - 3306\n        options: --health-cmd=\"mysqladmin ping\" --health-interval=10s --health-timeout=5s --health-retries=5\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v2\n\n      - name: Setup PHP\n        uses: shivammathur/setup-php@v2\n        with:\n          php-version: ${{ matrix.php-versions }}\n          extensions: curl, gd, intl, mbstring, openssl, pdo, pdo_mysql, tokenizer, zip\n          ini-values: error_reporting=E_ALL\n          tools: composer:v2\n\n      - name: Running Composer Install\n        run: composer install --no-interaction --prefer-dist --no-progress\n\n      - name: Set Testing Environment\n        run: |\n          cp .env.example .env\n          sed -i \"s|^\\(APP_ENV=\\s*\\).*$|\\1testing|\" .env\n          sed -i \"s|^\\(DB_HOST=\\s*\\).*$|\\1127.0.0.1|\" .env\n          sed -i \"s|^\\(DB_PORT=\\s*\\).*$|\\1${{ job.services.mysql.ports['3306'] }}|\" .env\n          sed -i \"s|^\\(DB_DATABASE=\\s*\\).*$|\\1krayin|\" .env\n          sed -i \"s|^\\(DB_USERNAME=\\s*\\).*$|\\1root|\" .env\n          sed -i \"s|^\\(DB_PASSWORD=\\s*\\).*$|\\1root|\" .env\n\n      - name: Running Krayin Installer\n        run: php artisan krayin-crm:install --skip-env-check --skip-admin-creation\n\n      - name: Running Pest Test\n        run: vendor/bin/pest --parallel --colors=always\n"
  },
  {
    "path": ".gitignore",
    "content": ".env\n.env.testing\n.idea\n.php_cs.cache\n.phpunit.result.cache\n.vscode\n.vagrant\n*.hot\n/stubs\n/data\n/docker-compose-collection\nHomestead.json\nHomestead.yaml\n/ignorables/*\n/node_modules\nnpm-debug.log\npackage-lock.json\n/playwright-report\n/public/css\n/public/js\n/public/hot\n/public/storage\n/public/vendor\n/lang/vendor\n/storage/*.key\n/storage/dcc-data/\n/vendor\nyarn.lock\nyarn-error.log\n\n# Playwright\nnode_modules/\n/test-results/\n/blob-report/\n/playwright/.cache/\n"
  },
  {
    "path": ".styleci.yml",
    "content": "php:\n  preset: laravel\n  disabled:\n    - no_unused_imports\n  finder:\n    not-name:\n      - index.php\njs: true\ncss: true\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# CHANGELOG for 2.2\n\nThis changelog consists of the bug & security fixes and new features being included in the releases listed below.\n\n## **v2.2.0 (17th of March 2026)** *Release*\n\n* **[Laravel 12 Upgrade]** Upgraded framework to Laravel 12\n\n* #2480[enhancement] Codebase updates and refinements.\n\n* #2478[enhancement] Improved class instantiation handling.\n\n* #2472[enhancement] Upgrade to Laravel 12.\n\n* #2470[enhancement] Updated auto_commits.yml configuration.\n\n* #2469[enhancement] General enhancements and optimizations.\n\n* #2468[enhancement] Documentation updates (MD files).\n\n* #2450[fixed] Added ACL support for warehouses.\n\n* #2444[fixed] Improved global search functionality for organizations."
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at support@krayincrm.com. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see\nhttps://www.contributor-covenant.org/faq\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright 2010-2025, Webkul Software\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\nINCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A \nPARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT \nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION \nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE \nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n    <a href=\"https://krayincrm.com\">\n        <picture>\n            <source media=\"(prefers-color-scheme: dark)\" height=\"100\" srcset=\"packages/Webkul/Admin/src/Resources/assets/images/dark-logo.svg\">\n            <source media=\"(prefers-color-scheme: light)\" height=\"100\" srcset=\"packages/Webkul/Admin/src/Resources/assets/images/logo.svg\">\n            <img alt=\"Krayin CRM\" height=\"100\" src=\"packages/Webkul/Admin/src/Resources/assets/images/logo.svg\">\n        </picture>\n    </a>\n</p>\n\n<p align=\"center\">\n<a href=\"https://packagist.org/packages/krayin/laravel-crm\"><img src=\"https://poser.pugx.org/krayin/laravel-crm/d/total.svg\" alt=\"Total Downloads\"></a>\n<a href=\"https://packagist.org/packages/krayin/laravel-crm\"><img src=\"https://poser.pugx.org/krayin/laravel-crm/v/stable.svg\" alt=\"Latest Stable Version\"></a>\n<a href=\"https://packagist.org/packages/krayin/laravel-crm\"><img src=\"https://poser.pugx.org/krayin/laravel-crm/license.svg\" alt=\"License\"></a>\n</p>\n\n\n![enter image description here](https://raw.githubusercontent.com/krayin/temp-media/master/dashboard.png)\n\n## Topics\n\n1. [Introduction](#introduction)\n2. [Documentation](#documentation)\n3. [Requirements](#requirements)\n4. [Installation & Configuration](#installation-and-configuration)\n4. [Docker Installation](https://devdocs.krayincrm.com/2.0/introduction/docker.html)\n5. [Krayin Cloud System](#krayin-cloud-system)\n6. [License](#license)\n7. [Security Vulnerabilities](#security-vulnerabilities)\n\n### Introduction\n\n[Krayin CRM](https://krayincrm.com) is a hand tailored CRM framework built on some of the hottest opensource technologies\nsuch as [Laravel](https://laravel.com) (a [PHP](https://secure.php.net/) framework) and [Vue.js](https://vuejs.org)\na progressive Javascript framework.\n\n**Free & Opensource Laravel CRM solution for SMEs and Enterprises for complete customer lifecycle management.**\n\n**Read our documentation: [Krayin CRM Docs](https://devdocs.krayincrm.com/)**\n\n**We also have a forum for any type of concerns, feature requests, or discussions. Please visit: [Krayin CRM Forums](https://forums.krayincrm.com/)**\n\n# Visit our live [Demo](https://demo.krayincrm.com)\n\n<a href=\"javascript:void();\">\n    <img class=\"flag-img\" src=\"https://raw.githubusercontent.com/krayin/temp-media/master/visit-our-live-demo.png\" alt=\"Chinese\" width=\"100%\">\n</a>\n\nIt packs in lots of features that will allow your E-Commerce business to scale in no time:\n\n-   Descriptive and Simple Admin Panel.\n-   Admin Dashboard.\n-   Custom Attributes.\n-   Built on Modular Approach.\n-   Email parsing via Sendgrid.\n-   Check out [these features and more](https://krayincrm.com/features/).\n\n**For Developers**:\nTake advantage of two of the hottest frameworks used in this project -- Laravel and Vue.js -- both of which have been used in Krayin CRM.\n\n### Documentation\n\n#### Krayin Documentation [https://devdocs.krayincrm.com](https://devdocs.krayincrm.com)\n\n### Requirements\n\n-   **SERVER**: Apache 2 or NGINX.\n-   **RAM**: 3 GB or higher.\n-   **PHP**: 8.3 or higher\n-   **Composer**: 2.5 or higher\n-   **For MySQL users**: 8.0.32 or higher.\n\n### Installation and Configuration\n\n##### Execute these commands below, in order\n\n```\ncomposer create-project\n```\n\n-   Find **.env** file in root directory and change the **APP_URL** param to your **domain**.\n\n-   Also, Configure the **Mail** and **Database** parameters inside **.env** file.\n\n```\nphp artisan krayin-crm:install\n```\n\n**To execute Krayin**:\n\n##### On server:\n\nWarning: Before going into production mode we recommend you uninstall developer dependencies.\nIn order to do that, run the command below:\n\n> composer install --no-dev\n\n```\nOpen the specified entry point in your hosts file in your browser or make an entry in hosts file if not done.\n```\n\n##### On local:\n\n```\nphp artisan route:clear\nphp artisan serve\n```\n\n\n**How to log in as admin:**\n\n> _http(s)://example.com/admin/login_\n\n```\nemail:admin@example.com\npassword:admin123\n```\n\n### Krayin Cloud Hosting\n\n[Krayin CRM Cloud Hosting](https://krayincrm.com/crm-cloud-hosting) is a fully managed hosting solution where our team sets up, secures, and configures your Krayin CRM on reliable infrastructure.\n\nGet a ready-to-use CRM on your own domain, without manual installation or infrastructure complexity, and focus on growing your business while we handle the technology.\n\n![Krayin CRM Cloud Hosting](https://raw.githubusercontent.com/krayin/temp-media/master/cloud_hosting.png)\n\n### Krayin CRM Multi Tenant SaaS\n\n[Krayin CRM Multi Tenant SaaS](https://krayincrm.com/extensions/krayin-crm-multi-tenant-saas-extension/) Krayin Multitenant SaaS is a Laravel-based CRM solution that allows multiple businesses (tenants) to use a single application instance while keeping their data isolated and secure.\n\n![enter image description here](https://raw.githubusercontent.com/krayin/temp-media/master/krayin-saas.png)\n\n### WhatsApp CRM Integration\n\n[Krayin CRM WhatsApp](https://krayincrm.com/extensions/krayin-crm-whatsapp-extension/) Extension enables the store administrator to generate leads via their WhatsApp number.\n\n![enter image description here](https://raw.githubusercontent.com/krayin/temp-media/master/krayin-crm-whatsapp-integration.png)\n\n### VoIP CRM Integration\n\n[Krayin CRM VoIP](https://krayincrm.com/extensions/krayin-crm-voip/) extension allows the user to make Trunk calls over a broadband Internet connection and the user can also perform Inbound routes.\n\n![enter image description here](https://raw.githubusercontent.com/krayin/temp-media/master/krayin-voip.png)\n\n### License\n\nKrayin CRM is a fully open-source CRM framework which will always be free under the [MIT License](https://github.com/krayin/laravel-crm/blob/2.1/LICENSE).\n\n### Security Vulnerabilities\n\nPlease don't disclose security vulnerabilities publicly. If you find any security vulnerability in Krayin CRM then please email us: sales@krayincrm.com.\n"
  },
  {
    "path": "UPGRADE.md",
    "content": "# UPGRADE Guide\n\n- [Upgrading To v2.2 From v2.1](#upgrading-to-v22-from-v21)\n\n## High Impact Changes\n\n- [Laravel 12 Upgrade](#laravel-12-upgrade)\n\n## Upgrading To v2.2 From v2.1\n\n> [!NOTE]\n> We strive to document every potential breaking change. However, as some of these alterations occur in lesser-known sections of Krayin, only a fraction of them may impact your application.\n\n### Updating Dependencies\n\n**Impact Probability: High**\n\n#### PHP 8.3 Required\n\nKrayin CRM v2.2 now requires PHP 8.3 or greater.\n\n### Laravel 12 Upgrade\n\n**Impact Probability: High**\n\nKrayin CRM v2.2 has been upgraded to Laravel 12, which introduces stricter type checking and modernized date/time handling.\n\n#### Key Changes\n\n- **Bootstrap**: `bootstrap/app.php` now uses the new `Application::configure()` builder pattern. Service providers are listed in `bootstrap/providers.php`.\n\n- **Kernels Removed**: `app/Http/Kernel.php` and `app/Console/Kernel.php` are removed. Middleware and scheduling are configured in `bootstrap/app.php` and `routes/console.php` respectively.\n\n- **Exception Handler Removed**: `app/Exceptions/Handler.php` is removed. Exception handling is configured in `bootstrap/app.php`.\n\n- **Middleware Classes Removed**: Built-in middleware wrappers (EncryptCookies, VerifyCsrfToken, TrimStrings, TrustProxies, etc.) are removed. Customizations are now done via `bootstrap/app.php`.\n\n- **Service Providers Simplified**: `AuthServiceProvider`, `EventServiceProvider`, `RouteServiceProvider`, and `BroadcastServiceProvider` are removed. Their logic is handled in `bootstrap/app.php` or `AppServiceProvider`.\n\n- **Config**: `config/app.php` no longer contains `providers` or `aliases` arrays.\n\n- **doctrine/dbal** dependency has been removed (native column modification in Laravel 12)."
  },
  {
    "path": "app/Http/Controllers/Controller.php",
    "content": "<?php\n\nnamespace App\\Http\\Controllers;\n\nabstract class Controller\n{\n    //\n}\n"
  },
  {
    "path": "app/Models/User.php",
    "content": "<?php\n\nnamespace App\\Models;\n\nuse Database\\Factories\\UserFactory;\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Foundation\\Auth\\User as Authenticatable;\nuse Illuminate\\Notifications\\Notifiable;\n\nclass User extends Authenticatable\n{\n    /** @use HasFactory<UserFactory> */\n    use HasFactory, Notifiable;\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var list<string>\n     */\n    protected $fillable = [\n        'name',\n        'email',\n        'password',\n    ];\n\n    /**\n     * The attributes that should be hidden for serialization.\n     *\n     * @var list<string>\n     */\n    protected $hidden = [\n        'password',\n        'remember_token',\n    ];\n\n    /**\n     * Get the attributes that should be cast.\n     *\n     * @return array<string, string>\n     */\n    protected function casts(): array\n    {\n        return [\n            'email_verified_at' => 'datetime',\n            'password' => 'hashed',\n        ];\n    }\n}\n"
  },
  {
    "path": "app/Providers/AppServiceProvider.php",
    "content": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Support\\ServiceProvider;\n\nclass AppServiceProvider extends ServiceProvider\n{\n    /**\n     * Register any application services.\n     */\n    public function register(): void\n    {\n        //\n    }\n\n    /**\n     * Bootstrap any application services.\n     */\n    public function boot(): void\n    {\n        //\n    }\n}\n"
  },
  {
    "path": "artisan",
    "content": "#!/usr/bin/env php\n<?php\n\nuse Symfony\\Component\\Console\\Input\\ArgvInput;\n\ndefine('LARAVEL_START', microtime(true));\n\n// Register the Composer autoloader...\nrequire __DIR__.'/vendor/autoload.php';\n\n// Bootstrap Laravel and handle the command...\n$status = (require_once __DIR__.'/bootstrap/app.php')\n    ->handleCommand(new ArgvInput);\n\nexit($status);\n"
  },
  {
    "path": "bootstrap/app.php",
    "content": "<?php\n\nuse Illuminate\\Foundation\\Application;\nuse Illuminate\\Foundation\\Configuration\\Exceptions;\nuse Illuminate\\Foundation\\Configuration\\Middleware;\nuse Laravel\\Sanctum\\Http\\Middleware\\EnsureFrontendRequestsAreStateful;\nuse Webkul\\Installer\\Http\\Middleware\\CanInstall;\n\nreturn Application::configure(basePath: dirname(__DIR__))\n    ->withRouting(\n        web: __DIR__.'/../routes/web.php',\n        api: __DIR__.'/../routes/api.php',\n        commands: __DIR__.'/../routes/console.php',\n        channels: __DIR__.'/../routes/channels.php',\n        health: '/up',\n    )\n    ->withMiddleware(function (Middleware $middleware) {\n        $middleware->append(CanInstall::class);\n\n        $middleware->encryptCookies(except: [\n            'dark_mode',\n        ]);\n\n        $middleware->validateCsrfTokens(except: [\n            'admin/mail/inbound-parse',\n            'admin/web-forms/forms/*',\n        ]);\n\n        $middleware->api(prepend: [\n            EnsureFrontendRequestsAreStateful::class,\n        ]);\n    })\n    ->withExceptions(function (Exceptions $exceptions) {\n        //\n    })->create();\n"
  },
  {
    "path": "bootstrap/cache/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "bootstrap/providers.php",
    "content": "<?php\n\nuse App\\Providers\\AppServiceProvider;\nuse Barryvdh\\DomPDF\\ServiceProvider;\nuse Konekt\\Concord\\ConcordServiceProvider;\nuse Prettus\\Repository\\Providers\\RepositoryServiceProvider;\nuse Webkul\\Activity\\Providers\\ActivityServiceProvider;\nuse Webkul\\Admin\\Providers\\AdminServiceProvider;\nuse Webkul\\Attribute\\Providers\\AttributeServiceProvider;\nuse Webkul\\Automation\\Providers\\WorkflowServiceProvider;\nuse Webkul\\Contact\\Providers\\ContactServiceProvider;\nuse Webkul\\Core\\Providers\\CoreServiceProvider;\nuse Webkul\\DataGrid\\Providers\\DataGridServiceProvider;\nuse Webkul\\DataTransfer\\Providers\\DataTransferServiceProvider;\nuse Webkul\\Email\\Providers\\EmailServiceProvider;\nuse Webkul\\EmailTemplate\\Providers\\EmailTemplateServiceProvider;\nuse Webkul\\Installer\\Providers\\InstallerServiceProvider;\nuse Webkul\\Lead\\Providers\\LeadServiceProvider;\nuse Webkul\\Marketing\\Providers\\MarketingServiceProvider;\nuse Webkul\\Product\\Providers\\ProductServiceProvider;\nuse Webkul\\Quote\\Providers\\QuoteServiceProvider;\nuse Webkul\\Tag\\Providers\\TagServiceProvider;\nuse Webkul\\User\\Providers\\UserServiceProvider;\nuse Webkul\\Warehouse\\Providers\\WarehouseServiceProvider;\nuse Webkul\\WebForm\\Providers\\WebFormServiceProvider;\n\nreturn [\n    /*\n     * Package Service Providers...\n     */\n    ServiceProvider::class,\n    ConcordServiceProvider::class,\n    RepositoryServiceProvider::class,\n\n    /*\n     * Application Service Providers...\n     */\n    AppServiceProvider::class,\n\n    /*\n     * Webkul Service Providers...\n     */\n    ActivityServiceProvider::class,\n    AdminServiceProvider::class,\n    AttributeServiceProvider::class,\n    WorkflowServiceProvider::class,\n    ContactServiceProvider::class,\n    CoreServiceProvider::class,\n    DataGridServiceProvider::class,\n    DataTransferServiceProvider::class,\n    EmailTemplateServiceProvider::class,\n    EmailServiceProvider::class,\n    MarketingServiceProvider::class,\n    InstallerServiceProvider::class,\n    LeadServiceProvider::class,\n    ProductServiceProvider::class,\n    QuoteServiceProvider::class,\n    TagServiceProvider::class,\n    UserServiceProvider::class,\n    WarehouseServiceProvider::class,\n    WebFormServiceProvider::class,\n];\n"
  },
  {
    "path": "composer.json",
    "content": "{\n    \"name\": \"krayin/laravel-crm\",\n    \"type\": \"project\",\n    \"description\": \"Krayin CRM\",\n    \"keywords\": [\n        \"framework\",\n        \"laravel\"\n    ],\n    \"license\": \"MIT\",\n    \"require\": {\n        \"php\": \"^8.3\",\n        \"barryvdh/laravel-dompdf\": \"^3.1\",\n        \"diglactic/laravel-breadcrumbs\": \"^10.0\",\n        \"enshrined/svg-sanitize\": \"^0.22.0\",\n        \"guzzlehttp/guzzle\": \"^7.8\",\n        \"khaled.alshamaa/ar-php\": \"^6.3\",\n        \"konekt/concord\": \"^1.17\",\n        \"laravel/framework\": \"^12.0\",\n        \"laravel/sanctum\": \"^4.0\",\n        \"laravel/tinker\": \"^2.10\",\n        \"laravel/ui\": \"^4.6\",\n        \"league/fractal\": \"^0.21.0\",\n        \"maatwebsite/excel\": \"^3.1\",\n        \"mpdf/mpdf\": \"^8.2\",\n        \"prettus/l5-repository\": \"^3.0\",\n        \"smalot/pdfparser\": \"^2.11\",\n        \"webklex/laravel-imap\": \"^6.0\"\n    },\n    \"require-dev\": {\n        \"barryvdh/laravel-debugbar\": \"^3.14\",\n        \"fakerphp/faker\": \"^1.23\",\n        \"krayin/krayin-package-generator\": \"dev-master\",\n        \"laravel/pint\": \"^1.18\",\n        \"laravel/sail\": \"^1.38\",\n        \"mockery/mockery\": \"^1.6\",\n        \"nunomaduro/collision\": \"^8.0\",\n        \"pestphp/pest\": \"^3.0\",\n        \"pestphp/pest-plugin-laravel\": \"^3.0\",\n        \"phpunit/phpunit\": \"^11.0\",\n        \"spatie/laravel-ignition\": \"^2.8\"\n    },\n    \"config\": {\n        \"optimize-autoloader\": true,\n        \"platform\": {\n            \"php\": \"8.3.30\"\n        },\n        \"preferred-install\": \"dist\",\n        \"sort-packages\": true,\n        \"allow-plugins\": {\n            \"pestphp/pest-plugin\": true\n        }\n    },\n    \"extra\": {\n        \"laravel\": {\n            \"dont-discover\": []\n        }\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"App\\\\\": \"app/\",\n            \"Database\\\\Factories\\\\\": \"database/factories/\",\n            \"Database\\\\Seeders\\\\\": \"database/seeders/\",\n            \"Webkul\\\\Activity\\\\\": \"packages/Webkul/Activity/src\",\n            \"Webkul\\\\Admin\\\\\": \"packages/Webkul/Admin/src\",\n            \"Webkul\\\\Attribute\\\\\": \"packages/Webkul/Attribute/src\",\n            \"Webkul\\\\Contact\\\\\": \"packages/Webkul/Contact/src\",\n            \"Webkul\\\\Core\\\\\": \"packages/Webkul/Core/src\",\n            \"Webkul\\\\DataGrid\\\\\": \"packages/Webkul/DataGrid/src\",\n            \"Webkul\\\\DataTransfer\\\\\": \"packages/Webkul/DataTransfer/src\",\n            \"Webkul\\\\Email\\\\\": \"packages/Webkul/Email/src\",\n            \"Webkul\\\\EmailTemplate\\\\\": \"packages/Webkul/EmailTemplate/src\",\n            \"Webkul\\\\Marketing\\\\\": \"packages/Webkul/Marketing/src\",\n            \"Webkul\\\\Installer\\\\\": \"packages/Webkul/Installer/src\",\n            \"Webkul\\\\Lead\\\\\": \"packages/Webkul/Lead/src\",\n            \"Webkul\\\\Product\\\\\": \"packages/Webkul/Product/src\",\n            \"Webkul\\\\Quote\\\\\": \"packages/Webkul/Quote/src\",\n            \"Webkul\\\\Tag\\\\\": \"packages/Webkul/Tag/src\",\n            \"Webkul\\\\User\\\\\": \"packages/Webkul/User/src\",\n            \"Webkul\\\\Warehouse\\\\\": \"packages/Webkul/Warehouse/src\",\n            \"Webkul\\\\WebForm\\\\\": \"packages/Webkul/WebForm/src\",\n            \"Webkul\\\\Automation\\\\\": \"packages/Webkul/Automation/src\"\n        }\n    },\n    \"autoload-dev\": {\n        \"psr-4\": {\n            \"Tests\\\\\": \"tests/\"\n        }\n    },\n    \"repositories\": [\n        {\n            \"type\": \"path\",\n            \"url\": \"packages/*/*\",\n            \"options\": {\n                \"symlink\": true\n            }\n        }\n    ],\n    \"minimum-stability\": \"stable\",\n    \"prefer-stable\": true,\n    \"scripts\": {\n        \"post-autoload-dump\": [\n            \"Illuminate\\\\Foundation\\\\ComposerScripts::postAutoloadDump\",\n            \"@php artisan package:discover --ansi\"\n        ],\n        \"post-root-package-install\": [\n            \"@php -r \\\"file_exists('.env') || copy('.env.example', '.env');\\\"\"\n        ],\n        \"post-create-project-cmd\": [\n            \"@php artisan key:generate --ansi\"\n        ]\n    }\n}\n"
  },
  {
    "path": "config/app.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Name\n    |--------------------------------------------------------------------------\n    |\n    | This value is the name of your application. This value is used when the\n    | framework needs to place the application's name in a notification or\n    | any other location as required by the application or its packages.\n    |\n     */\n\n    'name' => env('APP_NAME', 'Laravel'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Environment\n    |--------------------------------------------------------------------------\n    |\n    | This value determines the \"environment\" your application is currently\n    | running in. This may determine how you prefer to configure various\n    | services the application utilizes. Set this in your \".env\" file.\n    |\n     */\n\n    'env' => env('APP_ENV', 'production'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Debug Mode\n    |--------------------------------------------------------------------------\n    |\n    | When your application is in debug mode, detailed error messages with\n    | stack traces will be shown on every error that occurs within your\n    | application. If disabled, a simple generic error page is shown.\n    |\n     */\n\n    'debug' => (bool) env('APP_DEBUG', false),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application URL\n    |--------------------------------------------------------------------------\n    |\n    | This URL is used by the console to properly generate URLs when using\n    | the Artisan command line tool. You should set this to the root of\n    | your application so that it is used when running Artisan tasks.\n    |\n     */\n\n    'url' => env('APP_URL', 'http://localhost'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Admin URL\n    |--------------------------------------------------------------------------\n    |\n    | This URL suffix is used to define the admin url for example\n    | admin/ or backend/\n    |\n     */\n\n    'admin_path' => env('APP_ADMIN_PATH', 'admin'),\n\n    'asset_url' => env('ASSET_URL'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Timezone\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify the default timezone for your application, which\n    | will be used by the PHP date and date-time functions. We have gone\n    | ahead and set this to a sensible default for you out of the box.\n    |\n     */\n\n    'timezone' => env('APP_TIMEZONE', 'Asia/Kolkata'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Locale Configuration\n    |--------------------------------------------------------------------------\n    |\n    | The application locale determines the default locale that will be used\n    | by the translation service provider. You are free to set this value\n    | to any of the locales which will be supported by the application.\n    |\n     */\n\n    'locale' => env('APP_LOCALE', 'en'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Available Locales Configuration\n    |--------------------------------------------------------------------------\n    |\n    | The application available locale determines the supported locales\n    | by application\n    |\n     */\n\n    'available_locales' => [\n        'ar' => 'Arabic',\n        'en' => 'English',\n        'es' => 'Español',\n        'fa' => 'Persian',\n        'pt_BR' => 'Portuguese',\n        'tr' => 'Türkçe',\n        'vi' => 'Vietnamese',\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Application Fallback Locale\n    |--------------------------------------------------------------------------\n    |\n    | The fallback locale determines the locale to use when the current one\n    | is not available. You may change the value to correspond to any of\n    | the language folders that are provided through your application.\n    |\n     */\n\n    'fallback_locale' => 'en',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Faker Locale\n    |--------------------------------------------------------------------------\n    |\n    | This locale will be used by the Faker PHP library when generating fake\n    | data for your database seeds. For example, this will be used to get\n    | localized telephone numbers, street address information and more.\n    |\n     */\n\n    'faker_locale' => 'en_US',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Base Currency Code\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify the base currency code for your application.\n    |\n     */\n\n    'currency' => env('APP_CURRENCY', 'USD'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Encryption Key\n    |--------------------------------------------------------------------------\n    |\n    | This key is used by the Illuminate encrypter service and should be set\n    | to a random, 32 character string, otherwise these encrypted strings\n    | will not be safe. Please do this before deploying an application!\n    |\n     */\n\n    'key' => env('APP_KEY'),\n\n    'cipher' => 'AES-256-CBC',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Maintenance Mode Driver\n    |--------------------------------------------------------------------------\n    |\n    | These configuration options determine the driver used to determine and\n    | manage Laravel's \"maintenance mode\" status. The \"cache\" driver will\n    | allow maintenance mode to be controlled across multiple machines.\n    |\n    | Supported drivers: \"file\", \"cache\"\n    |\n     */\n\n    'maintenance' => [\n        'driver' => env('APP_MAINTENANCE_DRIVER', 'file'),\n        'store' => env('APP_MAINTENANCE_STORE', 'database'),\n    ],\n];\n"
  },
  {
    "path": "config/auth.php",
    "content": "<?php\n\nuse Webkul\\User\\Models\\User;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Authentication Defaults\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default authentication \"guard\" and password\n    | reset options for your application. You may change these defaults\n    | as required, but they're a perfect start for most applications.\n    |\n    */\n\n    'defaults' => [\n        'guard' => 'user',\n        'passwords' => 'users',\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Authentication Guards\n    |--------------------------------------------------------------------------\n    |\n    | Next, you may define every authentication guard for your application.\n    | Of course, a great default configuration has been defined for you\n    | here which uses session storage and the Eloquent user provider.\n    |\n    | All authentication drivers have a user provider. This defines how the\n    | users are actually retrieved out of your database or other storage\n    | mechanisms used by this application to persist your user's data.\n    |\n    | Supported: \"session\", \"token\"\n    |\n    */\n\n    'guards' => [\n        'user' => [\n            'driver' => 'session',\n            'provider' => 'users',\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | User Providers\n    |--------------------------------------------------------------------------\n    |\n    | All authentication drivers have a user provider. This defines how the\n    | users are actually retrieved out of your database or other storage\n    | mechanisms used by this application to persist your user's data.\n    |\n    | If you have multiple user tables or models you may configure multiple\n    | sources which represent each model / table. These sources may then\n    | be assigned to any extra authentication guards you have defined.\n    |\n    | Supported: \"database\", \"eloquent\"\n    |\n    */\n\n    'providers' => [\n        'users' => [\n            'driver' => 'eloquent',\n            'model' => User::class,\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Resetting Passwords\n    |--------------------------------------------------------------------------\n    |\n    | You may specify multiple password reset configurations if you have more\n    | than one user table or model in the application and you want to have\n    | separate password reset settings based on the specific user types.\n    |\n    | The expire time is the number of minutes that the reset token should be\n    | considered valid. This security feature keeps tokens short-lived so\n    | they have less time to be guessed. You may change this as needed.\n    |\n    */\n\n    'passwords' => [\n        'users' => [\n            'provider' => 'users',\n            'table' => 'user_password_resets',\n            'expire' => 60,\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Password Confirmation Timeout\n    |--------------------------------------------------------------------------\n    |\n    | Here you may define the amount of seconds before a password confirmation\n    | times out and the user is prompted to re-enter their password via the\n    | confirmation screen. By default, the timeout lasts for three hours.\n    |\n    */\n\n    'password_timeout' => 10800,\n\n];\n"
  },
  {
    "path": "config/breadcrumbs.php",
    "content": "<?php\n\nuse Diglactic\\Breadcrumbs\\Generator;\nuse Diglactic\\Breadcrumbs\\Manager;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | View Name\n    |--------------------------------------------------------------------------\n    |\n    | Choose a view to display when Breadcrumbs::render() is called.\n    | Built in templates are:\n    |\n    | - 'breadcrumbs::bootstrap5'  - Bootstrap 5\n    | - 'breadcrumbs::bootstrap4'  - Bootstrap 4\n    | - 'breadcrumbs::bulma'       - Bulma\n    | - 'breadcrumbs::foundation6' - Foundation 6\n    | - 'breadcrumbs::json-ld'     - JSON-LD Structured Data\n    | - 'breadcrumbs::materialize' - Materialize\n    | - 'breadcrumbs::tailwind'    - Tailwind CSS\n    | - 'breadcrumbs::uikit'       - UIkit\n    |\n    | Or a custom view, e.g. '_partials/breadcrumbs'.\n    |\n    */\n\n    'view' => 'breadcrumbs::bootstrap5',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Breadcrumbs File(s)\n    |--------------------------------------------------------------------------\n    |\n    | The file(s) where breadcrumbs are defined. e.g.\n    |\n    | - base_path('routes/breadcrumbs.php')\n    | - glob(base_path('breadcrumbs/*.php'))\n    |\n    */\n\n    'files' => base_path('routes/breadcrumbs.php'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Exceptions\n    |--------------------------------------------------------------------------\n    |\n    | Determine when to throw an exception.\n    |\n    */\n\n    // When route-bound breadcrumbs are used but the current route doesn't have a name (UnnamedRouteException)\n    'unnamed-route-exception' => true,\n\n    // When route-bound breadcrumbs are used and the matching breadcrumb doesn't exist (InvalidBreadcrumbException)\n    'missing-route-bound-breadcrumb-exception' => true,\n\n    // When a named breadcrumb is used but doesn't exist (InvalidBreadcrumbException)\n    'invalid-named-breadcrumb-exception' => true,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Classes\n    |--------------------------------------------------------------------------\n    |\n    | Subclass the default classes for more advanced customisations.\n    |\n    */\n\n    // Manager\n    'manager-class' => Manager::class,\n\n    // Generator\n    'generator-class' => Generator::class,\n\n];\n"
  },
  {
    "path": "config/broadcasting.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Broadcaster\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default broadcaster that will be used by the\n    | framework when an event needs to be broadcast. You may set this to\n    | any of the connections defined in the \"connections\" array below.\n    |\n    | Supported: \"pusher\", \"ably\", \"redis\", \"log\", \"null\"\n    |\n    */\n\n    'default' => env('BROADCAST_DRIVER', 'null'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Broadcast Connections\n    |--------------------------------------------------------------------------\n    |\n    | Here you may define all of the broadcast connections that will be used\n    | to broadcast events to other systems or over websockets. Samples of\n    | each available type of connection are provided inside this array.\n    |\n    */\n\n    'connections' => [\n\n        'pusher' => [\n            'driver' => 'pusher',\n            'key' => env('PUSHER_APP_KEY'),\n            'secret' => env('PUSHER_APP_SECRET'),\n            'app_id' => env('PUSHER_APP_ID'),\n            'options' => [\n                'cluster' => env('PUSHER_APP_CLUSTER'),\n                'useTLS' => true,\n            ],\n        ],\n\n        'ably' => [\n            'driver' => 'ably',\n            'key' => env('ABLY_KEY'),\n        ],\n\n        'redis' => [\n            'driver' => 'redis',\n            'connection' => 'default',\n        ],\n\n        'log' => [\n            'driver' => 'log',\n        ],\n\n        'null' => [\n            'driver' => 'null',\n        ],\n\n    ],\n\n];\n"
  },
  {
    "path": "config/cache.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Str;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Cache Store\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default cache connection that gets used while\n    | using this caching library. This connection is used when another is\n    | not explicitly specified when executing a given caching function.\n    |\n    */\n\n    'default' => env('CACHE_DRIVER', 'file'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Cache Stores\n    |--------------------------------------------------------------------------\n    |\n    | Here you may define all of the cache \"stores\" for your application as\n    | well as their drivers. You may even define multiple stores for the\n    | same cache driver to group types of items stored in your caches.\n    |\n    | Supported drivers: \"apc\", \"array\", \"database\", \"file\",\n    |            \"memcached\", \"redis\", \"dynamodb\", \"null\"\n    |\n    */\n\n    'stores' => [\n\n        'apc' => [\n            'driver' => 'apc',\n        ],\n\n        'array' => [\n            'driver' => 'array',\n            'serialize' => false,\n        ],\n\n        'database' => [\n            'driver' => 'database',\n            'table' => 'cache',\n            'connection' => null,\n            'lock_connection' => null,\n        ],\n\n        'file' => [\n            'driver' => 'file',\n            'path' => storage_path('framework/cache/data'),\n        ],\n\n        'memcached' => [\n            'driver' => 'memcached',\n            'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),\n            'sasl' => [\n                env('MEMCACHED_USERNAME'),\n                env('MEMCACHED_PASSWORD'),\n            ],\n            'options' => [\n                // Memcached::OPT_CONNECT_TIMEOUT => 2000,\n            ],\n            'servers' => [\n                [\n                    'host' => env('MEMCACHED_HOST', '127.0.0.1'),\n                    'port' => env('MEMCACHED_PORT', 11211),\n                    'weight' => 100,\n                ],\n            ],\n        ],\n\n        'redis' => [\n            'driver' => 'redis',\n            'connection' => 'cache',\n            'lock_connection' => 'default',\n        ],\n\n        'dynamodb' => [\n            'driver' => 'dynamodb',\n            'key' => env('AWS_ACCESS_KEY_ID'),\n            'secret' => env('AWS_SECRET_ACCESS_KEY'),\n            'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),\n            'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),\n            'endpoint' => env('DYNAMODB_ENDPOINT'),\n        ],\n\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Cache Key Prefix\n    |--------------------------------------------------------------------------\n    |\n    | When utilizing a RAM based store such as APC or Memcached, there might\n    | be other applications utilizing the same cache. So, we'll specify a\n    | value to get prefixed to all our keys so we can avoid collisions.\n    |\n    */\n\n    'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'),\n\n];\n"
  },
  {
    "path": "config/concord.php",
    "content": "<?php\n\nuse Webkul\\Activity\\Providers\\ModuleServiceProvider;\n\nreturn [\n    'modules' => [\n        ModuleServiceProvider::class,\n        Webkul\\Admin\\Providers\\ModuleServiceProvider::class,\n        Webkul\\Attribute\\Providers\\ModuleServiceProvider::class,\n        Webkul\\Automation\\Providers\\ModuleServiceProvider::class,\n        Webkul\\Contact\\Providers\\ModuleServiceProvider::class,\n        Webkul\\Core\\Providers\\ModuleServiceProvider::class,\n        Webkul\\DataGrid\\Providers\\ModuleServiceProvider::class,\n        Webkul\\EmailTemplate\\Providers\\ModuleServiceProvider::class,\n        Webkul\\Email\\Providers\\ModuleServiceProvider::class,\n        Webkul\\Lead\\Providers\\ModuleServiceProvider::class,\n        Webkul\\Product\\Providers\\ModuleServiceProvider::class,\n        Webkul\\Quote\\Providers\\ModuleServiceProvider::class,\n        Webkul\\Tag\\Providers\\ModuleServiceProvider::class,\n        Webkul\\User\\Providers\\ModuleServiceProvider::class,\n        Webkul\\Warehouse\\Providers\\ModuleServiceProvider::class,\n        Webkul\\WebForm\\Providers\\ModuleServiceProvider::class,\n        Webkul\\DataTransfer\\Providers\\ModuleServiceProvider::class,\n    ],\n\n    'register_route_models' => true,\n];\n"
  },
  {
    "path": "config/cors.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Laravel CORS Options\n    |--------------------------------------------------------------------------\n    |\n    | The allowed_methods and allowed_headers options are case-insensitive.\n    |\n    | You don't need to provide both allowed_origins and allowed_origins_patterns.\n    | If one of the strings passed matches, it is considered a valid origin.\n    |\n    | If ['*'] is provided to allowed_methods, allowed_origins or allowed_headers\n    | all methods / origins / headers are allowed.\n    |\n    */\n\n    /*\n     * You can enable CORS for 1 or multiple paths.\n     * Example: ['api/*']\n     */\n    'paths' => [\n        'admin/web-forms/forms/*',\n    ],\n\n    /*\n    * Matches the request method. `['*']` allows all methods.\n    */\n    'allowed_methods' => ['*'],\n\n    /*\n     * Matches the request origin. `['*']` allows all origins. Wildcards can be used, eg `*.mydomain.com`\n     */\n    'allowed_origins' => ['*'],\n\n    /*\n     * Patterns that can be used with `preg_match` to match the origin.\n     */\n    'allowed_origins_patterns' => [],\n\n    /*\n     * Sets the Access-Control-Allow-Headers response header. `['*']` allows all headers.\n     */\n    'allowed_headers' => ['*'],\n\n    /*\n     * Sets the Access-Control-Expose-Headers response header with these headers.\n     */\n    'exposed_headers' => [],\n\n    /*\n     * Sets the Access-Control-Max-Age response header when > 0.\n     */\n    'max_age' => 0,\n\n    /*\n     * Sets the Access-Control-Allow-Credentials header.\n     */\n    'supports_credentials' => false,\n];\n"
  },
  {
    "path": "config/database.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Str;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Database Connection Name\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify which of the database connections below you wish\n    | to use as your default connection for all database work. Of course\n    | you may use many connections at once using the Database library.\n    |\n    */\n\n    'default' => env('DB_CONNECTION', 'mysql'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Database Connections\n    |--------------------------------------------------------------------------\n    |\n    | Here are each of the database connections setup for your application.\n    | Of course, examples of configuring each database platform that is\n    | supported by Laravel is shown below to make development simple.\n    |\n    |\n    | All database work in Laravel is done through the PHP PDO facilities\n    | so make sure you have the driver for your particular database of\n    | choice installed on your machine before you begin development.\n    |\n    */\n\n    'connections' => [\n\n        'sqlite' => [\n            'driver' => 'sqlite',\n            'url' => env('DATABASE_URL'),\n            'database' => env('DB_DATABASE', database_path('database.sqlite')),\n            'prefix' => env('DB_PREFIX', ''),\n            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),\n        ],\n\n        'mysql' => [\n            'driver' => 'mysql',\n            'url' => env('DATABASE_URL'),\n            'host' => env('DB_HOST', '127.0.0.1'),\n            'port' => env('DB_PORT', '3306'),\n            'database' => env('DB_DATABASE', 'forge'),\n            'username' => env('DB_USERNAME', 'forge'),\n            'password' => env('DB_PASSWORD', ''),\n            'unix_socket' => env('DB_SOCKET', ''),\n            'charset' => 'utf8mb4',\n            'collation' => 'utf8mb4_unicode_ci',\n            'prefix' => env('DB_PREFIX', ''),\n            'prefix_indexes' => true,\n            'strict' => false,\n            'engine' => null,\n            'options' => extension_loaded('pdo_mysql') ? array_filter([\n                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),\n            ]) : [],\n        ],\n\n        'pgsql' => [\n            'driver' => 'pgsql',\n            'url' => env('DATABASE_URL'),\n            'host' => env('DB_HOST', '127.0.0.1'),\n            'port' => env('DB_PORT', '5432'),\n            'database' => env('DB_DATABASE', 'forge'),\n            'username' => env('DB_USERNAME', 'forge'),\n            'password' => env('DB_PASSWORD', ''),\n            'charset' => 'utf8',\n            'prefix' => env('DB_PREFIX', ''),\n            'prefix_indexes' => true,\n            'schema' => 'public',\n            'sslmode' => 'prefer',\n        ],\n\n        'sqlsrv' => [\n            'driver' => 'sqlsrv',\n            'url' => env('DATABASE_URL'),\n            'host' => env('DB_HOST', 'localhost'),\n            'port' => env('DB_PORT', '1433'),\n            'database' => env('DB_DATABASE', 'forge'),\n            'username' => env('DB_USERNAME', 'forge'),\n            'password' => env('DB_PASSWORD', ''),\n            'charset' => 'utf8',\n            'prefix' => env('DB_PREFIX', ''),\n            'prefix_indexes' => true,\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Migration Repository Table\n    |--------------------------------------------------------------------------\n    |\n    | This table keeps track of all the migrations that have already run for\n    | your application. Using this information, we can determine which of\n    | the migrations on disk haven't actually been run in the database.\n    |\n    */\n\n    'migrations' => 'migrations',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Redis Databases\n    |--------------------------------------------------------------------------\n    |\n    | Redis is an open source, fast, and advanced key-value store that also\n    | provides a richer body of commands than a typical key-value system\n    | such as APC or Memcached. Laravel makes it easy to dig right in.\n    |\n    */\n\n    'redis' => [\n\n        'client' => env('REDIS_CLIENT', 'phpredis'),\n\n        'options' => [\n            'cluster' => env('REDIS_CLUSTER', 'redis'),\n            'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),\n        ],\n\n        'default' => [\n            'url' => env('REDIS_URL'),\n            'host' => env('REDIS_HOST', '127.0.0.1'),\n            'password' => env('REDIS_PASSWORD', null),\n            'port' => env('REDIS_PORT', '6379'),\n            'database' => env('REDIS_DB', '0'),\n        ],\n\n        'cache' => [\n            'url' => env('REDIS_URL'),\n            'host' => env('REDIS_HOST', '127.0.0.1'),\n            'password' => env('REDIS_PASSWORD', null),\n            'port' => env('REDIS_PORT', '6379'),\n            'database' => env('REDIS_CACHE_DB', '1'),\n        ],\n\n    ],\n\n];\n"
  },
  {
    "path": "config/filesystems.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Filesystem Disk\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify the default filesystem disk that should be used\n    | by the framework. The \"local\" disk, as well as a variety of cloud\n    | based disks are available to your application. Just store away!\n    |\n    */\n\n    'default' => env('FILESYSTEM_DISK', 'public'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Filesystem Disks\n    |--------------------------------------------------------------------------\n    |\n    | Here you may configure as many filesystem \"disks\" as you wish, and you\n    | may even configure multiple disks of the same driver. Defaults have\n    | been setup for each driver as an example of the required options.\n    |\n    | Supported Drivers: \"local\", \"ftp\", \"sftp\", \"s3\"\n    |\n    */\n\n    'disks' => [\n\n        'local' => [\n            'driver' => 'local',\n            'root' => storage_path('app'),\n        ],\n\n        'public' => [\n            'driver' => 'local',\n            'root' => storage_path('app/public'),\n            'url' => env('APP_URL').'/storage',\n            'visibility' => 'public',\n        ],\n\n        's3' => [\n            'driver' => 's3',\n            'key' => env('AWS_ACCESS_KEY_ID'),\n            'secret' => env('AWS_SECRET_ACCESS_KEY'),\n            'region' => env('AWS_DEFAULT_REGION'),\n            'bucket' => env('AWS_BUCKET'),\n            'url' => env('AWS_URL'),\n            'endpoint' => env('AWS_ENDPOINT'),\n        ],\n\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Symbolic Links\n    |--------------------------------------------------------------------------\n    |\n    | Here you may configure the symbolic links that will be created when the\n    | `storage:link` Artisan command is executed. The array keys should be\n    | the locations of the links and the values should be their targets.\n    |\n    */\n\n    'links' => [\n        public_path('storage') => storage_path('app/public'),\n    ],\n\n];\n"
  },
  {
    "path": "config/hashing.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Hash Driver\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default hash driver that will be used to hash\n    | passwords for your application. By default, the bcrypt algorithm is\n    | used; however, you remain free to modify this option if you wish.\n    |\n    | Supported: \"bcrypt\", \"argon\", \"argon2id\"\n    |\n    */\n\n    'driver' => 'bcrypt',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Bcrypt Options\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify the configuration options that should be used when\n    | passwords are hashed using the Bcrypt algorithm. This will allow you\n    | to control the amount of time it takes to hash the given password.\n    |\n    */\n\n    'bcrypt' => [\n        'rounds' => env('BCRYPT_ROUNDS', 10),\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Argon Options\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify the configuration options that should be used when\n    | passwords are hashed using the Argon algorithm. These will allow you\n    | to control the amount of time it takes to hash the given password.\n    |\n    */\n\n    'argon' => [\n        'memory' => 1024,\n        'threads' => 2,\n        'time' => 2,\n    ],\n\n];\n"
  },
  {
    "path": "config/imap.php",
    "content": "<?php\n\nuse Webklex\\IMAP\\Events\\FlagDeletedEvent;\nuse Webklex\\IMAP\\Events\\FlagNewEvent;\nuse Webklex\\IMAP\\Events\\FolderDeletedEvent;\nuse Webklex\\IMAP\\Events\\FolderMovedEvent;\nuse Webklex\\IMAP\\Events\\FolderNewEvent;\nuse Webklex\\IMAP\\Events\\MessageCopiedEvent;\nuse Webklex\\IMAP\\Events\\MessageDeletedEvent;\nuse Webklex\\IMAP\\Events\\MessageMovedEvent;\nuse Webklex\\IMAP\\Events\\MessageNewEvent;\nuse Webklex\\IMAP\\Events\\MessageRestoredEvent;\nuse Webklex\\PHPIMAP\\IMAP;\nuse Webklex\\PHPIMAP\\Support\\Masks\\AttachmentMask;\nuse Webklex\\PHPIMAP\\Support\\Masks\\MessageMask;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | IMAP default account\n    |--------------------------------------------------------------------------\n    |\n    | The default account identifier. It will be used as default for any missing account parameters.\n    | If however the default account is missing a parameter the package default will be used.\n    | Set to 'false' [boolean] to disable this functionality.\n    |\n    */\n    'default' => env('IMAP_DEFAULT_ACCOUNT', 'default'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default date format\n    |--------------------------------------------------------------------------\n    |\n    | The default date format is used to convert any given Carbon::class object into a valid date string.\n    | These are currently known working formats: \"d-M-Y\", \"d-M-y\", \"d M y\"\n    |\n    */\n    'date_format' => 'd-M-Y',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Available IMAP accounts\n    |--------------------------------------------------------------------------\n    |\n    | Please list all IMAP accounts which you are planning to use within the\n    | array below.\n    |\n    */\n    'accounts' => [\n        'default' => [\n            'host' => env('IMAP_HOST', 'localhost'),\n            'port' => env('IMAP_PORT', 993),\n            'protocol' => env('IMAP_PROTOCOL', 'imap'), // might also use imap, [pop3 or nntp (untested)]\n            'encryption' => env('IMAP_ENCRYPTION', 'ssl'), // Supported: false, 'ssl', 'tls', 'notls', 'starttls'\n            'validate_cert' => env('IMAP_VALIDATE_CERT', true),\n            'username' => env('IMAP_USERNAME', 'root@example.com'),\n            'password' => env('IMAP_PASSWORD', ''),\n            'authentication' => env('IMAP_AUTHENTICATION', null),\n            'proxy' => [\n                'socket' => null,\n                'request_fulluri' => false,\n                'username' => null,\n                'password' => null,\n            ],\n            'timeout' => 30,\n            'extensions' => [],\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Available IMAP options\n    |--------------------------------------------------------------------------\n    |\n    | Available php imap config parameters are listed below\n    |   -Delimiter (optional):\n    |       This option is only used when calling $oClient->\n    |       You can use any supported char such as \".\", \"/\", (...)\n    |   -Fetch option:\n    |       IMAP::FT_UID  - Message marked as read by fetching the body message\n    |       IMAP::FT_PEEK - Fetch the message without setting the \"seen\" flag\n    |   -Fetch sequence id:\n    |       IMAP::ST_UID  - Fetch message components using the message uid\n    |       IMAP::ST_MSGN - Fetch message components using the message number\n    |   -Body download option\n    |       Default TRUE\n    |   -Flag download option\n    |       Default TRUE\n    |   -Soft fail\n    |       Default FALSE - Set to TRUE if you want to ignore certain exception while fetching bulk messages\n    |   -RFC822\n    |       Default TRUE - Set to FALSE to prevent the usage of \\imap_rfc822_parse_headers().\n    |                      See https://github.com/Webklex/php-imap/issues/115 for more information.\n    |   -Debug enable to trace communication traffic\n    |   -UID cache enable the UID cache\n    |   -Fallback date is used if the given message date could not be parsed\n    |   -Boundary regex used to detect message boundaries. If you are having problems with empty messages, missing\n    |       attachments or anything like this. Be advised that it likes to break which causes new problems..\n    |   -Message key identifier option\n    |       You can choose between the following:\n    |       'id'     - Use the MessageID as array key (default, might cause hickups with yahoo mail)\n    |       'number' - Use the message number as array key (isn't always unique and can cause some interesting behavior)\n    |       'list'   - Use the message list number as array key (incrementing integer (does not always start at 0 or 1)\n    |       'uid'    - Use the message uid as array key (isn't always unique and can cause some interesting behavior)\n    |   -Fetch order\n    |       'asc'  - Order all messages ascending (probably results in oldest first)\n    |       'desc' - Order all messages descending (probably results in newest first)\n    |   -Disposition types potentially considered an attachment\n    |       Default ['attachment', 'inline']\n    |   -Common folders\n    |       Default folder locations and paths assumed if none is provided\n    |   -Open IMAP options:\n    |       DISABLE_AUTHENTICATOR - Disable authentication properties.\n    |                               Use 'GSSAPI' if you encounter the following\n    |                               error: \"Kerberos error: No credentials cache\n    |                               file found (try running kinit) (...)\"\n    |                               or ['GSSAPI','PLAIN'] if you are using outlook mail\n    |   -Decoder options (currently only the message subject and attachment name decoder can be set)\n    |       'utf-8' - Uses imap_utf8($string) to decode a string\n    |       'mimeheader' - Uses mb_decode_mimeheader($string) to decode a string\n    |\n    */\n    'options' => [\n        'delimiter' => '/',\n        'fetch' => IMAP::FT_PEEK,\n        'sequence' => IMAP::ST_UID,\n        'fetch_body' => true,\n        'fetch_flags' => true,\n        'soft_fail' => false,\n        'rfc822' => true,\n        'debug' => false,\n        'uid_cache' => true,\n        // 'fallback_date' => \"01.01.1970 00:00:00\",\n        'boundary' => '/boundary=(.*?(?=;)|(.*))/i',\n        'message_key' => 'list',\n        'fetch_order' => 'asc',\n        'dispositions' => ['attachment', 'inline'],\n        'common_folders' => [\n            'root' => 'INBOX',\n            'junk' => 'INBOX/Junk',\n            'draft' => 'INBOX/Drafts',\n            'sent' => 'INBOX/Sent',\n            'trash' => 'INBOX/Trash',\n        ],\n        'decoder' => [\n            'message' => 'utf-8', // mimeheader\n            'attachment' => 'utf-8', // mimeheader\n        ],\n        'open' => [\n            // 'DISABLE_AUTHENTICATOR' => 'GSSAPI'\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Available flags\n    |--------------------------------------------------------------------------\n    |\n    | List all available / supported flags. Set to null to accept all given flags.\n     */\n    'flags' => ['recent', 'flagged', 'answered', 'deleted', 'seen', 'draft'],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Available events\n    |--------------------------------------------------------------------------\n    |\n    */\n    'events' => [\n        'message' => [\n            'new' => MessageNewEvent::class,\n            'moved' => MessageMovedEvent::class,\n            'copied' => MessageCopiedEvent::class,\n            'deleted' => MessageDeletedEvent::class,\n            'restored' => MessageRestoredEvent::class,\n        ],\n        'folder' => [\n            'new' => FolderNewEvent::class,\n            'moved' => FolderMovedEvent::class,\n            'deleted' => FolderDeletedEvent::class,\n        ],\n        'flag' => [\n            'new' => FlagNewEvent::class,\n            'deleted' => FlagDeletedEvent::class,\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Available masking options\n    |--------------------------------------------------------------------------\n    |\n    | By using your own custom masks you can implement your own methods for\n    | a better and faster access and less code to write.\n    |\n    | Checkout the two examples custom_attachment_mask and custom_message_mask\n    | for a quick start.\n    |\n    | The provided masks below are used as the default masks.\n    */\n    'masks' => [\n        'message' => MessageMask::class,\n        'attachment' => AttachmentMask::class,\n    ],\n];\n"
  },
  {
    "path": "config/krayin-vite.php",
    "content": "<?php\n\nreturn [\n    /*\n    |--------------------------------------------------------------------------\n    | Krayin Vite Configuration\n    |--------------------------------------------------------------------------\n    |\n    | Please add your Vite registry here to seamlessly support the `assets` function.\n    |\n    */\n\n    'viters' => [\n        'admin' => [\n            'hot_file' => 'admin-vite.hot',\n            'build_directory' => 'admin/build',\n            'package_assets_directory' => 'src/Resources/assets',\n        ],\n\n        'installer' => [\n            'hot_file' => 'installer-vite.hot',\n            'build_directory' => 'installer/build',\n            'package_assets_directory' => 'src/Resources/assets',\n        ],\n\n        'webform' => [\n            'hot_file' => 'webform-vite.hot',\n            'build_directory' => 'webform/build',\n            'package_assets_directory' => 'src/Resources/assets',\n        ],\n    ],\n];\n"
  },
  {
    "path": "config/logging.php",
    "content": "<?php\n\nuse Monolog\\Handler\\NullHandler;\nuse Monolog\\Handler\\StreamHandler;\nuse Monolog\\Handler\\SyslogUdpHandler;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Log Channel\n    |--------------------------------------------------------------------------\n    |\n    | This option defines the default log channel that gets used when writing\n    | messages to the logs. The name specified in this option should match\n    | one of the channels defined in the \"channels\" configuration array.\n    |\n    */\n\n    'default' => env('LOG_CHANNEL', 'stack'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Log Channels\n    |--------------------------------------------------------------------------\n    |\n    | Here you may configure the log channels for your application. Out of\n    | the box, Laravel uses the Monolog PHP logging library. This gives\n    | you a variety of powerful log handlers / formatters to utilize.\n    |\n    | Available Drivers: \"single\", \"daily\", \"slack\", \"syslog\",\n    |                    \"errorlog\", \"monolog\",\n    |                    \"custom\", \"stack\"\n    |\n    */\n\n    'channels' => [\n        'stack' => [\n            'driver' => 'stack',\n            'channels' => ['single'],\n            'ignore_exceptions' => false,\n        ],\n\n        'single' => [\n            'driver' => 'single',\n            'path' => storage_path('logs/laravel.log'),\n            'level' => env('LOG_LEVEL', 'debug'),\n        ],\n\n        'daily' => [\n            'driver' => 'daily',\n            'path' => storage_path('logs/laravel.log'),\n            'level' => env('LOG_LEVEL', 'debug'),\n            'days' => 14,\n        ],\n\n        'slack' => [\n            'driver' => 'slack',\n            'url' => env('LOG_SLACK_WEBHOOK_URL'),\n            'username' => 'Laravel Log',\n            'emoji' => ':boom:',\n            'level' => env('LOG_LEVEL', 'critical'),\n        ],\n\n        'papertrail' => [\n            'driver' => 'monolog',\n            'level' => env('LOG_LEVEL', 'debug'),\n            'handler' => SyslogUdpHandler::class,\n            'handler_with' => [\n                'host' => env('PAPERTRAIL_URL'),\n                'port' => env('PAPERTRAIL_PORT'),\n            ],\n        ],\n\n        'stderr' => [\n            'driver' => 'monolog',\n            'handler' => StreamHandler::class,\n            'formatter' => env('LOG_STDERR_FORMATTER'),\n            'with' => [\n                'stream' => 'php://stderr',\n            ],\n        ],\n\n        'syslog' => [\n            'driver' => 'syslog',\n            'level' => env('LOG_LEVEL', 'debug'),\n        ],\n\n        'errorlog' => [\n            'driver' => 'errorlog',\n            'level' => env('LOG_LEVEL', 'debug'),\n        ],\n\n        'null' => [\n            'driver' => 'monolog',\n            'handler' => NullHandler::class,\n        ],\n\n        'emergency' => [\n            'path' => storage_path('logs/laravel.log'),\n        ],\n    ],\n\n];\n"
  },
  {
    "path": "config/mail-receiver.php",
    "content": "<?php\n\nreturn [\n    /*\n    |--------------------------------------------------------------------------\n    | Default Mail Receiver\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default mail receiver that is used to receive any email\n    | messages sent by third party application.\n    |\n    | Supported: \"webklex-imap\", \"sendgrid\"\n    |\n    */\n\n    'default' => env('MAIL_RECEIVER_DRIVER', 'sendgrid'),\n];\n"
  },
  {
    "path": "config/mail.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Mailer\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default mailer that is used to send any email\n    | messages sent by your application. Alternative mailers may be setup\n    | and used as needed; however, this mailer will be used by default.\n    |\n    */\n\n    'default' => env('MAIL_MAILER', 'smtp'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Mailer Configurations\n    |--------------------------------------------------------------------------\n    |\n    | Here you may configure all of the mailers used by your application plus\n    | their respective settings. Several examples have been configured for\n    | you and you are free to add your own as your application requires.\n    |\n    | Laravel supports a variety of mail \"transport\" drivers to be used while\n    | sending an e-mail. You will specify which one you are using for your\n    | mailers below. You are free to add additional mailers as required.\n    |\n    | Supported: \"smtp\", \"sendmail\", \"mailgun\", \"ses\",\n    |            \"postmark\", \"log\", \"array\", \"failover\"\n    |\n    */\n\n    'mailers' => [\n        'smtp' => [\n            'transport' => 'smtp',\n            'host' => env('MAIL_HOST', 'smtp.mailgun.org'),\n            'port' => env('MAIL_PORT', 587),\n            'encryption' => env('MAIL_ENCRYPTION', 'tls'),\n            'username' => env('MAIL_USERNAME'),\n            'password' => env('MAIL_PASSWORD'),\n            'timeout' => null,\n            'verify_peer' => false,\n        ],\n\n        'ses' => [\n            'transport' => 'ses',\n        ],\n\n        'mailgun' => [\n            'transport' => 'mailgun',\n        ],\n\n        'postmark' => [\n            'transport' => 'postmark',\n        ],\n\n        'sendmail' => [\n            'transport' => 'sendmail',\n            'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'),\n        ],\n\n        'log' => [\n            'transport' => 'log',\n            'channel' => env('MAIL_LOG_CHANNEL'),\n        ],\n\n        'array' => [\n            'transport' => 'array',\n        ],\n\n        'failover' => [\n            'transport' => 'failover',\n            'mailers' => [\n                'smtp',\n                'log',\n            ],\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Global \"From\" Address\n    |--------------------------------------------------------------------------\n    |\n    | You may wish for all e-mails sent by your application to be sent from\n    | the same address. Here, you may specify a name and address that is\n    | used globally for all e-mails that are sent by your application.\n    |\n    */\n\n    'from' => [\n        'address' => env('MAIL_FROM_ADDRESS'),\n        'name' => env('MAIL_FROM_NAME'),\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Mailer Domain\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the domain for email message_id that is used to send email\n    | messages sent by your application.\n    |\n    */\n\n    'domain' => env('MAIL_DOMAIN', 'webkul.com'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Markdown Mail Settings\n    |--------------------------------------------------------------------------\n    |\n    | If you are using Markdown based email rendering, you may configure your\n    | theme and component paths here, allowing you to customize the design\n    | of the emails. Or, you may simply stick with the Laravel defaults!\n    |\n    */\n\n    'markdown' => [\n        'theme' => 'default',\n\n        'paths' => [\n            resource_path('views/vendor/mail'),\n        ],\n    ],\n\n];\n"
  },
  {
    "path": "config/queue.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Queue Connection Name\n    |--------------------------------------------------------------------------\n    |\n    | Laravel's queue API supports an assortment of back-ends via a single\n    | API, giving you convenient access to each back-end using the same\n    | syntax for every one. Here you may define a default connection.\n    |\n    */\n\n    'default' => env('QUEUE_CONNECTION', 'sync'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Queue Connections\n    |--------------------------------------------------------------------------\n    |\n    | Here you may configure the connection information for each server that\n    | is used by your application. A default configuration has been added\n    | for each back-end shipped with Laravel. You are free to add more.\n    |\n    | Drivers: \"sync\", \"database\", \"beanstalkd\", \"sqs\", \"redis\", \"null\"\n    |\n    */\n\n    'connections' => [\n\n        'sync' => [\n            'driver' => 'sync',\n        ],\n\n        'database' => [\n            'driver' => 'database',\n            'table' => 'jobs',\n            'queue' => 'default',\n            'retry_after' => 90,\n        ],\n\n        'beanstalkd' => [\n            'driver' => 'beanstalkd',\n            'host' => 'localhost',\n            'queue' => 'default',\n            'retry_after' => 90,\n            'block_for' => 0,\n        ],\n\n        'sqs' => [\n            'driver' => 'sqs',\n            'key' => env('AWS_ACCESS_KEY_ID'),\n            'secret' => env('AWS_SECRET_ACCESS_KEY'),\n            'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),\n            'queue' => env('SQS_QUEUE', 'your-queue-name'),\n            'suffix' => env('SQS_SUFFIX'),\n            'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),\n        ],\n\n        'redis' => [\n            'driver' => 'redis',\n            'connection' => 'default',\n            'queue' => env('REDIS_QUEUE', 'default'),\n            'retry_after' => 90,\n            'block_for' => null,\n        ],\n\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Failed Queue Jobs\n    |--------------------------------------------------------------------------\n    |\n    | These options configure the behavior of failed queue job logging so you\n    | can control which database and table are used to store the jobs that\n    | have failed. You may change them to any database / table you wish.\n    |\n    */\n\n    'failed' => [\n        'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),\n        'database' => env('DB_CONNECTION', 'mysql'),\n        'table' => 'failed_jobs',\n    ],\n\n];\n"
  },
  {
    "path": "config/repository.php",
    "content": "<?php\n\nuse League\\Fractal\\Serializer\\DataArraySerializer;\n\n/*\n|--------------------------------------------------------------------------\n| Prettus Repository Config\n|--------------------------------------------------------------------------\n|\n|\n*/\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Repository Pagination Limit Default\n    |--------------------------------------------------------------------------\n    |\n    */\n    'pagination' => [\n        'limit' => 15,\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Fractal Presenter Config\n    |--------------------------------------------------------------------------\n    |\n\n    Available serializers:\n    ArraySerializer\n    DataArraySerializer\n    JsonApiSerializer\n\n    */\n    'fractal' => [\n        'params' => [\n            'include' => 'include',\n        ],\n        'serializer' => DataArraySerializer::class,\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Cache Config\n    |--------------------------------------------------------------------------\n    |\n    */\n    'cache' => [\n        /*\n         |--------------------------------------------------------------------------\n         | Cache Status\n         |--------------------------------------------------------------------------\n         |\n         | Enable or disable cache\n         |\n         */\n        'enabled' => false,\n\n        /*\n         |--------------------------------------------------------------------------\n         | Cache Minutes\n         |--------------------------------------------------------------------------\n         |\n         | Time of expiration cache\n         |\n         */\n        'minutes' => 30,\n\n        /*\n         |--------------------------------------------------------------------------\n         | Cache Repository\n         |--------------------------------------------------------------------------\n         |\n         | Instance of Illuminate\\Contracts\\Cache\\Repository\n         |\n         */\n        'repository' => 'cache',\n\n        /*\n          |--------------------------------------------------------------------------\n          | Cache Clean Listener\n          |--------------------------------------------------------------------------\n          |\n          |\n          |\n          */\n        'clean' => [\n\n            /*\n              |--------------------------------------------------------------------------\n              | Enable clear cache on repository changes\n              |--------------------------------------------------------------------------\n              |\n              */\n            'enabled' => true,\n\n            /*\n              |--------------------------------------------------------------------------\n              | Actions in Repository\n              |--------------------------------------------------------------------------\n              |\n              | create : Clear Cache on create Entry in repository\n              | update : Clear Cache on update Entry in repository\n              | delete : Clear Cache on delete Entry in repository\n              |\n              */\n            'on' => [\n                'create' => true,\n                'update' => true,\n                'delete' => true,\n            ],\n        ],\n\n        'params' => [\n            /*\n            |--------------------------------------------------------------------------\n            | Skip Cache Params\n            |--------------------------------------------------------------------------\n            |\n            |\n            | Ex: http://prettus.local/?search=lorem&skipCache=true\n            |\n            */\n            'skipCache' => 'skipCache',\n        ],\n\n        /*\n       |--------------------------------------------------------------------------\n       | Methods Allowed\n       |--------------------------------------------------------------------------\n       |\n       | methods cacheable : all, paginate, find, findByField, findWhere, getByCriteria\n       |\n       | Ex:\n       |\n       | 'only' =>['all','paginate'],\n       |\n       | or\n       |\n       | 'except' =>['find'],\n       */\n        'allowed' => [\n            'only' => null,\n            'except' => null,\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Criteria Config\n    |--------------------------------------------------------------------------\n    |\n    | Settings of request parameters names that will be used by Criteria\n    |\n    */\n    'criteria' => [\n        /*\n        |--------------------------------------------------------------------------\n        | Accepted Conditions\n        |--------------------------------------------------------------------------\n        |\n        | Conditions accepted in consultations where the Criteria\n        |\n        | Ex:\n        |\n        | 'acceptedConditions'=>['=','like']\n        |\n        | $query->where('foo','=','bar')\n        | $query->where('foo','like','bar')\n        |\n        */\n        'acceptedConditions' => [\n            '=',\n            'like',\n            'in',\n        ],\n        /*\n        |--------------------------------------------------------------------------\n        | Request Params\n        |--------------------------------------------------------------------------\n        |\n        | Request parameters that will be used to filter the query in the repository\n        |\n        | Params :\n        |\n        | - search : Searched value\n        |   Ex: http://prettus.local/?search=lorem\n        |\n        | - searchFields : Fields in which research should be carried out\n        |   Ex:\n        |    http://prettus.local/?search=lorem&searchFields=name;email\n        |    http://prettus.local/?search=lorem&searchFields=name:like;email\n        |    http://prettus.local/?search=lorem&searchFields=name:like\n        |\n        | - filter : Fields that must be returned to the response object\n        |   Ex:\n        |   http://prettus.local/?search=lorem&filter=id,name\n        |\n        | - orderBy : Order By\n        |   Ex:\n        |   http://prettus.local/?search=lorem&orderBy=id\n        |\n        | - sortedBy : Sort\n        |   Ex:\n        |   http://prettus.local/?search=lorem&orderBy=id&sortedBy=asc\n        |   http://prettus.local/?search=lorem&orderBy=id&sortedBy=desc\n        |\n        | - searchJoin: Specifies the search method (AND / OR), by default the\n        |               application searches each parameter with OR\n        |   EX:\n        |   http://prettus.local/?search=lorem&searchJoin=and\n        |   http://prettus.local/?search=lorem&searchJoin=or\n        |\n        */\n        'params' => [\n            'search' => 'search',\n            'searchFields' => 'searchFields',\n            'filter' => 'filter',\n            'orderBy' => 'orderBy',\n            'sortedBy' => 'sortedBy',\n            'with' => 'with',\n            'searchJoin' => 'searchJoin',\n            'withCount' => 'withCount',\n        ],\n    ],\n    /*\n    |--------------------------------------------------------------------------\n    | Generator Config\n    |--------------------------------------------------------------------------\n    |\n    */\n    'generator' => [\n        'basePath' => app()->path(),\n        'rootNamespace' => 'App\\\\',\n        'stubsOverridePath' => app()->path(),\n        'paths' => [\n            'models' => 'Entities',\n            'repositories' => 'Repositories',\n            'interfaces' => 'Repositories',\n            'transformers' => 'Transformers',\n            'presenters' => 'Presenters',\n            'validators' => 'Validators',\n            'controllers' => 'Http/Controllers',\n            'provider' => 'RepositoryServiceProvider',\n            'criteria' => 'Criteria',\n        ],\n    ],\n];\n"
  },
  {
    "path": "config/sanctum.php",
    "content": "<?php\n\nuse Illuminate\\Cookie\\Middleware\\EncryptCookies;\nuse Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Stateful Domains\n    |--------------------------------------------------------------------------\n    |\n    | Requests from the following domains / hosts will receive stateful API\n    | authentication cookies. Typically, these should include your local\n    | and production domains which access your API via a frontend SPA.\n    |\n    */\n\n    'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(\n        '%s%s',\n        'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',\n        env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''\n    ))),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Sanctum Guards\n    |--------------------------------------------------------------------------\n    |\n    | This array contains the authentication guards that will be checked when\n    | Sanctum is trying to authenticate a request. If none of these guards\n    | are able to authenticate the request, Sanctum will use the bearer\n    | token that's present on an incoming request for authentication.\n    |\n    */\n\n    'guard' => ['user'],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Expiration Minutes\n    |--------------------------------------------------------------------------\n    |\n    | This value controls the number of minutes until an issued token will be\n    | considered expired. If this value is null, personal access tokens do\n    | not expire. This won't tweak the lifetime of first-party sessions.\n    |\n    */\n\n    'expiration' => null,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Sanctum Middleware\n    |--------------------------------------------------------------------------\n    |\n    | When authenticating your first-party SPA with Sanctum you may need to\n    | customize some of the middleware Sanctum uses while processing the\n    | request. You may change the middleware listed below as required.\n    |\n    */\n\n    'middleware' => [\n        'verify_csrf_token' => VerifyCsrfToken::class,\n        'encrypt_cookies' => EncryptCookies::class,\n    ],\n\n];\n"
  },
  {
    "path": "config/services.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Third Party Services\n    |--------------------------------------------------------------------------\n    |\n    | This file is for storing the credentials for third party services such\n    | as Mailgun, Postmark, AWS and more. This file provides the de facto\n    | location for this type of information, allowing packages to have\n    | a conventional file to locate the various service credentials.\n    |\n    */\n\n    'mailgun' => [\n        'domain' => env('MAILGUN_DOMAIN'),\n        'secret' => env('MAILGUN_SECRET'),\n        'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),\n    ],\n\n    'postmark' => [\n        'token' => env('POSTMARK_TOKEN'),\n    ],\n\n    'ses' => [\n        'key' => env('AWS_ACCESS_KEY_ID'),\n        'secret' => env('AWS_SECRET_ACCESS_KEY'),\n        'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),\n    ],\n\n];\n"
  },
  {
    "path": "config/session.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Str;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Default Session Driver\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default session \"driver\" that will be used on\n    | requests. By default, we will use the lightweight native driver but\n    | you may specify any of the other wonderful drivers provided here.\n    |\n    | Supported: \"file\", \"cookie\", \"database\", \"apc\",\n    |            \"memcached\", \"redis\", \"dynamodb\", \"array\"\n    |\n    */\n\n    'driver' => env('SESSION_DRIVER', 'file'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Lifetime\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify the number of minutes that you wish the session\n    | to be allowed to remain idle before it expires. If you want them\n    | to immediately expire on the browser closing, set that option.\n    |\n    */\n\n    'lifetime' => env('SESSION_LIFETIME', 120),\n\n    'expire_on_close' => false,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Encryption\n    |--------------------------------------------------------------------------\n    |\n    | This option allows you to easily specify that all of your session data\n    | should be encrypted before it is stored. All encryption will be run\n    | automatically by Laravel and you can use the Session like normal.\n    |\n    */\n\n    'encrypt' => false,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session File Location\n    |--------------------------------------------------------------------------\n    |\n    | When using the native session driver, we need a location where session\n    | files may be stored. A default has been set for you but a different\n    | location may be specified. This is only needed for file sessions.\n    |\n    */\n\n    'files' => storage_path('framework/sessions'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Database Connection\n    |--------------------------------------------------------------------------\n    |\n    | When using the \"database\" or \"redis\" session drivers, you may specify a\n    | connection that should be used to manage these sessions. This should\n    | correspond to a connection in your database configuration options.\n    |\n    */\n\n    'connection' => env('SESSION_CONNECTION', null),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Database Table\n    |--------------------------------------------------------------------------\n    |\n    | When using the \"database\" session driver, you may specify the table we\n    | should use to manage the sessions. Of course, a sensible default is\n    | provided for you; however, you are free to change this as needed.\n    |\n    */\n\n    'table' => 'sessions',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Cache Store\n    |--------------------------------------------------------------------------\n    |\n    | While using one of the framework's cache driven session backends you may\n    | list a cache store that should be used for these sessions. This value\n    | must match with one of the application's configured cache \"stores\".\n    |\n    | Affects: \"apc\", \"dynamodb\", \"memcached\", \"redis\"\n    |\n    */\n\n    'store' => env('SESSION_STORE', null),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Sweeping Lottery\n    |--------------------------------------------------------------------------\n    |\n    | Some session drivers must manually sweep their storage location to get\n    | rid of old sessions from storage. Here are the chances that it will\n    | happen on a given request. By default, the odds are 2 out of 100.\n    |\n    */\n\n    'lottery' => [2, 100],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Cookie Name\n    |--------------------------------------------------------------------------\n    |\n    | Here you may change the name of the cookie used to identify a session\n    | instance by ID. The name specified here will get used every time a\n    | new session cookie is created by the framework for every driver.\n    |\n    */\n\n    'cookie' => env(\n        'SESSION_COOKIE',\n        Str::slug(env('APP_NAME', 'laravel'), '_').'_session'\n    ),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Cookie Path\n    |--------------------------------------------------------------------------\n    |\n    | The session cookie path determines the path for which the cookie will\n    | be regarded as available. Typically, this will be the root path of\n    | your application but you are free to change this when necessary.\n    |\n    */\n\n    'path' => '/',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Session Cookie Domain\n    |--------------------------------------------------------------------------\n    |\n    | Here you may change the domain of the cookie used to identify a session\n    | in your application. This will determine which domains the cookie is\n    | available to in your application. A sensible default has been set.\n    |\n    */\n\n    'domain' => env('SESSION_DOMAIN', null),\n\n    /*\n    |--------------------------------------------------------------------------\n    | HTTPS Only Cookies\n    |--------------------------------------------------------------------------\n    |\n    | By setting this option to true, session cookies will only be sent back\n    | to the server if the browser has a HTTPS connection. This will keep\n    | the cookie from being sent to you if it can not be done securely.\n    |\n    */\n\n    'secure' => env('SESSION_SECURE_COOKIE'),\n\n    /*\n    |--------------------------------------------------------------------------\n    | HTTP Access Only\n    |--------------------------------------------------------------------------\n    |\n    | Setting this value to true will prevent JavaScript from accessing the\n    | value of the cookie and the cookie will only be accessible through\n    | the HTTP protocol. You are free to modify this option if needed.\n    |\n    */\n\n    'http_only' => true,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Same-Site Cookies\n    |--------------------------------------------------------------------------\n    |\n    | This option determines how your cookies behave when cross-site requests\n    | take place, and can be used to mitigate CSRF attacks. By default, we\n    | will set this value to \"lax\" since this is a secure default value.\n    |\n    | Supported: \"lax\", \"strict\", \"none\", null\n    |\n    */\n\n    'same_site' => 'lax',\n\n];\n"
  },
  {
    "path": "config/tinker.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Console Commands\n    |--------------------------------------------------------------------------\n    |\n    | This option allows you to add additional Artisan commands that should\n    | be available within the Tinker environment. Once the command is in\n    | this array you may execute the command in Tinker using its name.\n    |\n    */\n\n    'commands' => [\n        // App\\Console\\Commands\\ExampleCommand::class,\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Auto Aliased Classes\n    |--------------------------------------------------------------------------\n    |\n    | Tinker will not automatically alias classes in your vendor namespaces\n    | but you may explicitly allow a subset of classes to get aliased by\n    | adding the names of each of those classes to the following list.\n    |\n    */\n\n    'alias' => [\n        //\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Classes That Should Not Be Aliased\n    |--------------------------------------------------------------------------\n    |\n    | Typically, Tinker automatically aliases classes as you require them in\n    | Tinker. However, you may wish to never alias certain classes, which\n    | you may accomplish by listing the classes in the following array.\n    |\n    */\n\n    'dont_alias' => [\n        'App\\Nova',\n    ],\n\n];\n"
  },
  {
    "path": "config/view.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | View Storage Paths\n    |--------------------------------------------------------------------------\n    |\n    | Most templating systems load templates from disk. Here you may specify\n    | an array of paths that should be checked for your views. Of course\n    | the usual Laravel view path has already been registered for you.\n    |\n    */\n\n    'paths' => [\n        resource_path('views'),\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Compiled View Path\n    |--------------------------------------------------------------------------\n    |\n    | This option determines where all the compiled Blade templates will be\n    | stored for your application. Typically, this is within the storage\n    | directory. However, as usual, you are free to change this value.\n    |\n    */\n\n    'compiled' => env(\n        'VIEW_COMPILED_PATH',\n        realpath(storage_path('framework/views'))\n    ),\n\n];\n"
  },
  {
    "path": "database/.gitignore",
    "content": "*.sqlite\n*.sqlite-journal\n"
  },
  {
    "path": "database/factories/UserFactory.php",
    "content": "<?php\n\nnamespace Database\\Factories;\n\nuse App\\Models\\User;\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\nuse Illuminate\\Support\\Str;\n\nclass UserFactory extends Factory\n{\n    /**\n     * The name of the factory's corresponding model.\n     *\n     * @var string\n     */\n    protected $model = User::class;\n\n    /**\n     * Define the model's default state.\n     *\n     * @return array\n     */\n    public function definition()\n    {\n        return [\n            'name' => $this->faker->name,\n            'email' => $this->faker->unique()->safeEmail,\n            'email_verified_at' => now(),\n            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password\n            'remember_token' => Str::random(10),\n        ];\n    }\n\n    /**\n     * Indicate that the model's email address should be unverified.\n     *\n     * @return Factory\n     */\n    public function unverified()\n    {\n        return $this->state(function (array $attributes) {\n            return [\n                'email_verified_at' => null,\n            ];\n        });\n    }\n}\n"
  },
  {
    "path": "database/migrations/2019_08_19_000000_create_failed_jobs_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('failed_jobs', function (Blueprint $table) {\n            $table->id();\n            $table->string('uuid')->unique();\n            $table->text('connection');\n            $table->text('queue');\n            $table->longText('payload');\n            $table->longText('exception');\n            $table->timestamp('failed_at')->useCurrent();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('failed_jobs');\n    }\n};\n"
  },
  {
    "path": "database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('personal_access_tokens', function (Blueprint $table) {\n            $table->id();\n            $table->morphs('tokenable');\n            $table->string('name');\n            $table->string('token', 64)->unique();\n            $table->text('abilities')->nullable();\n            $table->timestamp('last_used_at')->nullable();\n            $table->timestamp('expires_at')->nullable();\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::dropIfExists('personal_access_tokens');\n    }\n};\n"
  },
  {
    "path": "database/migrations/2024_09_09_094040_create_job_batches_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('job_batches', function (Blueprint $table) {\n            $table->string('id')->primary();\n            $table->string('name');\n            $table->integer('total_jobs');\n            $table->integer('pending_jobs');\n            $table->integer('failed_jobs');\n            $table->text('failed_job_ids');\n            $table->mediumText('options')->nullable();\n            $table->integer('cancelled_at')->nullable();\n            $table->integer('created_at');\n            $table->integer('finished_at')->nullable();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('job_batches');\n    }\n};\n"
  },
  {
    "path": "database/migrations/2024_09_09_094042_create_jobs_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('jobs', function (Blueprint $table) {\n            $table->bigIncrements('id');\n            $table->string('queue')->index();\n            $table->longText('payload');\n            $table->unsignedTinyInteger('attempts');\n            $table->unsignedInteger('reserved_at')->nullable();\n            $table->unsignedInteger('available_at');\n            $table->unsignedInteger('created_at');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('jobs');\n    }\n};\n"
  },
  {
    "path": "database/seeders/DatabaseSeeder.php",
    "content": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Webkul\\Installer\\Database\\Seeders\\DatabaseSeeder as KrayinDatabaseSeeder;\n\nclass DatabaseSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @return void\n     */\n    public function run()\n    {\n        $this->call(KrayinDatabaseSeeder::class);\n    }\n}\n"
  },
  {
    "path": "lang/en/auth.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Authentication Language Lines\n    |--------------------------------------------------------------------------\n    |\n    | The following language lines are used during authentication for various\n    | messages that we need to display to the user. You are free to modify\n    | these language lines according to your application's requirements.\n    |\n    */\n\n    'failed' => 'These credentials do not match our records.',\n    'password' => 'The provided password is incorrect.',\n    'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',\n\n];\n"
  },
  {
    "path": "lang/en/pagination.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Pagination Language Lines\n    |--------------------------------------------------------------------------\n    |\n    | The following language lines are used by the paginator library to build\n    | the simple pagination links. You are free to change them to anything\n    | you want to customize your views to better match your application.\n    |\n    */\n\n    'previous' => '&laquo; Previous',\n    'next' => 'Next &raquo;',\n\n];\n"
  },
  {
    "path": "lang/en/passwords.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Password Reset Language Lines\n    |--------------------------------------------------------------------------\n    |\n    | The following language lines are the default lines which match reasons\n    | that are given by the password broker for a password update attempt\n    | has failed, such as for an invalid token or invalid new password.\n    |\n    */\n\n    'reset' => 'Your password has been reset!',\n    'sent' => 'We have emailed your password reset link!',\n    'throttled' => 'Please wait before retrying.',\n    'token' => 'This password reset token is invalid.',\n    'user' => \"We can't find a user with that email address.\",\n\n];\n"
  },
  {
    "path": "lang/en/validation.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Validation Language Lines\n    |--------------------------------------------------------------------------\n    |\n    | The following language lines contain the default error messages used by\n    | the validator class. Some of these rules have multiple versions such\n    | as the size rules. Feel free to tweak each of these messages here.\n    |\n    */\n\n    'accepted' => 'The :attribute must be accepted.',\n    'active_url' => 'The :attribute is not a valid URL.',\n    'after' => 'The :attribute must be a date after :date.',\n    'after_or_equal' => 'The :attribute must be a date after or equal to :date.',\n    'alpha' => 'The :attribute may only contain letters.',\n    'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.',\n    'alpha_num' => 'The :attribute may only contain letters and numbers.',\n    'array' => 'The :attribute must be an array.',\n    'before' => 'The :attribute must be a date before :date.',\n    'before_or_equal' => 'The :attribute must be a date before or equal to :date.',\n    'between' => [\n        'numeric' => 'The :attribute must be between :min and :max.',\n        'file' => 'The :attribute must be between :min and :max kilobytes.',\n        'string' => 'The :attribute must be between :min and :max characters.',\n        'array' => 'The :attribute must have between :min and :max items.',\n    ],\n    'boolean' => 'The :attribute field must be true or false.',\n    'confirmed' => 'The :attribute confirmation does not match.',\n    'date' => 'The :attribute is not a valid date.',\n    'date_equals' => 'The :attribute must be a date equal to :date.',\n    'date_format' => 'The :attribute does not match the format :format.',\n    'different' => 'The :attribute and :other must be different.',\n    'digits' => 'The :attribute must be :digits digits.',\n    'digits_between' => 'The :attribute must be between :min and :max digits.',\n    'dimensions' => 'The :attribute has invalid image dimensions.',\n    'distinct' => 'The :attribute field has a duplicate value.',\n    'email' => 'The :attribute must be a valid email address.',\n    'ends_with' => 'The :attribute must end with one of the following: :values.',\n    'exists' => 'The selected :attribute is invalid.',\n    'file' => 'The :attribute must be a file.',\n    'filled' => 'The :attribute field must have a value.',\n    'gt' => [\n        'numeric' => 'The :attribute must be greater than :value.',\n        'file' => 'The :attribute must be greater than :value kilobytes.',\n        'string' => 'The :attribute must be greater than :value characters.',\n        'array' => 'The :attribute must have more than :value items.',\n    ],\n    'gte' => [\n        'numeric' => 'The :attribute must be greater than or equal :value.',\n        'file' => 'The :attribute must be greater than or equal :value kilobytes.',\n        'string' => 'The :attribute must be greater than or equal :value characters.',\n        'array' => 'The :attribute must have :value items or more.',\n    ],\n    'image' => 'The :attribute must be an image.',\n    'in' => 'The selected :attribute is invalid.',\n    'in_array' => 'The :attribute field does not exist in :other.',\n    'integer' => 'The :attribute must be an integer.',\n    'ip' => 'The :attribute must be a valid IP address.',\n    'ipv4' => 'The :attribute must be a valid IPv4 address.',\n    'ipv6' => 'The :attribute must be a valid IPv6 address.',\n    'json' => 'The :attribute must be a valid JSON string.',\n    'lt' => [\n        'numeric' => 'The :attribute must be less than :value.',\n        'file' => 'The :attribute must be less than :value kilobytes.',\n        'string' => 'The :attribute must be less than :value characters.',\n        'array' => 'The :attribute must have less than :value items.',\n    ],\n    'lte' => [\n        'numeric' => 'The :attribute must be less than or equal :value.',\n        'file' => 'The :attribute must be less than or equal :value kilobytes.',\n        'string' => 'The :attribute must be less than or equal :value characters.',\n        'array' => 'The :attribute must not have more than :value items.',\n    ],\n    'max' => [\n        'numeric' => 'The :attribute may not be greater than :max.',\n        'file' => 'The :attribute may not be greater than :max kilobytes.',\n        'string' => 'The :attribute may not be greater than :max characters.',\n        'array' => 'The :attribute may not have more than :max items.',\n    ],\n    'mimes' => 'The :attribute must be a file of type: :values.',\n    'mimetypes' => 'The :attribute must be a file of type: :values.',\n    'min' => [\n        'numeric' => 'The :attribute must be at least :min.',\n        'file' => 'The :attribute must be at least :min kilobytes.',\n        'string' => 'The :attribute must be at least :min characters.',\n        'array' => 'The :attribute must have at least :min items.',\n    ],\n    'multiple_of' => 'The :attribute must be a multiple of :value.',\n    'not_in' => 'The selected :attribute is invalid.',\n    'not_regex' => 'The :attribute format is invalid.',\n    'numeric' => 'The :attribute must be a number.',\n    'password' => 'The password is incorrect.',\n    'present' => 'The :attribute field must be present.',\n    'regex' => 'The :attribute format is invalid.',\n    'required' => 'The :attribute field is required.',\n    'required_if' => 'The :attribute field is required when :other is :value.',\n    'required_unless' => 'The :attribute field is required unless :other is in :values.',\n    'required_with' => 'The :attribute field is required when :values is present.',\n    'required_with_all' => 'The :attribute field is required when :values are present.',\n    'required_without' => 'The :attribute field is required when :values is not present.',\n    'required_without_all' => 'The :attribute field is required when none of :values are present.',\n    'same' => 'The :attribute and :other must match.',\n    'size' => [\n        'numeric' => 'The :attribute must be :size.',\n        'file' => 'The :attribute must be :size kilobytes.',\n        'string' => 'The :attribute must be :size characters.',\n        'array' => 'The :attribute must contain :size items.',\n    ],\n    'starts_with' => 'The :attribute must start with one of the following: :values.',\n    'string' => 'The :attribute must be a string.',\n    'timezone' => 'The :attribute must be a valid zone.',\n    'unique' => 'The :attribute has already been taken.',\n    'uploaded' => 'The :attribute failed to upload.',\n    'url' => 'The :attribute format is invalid.',\n    'uuid' => 'The :attribute must be a valid UUID.',\n\n    /*\n    |--------------------------------------------------------------------------\n    | Custom Validation Language Lines\n    |--------------------------------------------------------------------------\n    |\n    | Here you may specify custom validation messages for attributes using the\n    | convention \"attribute.rule\" to name the lines. This makes it quick to\n    | specify a specific custom language line for a given attribute rule.\n    |\n    */\n\n    'custom' => [\n        'attribute-name' => [\n            'rule-name' => 'custom-message',\n        ],\n    ],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Custom Validation Attributes\n    |--------------------------------------------------------------------------\n    |\n    | The following language lines are used to swap our attribute placeholder\n    | with something more reader friendly such as \"E-Mail Address\" instead\n    | of \"email\". This simply helps us make our message more expressive.\n    |\n    */\n\n    'attributes' => [],\n\n];\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\"\n  },\n  \"devDependencies\": {\n    \"axios\": \"^1.6.4\",\n    \"laravel-vite-plugin\": \"^1.0.0\",\n    \"vite\": \"^5.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/Webkul/Activity/composer.json",
    "content": "{\n    \"name\": \"krayin/laravel-activity\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Jitendra Singh\",\n            \"email\": \"jitendra@webkul.com\"\n        }\n    ],\n    \"require\": {\n        \"krayin/laravel-core\": \"^1.0\",\n        \"krayin/laravel-user\": \"^1.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Webkul\\\\Activity\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"laravel\": {\n            \"providers\": [\n                \"Webkul\\\\Activity\\\\Providers\\\\ActivityServiceProvider\"\n            ],\n            \"aliases\": {}\n        }\n    },\n    \"minimum-stability\": \"dev\"\n}"
  },
  {
    "path": "packages/Webkul/Activity/src/Contracts/Activity.php",
    "content": "<?php\n\nnamespace Webkul\\Activity\\Contracts;\n\ninterface Activity {}\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Contracts/File.php",
    "content": "<?php\n\nnamespace Webkul\\Activity\\Contracts;\n\ninterface File {}\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Contracts/Participant.php",
    "content": "<?php\n\nnamespace Webkul\\Activity\\Contracts;\n\ninterface Participant {}\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Database/Migrations/2021_05_12_150329_create_activities_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('activities', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('title')->nullable();\n            $table->string('type');\n            $table->text('comment')->nullable();\n            $table->json('additional')->nullable();\n            $table->datetime('schedule_from')->nullable();\n            $table->datetime('schedule_to')->nullable();\n            $table->boolean('is_done')->default(0);\n\n            $table->integer('user_id')->unsigned();\n            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('activities');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Database/Migrations/2021_05_15_151855_create_activity_files_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('activity_files', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->string('path');\n\n            $table->integer('activity_id')->unsigned();\n            $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade');\n\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('activity_files');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Database/Migrations/2021_07_28_142453_create_activity_participants_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('activity_participants', function (Blueprint $table) {\n            $table->increments('id');\n\n            $table->integer('activity_id')->unsigned();\n            $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade');\n\n            $table->integer('user_id')->nullable()->unsigned();\n            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');\n\n            $table->integer('person_id')->nullable()->unsigned();\n            $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('activity_participants');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Database/Migrations/2021_11_17_190943_add_location_column_in_activities_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::table('activities', function (Blueprint $table) {\n            $table->string('location')->nullable();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::table('activities', function (Blueprint $table) {\n            $table->dropColumn('location');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Database/Migrations/2025_01_17_151632_alter_activities_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::table('activities', function (Blueprint $table) {\n            $table->dropForeign(['user_id']);\n\n            $table->unsignedInteger('user_id')->nullable()->change();\n            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::table('activities', function (Blueprint $table) {\n            $tablePrefix = DB::getTablePrefix();\n\n            // Disable foreign key checks temporarily.\n            DB::statement('SET FOREIGN_KEY_CHECKS=0');\n\n            // Drop the foreign key constraint using raw SQL.\n            DB::statement('ALTER TABLE '.$tablePrefix.'activities DROP FOREIGN KEY activities_user_id_foreign');\n\n            // Drop the index.\n            DB::statement('ALTER TABLE '.$tablePrefix.'activities DROP INDEX activities_user_id_foreign');\n\n            // Change the column to be non-nullable.\n            $table->unsignedInteger('user_id')->nullable(false)->change();\n            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');\n\n            // Re-enable foreign key checks.\n            DB::statement('SET FOREIGN_KEY_CHECKS=1');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Models/Activity.php",
    "content": "<?php\n\nnamespace Webkul\\Activity\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Activity\\Contracts\\Activity as ActivityContract;\nuse Webkul\\Contact\\Models\\PersonProxy;\nuse Webkul\\Lead\\Models\\LeadProxy;\nuse Webkul\\Product\\Models\\ProductProxy;\nuse Webkul\\User\\Models\\UserProxy;\nuse Webkul\\Warehouse\\Models\\WarehouseProxy;\n\nclass Activity extends Model implements ActivityContract\n{\n    /**\n     * Define table name of property\n     *\n     * @var string\n     */\n    protected $table = 'activities';\n\n    /**\n     * Define relationships that should be touched on save\n     *\n     * @var array\n     */\n    protected $with = ['user'];\n\n    /**\n     * Cast attributes to date time\n     *\n     * @var array\n     */\n    protected $casts = [\n        'schedule_from' => 'datetime',\n        'schedule_to' => 'datetime',\n    ];\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'title',\n        'type',\n        'location',\n        'comment',\n        'additional',\n        'schedule_from',\n        'schedule_to',\n        'is_done',\n        'user_id',\n    ];\n\n    /**\n     * Get the user that owns the activity.\n     */\n    public function user()\n    {\n        return $this->belongsTo(UserProxy::modelClass());\n    }\n\n    /**\n     * The participants that belong to the activity.\n     */\n    public function participants()\n    {\n        return $this->hasMany(ParticipantProxy::modelClass());\n    }\n\n    /**\n     * Get the file associated with the activity.\n     */\n    public function files()\n    {\n        return $this->hasMany(FileProxy::modelClass(), 'activity_id');\n    }\n\n    /**\n     * The leads that belong to the activity.\n     */\n    public function leads()\n    {\n        return $this->belongsToMany(LeadProxy::modelClass(), 'lead_activities');\n    }\n\n    /**\n     * The Person that belong to the activity.\n     */\n    public function persons()\n    {\n        return $this->belongsToMany(PersonProxy::modelClass(), 'person_activities');\n    }\n\n    /**\n     * The leads that belong to the activity.\n     */\n    public function products()\n    {\n        return $this->belongsToMany(ProductProxy::modelClass(), 'product_activities');\n    }\n\n    /**\n     * The Warehouse that belong to the activity.\n     */\n    public function warehouses()\n    {\n        return $this->belongsToMany(WarehouseProxy::modelClass(), 'warehouse_activities');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Models/ActivityProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Activity\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass ActivityProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Models/File.php",
    "content": "<?php\n\nnamespace Webkul\\Activity\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Webkul\\Activity\\Contracts\\File as FileContract;\n\nclass File extends Model implements FileContract\n{\n    /**\n     * The table associated with the model.\n     *\n     * @var string\n     */\n    protected $table = 'activity_files';\n\n    /**\n     * The attributes that should be appended to the model.\n     *\n     * @var array\n     */\n    protected $appends = ['url'];\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'path',\n        'activity_id',\n    ];\n\n    /**\n     * Get image url for the product image.\n     */\n    public function url()\n    {\n        return Storage::url($this->path);\n    }\n\n    /**\n     * Get image url for the product image.\n     */\n    public function getUrlAttribute()\n    {\n        return $this->url();\n    }\n\n    /**\n     * Get the activity that owns the file.\n     */\n    public function activity()\n    {\n        return $this->belongsTo(ActivityProxy::modelClass());\n    }\n\n    /**\n     * @return array\n     */\n    public function toArray()\n    {\n        $array = parent::toArray();\n\n        $array['url'] = $this->url;\n\n        return $array;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Models/FileProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Activity\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass FileProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Models/Participant.php",
    "content": "<?php\n\nnamespace Webkul\\Activity\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Activity\\Contracts\\Participant as ParticipantContract;\nuse Webkul\\Contact\\Models\\PersonProxy;\nuse Webkul\\User\\Models\\UserProxy;\n\nclass Participant extends Model implements ParticipantContract\n{\n    public $timestamps = false;\n\n    protected $table = 'activity_participants';\n\n    protected $with = ['user', 'person'];\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'activity_id',\n        'user_id',\n        'person_id',\n    ];\n\n    /**\n     * Get the activity that owns the participant.\n     */\n    public function activity()\n    {\n        return $this->belongsTo(ActivityProxy::modelClass());\n    }\n\n    /**\n     * Get the user that owns the participant.\n     */\n    public function user()\n    {\n        return $this->belongsTo(UserProxy::modelClass());\n    }\n\n    /**\n     * Get the person that owns the participant.\n     */\n    public function person()\n    {\n        return $this->belongsTo(PersonProxy::modelClass());\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Models/ParticipantProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Activity\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass ParticipantProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Providers/ActivityServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Activity\\Providers;\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\ServiceProvider;\nuse Webkul\\Activity\\Contracts\\Activity as ActivityContract;\nuse Webkul\\Activity\\Contracts\\File as FileContract;\nuse Webkul\\Activity\\Contracts\\Participant as ParticipantContract;\nuse Webkul\\Activity\\Models\\Activity;\nuse Webkul\\Activity\\Models\\File;\nuse Webkul\\Activity\\Models\\Participant;\n\nclass ActivityServiceProvider extends ServiceProvider\n{\n    /**\n     * Register services.\n     *\n     * Adds Laravel container bindings as a fallback so repositories that\n     * type-hint the contract interfaces resolve even if Concord's\n     * ModuleServiceProvider::boot() has not yet run.\n     */\n    public function register(): void\n    {\n        $this->app->bindIf(ActivityContract::class, Activity::class);\n        $this->app->bindIf(FileContract::class, File::class);\n        $this->app->bindIf(ParticipantContract::class, Participant::class);\n    }\n\n    /**\n     * Bootstrap services.\n     *\n     * @return void\n     */\n    public function boot(Router $router)\n    {\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n\n        // Guarantee that Concord's model-proxy registry contains the Activity\n        // bindings after all providers have booted.  ModelProxy::modelClass()\n        // looks up $concord->model($contract) — a separate store from the\n        // Laravel container — so this registration is strictly necessary for\n        // proxies like ActivityProxy used in Eloquent relationships.\n        $this->app->booted(function () {\n            $concord = app('concord');\n\n            if (! $concord->model(ActivityContract::class)) {\n                $concord->registerModel(ActivityContract::class, Activity::class);\n            }\n\n            if (! $concord->model(FileContract::class)) {\n                $concord->registerModel(FileContract::class, File::class);\n            }\n\n            if (! $concord->model(ParticipantContract::class)) {\n                $concord->registerModel(ParticipantContract::class, Participant::class);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Activity\\Providers;\n\nuse Webkul\\Activity\\Models\\Activity;\nuse Webkul\\Activity\\Models\\File;\nuse Webkul\\Activity\\Models\\Participant;\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    protected $models = [\n        Activity::class,\n        File::class,\n        Participant::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Repositories/ActivityRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Activity\\Repositories;\n\nuse Webkul\\Activity\\Contracts\\Activity;\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass ActivityRepository extends Repository\n{\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\Activity\\Contracts\\Activity';\n    }\n\n    /**\n     * Create pipeline.\n     *\n     * @return Activity\n     */\n    public function create(array $data)\n    {\n        $activity = parent::create($data);\n\n        if (isset($data['file'])) {\n            app(FileRepository::class)->create([\n                'name' => $data['name'] ?? $data['file']->getClientOriginalName(),\n                'path' => $data['file']->store('activities/'.$activity->id),\n                'activity_id' => $activity->id,\n            ]);\n        }\n\n        if (! isset($data['participants'])) {\n            return $activity;\n        }\n\n        foreach ($data['participants']['users'] ?? [] as $userId) {\n            $activity->participants()->create([\n                'user_id' => $userId,\n            ]);\n        }\n\n        foreach ($data['participants']['persons'] ?? [] as $personId) {\n            $activity->participants()->create([\n                'person_id' => $personId,\n            ]);\n        }\n\n        return $activity;\n    }\n\n    /**\n     * Update pipeline.\n     *\n     * @param  int  $id\n     * @param  string  $attribute\n     * @return Activity\n     */\n    public function update(array $data, $id, $attribute = 'id')\n    {\n        $activity = parent::update($data, $id);\n\n        if (isset($data['participants'])) {\n            $activity->participants()->delete();\n\n            foreach ($data['participants']['users'] ?? [] as $userId) {\n                /**\n                 * In some cases, the component exists in an HTML form, and traditional HTML does not send an empty array.\n                 * Therefore, we need to check for an empty string.\n                 * This scenario occurs only when all participants are removed.\n                 */\n                if (empty($userId)) {\n                    break;\n                }\n\n                $activity->participants()->create([\n                    'user_id' => $userId,\n                ]);\n            }\n\n            foreach ($data['participants']['persons'] ?? [] as $personId) {\n                /**\n                 * In some cases, the component exists in an HTML form, and traditional HTML does not send an empty array.\n                 * Therefore, we need to check for an empty string.\n                 * This scenario occurs only when all participants are removed.\n                 */\n                if (empty($personId)) {\n                    break;\n                }\n\n                $activity->participants()->create([\n                    'person_id' => $personId,\n                ]);\n            }\n        }\n\n        return $activity;\n    }\n\n    /**\n     * @param  string  $dateRange\n     * @return mixed\n     */\n    public function getActivities($dateRange)\n    {\n        $tablePrefix = \\DB::getTablePrefix();\n\n        return $this->select(\n            'activities.id',\n            'activities.created_at',\n            'activities.title',\n            'activities.schedule_from as start',\n            'activities.schedule_to as end',\n            'users.name as user_name',\n        )\n            ->addSelect(\\DB::raw('IF('.$tablePrefix.'activities.is_done, \"done\", \"\") as class'))\n            ->leftJoin('activity_participants', 'activities.id', '=', 'activity_participants.activity_id')\n            ->leftJoin('users', 'activities.user_id', '=', 'users.id')\n            ->whereIn('type', ['call', 'meeting', 'lunch'])\n            ->whereBetween('activities.schedule_from', $dateRange)\n            ->where(function ($query) {\n                if ($userIds = bouncer()->getAuthorizedUserIds()) {\n                    $query->whereIn('activities.user_id', $userIds)\n                        ->orWhereIn('activity_participants.user_id', $userIds);\n                }\n            })\n            ->distinct()\n            ->get();\n    }\n\n    /**\n     * @param  string  $startFrom\n     * @param  string  $endFrom\n     * @param  array  $participants\n     * @param  int  $id\n     * @return bool\n     */\n    public function isDurationOverlapping($startFrom, $endFrom, $participants, $id)\n    {\n        $queryBuilder = $this->leftJoin('activity_participants', 'activities.id', '=', 'activity_participants.activity_id')\n            ->where(function ($query) use ($startFrom, $endFrom) {\n                $query->where([\n                    ['activities.schedule_from', '<=', $startFrom],\n                    ['activities.schedule_to', '>=', $startFrom],\n                ])->orWhere([\n                    ['activities.schedule_from', '>=', $startFrom],\n                    ['activities.schedule_from', '<=', $endFrom],\n                ]);\n            })\n            ->where(function ($query) use ($participants) {\n                if (is_null($participants)) {\n                    return;\n                }\n\n                if (isset($participants['users'])) {\n                    $query->orWhereIn('activity_participants.user_id', $participants['users']);\n                }\n\n                if (isset($participants['persons'])) {\n                    $query->orWhereIn('activity_participants.person_id', $participants['persons']);\n                }\n            })\n            ->groupBy('activities.id');\n\n        if (! is_null($id)) {\n            $queryBuilder->where('activities.id', '!=', $id);\n        }\n\n        return $queryBuilder->count() ? true : false;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Repositories/FileRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Activity\\Repositories;\n\nuse Webkul\\Activity\\Contracts\\File;\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass FileRepository extends Repository\n{\n    /**\n     * Specify model class name.\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return File::class;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Repositories/ParticipantRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Activity\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass ParticipantRepository extends Repository\n{\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\Activity\\Contracts\\Participant';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Activity/src/Traits/LogsActivity.php",
    "content": "<?php\n\nnamespace Webkul\\Activity\\Traits;\n\nuse Webkul\\Activity\\Repositories\\ActivityRepository;\nuse Webkul\\Attribute\\Contracts\\AttributeValue;\nuse Webkul\\Attribute\\Repositories\\AttributeValueRepository;\n\ntrait LogsActivity\n{\n    /**\n     * The \"booted\" method of the model.\n     */\n    protected static function booted(): void\n    {\n        static::created(function ($model) {\n            if (! method_exists($model->entity ?? $model, 'activities')) {\n                return;\n            }\n\n            if (! $model instanceof AttributeValue) {\n                $activity = app(ActivityRepository::class)->create([\n                    'type' => 'system',\n                    'title' => trans('admin::app.activities.created'),\n                    'is_done' => 1,\n                    'user_id' => auth()->check()\n                        ? auth()->id()\n                        : null,\n                ]);\n\n                $model->activities()->attach($activity->id);\n\n                return;\n            }\n\n            static::logActivity($model);\n        });\n\n        static::updated(function ($model) {\n            if (! method_exists($model->entity ?? $model, 'activities')) {\n                return;\n            }\n\n            static::logActivity($model);\n        });\n\n        static::deleting(function ($model) {\n            if (! method_exists($model->entity ?? $model, 'activities')) {\n                return;\n            }\n\n            $model->activities()->delete();\n        });\n    }\n\n    /**\n     * Create activity.\n     */\n    protected static function logActivity($model)\n    {\n        $customAttributes = [];\n\n        if (method_exists($model, 'getCustomAttributes')) {\n            $customAttributes = $model->getCustomAttributes()->pluck('code')->toArray();\n        }\n\n        $updatedAttributes = static::getUpdatedAttributes($model);\n\n        foreach ($updatedAttributes as $attributeCode => $attributeData) {\n            if (in_array($attributeCode, $customAttributes)) {\n                continue;\n            }\n\n            $attributeCode = $model->attribute?->name ?: $attributeCode;\n\n            $activity = app(ActivityRepository::class)->create([\n                'type' => 'system',\n                'title' => trans('admin::app.activities.updated', ['attribute' => $attributeCode]),\n                'is_done' => 1,\n                'additional' => json_encode([\n                    'attribute' => $attributeCode,\n                    'new' => [\n                        'value' => $attributeData['new'],\n                        'label' => static::getAttributeLabel($attributeData['new'], $model->attribute),\n                    ],\n                    'old' => [\n                        'value' => $attributeData['old'],\n                        'label' => static::getAttributeLabel($attributeData['old'], $model->attribute),\n                    ],\n                ]),\n                'user_id' => auth()->id(),\n            ]);\n\n            if ($model instanceof AttributeValue) {\n                $model->entity->activities()->attach($activity->id);\n            } else {\n                $model->activities()->attach($activity->id);\n            }\n        }\n    }\n\n    /**\n     * Get attribute label.\n     */\n    protected static function getAttributeLabel($value, $attribute)\n    {\n        return app(AttributeValueRepository::class)->getAttributeLabel($value, $attribute);\n    }\n\n    /**\n     * Create activity.\n     */\n    protected static function getUpdatedAttributes($model)\n    {\n        $updatedAttributes = [];\n\n        foreach ($model->getDirty() as $key => $value) {\n            if (in_array($key, [\n                'id',\n                'attribute_id',\n                'entity_id',\n                'entity_type',\n                'updated_at',\n            ])) {\n                continue;\n            }\n\n            $newValue = static::decodeValueIfJson($value);\n\n            $oldValue = static::decodeValueIfJson($model->getOriginal($key));\n\n            if ($newValue != $oldValue) {\n                $updatedAttributes[$key] = [\n                    'new' => $newValue,\n                    'old' => $oldValue,\n                ];\n            }\n        }\n\n        return $updatedAttributes;\n    }\n\n    /**\n     * Convert value if json.\n     */\n    protected static function decodeValueIfJson($value)\n    {\n        if (\n            ! is_array($value)\n            && json_decode($value, true)\n        ) {\n            $value = json_decode($value, true);\n        }\n\n        if (! is_array($value)) {\n            return $value;\n        }\n\n        static::ksortRecursive($value);\n\n        return $value;\n    }\n\n    /**\n     * Sort array recursively.\n     */\n    protected static function ksortRecursive(&$array)\n    {\n        if (! is_array($array)) {\n            return;\n        }\n\n        ksort($array);\n\n        foreach ($array as &$value) {\n            if (! is_array($value)) {\n                continue;\n            }\n\n            static::ksortRecursive($value);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/.gitignore",
    "content": "/node_modules\n/package-lock.json\nnpm-debug.log\n/playwright-report\n/test-results"
  },
  {
    "path": "packages/Webkul/Admin/composer.json",
    "content": "{\n    \"name\": \"krayin/laravel-admin\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Jitendra Singh\",\n            \"email\": \"jitendra@webkul.com\"\n        }\n    ],\n    \"require\": {\n        \"krayin/laravel-attribute\": \"^1.0\",\n        \"krayin/laravel-contact\": \"^1.0\",\n        \"krayin/laravel-core\": \"^1.0\",\n        \"krayin/laravel-email\": \"^1.0\",\n        \"krayin/laravel-lead\": \"^1.0\",\n        \"krayin/laravel-product\": \"^1.0\",\n        \"krayin/laravel-tag\": \"^1.0\",\n        \"krayin/laravel-ui\": \"^1.0\",\n        \"krayin/laravel-user\": \"^1.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Webkul\\\\Admin\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"laravel\": {\n            \"providers\": [\n                \"Webkul\\\\Admin\\\\Providers\\\\AdminServiceProvider\"\n            ],\n            \"aliases\": {}\n        }\n    },\n    \"minimum-stability\": \"dev\"\n}"
  },
  {
    "path": "packages/Webkul/Admin/package.json",
    "content": "{\n    \"private\": true,\n    \"type\": \"module\",\n    \"scripts\": {\n        \"dev\": \"vite\",\n        \"build\": \"vite build\"\n    },\n    \"devDependencies\": {\n        \"@playwright/test\": \"^1.50.1\",\n        \"@types/node\": \"^22.7.8\",\n        \"autoprefixer\": \"^10.4.16\",\n        \"axios\": \"^1.7.4\",\n        \"laravel-vite-plugin\": \"^1.0\",\n        \"postcss\": \"^8.4.23\",\n        \"tailwindcss\": \"^3.3.2\",\n        \"vite\": \"^5.4.12\",\n        \"vue\": \"^3.4.21\"\n    },\n    \"dependencies\": {\n        \"@vee-validate/i18n\": \"^4.9.1\",\n        \"@vee-validate/rules\": \"^4.9.1\",\n        \"@vitejs/plugin-vue\": \"^4.2.3\",\n        \"chartjs-chart-funnel\": \"^4.2.1\",\n        \"dompurify\": \"^3.1.7\",\n        \"dotenv\": \"^16.4.7\",\n        \"flatpickr\": \"^4.6.13\",\n        \"mitt\": \"^3.0.1\",\n        \"playwright\": \"^1.48.1\",\n        \"readline-sync\": \"^1.4.10\",\n        \"vee-validate\": \"^4.9.1\",\n        \"vue-cal\": \"^4.9.0\",\n        \"vue-flatpickr\": \"^2.3.0\",\n        \"vuedraggable\": \"^4.1.0\"\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/postcss.config.cjs",
    "content": "module.exports = ({ env }) => ({\n    plugins: [require(\"tailwindcss\")(), require(\"autoprefixer\")()],\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Bouncer.php",
    "content": "<?php\n\nnamespace Webkul\\Admin;\n\nuse Webkul\\User\\Repositories\\UserRepository;\n\nclass Bouncer\n{\n    /**\n     * Checks if user allowed or not for certain action\n     *\n     * @param  string  $permission\n     * @return void\n     */\n    public function hasPermission($permission)\n    {\n        if (auth()->guard('user')->check() && auth()->guard('user')->user()->role->permission_type == 'all') {\n            return true;\n        } else {\n            if (! auth()->guard('user')->check() || ! auth()->guard('user')->user()->hasPermission($permission)) {\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * Checks if user allowed or not for certain action\n     *\n     * @param  string  $permission\n     * @return void\n     */\n    public static function allow($permission)\n    {\n        if (! auth()->guard('user')->check() || ! auth()->guard('user')->user()->hasPermission($permission)) {\n            abort(401, 'This action is unauthorized');\n        }\n    }\n\n    /**\n     * This function will return user ids of current user's groups\n     *\n     * @return array|null\n     */\n    public function getAuthorizedUserIds()\n    {\n        $user = auth()->guard('user')->user();\n\n        if ($user->view_permission == 'global') {\n            return null;\n        }\n\n        if ($user->view_permission == 'group') {\n            return app(UserRepository::class)->getCurrentUserGroupsUserIds();\n        } else {\n            return [$user->id];\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Config/acl.php",
    "content": "<?php\n\nreturn [\n    [\n        'key' => 'dashboard',\n        'name' => 'admin::app.layouts.dashboard',\n        'route' => 'admin.dashboard.index',\n        'sort' => 1,\n    ], [\n        'key' => 'leads',\n        'name' => 'admin::app.acl.leads',\n        'route' => 'admin.leads.index',\n        'sort' => 2,\n    ], [\n        'key' => 'leads.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.leads.create', 'admin.leads.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'leads.view',\n        'name' => 'admin::app.acl.view',\n        'route' => 'admin.leads.view',\n        'sort' => 2,\n    ], [\n        'key' => 'leads.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.leads.edit', 'admin.leads.update', 'admin.leads.mass_update'],\n        'sort' => 3,\n    ], [\n        'key' => 'leads.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => ['admin.leads.delete', 'admin.leads.mass_delete'],\n        'sort' => 4,\n    ], [\n        'key' => 'quotes',\n        'name' => 'admin::app.acl.quotes',\n        'route' => 'admin.quotes.index',\n        'sort' => 3,\n    ], [\n        'key' => 'quotes.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.quotes.create', 'admin.quotes.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'quotes.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.quotes.edit', 'admin.quotes.update'],\n        'sort' => 2,\n    ], [\n        'key' => 'quotes.print',\n        'name' => 'admin::app.acl.print',\n        'route' => 'admin.quotes.print',\n        'sort' => 3,\n    ], [\n        'key' => 'quotes.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => ['admin.quotes.delete', 'admin.quotes.mass_delete'],\n        'sort' => 4,\n    ], [\n        'key' => 'mail',\n        'name' => 'admin::app.acl.mail',\n        'route' => 'admin.mail.index',\n        'sort' => 4,\n    ], [\n        'key' => 'mail.inbox',\n        'name' => 'admin::app.acl.inbox',\n        'route' => 'admin.mail.index',\n        'sort' => 1,\n    ], [\n        'key' => 'mail.draft',\n        'name' => 'admin::app.acl.draft',\n        'route' => 'admin.mail.index',\n        'sort' => 2,\n    ], [\n        'key' => 'mail.outbox',\n        'name' => 'admin::app.acl.outbox',\n        'route' => 'admin.mail.index',\n        'sort' => 3,\n    ], [\n        'key' => 'mail.sent',\n        'name' => 'admin::app.acl.sent',\n        'route' => 'admin.mail.index',\n        'sort' => 4,\n    ], [\n        'key' => 'mail.trash',\n        'name' => 'admin::app.acl.trash',\n        'route' => 'admin.mail.index',\n        'sort' => 5,\n    ], [\n        'key' => 'mail.compose',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.mail.store'],\n        'sort' => 6,\n    ], [\n        'key' => 'mail.view',\n        'name' => 'admin::app.acl.view',\n        'route' => 'admin.mail.view',\n        'sort' => 7,\n    ], [\n        'key' => 'mail.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => 'admin.mail.update',\n        'sort' => 8,\n    ], [\n        'key' => 'mail.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => ['admin.mail.delete', 'admin.mail.mass_delete'],\n        'sort' => 9,\n    ], [\n        'key' => 'activities',\n        'name' => 'admin::app.acl.activities',\n        'route' => 'admin.activities.index',\n        'sort' => 5,\n    ], [\n        'key' => 'activities.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.activities.create', 'admin.activities.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'activities.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.activities.edit', 'admin.activities.update', 'admin.activities.mass_update'],\n        'sort' => 2,\n    ], [\n        'key' => 'activities.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => ['admin.activities.delete', 'admin.activities.mass_delete'],\n        'sort' => 3,\n    ], [\n        'key' => 'contacts',\n        'name' => 'admin::app.acl.contacts',\n        'route' => 'admin.contacts.users.index',\n        'sort' => 6,\n    ], [\n        'key' => 'contacts.persons',\n        'name' => 'admin::app.acl.persons',\n        'route' => 'admin.contacts.persons.index',\n        'sort' => 1,\n    ], [\n        'key' => 'contacts.persons.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.contacts.persons.create', 'admin.contacts.persons.store'],\n        'sort' => 2,\n    ], [\n        'key' => 'contacts.persons.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.contacts.persons.edit', 'admin.contacts.persons.update'],\n        'sort' => 3,\n    ], [\n        'key' => 'contacts.persons.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => ['admin.contacts.persons.delete', 'admin.contacts.persons.mass_delete'],\n        'sort' => 4,\n    ], [\n        'key' => 'contacts.persons.view',\n        'name' => 'admin::app.acl.view',\n        'route' => 'admin.contacts.persons.view',\n        'sort' => 5,\n    ], [\n        'key' => 'contacts.organizations',\n        'name' => 'admin::app.acl.organizations',\n        'route' => 'admin.contacts.organizations.index',\n        'sort' => 2,\n    ], [\n        'key' => 'contacts.organizations.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.contacts.organizations.create', 'admin.contacts.organizations.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'contacts.organizations.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.contacts.organizations.edit', 'admin.contacts.organizations.update'],\n        'sort' => 2,\n    ], [\n        'key' => 'contacts.organizations.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => ['admin.contacts.organizations.delete', 'admin.contacts.organizations.mass_delete'],\n        'sort' => 3,\n    ], [\n        'key' => 'products',\n        'name' => 'admin::app.acl.products',\n        'route' => 'admin.products.index',\n        'sort' => 7,\n    ], [\n        'key' => 'products.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.products.create', 'admin.products.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'products.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.products.edit', 'admin.products.update'],\n        'sort' => 2,\n    ], [\n        'key' => 'products.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => ['admin.products.delete', 'admin.products.mass_delete'],\n        'sort' => 3,\n    ], [\n        'key' => 'products.view',\n        'name' => 'admin::app.acl.view',\n        'route' => 'admin.products.view',\n        'sort' => 3,\n    ], [\n        'key' => 'settings',\n        'name' => 'admin::app.acl.settings',\n        'route' => 'admin.settings.index',\n        'sort' => 8,\n    ], [\n        'key' => 'settings.user',\n        'name' => 'admin::app.acl.user',\n        'route' => ['admin.settings.groups.index', 'admin.settings.roles.index', 'admin.settings.users.index'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.user.groups',\n        'name' => 'admin::app.acl.groups',\n        'route' => 'admin.settings.groups.index',\n        'sort' => 1,\n    ], [\n        'key' => 'settings.user.groups.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.settings.groups.create', 'admin.settings.groups.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.user.groups.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.settings.groups.edit', 'admin.settings.groups.update'],\n        'sort' => 2,\n    ], [\n        'key' => 'settings.user.groups.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => 'admin.settings.groups.delete',\n        'sort' => 3,\n    ], [\n        'key' => 'settings.user.roles',\n        'name' => 'admin::app.acl.roles',\n        'route' => 'admin.settings.roles.index',\n        'sort' => 2,\n    ], [\n        'key' => 'settings.user.roles.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.settings.roles.create', 'admin.settings.roles.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.user.roles.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.settings.roles.edit', 'admin.settings.roles.update'],\n        'sort' => 2,\n    ], [\n        'key' => 'settings.user.roles.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => 'admin.settings.roles.delete',\n        'sort' => 3,\n    ], [\n        'key' => 'settings.user.users',\n        'name' => 'admin::app.acl.users',\n        'route' => 'admin.settings.users.index',\n        'sort' => 3,\n    ], [\n        'key' => 'settings.user.users.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.settings.users.create', 'admin.settings.users.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.user.users.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.settings.users.edit', 'admin.settings.users.update', 'admin.settings.users.mass_update'],\n        'sort' => 2,\n    ], [\n        'key' => 'settings.user.users.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => ['admin.settings.users.delete', 'admin.settings.users.mass_delete'],\n        'sort' => 3,\n    ], [\n        'key' => 'settings.lead',\n        'name' => 'admin::app.acl.lead',\n        'route' => ['admin.settings.pipelines.index', 'admin.settings.sources.index', 'admin.settings.types.index'],\n        'sort' => 2,\n    ], [\n        'key' => 'settings.lead.pipelines',\n        'name' => 'admin::app.acl.pipelines',\n        'route' => 'admin.settings.pipelines.index',\n        'sort' => 1,\n    ], [\n        'key' => 'settings.lead.pipelines.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.settings.pipelines.create', 'admin.settings.pipelines.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.lead.pipelines.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.settings.pipelines.edit', 'admin.settings.pipelines.update'],\n        'sort' => 2,\n    ], [\n        'key' => 'settings.lead.pipelines.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => 'admin.settings.pipelines.delete',\n        'sort' => 3,\n    ], [\n        'key' => 'settings.lead.sources',\n        'name' => 'admin::app.acl.sources',\n        'route' => 'admin.settings.sources.index',\n        'sort' => 2,\n    ], [\n        'key' => 'settings.lead.sources.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.settings.sources.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.lead.sources.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.settings.sources.edit', 'admin.settings.sources.update'],\n        'sort' => 2,\n    ], [\n        'key' => 'settings.lead.sources.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => 'admin.settings.sources.delete',\n        'sort' => 3,\n    ], [\n        'key' => 'settings.lead.types',\n        'name' => 'admin::app.acl.types',\n        'route' => 'admin.settings.types.index',\n        'sort' => 3,\n    ], [\n        'key' => 'settings.lead.types.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.settings.types.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.lead.types.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.settings.types.edit', 'admin.settings.types.update'],\n        'sort' => 2,\n    ], [\n        'key' => 'settings.lead.types.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => 'admin.settings.types.delete',\n        'sort' => 3,\n    ], [\n        'key' => 'settings.inventory',\n        'name' => 'admin::app.acl.inventory',\n        'route' => ['admin.settings.warehouse.index'],\n        'sort' => 3,\n    ], [\n        'key' => 'settings.inventory.warehouse',\n        'name' => 'admin::app.acl.warehouses',\n        'route' => ['admin.settings.warehouse.index'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.inventory.warehouse.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.settings.warehouse.create', 'admin.settings.warehouse.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.inventory.warehouse.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.settings.warehouse.edit', 'admin.settings.warehouse.update'],\n        'sort' => 2,\n    ], [\n        'key' => 'settings.inventory.warehouse.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => 'admin.settings.warehouse.delete',\n        'sort' => 3,\n    ], [\n        'key' => 'settings.automation',\n        'name' => 'admin::app.acl.automation',\n        'route' => ['admin.settings.attributes.index', 'admin.settings.email_templates.index', 'admin.settings.workflows.index'],\n        'sort' => 4,\n    ], [\n        'key' => 'settings.automation.attributes',\n        'name' => 'admin::app.acl.attributes',\n        'route' => 'admin.settings.attributes.index',\n        'sort' => 1,\n    ], [\n        'key' => 'settings.automation.attributes.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.settings.attributes.create', 'admin.settings.attributes.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.automation.attributes.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.settings.attributes.edit', 'admin.settings.attributes.update', 'admin.settings.attributes.mass_update'],\n        'sort' => 2,\n    ], [\n        'key' => 'settings.automation.attributes.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => 'admin.settings.attributes.delete',\n        'sort' => 3,\n    ], [\n        'key' => 'settings.automation.email_templates',\n        'name' => 'admin::app.acl.email-templates',\n        'route' => 'admin.settings.email_templates.index',\n        'sort' => 2,\n    ], [\n        'key' => 'settings.automation.email_templates.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.settings.email_templates.create', 'admin.settings.email_templates.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.automation.email_templates.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.settings.email_templates.edit', 'admin.settings.email_templates.update'],\n        'sort' => 2,\n    ], [\n        'key' => 'settings.automation.email_templates.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => 'admin.settings.email_templates.delete',\n        'sort' => 3,\n    ], [\n        'key' => 'settings.automation.workflows',\n        'name' => 'admin::app.acl.workflows',\n        'route' => 'admin.settings.workflows.index',\n        'sort' => 3,\n    ], [\n        'key' => 'settings.automation.workflows.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.settings.workflows.create', 'admin.settings.workflows.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.automation.workflows.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.settings.workflows.edit', 'admin.settings.workflows.update'],\n        'sort' => 2,\n    ], [\n        'key' => 'settings.automation.workflows.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => 'admin.settings.workflows.delete',\n        'sort' => 3,\n    ], [\n        'key' => 'settings.automation.events',\n        'name' => 'admin::app.acl.event',\n        'route' => 'admin.settings.marketing.events.index',\n        'sort' => 4,\n    ], [\n        'key' => 'settings.automation.events.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.settings.marketing.events.create', 'admin.settings.marketing.events.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.automation.events.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.settings.marketing.events.edit', 'admin.settings.marketing.events.update'],\n        'sort' => 2,\n    ], [\n        'key' => 'settings.automation.events.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => ['admin.settings.marketing.events.delete', 'admin.settings.marketing.events.mass_delete'],\n        'sort' => 3,\n    ], [\n        'key' => 'settings.automation.campaigns',\n        'name' => 'admin::app.acl.campaigns',\n        'route' => 'admin.settings.marketing.campaigns.index',\n        'sort' => 5,\n    ], [\n        'key' => 'settings.automation.campaigns.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.settings.marketing.campaigns.create', 'admin.settings.marketing.campaigns.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.automation.campaigns.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.settings.marketing.campaigns.edit', 'admin.settings.marketing.campaigns.update'],\n        'sort' => 2,\n    ], [\n        'key' => 'settings.automation.campaigns.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => ['admin.settings.marketing.campaigns.delete', 'admin.settings.marketing.campaigns.mass_delete'],\n        'sort' => 3,\n    ], [\n        'key' => 'settings.automation.webhooks',\n        'name' => 'admin::app.acl.webhook',\n        'route' => 'admin.settings.webhooks.index',\n        'sort' => 6,\n    ], [\n        'key' => 'settings.automation.webhooks.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.settings.webhooks.create', 'admin.settings.webhooks.store'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.automation.webhooks.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.settings.webhooks.edit', 'admin.settings.webhooks.update'],\n        'sort' => 2,\n    ], [\n        'key' => 'settings.automation.webhooks.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => 'admin.settings.webhooks.delete',\n        'sort' => 3,\n    ], [\n        'key' => 'settings.automation.data_transfer',\n        'name' => 'admin::app.acl.data-transfer',\n        'route' => 'admin.settings.data_transfer.imports.index',\n        'sort' => 7,\n    ], [\n        'key' => 'settings.automation.data_transfer.imports',\n        'name' => 'admin::app.acl.imports',\n        'route' => 'admin.settings.data_transfer.imports.index',\n        'sort' => 1,\n    ], [\n        'key' => 'settings.automation.data_transfer.imports.create',\n        'name' => 'admin::app.acl.create',\n        'route' => 'admin.settings.data_transfer.imports.create',\n        'sort' => 1,\n    ], [\n        'key' => 'settings.automation.data_transfer.imports.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => 'admin.settings.data_transfer.imports.edit',\n        'sort' => 2,\n    ], [\n        'key' => 'settings.automation.data_transfer.imports.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => 'admin.settings.data_transfer.imports.delete',\n        'sort' => 3,\n    ], [\n        'key' => 'settings.automation.data_transfer.imports.import',\n        'name' => 'admin::app.acl.import',\n        'route' => 'admin.settings.data_transfer.imports.imports',\n        'sort' => 4,\n    ], [\n        'key' => 'settings.other_settings',\n        'name' => 'admin::app.acl.other-settings',\n        'route' => 'admin.settings.tags.index',\n        'sort' => 5,\n    ], [\n        'key' => 'settings.other_settings.tags',\n        'name' => 'admin::app.acl.tags',\n        'route' => 'admin.settings.tags.index',\n        'sort' => 1,\n    ], [\n        'key' => 'settings.other_settings.tags.create',\n        'name' => 'admin::app.acl.create',\n        'route' => ['admin.settings.tags.create', 'admin.settings.tags.store', 'admin.leads.tags.attach'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.other_settings.tags.edit',\n        'name' => 'admin::app.acl.edit',\n        'route' => ['admin.settings.tags.edit', 'admin.settings.tags.update'],\n        'sort' => 1,\n    ], [\n        'key' => 'settings.other_settings.tags.delete',\n        'name' => 'admin::app.acl.delete',\n        'route' => ['admin.settings.tags.delete', 'admin.settings.tags.mass_delete', 'admin.leads.tags.detach'],\n        'sort' => 2,\n    ], [\n        'key' => 'configuration',\n        'name' => 'admin::app.acl.configuration',\n        'route' => 'admin.configuration.index',\n        'sort' => 9,\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Config/attribute_entity_types.php",
    "content": "<?php\n\nreturn [\n    'leads' => [\n        'name' => 'admin::app.leads.index.title',\n        'repository' => 'Webkul\\Lead\\Repositories\\LeadRepository',\n    ],\n\n    'persons' => [\n        'name' => 'admin::app.contacts.persons.index.title',\n        'repository' => 'Webkul\\Contact\\Repositories\\PersonRepository',\n    ],\n\n    'organizations' => [\n        'name' => 'admin::app.contacts.organizations.index.title',\n        'repository' => 'Webkul\\Contact\\Repositories\\OrganizationRepository',\n    ],\n\n    'products' => [\n        'name' => 'admin::app.products.index.title',\n        'repository' => 'Webkul\\Product\\Repositories\\ProductRepository',\n    ],\n\n    'quotes' => [\n        'name' => 'admin::app.quotes.index.title',\n        'repository' => 'Webkul\\Quote\\Repositories\\QuoteRepository',\n    ],\n\n    'warehouses' => [\n        'name' => 'admin::app.settings.warehouses.index.title',\n        'repository' => 'Webkul\\Warehouse\\Repositories\\WarehouseRepository',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Config/attribute_lookups.php",
    "content": "<?php\n\nreturn [\n    'leads' => [\n        'name' => 'Leads',\n        'repository' => 'Webkul\\Lead\\Repositories\\LeadRepository',\n        'label_column' => 'title',\n    ],\n\n    'lead_sources' => [\n        'name' => 'Lead Sources',\n        'repository' => 'Webkul\\Lead\\Repositories\\SourceRepository',\n    ],\n\n    'lead_types' => [\n        'name' => 'Lead Types',\n        'repository' => 'Webkul\\Lead\\Repositories\\TypeRepository',\n    ],\n\n    'lead_pipelines' => [\n        'name' => 'Lead Pipelines',\n        'repository' => 'Webkul\\Lead\\Repositories\\PipelineRepository',\n    ],\n\n    'lead_pipeline_stages' => [\n        'name' => 'Lead Pipeline Stages',\n        'repository' => 'Webkul\\Lead\\Repositories\\StageRepository',\n    ],\n\n    'users' => [\n        'name' => 'Sales Owners',\n        'repository' => 'Webkul\\User\\Repositories\\UserRepository',\n    ],\n\n    'organizations' => [\n        'name' => 'Organizations',\n        'repository' => 'Webkul\\Contact\\Repositories\\OrganizationRepository',\n    ],\n\n    'persons' => [\n        'name' => 'Persons',\n        'repository' => 'Webkul\\Contact\\Repositories\\PersonRepository',\n    ],\n\n    'warehouses' => [\n        'name' => 'Warehouses',\n        'repository' => 'Webkul\\Warehouse\\Repositories\\WarehouseRepository',\n    ],\n\n    'locations' => [\n        'name' => 'Locations',\n        'repository' => 'Webkul\\Warehouse\\Repositories\\LocationRepository',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Config/core_config.php",
    "content": "<?php\n\nreturn [\n    /**\n     * General.\n     */\n    [\n        'key' => 'general',\n        'name' => 'admin::app.configuration.index.general.title',\n        'info' => 'admin::app.configuration.index.general.info',\n        'sort' => 1,\n    ], [\n        'key' => 'general.general',\n        'name' => 'admin::app.configuration.index.general.general.title',\n        'info' => 'admin::app.configuration.index.general.general.info',\n        'icon' => 'icon-setting',\n        'sort' => 1,\n    ], [\n        'key' => 'general.general.locale_settings',\n        'name' => 'admin::app.configuration.index.general.general.locale-settings.title',\n        'info' => 'admin::app.configuration.index.general.general.locale-settings.title-info',\n        'sort' => 1,\n        'fields' => [\n            [\n                'name' => 'locale',\n                'title' => 'admin::app.configuration.index.general.general.locale-settings.title',\n                'type' => 'select',\n                'default' => 'en',\n                'options' => 'Webkul\\Core\\Core@locales',\n            ],\n        ],\n    ], [\n        'key' => 'general.general.admin_logo',\n        'name' => 'admin::app.configuration.index.general.general.admin-logo.title',\n        'info' => 'admin::app.configuration.index.general.general.admin-logo.title-info',\n        'sort' => 2,\n        'fields' => [\n            [\n                'name' => 'logo_image',\n                'title' => 'admin::app.configuration.index.general.general.admin-logo.logo-image',\n                'type' => 'image',\n                'validation' => 'mimes:bmp,jpeg,jpg,png,webp,svg',\n            ],\n        ],\n    ], [\n        'key' => 'general.settings',\n        'name' => 'admin::app.configuration.index.general.settings.title',\n        'info' => 'admin::app.configuration.index.general.settings.info',\n        'icon' => 'icon-configuration',\n        'sort' => 2,\n    ], [\n        'key' => 'general.settings.footer',\n        'name' => 'admin::app.configuration.index.general.settings.footer.title',\n        'info' => 'admin::app.configuration.index.general.settings.footer.info',\n        'sort' => 1,\n        'fields' => [\n            [\n                'name' => 'label',\n                'title' => 'admin::app.configuration.index.general.settings.footer.powered-by',\n                'type' => 'editor',\n                'default' => 'Powered by <span style=\"color: rgb(14, 144, 217);\"><a href=\"http://www.krayincrm.com\" target=\"_blank\">Krayin</a></span>, an open-source project by <span style=\"color: rgb(14, 144, 217);\"><a href=\"https://webkul.com\" target=\"_blank\">Webkul</a></span>.',\n                'tinymce' => true,\n            ],\n        ],\n    ], [\n        'key' => 'general.settings.menu',\n        'name' => 'admin::app.configuration.index.general.settings.menu.title',\n        'info' => 'admin::app.configuration.index.general.settings.menu.info',\n        'sort' => 2,\n        'fields' => [\n            [\n                'name' => 'dashboard',\n                'title' => 'admin::app.configuration.index.general.settings.menu.dashboard',\n                'type' => 'text',\n                'default' => 'Dashboard',\n                'validation' => 'max:20',\n            ], [\n                'name' => 'leads',\n                'title' => 'admin::app.configuration.index.general.settings.menu.leads',\n                'type' => 'text',\n                'default' => 'Leads',\n                'validation' => 'max:20',\n            ], [\n                'name' => 'quotes',\n                'title' => 'admin::app.configuration.index.general.settings.menu.quotes',\n                'type' => 'text',\n                'default' => 'Quotes',\n                'validation' => 'max:20',\n            ], [\n                'name' => 'mail.mail',\n                'title' => 'admin::app.configuration.index.general.settings.menu.mail',\n                'type' => 'text',\n                'default' => 'Mail',\n                'validation' => 'max:20',\n            ], [\n                'name' => 'mail.inbox',\n                'title' => 'admin::app.configuration.index.general.settings.menu.inbox',\n                'type' => 'text',\n                'default' => 'Inbox',\n                'validation' => 'max:20',\n            ], [\n                'name' => 'mail.draft',\n                'title' => 'admin::app.configuration.index.general.settings.menu.draft',\n                'type' => 'text',\n                'default' => 'Draft',\n                'validation' => 'max:20',\n            ], [\n                'name' => 'mail.outbox',\n                'title' => 'admin::app.configuration.index.general.settings.menu.outbox',\n                'type' => 'text',\n                'default' => 'Outbox',\n                'validation' => 'max:20',\n            ], [\n                'name' => 'mail.sent',\n                'title' => 'admin::app.configuration.index.general.settings.menu.sent',\n                'type' => 'text',\n                'default' => 'Sent',\n                'validation' => 'max:20',\n            ], [\n                'name' => 'mail.trash',\n                'title' => 'admin::app.configuration.index.general.settings.menu.trash',\n                'type' => 'text',\n                'default' => 'Trash',\n                'validation' => 'max:20',\n            ], [\n                'name' => 'activities',\n                'title' => 'admin::app.configuration.index.general.settings.menu.activities',\n                'type' => 'text',\n                'default' => 'Activities',\n                'validation' => 'max:20',\n            ], [\n                'name' => 'contacts.contacts',\n                'title' => 'admin::app.configuration.index.general.settings.menu.contacts',\n                'type' => 'text',\n                'default' => 'Contacts',\n                'validation' => 'max:20',\n            ], [\n                'name' => 'contacts.persons',\n                'title' => 'admin::app.configuration.index.general.settings.menu.persons',\n                'type' => 'text',\n                'default' => 'Persons',\n                'validation' => 'max:20',\n            ], [\n                'name' => 'contacts.organizations',\n                'title' => 'admin::app.configuration.index.general.settings.menu.organizations',\n                'type' => 'text',\n                'default' => 'Organizations',\n                'validation' => 'max:20',\n            ], [\n                'name' => 'products',\n                'title' => 'admin::app.configuration.index.general.settings.menu.products',\n                'type' => 'text',\n                'default' => 'Products',\n                'validation' => 'max:20',\n            ], [\n                'name' => 'settings',\n                'title' => 'admin::app.configuration.index.general.settings.menu.settings',\n                'type' => 'text',\n                'default' => 'Settings',\n                'validation' => 'max:20',\n            ], [\n                'name' => 'configuration',\n                'title' => 'admin::app.configuration.index.general.settings.menu.configuration',\n                'type' => 'text',\n                'default' => 'Configuration',\n                'validation' => 'max:20',\n            ],\n        ],\n    ], [\n        'key' => 'general.settings.menu_color',\n        'name' => 'admin::app.configuration.index.general.settings.menu-color.title',\n        'info' => 'admin::app.configuration.index.general.settings.menu-color.info',\n        'sort' => 3,\n        'fields' => [\n            [\n                'name' => 'brand_color',\n                'title' => 'admin::app.configuration.index.general.settings.menu-color.brand-color',\n                'type' => 'color',\n                'default' => '#0E90D9',\n            ],\n        ],\n    ], [\n        'key' => 'general.magic_ai',\n        'name' => 'admin::app.configuration.index.magic-ai.title',\n        'info' => 'admin::app.configuration.index.magic-ai.info',\n        'icon' => 'icon-setting',\n        'sort' => 3,\n    ], [\n        'key' => 'general.magic_ai.settings',\n        'name' => 'admin::app.configuration.index.magic-ai.settings.title',\n        'info' => 'admin::app.configuration.index.magic-ai.settings.info',\n        'sort' => 1,\n        'fields' => [\n            [\n                'name' => 'enable',\n                'title' => 'admin::app.configuration.index.magic-ai.settings.enable',\n                'type' => 'boolean',\n                'channel_based' => true,\n            ], [\n                'name' => 'api_key',\n                'title' => 'admin::app.configuration.index.magic-ai.settings.api-key',\n                'type' => 'password',\n                'depends' => 'enable:1',\n                'validation' => 'required_if:enable,1',\n                'info' => 'admin::app.configuration.index.magic-ai.settings.api-key-info',\n            ], [\n                'name' => 'model',\n                'title' => 'admin::app.configuration.index.magic-ai.settings.models.title',\n                'type' => 'select',\n                'channel_based' => true,\n                'depends' => 'enable:1',\n                'options' => [\n                    [\n                        'title' => 'admin::app.configuration.index.magic-ai.settings.models.gpt-4o',\n                        'value' => 'openai/chatgpt-4o-latest',\n                    ], [\n                        'title' => 'admin::app.configuration.index.magic-ai.settings.models.gpt-4o-mini',\n                        'value' => 'openai/gpt-4o-mini',\n                    ], [\n                        'title' => 'admin::app.configuration.index.magic-ai.settings.models.gemini-2-0-flash-001',\n                        'value' => 'google/gemini-2.0-flash-001',\n                    ], [\n                        'title' => 'admin::app.configuration.index.magic-ai.settings.models.deepseek-r1',\n                        'value' => 'deepseek/deepseek-r1-distill-llama-8b',\n                    ], [\n                        'title' => 'admin::app.configuration.index.magic-ai.settings.models.llama-3-2-3b-instruct',\n                        'value' => 'meta-llama/llama-3.2-3b-instruct',\n                    ], [\n                        'title' => 'admin::app.configuration.index.magic-ai.settings.models.grok-2-1212',\n                        'value' => 'x-ai/grok-2-1212',\n                    ],\n                ],\n            ], [\n                'name' => 'other_model',\n                'title' => 'admin::app.configuration.index.magic-ai.settings.other',\n                'type' => 'text',\n                'info' => 'admin::app.configuration.index.magic-ai.settings.other-model',\n                'default' => null,\n                'depends' => 'enable:1',\n            ],\n        ],\n    ], [\n        'key' => 'general.magic_ai.doc_generation',\n        'name' => 'admin::app.configuration.index.magic-ai.settings.doc-generation',\n        'info' => 'admin::app.configuration.index.magic-ai.settings.doc-generation-info',\n        'sort' => 2,\n        'fields' => [\n            [\n                'name' => 'enabled',\n                'title' => 'admin::app.configuration.index.magic-ai.settings.enable',\n                'type' => 'boolean',\n            ],\n        ],\n    ],\n\n    /**\n     * Email.\n     */\n    [\n        'key' => 'email',\n        'name' => 'admin::app.configuration.index.email.title',\n        'info' => 'admin::app.configuration.index.email.info',\n        'sort' => 2,\n    ], [\n        'key' => 'email.imap',\n        'name' => 'admin::app.configuration.index.email.imap.title',\n        'info' => 'admin::app.configuration.index.email.imap.info',\n        'icon' => 'icon-setting',\n        'sort' => 1,\n    ], [\n        'key' => 'email.imap.account',\n        'name' => 'admin::app.configuration.index.email.imap.account.title',\n        'info' => 'admin::app.configuration.index.email.imap.account.title-info',\n        'sort' => 1,\n        'fields' => [\n            [\n                'name' => 'host',\n                'title' => 'admin::app.configuration.index.email.imap.account.host',\n                'type' => 'text',\n                'default' => config('imap.accounts.default.host'),\n            ],\n            [\n                'name' => 'port',\n                'title' => 'admin::app.configuration.index.email.imap.account.port',\n                'type' => 'text',\n                'default' => config('imap.accounts.default.port'),\n            ],\n            [\n                'name' => 'encryption',\n                'title' => 'admin::app.configuration.index.email.imap.account.encryption',\n                'type' => 'text',\n                'default' => config('imap.accounts.default.encryption'),\n            ],\n            [\n                'name' => 'validate_cert',\n                'title' => 'admin::app.configuration.index.email.imap.account.validate-cert',\n                'type' => 'boolean',\n                'default' => config('imap.accounts.default.validate_cert'),\n            ],\n            [\n                'name' => 'username',\n                'title' => 'admin::app.configuration.index.email.imap.account.username',\n                'type' => 'text',\n                'default' => config('imap.accounts.default.username'),\n            ],\n            [\n                'name' => 'password',\n                'title' => 'admin::app.configuration.index.email.imap.account.password',\n                'type' => 'password',\n                'default' => config('imap.accounts.default.password'),\n            ],\n        ],\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Config/menu.php",
    "content": "<?php\n\nreturn [\n    /**\n     * Dashboard.\n     */\n    [\n        'key' => 'dashboard',\n        'name' => 'admin::app.layouts.dashboard',\n        'route' => 'admin.dashboard.index',\n        'sort' => 1,\n        'icon-class' => 'icon-dashboard',\n    ],\n\n    /**\n     * Leads.\n     */\n    [\n        'key' => 'leads',\n        'name' => 'admin::app.layouts.leads',\n        'route' => 'admin.leads.index',\n        'sort' => 2,\n        'icon-class' => 'icon-leads',\n    ],\n\n    /**\n     * Quotes.\n     */\n    [\n        'key' => 'quotes',\n        'name' => 'admin::app.layouts.quotes',\n        'route' => 'admin.quotes.index',\n        'sort' => 3,\n        'icon-class' => 'icon-quote',\n    ],\n\n    /**\n     * Emails.\n     */\n    [\n        'key' => 'mail',\n        'name' => 'admin::app.layouts.mail.title',\n        'route' => 'admin.mail.index',\n        'params' => ['route' => 'inbox'],\n        'sort' => 4,\n        'icon-class' => 'icon-mail',\n    ], [\n        'key' => 'mail.inbox',\n        'name' => 'admin::app.layouts.mail.inbox',\n        'route' => 'admin.mail.index',\n        'params' => ['route' => 'inbox'],\n        'sort' => 2,\n        'icon-class' => '',\n    ], [\n        'key' => 'mail.draft',\n        'name' => 'admin::app.layouts.mail.draft',\n        'route' => 'admin.mail.index',\n        'params' => ['route' => 'draft'],\n        'sort' => 3,\n        'icon-class' => '',\n    ], [\n        'key' => 'mail.outbox',\n        'name' => 'admin::app.layouts.mail.outbox',\n        'route' => 'admin.mail.index',\n        'params' => ['route' => 'outbox'],\n        'sort' => 4,\n        'icon-class' => '',\n    ], [\n        'key' => 'mail.sent',\n        'name' => 'admin::app.layouts.mail.sent',\n        'route' => 'admin.mail.index',\n        'params' => ['route' => 'sent'],\n        'sort' => 4,\n        'icon-class' => '',\n    ], [\n        'key' => 'mail.trash',\n        'name' => 'admin::app.layouts.mail.trash',\n        'route' => 'admin.mail.index',\n        'params' => ['route' => 'trash'],\n        'sort' => 5,\n        'icon-class' => '',\n    ],\n\n    /**\n     * Activities.\n     */\n    [\n        'key' => 'activities',\n        'name' => 'admin::app.layouts.activities',\n        'route' => 'admin.activities.index',\n        'sort' => 5,\n        'icon-class' => 'icon-activity',\n    ],\n\n    /**\n     * Contacts.\n     */\n    [\n        'key' => 'contacts',\n        'name' => 'admin::app.layouts.contacts',\n        'route' => 'admin.contacts.persons.index',\n        'sort' => 6,\n        'icon-class' => 'icon-contact',\n    ], [\n        'key' => 'contacts.persons',\n        'name' => 'admin::app.layouts.persons',\n        'route' => 'admin.contacts.persons.index',\n        'sort' => 1,\n        'icon-class' => '',\n    ], [\n        'key' => 'contacts.organizations',\n        'name' => 'admin::app.layouts.organizations',\n        'route' => 'admin.contacts.organizations.index',\n        'sort' => 2,\n        'icon-class' => '',\n    ],\n\n    /**\n     * Products.\n     */\n    [\n        'key' => 'products',\n        'name' => 'admin::app.layouts.products',\n        'route' => 'admin.products.index',\n        'sort' => 7,\n        'icon-class' => 'icon-product',\n    ],\n\n    /**\n     * Settings.\n     */\n    [\n        'key' => 'settings',\n        'name' => 'admin::app.layouts.settings',\n        'route' => 'admin.settings.index',\n        'sort' => 8,\n        'icon-class' => 'icon-setting',\n    ], [\n        'key' => 'settings.user',\n        'name' => 'admin::app.layouts.user',\n        'route' => 'admin.settings.groups.index',\n        'info' => 'admin::app.layouts.user-info',\n        'sort' => 1,\n        'icon-class' => 'icon-settings-group',\n    ], [\n        'key' => 'settings.user.groups',\n        'name' => 'admin::app.layouts.groups',\n        'info' => 'admin::app.layouts.groups-info',\n        'route' => 'admin.settings.groups.index',\n        'sort' => 1,\n        'icon-class' => 'icon-settings-group',\n    ], [\n        'key' => 'settings.user.roles',\n        'name' => 'admin::app.layouts.roles',\n        'info' => 'admin::app.layouts.roles-info',\n        'route' => 'admin.settings.roles.index',\n        'sort' => 2,\n        'icon-class' => 'icon-role',\n    ], [\n        'key' => 'settings.user.users',\n        'name' => 'admin::app.layouts.users',\n        'info' => 'admin::app.layouts.users-info',\n        'route' => 'admin.settings.users.index',\n        'sort' => 3,\n        'icon-class' => 'icon-user',\n    ], [\n        'key' => 'settings.lead',\n        'name' => 'admin::app.layouts.lead',\n        'info' => 'admin::app.layouts.lead-info',\n        'route' => 'admin.settings.pipelines.index',\n        'sort' => 2,\n        'icon-class' => '',\n    ], [\n        'key' => 'settings.lead.pipelines',\n        'name' => 'admin::app.layouts.pipelines',\n        'info' => 'admin::app.layouts.pipelines-info',\n        'route' => 'admin.settings.pipelines.index',\n        'sort' => 1,\n        'icon-class' => 'icon-settings-pipeline',\n    ], [\n        'key' => 'settings.lead.sources',\n        'name' => 'admin::app.layouts.sources',\n        'info' => 'admin::app.layouts.sources-info',\n        'route' => 'admin.settings.sources.index',\n        'sort' => 2,\n        'icon-class' => 'icon-settings-sources',\n    ], [\n        'key' => 'settings.lead.types',\n        'name' => 'admin::app.layouts.types',\n        'info' => 'admin::app.layouts.types-info',\n        'route' => 'admin.settings.types.index',\n        'sort' => 3,\n        'icon-class' => 'icon-settings-type',\n    ], [\n        'key' => 'settings.inventory',\n        'name' => 'admin::app.layouts.inventory',\n        'info' => 'admin::app.layouts.inventory-info',\n        'route' => 'admin.settings.pipelines.index',\n        'icon-class' => '',\n        'sort' => 2,\n    ], [\n        'key' => 'settings.inventory.warehouse',\n        'name' => 'admin::app.layouts.warehouses',\n        'info' => 'admin::app.layouts.warehouses-info',\n        'route' => 'admin.settings.warehouses.index',\n        'sort' => 1,\n        'icon-class' => 'icon-settings-warehouse',\n    ], [\n        'key' => 'settings.automation',\n        'name' => 'admin::app.layouts.automation',\n        'info' => 'admin::app.layouts.automation-info',\n        'route' => 'admin.settings.attributes.index',\n        'sort' => 3,\n        'icon-class' => '',\n    ], [\n        'key' => 'settings.automation.attributes',\n        'name' => 'admin::app.layouts.attributes',\n        'info' => 'admin::app.layouts.attributes-info',\n        'route' => 'admin.settings.attributes.index',\n        'sort' => 1,\n        'icon-class' => 'icon-attribute',\n    ], [\n        'key' => 'settings.automation.email_templates',\n        'name' => 'admin::app.layouts.email-templates',\n        'info' => 'admin::app.layouts.email-templates-info',\n        'route' => 'admin.settings.email_templates.index',\n        'sort' => 2,\n        'icon-class' => 'icon-settings-mail',\n    ], [\n        'key' => 'settings.automation.events',\n        'name' => 'admin::app.layouts.events',\n        'info' => 'admin::app.layouts.events-info',\n        'route' => 'admin.settings.marketing.events.index',\n        'sort' => 2,\n        'icon-class' => 'icon-calendar',\n    ], [\n        'key' => 'settings.automation.campaigns',\n        'name' => 'admin::app.layouts.campaigns',\n        'info' => 'admin::app.layouts.campaigns-info',\n        'route' => 'admin.settings.marketing.campaigns.index',\n        'sort' => 2,\n        'icon-class' => 'icon-note',\n    ], [\n        'key' => 'settings.automation.webhooks',\n        'name' => 'admin::app.layouts.webhooks',\n        'info' => 'admin::app.layouts.webhooks-info',\n        'route' => 'admin.settings.webhooks.index',\n        'sort' => 2,\n        'icon-class' => 'icon-settings-webhooks',\n    ], [\n        'key' => 'settings.automation.workflows',\n        'name' => 'admin::app.layouts.workflows',\n        'info' => 'admin::app.layouts.workflows-info',\n        'route' => 'admin.settings.workflows.index',\n        'sort' => 3,\n        'icon-class' => 'icon-settings-flow',\n    ], [\n        'key' => 'settings.automation.data_transfer',\n        'name' => 'admin::app.layouts.data_transfer',\n        'info' => 'admin::app.layouts.data_transfer_info',\n        'route' => 'admin.settings.data_transfer.imports.index',\n        'sort' => 4,\n        'icon-class' => 'icon-download',\n    ], [\n        'key' => 'settings.other_settings',\n        'name' => 'admin::app.layouts.other-settings',\n        'info' => 'admin::app.layouts.other-settings-info',\n        'route' => 'admin.settings.tags.index',\n        'sort' => 4,\n        'icon-class' => 'icon-settings',\n    ], [\n        'key' => 'settings.other_settings.tags',\n        'name' => 'admin::app.layouts.tags',\n        'info' => 'admin::app.layouts.tags-info',\n        'route' => 'admin.settings.tags.index',\n        'sort' => 1,\n        'icon-class' => 'icon-settings-tag',\n    ],\n\n    /**\n     * Configuration.\n     */\n    [\n        'key' => 'configuration',\n        'name' => 'admin::app.layouts.configuration',\n        'route' => 'admin.configuration.index',\n        'sort' => 9,\n        'icon-class' => 'icon-configuration',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Activity/ActivityDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Activity;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\Admin\\Traits\\ProvideDropdownOptions;\nuse Webkul\\DataGrid\\DataGrid;\nuse Webkul\\Lead\\Repositories\\LeadRepository;\nuse Webkul\\User\\Repositories\\UserRepository;\n\nclass ActivityDataGrid extends DataGrid\n{\n    use ProvideDropdownOptions;\n\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $queryBuilder = DB::table('activities')\n            ->distinct()\n            ->select(\n                'activities.*',\n                'leads.id as lead_id',\n                'leads.title as lead_title',\n                'leads.lead_pipeline_id',\n                'users.id as created_by_id',\n                'users.name as created_by',\n            )\n            ->leftJoin('activity_participants', 'activities.id', '=', 'activity_participants.activity_id')\n            ->leftJoin('lead_activities', 'activities.id', '=', 'lead_activities.activity_id')\n            ->leftJoin('leads', 'lead_activities.lead_id', '=', 'leads.id')\n            ->leftJoin('users', 'activities.user_id', '=', 'users.id')\n            ->whereIn('type', ['call', 'meeting', 'lunch'])\n            ->where(function ($query) {\n                if ($userIds = bouncer()->getAuthorizedUserIds()) {\n                    $query->whereIn('activities.user_id', $userIds)\n                        ->orWhereIn('activity_participants.user_id', $userIds);\n                }\n            })->groupBy('activities.id', 'leads.id', 'users.id');\n\n        $this->addFilter('id', 'activities.id');\n        $this->addFilter('title', 'activities.title');\n        $this->addFilter('schedule_from', 'activities.schedule_from');\n        $this->addFilter('created_by', 'users.name');\n        $this->addFilter('created_by_id', 'users.name');\n        $this->addFilter('created_at', 'activities.created_at');\n        $this->addFilter('lead_title', 'leads.title');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Prepare columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.activities.index.datagrid.id'),\n            'type' => 'integer',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'is_done',\n            'label' => trans('admin::app.activities.index.datagrid.is_done'),\n            'type' => 'string',\n            'dropdown_options' => $this->getBooleanDropdownOptions('yes_no'),\n            'searchable' => false,\n            'closure' => fn ($row) => view('admin::activities.datagrid.is-done', compact('row'))->render(),\n        ]);\n\n        $this->addColumn([\n            'index' => 'title',\n            'label' => trans('admin::app.activities.index.datagrid.title'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'created_by_id',\n            'label' => trans('admin::app.activities.index.datagrid.created_by'),\n            'type' => 'string',\n            'searchable' => false,\n            'sortable' => true,\n            'filterable' => true,\n            'filterable_type' => 'searchable_dropdown',\n            'filterable_options' => [\n                'repository' => UserRepository::class,\n                'column' => [\n                    'label' => 'name',\n                    'value' => 'name',\n                ],\n            ],\n            'closure' => function ($row) {\n                $route = urldecode(route('admin.settings.users.index', ['id[eq]' => $row->created_by_id]));\n\n                return \"<a class='text-brandColor hover:underline' href='\".$route.\"'>\".$row->created_by.'</a>';\n            },\n        ]);\n\n        $this->addColumn([\n            'index' => 'comment',\n            'label' => trans('admin::app.activities.index.datagrid.comment'),\n            'type' => 'string',\n        ]);\n\n        $this->addColumn([\n            'index' => 'lead_title',\n            'label' => trans('admin::app.activities.index.datagrid.lead'),\n            'type' => 'string',\n            'searchable' => true,\n            'sortable' => true,\n            'filterable' => true,\n            'filterable_type' => 'searchable_dropdown',\n            'filterable_options' => [\n                'repository' => LeadRepository::class,\n                'column' => [\n                    'label' => 'title',\n                    'value' => 'title',\n                ],\n            ],\n            'closure' => function ($row) {\n                if ($row->lead_title == null) {\n                    return \"<span class='text-gray-800 dark:text-gray-300'>N/A</span>\";\n                }\n\n                $route = urldecode(route('admin.leads.view', $row->lead_id));\n\n                return \"<a class='text-brandColor hover:underline' target='_blank' href='\".$route.\"'>\".$row->lead_title.'</a>';\n            },\n        ]);\n\n        $this->addColumn([\n            'index' => 'type',\n            'label' => trans('admin::app.activities.index.datagrid.type'),\n            'type' => 'string',\n            'searchable' => false,\n            'filterable' => false,\n            'sortable' => true,\n            'closure' => fn ($row) => trans('admin::app.activities.index.datagrid.'.$row->type),\n        ]);\n\n        $this->addColumn([\n            'index' => 'schedule_from',\n            'label' => trans('admin::app.activities.index.datagrid.schedule_from'),\n            'type' => 'date',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n            'closure' => fn ($row) => core()->formatDate($row->schedule_from),\n        ]);\n\n        $this->addColumn([\n            'index' => 'schedule_to',\n            'label' => trans('admin::app.activities.index.datagrid.schedule_to'),\n            'type' => 'date',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n            'closure' => fn ($row) => core()->formatDate($row->schedule_to),\n        ]);\n\n        $this->addColumn([\n            'index' => 'created_at',\n            'label' => trans('admin::app.activities.index.datagrid.created_at'),\n            'type' => 'date',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n            'closure' => fn ($row) => core()->formatDate($row->created_at),\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('activities.edit')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.activities.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.activities.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('activities.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.activities.index.datagrid.update'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.activities.delete', $row->id),\n            ]);\n        }\n    }\n\n    /**\n     * Prepare mass actions.\n     */\n    public function prepareMassActions(): void\n    {\n\n        $this->addMassAction([\n            'icon' => 'icon-delete',\n            'title' => trans('admin::app.activities.index.datagrid.mass-delete'),\n            'method' => 'POST',\n            'url' => route('admin.activities.mass_delete'),\n        ]);\n\n        $this->addMassAction([\n            'title' => trans('admin::app.activities.index.datagrid.mass-update'),\n            'url' => route('admin.activities.mass_update'),\n            'method' => 'POST',\n            'options' => [\n                [\n                    'label' => trans('admin::app.activities.index.datagrid.done'),\n                    'value' => 1,\n                ], [\n                    'label' => trans('admin::app.activities.index.datagrid.not-done'),\n                    'value' => 0,\n                ],\n            ],\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Contact/OrganizationDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Contact;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass OrganizationDataGrid extends DataGrid\n{\n    /**\n     * Create datagrid instance.\n     *\n     * @return void\n     */\n    public function __construct(protected PersonRepository $personRepository) {}\n\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        return DB::table('organizations')\n            ->addSelect(\n                'organizations.id',\n                'organizations.name',\n                'organizations.address',\n                'organizations.created_at'\n            );\n\n        if ($userIds = bouncer()->getAuthorizedUserIds()) {\n            $queryBuilder->whereIn('organizations.user_id', $userIds);\n        }\n\n        $this->addFilter('id', 'organizations.id');\n\n        $this->addFilter('organization', 'organizations.name');\n    }\n\n    /**\n     * Add columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.contacts.organizations.index.datagrid.id'),\n            'type' => 'integer',\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.contacts.organizations.index.datagrid.name'),\n            'type' => 'string',\n            'searchable' => true,\n            'sortable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'persons_count',\n            'label' => trans('admin::app.contacts.organizations.index.datagrid.persons-count'),\n            'type' => 'string',\n            'searchable' => false,\n            'sortable' => false,\n            'filterable' => false,\n            'closure' => function ($row) {\n                $personsCount = $this->personRepository->findWhere(['organization_id' => $row->id])->count();\n\n                return $personsCount;\n            },\n        ]);\n\n        $this->addColumn([\n            'index' => 'created_at',\n            'label' => trans('admin::app.settings.tags.index.datagrid.created-at'),\n            'type' => 'date',\n            'searchable' => true,\n            'filterable' => true,\n            'filterable_type' => 'date_range',\n            'sortable' => true,\n            'closure' => fn ($row) => core()->formatDate($row->created_at),\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('contacts.organizations.edit')) {\n            $this->addAction([\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.contacts.organizations.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.contacts.organizations.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('contacts.organizations.delete')) {\n            $this->addAction([\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.contacts.organizations.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.contacts.organizations.delete', $row->id),\n            ]);\n        }\n    }\n\n    /**\n     * Prepare mass actions.\n     */\n    public function prepareMassActions(): void\n    {\n        $this->addMassAction([\n            'icon' => 'icon-delete',\n            'title' => trans('admin::app.contacts.organizations.index.datagrid.delete'),\n            'method' => 'PUT',\n            'url' => route('admin.contacts.organizations.mass_delete'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Contact/PersonDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Contact;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\Contact\\Repositories\\OrganizationRepository;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass PersonDataGrid extends DataGrid\n{\n    /**\n     * Create a new class instance.\n     *\n     * @return void\n     */\n    public function __construct(protected OrganizationRepository $organizationRepository) {}\n\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $queryBuilder = DB::table('persons')\n            ->addSelect(\n                'persons.id',\n                'persons.name as person_name',\n                'persons.emails',\n                'persons.contact_numbers',\n                'organizations.name as organization',\n                'organizations.id as organization_id'\n            )\n            ->leftJoin('organizations', 'persons.organization_id', '=', 'organizations.id');\n\n        if ($userIds = bouncer()->getAuthorizedUserIds()) {\n            $queryBuilder->whereIn('persons.user_id', $userIds);\n        }\n\n        $this->addFilter('id', 'persons.id');\n        $this->addFilter('person_name', 'persons.name');\n        $this->addFilter('organization', 'organizations.name');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Add columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.contacts.persons.index.datagrid.id'),\n            'type' => 'integer',\n            'filterable' => true,\n            'sortable' => true,\n            'searchable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'person_name',\n            'label' => trans('admin::app.contacts.persons.index.datagrid.name'),\n            'type' => 'string',\n            'sortable' => true,\n            'filterable' => true,\n            'searchable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'emails',\n            'label' => trans('admin::app.contacts.persons.index.datagrid.emails'),\n            'type' => 'string',\n            'sortable' => false,\n            'filterable' => true,\n            'searchable' => true,\n            'closure' => fn ($row) => collect(json_decode($row->emails, true) ?? [])->pluck('value')->join(', '),\n        ]);\n\n        $this->addColumn([\n            'index' => 'contact_numbers',\n            'label' => trans('admin::app.contacts.persons.index.datagrid.contact-numbers'),\n            'type' => 'string',\n            'sortable' => true,\n            'filterable' => true,\n            'searchable' => true,\n            'closure' => fn ($row) => collect(json_decode($row->contact_numbers, true) ?? [])->pluck('value')->join(', '),\n        ]);\n\n        $this->addColumn([\n            'index' => 'organization',\n            'label' => trans('admin::app.contacts.persons.index.datagrid.organization-name'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n            'filterable_type' => 'searchable_dropdown',\n            'filterable_options' => [\n                'repository' => OrganizationRepository::class,\n                'column' => [\n                    'label' => 'name',\n                    'value' => 'name',\n                ],\n            ],\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('contacts.persons.view')) {\n            $this->addAction([\n                'icon' => 'icon-eye',\n                'title' => trans('admin::app.contacts.persons.index.datagrid.view'),\n                'method' => 'GET',\n                'url' => function ($row) {\n                    return route('admin.contacts.persons.view', $row->id);\n                },\n            ]);\n        }\n\n        if (bouncer()->hasPermission('contacts.persons.edit')) {\n            $this->addAction([\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.contacts.persons.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => function ($row) {\n                    return route('admin.contacts.persons.edit', $row->id);\n                },\n            ]);\n        }\n\n        if (bouncer()->hasPermission('contacts.persons.delete')) {\n            $this->addAction([\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.contacts.persons.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => function ($row) {\n                    return route('admin.contacts.persons.delete', $row->id);\n                },\n            ]);\n        }\n    }\n\n    /**\n     * Prepare mass actions.\n     */\n    public function prepareMassActions(): void\n    {\n        if (bouncer()->hasPermission('contacts.persons.delete')) {\n            $this->addMassAction([\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.contacts.persons.index.datagrid.delete'),\n                'method' => 'POST',\n                'url' => route('admin.contacts.persons.mass_delete'),\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Lead/LeadDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Lead;\n\nuse Illuminate\\Contracts\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\nuse Webkul\\Contract\\Repositories\\Pipeline;\nuse Webkul\\DataGrid\\DataGrid;\nuse Webkul\\Lead\\Repositories\\PipelineRepository;\nuse Webkul\\Lead\\Repositories\\SourceRepository;\nuse Webkul\\Lead\\Repositories\\StageRepository;\nuse Webkul\\Lead\\Repositories\\TypeRepository;\nuse Webkul\\Tag\\Repositories\\TagRepository;\nuse Webkul\\User\\Repositories\\UserRepository;\n\nclass LeadDataGrid extends DataGrid\n{\n    /**\n     * Pipeline instance.\n     *\n     * @var Pipeline\n     */\n    protected $pipeline;\n\n    /**\n     * Create data grid instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected PipelineRepository $pipelineRepository,\n        protected StageRepository $stageRepository,\n        protected SourceRepository $sourceRepository,\n        protected TypeRepository $typeRepository,\n        protected UserRepository $userRepository,\n        protected TagRepository $tagRepository,\n    ) {\n        if (request('pipeline_id')) {\n            $this->pipeline = $this->pipelineRepository->find(request('pipeline_id'));\n        } else {\n            $this->pipeline = $this->pipelineRepository->getDefaultPipeline();\n        }\n    }\n\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $tablePrefix = DB::getTablePrefix();\n\n        $queryBuilder = DB::table('leads')\n            ->addSelect(\n                'leads.id',\n                'leads.title',\n                'leads.status',\n                'leads.lead_value',\n                'leads.expected_close_date',\n                'lead_sources.name as lead_source_name',\n                'lead_types.name as lead_type_name',\n                'leads.created_at',\n                'lead_pipeline_stages.name as stage',\n                'lead_tags.tag_id as tag_id',\n                'users.id as user_id',\n                'users.name as sales_person',\n                'persons.id as person_id',\n                'persons.name as person_name',\n                'tags.name as tag_name',\n                'lead_pipelines.rotten_days as pipeline_rotten_days',\n                'lead_pipeline_stages.code as stage_code',\n                DB::raw('CASE WHEN DATEDIFF(NOW(),'.$tablePrefix.'leads.created_at) >='.$tablePrefix.'lead_pipelines.rotten_days THEN 1 ELSE 0 END as rotten_lead'),\n            )\n            ->leftJoin('users', 'leads.user_id', '=', 'users.id')\n            ->leftJoin('persons', 'leads.person_id', '=', 'persons.id')\n            ->leftJoin('lead_types', 'leads.lead_type_id', '=', 'lead_types.id')\n            ->leftJoin('lead_pipeline_stages', 'leads.lead_pipeline_stage_id', '=', 'lead_pipeline_stages.id')\n            ->leftJoin('lead_sources', 'leads.lead_source_id', '=', 'lead_sources.id')\n            ->leftJoin('lead_pipelines', 'leads.lead_pipeline_id', '=', 'lead_pipelines.id')\n            ->leftJoin('lead_tags', 'leads.id', '=', 'lead_tags.lead_id')\n            ->leftJoin('tags', 'tags.id', '=', 'lead_tags.tag_id')\n            ->groupBy('leads.id')\n            ->where('leads.lead_pipeline_id', $this->pipeline->id);\n\n        if ($userIds = bouncer()->getAuthorizedUserIds()) {\n            $queryBuilder->whereIn('leads.user_id', $userIds);\n        }\n\n        if (! is_null(request()->input('rotten_lead.in'))) {\n            $queryBuilder->havingRaw($tablePrefix.'rotten_lead = '.request()->input('rotten_lead.in'));\n        }\n\n        $this->addFilter('id', 'leads.id');\n        $this->addFilter('user', 'leads.user_id');\n        $this->addFilter('sales_person', 'users.name');\n        $this->addFilter('lead_source_name', 'lead_sources.id');\n        $this->addFilter('lead_type_name', 'lead_types.id');\n        $this->addFilter('person_name', 'persons.name');\n        $this->addFilter('type', 'lead_pipeline_stages.code');\n        $this->addFilter('stage', 'lead_pipeline_stages.id');\n        $this->addFilter('tag_name', 'tags.name');\n        $this->addFilter('expected_close_date', 'leads.expected_close_date');\n        $this->addFilter('created_at', 'leads.created_at');\n        $this->addFilter('rotten_lead', DB::raw('DATEDIFF(NOW(), '.$tablePrefix.'leads.created_at) >= '.$tablePrefix.'lead_pipelines.rotten_days'));\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Prepare columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.leads.index.datagrid.id'),\n            'type' => 'integer',\n            'sortable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'sales_person',\n            'label' => trans('admin::app.leads.index.datagrid.sales-person'),\n            'type' => 'string',\n            'searchable' => false,\n            'sortable' => true,\n            'filterable' => true,\n            'filterable_type' => 'searchable_dropdown',\n            'filterable_options' => [\n                'repository' => UserRepository::class,\n                'column' => [\n                    'label' => 'name',\n                    'value' => 'name',\n                ],\n            ],\n        ]);\n\n        $this->addColumn([\n            'index' => 'title',\n            'label' => trans('admin::app.leads.index.datagrid.subject'),\n            'type' => 'string',\n            'searchable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'lead_source_name',\n            'label' => trans('admin::app.leads.index.datagrid.source'),\n            'type' => 'string',\n            'searchable' => false,\n            'sortable' => true,\n            'filterable' => true,\n            'filterable_type' => 'dropdown',\n            'filterable_options' => $this->sourceRepository->all(['name as label', 'id as value'])->toArray(),\n        ]);\n\n        $this->addColumn([\n            'index' => 'lead_value',\n            'label' => trans('admin::app.leads.index.datagrid.lead-value'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => false,\n            'filterable' => true,\n            'closure' => fn ($row) => core()->formatBasePrice($row->lead_value, 2),\n        ]);\n\n        $this->addColumn([\n            'index' => 'lead_type_name',\n            'label' => trans('admin::app.leads.index.datagrid.lead-type'),\n            'type' => 'string',\n            'searchable' => false,\n            'sortable' => true,\n            'filterable' => true,\n            'filterable_type' => 'dropdown',\n            'filterable_options' => $this->typeRepository->all(['name as label', 'id as value'])->toArray(),\n        ]);\n\n        $this->addColumn([\n            'index' => 'tag_name',\n            'label' => trans('admin::app.leads.index.datagrid.tag-name'),\n            'type' => 'string',\n            'searchable' => false,\n            'sortable' => true,\n            'filterable' => true,\n            'filterable_type' => 'searchable_dropdown',\n            'closure' => fn ($row) => $row->tag_name ?? '--',\n            'filterable_options' => [\n                'repository' => TagRepository::class,\n                'column' => [\n                    'label' => 'name',\n                    'value' => 'name',\n                ],\n            ],\n        ]);\n\n        $this->addColumn([\n            'index' => 'person_name',\n            'label' => trans('admin::app.leads.index.datagrid.contact-person'),\n            'type' => 'string',\n            'searchable' => false,\n            'sortable' => true,\n            'filterable' => true,\n            'filterable_type' => 'searchable_dropdown',\n            'filterable_options' => [\n                'repository' => PersonRepository::class,\n                'column' => [\n                    'label' => 'name',\n                    'value' => 'name',\n                ],\n            ],\n            'closure' => function ($row) {\n                $route = route('admin.contacts.persons.view', $row->person_id);\n\n                return \"<a class=\\\"text-brandColor transition-all hover:underline\\\" href='\".$route.\"'>\".$row->person_name.'</a>';\n            },\n        ]);\n\n        $this->addColumn([\n            'index' => 'stage',\n            'label' => trans('admin::app.leads.index.datagrid.stage'),\n            'type' => 'string',\n            'searchable' => false,\n            'sortable' => true,\n            'filterable' => true,\n            'filterable_type' => 'dropdown',\n            'filterable_options' => $this->pipeline->stages->pluck('name', 'id')\n                ->map(function ($name, $id) {\n                    return ['value' => $id, 'label' => $name];\n                })\n                ->values()\n                ->all(),\n        ]);\n\n        $this->addColumn([\n            'index' => 'rotten_lead',\n            'label' => trans('admin::app.leads.index.datagrid.rotten-lead'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => false,\n            'closure' => function ($row) {\n                if (! $row->rotten_lead) {\n                    return trans('admin::app.leads.index.datagrid.no');\n                }\n\n                if (in_array($row->stage_code, ['won', 'lost'])) {\n                    return trans('admin::app.leads.index.datagrid.no');\n                }\n\n                return trans('admin::app.leads.index.datagrid.yes');\n            },\n        ]);\n\n        $this->addColumn([\n            'index' => 'expected_close_date',\n            'label' => trans('admin::app.leads.index.datagrid.date-to'),\n            'type' => 'date',\n            'searchable' => false,\n            'sortable' => true,\n            'filterable' => true,\n            'filterable_type' => 'date_range',\n            'closure' => function ($row) {\n                if (! $row->expected_close_date) {\n                    return '--';\n                }\n\n                return $row->expected_close_date;\n            },\n        ]);\n\n        $this->addColumn([\n            'index' => 'created_at',\n            'label' => trans('admin::app.leads.index.datagrid.created-at'),\n            'type' => 'date',\n            'searchable' => false,\n            'sortable' => true,\n            'filterable' => true,\n            'filterable_type' => 'date_range',\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('leads.view')) {\n            $this->addAction([\n                'icon' => 'icon-eye',\n                'title' => trans('admin::app.leads.index.datagrid.view'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.leads.view', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('leads.delete')) {\n            $this->addAction([\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.leads.index.datagrid.delete'),\n                'method' => 'delete',\n                'url' => fn ($row) => route('admin.leads.delete', $row->id),\n            ]);\n        }\n    }\n\n    /**\n     * Prepare mass actions.\n     */\n    public function prepareMassActions(): void\n    {\n        $this->addMassAction([\n            'icon' => 'icon-delete',\n            'title' => trans('admin::app.leads.index.datagrid.mass-delete'),\n            'method' => 'POST',\n            'url' => route('admin.leads.mass_delete'),\n        ]);\n\n        $this->addMassAction([\n            'title' => trans('admin::app.leads.index.datagrid.mass-update'),\n            'url' => route('admin.leads.mass_update'),\n            'method' => 'POST',\n            'options' => $this->pipeline->stages->map(fn ($stage) => [\n                'label' => $stage->name,\n                'value' => $stage->id,\n            ])->toArray(),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Mail/EmailDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Mail;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\nuse Webkul\\Email\\Repositories\\EmailRepository;\nuse Webkul\\Tag\\Repositories\\TagRepository;\n\nclass EmailDataGrid extends DataGrid\n{\n    /**\n     * Default sort column of datagrid.\n     *\n     * @var ?string\n     */\n    protected $sortColumn = 'created_at';\n\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $queryBuilder = DB::table('emails')\n            ->select(\n                'emails.id',\n                'emails.name',\n                'emails.from',\n                'emails.subject',\n                'emails.reply',\n                'emails.is_read',\n                'emails.created_at',\n                'tags.name as tags',\n                DB::raw('COUNT(DISTINCT '.DB::getTablePrefix().'email_attachments.id) as attachments')\n            )\n            ->leftJoin('email_attachments', 'emails.id', '=', 'email_attachments.email_id')\n            ->leftJoin('email_tags', 'emails.id', '=', 'email_tags.email_id')\n            ->leftJoin('tags', 'tags.id', '=', 'email_tags.tag_id')\n            ->groupBy('emails.id')\n            ->where('folders', 'like', '%\"'.request('route').'\"%')\n            ->whereNull('parent_id');\n\n        $this->addFilter('id', 'emails.id');\n        $this->addFilter('name', 'emails.name');\n        $this->addFilter('tags', 'tags.name');\n        $this->addFilter('created_at', 'emails.created_at');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Prepare Columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'attachments',\n            'label' => trans('admin::app.mail.index.datagrid.attachments'),\n            'type' => 'string',\n            'searchable' => false,\n            'filterable' => false,\n            'sortable' => false,\n            'closure' => fn ($row) => $row->attachments ? '<i class=\"icon-attachment text-2xl\"></i>' : '',\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.mail.index.datagrid.from'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n            'closure' => function ($row) {\n                return $row->name\n                    ? trim($row->name, '\"')\n                    : trim($row->from, '\"');\n            },\n        ]);\n\n        $this->addColumn([\n            'index' => 'subject',\n            'label' => trans('admin::app.mail.index.datagrid.subject'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'reply',\n            'label' => trans('admin::app.mail.index.datagrid.content'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'tags',\n            'label' => trans('admin::app.mail.index.datagrid.tags'),\n            'type' => 'string',\n            'searchable' => false,\n            'sortable' => true,\n            'filterable' => true,\n            'filterable_type' => 'searchable_dropdown',\n            'closure' => function ($row) {\n                if ($email = app(EmailRepository::class)->find($row->id)) {\n                    return $email->tags;\n                }\n\n                return '--';\n            },\n            'filterable_options' => [\n                'repository' => TagRepository::class,\n                'column' => [\n                    'label' => 'name',\n                    'value' => 'name',\n                ],\n            ],\n        ]);\n\n        $this->addColumn([\n            'index' => 'created_at',\n            'label' => trans('admin::app.mail.index.datagrid.date'),\n            'type' => 'date',\n            'searchable' => true,\n            'filterable' => true,\n            'filterable_type' => 'date_range',\n            'sortable' => true,\n            'closure' => function ($row) {\n                return Carbon::parse($row->created_at)->isToday()\n                    ? Carbon::parse($row->created_at)->format('h:i A')\n                    : Carbon::parse($row->created_at)->format('M d');\n            },\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('mail.view')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => request('route') == 'draft'\n                    ? 'icon-edit'\n                    : 'icon-eye',\n                'title' => request('route') == 'draft'\n                    ? trans('admin::app.mail.index.datagrid.edit')\n                    : trans('admin::app.mail.index.datagrid.view'),\n                'method' => 'GET',\n                'params' => [\n                    'type' => request('route') == 'trash'\n                        ? 'delete'\n                        : 'trash',\n                ],\n                'url' => fn ($row) => route('admin.mail.view', [request('route'), $row->id]),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('mail.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.mail.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'params' => [\n                    'type' => request('route') == 'trash'\n                        ? 'delete'\n                        : 'trash',\n                ],\n                'url' => fn ($row) => route('admin.mail.delete', $row->id),\n            ]);\n        }\n    }\n\n    /**\n     * Prepare mass actions.\n     */\n    public function prepareMassActions(): void\n    {\n        if (request('route') == 'trash') {\n            $this->addMassAction([\n                'title' => trans('admin::app.mail.index.datagrid.move-to-inbox'),\n                'method' => 'POST',\n                'url' => route('admin.mail.mass_update', ['folders' => ['inbox']]),\n                'options' => [\n                    [\n                        'value' => 'trash',\n                        'label' => trans('admin::app.mail.index.datagrid.move-to-inbox'),\n                    ],\n                ],\n            ]);\n        }\n\n        $this->addMassAction([\n            'icon' => 'icon-delete',\n            'title' => request('route') == 'trash'\n                    ? trans('admin::app.mail.index.datagrid.delete')\n                    : trans('admin::app.mail.index.datagrid.move-to-trash'),\n            'method' => 'POST',\n            'url' => route('admin.mail.mass_delete', [\n                'type' => request('route') == 'trash'\n                    ? 'delete'\n                    : 'trash',\n            ]),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Product/ProductDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Product;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\nuse Webkul\\Tag\\Repositories\\TagRepository;\n\nclass ProductDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $tablePrefix = DB::getTablePrefix();\n\n        $queryBuilder = DB::table('products')\n            ->leftJoin('product_inventories', 'products.id', '=', 'product_inventories.product_id')\n            ->leftJoin('product_tags', 'products.id', '=', 'product_tags.product_id')\n            ->leftJoin('tags', 'tags.id', '=', 'product_tags.tag_id')\n            ->select(\n                'products.id',\n                'products.sku',\n                'products.name',\n                'products.price',\n                'tags.name as tag_name',\n            )\n            ->addSelect(DB::raw('SUM('.$tablePrefix.'product_inventories.in_stock) as total_in_stock'))\n            ->addSelect(DB::raw('SUM('.$tablePrefix.'product_inventories.allocated) as total_allocated'))\n            ->addSelect(DB::raw('SUM('.$tablePrefix.'product_inventories.in_stock - '.$tablePrefix.'product_inventories.allocated) as total_on_hand'))\n            ->groupBy('products.id');\n\n        if (request()->route('id')) {\n            $queryBuilder->where('product_inventories.warehouse_id', request()->route('id'));\n        }\n\n        $this->addFilter('id', 'products.id');\n        $this->addFilter('sku', 'products.sku');\n        $this->addFilter('name', 'products.name');\n        $this->addFilter('price', 'products.price');\n        $this->addFilter('total_in_stock', DB::raw('SUM('.$tablePrefix.'product_inventories.in_stock'));\n        $this->addFilter('total_allocated', DB::raw('SUM('.$tablePrefix.'product_inventories.allocated'));\n        $this->addFilter('total_on_hand', DB::raw('SUM('.$tablePrefix.'product_inventories.in_stock - '.$tablePrefix.'product_inventories.allocated'));\n        $this->addFilter('tag_name', 'tags.name');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Add columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'sku',\n            'label' => trans('admin::app.products.index.datagrid.sku'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.products.index.datagrid.name'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'price',\n            'label' => trans('admin::app.products.index.datagrid.price'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n            'closure' => fn ($row) => round($row->price, 2),\n        ]);\n\n        $this->addColumn([\n            'index' => 'total_in_stock',\n            'label' => trans('admin::app.products.index.datagrid.in-stock'),\n            'type' => 'string',\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'total_allocated',\n            'label' => trans('admin::app.products.index.datagrid.allocated'),\n            'type' => 'string',\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'total_on_hand',\n            'label' => trans('admin::app.products.index.datagrid.on-hand'),\n            'type' => 'string',\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'tag_name',\n            'label' => trans('admin::app.products.index.datagrid.tag-name'),\n            'type' => 'string',\n            'searchable' => false,\n            'sortable' => true,\n            'filterable' => true,\n            'filterable_type' => 'searchable_dropdown',\n            'closure' => fn ($row) => $row->tag_name ?? '--',\n            'filterable_options' => [\n                'repository' => TagRepository::class,\n                'column' => [\n                    'label' => 'name',\n                    'value' => 'name',\n                ],\n            ],\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('products.view')) {\n            $this->addAction([\n                'index' => 'view',\n                'icon' => 'icon-eye',\n                'title' => trans('admin::app.products.index.datagrid.view'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.products.view', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('products.edit')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.products.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.products.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('products.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.products.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.products.delete', $row->id),\n            ]);\n        }\n    }\n\n    /**\n     * Prepare mass actions.\n     */\n    public function prepareMassActions(): void\n    {\n        $this->addMassAction([\n            'icon' => 'icon-delete',\n            'title' => trans('admin::app.products.index.datagrid.delete'),\n            'method' => 'POST',\n            'url' => route('admin.products.mass_delete'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Quote/QuoteDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Quote;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\nuse Webkul\\DataGrid\\DataGrid;\nuse Webkul\\User\\Repositories\\UserRepository;\n\nclass QuoteDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $tablePrefix = DB::getTablePrefix();\n\n        $queryBuilder = DB::table('quotes')\n            ->addSelect(\n                'quotes.id',\n                'quotes.subject',\n                'quotes.expired_at',\n                'quotes.sub_total',\n                'quotes.discount_amount',\n                'quotes.tax_amount',\n                'quotes.adjustment_amount',\n                'quotes.grand_total',\n                'quotes.created_at',\n                'users.id as user_id',\n                'users.name as sales_person',\n                'persons.id as person_id',\n                'persons.name as person_name',\n                'quotes.expired_at as expired_quotes'\n            )\n            ->leftJoin('users', 'quotes.user_id', '=', 'users.id')\n            ->leftJoin('persons', 'quotes.person_id', '=', 'persons.id');\n\n        if ($userIds = bouncer()->getAuthorizedUserIds()) {\n            $queryBuilder->whereIn('quotes.user_id', $userIds);\n        }\n\n        $this->addFilter('id', 'quotes.id');\n        $this->addFilter('user', 'quotes.user_id');\n        $this->addFilter('sales_person', 'users.name');\n        $this->addFilter('person_name', 'persons.name');\n        $this->addFilter('expired_at', 'quotes.expired_at');\n        $this->addFilter('created_at', 'quotes.created_at');\n\n        if (request()->input('expired_quotes.in') == 1) {\n            $this->addFilter('expired_quotes', DB::raw('DATEDIFF(NOW(), '.$tablePrefix.'quotes.expired_at) >= '.$tablePrefix.'NOW()'));\n        } else {\n            $this->addFilter('expired_quotes', DB::raw('DATEDIFF(NOW(), '.$tablePrefix.'quotes.expired_at) < '.$tablePrefix.'NOW()'));\n        }\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Prepare columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'subject',\n            'label' => trans('admin::app.quotes.index.datagrid.subject'),\n            'type' => 'string',\n            'filterable' => true,\n            'searchable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'sales_person',\n            'label' => trans('admin::app.quotes.index.datagrid.sales-person'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n            'filterable_type' => 'searchable_dropdown',\n            'filterable_options' => [\n                'repository' => UserRepository::class,\n                'column' => [\n                    'label' => 'name',\n                    'value' => 'name',\n                ],\n            ],\n        ]);\n\n        $this->addColumn([\n            'index' => 'person_name',\n            'label' => trans('admin::app.quotes.index.datagrid.person'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n            'filterable_type' => 'searchable_dropdown',\n            'filterable_options' => [\n                'repository' => PersonRepository::class,\n                'column' => [\n                    'label' => 'name',\n                    'value' => 'name',\n                ],\n            ],\n            'closure' => function ($row) {\n                $route = route('admin.contacts.persons.view', $row->person_id);\n\n                return \"<a class=\\\"text-brandColor transition-all hover:underline\\\" href='\".$route.\"'>\".$row->person_name.'</a>';\n            },\n        ]);\n\n        $this->addColumn([\n            'index' => 'sub_total',\n            'label' => trans('admin::app.quotes.index.datagrid.subtotal'),\n            'type' => 'string',\n            'sortable' => true,\n            'filterable' => true,\n            'closure' => fn ($row) => core()->formatBasePrice($row->sub_total, 2),\n        ]);\n\n        $this->addColumn([\n            'index' => 'discount_amount',\n            'label' => trans('admin::app.quotes.index.datagrid.discount'),\n            'type' => 'string',\n            'sortable' => true,\n            'filterable' => true,\n            'closure' => fn ($row) => core()->formatBasePrice($row->discount_amount, 2),\n        ]);\n\n        $this->addColumn([\n            'index' => 'tax_amount',\n            'label' => trans('admin::app.quotes.index.datagrid.tax'),\n            'type' => 'string',\n            'filterable' => true,\n            'sortable' => true,\n            'closure' => fn ($row) => core()->formatBasePrice($row->tax_amount, 2),\n        ]);\n\n        $this->addColumn([\n            'index' => 'adjustment_amount',\n            'label' => trans('admin::app.quotes.index.datagrid.adjustment'),\n            'type' => 'string',\n            'sortable' => true,\n            'filterable' => false,\n            'closure' => fn ($row) => core()->formatBasePrice($row->adjustment_amount, 2),\n        ]);\n\n        $this->addColumn([\n            'index' => 'grand_total',\n            'label' => trans('admin::app.quotes.index.datagrid.grand-total'),\n            'type' => 'string',\n            'sortable' => true,\n            'filterable' => true,\n            'closure' => fn ($row) => core()->formatBasePrice($row->grand_total, 2),\n        ]);\n\n        $this->addColumn([\n            'index' => 'expired_at',\n            'label' => trans('admin::app.quotes.index.datagrid.expired-at'),\n            'type' => 'date',\n            'searchable' => false,\n            'sortable' => true,\n            'filterable' => true,\n            'closure' => fn ($row) => core()->formatDate($row->expired_at, 'd M Y'),\n        ]);\n\n        $this->addColumn([\n            'index' => 'created_at',\n            'label' => trans('admin::app.quotes.index.datagrid.created-at'),\n            'type' => 'date',\n            'searchable' => false,\n            'sortable' => true,\n            'filterable' => true,\n            'closure' => fn ($row) => core()->formatDate($row->created_at),\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('quotes.edit')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.quotes.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.quotes.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('quotes.print')) {\n            $this->addAction([\n                'index' => 'print',\n                'icon' => 'icon-print',\n                'title' => trans('admin::app.quotes.index.datagrid.print'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.quotes.print', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('quotes.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.quotes.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.quotes.delete', $row->id),\n            ]);\n        }\n    }\n\n    /**\n     * Prepare mass actions.\n     */\n    public function prepareMassActions(): void\n    {\n        $this->addMassAction([\n            'icon' => 'icon-delete',\n            'title' => trans('admin::app.quotes.index.datagrid.delete'),\n            'method' => 'POST',\n            'url' => route('admin.quotes.mass_delete'),\n        ]);\n\n        $this->addMassAction([\n            'icon' => 'icon-delete',\n            'title' => trans('admin::app.quotes.index.datagrid.delete'),\n            'method' => 'POST',\n            'url' => route('admin.quotes.mass_delete'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Settings/AttributeDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Settings;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass AttributeDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $queryBuilder = DB::table('attributes')\n            ->select(\n                'attributes.id',\n                'attributes.code',\n                'attributes.name',\n                'attributes.type',\n                'attributes.entity_type',\n                'attributes.is_user_defined as attribute_type'\n            )\n            ->where('entity_type', '<>', 'locations');\n\n        $this->addFilter('id', 'attributes.id');\n        $this->addFilter('type', 'attributes.type');\n        $this->addFilter('attribute_type', 'attributes.is_user_defined');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Prepare columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.attributes.index.datagrid.id'),\n            'type' => 'string',\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'code',\n            'label' => trans('admin::app.settings.attributes.index.datagrid.code'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.settings.attributes.index.datagrid.name'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'entity_type',\n            'label' => trans('admin::app.settings.attributes.index.datagrid.entity-type'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => false,\n            'filterable' => true,\n            'filterable_type' => 'dropdown',\n            'filterable_options' => app(AttributeRepository::class)\n                ->select('entity_type as label', 'entity_type as value')\n                ->distinct()\n                ->get()\n                ->map(function ($item) {\n                    $item->label = trans('admin::app.settings.attributes.index.datagrid.entity-types.'.$item->label);\n\n                    return $item;\n                })\n                ->toArray(),\n            'closure' => fn ($row) => ucfirst($row->entity_type),\n        ]);\n\n        $this->addColumn([\n            'index' => 'type',\n            'label' => trans('admin::app.settings.attributes.index.datagrid.type'),\n            'type' => 'string',\n            'sortable' => true,\n            'filterable' => true,\n            'filterable_type' => 'dropdown',\n            'filterable_options' => app(AttributeRepository::class)\n                ->select('type as label', 'type as value')\n                ->distinct()\n                ->get()\n                ->map(function ($item) {\n                    $item->label = trans('admin::app.settings.attributes.index.datagrid.types.'.$item->label);\n\n                    return $item;\n                })\n                ->toArray(),\n        ]);\n\n        $this->addColumn([\n            'index' => 'attribute_type',\n            'label' => trans('admin::app.settings.attributes.index.datagrid.is-default'),\n            'type' => 'boolean',\n            'searchable' => true,\n            'filterable' => false,\n            'sortable' => true,\n            'closure' => fn ($value) => trans('admin::app.settings.attributes.index.datagrid.'.($value->attribute_type ? 'no' : 'yes')),\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('settings.automation.attributes.edit')) {\n            $this->addAction([\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.attributes.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.settings.attributes.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.automation.attributes.delete')) {\n            $this->addAction([\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.attributes.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.settings.attributes.delete', $row->id),\n            ]);\n        }\n    }\n\n    /**\n     * Prepare mass actions.\n     */\n    public function prepareMassActions(): void\n    {\n        $this->addMassAction([\n            'icon' => 'icon-delete',\n            'title' => trans('admin::app.settings.attributes.index.datagrid.delete'),\n            'method' => 'POST',\n            'url' => route('admin.settings.attributes.mass_delete'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Settings/DataTransfer/ImportDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Settings\\DataTransfer;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass ImportDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        return DB::table('imports')\n            ->select(\n                'id',\n                'state',\n                'file_path',\n                'error_file_path',\n                'started_at',\n                'completed_at',\n                'type',\n                'summary',\n            );\n    }\n\n    /**\n     * Prepare Columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.id'),\n            'type' => 'integer',\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'type',\n            'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.type'),\n            'type' => 'string',\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'state',\n            'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.state'),\n            'type' => 'string',\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'file_path',\n            'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.uploaded-file'),\n            'type' => 'string',\n            'closure' => function ($row) {\n                return '<a href=\"'.route('admin.settings.data_transfer.imports.download', $row->id).'\" class=\"cursor-pointer text-blue-600 hover:underline\">'.$row->file_path.'<a>';\n            },\n        ]);\n\n        $this->addColumn([\n            'index' => 'error_file_path',\n            'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.error-file'),\n            'type' => 'string',\n            'closure' => function ($row) {\n                if (empty($row->error_file_path)) {\n                    return '';\n                }\n\n                return '<a href=\"'.route('admin.settings.data_transfer.imports.download_error_report', $row->id).'\" class=\"cursor-pointer text-blue-600 hover:underline\">'.$row->error_file_path.'<a>';\n            },\n        ]);\n\n        $this->addColumn([\n            'index' => 'started_at',\n            'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.started-at'),\n            'type' => 'date',\n            'filterable' => true,\n            'filterable_type' => 'date_range',\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'completed_at',\n            'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.completed-at'),\n            'type' => 'date',\n            'filterable' => true,\n            'filterable_type' => 'date_range',\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'summary',\n            'label' => trans('admin::app.settings.data-transfer.imports.index.datagrid.summary'),\n            'type' => 'string',\n            'closure' => function ($row) {\n                if (empty($row->summary)) {\n                    return '';\n                }\n\n                $summary = json_decode($row->summary, true);\n\n                $stats = [];\n\n                foreach ($summary as $type => $value) {\n                    $stats[] = trans('admin::app.settings.data-transfer.imports.index.datagrid.'.$type).': '.$summary[$type];\n                }\n\n                return implode(', ', $stats);\n            },\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('settings.automation.data_transfer.imports.import')) {\n            $this->addAction([\n                'index' => 'import',\n                'icon' => 'icon-import',\n                'title' => trans('admin::app.settings.data-transfer.imports.index.datagrid.import'),\n                'method' => 'GET',\n                'url' => function ($row) {\n                    return route('admin.settings.data_transfer.imports.import', $row->id);\n                },\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.automation.data_transfer.imports.edit')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.data-transfer.imports.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => function ($row) {\n                    return route('admin.settings.data_transfer.imports.edit', $row->id);\n                },\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.automation.data_transfer.imports.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.data-transfer.imports.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => function ($row) {\n                    return route('admin.settings.data_transfer.imports.delete', $row->id);\n                },\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Settings/EmailTemplateDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Settings;\n\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass EmailTemplateDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder()\n    {\n        $queryBuilder = DB::table('email_templates')\n            ->addSelect(\n                'email_templates.id',\n                'email_templates.name',\n                'email_templates.subject',\n            );\n\n        $this->addFilter('id', 'email_templates.id');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Add columns.\n     *\n     * @return void\n     */\n    public function prepareColumns()\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.email-template.index.datagrid.id'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.settings.email-template.index.datagrid.name'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'subject',\n            'label' => trans('admin::app.settings.email-template.index.datagrid.subject'),\n            'type' => 'string',\n            'sortable' => true,\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     *\n     * @return void\n     */\n    public function prepareActions()\n    {\n        if (bouncer()->hasPermission('settings.automation.email_templates.edit')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.email-template.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.settings.email_templates.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.automation.email_templates.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.email-template.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.settings.email_templates.delete', $row->id),\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Settings/GroupDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Settings;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass GroupDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $queryBuilder = DB::table('groups')\n            ->addSelect(\n                'groups.id',\n                'groups.name',\n                'groups.description'\n            );\n\n        $this->addFilter('id', 'groups.id');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Prepare columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.groups.index.datagrid.id'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'type' => 'string',\n            'label' => trans('admin::app.settings.groups.index.datagrid.name'),\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'description',\n            'label' => trans('admin::app.settings.groups.index.datagrid.description'),\n            'type' => 'string',\n            'sortable' => false,\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('settings.user.groups.edit')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.groups.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.settings.groups.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.user.groups.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.groups.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.settings.groups.delete', $row->id),\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Settings/Marketing/CampaignDatagrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Settings\\Marketing;\n\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass CampaignDatagrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder()\n    {\n        $queryBuilder = DB::table('marketing_campaigns')\n            ->addSelect(\n                'marketing_campaigns.id',\n                'marketing_campaigns.name',\n                'marketing_campaigns.subject',\n                'marketing_campaigns.status',\n            );\n\n        $this->addFilter('id', 'marketing_campaigns.id');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Add columns.\n     *\n     * @return void\n     */\n    public function prepareColumns()\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.marketing.campaigns.index.datagrid.id'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.settings.marketing.campaigns.index.datagrid.name'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'subject',\n            'label' => trans('admin::app.settings.marketing.campaigns.index.datagrid.subject'),\n            'type' => 'string',\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'status',\n            'label' => trans('admin::app.settings.marketing.campaigns.index.datagrid.status'),\n            'type' => 'string',\n            'sortable' => true,\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     *\n     * @return void\n     */\n    public function prepareActions()\n    {\n        if (bouncer()->hasPermission('settings.automation.campaigns.edit')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.marketing.campaigns.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.settings.marketing.campaigns.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.automation.campaigns.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.marketing.campaigns.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.settings.marketing.campaigns.delete', $row->id),\n            ]);\n        }\n    }\n\n    /**\n     * Prepare mass actions.\n     */\n    public function prepareMassActions(): void\n    {\n        if (bouncer()->hasPermission('settings.automation.campaigns.mass_delete')) {\n            $this->addMassAction([\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.marketing.campaigns.index.datagrid.delete'),\n                'method' => 'POST',\n                'url' => route('admin.settings.marketing.campaigns.mass_delete'),\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Settings/Marketing/EventDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Settings\\Marketing;\n\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass EventDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder()\n    {\n        $queryBuilder = DB::table('marketing_events')\n            ->addSelect(\n                'marketing_events.id',\n                'marketing_events.name',\n                'marketing_events.description',\n                'marketing_events.date',\n            );\n\n        $this->addFilter('id', 'marketing_events.id');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Add columns.\n     *\n     * @return void\n     */\n    public function prepareColumns()\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.marketing.events.index.datagrid.id'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.settings.marketing.events.index.datagrid.name'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'description',\n            'label' => trans('admin::app.settings.marketing.events.index.datagrid.description'),\n            'type' => 'string',\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'date',\n            'label' => trans('admin::app.settings.marketing.events.index.datagrid.date'),\n            'type' => 'string',\n            'sortable' => true,\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     *\n     * @return void\n     */\n    public function prepareActions()\n    {\n        if (bouncer()->hasPermission('settings.automation.events.edit')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.marketing.events.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.settings.marketing.events.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.automation.events.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.marketing.events.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.settings.marketing.events.delete', $row->id),\n            ]);\n        }\n    }\n\n    /**\n     * Prepare mass actions.\n     */\n    public function prepareMassActions(): void\n    {\n        if (bouncer()->hasPermission('settings.automation.events.delete')) {\n            $this->addMassAction([\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.marketing.events.index.datagrid.delete'),\n                'method' => 'POST',\n                'url' => route('admin.settings.marketing.events.mass_delete'),\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Settings/PipelineDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Settings;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass PipelineDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $queryBuilder = DB::table('lead_pipelines')\n            ->addSelect(\n                'lead_pipelines.id',\n                'lead_pipelines.name',\n                'lead_pipelines.rotten_days',\n                'lead_pipelines.is_default',\n            );\n\n        $this->addFilter('id', 'lead_pipelines.id');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Prepare columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.pipelines.index.datagrid.id'),\n            'type' => 'string',\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.settings.pipelines.index.datagrid.name'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'rotten_days',\n            'label' => trans('admin::app.settings.pipelines.index.datagrid.rotten-days'),\n            'type' => 'string',\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'is_default',\n            'label' => trans('admin::app.settings.pipelines.index.datagrid.is-default'),\n            'type' => 'boolean',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n            'closure' => fn ($value) => trans('admin::app.settings.pipelines.index.datagrid.'.($value->is_default ? 'yes' : 'no')),\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('settings.lead.pipelines.edit')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.pipelines.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.settings.pipelines.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.lead.pipelines.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.pipelines.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.settings.pipelines.delete', $row->id),\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Settings/RoleDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Settings;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass RoleDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $queryBuilder = DB::table('roles')\n            ->addSelect(\n                'roles.id',\n                'roles.name',\n                'roles.description',\n                'roles.permission_type'\n            );\n\n        $this->addFilter('id', 'roles.id');\n        $this->addFilter('name', 'roles.name');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Prepare Columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.roles.index.datagrid.id'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.settings.roles.index.datagrid.name'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'description',\n            'label' => trans('admin::app.settings.roles.index.datagrid.description'),\n            'type' => 'string',\n            'searchable' => true,\n            'sortable' => false,\n        ]);\n\n        $this->addColumn([\n            'index' => 'permission_type',\n            'label' => trans('admin::app.settings.roles.index.datagrid.permission-type'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'filterable_type' => 'dropdown',\n            'filterable_options' => [\n                [\n                    'label' => trans('admin::app.settings.roles.index.datagrid.custom'),\n                    'value' => 'custom',\n                ],\n                [\n                    'label' => trans('admin::app.settings.roles.index.datagrid.all'),\n                    'value' => 'all',\n                ],\n            ],\n            'sortable' => true,\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('settings.user.roles.edit')) {\n            $this->addAction([\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.roles.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.settings.roles.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.user.roles.delete')) {\n            $this->addAction([\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.roles.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.settings.roles.delete', $row->id),\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Settings/SourceDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Settings;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass SourceDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $queryBuilder = DB::table('lead_sources')\n            ->addSelect(\n                'lead_sources.id',\n                'lead_sources.name'\n            );\n\n        $this->addFilter('id', 'lead_sources.id');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Prepare Columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.sources.index.datagrid.id'),\n            'type' => 'string',\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.settings.sources.index.datagrid.name'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('settings.lead.sources.edit')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.sources.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.settings.sources.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.lead.sources.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.sources.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.settings.sources.delete', $row->id),\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Settings/TagDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Settings;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass TagDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $queryBuilder = DB::table('tags')\n            ->addSelect(\n                'tags.id',\n                'tags.name',\n                'tags.color',\n                'tags.created_at',\n                'users.name as user_name',\n            )\n            ->leftJoin('users', 'tags.user_id', '=', 'users.id');\n\n        if ($userIds = bouncer()->getAuthorizedUserIds()) {\n            $queryBuilder->whereIn('tags.user_id', $userIds);\n        }\n\n        $this->addFilter('id', 'tags.id');\n        $this->addFilter('name', 'tags.name');\n        $this->addFilter('created_at', 'tags.created_at');\n        $this->addFilter('user_name', 'users.id');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Prepare Columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.tags.index.datagrid.id'),\n            'type' => 'string',\n            'searchable' => true,\n            'sortable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.settings.tags.index.datagrid.name'),\n            'type' => 'string',\n            'searchable' => true,\n            'sortable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'user_name',\n            'label' => trans('admin::app.settings.tags.index.datagrid.users'),\n            'type' => 'string',\n            'searchable' => true,\n            'sortable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'created_at',\n            'label' => trans('admin::app.settings.tags.index.datagrid.created-at'),\n            'type' => 'date',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n            'filterable_type' => 'date_range',\n            'closure' => fn ($row) => core()->formatDate($row->created_at),\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('settings.other_settings.tags.edit')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.tags.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => function ($row) {\n                    return route('admin.settings.tags.edit', $row->id);\n                },\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.other_settings.tags.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.tags.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => function ($row) {\n                    return route('admin.settings.tags.delete', $row->id);\n                },\n            ]);\n        }\n    }\n\n    /**\n     * Prepare mass actions.\n     */\n    public function prepareMassActions(): void\n    {\n        $this->addMassAction([\n            'icon' => 'icon-delete',\n            'title' => trans('admin::app.settings.tags.index.datagrid.delete'),\n            'method' => 'POST',\n            'url' => route('admin.settings.tags.mass_delete'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Settings/TypeDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Settings;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass TypeDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $queryBuilder = DB::table('lead_types')\n            ->addSelect(\n                'lead_types.id',\n                'lead_types.name'\n            );\n\n        $this->addFilter('id', 'lead_types.id');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Prepare Columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.types.index.datagrid.id'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.settings.types.index.datagrid.name'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n    }\n\n    /**\n     * Prepare Actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('settings.lead.types.edit')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.roles.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.settings.types.update', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.lead.types.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.roles.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.settings.types.delete', $row->id),\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Settings/UserDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Settings;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass UserDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $queryBuilder = DB::table('users')\n            ->distinct()\n            ->addSelect(\n                'id',\n                'name',\n                'email',\n                'image',\n                'status',\n                'created_at'\n            )\n            ->leftJoin('user_groups', 'id', '=', 'user_groups.user_id');\n\n        if ($userIds = bouncer()->getAuthorizedUserIds()) {\n            $queryBuilder->whereIn('id', $userIds);\n        }\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Add columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.users.index.datagrid.id'),\n            'type' => 'string',\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.settings.users.index.datagrid.name'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n            'closure' => function ($row) {\n                return [\n                    'image' => $row->image ? Storage::url($row->image) : null,\n                    'name' => $row->name,\n                ];\n            },\n        ]);\n\n        $this->addColumn([\n            'index' => 'email',\n            'label' => trans('admin::app.settings.users.index.datagrid.email'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'status',\n            'label' => trans('admin::app.settings.users.index.datagrid.status'),\n            'type' => 'boolean',\n            'filterable' => true,\n            'sortable' => true,\n            'searchable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'created_at',\n            'label' => trans('admin::app.settings.users.index.datagrid.created-at'),\n            'type' => 'date',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable_type' => 'date_range',\n            'filterable' => true,\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('settings.user.users.edit')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.users.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.settings.users.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.user.users.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.users.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.settings.users.delete', $row->id),\n            ]);\n        }\n    }\n\n    /**\n     * Prepare mass actions.\n     */\n    public function prepareMassActions(): void\n    {\n        $this->addMassAction([\n            'icon' => 'icon-delete',\n            'title' => trans('admin::app.settings.users.index.datagrid.delete'),\n            'method' => 'POST',\n            'url' => route('admin.settings.users.mass_delete'),\n        ]);\n\n        $this->addMassAction([\n            'title' => trans('admin::app.settings.users.index.datagrid.update-status'),\n            'method' => 'POST',\n            'url' => route('admin.settings.users.mass_update'),\n            'options' => [\n                [\n                    'label' => trans('admin::app.settings.users.index.datagrid.active'),\n                    'value' => 1,\n                ],\n                [\n                    'label' => trans('admin::app.settings.users.index.datagrid.inactive'),\n                    'value' => 0,\n                ],\n            ],\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Settings/WarehouseDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Settings;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass WarehouseDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     *\n     * @return void\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $queryBuilder = DB::table('warehouses')\n            ->leftJoin('product_inventories', 'warehouses.id', '=', 'product_inventories.warehouse_id')\n            ->select(\n                'warehouses.id',\n                'warehouses.name',\n                'warehouses.contact_name',\n                'warehouses.contact_emails',\n                'warehouses.contact_numbers',\n                'warehouses.created_at',\n            )\n            ->addSelect(DB::raw('count(DISTINCT '.DB::getTablePrefix().'product_inventories.product_id) as products'))\n            ->groupBy('warehouses.id');\n\n        $this->addFilter('id', 'warehouses.id');\n        $this->addFilter('created_at', 'warehouses.created_at');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Add columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.warehouses.index.datagrid.id'),\n            'type' => 'string',\n            'sortable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.settings.warehouses.index.datagrid.name'),\n            'type' => 'string',\n            'sortable' => true,\n            'filterable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'contact_name',\n            'label' => trans('admin::app.settings.warehouses.index.datagrid.contact-name'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'contact_emails',\n            'label' => trans('admin::app.settings.warehouses.index.datagrid.contact-emails'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n            'closure' => function ($row) {\n                $emails = json_decode($row->contact_emails, true);\n\n                if ($emails) {\n                    return collect($emails)->pluck('value')->join(', ');\n                }\n            },\n        ]);\n\n        $this->addColumn([\n            'index' => 'contact_numbers',\n            'label' => trans('admin::app.settings.warehouses.index.datagrid.contact-numbers'),\n            'type' => 'string',\n            'sortable' => false,\n            'closure' => function ($row) {\n                $numbers = json_decode($row->contact_numbers, true);\n\n                if ($numbers) {\n                    return collect($numbers)->pluck('value')->join(', ');\n                }\n            },\n        ]);\n\n        $this->addColumn([\n            'index' => 'products',\n            'label' => trans('admin::app.settings.warehouses.index.datagrid.products'),\n            'type' => 'string',\n            'sortable' => true,\n            'filterable' => false,\n        ]);\n\n        $this->addColumn([\n            'index' => 'created_at',\n            'label' => trans('admin::app.settings.warehouses.index.datagrid.created-at'),\n            'type' => 'date',\n            'searchable' => true,\n            'filterable' => true,\n            'filterable_type' => 'date_range',\n            'sortable' => true,\n            'closure' => function ($row) {\n                return core()->formatDate($row->created_at);\n            },\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     *\n     * @return void\n     */\n    public function prepareActions()\n    {\n        if (bouncer()->hasPermission('settings.inventory.warehouse')) {\n            $this->addAction([\n                'icon' => 'icon-eye',\n                'title' => trans('admin::app.settings.warehouses.index.datagrid.view'),\n                'method' => 'GET',\n                'url' => function ($row) {\n                    return route('admin.settings.warehouses.view', $row->id);\n                },\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.inventory.warehouse.edit')) {\n            $this->addAction([\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.warehouses.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => function ($row) {\n                    return route('admin.settings.warehouses.edit', $row->id);\n                },\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.inventory.warehouse.delete')) {\n            $this->addAction([\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.warehouses.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => function ($row) {\n                    return route('admin.settings.warehouses.delete', $row->id);\n                },\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Settings/WebhookDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Settings;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass WebhookDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $queryBuilder = DB::table('webhooks')\n            ->addSelect(\n                'webhooks.id',\n                'webhooks.name',\n                'webhooks.entity_type',\n                'webhooks.end_point',\n            );\n\n        $this->addFilter('id', 'webhooks.id');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Prepare Columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.webhooks.index.datagrid.id'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.settings.webhooks.index.datagrid.name'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'entity_type',\n            'label' => trans('admin::app.settings.webhooks.index.datagrid.entity-type'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'end_point',\n            'label' => trans('admin::app.settings.webhooks.index.datagrid.end-point'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('settings.automation.webhooks.edit')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.webhooks.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.settings.webhooks.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.automation.webhooks.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.webhooks.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.settings.webhooks.delete', $row->id),\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/DataGrids/Settings/WorkflowDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\DataGrids\\Settings;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass WorkflowDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $queryBuilder = DB::table('workflows')\n            ->addSelect(\n                'workflows.id',\n                'workflows.name'\n            );\n\n        $this->addFilter('id', 'workflows.id');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Prepare Columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.workflows.index.datagrid.id'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'name',\n            'label' => trans('admin::app.settings.workflows.index.datagrid.name'),\n            'type' => 'string',\n            'searchable' => true,\n            'filterable' => true,\n            'sortable' => true,\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('settings.automation.workflows.edit')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.workflows.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.settings.workflows.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.automation.workflows.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.workflows.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.settings.workflows.delete', $row->id),\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Database/Migrations/2021_06_07_162808_add_lead_view_permission_column_in_users_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::table('users', function (Blueprint $table) {\n            $table->string('view_permission')->after('status')->default('global')->nullable();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::table('users', function (Blueprint $table) {\n            $table->dropColumn('view_permission');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Database/Migrations/2021_10_02_170105_insert_expected_closed_date_column_in_attributes_table.php",
    "content": "<?php\n\nuse Carbon\\Carbon;\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Support\\Facades\\DB;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        DB::table('attributes')->insert([\n            [\n                'id' => '7',\n                'code' => 'expected_close_date',\n                'name' => 'Expected Close Date',\n                'type' => 'date',\n                'entity_type' => 'leads',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '8',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => Carbon::now(),\n                'updated_at' => Carbon::now(),\n            ],\n        ]);\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down() {}\n};\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Exceptions/Handler.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Exceptions;\n\nuse Illuminate\\Auth\\AuthenticationException;\nuse Illuminate\\Container\\Container;\nuse Illuminate\\Database\\Eloquent\\ModelNotFoundException;\nuse Illuminate\\Foundation\\Exceptions\\Handler as ExceptionHandler;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Validation\\ValidationException;\nuse PDOException;\nuse Symfony\\Component\\HttpKernel\\Exception\\HttpException;\nuse Throwable;\n\nclass Handler extends ExceptionHandler\n{\n    /**\n     * Json error messages.\n     *\n     * @var array\n     */\n    protected $jsonErrorMessages = [];\n\n    /**\n     * Create handler instance.\n     *\n     * @return void\n     */\n    public function __construct(Container $container)\n    {\n        parent::__construct($container);\n\n        $this->jsonErrorMessages = [\n            '404' => trans('admin::app.errors.404.title'),\n            '403' => trans('admin::app.errors.403.title'),\n            '401' => trans('admin::app.errors.401.title'),\n            '500' => trans('admin::app.errors.500.title'),\n        ];\n    }\n\n    /**\n     * Render an exception into an HTTP response.\n     *\n     * @param  Request  $request\n     * @return Response\n     */\n    public function render($request, Throwable $exception)\n    {\n        if (! config('app.debug')) {\n            return $this->renderCustomResponse($exception);\n        }\n\n        return parent::render($request, $exception);\n    }\n\n    /**\n     * Convert an authentication exception into a response.\n     *\n     * @param  Request  $request\n     * @return Response\n     */\n    protected function unauthenticated($request, AuthenticationException $exception)\n    {\n        if ($request->expectsJson()) {\n            return response()->json(['message' => $this->jsonErrorMessages[401]], 401);\n        }\n\n        return redirect()->guest(route('customer.session.index'));\n    }\n\n    /**\n     * Render custom HTTP response.\n     *\n     * @return Response|null\n     */\n    private function renderCustomResponse(Throwable $exception)\n    {\n        if ($exception instanceof HttpException) {\n            $statusCode = in_array($exception->getStatusCode(), [401, 403, 404, 503])\n                ? $exception->getStatusCode()\n                : 500;\n\n            return $this->response($statusCode);\n        }\n\n        if ($exception instanceof ValidationException) {\n            return parent::render(request(), $exception);\n        }\n\n        if ($exception instanceof ModelNotFoundException) {\n            return $this->response(404);\n        } elseif ($exception instanceof PDOException || $exception instanceof \\ParseError) {\n            return $this->response(500);\n        } else {\n            return $this->response(500);\n        }\n    }\n\n    /**\n     * Return custom response.\n     *\n     * @param  string  $path\n     * @param  string  $errorCode\n     * @return mixed\n     */\n    private function response($errorCode)\n    {\n        if (request()->expectsJson()) {\n            return response()->json([\n                'message' => isset($this->jsonErrorMessages[$errorCode])\n                    ? $this->jsonErrorMessages[$errorCode]\n                    : trans('admin::app.common.something-went-wrong'),\n            ], $errorCode);\n        }\n\n        return response()->view('admin::errors.index', compact('errorCode'));\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Facades/Bouncer.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Facades;\n\nuse Illuminate\\Support\\Facades\\Facade;\n\nclass Bouncer extends Facade\n{\n    /**\n     * Get the registered name of the component.\n     *\n     * @return string\n     */\n    protected static function getFacadeAccessor()\n    {\n        return 'bouncer';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Helpers/Dashboard.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Helpers;\n\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Support\\Collection;\nuse Webkul\\Admin\\Helpers\\Reporting\\Activity;\nuse Webkul\\Admin\\Helpers\\Reporting\\Lead;\nuse Webkul\\Admin\\Helpers\\Reporting\\Organization;\nuse Webkul\\Admin\\Helpers\\Reporting\\Person;\nuse Webkul\\Admin\\Helpers\\Reporting\\Product;\nuse Webkul\\Admin\\Helpers\\Reporting\\Quote;\n\nclass Dashboard\n{\n    /**\n     * Create a controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected Lead $leadReporting,\n        protected Activity $activityReporting,\n        protected Product $productReporting,\n        protected Person $personReporting,\n        protected Organization $organizationReporting,\n        protected Quote $quoteReporting,\n    ) {}\n\n    /**\n     * Returns the overall revenue statistics.\n     */\n    public function getRevenueStats(): array\n    {\n        return [\n            'total_won_revenue' => $this->leadReporting->getTotalWonLeadValueProgress(),\n            'total_lost_revenue' => $this->leadReporting->getTotalLostLeadValueProgress(),\n        ];\n    }\n\n    /**\n     * Returns the overall statistics.\n     */\n    public function getOverAllStats(): array\n    {\n        return [\n            'total_leads' => $this->leadReporting->getTotalLeadsProgress(),\n            'average_lead_value' => $this->leadReporting->getAverageLeadValueProgress(),\n            'average_leads_per_day' => $this->leadReporting->getAverageLeadsPerDayProgress(),\n            'total_quotations' => $this->quoteReporting->getTotalQuotesProgress(),\n            'total_persons' => $this->personReporting->getTotalPersonsProgress(),\n            'total_organizations' => $this->organizationReporting->getTotalOrganizationsProgress(),\n        ];\n    }\n\n    /**\n     * Returns leads statistics.\n     */\n    public function getTotalLeadsStats(): array\n    {\n        return [\n            'all' => [\n                'over_time' => $this->leadReporting->getTotalLeadsOverTime(),\n            ],\n\n            'won' => [\n                'over_time' => $this->leadReporting->getTotalWonLeadsOverTime(),\n            ],\n            'lost' => [\n                'over_time' => $this->leadReporting->getTotalLostLeadsOverTime(),\n            ],\n        ];\n    }\n\n    /**\n     * Returns leads revenue statistics by sources.\n     */\n    public function getLeadsStatsBySources(): mixed\n    {\n        return $this->leadReporting->getTotalWonLeadValueBySources();\n    }\n\n    /**\n     * Returns leads revenue statistics by types.\n     */\n    public function getLeadsStatsByTypes(): mixed\n    {\n        return $this->leadReporting->getTotalWonLeadValueByTypes();\n    }\n\n    /**\n     * Returns open leads statistics by states.\n     */\n    public function getOpenLeadsByStates(): mixed\n    {\n        return $this->leadReporting->getOpenLeadsByStates();\n    }\n\n    /**\n     * Returns top selling products statistics.\n     */\n    public function getTopSellingProducts(): Collection\n    {\n        return $this->productReporting->getTopSellingProductsByRevenue(5);\n    }\n\n    /**\n     * Returns top selling products statistics.\n     */\n    public function getTopPersons(): Collection\n    {\n        return $this->personReporting->getTopCustomersByRevenue(5);\n    }\n\n    /**\n     * Get the start date.\n     *\n     * @return \\Carbon\\Carbon\n     */\n    public function getStartDate(): Carbon\n    {\n        return $this->leadReporting->getStartDate();\n    }\n\n    /**\n     * Get the end date.\n     *\n     * @return \\Carbon\\Carbon\n     */\n    public function getEndDate(): Carbon\n    {\n        return $this->leadReporting->getEndDate();\n    }\n\n    /**\n     * Returns date range\n     */\n    public function getDateRange(): string\n    {\n        return $this->getStartDate()->format('d M').' - '.$this->getEndDate()->format('d M');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Helpers/Reporting/AbstractReporting.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Helpers\\Reporting;\n\nuse Carbon\\CarbonPeriod;\nuse Illuminate\\Support\\Carbon;\nuse Illuminate\\Support\\Str;\n\nabstract class AbstractReporting\n{\n    /**\n     * The starting date for a given period.\n     */\n    protected Carbon $startDate;\n\n    /**\n     * The ending date for a given period.\n     */\n    protected Carbon $endDate;\n\n    /**\n     * The starting date for the previous period.\n     */\n    protected Carbon $lastStartDate;\n\n    /**\n     * The ending date for the previous period.\n     */\n    protected Carbon $lastEndDate;\n\n    /**\n     * Create a helper instance.\n     *\n     * @return void\n     */\n    public function __construct()\n    {\n        $this->setStartDate(request()->date('start'));\n\n        $this->setEndDate(request()->date('end'));\n    }\n\n    /**\n     * Set the start date or default to 30 days ago if not provided.\n     *\n     * @param  \\Carbon\\Carbon|null  $startDate\n     * @return void\n     */\n    public function setStartDate(?Carbon $startDate = null): self\n    {\n        $this->startDate = $startDate ? $startDate->startOfDay() : now()->subDays(30)->startOfDay();\n\n        $this->setLastStartDate();\n\n        return $this;\n    }\n\n    /**\n     * Sets the end date to the provided date's end of day, or to the current\n     * date if not provided or if the provided date is in the future.\n     *\n     * @param  \\Carbon\\Carbon|null  $endDate\n     * @return void\n     */\n    public function setEndDate(?Carbon $endDate = null): self\n    {\n        $this->endDate = ($endDate && $endDate->endOfDay() <= now()) ? $endDate->endOfDay() : now();\n\n        $this->setLastEndDate();\n\n        return $this;\n    }\n\n    /**\n     * Get the start date.\n     *\n     * @return \\Carbon\\Carbon\n     */\n    public function getStartDate(): Carbon\n    {\n        return $this->startDate;\n    }\n\n    /**\n     * Get the end date.\n     *\n     * @return \\Carbon\\Carbon\n     */\n    public function getEndDate(): Carbon\n    {\n        return $this->endDate;\n    }\n\n    /**\n     * Sets the start date for the last period.\n     */\n    private function setLastStartDate(): void\n    {\n        if (! isset($this->startDate)) {\n            $this->setStartDate(request()->date('start'));\n        }\n\n        if (! isset($this->endDate)) {\n            $this->setEndDate(request()->date('end'));\n        }\n\n        $this->lastStartDate = $this->startDate->clone()->subDays($this->startDate->diffInDays($this->endDate));\n    }\n\n    /**\n     * Sets the end date for the last period.\n     */\n    private function setLastEndDate(): void\n    {\n        $this->lastEndDate = $this->startDate->clone();\n    }\n\n    /**\n     * Get the last start date.\n     *\n     * @return \\Carbon\\Carbon\n     */\n    public function getLastStartDate(): Carbon\n    {\n        return $this->lastStartDate;\n    }\n\n    /**\n     * Get the last end date.\n     *\n     * @return \\Carbon\\Carbon\n     */\n    public function getLastEndDate(): Carbon\n    {\n        return $this->lastEndDate;\n    }\n\n    /**\n     * Calculate the percentage change between previous and current values.\n     *\n     * @param  float|int  $previous\n     * @param  float|int  $current\n     */\n    public function getPercentageChange($previous, $current): float|int\n    {\n        if (! $previous) {\n            return $current ? 100 : 0;\n        }\n\n        return ($current - $previous) / $previous * 100;\n    }\n\n    /**\n     * Returns time intervals.\n     *\n     * @param  \\Carbon\\Carbon  $startDate\n     * @param  \\Carbon\\Carbon  $endDate\n     * @param  string  $period\n     * @return array\n     */\n    public function getTimeInterval($startDate, $endDate, $dateColumn, $period)\n    {\n        if ($period == 'auto') {\n            $totalMonths = $startDate->diffInMonths($endDate) + 1;\n\n            /**\n             * If the difference between the start and end date is more than 5 months\n             */\n            $intervals = $this->getMonthsInterval($startDate, $endDate);\n\n            if (! empty($intervals)) {\n                return [\n                    'group_column' => \"MONTH($dateColumn)\",\n                    'intervals' => $intervals,\n                ];\n            }\n\n            /**\n             * If the difference between the start and end date is more than 6 weeks\n             */\n            $intervals = $this->getWeeksInterval($startDate, $endDate);\n\n            if (! empty($intervals)) {\n                return [\n                    'group_column' => \"WEEK($dateColumn)\",\n                    'intervals' => $intervals,\n                ];\n            }\n\n            /**\n             * If the difference between the start and end date is less than 6 weeks\n             */\n            return [\n                'group_column' => \"DAYOFYEAR($dateColumn)\",\n                'intervals' => $this->getDaysInterval($startDate, $endDate),\n            ];\n        } else {\n            $datePeriod = CarbonPeriod::create($this->startDate, \"1 $period\", $this->endDate);\n\n            if ($period == 'year') {\n                $formatter = '?';\n            } elseif ($period == 'month') {\n                $formatter = '?-?';\n            } else {\n                $formatter = '?-?-?';\n            }\n\n            $groupColumn = 'DATE_FORMAT('.$dateColumn.', \"'.Str::replaceArray('?', ['%Y', '%m', '%d'], $formatter).'\")';\n\n            $intervals = [];\n\n            foreach ($datePeriod as $date) {\n                $formattedDate = $date->format(Str::replaceArray('?', ['Y', 'm', 'd'], $formatter));\n\n                $intervals[] = [\n                    'filter' => $formattedDate,\n                    'start' => $formattedDate,\n                ];\n            }\n\n            return [\n                'group_column' => $groupColumn,\n                'intervals' => $intervals,\n            ];\n        }\n    }\n\n    /**\n     * Returns time intervals.\n     *\n     * @param  \\Carbon\\Carbon  $startDate\n     * @param  \\Carbon\\Carbon  $endDate\n     * @return array\n     */\n    public function getMonthsInterval($startDate, $endDate)\n    {\n        $intervals = [];\n\n        $totalMonths = $startDate->diffInMonths($endDate) + 1;\n\n        /**\n         * If the difference between the start and end date is less than 5 months\n         */\n        if ($totalMonths <= 5) {\n            return $intervals;\n        }\n\n        for ($i = 0; $i < $totalMonths; $i++) {\n            $intervalStartDate = clone $startDate;\n\n            $intervalStartDate->addMonths($i);\n\n            $start = $intervalStartDate->startOfDay();\n\n            $end = ($totalMonths - 1 == $i)\n                ? $endDate\n                : $intervalStartDate->addMonth()->subDay()->endOfDay();\n\n            $intervals[] = [\n                'filter' => $start->month,\n                'start' => $start->format('d M'),\n                'end' => $end->format('d M'),\n            ];\n        }\n\n        return $intervals;\n    }\n\n    /**\n     * Returns time intervals.\n     *\n     * @param  \\Carbon\\Carbon  $startDate\n     * @param  \\Carbon\\Carbon  $endDate\n     * @return array\n     */\n    public function getWeeksInterval($startDate, $endDate)\n    {\n        $intervals = [];\n\n        $startWeekDay = Carbon::createFromTimeString(core()->xWeekRange($startDate, 0).' 00:00:01');\n\n        $endWeekDay = Carbon::createFromTimeString(core()->xWeekRange($endDate, 1).' 23:59:59');\n\n        $totalWeeks = $startWeekDay->diffInWeeks($endWeekDay);\n\n        /**\n         * If the difference between the start and end date is less than 6 weeks\n         */\n        if ($totalWeeks <= 6) {\n            return $intervals;\n        }\n\n        for ($i = 0; $i < $totalWeeks; $i++) {\n            $intervalStartDate = clone $startDate;\n\n            $intervalStartDate->addWeeks($i);\n\n            $start = $i == 0\n                ? $startDate\n                : Carbon::createFromTimeString(core()->xWeekRange($intervalStartDate, 0).' 00:00:01');\n\n            $end = ($totalWeeks - 1 == $i)\n                ? $endDate\n                : Carbon::createFromTimeString(core()->xWeekRange($intervalStartDate->subDay(), 1).' 23:59:59');\n\n            $intervals[] = [\n                'filter' => $start->week,\n                'start' => $start->format('d M'),\n                'end' => $end->format('d M'),\n            ];\n        }\n\n        return $intervals;\n    }\n\n    /**\n     * Returns time intervals.\n     *\n     * @param  \\Carbon\\Carbon  $startDate\n     * @param  \\Carbon\\Carbon  $endDate\n     * @return array\n     */\n    public function getDaysInterval($startDate, $endDate)\n    {\n        $intervals = [];\n\n        $totalDays = $startDate->diffInDays($endDate) + 1;\n\n        for ($i = 0; $i < $totalDays; $i++) {\n            $intervalStartDate = clone $startDate;\n\n            $intervalStartDate->addDays($i);\n\n            $intervals[] = [\n                'filter' => $intervalStartDate->dayOfYear,\n                'start' => $intervalStartDate->startOfDay()->format('d M'),\n                'end' => $intervalStartDate->endOfDay()->format('d M'),\n            ];\n        }\n\n        return $intervals;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Helpers/Reporting/Activity.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Helpers\\Reporting;\n\nclass Activity extends AbstractReporting {}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Helpers/Reporting/Lead.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Helpers\\Reporting;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\Lead\\Repositories\\LeadRepository;\nuse Webkul\\Lead\\Repositories\\StageRepository;\n\nclass Lead extends AbstractReporting\n{\n    /**\n     * The channel ids.\n     */\n    protected array $stageIds;\n\n    /**\n     * The all stage ids.\n     */\n    protected array $allStageIds;\n\n    /**\n     * The won stage ids.\n     */\n    protected array $wonStageIds;\n\n    /**\n     * The lost stage ids.\n     */\n    protected array $lostStageIds;\n\n    /**\n     * Create a helper instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected LeadRepository $leadRepository,\n        protected StageRepository $stageRepository\n    ) {\n        $this->allStageIds = $this->stageRepository->pluck('id')->toArray();\n\n        $this->wonStageIds = $this->stageRepository->where('code', 'won')->pluck('id')->toArray();\n\n        $this->lostStageIds = $this->stageRepository->where('code', 'lost')->pluck('id')->toArray();\n\n        parent::__construct();\n    }\n\n    /**\n     * Returns current customers over time\n     *\n     * @param  string  $period\n     */\n    public function getTotalLeadsOverTime($period = 'auto'): array\n    {\n        $this->stageIds = $this->allStageIds;\n\n        $period = $this->determinePeriod($period);\n\n        return $this->getOverTimeStats($this->startDate, $this->endDate, 'leads.id', 'created_at', $period);\n    }\n\n    /**\n     * Returns current customers over time\n     *\n     * @param  string  $period\n     */\n    public function getTotalWonLeadsOverTime($period = 'auto'): array\n    {\n        $this->stageIds = $this->wonStageIds;\n\n        $period = $this->determinePeriod($period);\n\n        return $this->getOverTimeStats($this->startDate, $this->endDate, 'leads.id', 'closed_at', $period);\n    }\n\n    /**\n     * Returns current customers over time\n     *\n     * @param  string  $period\n     */\n    public function getTotalLostLeadsOverTime($period = 'auto'): array\n    {\n        $this->stageIds = $this->lostStageIds;\n\n        $period = $this->determinePeriod($period);\n\n        return $this->getOverTimeStats($this->startDate, $this->endDate, 'leads.id', 'closed_at', $period);\n    }\n\n    /**\n     * Determine the appropriate period based on date range\n     *\n     * @param  string  $period\n     */\n    protected function determinePeriod($period = 'auto'): string\n    {\n        if ($period !== 'auto') {\n            return $period;\n        }\n\n        $diffInDays = $this->startDate->diffInDays($this->endDate);\n        $diffInMonths = $this->startDate->diffInMonths($this->endDate);\n        $diffInYears = $this->startDate->diffInYears($this->endDate);\n\n        if ($diffInYears > 3) {\n            return 'year';\n        } elseif ($diffInMonths > 6) {\n            return 'month';\n        } elseif ($diffInDays > 60) {\n            return 'week';\n        } else {\n            return 'day';\n        }\n    }\n\n    /**\n     * Retrieves total leads and their progress.\n     */\n    public function getTotalLeadsProgress(): array\n    {\n        return [\n            'previous' => $previous = $this->getTotalLeads($this->lastStartDate, $this->lastEndDate),\n            'current' => $current = $this->getTotalLeads($this->startDate, $this->endDate),\n            'progress' => $this->getPercentageChange($previous, $current),\n        ];\n    }\n\n    /**\n     * Retrieves total leads by date\n     *\n     * @param  Carbon  $startDate\n     * @param  Carbon  $endDate\n     */\n    public function getTotalLeads($startDate, $endDate): int\n    {\n        return $this->leadRepository\n            ->resetModel()\n            ->whereBetween('created_at', [$startDate, $endDate])\n            ->count();\n    }\n\n    /**\n     * Retrieves average leads per day and their progress.\n     */\n    public function getAverageLeadsPerDayProgress(): array\n    {\n        return [\n            'previous' => $previous = $this->getAverageLeadsPerDay($this->lastStartDate, $this->lastEndDate),\n            'current' => $current = $this->getAverageLeadsPerDay($this->startDate, $this->endDate),\n            'progress' => $this->getPercentageChange($previous, $current),\n        ];\n    }\n\n    /**\n     * Retrieves average leads per day\n     *\n     * @param  Carbon  $startDate\n     * @param  Carbon  $endDate\n     */\n    public function getAverageLeadsPerDay($startDate, $endDate): float\n    {\n        $days = $startDate->diffInDays($endDate);\n\n        if ($days == 0) {\n            return 0;\n        }\n\n        return $this->getTotalLeads($startDate, $endDate) / $days;\n    }\n\n    /**\n     * Retrieves total lead value and their progress.\n     */\n    public function getTotalLeadValueProgress(): array\n    {\n        return [\n            'previous' => $previous = $this->getTotalLeadValue($this->lastStartDate, $this->lastEndDate),\n            'current' => $current = $this->getTotalLeadValue($this->startDate, $this->endDate),\n            'formatted_total' => core()->formatBasePrice($current),\n            'progress' => $this->getPercentageChange($previous, $current),\n        ];\n    }\n\n    /**\n     * Retrieves total lead value\n     *\n     * @param  Carbon  $startDate\n     * @param  Carbon  $endDate\n     */\n    public function getTotalLeadValue($startDate, $endDate): float\n    {\n        return $this->leadRepository\n            ->resetModel()\n            ->whereBetween('created_at', [$startDate, $endDate])\n            ->sum('lead_value');\n    }\n\n    /**\n     * Retrieves average lead value and their progress.\n     */\n    public function getAverageLeadValueProgress(): array\n    {\n        return [\n            'previous' => $previous = $this->getAverageLeadValue($this->lastStartDate, $this->lastEndDate),\n            'current' => $current = $this->getAverageLeadValue($this->startDate, $this->endDate),\n            'formatted_total' => core()->formatBasePrice($current),\n            'progress' => $this->getPercentageChange($previous, $current),\n        ];\n    }\n\n    /**\n     * Retrieves average lead value\n     *\n     * @param  Carbon  $startDate\n     * @param  Carbon  $endDate\n     */\n    public function getAverageLeadValue($startDate, $endDate): float\n    {\n        return $this->leadRepository\n            ->resetModel()\n            ->whereBetween('created_at', [$startDate, $endDate])\n            ->avg('lead_value') ?? 0;\n    }\n\n    /**\n     * Retrieves total won lead value and their progress.\n     */\n    public function getTotalWonLeadValueProgress(): array\n    {\n        return [\n            'previous' => $previous = $this->getTotalWonLeadValue($this->lastStartDate, $this->lastEndDate),\n            'current' => $current = $this->getTotalWonLeadValue($this->startDate, $this->endDate),\n            'formatted_total' => core()->formatBasePrice($current),\n            'progress' => $this->getPercentageChange($previous, $current),\n        ];\n    }\n\n    /**\n     * Retrieves average won lead value\n     *\n     * @param  Carbon  $startDate\n     * @param  Carbon  $endDate\n     * @return array\n     */\n    public function getTotalWonLeadValue($startDate, $endDate): ?float\n    {\n        return $this->leadRepository\n            ->resetModel()\n            ->whereIn('lead_pipeline_stage_id', $this->wonStageIds)\n            ->whereBetween('created_at', [$startDate, $endDate])\n            ->sum('lead_value');\n    }\n\n    /**\n     * Retrieves average lost lead value and their progress.\n     */\n    public function getTotalLostLeadValueProgress(): array\n    {\n        return [\n            'previous' => $previous = $this->getTotalLostLeadValue($this->lastStartDate, $this->lastEndDate),\n            'current' => $current = $this->getTotalLostLeadValue($this->startDate, $this->endDate),\n            'formatted_total' => core()->formatBasePrice($current),\n            'progress' => $this->getPercentageChange($previous, $current),\n        ];\n    }\n\n    /**\n     * Retrieves average lost lead value\n     *\n     * @param  Carbon  $startDate\n     * @param  Carbon  $endDate\n     * @return array\n     */\n    public function getTotalLostLeadValue($startDate, $endDate): ?float\n    {\n        return $this->leadRepository\n            ->resetModel()\n            ->whereIn('lead_pipeline_stage_id', $this->lostStageIds)\n            ->whereBetween('created_at', [$startDate, $endDate])\n            ->sum('lead_value');\n    }\n\n    /**\n     * Retrieves total lead value by sources.\n     */\n    public function getTotalWonLeadValueBySources()\n    {\n        return $this->leadRepository\n            ->resetModel()\n            ->select(\n                'lead_sources.name',\n                DB::raw('SUM(lead_value) as total')\n            )\n            ->leftJoin('lead_sources', 'leads.lead_source_id', '=', 'lead_sources.id')\n            ->whereIn('lead_pipeline_stage_id', $this->wonStageIds)\n            ->whereBetween('leads.created_at', [$this->startDate, $this->endDate])\n            ->groupBy('lead_source_id')\n            ->get();\n    }\n\n    /**\n     * Retrieves total lead value by types.\n     */\n    public function getTotalWonLeadValueByTypes()\n    {\n        return $this->leadRepository\n            ->resetModel()\n            ->select(\n                'lead_types.name',\n                DB::raw('SUM(lead_value) as total')\n            )\n            ->leftJoin('lead_types', 'leads.lead_type_id', '=', 'lead_types.id')\n            ->whereIn('lead_pipeline_stage_id', $this->wonStageIds)\n            ->whereBetween('leads.created_at', [$this->startDate, $this->endDate])\n            ->groupBy('lead_type_id')\n            ->get();\n    }\n\n    /**\n     * Retrieves open leads by states.\n     */\n    public function getOpenLeadsByStates()\n    {\n        return $this->leadRepository\n            ->resetModel()\n            ->select(\n                'lead_pipeline_stages.name',\n                DB::raw('COUNT(lead_value) as total')\n            )\n            ->leftJoin('lead_pipeline_stages', 'leads.lead_pipeline_stage_id', '=', 'lead_pipeline_stages.id')\n            ->whereNotIn('lead_pipeline_stage_id', $this->wonStageIds)\n            ->whereNotIn('lead_pipeline_stage_id', $this->lostStageIds)\n            ->whereBetween('leads.created_at', [$this->startDate, $this->endDate])\n            ->groupBy('lead_pipeline_stage_id')\n            ->orderByDesc('total')\n            ->get();\n    }\n\n    /**\n     * Returns over time stats.\n     *\n     * @param  Carbon  $startDate\n     * @param  Carbon  $endDate\n     * @param  string  $valueColumn\n     * @param  string  $dateColumn\n     * @param  string  $period\n     */\n    public function getOverTimeStats($startDate, $endDate, $valueColumn, $dateColumn = 'created_at', $period = 'auto'): array\n    {\n        $period = $this->determinePeriod($period);\n\n        $intervals = $this->generateTimeIntervals($startDate, $endDate, $period);\n\n        $groupColumn = $this->getGroupColumn($dateColumn, $period);\n\n        $query = $this->leadRepository\n            ->resetModel()\n            ->select(\n                DB::raw(\"$groupColumn AS date\"),\n                DB::raw('COUNT(DISTINCT id) AS count'),\n                DB::raw('SUM('.\\DB::getTablePrefix().\"$valueColumn) AS total\")\n            )\n            ->whereIn('lead_pipeline_stage_id', $this->stageIds)\n            ->whereBetween($dateColumn, [$startDate, $endDate])\n            ->groupBy(DB::raw($groupColumn))\n            ->orderBy(DB::raw($groupColumn));\n\n        $results = $query->get();\n        $resultLookup = $results->keyBy('date');\n\n        $stats = [];\n\n        foreach ($intervals as $interval) {\n            $result = $resultLookup->get($interval['key']);\n\n            $stats[] = [\n                'label' => $interval['label'],\n                'count' => $result ? (int) $result->count : 0,\n                'total' => $result ? (float) $result->total : 0,\n            ];\n        }\n\n        return $stats;\n    }\n\n    /**\n     * Generate time intervals based on period\n     */\n    protected function generateTimeIntervals(Carbon $startDate, Carbon $endDate, string $period): array\n    {\n        $intervals = [];\n        $current = $startDate->copy();\n\n        while ($current <= $endDate) {\n            $interval = [\n                'key' => $this->formatDateForGrouping($current, $period),\n                'label' => $this->formatDateForLabel($current, $period),\n            ];\n\n            $intervals[] = $interval;\n\n            switch ($period) {\n                case 'day':\n                    $current->addDay();\n\n                    break;\n                case 'week':\n                    $current->addWeek();\n\n                    break;\n                case 'month':\n                    $current->addMonth();\n\n                    break;\n                case 'year':\n                    $current->addYear();\n\n                    break;\n            }\n        }\n\n        return $intervals;\n    }\n\n    /**\n     * Get the SQL group column based on period\n     */\n    protected function getGroupColumn(string $dateColumn, string $period): string\n    {\n        switch ($period) {\n            case 'day':\n                return \"DATE($dateColumn)\";\n            case 'week':\n                return \"DATE_FORMAT($dateColumn, '%Y-%u')\";\n            case 'month':\n                return \"DATE_FORMAT($dateColumn, '%Y-%m')\";\n            case 'year':\n                return \"YEAR($dateColumn)\";\n            default:\n                return \"DATE($dateColumn)\";\n        }\n    }\n\n    /**\n     * Format date for grouping key\n     */\n    protected function formatDateForGrouping(Carbon $date, string $period): string\n    {\n        switch ($period) {\n            case 'day':\n                return $date->format('Y-m-d');\n            case 'week':\n                return $date->format('Y-W');\n            case 'month':\n                return $date->format('Y-m');\n            case 'year':\n                return $date->format('Y');\n            default:\n                return $date->format('Y-m-d');\n        }\n    }\n\n    /**\n     * Format date for display label\n     */\n    protected function formatDateForLabel(Carbon $date, string $period): string\n    {\n        switch ($period) {\n            case 'day':\n                return $date->format('M d');\n            case 'week':\n                return 'Week '.$date->format('W, Y');\n            case 'month':\n                return $date->format('M Y');\n            case 'year':\n                return $date->format('Y');\n            default:\n                return $date->format('M d');\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Helpers/Reporting/Organization.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Helpers\\Reporting;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Support\\Collection;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\Contact\\Repositories\\OrganizationRepository;\n\nclass Organization extends AbstractReporting\n{\n    /**\n     * Create a helper instance.\n     *\n     * @return void\n     */\n    public function __construct(protected OrganizationRepository $organizationRepository)\n    {\n        parent::__construct();\n    }\n\n    /**\n     * Retrieves total organizations and their progress.\n     */\n    public function getTotalOrganizationsProgress(): array\n    {\n        return [\n            'previous' => $previous = $this->getTotalOrganizations($this->lastStartDate, $this->lastEndDate),\n            'current' => $current = $this->getTotalOrganizations($this->startDate, $this->endDate),\n            'progress' => $this->getPercentageChange($previous, $current),\n        ];\n    }\n\n    /**\n     * Retrieves total organizations by date\n     *\n     * @param  Carbon  $startDate\n     * @param  Carbon  $endDate\n     */\n    public function getTotalOrganizations($startDate, $endDate): int\n    {\n        return $this->organizationRepository\n            ->resetModel()\n            ->whereBetween('created_at', [$startDate, $endDate])\n            ->count();\n    }\n\n    /**\n     * Gets top customers by revenue.\n     *\n     * @param  int  $limit\n     */\n    public function getTopOrganizationsByRevenue($limit = null): Collection\n    {\n        $tablePrefix = DB::getTablePrefix();\n\n        $items = $this->organizationRepository\n            ->resetModel()\n            ->leftJoin('persons', 'organizations.id', '=', 'persons.organization_id')\n            ->leftJoin('leads', 'persons.id', '=', 'leads.person_id')\n            ->select('*', 'persons.id as id')\n            ->addSelect(DB::raw('SUM('.$tablePrefix.'leads.lead_value) as revenue'))\n            ->whereBetween('leads.closed_at', [$this->startDate, $this->endDate])\n            ->having(DB::raw('SUM('.$tablePrefix.'leads.lead_value)'), '>', 0)\n            ->groupBy('organization_id')\n            ->orderBy('revenue', 'DESC')\n            ->limit($limit)\n            ->get();\n\n        $items = $items->map(function ($item) {\n            return [\n                'id' => $item->id,\n                'name' => $item->name,\n                'revenue' => $item->revenue,\n                'formatted_revenue' => core()->formatBasePrice($item->revenue),\n            ];\n        });\n\n        return $items;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Helpers/Reporting/Person.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Helpers\\Reporting;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Support\\Collection;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\n\nclass Person extends AbstractReporting\n{\n    /**\n     * Create a helper instance.\n     *\n     * @return void\n     */\n    public function __construct(protected PersonRepository $personRepository)\n    {\n        parent::__construct();\n    }\n\n    /**\n     * Retrieves total persons and their progress.\n     */\n    public function getTotalPersonsProgress(): array\n    {\n        return [\n            'previous' => $previous = $this->getTotalPersons($this->lastStartDate, $this->lastEndDate),\n            'current' => $current = $this->getTotalPersons($this->startDate, $this->endDate),\n            'progress' => $this->getPercentageChange($previous, $current),\n        ];\n    }\n\n    /**\n     * Retrieves total persons by date\n     *\n     * @param  Carbon  $startDate\n     * @param  Carbon  $endDate\n     */\n    public function getTotalPersons($startDate, $endDate): int\n    {\n        return $this->personRepository\n            ->resetModel()\n            ->whereBetween('created_at', [$startDate, $endDate])\n            ->count();\n    }\n\n    /**\n     * Gets top customers by revenue.\n     *\n     * @param  int  $limit\n     */\n    public function getTopCustomersByRevenue($limit = null): Collection\n    {\n        $tablePrefix = DB::getTablePrefix();\n\n        $items = $this->personRepository\n            ->resetModel()\n            ->leftJoin('leads', 'persons.id', '=', 'leads.person_id')\n            ->select('*', 'persons.id as id')\n            ->addSelect(DB::raw('SUM('.$tablePrefix.'leads.lead_value) as revenue'))\n            ->whereBetween('leads.closed_at', [$this->startDate, $this->endDate])\n            ->having(DB::raw('SUM('.$tablePrefix.'leads.lead_value)'), '>', 0)\n            ->groupBy('person_id')\n            ->orderBy('revenue', 'DESC')\n            ->limit($limit)\n            ->get();\n\n        $items = $items->map(function ($item) {\n            return [\n                'id' => $item->id,\n                'name' => $item->name,\n                'emails' => $item->emails,\n                'contact_numbers' => $item->contact_numbers,\n                'revenue' => $item->revenue,\n                'formatted_revenue' => core()->formatBasePrice($item->revenue),\n            ];\n        });\n\n        return $items;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Helpers/Reporting/Product.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Helpers\\Reporting;\n\nuse Illuminate\\Support\\Collection;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\Lead\\Repositories\\ProductRepository;\n\nclass Product extends AbstractReporting\n{\n    /**\n     * Create a helper instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected ProductRepository $productRepository\n    ) {\n        parent::__construct();\n    }\n\n    /**\n     * Gets top-selling products by revenue.\n     *\n     * @param  int  $limit\n     */\n    public function getTopSellingProductsByRevenue($limit = null): Collection\n    {\n        $tablePrefix = DB::getTablePrefix();\n\n        $items = $this->productRepository\n            ->resetModel()\n            ->with('product')\n            ->leftJoin('leads', 'lead_products.lead_id', '=', 'leads.id')\n            ->leftJoin('products', 'lead_products.product_id', '=', 'products.id')\n            ->select('*')\n            ->addSelect(DB::raw('SUM('.$tablePrefix.'lead_products.amount) as revenue'))\n            ->whereBetween('leads.closed_at', [$this->startDate, $this->endDate])\n            ->having(DB::raw('SUM('.$tablePrefix.'lead_products.amount)'), '>', 0)\n            ->groupBy('product_id')\n            ->orderBy('revenue', 'DESC')\n            ->limit($limit)\n            ->get();\n\n        $items = $items->map(function ($item) {\n            return [\n                'id' => $item->product_id,\n                'name' => $item->name,\n                'price' => $item->product?->price,\n                'formatted_price' => core()->formatBasePrice($item->price),\n                'revenue' => $item->revenue,\n                'formatted_revenue' => core()->formatBasePrice($item->revenue),\n            ];\n        });\n\n        return $items;\n    }\n\n    /**\n     * Gets top-selling products by quantity.\n     *\n     * @param  int  $limit\n     */\n    public function getTopSellingProductsByQuantity($limit = null): Collection\n    {\n        $tablePrefix = DB::getTablePrefix();\n\n        $items = $this->productRepository\n            ->resetModel()\n            ->with('product')\n            ->leftJoin('leads', 'lead_products.lead_id', '=', 'leads.id')\n            ->leftJoin('products', 'lead_products.product_id', '=', 'products.id')\n            ->select('*')\n            ->addSelect(DB::raw('SUM('.$tablePrefix.'lead_products.quantity) as total_qty_ordered'))\n            ->whereBetween('leads.closed_at', [$this->startDate, $this->endDate])\n            ->having(DB::raw('SUM('.$tablePrefix.'lead_products.quantity)'), '>', 0)\n            ->groupBy('product_id')\n            ->orderBy('total_qty_ordered', 'DESC')\n            ->limit($limit)\n            ->get();\n\n        $items = $items->map(function ($item) {\n            return [\n                'id' => $item->product_id,\n                'name' => $item->name,\n                'price' => $item->product?->price,\n                'formatted_price' => core()->formatBasePrice($item->price),\n                'total_qty_ordered' => $item->total_qty_ordered,\n            ];\n        });\n\n        return $items;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Helpers/Reporting/Quote.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Helpers\\Reporting;\n\nuse Carbon\\Carbon;\nuse Webkul\\Quote\\Repositories\\QuoteRepository;\n\nclass Quote extends AbstractReporting\n{\n    /**\n     * Create a helper instance.\n     *\n     * @return void\n     */\n    public function __construct(protected QuoteRepository $quoteRepository)\n    {\n        parent::__construct();\n    }\n\n    /**\n     * Retrieves total quotes and their progress.\n     */\n    public function getTotalQuotesProgress(): array\n    {\n        return [\n            'previous' => $previous = $this->getTotalQuotes($this->lastStartDate, $this->lastEndDate),\n            'current' => $current = $this->getTotalQuotes($this->startDate, $this->endDate),\n            'progress' => $this->getPercentageChange($previous, $current),\n        ];\n    }\n\n    /**\n     * Retrieves total quotes by date\n     *\n     * @param  Carbon  $startDate\n     * @param  Carbon  $endDate\n     */\n    public function getTotalQuotes($startDate, $endDate): int\n    {\n        return $this->quoteRepository\n            ->resetModel()\n            ->whereBetween('created_at', [$startDate, $endDate])\n            ->count();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Activity/ActivityController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Activity;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Illuminate\\View\\View;\nuse Symfony\\Component\\HttpFoundation\\RedirectResponse;\nuse Symfony\\Component\\HttpFoundation\\StreamedResponse;\nuse Webkul\\Activity\\Repositories\\ActivityRepository;\nuse Webkul\\Activity\\Repositories\\FileRepository;\nuse Webkul\\Admin\\DataGrids\\Activity\\ActivityDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\MassDestroyRequest;\nuse Webkul\\Admin\\Http\\Requests\\MassUpdateRequest;\nuse Webkul\\Admin\\Http\\Resources\\ActivityResource;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\n\nclass ActivityController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected ActivityRepository $activityRepository,\n        protected FileRepository $fileRepository,\n        protected AttributeRepository $attributeRepository,\n    ) {}\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index(): View\n    {\n        return view('admin::activities.index');\n    }\n\n    /**\n     * Returns a listing of the resource.\n     */\n    public function get(): JsonResponse\n    {\n        if (! request()->has('view_type')) {\n            return datagrid(ActivityDataGrid::class)->process();\n        }\n\n        $startDate = request()->get('startDate')\n            ? Carbon::createFromTimeString(request()->get('startDate').' 00:00:01')\n            : Carbon::now()->startOfWeek()->format('Y-m-d H:i:s');\n\n        $endDate = request()->get('endDate')\n            ? Carbon::createFromTimeString(request()->get('endDate').' 23:59:59')\n            : Carbon::now()->endOfWeek()->format('Y-m-d H:i:s');\n\n        $activities = $this->activityRepository->getActivities([$startDate, $endDate])->toArray();\n\n        return response()->json([\n            'activities' => $activities,\n        ]);\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(): RedirectResponse|JsonResponse\n    {\n        $this->validate(request(), [\n            'type' => 'required',\n            'comment' => 'required_if:type,note',\n            'schedule_from' => 'required_unless:type,note,file',\n            'schedule_to' => 'required_unless:type,note,file',\n            'file' => 'required_if:type,file',\n        ]);\n\n        if (request('type') === 'meeting') {\n            /**\n             * Check if meeting is overlapping with other meetings.\n             */\n            $isOverlapping = $this->activityRepository->isDurationOverlapping(\n                request()->input('schedule_from'),\n                request()->input('schedule_to'),\n                request()->input('participants'),\n                request()->input('id')\n            );\n\n            if ($isOverlapping) {\n                if (request()->ajax()) {\n                    return response()->json([\n                        'message' => trans('admin::app.activities.overlapping-error'),\n                    ], 400);\n                }\n\n                session()->flash('success', trans('admin::app.activities.overlapping-error'));\n\n                return redirect()->back();\n            }\n        }\n\n        Event::dispatch('activity.create.before');\n\n        $activity = $this->activityRepository->create(array_merge(request()->all(), [\n            'is_done' => request('type') == 'note' ? 1 : 0,\n            'user_id' => auth()->guard('user')->user()->id,\n        ]));\n\n        Event::dispatch('activity.create.after', $activity);\n\n        if (request()->ajax()) {\n            return response()->json([\n                'data' => new ActivityResource($activity),\n                'message' => trans('admin::app.activities.create-success'),\n            ]);\n        }\n\n        session()->flash('success', trans('admin::app.activities.create-success'));\n\n        return redirect()->back();\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     */\n    public function edit(int $id): View\n    {\n        $activity = $this->activityRepository->findOrFail($id);\n\n        $leadId = old('lead_id') ?? optional($activity->leads()->first())->id;\n\n        $lookUpEntityData = $this->attributeRepository->getLookUpEntity('leads', $leadId);\n\n        return view('admin::activities.edit', compact('activity', 'lookUpEntityData'));\n    }\n\n    /**\n     * Update the specified resource in storage.\n     */\n    public function update($id): RedirectResponse|JsonResponse\n    {\n        Event::dispatch('activity.update.before', $id);\n\n        $data = request()->all();\n\n        $activity = $this->activityRepository->update($data, $id);\n\n        /**\n         * We will not use `empty` directly here because `lead_id` can be a blank string\n         * from the activity form. However, on the activity view page, we are only updating the\n         * `is_done` field, so `lead_id` will not be present in that case.\n         */\n        if (isset($data['lead_id'])) {\n            $activity->leads()->sync(\n                ! empty($data['lead_id'])\n                    ? [$data['lead_id']]\n                    : []\n            );\n        }\n\n        Event::dispatch('activity.update.after', $activity);\n\n        if (request()->ajax()) {\n            return response()->json([\n                'data' => new ActivityResource($activity),\n                'message' => trans('admin::app.activities.update-success'),\n            ]);\n        }\n\n        session()->flash('success', trans('admin::app.activities.update-success'));\n\n        return redirect()->route('admin.activities.index');\n    }\n\n    /**\n     * Mass Update the specified resources.\n     */\n    public function massUpdate(MassUpdateRequest $massUpdateRequest): JsonResponse\n    {\n        $activities = $this->activityRepository->findWhereIn('id', $massUpdateRequest->input('indices'));\n\n        foreach ($activities as $activity) {\n            Event::dispatch('activity.update.before', $activity->id);\n\n            $activity = $this->activityRepository->update([\n                'is_done' => $massUpdateRequest->input('value'),\n            ], $activity->id);\n\n            Event::dispatch('activity.update.after', $activity);\n        }\n\n        return response()->json([\n            'message' => trans('admin::app.activities.mass-update-success'),\n        ]);\n    }\n\n    /**\n     * Download file from storage.\n     */\n    public function download(int $id): StreamedResponse\n    {\n        try {\n            $file = $this->fileRepository->findOrFail($id);\n\n            return Storage::download($file->path);\n        } catch (\\Exception $exception) {\n            abort(404);\n        }\n    }\n\n    /*\n     * Remove the specified resource from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $activity = $this->activityRepository->findOrFail($id);\n\n        try {\n            Event::dispatch('activity.delete.before', $id);\n\n            $activity?->delete($id);\n\n            Event::dispatch('activity.delete.after', $id);\n\n            return response()->json([\n                'message' => trans('admin::app.activities.destroy-success'),\n            ], 200);\n        } catch (\\Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.activities.destroy-failed'),\n            ], 400);\n        }\n    }\n\n    /**\n     * Mass Delete the specified resources.\n     */\n    public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse\n    {\n        $activities = $this->activityRepository->findWhereIn('id', $massDestroyRequest->input('indices'));\n\n        try {\n            foreach ($activities as $activity) {\n                Event::dispatch('activity.delete.before', $activity->id);\n\n                $this->activityRepository->delete($activity->id);\n\n                Event::dispatch('activity.delete.after', $activity->id);\n            }\n\n            return response()->json([\n                'message' => trans('admin::app.activities.mass-destroy-success'),\n            ]);\n        } catch (\\Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.activities.mass-delete-failed'),\n            ], 400);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Configuration/ConfigurationController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Configuration;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\ConfigurationForm;\nuse Webkul\\Core\\Repositories\\CoreConfigRepository as ConfigurationRepository;\n\nclass ConfigurationController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected ConfigurationRepository $configurationRepository) {}\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index(): View\n    {\n        if (\n            request()->route('slug')\n            && request()->route('slug2')\n        ) {\n            return view('admin::configuration.edit');\n        }\n\n        return view('admin::configuration.index');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(ConfigurationForm $request): RedirectResponse\n    {\n        Event::dispatch('core.configuration.save.before');\n\n        $this->configurationRepository->create($request->all());\n\n        Event::dispatch('core.configuration.save.after');\n\n        session()->flash('success', trans('admin::app.configuration.index.save-success'));\n\n        return redirect()->back();\n    }\n\n    /**\n     * download the file for the specified resource.\n     *\n     * @return Response\n     */\n    public function download()\n    {\n        $path = request()->route()->parameters()['path'];\n\n        $fileName = 'configuration/'.$path;\n\n        $config = $this->configurationRepository->findOneByField('value', $fileName);\n\n        return Storage::download($config['value']);\n    }\n\n    /**\n     * Search for configurations.\n     */\n    public function search(): JsonResponse\n    {\n        $results = $this->configurationRepository->search(\n            system_config()->getItems(),\n            request()->query('query')\n        );\n\n        return new JsonResponse([\n            'data' => $results,\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Contact/OrganizationController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Contact;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\DataGrids\\Contact\\OrganizationDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\AttributeForm;\nuse Webkul\\Admin\\Http\\Requests\\MassDestroyRequest;\nuse Webkul\\Contact\\Repositories\\OrganizationRepository;\n\nclass OrganizationController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected OrganizationRepository $organizationRepository)\n    {\n        request()->request->add(['entity_type' => 'organizations']);\n    }\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(OrganizationDataGrid::class)->process();\n        }\n\n        return view('admin::contacts.organizations.index');\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function create(): View\n    {\n        return view('admin::contacts.organizations.create');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(AttributeForm $request): RedirectResponse\n    {\n        Event::dispatch('contacts.organization.create.before');\n\n        $organization = $this->organizationRepository->create(request()->all());\n\n        Event::dispatch('contacts.organization.create.after', $organization);\n\n        session()->flash('success', trans('admin::app.contacts.organizations.index.create-success'));\n\n        return redirect()->route('admin.contacts.organizations.index');\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     */\n    public function edit(int $id): View\n    {\n        $organization = $this->organizationRepository->findOrFail($id);\n\n        return view('admin::contacts.organizations.edit', compact('organization'));\n    }\n\n    /**\n     * Update the specified resource in storage.\n     */\n    public function update(AttributeForm $request, int $id): RedirectResponse\n    {\n        Event::dispatch('contacts.organization.update.before', $id);\n\n        $organization = $this->organizationRepository->update(request()->all(), $id);\n\n        Event::dispatch('contacts.organization.update.after', $organization);\n\n        session()->flash('success', trans('admin::app.contacts.organizations.index.update-success'));\n\n        return redirect()->route('admin.contacts.organizations.index');\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        try {\n            Event::dispatch('contact.organization.delete.before', $id);\n\n            $this->organizationRepository->delete($id);\n\n            Event::dispatch('contact.organization.delete.after', $id);\n\n            return response()->json([\n                'message' => trans('admin::app.contacts.organizations.index.delete-success'),\n            ], 200);\n        } catch (\\Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.contacts.organizations.index.delete-failed'),\n            ], 400);\n        }\n    }\n\n    /**\n     * Mass Delete the specified resources.\n     */\n    public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse\n    {\n        $organizations = $this->organizationRepository->findWhereIn('id', $massDestroyRequest->input('indices'));\n\n        foreach ($organizations as $organization) {\n            Event::dispatch('contact.organization.delete.before', $organization);\n\n            $this->organizationRepository->delete($organization->id);\n\n            Event::dispatch('contact.organization.delete.after', $organization);\n        }\n\n        return response()->json([\n            'message' => trans('admin::app.contacts.organizations.index.delete-success'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/ActivityController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Contact\\Persons;\n\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\Activity\\Repositories\\ActivityRepository;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Resources\\ActivityResource;\nuse Webkul\\Email\\Repositories\\AttachmentRepository;\nuse Webkul\\Email\\Repositories\\EmailRepository;\n\nclass ActivityController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected ActivityRepository $activityRepository,\n        protected EmailRepository $emailRepository,\n        protected AttachmentRepository $attachmentRepository\n    ) {}\n\n    /**\n     * Display a listing of the resource.\n     *\n     * @param  int  $id\n     * @return Response\n     */\n    public function index($id)\n    {\n        $activities = $this->activityRepository\n            ->leftJoin('person_activities', 'activities.id', '=', 'person_activities.activity_id')\n            ->where('person_activities.person_id', $id)\n            ->get();\n\n        return ActivityResource::collection($this->concatEmailAsActivities($id, $activities));\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function concatEmailAsActivities($personId, $activities)\n    {\n        $emails = DB::table('emails as child')\n            ->select('child.*')\n            ->join('emails as parent', 'child.parent_id', '=', 'parent.id')\n            ->where('parent.person_id', $personId)\n            ->union(DB::table('emails as parent')->where('parent.person_id', $personId))\n            ->get();\n\n        return $activities->concat($emails->map(function ($email) {\n            return (object) [\n                'id' => $email->id,\n                'parent_id' => $email->parent_id,\n                'title' => $email->subject,\n                'type' => 'email',\n                'is_done' => 1,\n                'comment' => $email->reply,\n                'schedule_from' => null,\n                'schedule_to' => null,\n                'user' => auth()->guard('user')->user(),\n                'participants' => [],\n                'location' => null,\n                'additional' => [\n                    'folders' => json_decode($email->folders),\n                    'from' => json_decode($email->from),\n                    'to' => json_decode($email->reply_to),\n                    'cc' => json_decode($email->cc),\n                    'bcc' => json_decode($email->bcc),\n                ],\n                'files' => $this->attachmentRepository->findWhere(['email_id' => $email->id])->map(function ($attachment) {\n                    return (object) [\n                        'id' => $attachment->id,\n                        'name' => $attachment->name,\n                        'path' => $attachment->path,\n                        'url' => $attachment->url,\n                        'created_at' => $attachment->created_at,\n                        'updated_at' => $attachment->updated_at,\n                    ];\n                }),\n                'created_at' => $email->created_at,\n                'updated_at' => $email->updated_at,\n            ];\n        }))->sortByDesc('id')->sortByDesc('created_at');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/PersonController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Contact\\Persons;\n\nuse Exception;\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Prettus\\Repository\\Criteria\\RequestCriteria;\nuse Webkul\\Admin\\DataGrids\\Contact\\PersonDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\AttributeForm;\nuse Webkul\\Admin\\Http\\Requests\\MassDestroyRequest;\nuse Webkul\\Admin\\Http\\Resources\\PersonResource;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\n\nclass PersonController extends Controller\n{\n    /**\n     * Create a new class instance.\n     *\n     * @return void\n     */\n    public function __construct(protected PersonRepository $personRepository)\n    {\n        request()->request->add(['entity_type' => 'persons']);\n    }\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index()\n    {\n        if (request()->ajax()) {\n            return datagrid(PersonDataGrid::class)->process();\n        }\n\n        return view('admin::contacts.persons.index');\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function create(): View\n    {\n        return view('admin::contacts.persons.create');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(AttributeForm $request): RedirectResponse|JsonResponse\n    {\n        Event::dispatch('contacts.person.create.before');\n\n        $person = $this->personRepository->create($request->all());\n\n        Event::dispatch('contacts.person.create.after', $person);\n\n        if (request()->ajax()) {\n            return response()->json([\n                'data' => $person,\n                'message' => trans('admin::app.contacts.persons.index.create-success'),\n            ]);\n        }\n\n        session()->flash('success', trans('admin::app.contacts.persons.index.create-success'));\n\n        return redirect()->route('admin.contacts.persons.index');\n    }\n\n    /**\n     * Display the specified resource.\n     */\n    public function show(int $id): View\n    {\n        $person = $this->personRepository->findOrFail($id);\n\n        return view('admin::contacts.persons.view', compact('person'));\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     */\n    public function edit(int $id): View\n    {\n        $person = $this->personRepository->findOrFail($id);\n\n        return view('admin::contacts.persons.edit', compact('person'));\n    }\n\n    /**\n     * Update the specified resource in storage.\n     */\n    public function update(AttributeForm $request, int $id): RedirectResponse|JsonResponse\n    {\n        Event::dispatch('contacts.person.update.before', $id);\n\n        $person = $this->personRepository->update($request->all(), $id);\n\n        Event::dispatch('contacts.person.update.after', $person);\n\n        if (request()->ajax()) {\n            return response()->json([\n                'data' => $person,\n                'message' => trans('admin::app.contacts.persons.index.update-success'),\n            ], 200);\n        }\n\n        session()->flash('success', trans('admin::app.contacts.persons.index.update-success'));\n\n        return redirect()->route('admin.contacts.persons.index');\n    }\n\n    /**\n     * Search person results.\n     */\n    public function search(): JsonResource\n    {\n        if ($userIds = bouncer()->getAuthorizedUserIds()) {\n            $persons = $this->personRepository\n                ->pushCriteria(app(RequestCriteria::class))\n                ->findWhereIn('user_id', $userIds);\n        } else {\n            $persons = $this->personRepository\n                ->pushCriteria(app(RequestCriteria::class))\n                ->all();\n        }\n\n        return PersonResource::collection($persons);\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $person = $this->personRepository->findOrFail($id);\n\n        if (\n            $person->leads\n            && $person->leads->count() > 0\n        ) {\n            return response()->json([\n                'message' => trans('admin::app.contacts.persons.index.delete-failed'),\n            ], 400);\n        }\n\n        try {\n            Event::dispatch('contacts.person.delete.before', $person);\n\n            $person->delete();\n\n            Event::dispatch('contacts.person.delete.after', $person);\n\n            return response()->json([\n                'message' => trans('admin::app.contacts.persons.index.delete-success'),\n            ], 200);\n\n        } catch (Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.contacts.persons.index.delete-failed'),\n            ], 400);\n        }\n    }\n\n    /**\n     * Mass destroy the specified resources from storage.\n     */\n    public function massDestroy(MassDestroyRequest $request): JsonResponse\n    {\n        try {\n            $persons = $this->personRepository->findWhereIn('id', $request->input('indices', []));\n\n            $deletedCount = 0;\n\n            $blockedCount = 0;\n\n            foreach ($persons as $person) {\n                if (\n                    $person->leads\n                    && $person->leads->count() > 0\n                ) {\n                    $blockedCount++;\n\n                    continue;\n                }\n\n                Event::dispatch('contact.person.delete.before', $person);\n\n                $this->personRepository->delete($person->id);\n\n                Event::dispatch('contact.person.delete.after', $person);\n\n                $deletedCount++;\n            }\n\n            $statusCode = 200;\n\n            switch (true) {\n                case $deletedCount > 0 && $blockedCount === 0:\n                    $message = trans('admin::app.contacts.persons.index.all-delete-success');\n\n                    break;\n\n                case $deletedCount > 0 && $blockedCount > 0:\n                    $message = trans('admin::app.contacts.persons.index.partial-delete-warning');\n\n                    break;\n\n                case $deletedCount === 0 && $blockedCount > 0:\n                    $message = trans('admin::app.contacts.persons.index.none-delete-warning');\n\n                    $statusCode = 400;\n\n                    break;\n\n                default:\n                    $message = trans('admin::app.contacts.persons.index.no-selection');\n\n                    $statusCode = 400;\n\n                    break;\n            }\n\n            return response()->json(['message' => $message], $statusCode);\n        } catch (Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.contacts.persons.index.delete-failed'),\n            ], 400);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Contact/Persons/TagController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Contact\\Persons;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\n\nclass TagController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected PersonRepository $personRepository) {}\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function attach(int $id): JsonResponse\n    {\n        Event::dispatch('persons.tag.create.before', $id);\n\n        $person = $this->personRepository->find($id);\n\n        if (! $person->tags->contains(request()->input('tag_id'))) {\n            $person->tags()->attach(request()->input('tag_id'));\n        }\n\n        Event::dispatch('persons.tag.create.after', $person);\n\n        return response()->json([\n            'message' => trans('admin::app.contacts.persons.view.tags.create-success'),\n        ]);\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function detach(int $personId): JsonResponse\n    {\n        Event::dispatch('persons.tag.delete.before', $personId);\n\n        $person = $this->personRepository->find($personId);\n\n        $person->tags()->detach(request()->input('tag_id'));\n\n        Event::dispatch('persons.tag.delete.after', $person);\n\n        return response()->json([\n            'message' => trans('admin::app.contacts.persons.view.tags.destroy-success'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Controller.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers;\n\nuse Illuminate\\Foundation\\Auth\\Access\\AuthorizesRequests;\nuse Illuminate\\Foundation\\Bus\\DispatchesJobs;\nuse Illuminate\\Foundation\\Validation\\ValidatesRequests;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Routing\\Controller as BaseController;\n\nclass Controller extends BaseController\n{\n    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;\n\n    /**\n     * Display a listing of the resource.\n     *\n     * @return Response\n     */\n    public function redirectToLogin()\n    {\n        return redirect()->route('admin.session.create');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/DashboardController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\Helpers\\Dashboard;\n\nclass DashboardController extends Controller\n{\n    /**\n     * Request param functions\n     *\n     * @var array\n     */\n    protected $typeFunctions = [\n        'over-all' => 'getOverAllStats',\n        'revenue-stats' => 'getRevenueStats',\n        'total-leads' => 'getTotalLeadsStats',\n        'revenue-by-sources' => 'getLeadsStatsBySources',\n        'revenue-by-types' => 'getLeadsStatsByTypes',\n        'top-selling-products' => 'getTopSellingProducts',\n        'top-persons' => 'getTopPersons',\n        'open-leads-by-states' => 'getOpenLeadsByStates',\n    ];\n\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected Dashboard $dashboardHelper) {}\n\n    /**\n     * Display a listing of the resource.\n     *\n     * @return View\n     */\n    public function index()\n    {\n        return view('admin::dashboard.index')->with([\n            'startDate' => $this->dashboardHelper->getStartDate(),\n            'endDate' => $this->dashboardHelper->getEndDate(),\n        ]);\n    }\n\n    /**\n     * Display a listing of the resource.\n     *\n     * @return JsonResponse\n     */\n    public function stats()\n    {\n        $stats = $this->dashboardHelper->{$this->typeFunctions[request()->query('type')]}();\n\n        return response()->json([\n            'statistics' => $stats,\n            'date_range' => $this->dashboardHelper->getDateRange(),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/DataGrid/SavedFilterController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\DataGrid;\n\nuse Illuminate\\Support\\Facades\\Event;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\DataGrid\\Repositories\\SavedFilterRepository;\n\nclass SavedFilterController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     */\n    public function __construct(protected SavedFilterRepository $savedFilterRepository) {}\n\n    /**\n     * Save filters to the database.\n     */\n    public function store()\n    {\n        $userId = auth()->guard()->user()->id;\n\n        $this->validate(request(), [\n            'name' => 'required|unique:datagrid_saved_filters,name,NULL,id,src,'.request('src').',user_id,'.$userId,\n        ]);\n\n        Event::dispatch('datagrid.saved_filter.create.before');\n\n        $savedFilter = $this->savedFilterRepository->create([\n            'user_id' => $userId,\n            'name' => request('name'),\n            'src' => request('src'),\n            'applied' => request('applied'),\n        ]);\n\n        Event::dispatch('datagrid.saved_filter.create.after', $savedFilter);\n\n        return response()->json([\n            'data' => $savedFilter,\n            'message' => trans('admin::app.components.datagrid.toolbar.filter.saved-success'),\n        ]);\n    }\n\n    /**\n     * Retrieves the saved filters.\n     */\n    public function get()\n    {\n        $savedFilters = $this->savedFilterRepository->findWhere([\n            'src' => request()->get('src'),\n            'user_id' => auth()->guard()->user()->id,\n        ]);\n\n        return response()->json(['data' => $savedFilters]);\n    }\n\n    /**\n     * Update the saved filter.\n     */\n    public function update(int $id)\n    {\n        $userId = auth()->guard()->user()->id;\n\n        $this->validate(request(), [\n            'name' => 'required|unique:datagrid_saved_filters,name,'.$id.',id,src,'.request('src').',user_id,'.$userId,\n        ]);\n\n        $savedFilter = $this->savedFilterRepository->findOneWhere([\n            'id' => $id,\n            'user_id' => auth()->guard()->user()->id,\n        ]);\n\n        if (! $savedFilter) {\n            return response()->json([], 404);\n        }\n\n        Event::dispatch('datagrid.saved_filter.update.before', $id);\n\n        $updatedFilter = $this->savedFilterRepository->update(request()->only([\n            'name',\n            'src',\n            'applied',\n        ]), $id);\n\n        Event::dispatch('datagrid.saved_filter.update.after', $updatedFilter);\n\n        return response()->json([\n            'data' => $updatedFilter,\n            'message' => trans('admin::app.components.datagrid.toolbar.filter.updated-success'),\n        ]);\n    }\n\n    /**\n     * Delete the saved filter.\n     */\n    public function destroy(int $id)\n    {\n        Event::dispatch('datagrid.saved_filter.delete.before', $id);\n\n        $success = $this->savedFilterRepository->deleteWhere([\n            'id' => $id,\n            'user_id' => auth()->guard()->user()->id,\n        ]);\n\n        Event::dispatch('datagrid.saved_filter.delete.after', $id);\n\n        if (! $success) {\n            return response()->json([\n                'message' => trans('admin::app.components.datagrid.toolbar.filter.delete-error'),\n            ]);\n        }\n\n        return response()->json([\n            'message' => trans('admin::app.components.datagrid.toolbar.filter.delete-success'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/DataGridController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers;\n\nuse Illuminate\\Support\\Facades\\Crypt;\n\nclass DataGridController extends Controller\n{\n    /**\n     * Look up.\n     */\n    public function lookUp()\n    {\n        /**\n         * Validation for parameters.\n         */\n        $params = $this->validate(request(), [\n            'datagrid_id' => ['required'],\n            'column' => ['required'],\n            'search' => ['required', 'min:2'],\n        ]);\n\n        /**\n         * Preparing the datagrid instance and only columns.\n         */\n        $datagrid = app(Crypt::decryptString($params['datagrid_id']));\n        $datagrid->prepareColumns();\n\n        /**\n         * Finding the first column from the collection.\n         */\n        $column = collect($datagrid->getColumns())->map(fn ($column) => $column->toArray())->where('index', $params['column'])->firstOrFail();\n\n        /**\n         * Fetching on the basis of column options.\n         */\n        return app($column['filterable_options']['repository'])\n            ->select([$column['filterable_options']['column']['label'].' as label', $column['filterable_options']['column']['value'].' as value'])\n            ->where($column['filterable_options']['column']['label'], 'LIKE', '%'.$params['search'].'%')\n            ->get();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Lead/ActivityController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Lead;\n\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\Activity\\Repositories\\ActivityRepository;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Resources\\ActivityResource;\nuse Webkul\\Email\\Repositories\\AttachmentRepository;\nuse Webkul\\Email\\Repositories\\EmailRepository;\n\nclass ActivityController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected ActivityRepository $activityRepository,\n        protected EmailRepository $emailRepository,\n        protected AttachmentRepository $attachmentRepository\n    ) {}\n\n    /**\n     * Display a listing of the resource.\n     *\n     * @param  int  $id\n     * @return Response\n     */\n    public function index($id)\n    {\n        $activities = $this->activityRepository\n            ->leftJoin('lead_activities', 'activities.id', '=', 'lead_activities.activity_id')\n            ->where('lead_activities.lead_id', $id)\n            ->get();\n\n        return ActivityResource::collection($this->concatEmailAsActivities($id, $activities));\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function concatEmailAsActivities($leadId, $activities)\n    {\n        $emails = DB::table('emails as child')\n            ->select('child.*')\n            ->join('emails as parent', 'child.parent_id', '=', 'parent.id')\n            ->where('parent.lead_id', $leadId)\n            ->union(DB::table('emails as parent')->where('parent.lead_id', $leadId))\n            ->get();\n\n        return $activities->concat($emails->map(function ($email) {\n            return (object) [\n                'id' => $email->id,\n                'parent_id' => $email->parent_id,\n                'title' => $email->subject,\n                'type' => 'email',\n                'is_done' => 1,\n                'comment' => $email->reply,\n                'schedule_from' => null,\n                'schedule_to' => null,\n                'user' => auth()->guard('user')->user(),\n                'participants' => [],\n                'location' => null,\n                'additional' => [\n                    'folders' => json_decode($email->folders),\n                    'from' => json_decode($email->from),\n                    'to' => json_decode($email->reply_to),\n                    'cc' => json_decode($email->cc),\n                    'bcc' => json_decode($email->bcc),\n                ],\n                'files' => $this->attachmentRepository->findWhere(['email_id' => $email->id])->map(function ($attachment) {\n                    return (object) [\n                        'id' => $attachment->id,\n                        'name' => $attachment->name,\n                        'path' => $attachment->path,\n                        'url' => $attachment->url,\n                        'created_at' => $attachment->created_at,\n                        'updated_at' => $attachment->updated_at,\n                    ];\n                }),\n                'created_at' => $email->created_at,\n                'updated_at' => $email->updated_at,\n            ];\n        }))->sortByDesc('id')->sortByDesc('created_at');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Lead/EmailController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Lead;\n\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Event;\nuse Webkul\\Admin\\Http\\Controllers\\Mail\\EmailController as BaseEmailController;\nuse Webkul\\Admin\\Http\\Resources\\ActivityResource;\n\nclass EmailController extends BaseEmailController\n{\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @return Response\n     */\n    public function store()\n    {\n        $response = json_decode(parent::store()->getContent(), true);\n\n        return response()->json([\n            'data' => $this->transformToActivity($response['data']),\n            'message' => $response['message'],\n        ]);\n\n        return $response;\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @param  int  $id\n     * @return Response\n     */\n    public function detach($id)\n    {\n        Event::dispatch('email.update.before', request()->input('email_id'));\n\n        $email = $this->emailRepository->update([\n            'lead_id' => null,\n        ], request()->input('email_id'));\n\n        Event::dispatch('email.update.after', $email);\n\n        return response()->json([\n            'message' => trans('admin::app.mail.update-success'),\n        ]);\n    }\n\n    /**\n     * Transform the email data to activity resource.\n     *\n     * @param  array  $data\n     * @return ActivityResource\n     */\n    public function transformToActivity($data)\n    {\n        return new ActivityResource((object) [\n            'id' => $data['id'],\n            'parent_id' => $data['parent_id'],\n            'title' => $data['subject'],\n            'type' => 'email',\n            'is_done' => 1,\n            'comment' => $data['reply'],\n            'schedule_from' => null,\n            'schedule_to' => null,\n            'user' => auth()->guard('user')->user(),\n            'participants' => [],\n            'location' => null,\n            'additional' => json_encode([\n                'folders' => $data['folders'],\n                'from' => $data['from'],\n                'to' => $data['reply_to'],\n                'cc' => $data['cc'],\n                'bcc' => $data['bcc'],\n            ]),\n            'files' => array_map(function ($attachment) {\n                return (object) $attachment;\n            }, $data['attachments']),\n            'created_at' => $data['created_at'],\n            'updated_at' => $data['updated_at'],\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Lead/LeadController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Lead;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Http\\Resources\\Json\\AnonymousResourceCollection;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Validator;\nuse Illuminate\\View\\View;\nuse Prettus\\Repository\\Criteria\\RequestCriteria;\nuse Webkul\\Admin\\DataGrids\\Lead\\LeadDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\LeadForm;\nuse Webkul\\Admin\\Http\\Requests\\MassDestroyRequest;\nuse Webkul\\Admin\\Http\\Requests\\MassUpdateRequest;\nuse Webkul\\Admin\\Http\\Resources\\LeadResource;\nuse Webkul\\Admin\\Http\\Resources\\StageResource;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\nuse Webkul\\Lead\\Helpers\\MagicAI;\nuse Webkul\\Lead\\Repositories\\LeadRepository;\nuse Webkul\\Lead\\Repositories\\PipelineRepository;\nuse Webkul\\Lead\\Repositories\\ProductRepository;\nuse Webkul\\Lead\\Repositories\\SourceRepository;\nuse Webkul\\Lead\\Repositories\\StageRepository;\nuse Webkul\\Lead\\Repositories\\TypeRepository;\nuse Webkul\\Lead\\Services\\MagicAIService;\nuse Webkul\\Tag\\Repositories\\TagRepository;\nuse Webkul\\User\\Repositories\\UserRepository;\n\nclass LeadController extends Controller\n{\n    /**\n     * Const variable for supported types.\n     */\n    const SUPPORTED_TYPES = 'pdf,bmp,jpeg,jpg,png,webp';\n\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected UserRepository $userRepository,\n        protected AttributeRepository $attributeRepository,\n        protected SourceRepository $sourceRepository,\n        protected TypeRepository $typeRepository,\n        protected PipelineRepository $pipelineRepository,\n        protected StageRepository $stageRepository,\n        protected LeadRepository $leadRepository,\n        protected ProductRepository $productRepository,\n        protected PersonRepository $personRepository\n    ) {\n        request()->request->add(['entity_type' => 'leads']);\n    }\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index()\n    {\n        if (request()->ajax()) {\n            return datagrid(LeadDataGrid::class)->process();\n        }\n\n        if (request('pipeline_id')) {\n            $pipeline = $this->pipelineRepository->find(request('pipeline_id'));\n        } else {\n            $pipeline = $this->pipelineRepository->getDefaultPipeline();\n        }\n\n        return view('admin::leads.index', [\n            'pipeline' => $pipeline,\n            'columns' => $this->getKanbanColumns(),\n        ]);\n    }\n\n    /**\n     * Returns a listing of the resource.\n     */\n    public function get(): JsonResponse\n    {\n        if (request()->query('pipeline_id')) {\n            $pipeline = $this->pipelineRepository->find(request()->query('pipeline_id'));\n        } else {\n            $pipeline = $this->pipelineRepository->getDefaultPipeline();\n        }\n\n        if ($stageId = request()->query('pipeline_stage_id')) {\n            $stages = $pipeline->stages->where('id', request()->query('pipeline_stage_id'));\n        } else {\n            $stages = $pipeline->stages;\n        }\n\n        foreach ($stages as $stage) {\n            /**\n             * We have to create a new instance of the lead repository every time, which is\n             * why we're not using the injected one.\n             */\n            $query = app(LeadRepository::class)\n                ->pushCriteria(app(RequestCriteria::class))\n                ->where([\n                    'lead_pipeline_id' => $pipeline->id,\n                    'lead_pipeline_stage_id' => $stage->id,\n                ]);\n\n            if ($userIds = bouncer()->getAuthorizedUserIds()) {\n                $query->whereIn('leads.user_id', $userIds);\n            }\n\n            $stage->lead_value = (clone $query)->sum('lead_value');\n\n            $data[$stage->sort_order] = (new StageResource($stage))->jsonSerialize();\n\n            $data[$stage->sort_order]['leads'] = [\n                'data' => LeadResource::collection($paginator = $query->with([\n                    'tags',\n                    'type',\n                    'source',\n                    'user',\n                    'person',\n                    'person.organization',\n                    'pipeline',\n                    'pipeline.stages',\n                    'stage',\n                    'attribute_values',\n                ])->paginate(10)),\n\n                'meta' => [\n                    'current_page' => $paginator->currentPage(),\n                    'from' => $paginator->firstItem(),\n                    'last_page' => $paginator->lastPage(),\n                    'per_page' => $paginator->perPage(),\n                    'to' => $paginator->lastItem(),\n                    'total' => $paginator->total(),\n                ],\n            ];\n        }\n\n        return response()->json($data);\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function create(): View\n    {\n        return view('admin::leads.create');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(LeadForm $request): RedirectResponse|JsonResponse\n    {\n        Event::dispatch('lead.create.before');\n\n        $data = request()->all();\n\n        $data['status'] = 1;\n\n        if (! empty($data['lead_pipeline_stage_id'])) {\n            $stage = $this->stageRepository->findOrFail($data['lead_pipeline_stage_id']);\n\n            $data['lead_pipeline_id'] = $stage->lead_pipeline_id;\n        } else {\n            if (empty($data['lead_pipeline_id'])) {\n                $pipeline = $this->pipelineRepository->getDefaultPipeline();\n\n                $data['lead_pipeline_id'] = $pipeline->id;\n            } else {\n                $pipeline = $this->pipelineRepository->findOrFail($data['lead_pipeline_id']);\n            }\n\n            $stage = $pipeline->stages()->first();\n\n            $data['lead_pipeline_stage_id'] = $stage->id;\n        }\n\n        if (in_array($stage->code, ['won', 'lost'])) {\n            $data['closed_at'] = Carbon::now();\n        }\n\n        $lead = $this->leadRepository->create($data);\n\n        if (request()->ajax()) {\n            return response()->json([\n                'message' => trans('admin::app.leads.create-success'),\n                'data' => new LeadResource($lead),\n            ]);\n        }\n\n        Event::dispatch('lead.create.after', $lead);\n\n        session()->flash('success', trans('admin::app.leads.create-success'));\n\n        if (! empty($data['lead_pipeline_id'])) {\n            $params['pipeline_id'] = $data['lead_pipeline_id'];\n        }\n\n        return redirect()->route('admin.leads.index', $params ?? []);\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     */\n    public function edit(int $id): View\n    {\n        $lead = $this->leadRepository->findOrFail($id);\n\n        return view('admin::leads.edit', compact('lead'));\n    }\n\n    /**\n     * Display a resource.\n     */\n    public function view(int $id)\n    {\n        $lead = $this->leadRepository->findOrFail($id);\n\n        $userIds = bouncer()->getAuthorizedUserIds();\n\n        if (\n            $userIds\n            && ! in_array($lead->user_id, $userIds)\n        ) {\n            return redirect()->route('admin.leads.index');\n        }\n\n        return view('admin::leads.view', compact('lead'));\n    }\n\n    /**\n     * Update the specified resource in storage.\n     */\n    public function update(LeadForm $request, int $id): RedirectResponse|JsonResponse\n    {\n        Event::dispatch('lead.update.before', $id);\n\n        $data = $request->all();\n\n        if (isset($data['lead_pipeline_stage_id'])) {\n            $stage = $this->stageRepository->findOrFail($data['lead_pipeline_stage_id']);\n\n            $data['lead_pipeline_id'] = $stage->lead_pipeline_id;\n        } else {\n            $pipeline = $this->pipelineRepository->getDefaultPipeline();\n\n            $stage = $pipeline->stages()->first();\n\n            $data['lead_pipeline_id'] = $pipeline->id;\n\n            $data['lead_pipeline_stage_id'] = $stage->id;\n        }\n\n        $lead = $this->leadRepository->update($data, $id);\n\n        Event::dispatch('lead.update.after', $lead);\n\n        if (request()->ajax()) {\n            return response()->json([\n                'message' => trans('admin::app.leads.update-success'),\n            ]);\n        }\n\n        session()->flash('success', trans('admin::app.leads.update-success'));\n\n        if (request()->has('closed_at')) {\n            return redirect()->back();\n        } else {\n            return redirect()->route('admin.leads.index', $data['lead_pipeline_id']);\n        }\n    }\n\n    /**\n     * Update the lead attributes.\n     */\n    public function updateAttributes(int $id)\n    {\n        $data = request()->all();\n\n        $attributes = $this->attributeRepository->findWhere([\n            'entity_type' => 'leads',\n            ['code', 'NOTIN', ['title', 'description']],\n        ]);\n\n        Event::dispatch('lead.update.before', $id);\n\n        $lead = $this->leadRepository->update($data, $id, $attributes);\n\n        Event::dispatch('lead.update.after', $lead);\n\n        return response()->json([\n            'message' => trans('admin::app.leads.update-success'),\n        ]);\n    }\n\n    /**\n     * Update the lead stage.\n     */\n    public function updateStage(int $id)\n    {\n        $this->validate(request(), [\n            'lead_pipeline_stage_id' => 'required',\n        ]);\n\n        $lead = $this->leadRepository->findOrFail($id);\n\n        $stage = $lead->pipeline->stages()\n            ->where('id', request()->input('lead_pipeline_stage_id'))\n            ->firstOrFail();\n\n        Event::dispatch('lead.update.before', $id);\n\n        $payload = request()->merge([\n            'entity_type' => 'leads',\n            'lead_pipeline_stage_id' => $stage->id,\n        ])->only([\n            'closed_at',\n            'lost_reason',\n            'lead_pipeline_stage_id',\n            'entity_type',\n        ]);\n\n        $lead = $this->leadRepository->update($payload, $id, ['lead_pipeline_stage_id']);\n\n        Event::dispatch('lead.update.after', $lead);\n\n        return response()->json([\n            'message' => trans('admin::app.leads.update-success'),\n        ]);\n    }\n\n    /**\n     * Search person results.\n     */\n    public function search(): AnonymousResourceCollection\n    {\n        if ($userIds = bouncer()->getAuthorizedUserIds()) {\n            $results = $this->leadRepository\n                ->pushCriteria(app(RequestCriteria::class))\n                ->findWhereIn('user_id', $userIds);\n        } else {\n            $results = $this->leadRepository\n                ->pushCriteria(app(RequestCriteria::class))\n                ->all();\n        }\n\n        return LeadResource::collection($results);\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $this->leadRepository->findOrFail($id);\n\n        try {\n            Event::dispatch('lead.delete.before', $id);\n\n            $this->leadRepository->delete($id);\n\n            Event::dispatch('lead.delete.after', $id);\n\n            return response()->json([\n                'message' => trans('admin::app.leads.destroy-success'),\n            ]);\n        } catch (\\Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.leads.destroy-failed'),\n            ], 400);\n        }\n    }\n\n    /**\n     * Mass update the specified resources.\n     */\n    public function massUpdate(MassUpdateRequest $massUpdateRequest): JsonResponse\n    {\n        $leads = $this->leadRepository->findWhereIn('id', $massUpdateRequest->input('indices'));\n\n        try {\n            foreach ($leads as $lead) {\n                Event::dispatch('lead.update.before', $lead->id);\n\n                $lead = $this->leadRepository->find($lead->id);\n\n                $lead?->update(['lead_pipeline_stage_id' => $massUpdateRequest->input('value')]);\n\n                Event::dispatch('lead.update.before', $lead->id);\n            }\n\n            return response()->json([\n                'message' => trans('admin::app.leads.update-success'),\n            ]);\n        } catch (\\Exception $th) {\n            return response()->json([\n                'message' => trans('admin::app.leads.update-failed'),\n            ], 400);\n        }\n    }\n\n    /**\n     * Mass delete the specified resources.\n     */\n    public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse\n    {\n        $leads = $this->leadRepository->findWhereIn('id', $massDestroyRequest->input('indices'));\n\n        try {\n            foreach ($leads as $lead) {\n                Event::dispatch('lead.delete.before', $lead->id);\n\n                $this->leadRepository->delete($lead->id);\n\n                Event::dispatch('lead.delete.after', $lead->id);\n            }\n\n            return response()->json([\n                'message' => trans('admin::app.leads.destroy-success'),\n            ]);\n        } catch (\\Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.leads.destroy-failed'),\n            ]);\n        }\n    }\n\n    /**\n     * Attach product to lead.\n     */\n    public function addProduct(int $leadId): JsonResponse\n    {\n        $product = $this->productRepository->updateOrCreate(\n            [\n                'lead_id' => $leadId,\n                'product_id' => request()->input('product_id'),\n            ],\n            array_merge(\n                request()->all(),\n                [\n                    'lead_id' => $leadId,\n                    'amount' => request()->input('price') * request()->input('quantity'),\n                ],\n            )\n        );\n\n        return response()->json([\n            'data' => $product,\n            'message' => trans('admin::app.leads.update-success'),\n        ]);\n    }\n\n    /**\n     * Remove product attached to lead.\n     */\n    public function removeProduct(int $id): JsonResponse\n    {\n        try {\n            Event::dispatch('lead.product.delete.before', $id);\n\n            $this->productRepository->deleteWhere([\n                'lead_id' => $id,\n                'product_id' => request()->input('product_id'),\n            ]);\n\n            Event::dispatch('lead.product.delete.after', $id);\n\n            return response()->json([\n                'message' => trans('admin::app.leads.destroy-success'),\n            ]);\n        } catch (\\Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.leads.destroy-failed'),\n            ]);\n        }\n    }\n\n    /**\n     * Kanban lookup.\n     */\n    public function kanbanLookup()\n    {\n        $params = $this->validate(request(), [\n            'column' => ['required'],\n            'search' => ['required', 'min:2'],\n        ]);\n\n        /**\n         * Finding the first column from the collection.\n         */\n        $column = collect($this->getKanbanColumns())->where('index', $params['column'])->firstOrFail();\n\n        /**\n         * Fetching on the basis of column options.\n         */\n        return app($column['filterable_options']['repository'])\n            ->select([$column['filterable_options']['column']['label'].' as label', $column['filterable_options']['column']['value'].' as value'])\n            ->where($column['filterable_options']['column']['label'], 'LIKE', '%'.$params['search'].'%')\n            ->get()\n            ->map\n            ->only('label', 'value');\n    }\n\n    /**\n     * Get columns for the kanban view.\n     */\n    private function getKanbanColumns(): array\n    {\n        return [\n            [\n                'index' => 'id',\n                'label' => trans('admin::app.leads.index.kanban.columns.id'),\n                'type' => 'integer',\n                'searchable' => false,\n                'search_field' => 'in',\n                'filterable' => true,\n                'filterable_type' => null,\n                'filterable_options' => [],\n                'allow_multiple_values' => true,\n                'sortable' => true,\n                'visibility' => true,\n            ],\n            [\n                'index' => 'lead_value',\n                'label' => trans('admin::app.leads.index.kanban.columns.lead-value'),\n                'type' => 'string',\n                'searchable' => false,\n                'search_field' => 'in',\n                'filterable' => true,\n                'filterable_type' => null,\n                'filterable_options' => [],\n                'allow_multiple_values' => true,\n                'sortable' => true,\n                'visibility' => true,\n            ],\n            [\n                'index' => 'user_id',\n                'label' => trans('admin::app.leads.index.kanban.columns.sales-person'),\n                'type' => 'string',\n                'searchable' => false,\n                'search_field' => 'in',\n                'filterable' => true,\n                'filterable_type' => 'searchable_dropdown',\n                'filterable_options' => [\n                    'repository' => UserRepository::class,\n                    'column' => [\n                        'label' => 'name',\n                        'value' => 'id',\n                    ],\n                ],\n                'allow_multiple_values' => true,\n                'sortable' => true,\n                'visibility' => true,\n            ],\n            [\n                'index' => 'person.id',\n                'label' => trans('admin::app.leads.index.kanban.columns.contact-person'),\n                'type' => 'string',\n                'searchable' => false,\n                'search_field' => 'in',\n                'filterable' => true,\n                'filterable_options' => [],\n                'allow_multiple_values' => true,\n                'sortable' => true,\n                'visibility' => true,\n                'filterable_type' => 'searchable_dropdown',\n                'filterable_options' => [\n                    'repository' => PersonRepository::class,\n                    'column' => [\n                        'label' => 'name',\n                        'value' => 'id',\n                    ],\n                ],\n            ],\n            [\n                'index' => 'lead_type_id',\n                'label' => trans('admin::app.leads.index.kanban.columns.lead-type'),\n                'type' => 'string',\n                'searchable' => false,\n                'search_field' => 'in',\n                'filterable' => true,\n                'filterable_type' => 'dropdown',\n                'filterable_options' => $this->typeRepository->all(['name as label', 'id as value'])->toArray(),\n                'allow_multiple_values' => true,\n                'sortable' => true,\n                'visibility' => true,\n            ],\n            [\n                'index' => 'lead_source_id',\n                'label' => trans('admin::app.leads.index.kanban.columns.source'),\n                'type' => 'string',\n                'searchable' => false,\n                'search_field' => 'in',\n                'filterable' => true,\n                'filterable_type' => 'dropdown',\n                'filterable_options' => $this->sourceRepository->all(['name as label', 'id as value'])->toArray(),\n                'allow_multiple_values' => true,\n                'sortable' => true,\n                'visibility' => true,\n            ],\n            [\n                'index' => 'tags.name',\n                'label' => trans('admin::app.leads.index.kanban.columns.tags'),\n                'type' => 'string',\n                'searchable' => false,\n                'search_field' => 'in',\n                'filterable' => true,\n                'filterable_options' => [],\n                'allow_multiple_values' => true,\n                'sortable' => true,\n                'visibility' => true,\n                'filterable_type' => 'searchable_dropdown',\n                'filterable_options' => [\n                    'repository' => TagRepository::class,\n                    'column' => [\n                        'label' => 'name',\n                        'value' => 'name',\n                    ],\n                ],\n            ],\n        ];\n    }\n\n    /**\n     * Create lead with specified AI.\n     */\n    public function createByAI()\n    {\n        $leadData = [];\n\n        $errorMessages = [];\n\n        foreach (request()->file('files') as $file) {\n            $lead = $this->processFile($file);\n\n            if (\n                isset($lead['status'])\n                && $lead['status'] === 'error'\n            ) {\n                $errorMessages[] = $lead['message'];\n            } else {\n                $leadData[] = $lead;\n            }\n        }\n\n        if (isset($errorMessages[0]['code'])) {\n            return response()->json(MagicAI::errorHandler($errorMessages[0]['message']));\n        }\n\n        if (\n            empty($leadData)\n            && ! empty($errorMessages)\n        ) {\n            return response()->json(MagicAI::errorHandler(implode(', ', $errorMessages)), 400);\n        }\n\n        if (empty($leadData)) {\n            return response()->json(MagicAI::errorHandler(trans('admin::app.leads.no-valid-files')), 400);\n        }\n\n        return response()->json([\n            'message' => trans('admin::app.leads.create-success'),\n            'leads' => $this->createLeads($leadData),\n        ]);\n    }\n\n    /**\n     * Process file.\n     *\n     * @param  mixed  $file\n     */\n    private function processFile($file)\n    {\n        $validator = Validator::make(\n            ['file' => $file],\n            ['file' => 'required|extensions:'.str_replace(' ', '', self::SUPPORTED_TYPES)]\n        );\n\n        if ($validator->fails()) {\n            return MagicAI::errorHandler($validator->errors()->first());\n        }\n\n        $base64Pdf = base64_encode(file_get_contents($file->getRealPath()));\n\n        $extractedData = MagicAIService::extractDataFromFile($base64Pdf);\n\n        $lead = MagicAI::mapAIDataToLead($extractedData);\n\n        return $lead;\n    }\n\n    /**\n     * Create multiple leads.\n     */\n    private function createLeads($rawLeads): array\n    {\n        $leads = [];\n\n        foreach ($rawLeads as $rawLead) {\n            Event::dispatch('lead.create.before');\n\n            foreach ($rawLead['person']['emails'] as $email) {\n                $person = $this->personRepository\n                    ->whereJsonContains('emails', [['value' => $email['value']]])\n                    ->first();\n\n                if ($person) {\n                    $rawLead['person']['id'] = $person->id;\n\n                    break;\n                }\n            }\n\n            $pipeline = $this->pipelineRepository->getDefaultPipeline();\n\n            $stage = $pipeline->stages()->first();\n\n            $lead = $this->leadRepository->create(array_merge($rawLead, [\n                'lead_pipeline_id' => $pipeline->id,\n                'lead_pipeline_stage_id' => $stage->id,\n            ]));\n\n            Event::dispatch('lead.create.after', $lead);\n\n            $leads[] = $lead;\n        }\n\n        return $leads;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Lead/QuoteController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Lead;\n\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Event;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Lead\\Repositories\\LeadRepository;\nuse Webkul\\Quote\\Repositories\\QuoteRepository;\n\nclass QuoteController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected LeadRepository $leadRepository,\n        protected QuoteRepository $quoteRepository\n    ) {}\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @param  int  $id\n     * @return Response\n     */\n    public function store($id)\n    {\n        Event::dispatch('leads.quote.create.before');\n\n        $lead = $this->leadRepository->find($id);\n\n        if (! $lead->quotes->contains(request('id'))) {\n            $lead->quotes()->attach(request('id'));\n        }\n\n        Event::dispatch('leads.quote.create.after', $lead);\n\n        return response()->json([\n            'message' => trans('admin::app.leads.quote-create-success'),\n        ], 200);\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     *\n     * @param  int  $leadId\n     * @param  int  $tagId\n     * @return Response\n     */\n    public function delete($leadId)\n    {\n        Event::dispatch('leads.quote.delete.before', $leadId);\n\n        $lead = $this->leadRepository->find($leadId);\n\n        $lead->quotes()->detach(request('quote_id'));\n\n        Event::dispatch('leads.quote.delete.after', $lead);\n\n        return response()->json([\n            'message' => trans('admin::app.leads.view.quotes.destroy-success'),\n        ], 200);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Lead/TagController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Lead;\n\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Event;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Lead\\Repositories\\LeadRepository;\n\nclass TagController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected LeadRepository $leadRepository) {}\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @param  int  $id\n     * @return Response\n     */\n    public function attach($id)\n    {\n        Event::dispatch('leads.tag.create.before', $id);\n\n        $lead = $this->leadRepository->find($id);\n\n        if (! $lead->tags->contains(request()->input('tag_id'))) {\n            $lead->tags()->attach(request()->input('tag_id'));\n        }\n\n        Event::dispatch('leads.tag.create.after', $lead);\n\n        return response()->json([\n            'message' => trans('admin::app.leads.view.tags.create-success'),\n        ]);\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     *\n     * @param  int  $leadId\n     * @return Response\n     */\n    public function detach($leadId)\n    {\n        Event::dispatch('leads.tag.delete.before', $leadId);\n\n        $lead = $this->leadRepository->find($leadId);\n\n        $lead->tags()->detach(request()->input('tag_id'));\n\n        Event::dispatch('leads.tag.delete.after', $lead);\n\n        return response()->json([\n            'message' => trans('admin::app.leads.view.tags.destroy-success'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Mail/EmailController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Mail;\n\nuse Exception;\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Mail;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\DataGrids\\Mail\\EmailDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\MassDestroyRequest;\nuse Webkul\\Admin\\Http\\Requests\\MassUpdateRequest;\nuse Webkul\\Admin\\Http\\Resources\\EmailResource;\nuse Webkul\\Email\\Enums\\SupportedFolderEnum;\nuse Webkul\\Email\\InboundEmailProcessor\\Contracts\\InboundEmailProcessor;\nuse Webkul\\Email\\Mails\\Email;\nuse Webkul\\Email\\Repositories\\AttachmentRepository;\nuse Webkul\\Email\\Repositories\\EmailRepository;\nuse Webkul\\Lead\\Repositories\\LeadRepository;\n\nclass EmailController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected LeadRepository $leadRepository,\n        protected EmailRepository $emailRepository,\n        protected AttachmentRepository $attachmentRepository\n    ) {}\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index(): View|JsonResponse|RedirectResponse\n    {\n        $route = request('route');\n\n        if (! $route) {\n            return redirect()->route('admin.mail.index', ['route' => SupportedFolderEnum::INBOX->value]);\n        }\n\n        if (! bouncer()->hasPermission('mail.'.$route)) {\n            abort(401, trans('admin::app.mail.unauthorized'));\n        }\n\n        if (request()->ajax()) {\n            return datagrid(EmailDataGrid::class)->process();\n        }\n\n        return view('admin::mail.index', compact('route'));\n    }\n\n    /**\n     * Display a resource.\n     *\n     * @return View\n     */\n    public function view()\n    {\n        $route = request('route');\n\n        $email = $this->emailRepository\n            ->with([\n                'emails',\n                'attachments',\n                'emails.attachments',\n                'lead',\n                'lead.person',\n                'lead.tags',\n                'lead.source',\n                'lead.type',\n                'person',\n            ])\n            ->findOrFail(request('id'));\n\n        if ($userIds = bouncer()->getAuthorizedUserIds()) {\n            $results = $this->leadRepository->findWhere([\n                ['id', '=', $email->lead_id],\n                ['user_id', 'IN', $userIds],\n            ]);\n        } else {\n            $results = $this->leadRepository->findWhere([\n                ['id', '=', $email->lead_id],\n            ]);\n        }\n\n        if (empty($results->toArray())) {\n            unset($email->lead_id);\n        }\n\n        if ($route == SupportedFolderEnum::DRAFT->value) {\n            return response()->json([\n                'data' => new EmailResource($email),\n            ]);\n        }\n\n        return view('admin::mail.view', compact('email', 'route'));\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @return Response\n     */\n    public function store()\n    {\n        $this->validate(request(), [\n            'reply_to' => 'required|array|min:1',\n            'reply_to.*' => 'email',\n            'reply' => 'required',\n        ]);\n\n        Event::dispatch('email.create.before');\n\n        $email = $this->emailRepository->create(request()->all());\n\n        if (! request('is_draft')) {\n            try {\n                Mail::send(new Email($email));\n\n                $this->emailRepository->update([\n                    'folders' => [SupportedFolderEnum::SENT->value],\n                ], $email->id);\n            } catch (Exception $e) {\n            }\n        }\n\n        Event::dispatch('email.create.after', $email);\n\n        if (request()->ajax()) {\n            return response()->json([\n                'data' => new EmailResource($email),\n                'message' => trans('admin::app.mail.create-success'),\n            ]);\n        }\n\n        if (request('is_draft')) {\n            session()->flash('success', trans('admin::app.mail.saved-to-draft'));\n\n            return redirect()->route('admin.mail.index', ['route' => SupportedFolderEnum::DRAFT->value]);\n        }\n\n        session()->flash('success', trans('admin::app.mail.create-success'));\n\n        return redirect()->route('admin.mail.index', ['route' => SupportedFolderEnum::SENT->value]);\n    }\n\n    /**\n     * Update the specified resource in storage.\n     *\n     * @param  int  $id\n     * @return Response\n     */\n    public function update($id)\n    {\n        Event::dispatch('email.update.before', $id);\n\n        $data = request()->all();\n\n        if (! is_null(request('is_draft'))) {\n            $data['folders'] = request('is_draft') ? [SupportedFolderEnum::DRAFT->value] : [SupportedFolderEnum::OUTBOX->value];\n        }\n\n        $email = $this->emailRepository->update($data, request('id') ?? $id);\n\n        Event::dispatch('email.update.after', $email);\n\n        if (! is_null(request('is_draft')) && ! request('is_draft')) {\n            try {\n                Mail::send(new Email($email));\n\n                $this->emailRepository->update([\n                    'folders' => [SupportedFolderEnum::INBOX->value, SupportedFolderEnum::SENT->value],\n                ], $email->id);\n            } catch (Exception $e) {\n            }\n        }\n\n        if (! is_null(request('is_draft'))) {\n            if (request('is_draft')) {\n                session()->flash('success', trans('admin::app.mail.saved-to-draft'));\n\n                return redirect()->route('admin.mail.index', ['route' => SupportedFolderEnum::DRAFT->value]);\n            } else {\n                session()->flash('success', trans('admin::app.mail.create-success'));\n\n                return redirect()->route('admin.mail.index', ['route' => SupportedFolderEnum::INBOX->value]);\n            }\n        }\n\n        if (request()->ajax()) {\n            return response()->json([\n                'data' => new EmailResource($email->refresh()),\n                'message' => trans('admin::app.mail.update-success'),\n            ]);\n        }\n\n        session()->flash('success', trans('admin::app.mail.update-success'));\n\n        return redirect()->back();\n    }\n\n    /**\n     * Run process inbound parse email.\n     *\n     * @return Response\n     */\n    public function inboundParse(InboundEmailProcessor $inboundEmailProcessor)\n    {\n        $inboundEmailProcessor->processMessage(request('email'));\n\n        return response()->json([], 200);\n    }\n\n    /**\n     * Download file from storage\n     *\n     * @param  int  $id\n     * @return View\n     */\n    public function download($id)\n    {\n        $attachment = $this->attachmentRepository->findOrFail($id);\n\n        try {\n            return Storage::download($attachment->path);\n        } catch (Exception $e) {\n            session()->flash('error', $e->getMessage());\n\n            return redirect()->back();\n        }\n    }\n\n    /**\n     * Mass Update the specified resources.\n     */\n    public function massUpdate(MassUpdateRequest $massUpdateRequest): JsonResponse\n    {\n        $emails = $this->emailRepository->findWhereIn('id', $massUpdateRequest->input('indices'));\n\n        try {\n            foreach ($emails as $email) {\n                Event::dispatch('email.update.before', $email->id);\n\n                $this->emailRepository->update([\n                    'folders' => request('folders'),\n                ], $email->id);\n\n                Event::dispatch('email.update.after', $email->id);\n            }\n\n            return response()->json([\n                'message' => trans('admin::app.mail.mass-update-success'),\n            ]);\n        } catch (Exception) {\n            return response()->json([\n                'message' => trans('admin::app.mail.mass-update-success'),\n            ], 400);\n        }\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function destroy(int $id): JsonResponse|RedirectResponse\n    {\n        $email = $this->emailRepository->findOrFail($id);\n\n        try {\n            Event::dispatch('email.'.request('type').'.before', $id);\n\n            $parentId = $email->parent_id;\n\n            if (request('type') == SupportedFolderEnum::TRASH->value) {\n                $this->emailRepository->update([\n                    'folders' => [SupportedFolderEnum::TRASH->value],\n                ], $id);\n            } else {\n                $this->emailRepository->delete($id);\n            }\n\n            Event::dispatch('email.'.request('type').'.after', $id);\n\n            if (request()->ajax()) {\n                return response()->json([\n                    'message' => trans('admin::app.mail.delete-success'),\n                ], 200);\n            }\n\n            session()->flash('success', trans('admin::app.mail.delete-success'));\n\n            if ($parentId) {\n                return redirect()->back();\n            }\n\n            return redirect()->route('admin.mail.index', ['route' => SupportedFolderEnum::INBOX->value]);\n        } catch (Exception $exception) {\n            if (request()->ajax()) {\n                return response()->json([\n                    'message' => trans('admin::app.mail.delete-failed'),\n                ], 400);\n            }\n\n            session()->flash('error', trans('admin::app.mail.delete-failed'));\n\n            return redirect()->back();\n        }\n    }\n\n    /**\n     * Mass Delete the specified resources.\n     */\n    public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse\n    {\n        $mails = $this->emailRepository->findWhereIn('id', $massDestroyRequest->input('indices'));\n\n        try {\n            foreach ($mails as $email) {\n                Event::dispatch('email.'.$massDestroyRequest->input('type').'.before', $email->id);\n\n                if ($massDestroyRequest->input('type') == SupportedFolderEnum::TRASH->value) {\n                    $this->emailRepository->update(['folders' => [SupportedFolderEnum::TRASH->value]], $email->id);\n                } else {\n                    $this->emailRepository->delete($email->id);\n                }\n\n                Event::dispatch('email.'.$massDestroyRequest->input('type').'.after', $email->id);\n            }\n\n            return response()->json([\n                'message' => trans('admin::app.mail.delete-success'),\n            ]);\n        } catch (Exception $e) {\n            return response()->json([\n                'message' => trans('admin::app.mail.delete-success'),\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Mail/TagController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Mail;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Email\\Repositories\\EmailRepository;\n\nclass TagController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected EmailRepository $emailRepository) {}\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function attach(int $id): JsonResponse\n    {\n        Event::dispatch('mails.tag.create.before', $id);\n\n        $mail = $this->emailRepository->find($id);\n\n        if (! $mail->tags->contains(request()->input('tag_id'))) {\n            $mail->tags()->attach(request()->input('tag_id'));\n        }\n\n        Event::dispatch('mails.tag.create.after', $mail);\n\n        return response()->json([\n            'message' => trans('admin::app.mail.view.tags.create-success'),\n        ]);\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function detach(int $mailId): JsonResponse\n    {\n        Event::dispatch('mails.tag.delete.before', $mailId);\n\n        $mail = $this->emailRepository->find($mailId);\n\n        $mail->tags()->detach(request()->input('tag_id'));\n\n        Event::dispatch('mails.tag.delete.after', $mail);\n\n        return response()->json([\n            'message' => trans('admin::app.mail.view.tags.destroy-success'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Products/ActivityController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Products;\n\nuse Illuminate\\Http\\Response;\nuse Webkul\\Activity\\Repositories\\ActivityRepository;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Resources\\ActivityResource;\nuse Webkul\\Email\\Repositories\\EmailRepository;\n\nclass ActivityController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected ActivityRepository $activityRepository,\n        protected EmailRepository $emailRepository\n    ) {}\n\n    /**\n     * Display a listing of the resource.\n     *\n     * @param  int  $id\n     * @return Response\n     */\n    public function index($id)\n    {\n        $activities = $this->activityRepository\n            ->leftJoin('product_activities', 'activities.id', '=', 'product_activities.activity_id')\n            ->where('product_activities.product_id', $id)\n            ->get();\n\n        return ActivityResource::collection($this->concatEmail($activities));\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function concatEmail($activities)\n    {\n        return $activities->sortByDesc('id')->sortByDesc('created_at');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Products/ProductController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Products;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Prettus\\Repository\\Criteria\\RequestCriteria;\nuse Webkul\\Admin\\DataGrids\\Product\\ProductDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\AttributeForm;\nuse Webkul\\Admin\\Http\\Requests\\MassDestroyRequest;\nuse Webkul\\Admin\\Http\\Resources\\ProductResource;\nuse Webkul\\Product\\Repositories\\ProductRepository;\n\nclass ProductController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected ProductRepository $productRepository)\n    {\n        request()->request->add(['entity_type' => 'products']);\n    }\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(ProductDataGrid::class)->process();\n        }\n\n        return view('admin::products.index');\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function create(): View\n    {\n        return view('admin::products.create');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @return Response\n     */\n    public function store(AttributeForm $request)\n    {\n        Event::dispatch('product.create.before');\n\n        $product = $this->productRepository->create($request->all());\n\n        Event::dispatch('product.create.after', $product);\n\n        session()->flash('success', trans('admin::app.products.index.create-success'));\n\n        return redirect()->route('admin.products.index');\n    }\n\n    /**\n     * Show the form for viewing the specified resource.\n     */\n    public function view(int $id): View\n    {\n        $product = $this->productRepository->findOrFail($id);\n\n        return view('admin::products.view', compact('product'));\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     */\n    public function edit(int $id): View|JsonResponse\n    {\n        $product = $this->productRepository->findOrFail($id);\n\n        $inventories = $product->inventories()\n            ->with('location')\n            ->get()\n            ->map(function ($inventory) {\n                return [\n                    'id' => $inventory->id,\n                    'name' => $inventory->location->name,\n                    'warehouse_id' => $inventory->warehouse_id,\n                    'warehouse_location_id' => $inventory->warehouse_location_id,\n                    'in_stock' => $inventory->in_stock,\n                    'allocated' => $inventory->allocated,\n                ];\n            });\n\n        return view('admin::products.edit', compact('product', 'inventories'));\n    }\n\n    /**\n     * Update the specified resource in storage.\n     */\n    public function update(AttributeForm $request, int $id)\n    {\n        Event::dispatch('product.update.before', $id);\n\n        $product = $this->productRepository->update($request->all(), $id);\n\n        Event::dispatch('product.update.after', $product);\n\n        if (request()->ajax()) {\n            return response()->json([\n                'message' => trans('admin::app.products.index.update-success'),\n            ]);\n        }\n\n        session()->flash('success', trans('admin::app.products.index.update-success'));\n\n        return redirect()->route('admin.products.index');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function storeInventories(int $id, ?int $warehouseId = null): JsonResponse\n    {\n        $this->validate(request(), [\n            'inventories' => 'array',\n            'inventories.*.warehouse_location_id' => 'required',\n            'inventories.*.warehouse_id' => 'required',\n            'inventories.*.in_stock' => 'required|integer|min:0',\n            'inventories.*.allocated' => 'required|integer|min:0',\n        ]);\n\n        $product = $this->productRepository->findOrFail($id);\n\n        Event::dispatch('product.update.before', $id);\n\n        $this->productRepository->saveInventories(request()->all(), $id, $warehouseId);\n\n        Event::dispatch('product.update.after', $product);\n\n        return new JsonResponse([\n            'message' => trans('admin::app.products.index.update-success'),\n        ], 200);\n    }\n\n    /**\n     * Search product results\n     */\n    public function search(): JsonResource\n    {\n        $products = $this->productRepository\n            ->pushCriteria(app(RequestCriteria::class))\n            ->orderBy('created_at', 'desc')\n            ->get();\n\n        return ProductResource::collection($products);\n    }\n\n    /**\n     * Returns product inventories grouped by warehouse.\n     */\n    public function warehouses(int $id): JsonResponse\n    {\n        $warehouses = $this->productRepository->getInventoriesGroupedByWarehouse($id);\n\n        return response()->json(array_values($warehouses));\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $product = $this->productRepository->findOrFail($id);\n\n        try {\n            Event::dispatch('settings.products.delete.before', $id);\n\n            $product->delete($id);\n\n            Event::dispatch('settings.products.delete.after', $id);\n\n            return new JsonResponse([\n                'message' => trans('admin::app.products.index.delete-success'),\n            ], 200);\n        } catch (\\Exception $exception) {\n            return new JsonResponse([\n                'message' => trans('admin::app.products.index.delete-failed'),\n            ], 400);\n        }\n    }\n\n    /**\n     * Mass Delete the specified resources.\n     */\n    public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse\n    {\n        $indices = $massDestroyRequest->input('indices');\n\n        foreach ($indices as $index) {\n            Event::dispatch('product.delete.before', $index);\n\n            $this->productRepository->delete($index);\n\n            Event::dispatch('product.delete.after', $index);\n        }\n\n        return new JsonResponse([\n            'message' => trans('admin::app.products.index.delete-success'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Products/TagController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Products;\n\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Event;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Product\\Repositories\\ProductRepository;\n\nclass TagController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected ProductRepository $productRepository) {}\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @param  int  $id\n     * @return Response\n     */\n    public function attach($id)\n    {\n        Event::dispatch('products.tag.create.before', $id);\n\n        $product = $this->productRepository->findOrFail($id);\n\n        if (! $product->tags->contains(request()->input('tag_id'))) {\n            $product->tags()->attach(request()->input('tag_id'));\n        }\n\n        Event::dispatch('products.tag.create.after', $product);\n\n        return response()->json([\n            'message' => trans('admin::app.leads.view.tags.create-success'),\n        ]);\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     *\n     * @param  int  $productId\n     * @return Response\n     */\n    public function detach($productId)\n    {\n        Event::dispatch('products.tag.delete.before', $productId);\n\n        $product = $this->productRepository->find($productId);\n\n        $product->tags()->detach(request()->input('tag_id'));\n\n        Event::dispatch('products.tag.delete.after', $product);\n\n        return response()->json([\n            'message' => trans('admin::app.leads.view.tags.destroy-success'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Quote/QuoteController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Quote;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Http\\Resources\\Json\\AnonymousResourceCollection;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Prettus\\Repository\\Criteria\\RequestCriteria;\nuse Symfony\\Component\\HttpFoundation\\StreamedResponse;\nuse Webkul\\Admin\\DataGrids\\Quote\\QuoteDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\AttributeForm;\nuse Webkul\\Admin\\Http\\Requests\\MassDestroyRequest;\nuse Webkul\\Admin\\Http\\Resources\\QuoteResource;\nuse Webkul\\Core\\Traits\\PDFHandler;\nuse Webkul\\Lead\\Repositories\\LeadRepository;\nuse Webkul\\Quote\\Repositories\\QuoteRepository;\n\nclass QuoteController extends Controller\n{\n    use PDFHandler;\n\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected QuoteRepository $quoteRepository,\n        protected LeadRepository $leadRepository\n    ) {\n        request()->request->add(['entity_type' => 'quotes']);\n    }\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(QuoteDataGrid::class)->process();\n        }\n\n        return view('admin::quotes.index');\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function create(): View\n    {\n        $lead = $this->leadRepository->find(request('id'));\n\n        return view('admin::quotes.create', compact('lead'));\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(AttributeForm $request): RedirectResponse\n    {\n        $this->additionalValidation();\n        Event::dispatch('quote.create.before');\n\n        $quote = $this->quoteRepository->create($request->all());\n\n        $leadId = request('lead_id');\n\n        if ($leadId) {\n            $lead = $this->leadRepository->find($leadId);\n\n            $lead->quotes()->attach($quote->id);\n        }\n\n        Event::dispatch('quote.create.after', $quote);\n\n        session()->flash('success', trans('admin::app.quotes.index.create-success'));\n\n        return request()->query('from') === 'lead' && $leadId\n            ? redirect()->route('admin.leads.view', ['id' => $leadId, 'from' => 'quotes'])\n            : redirect()->route('admin.quotes.index');\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     */\n    public function edit(int $id): View\n    {\n        $quote = $this->quoteRepository->findOrFail($id);\n\n        return view('admin::quotes.edit', compact('quote'));\n    }\n\n    /**\n     * Update the specified resource in storage.\n     */\n    public function update(AttributeForm $request, int $id): RedirectResponse\n    {\n        $this->additionalValidation();\n        Event::dispatch('quote.update.before', $id);\n\n        $quote = $this->quoteRepository->update($request->all(), $id);\n\n        $quote->leads()->detach();\n\n        $leadId = request('lead_id');\n\n        if ($leadId) {\n            $lead = $this->leadRepository->find($leadId);\n\n            $lead->quotes()->attach($quote->id);\n        }\n\n        Event::dispatch('quote.update.after', $quote);\n\n        session()->flash('success', trans('admin::app.quotes.index.update-success'));\n\n        return request()->query('from') === 'lead' && $leadId\n            ? redirect()->route('admin.leads.view', ['id' => $leadId, 'from' => 'quotes'])\n            : redirect()->route('admin.quotes.index');\n    }\n\n    /**\n     * Search the quotes.\n     */\n    public function search(): AnonymousResourceCollection\n    {\n        $quotes = $this->quoteRepository\n            ->pushCriteria(app(RequestCriteria::class))\n            ->all();\n\n        return QuoteResource::collection($quotes);\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $this->quoteRepository->findOrFail($id);\n\n        try {\n            Event::dispatch('quote.delete.before', $id);\n\n            $this->quoteRepository->delete($id);\n\n            Event::dispatch('quote.delete.after', $id);\n\n            return response()->json([\n                'message' => trans('admin::app.quotes.index.delete-success'),\n            ], 200);\n        } catch (\\Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.quotes.index.delete-failed'),\n            ], 400);\n        }\n    }\n\n    /**\n     * Mass Delete the specified resources.\n     */\n    public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse\n    {\n        $quotes = $this->quoteRepository->findWhereIn('id', $massDestroyRequest->input('indices'));\n\n        try {\n            foreach ($quotes as $quotes) {\n                Event::dispatch('quote.delete.before', $quotes->id);\n\n                $this->quoteRepository->delete($quotes->id);\n\n                Event::dispatch('quote.delete.after', $quotes->id);\n            }\n\n            return response()->json([\n                'message' => trans('admin::app.quotes.index.delete-success'),\n            ]);\n        } catch (\\Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.quotes.index.delete-failed'),\n            ], 400);\n        }\n    }\n\n    /**\n     * Print and download the for the specified resource.\n     */\n    public function print($id): Response|StreamedResponse\n    {\n        $quote = $this->quoteRepository->findOrFail($id);\n\n        return $this->downloadPDF(\n            view('admin::quotes.pdf', compact('quote'))->render(),\n            'Quote_'.$quote->subject.'_'.$quote->created_at->format('d-m-Y')\n        );\n    }\n\n    /**\n     * Additional validation for quote product items.\n     */\n    private function additionalValidation(): void\n    {\n        $this->validate(request(), [\n            'items' => 'required|array',\n            'items.*.product_id' => 'required|exists:products,id',\n            'items.*.quantity' => 'required|numeric|min:0',\n            'items.*.price' => 'required|numeric|min:0',\n            'items.*.total' => 'required|numeric|min:0',\n            'items.*.discount_amount' => 'required|numeric|min:0',\n            'items.*.tax_amount' => 'required|numeric|min:0',\n            'items.*.final_total' => 'required|numeric|min:0',\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/AttributeController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\DataGrids\\Settings\\AttributeDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\MassDestroyRequest;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Attribute\\Repositories\\AttributeValueRepository;\nuse Webkul\\Core\\Contracts\\Validations\\Code;\n\nclass AttributeController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected AttributeValueRepository $attributeValueRepository\n    ) {}\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(AttributeDataGrid::class)->process();\n        }\n\n        return view('admin::settings.attributes.index');\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function create(): View\n    {\n        return view('admin::settings.attributes.create');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(): RedirectResponse\n    {\n        $this->validate(request(), [\n            'code' => ['required', 'unique:attributes,code,NULL,NULL,entity_type,'.request('entity_type'), new Code],\n            'name' => 'required',\n            'type' => 'required',\n        ]);\n\n        Event::dispatch('settings.attribute.create.before');\n\n        request()->request->add(['quick_add' => 1]);\n\n        $attribute = $this->attributeRepository->create(request()->all());\n\n        Event::dispatch('settings.attribute.create.after', $attribute);\n\n        session()->flash('success', trans('admin::app.settings.attributes.index.create-success'));\n\n        return redirect()->route('admin.settings.attributes.index');\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     */\n    public function edit(int $id): View\n    {\n        $attribute = $this->attributeRepository->findOrFail($id);\n\n        return view('admin::settings.attributes.edit', compact('attribute'));\n    }\n\n    /**\n     * Update the specified resource in storage.\n     */\n    public function update($id): RedirectResponse\n    {\n        $this->validate(request(), [\n            'code' => ['required', 'unique:attributes,code,NULL,NULL,entity_type,'.$id, new Code],\n            'name' => 'required',\n            'type' => 'required',\n        ]);\n\n        Event::dispatch('settings.attribute.update.before', $id);\n\n        $attribute = $this->attributeRepository->update(request()->all(), $id);\n\n        Event::dispatch('settings.attribute.update.after', $attribute);\n\n        session()->flash('success', trans('admin::app.settings.attributes.index.update-success'));\n\n        return redirect()->route('admin.settings.attributes.index');\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $attribute = $this->attributeRepository->findOrFail($id);\n\n        if (! $attribute->is_user_defined) {\n            return response()->json([\n                'message' => trans('admin::app.settings.attributes.index.user-define-error'),\n            ], 400);\n        }\n\n        try {\n            Event::dispatch('settings.attribute.delete.before', $id);\n\n            $this->attributeRepository->delete($id);\n\n            Event::dispatch('settings.attribute.delete.after', $id);\n\n            return response()->json([\n                'status' => true,\n                'message' => trans('admin::app.settings.attributes.index.delete-success'),\n            ], 200);\n        } catch (\\Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.settings.attributes.index.delete-failed'),\n            ], 400);\n        }\n    }\n\n    /**\n     * Check unique validation.\n     *\n     * @return void\n     */\n    public function checkUniqueValidation()\n    {\n        $attribute = $this->attributeRepository->findOneWhere([\n            'code' => request('attribute_code'),\n        ]);\n\n        return response()->json([\n            'validated' => $this->attributeValueRepository->isValueUnique(\n                request('entity_id'),\n                request('entity_type'),\n                $attribute,\n                request('attribute_value'),\n            ),\n        ]);\n    }\n\n    /**\n     * Search attribute lookup results\n     */\n    public function lookup($lookup): JsonResponse\n    {\n        $results = $this->attributeRepository->getLookUpOptions($lookup, request()->input('query'));\n\n        return response()->json($results);\n    }\n\n    /**\n     * Search attribute lookup results\n     */\n    public function lookupEntity(string $lookup): JsonResponse\n    {\n        $result = $this->attributeRepository->getLookUpEntity($lookup, request()->input('query'));\n\n        return response()->json($result);\n    }\n\n    /**\n     * Mass Delete the specified resources.\n     */\n    public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse\n    {\n        $count = 0;\n\n        $attributes = $this->attributeRepository->findWhereIn('id', $massDestroyRequest->input('indices'));\n\n        foreach ($attributes as $attribute) {\n            $attribute = $this->attributeRepository->find($attribute->id);\n\n            if (! $attribute->is_user_defined) {\n                continue;\n            }\n\n            Event::dispatch('settings.attribute.delete.before', $attribute->id);\n\n            $this->attributeRepository->delete($attribute->id);\n\n            Event::dispatch('settings.attribute.delete.after', $attribute->id);\n\n            $count++;\n        }\n\n        if (! $count) {\n            return response()->json([\n                'message' => trans('admin::app.settings.attributes.index.mass-delete-failed'),\n            ], 400);\n        }\n\n        return response()->json([\n            'message' => trans('admin::app.settings.attributes.index.delete-success'),\n        ]);\n    }\n\n    /**\n     * Get attribute options associated with attribute.\n     *\n     * @return View\n     */\n    public function getAttributeOptions(int $id)\n    {\n        $attribute = $this->attributeRepository->findOrFail($id);\n\n        return $attribute->options()->orderBy('sort_order')->get();\n    }\n\n    /**\n     * Download image or file\n     */\n    public function download()\n    {\n        if (! request('path')) {\n            return false;\n        }\n\n        return Storage::download(request('path'));\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/DataTransfer/ImportController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings\\DataTransfer;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\DataGrids\\Settings\\DataTransfer\\ImportDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\DataTransfer\\Helpers\\Import;\nuse Webkul\\DataTransfer\\Repositories\\ImportRepository;\n\nclass ImportController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected ImportRepository $importRepository,\n        protected Import $importHelper\n    ) {}\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(ImportDataGrid::class)->process();\n        }\n\n        return view('admin::settings.data-transfer.imports.index');\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function create(): View\n    {\n        return view('admin::settings.data-transfer.imports.create');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(): RedirectResponse\n    {\n        $importers = array_keys(config('importers'));\n\n        $this->validate(request(), [\n            'type' => 'required|in:'.implode(',', $importers),\n            'action' => 'required:in:append,delete',\n            'validation_strategy' => 'required:in:stop-on-errors,skip-errors',\n            'allowed_errors' => 'required|integer|min:0',\n            'field_separator' => 'required',\n            'file' => 'required|mimes:csv,xls,xlsx,txt',\n        ]);\n\n        Event::dispatch('data_transfer.imports.create.before');\n\n        $data = request()->only([\n            'type',\n            'action',\n            'process_in_queue',\n            'validation_strategy',\n            'validation_strategy',\n            'allowed_errors',\n            'field_separator',\n        ]);\n\n        if (! isset($data['process_in_queue'])) {\n            $data['process_in_queue'] = false;\n        } else {\n            $data['process_in_queue'] = true;\n        }\n\n        $import = $this->importRepository->create(\n            array_merge(\n                [\n                    'file_path' => request()->file('file')->storeAs(\n                        'imports',\n                        time().'-'.request()->file('file')->getClientOriginalName(),\n                        'public'\n                    ),\n                ],\n                $data\n            )\n        );\n\n        Event::dispatch('data_transfer.imports.create.after', $import);\n\n        session()->flash('success', trans('admin::app.settings.data-transfer.imports.create-success'));\n\n        return redirect()->route('admin.settings.data_transfer.imports.import', $import->id);\n    }\n\n    /**\n     * Show the form for editing a new resource.\n     */\n    public function edit(int $id): View\n    {\n        $import = $this->importRepository->findOrFail($id);\n\n        return view('admin::settings.data-transfer.imports.edit', compact('import'));\n    }\n\n    /**\n     * Update a resource in storage.\n     */\n    public function update(int $id): RedirectResponse\n    {\n        $importers = array_keys(config('importers'));\n\n        $import = $this->importRepository->findOrFail($id);\n\n        $this->validate(request(), [\n            'type' => 'required|in:'.implode(',', $importers),\n            'action' => 'required:in:append,delete',\n            'validation_strategy' => 'required:in:stop-on-errors,skip-errors',\n            'allowed_errors' => 'required|integer|min:0',\n            'field_separator' => 'required',\n            'file' => 'mimes:csv,xls,xlsx,txt',\n        ]);\n\n        Event::dispatch('data_transfer.imports.update.before');\n\n        $data = array_merge(\n            request()->only([\n                'type',\n                'action',\n                'process_in_queue',\n                'validation_strategy',\n                'validation_strategy',\n                'allowed_errors',\n                'field_separator',\n            ]),\n            [\n                'state' => 'pending',\n                'processed_rows_count' => 0,\n                'invalid_rows_count' => 0,\n                'errors_count' => 0,\n                'errors' => null,\n                'error_file_path' => null,\n                'started_at' => null,\n                'completed_at' => null,\n                'summary' => null,\n            ]\n        );\n\n        Storage::disk('public')->delete($import->error_file_path ?? '');\n\n        if (request()->file('file') && request()->file('file')->isValid()) {\n            Storage::disk('public')->delete($import->file_path);\n\n            $data['file_path'] = request()->file('file')->storeAs(\n                'imports',\n                time().'-'.request()->file('file')->getClientOriginalName(),\n                'public'\n            );\n        }\n\n        if (! isset($data['process_in_queue'])) {\n            $data['process_in_queue'] = false;\n        }\n\n        $import = $this->importRepository->update($data, $import->id);\n\n        Event::dispatch('data_transfer.imports.update.after', $import);\n\n        session()->flash('success', trans('admin::app.settings.data-transfer.imports.update-success'));\n\n        return redirect()->route('admin.settings.data_transfer.imports.import', $import->id);\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $import = $this->importRepository->findOrFail($id);\n\n        try {\n            Storage::disk('public')->delete($import->file_path);\n\n            Storage::disk('public')->delete($import->error_file_path ?? '');\n\n            $this->importRepository->delete($id);\n\n            return response()->json([\n                'message' => trans('admin::app.settings.data-transfer.imports.delete-success'),\n            ]);\n        } catch (\\Exception $e) {\n        }\n\n        return response()->json([\n            'message' => trans('admin::app.settings.data-transfer.imports.delete-failed'),\n        ], 500);\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function import(int $id): View\n    {\n        $import = $this->importRepository->findOrFail($id);\n\n        $isValid = $this->importHelper\n            ->setImport($import)\n            ->isValid();\n\n        if ($import->state == Import::STATE_LINKING) {\n            if ($this->importHelper->isIndexingRequired()) {\n                $state = Import::STATE_INDEXING;\n            } else {\n                $state = Import::STATE_COMPLETED;\n            }\n        } elseif ($import->state == Import::STATE_INDEXING) {\n            $state = Import::STATE_COMPLETED;\n        } else {\n            $state = Import::STATE_COMPLETED;\n        }\n\n        $stats = $this->importHelper->stats($state);\n\n        $import->unsetRelations();\n\n        return view('admin::settings.data-transfer.imports.import', compact('import', 'isValid', 'stats'));\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function validateImport(int $id): JsonResponse\n    {\n        $import = $this->importRepository->findOrFail($id);\n\n        $isValid = $this->importHelper\n            ->setImport($import)\n            ->validate();\n\n        return new JsonResponse([\n            'is_valid' => $isValid,\n            'import' => $this->importHelper->getImport()->unsetRelations(),\n        ]);\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function start(int $id): JsonResponse\n    {\n        $import = $this->importRepository->findOrFail($id);\n\n        if (! $import->processed_rows_count) {\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.data-transfer.imports.nothing-to-import'),\n            ], 400);\n        }\n\n        $this->importHelper->setImport($import);\n\n        if (! $this->importHelper->isValid()) {\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.data-transfer.imports.not-valid'),\n            ], 400);\n        }\n\n        if (\n            $import->process_in_queue\n            && config('queue.default') == 'sync'\n        ) {\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.data-transfer.imports.setup-queue-error'),\n            ], 400);\n        }\n\n        /**\n         * Set the import state to processing\n         */\n        if ($import->state == Import::STATE_VALIDATED) {\n            $this->importHelper->started();\n        }\n\n        /**\n         * Get the first pending batch to import\n         */\n        $importBatch = $import->batches->where('state', Import::STATE_PENDING)->first();\n\n        if ($importBatch) {\n            /**\n             * Start the import process\n             */\n            try {\n                if ($import->process_in_queue) {\n                    $this->importHelper->start();\n                } else {\n                    $this->importHelper->start($importBatch);\n                }\n            } catch (\\Exception $e) {\n                return new JsonResponse([\n                    'message' => $e->getMessage(),\n                ], 400);\n            }\n        } else {\n            if ($this->importHelper->isLinkingRequired()) {\n                $this->importHelper->linking();\n            } elseif ($this->importHelper->isIndexingRequired()) {\n                $this->importHelper->indexing();\n            } else {\n                $this->importHelper->completed();\n            }\n        }\n\n        return new JsonResponse([\n            'stats' => $this->importHelper->stats(Import::STATE_PROCESSED),\n            'import' => $this->importHelper->getImport()->unsetRelations(),\n        ]);\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function link(int $id): JsonResponse\n    {\n        $import = $this->importRepository->findOrFail($id);\n\n        if (! $import->processed_rows_count) {\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.data-transfer.imports.nothing-to-import'),\n            ], 400);\n        }\n\n        $this->importHelper->setImport($import);\n\n        if (! $this->importHelper->isValid()) {\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.data-transfer.imports.not-valid'),\n            ], 400);\n        }\n\n        /**\n         * Set the import state to linking\n         */\n        if ($import->state == Import::STATE_PROCESSED) {\n            $this->importHelper->linking();\n        }\n\n        /**\n         * Get the first processing batch to link\n         */\n        $importBatch = $import->batches->where('state', Import::STATE_PROCESSED)->first();\n\n        /**\n         * Set the import state to linking/completed\n         */\n        if ($importBatch) {\n            /**\n             * Start the resource linking process\n             */\n            try {\n                $this->importHelper->link($importBatch);\n            } catch (\\Exception $e) {\n                return new JsonResponse([\n                    'message' => $e->getMessage(),\n                ], 400);\n            }\n        } else {\n            if ($this->importHelper->isIndexingRequired()) {\n                $this->importHelper->indexing();\n            } else {\n                $this->importHelper->completed();\n            }\n        }\n\n        return new JsonResponse([\n            'stats' => $this->importHelper->stats(Import::STATE_LINKED),\n            'import' => $this->importHelper->getImport()->unsetRelations(),\n        ]);\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function indexData(int $id): JsonResponse\n    {\n        $import = $this->importRepository->findOrFail($id);\n\n        if (! $import->processed_rows_count) {\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.data-transfer.imports.nothing-to-import'),\n            ], 400);\n        }\n\n        $this->importHelper->setImport($import);\n\n        if (! $this->importHelper->isValid()) {\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.data-transfer.imports.not-valid'),\n            ], 400);\n        }\n\n        /**\n         * Set the import state to linking\n         */\n        if ($import->state == Import::STATE_LINKED) {\n            $this->importHelper->indexing();\n        }\n\n        /**\n         * Get the first processing batch to link\n         */\n        $importBatch = $import->batches->where('state', Import::STATE_LINKED)->first();\n\n        /**\n         * Set the import state to linking/completed\n         */\n        if ($importBatch) {\n            /**\n             * Start the resource linking process\n             */\n            try {\n                $this->importHelper->index($importBatch);\n            } catch (\\Exception $e) {\n                return new JsonResponse([\n                    'message' => $e->getMessage(),\n                ], 400);\n            }\n        } else {\n            /**\n             * Set the import state to completed\n             */\n            $this->importHelper->completed();\n        }\n\n        return new JsonResponse([\n            'stats' => $this->importHelper->stats(Import::STATE_INDEXED),\n            'import' => $this->importHelper->getImport()->unsetRelations(),\n        ]);\n    }\n\n    /**\n     * Returns import stats\n     */\n    public function stats(int $id, string $state = Import::STATE_PROCESSED): JsonResponse\n    {\n        $import = $this->importRepository->findOrFail($id);\n\n        $stats = $this->importHelper\n            ->setImport($import)\n            ->stats($state);\n\n        return new JsonResponse([\n            'stats' => $stats,\n            'import' => $this->importHelper->getImport()->unsetRelations(),\n        ]);\n    }\n\n    /**\n     * Download import error report\n     */\n    public function downloadSample(string $type)\n    {\n        $importer = config('importers.'.$type);\n\n        return Storage::download($importer['sample_path']);\n    }\n\n    /**\n     * Download import error report\n     */\n    public function download(int $id)\n    {\n        $import = $this->importRepository->findOrFail($id);\n\n        return Storage::disk('public')->download($import->file_path);\n    }\n\n    /**\n     * Download import error report\n     */\n    public function downloadErrorReport(int $id)\n    {\n        $import = $this->importRepository->findOrFail($id);\n\n        return Storage::disk('public')->download($import->file_path);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/EmailTemplateController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\DataGrids\\Settings\\EmailTemplateDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Automation\\Helpers\\Entity;\nuse Webkul\\EmailTemplate\\Repositories\\EmailTemplateRepository;\n\nclass EmailTemplateController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected EmailTemplateRepository $emailTemplateRepository,\n        protected Entity $workflowEntityHelper\n    ) {}\n\n    /**\n     * Display a listing of the email template.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(EmailTemplateDataGrid::class)->process();\n        }\n\n        return view('admin::settings.email-templates.index');\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     *\n     * @return View\n     */\n    public function create()\n    {\n        $placeholders = $this->workflowEntityHelper->getEmailTemplatePlaceholders();\n\n        return view('admin::settings.email-templates.create', compact('placeholders'));\n    }\n\n    /**\n     * Store a newly created email templates in storage.\n     */\n    public function store(): RedirectResponse\n    {\n        $this->validate(request(), [\n            'name' => 'required|unique:email_templates,name',\n            'subject' => 'required',\n            'content' => 'required',\n        ]);\n\n        Event::dispatch('settings.email_templates.create.before');\n\n        $emailTemplate = $this->emailTemplateRepository->create(request()->all());\n\n        Event::dispatch('settings.email_templates.create.after', $emailTemplate);\n\n        session()->flash('success', trans('admin::app.settings.email-template.index.create-success'));\n\n        return redirect()->route('admin.settings.email_templates.index');\n    }\n\n    /**\n     * Show the form for editing the specified email template.\n     */\n    public function edit(int $id): View\n    {\n        $emailTemplate = $this->emailTemplateRepository->findOrFail($id);\n\n        $placeholders = $this->workflowEntityHelper->getEmailTemplatePlaceholders();\n\n        return view('admin::settings.email-templates.edit', compact('emailTemplate', 'placeholders'));\n    }\n\n    /**\n     * Update the specified email template in storage.\n     */\n    public function update(int $id): RedirectResponse\n    {\n        $this->validate(request(), [\n            'name' => 'required|unique:email_templates,name,'.$id,\n            'subject' => 'required',\n            'content' => 'required',\n        ]);\n\n        Event::dispatch('settings.email_templates.update.before', $id);\n\n        $emailTemplate = $this->emailTemplateRepository->update(request()->all(), $id);\n\n        Event::dispatch('settings.email_templates.update.after', $emailTemplate);\n\n        session()->flash('success', trans('admin::app.settings.email-template.index.update-success'));\n\n        return redirect()->route('admin.settings.email_templates.index');\n    }\n\n    /**\n     * Remove the specified email template from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $emailTemplate = $this->emailTemplateRepository->findOrFail($id);\n\n        try {\n            Event::dispatch('settings.email_templates.delete.before', $id);\n\n            $emailTemplate->delete($id);\n\n            Event::dispatch('settings.email_templates.delete.after', $id);\n\n            return response()->json([\n                'message' => trans('admin::app.settings.email-template.index.delete-success'),\n            ], 200);\n        } catch (\\Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.settings.email-template.index.delete-failed'),\n            ], 400);\n        }\n\n        return response()->json([\n            'message' => trans('admin::app.settings.email-template.index.delete-failed'),\n        ], 400);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/GroupController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\DataGrids\\Settings\\GroupDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\User\\Repositories\\GroupRepository;\n\nclass GroupController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected GroupRepository $groupRepository) {}\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(GroupDataGrid::class)->process();\n        }\n\n        return view('admin::settings.groups.index');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(): JsonResponse\n    {\n        $this->validate(request(), [\n            'name' => 'required|unique:groups,name|max:50',\n            'description' => 'required|max:250',\n        ]);\n\n        Event::dispatch('settings.group.create.before');\n\n        $group = $this->groupRepository->create(request()->only([\n            'name',\n            'description',\n        ]));\n\n        Event::dispatch('settings.group.create.after', $group);\n\n        return new JsonResponse([\n            'data' => $group,\n            'message' => trans('admin::app.settings.groups.index.create-success'),\n        ]);\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     */\n    public function edit(int $id): JsonResource\n    {\n        $group = $this->groupRepository->findOrFail($id);\n\n        return new JsonResource([\n            'data' => $group,\n        ]);\n    }\n\n    /**\n     * Update the specified resource in storage.\n     */\n    public function update(int $id): JsonResponse\n    {\n        $this->validate(request(), [\n            'name' => 'required|max:50|unique:groups,name,'.$id,\n            'description' => 'required|max:250',\n        ]);\n\n        Event::dispatch('settings.group.update.before', $id);\n\n        $group = $this->groupRepository->update(request()->only([\n            'name',\n            'description',\n        ]), $id);\n\n        Event::dispatch('settings.group.update.after', $group);\n\n        return new JsonResponse([\n            'data' => $group,\n            'message' => trans('admin::app.settings.groups.index.update-success'),\n        ]);\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     *\n     * @return Response\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $group = $this->groupRepository->findOrFail($id);\n\n        if ($group->users()->exists()) {\n            return response()->json([\n                'message' => trans('admin::app.settings.groups.index.delete-failed-associated-users'),\n            ], 400);\n        }\n\n        try {\n            Event::dispatch('settings.group.delete.before', $id);\n\n            $group->delete($id);\n\n            Event::dispatch('settings.group.delete.after', $id);\n\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.groups.index.destroy-success'),\n            ], 200);\n        } catch (\\Exception $exception) {\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.groups.index.delete-failed'),\n            ], 400);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/LocationController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Event;\nuse Prettus\\Repository\\Criteria\\RequestCriteria;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\AttributeForm;\nuse Webkul\\Warehouse\\Repositories\\LocationRepository;\n\nclass LocationController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected LocationRepository $locationRepository) {}\n\n    /**\n     * Search location results\n     *\n     * @return Response\n     */\n    public function search()\n    {\n        $results = $this->locationRepository\n            ->pushCriteria(app(RequestCriteria::class))\n            ->all();\n\n        return response()->json([\n            'data' => $results,\n        ]);\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(AttributeForm $request): JsonResponse\n    {\n        Event::dispatch('settings.location.create.before');\n\n        $location = $this->locationRepository->create(request()->all());\n\n        Event::dispatch('settings.location.create.after', $location);\n\n        return new JsonResponse([\n            'data' => $location,\n            'message' => trans('admin::app.settings.warehouses.view.locations.create-success'),\n        ]);\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     *\n     * @return Response\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $this->locationRepository->findOrFail($id);\n\n        try {\n            Event::dispatch('settings.location.delete.before', $id);\n\n            $this->locationRepository->delete($id);\n\n            Event::dispatch('settings.location.delete.after', $id);\n\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.warehouses.view.locations.delete-success'),\n            ], 200);\n        } catch (\\Exception $exception) {\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.warehouses.view.locations.delete-failed'),\n            ], 400);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/CampaignsController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings\\Marketing;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\DataGrids\\Settings\\Marketing\\CampaignDatagrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\MassDestroyRequest;\nuse Webkul\\EmailTemplate\\Repositories\\EmailTemplateRepository;\nuse Webkul\\Marketing\\Repositories\\CampaignRepository;\nuse Webkul\\Marketing\\Repositories\\EventRepository;\n\nclass CampaignsController extends Controller\n{\n    /**\n     * Create new a controller instance.\n     */\n    public function __construct(\n        protected CampaignRepository $campaignRepository,\n        protected EventRepository $eventRepository,\n        protected EmailTemplateRepository $emailTemplateRepository,\n    ) {}\n\n    /**\n     * Display a listing of the marketing campaigns.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->isXmlHttpRequest()) {\n            return datagrid(CampaignDatagrid::class)->process();\n        }\n\n        return view('admin::settings.marketing.campaigns.index');\n    }\n\n    /**\n     * Get marketing events.\n     */\n    public function getEvents(): JsonResponse\n    {\n        $events = $this->eventRepository->get(['id', 'name']);\n\n        return response()->json([\n            'data' => $events,\n        ]);\n    }\n\n    /**\n     * Get Email Templates.\n     */\n    public function getEmailTemplates(): JsonResponse\n    {\n        $emailTemplates = $this->emailTemplateRepository->get(['id', 'name']);\n\n        return response()->json([\n            'data' => $emailTemplates,\n        ]);\n    }\n\n    /**\n     * Store a newly created marketing campaign in storage.\n     */\n    public function store(): JsonResponse\n    {\n        $validatedData = $this->validate(request(), [\n            'name' => 'required|string|max:255',\n            'subject' => 'required|string|max:255',\n            'marketing_template_id' => 'required|exists:email_templates,id',\n            'marketing_event_id' => 'required|exists:marketing_events,id',\n            'status' => 'sometimes|required|in:0,1',\n        ]);\n\n        Event::dispatch('settings.marketing.campaigns.create.before');\n\n        $marketingCampaign = $this->campaignRepository->create($validatedData);\n\n        Event::dispatch('settings.marketing.campaigns.create.after', $marketingCampaign);\n\n        return response()->json([\n            'message' => trans('admin::app.settings.marketing.campaigns.index.create-success'),\n        ]);\n    }\n\n    /**\n     * Show the specified Resource.\n     */\n    public function show(int $id): JsonResponse\n    {\n        $campaign = $this->campaignRepository->findOrFail($id);\n\n        return response()->json([\n            'data' => $campaign,\n        ]);\n    }\n\n    /**\n     * Update the specified marketing campaign in storage.\n     */\n    public function update(int $id): JsonResponse\n    {\n        $validatedData = $this->validate(request(), [\n            'name' => 'required|string|max:255',\n            'subject' => 'required|string|max:255',\n            'marketing_template_id' => 'required|exists:email_templates,id',\n            'marketing_event_id' => 'required|exists:marketing_events,id',\n            'status' => 'sometimes|required|in:0,1',\n        ]);\n\n        Event::dispatch('settings.marketing.campaigns.update.before', $id);\n\n        $marketingCampaign = $this->campaignRepository->update($validatedData, $id);\n\n        Event::dispatch('settings.marketing.campaigns.update.after', $marketingCampaign);\n\n        return response()->json([\n            'message' => trans('admin::app.settings.marketing.campaigns.index.update-success'),\n        ]);\n    }\n\n    /**\n     * Remove the specified marketing campaign from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        Event::dispatch('settings.marketing.campaigns.delete.before', $id);\n\n        $this->campaignRepository->delete($id);\n\n        Event::dispatch('settings.marketing.campaigns.delete.after', $id);\n\n        return response()->json([\n            'message' => trans('admin::app.settings.marketing.campaigns.index.delete-success'),\n        ]);\n    }\n\n    /**\n     * Remove the specified marketing campaigns from storage.\n     */\n    public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse\n    {\n        $campaigns = $this->campaignRepository->findWhereIn('id', $massDestroyRequest->input('indices'));\n\n        foreach ($campaigns as $campaign) {\n            Event::dispatch('settings.marketing.campaigns.delete.before', $campaign);\n\n            $this->campaignRepository->delete($campaign->id);\n\n            Event::dispatch('settings.marketing.campaigns.delete.after', $campaign);\n        }\n\n        return response()->json([\n            'message' => trans('admin::app.settings.marketing.campaigns.index.mass-delete-success'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/Marketing/EventController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings\\Marketing;\n\nuse Exception;\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\DataGrids\\Settings\\Marketing\\EventDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\MassDestroyRequest;\nuse Webkul\\Marketing\\Repositories\\EventRepository;\n\nclass EventController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     */\n    public function __construct(protected EventRepository $eventRepository) {}\n\n    /**\n     * Display a listing of the marketing events.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(EventDataGrid::class)->process();\n        }\n\n        return view('admin::settings.marketing.events.index');\n    }\n\n    /**\n     * Store a newly created marketing event in storage.\n     */\n    public function store(): JsonResponse\n    {\n        $validatedData = $this->validate(request(), [\n            'name' => 'required|max:60',\n            'description' => 'required',\n            'date' => 'required|date|after_or_equal:today',\n        ]);\n\n        Event::dispatch('settings.marketing.events.create.before');\n\n        $marketingEvent = $this->eventRepository->create($validatedData);\n\n        Event::dispatch('settings.marketing.events.create.after', $marketingEvent);\n\n        return response()->json([\n            'message' => trans('admin::app.settings.marketing.events.index.create-success'),\n            'data' => $marketingEvent,\n        ]);\n    }\n\n    /**\n     * Update the specified marketing event in storage.\n     */\n    public function update(int $id): JsonResponse\n    {\n        $validatedData = $this->validate(request(), [\n            'name' => 'required|max:60',\n            'description' => 'required',\n            'date' => 'required|date|after_or_equal:today',\n        ]);\n\n        Event::dispatch('settings.marketing.events.update.before', $id);\n\n        $marketingEvent = $this->eventRepository->update($validatedData, $id);\n\n        Event::dispatch('settings.marketing.events.update.after', $marketingEvent);\n\n        return response()->json([\n            'message' => trans('admin::app.settings.marketing.events.index.update-success'),\n            'data' => $marketingEvent,\n        ]);\n    }\n\n    /**\n     * Remove the specified marketing event from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $event = $this->eventRepository->findOrFail($id);\n\n        if ($event->campaigns->isNotEmpty()) {\n            return response()->json([\n                'message' => trans('admin::app.settings.marketing.events.index.delete-failed-associated-campaigns'),\n            ], 422);\n        }\n\n        Event::dispatch('settings.marketing.events.delete.before', $event);\n\n        $this->eventRepository->delete($event->id);\n\n        Event::dispatch('settings.marketing.events.delete.after', $event);\n\n        return response()->json([\n            'message' => trans('admin::app.settings.marketing.events.index.delete-success'),\n        ]);\n    }\n\n    /**\n     * Remove the specified marketing events from storage.\n     */\n    public function massDestroy(MassDestroyRequest $request): JsonResponse\n    {\n        try {\n            $events = $this->eventRepository->findWhereIn('id', $request->input('indices', []));\n\n            $deletedCount = 0;\n\n            $blockedCount = 0;\n\n            foreach ($events as $event) {\n                if (\n                    $event->campaigns\n                    && $event->campaigns->isNotEmpty()\n                ) {\n                    $blockedCount++;\n\n                    continue;\n                }\n\n                Event::dispatch('settings.marketing.events.delete.before', $event);\n\n                $this->eventRepository->delete($event->id);\n\n                Event::dispatch('settings.marketing.events.delete.after', $event);\n\n                $deletedCount++;\n            }\n\n            $statusCode = 200;\n\n            switch (true) {\n                case $deletedCount > 0 && $blockedCount === 0:\n                    $message = trans('admin::app.settings.marketing.events.index.mass-delete-success');\n\n                    break;\n\n                case $deletedCount > 0 && $blockedCount > 0:\n                    $message = trans('admin::app.settings.marketing.events.index.partial-delete-warning');\n\n                    break;\n\n                case $deletedCount === 0 && $blockedCount > 0:\n                    $message = trans('admin::app.settings.marketing.events.index.none-delete-warning');\n\n                    $statusCode = 400;\n\n                    break;\n\n                default:\n                    $message = trans('admin::app.settings.marketing.events.index.no-selection');\n\n                    $statusCode = 400;\n\n                    break;\n            }\n\n            return response()->json(['message' => $message], $statusCode);\n        } catch (Exception $e) {\n            return response()->json([\n                'message' => trans('admin::app.settings.marketing.events.index.mass-delete-failed'),\n            ], 400);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/PipelineController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\DataGrids\\Settings\\PipelineDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\PipelineForm;\nuse Webkul\\Lead\\Repositories\\PipelineRepository;\n\nclass PipelineController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected PipelineRepository $pipelineRepository) {}\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(PipelineDataGrid::class)->process();\n        }\n\n        return view('admin::settings.pipelines.index');\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function create(): View\n    {\n        return view('admin::settings.pipelines.create');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(PipelineForm $request): RedirectResponse\n    {\n        $request->validated();\n\n        $request->merge([\n            'is_default' => request()->has('is_default') ? 1 : 0,\n        ]);\n\n        Event::dispatch('settings.pipeline.create.before');\n\n        $pipeline = $this->pipelineRepository->create($request->all());\n\n        Event::dispatch('settings.pipeline.create.after', $pipeline);\n\n        session()->flash('success', trans('admin::app.settings.pipelines.index.create-success'));\n\n        return redirect()->route('admin.settings.pipelines.index');\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     */\n    public function edit(int $id): View\n    {\n        $pipeline = $this->pipelineRepository->findOrFail($id);\n\n        return view('admin::settings.pipelines.edit', compact('pipeline'));\n    }\n\n    /**\n     * Update the specified resource in storage.\n     */\n    public function update(PipelineForm $request, int $id): RedirectResponse\n    {\n        $request->validated();\n\n        $isDefault = request()->has('is_default') ? 1 : 0;\n\n        if (! $isDefault) {\n            $defaultCount = $this->pipelineRepository->findWhere(['is_default' => 1])->count();\n\n            $pipeline = $this->pipelineRepository->find($id);\n\n            if (\n                $defaultCount === 1\n                && $pipeline->is_default\n            ) {\n                session()->flash('error', trans('admin::app.settings.pipelines.index.default-required'));\n\n                return redirect()->back();\n            }\n        }\n\n        $request->merge(['is_default' => $isDefault]);\n\n        Event::dispatch('settings.pipeline.update.before', $id);\n\n        $pipeline = $this->pipelineRepository->update($request->all(), $id);\n\n        Event::dispatch('settings.pipeline.update.after', $pipeline);\n\n        session()->flash('success', trans('admin::app.settings.pipelines.index.update-success'));\n\n        return redirect()->route('admin.settings.pipelines.index');\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function destroy($id): JsonResponse\n    {\n        $pipeline = $this->pipelineRepository->findOrFail($id);\n\n        if ($pipeline->is_default) {\n            return response()->json([\n                'message' => trans('admin::app.settings.pipelines.index.default-delete-error'),\n            ], 400);\n        } else {\n            $defaultPipeline = $this->pipelineRepository->getDefaultPipeline();\n\n            $pipeline->leads()->update([\n                'lead_pipeline_id' => $defaultPipeline->id,\n                'lead_pipeline_stage_id' => $defaultPipeline->stages()->first()->id,\n            ]);\n        }\n\n        try {\n            Event::dispatch('settings.pipeline.delete.before', $id);\n\n            $this->pipelineRepository->delete($id);\n\n            Event::dispatch('settings.pipeline.delete.after', $id);\n\n            return response()->json([\n                'message' => trans('admin::app.settings.pipelines.index.delete-success'),\n            ], 200);\n        } catch (\\Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.settings.pipelines.index.delete-failed'),\n            ], 400);\n        }\n\n        return response()->json([\n            'message' => trans('admin::app.settings.pipelines.index.delete-failed'),\n        ], 400);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/RoleController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\DataGrids\\Settings\\RoleDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\User\\Repositories\\RoleRepository;\n\nclass RoleController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected RoleRepository $roleRepository) {}\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(RoleDataGrid::class)->process();\n        }\n\n        return view('admin::settings.roles.index');\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function create(): View\n    {\n        return view('admin::settings.roles.create');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(): RedirectResponse\n    {\n        $this->validate(request(), [\n            'name' => 'required',\n            'permission_type' => 'required|in:all,custom',\n            'description' => 'required',\n        ]);\n\n        if (request('permission_type') == 'custom') {\n            $this->validate(request(), [\n                'permissions' => 'required',\n            ]);\n        }\n\n        Event::dispatch('settings.role.create.before');\n\n        $data = request()->only([\n            'name',\n            'description',\n            'permission_type',\n            'permissions',\n        ]);\n\n        $role = $this->roleRepository->create($data);\n\n        Event::dispatch('settings.role.create.after', $role);\n\n        session()->flash('success', trans('admin::app.settings.roles.index.create-success'));\n\n        return redirect()->route('admin.settings.roles.index');\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     */\n    public function edit(int $id): View\n    {\n        $role = $this->roleRepository->findOrFail($id);\n\n        return view('admin::settings.roles.edit', compact('role'));\n    }\n\n    /**\n     * Update the specified resource in storage.\n     */\n    public function update(int $id): RedirectResponse\n    {\n        $this->validate(request(), [\n            'name' => 'required',\n            'permission_type' => 'required|in:all,custom',\n            'description' => 'required',\n            'permissions' => 'required_if:permission_type,custom',\n        ]);\n\n        Event::dispatch('settings.role.update.before', $id);\n\n        $data = array_merge(request()->only([\n            'name',\n            'description',\n            'permission_type',\n        ]), [\n            'permissions' => request()->has('permissions') ? request('permissions') : [],\n        ]);\n\n        $role = $this->roleRepository->update($data, $id);\n\n        Event::dispatch('settings.role.update.after', $role);\n\n        session()->flash('success', trans('admin::app.settings.roles.index.update-success'));\n\n        return redirect()->back();\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $response = [\n            'responseCode' => 400,\n        ];\n\n        $role = $this->roleRepository->findOrFail($id);\n\n        if ($role->users && $role->users->count() >= 1) {\n            $response['message'] = trans('admin::app.settings.roles.index.being-used');\n\n            session()->flash('error', $response['message']);\n        } elseif ($this->roleRepository->count() == 1) {\n            $response['message'] = trans('admin::app.settings.roles.index.last-delete-error');\n\n            session()->flash('error', $response['message']);\n        } else {\n            try {\n                Event::dispatch('settings.role.delete.before', $id);\n\n                if (auth()->guard('user')->user()->role_id == $id) {\n                    $response['message'] = trans('admin::app.settings.roles.index.current-role-delete-error');\n                } else {\n                    $this->roleRepository->delete($id);\n\n                    Event::dispatch('settings.role.delete.after', $id);\n\n                    $message = trans('admin::app.settings.roles.index.delete-success');\n\n                    $response = [\n                        'responseCode' => 200,\n                        'message' => $message,\n                    ];\n\n                    session()->flash('success', $message);\n                }\n            } catch (\\Exception $exception) {\n                $message = $exception->getMessage();\n\n                $response['message'] = $message;\n\n                session()->flash('error', $message);\n            }\n        }\n\n        return response()->json($response, $response['responseCode']);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/SettingController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Support\\Collection;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Core\\Menu\\MenuItem;\n\nclass SettingController extends Controller\n{\n    /**\n     * Display a listing of the resource.\n     *\n     * @return View\n     */\n    public function index()\n    {\n        return view('admin::settings.index');\n    }\n\n    /**\n     * Search for settings.\n     */\n    public function search(): ?JsonResponse\n    {\n        $query = strtolower(request()->query('query'));\n\n        if (empty($query)) {\n            return response()->json(['data' => []]);\n        }\n\n        $results = $this->searchMenuItems($this->getSettingsConfig(), $query);\n\n        return response()->json([\n            'data' => $results->values(),\n        ]);\n    }\n\n    /**\n     * Recursively search through menu items and children.\n     *\n     * @param  Collection<int, MenuItem>  $menuItems\n     * @return Collection<int, array<string, mixed>>\n     */\n    protected function searchMenuItems(Collection $menuItems, string $query): Collection\n    {\n        $results = collect();\n\n        foreach ($menuItems as $item) {\n            if ($this->matchesQuery($item, $query)) {\n                $results->push([\n                    'name' => $item->getName(),\n                    'url' => $item->getUrl(),\n                    'icon' => $item->getIcon(),\n                    'key' => $item->getKey(),\n                ]);\n            }\n\n            if ($item->haveChildren()) {\n                $childResults = $this->searchMenuItems($item->getChildren(), $query);\n\n                $results = $results->merge($childResults);\n            }\n        }\n\n        return $results;\n    }\n\n    /**\n     * Determine if the menu item matches the query.\n     */\n    protected function matchesQuery(MenuItem $item, string $query): bool\n    {\n        $query = strtolower($query);\n        $url = strtolower($item->getUrl());\n\n        if (\n            ! $url\n            || ! str_contains($url, $query)\n        ) {\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Get the settings configuration.\n     */\n    protected function getSettingsConfig(): Collection\n    {\n        return menu()\n            ->getItems('admin')\n            ->filter(fn (MenuItem $item) => $item->getKey() === 'settings');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/SourceController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings;\n\nuse Exception;\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\DataGrids\\Settings\\SourceDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Lead\\Repositories\\SourceRepository;\n\nclass SourceController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected SourceRepository $sourceRepository) {}\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(SourceDataGrid::class)->process();\n        }\n\n        return view('admin::settings.sources.index');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(): JsonResponse\n    {\n        $this->validate(request(), [\n            'name' => ['required', 'unique:lead_sources,name'],\n        ]);\n\n        Event::dispatch('settings.source.create.before');\n\n        $source = $this->sourceRepository->create(request()->only(['name']));\n\n        Event::dispatch('settings.source.create.after', $source);\n\n        return new JsonResponse([\n            'data' => $source,\n            'message' => trans('admin::app.settings.sources.index.create-success'),\n        ]);\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     */\n    public function edit(int $id): View|JsonResponse\n    {\n        $source = $this->sourceRepository->findOrFail($id);\n\n        return new JsonResponse([\n            'data' => $source,\n        ]);\n    }\n\n    /**\n     * Update the specified resource in storage.\n     */\n    public function update(int $id): JsonResponse\n    {\n        $this->validate(request(), [\n            'name' => 'required|unique:lead_sources,name,'.$id,\n        ]);\n\n        Event::dispatch('settings.source.update.before', $id);\n\n        $source = $this->sourceRepository->update(request()->only(['name']), $id);\n\n        Event::dispatch('settings.source.update.after', $source);\n\n        return new JsonResponse([\n            'data' => $source,\n            'message' => trans('admin::app.settings.sources.index.update-success'),\n        ]);\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $source = $this->sourceRepository->findOrFail($id);\n\n        if ($source->leads()->count() > 0) {\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.sources.index.delete-failed-associated-leads'),\n            ], 400);\n        }\n\n        try {\n            Event::dispatch('settings.source.delete.before', $id);\n\n            $source->delete();\n\n            Event::dispatch('settings.source.delete.after', $id);\n\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.sources.index.delete-success'),\n            ], 200);\n        } catch (Exception $exception) {\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.sources.index.delete-failed'),\n            ], 400);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/TagController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Prettus\\Repository\\Criteria\\RequestCriteria;\nuse Webkul\\Admin\\DataGrids\\Settings\\TagDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\MassDestroyRequest;\nuse Webkul\\Admin\\Http\\Resources\\TagResource;\nuse Webkul\\Tag\\Repositories\\TagRepository;\n\nclass TagController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected TagRepository $tagRepository) {}\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(TagDataGrid::class)->process();\n        }\n\n        return view('admin::settings.tags.index');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(): JsonResponse\n    {\n        $this->validate(request(), [\n            'name' => ['required', 'unique:tags,name', 'max:50'],\n        ]);\n\n        Event::dispatch('settings.tag.create.before');\n\n        $tag = $this->tagRepository->create(array_merge(request()->only([\n            'name',\n            'color',\n        ]), [\n            'user_id' => auth()->guard('user')->user()->id,\n        ]));\n\n        Event::dispatch('settings.tag.create.after', $tag);\n\n        return new JsonResponse([\n            'data' => new TagResource($tag),\n            'message' => trans('admin::app.settings.tags.index.create-success'),\n        ]);\n    }\n\n    /**\n     * Show the form for editing the specified tag.\n     */\n    public function edit(int $id): View|JsonResponse\n    {\n        $tag = $this->tagRepository->findOrFail($id);\n\n        return new JsonResponse([\n            'data' => $tag,\n        ]);\n    }\n\n    /**\n     * Update the specified tag in storage.\n     */\n    public function update(int $id): JsonResponse\n    {\n        $this->validate(request(), [\n            'name' => 'required|max:50|unique:tags,name,'.$id,\n        ]);\n\n        Event::dispatch('settings.tag.update.before', $id);\n\n        $tag = $this->tagRepository->update(request()->only([\n            'name',\n            'color',\n        ]), $id);\n\n        Event::dispatch('settings.tag.update.after', $tag);\n\n        return new JsonResponse([\n            'data' => new TagResource($tag),\n            'message' => trans('admin::app.settings.tags.index.update-success'),\n        ]);\n    }\n\n    /**\n     * Remove the specified type from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $tag = $this->tagRepository->findOrFail($id);\n\n        try {\n            Event::dispatch('settings.tag.delete.before', $id);\n\n            $tag->delete($id);\n\n            Event::dispatch('settings.tag.delete.after', $id);\n\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.tags.index.delete-success'),\n            ], 200);\n        } catch (\\Exception $exception) {\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.tags.index.delete-failed'),\n            ], 400);\n        }\n    }\n\n    /**\n     * Search tag results\n     *\n     * @return Response\n     */\n    public function search()\n    {\n        $tags = $this->tagRepository\n            ->pushCriteria(app(RequestCriteria::class))\n            ->all();\n\n        return TagResource::collection($tags);\n    }\n\n    /**\n     * Mass Delete the specified resources.\n     */\n    public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse\n    {\n        $indices = $massDestroyRequest->input('indices');\n\n        try {\n            foreach ($indices as $index) {\n                Event::dispatch('settings.tag.delete.before', $index);\n\n                $this->tagRepository->delete($index);\n\n                Event::dispatch('settings.tag.delete.after', $index);\n            }\n\n            return new JsonResponse([\n                'message' => trans('admin::app.customers.reviews.index.datagrid.mass-delete-success'),\n            ], 200);\n        } catch (\\Exception $e) {\n            return new JsonResponse([\n                'message' => $e->getMessage(),\n            ], 500);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/TypeController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\DataGrids\\Settings\\TypeDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Lead\\Repositories\\TypeRepository;\n\nclass TypeController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected TypeRepository $typeRepository) {}\n\n    /**\n     * Display a listing of the type.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(TypeDataGrid::class)->process();\n        }\n\n        return view('admin::settings.types.index');\n    }\n\n    /**\n     * Store a newly created type in storage.\n     */\n    public function store(): JsonResponse\n    {\n        $this->validate(request(), [\n            'name' => ['required', 'unique:lead_types,name'],\n        ]);\n\n        Event::dispatch('settings.type.create.before');\n\n        $type = $this->typeRepository->create(request()->only(['name']));\n\n        Event::dispatch('settings.type.create.after', $type);\n\n        return new JsonResponse([\n            'data' => $type,\n            'message' => trans('admin::app.settings.types.index.create-success'),\n        ]);\n    }\n\n    /**\n     * Show the form for editing the specified type.\n     */\n    public function edit(int $id): View|JsonResponse\n    {\n        $type = $this->typeRepository->findOrFail($id);\n\n        return new JsonResponse([\n            'data' => $type,\n        ]);\n    }\n\n    /**\n     * Update the specified type in storage.\n     */\n    public function update(int $id): JsonResponse\n    {\n        $this->validate(request(), [\n            'name' => 'required|unique:lead_types,name,'.$id,\n        ]);\n\n        Event::dispatch('settings.type.update.before', $id);\n\n        $type = $this->typeRepository->update(request()->only(['name']), $id);\n\n        Event::dispatch('settings.type.update.after', $type);\n\n        return new JsonResponse([\n            'data' => $type,\n            'message' => trans('admin::app.settings.types.index.update-success'),\n        ]);\n    }\n\n    /**\n     * Remove the specified type from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $type = $this->typeRepository->findOrFail($id);\n\n        try {\n            Event::dispatch('settings.type.delete.before', $id);\n\n            $type->delete($id);\n\n            Event::dispatch('settings.type.delete.after', $id);\n\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.types.index.delete-success'),\n            ], 200);\n        } catch (\\Exception $exception) {\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.types.index.delete-failed'),\n            ], 400);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/UserController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\nuse Illuminate\\Support\\Arr;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Mail;\nuse Illuminate\\View\\View;\nuse Prettus\\Repository\\Criteria\\RequestCriteria;\nuse Webkul\\Admin\\DataGrids\\Settings\\UserDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\MassDestroyRequest;\nuse Webkul\\Admin\\Http\\Requests\\MassUpdateRequest;\nuse Webkul\\Admin\\Http\\Resources\\UserResource;\nuse Webkul\\Admin\\Notifications\\User\\Create as UserCreatedNotification;\nuse Webkul\\User\\Repositories\\GroupRepository;\nuse Webkul\\User\\Repositories\\RoleRepository;\nuse Webkul\\User\\Repositories\\UserRepository;\n\nclass UserController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected UserRepository $userRepository,\n        protected GroupRepository $groupRepository,\n        protected RoleRepository $roleRepository\n    ) {}\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(UserDataGrid::class)->process();\n        }\n\n        $roles = $this->roleRepository->all();\n\n        $groups = $this->groupRepository->all();\n\n        return view('admin::settings.users.index', compact('roles', 'groups'));\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(): View|JsonResponse\n    {\n        $this->validate(request(), [\n            'email' => 'required|email|unique:users,email',\n            'name' => 'required',\n            'password' => 'nullable',\n            'confirm_password' => 'nullable|required_with:password|same:password',\n            'role_id' => 'required',\n            'status' => 'boolean|in:0,1',\n            'view_permission' => 'string|in:global,group,individual',\n        ]);\n\n        $data = request()->all();\n\n        if (\n            isset($data['password'])\n            && $data['password']\n        ) {\n            $data['password'] = bcrypt($data['password']);\n        }\n\n        Event::dispatch('settings.user.create.before');\n\n        $admin = $this->userRepository->create($data);\n\n        $admin->groups()->sync($data['groups'] ?? []);\n\n        try {\n            Mail::queue(new UserCreatedNotification($admin));\n        } catch (\\Exception $e) {\n            report($e);\n        }\n\n        Event::dispatch('settings.user.create.after', $admin);\n\n        return new JsonResponse([\n            'data' => $admin,\n            'message' => trans('admin::app.settings.users.index.create-success'),\n        ]);\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     */\n    public function edit(int $id): View|JsonResponse\n    {\n        $admin = $this->userRepository->with(['role', 'groups'])->findOrFail($id);\n\n        return new JsonResponse([\n            'data' => $admin,\n        ]);\n    }\n\n    /**\n     * Update the specified resource in storage.\n     */\n    public function update(int $id): JsonResponse\n    {\n        $this->validate(request(), [\n            'email' => 'required|email|unique:users,email,'.$id,\n            'name' => 'required|string',\n            'password' => 'nullable|string|min:6',\n            'confirm_password' => 'nullable|required_with:password|same:password',\n            'role_id' => 'required|integer|exists:roles,id',\n            'status' => 'nullable|boolean|in:0,1',\n            'view_permission' => 'required|string|in:global,group,individual',\n        ]);\n\n        $data = request()->all();\n\n        if (empty($data['password'])) {\n            $data = Arr::except($data, ['password', 'confirm_password']);\n        } else {\n            $data['password'] = bcrypt($data['password']);\n        }\n\n        $authUser = auth()->guard('user')->user();\n\n        if ($authUser->id == $id) {\n            $data['status'] = true;\n        }\n\n        Event::dispatch('settings.user.update.before', $id);\n\n        $admin = $this->userRepository->update($data, $id);\n\n        $admin->groups()->sync($data['groups'] ?? []);\n\n        Event::dispatch('settings.user.update.after', $admin);\n\n        return new JsonResponse([\n            'data' => $admin,\n            'message' => trans('admin::app.settings.users.index.update-success'),\n        ]);\n    }\n\n    /**\n     * Search user results.\n     */\n    public function search(): JsonResource\n    {\n        $users = $this->userRepository\n            ->pushCriteria(app(RequestCriteria::class))\n            ->all();\n\n        return UserResource::collection($users);\n    }\n\n    /**\n     * Destroy specified user.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        if ($this->userRepository->count() == 1) {\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.users.index.last-delete-error'),\n            ], 400);\n        }\n\n        try {\n            Event::dispatch('user.admin.delete.before', $id);\n\n            $this->userRepository->delete($id);\n\n            Event::dispatch('user.admin.delete.after', $id);\n\n            return new JsonResponse([\n                'message' => trans('admin::app.settings.users.index.delete-success'),\n            ], 200);\n        } catch (\\Exception $e) {\n        }\n\n        return new JsonResponse([\n            'message' => trans('admin::app.settings.users.index.delete-failed'),\n        ], 500);\n    }\n\n    /**\n     * Mass Update the specified resources.\n     */\n    public function massUpdate(MassUpdateRequest $massDestroyRequest): JsonResponse\n    {\n        $count = 0;\n\n        $users = $this->userRepository->findWhereIn('id', $massDestroyRequest->input('indices'));\n\n        foreach ($users as $users) {\n            if (auth()->guard('user')->user()->id == $users->id) {\n                continue;\n            }\n\n            Event::dispatch('settings.user.update.before', $users->id);\n\n            $this->userRepository->update([\n                'status' => $massDestroyRequest->input('value'),\n            ], $users->id);\n\n            Event::dispatch('settings.user.update.after', $users->id);\n\n            $count++;\n        }\n\n        if (! $count) {\n            return response()->json([\n                'message' => trans('admin::app.settings.users.index.mass-update-failed'),\n            ], 400);\n        }\n\n        return response()->json([\n            'message' => trans('admin::app.settings.users.index.mass-update-success'),\n        ]);\n    }\n\n    /**\n     * Mass Delete the specified resources.\n     */\n    public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse\n    {\n        $count = 0;\n\n        $users = $this->userRepository->findWhereIn('id', $massDestroyRequest->input('indices'));\n\n        foreach ($users as $user) {\n            if (auth()->guard('user')->user()->id == $user->id) {\n                continue;\n            }\n\n            Event::dispatch('settings.user.delete.before', $user->id);\n\n            $this->userRepository->delete($user->id);\n\n            Event::dispatch('settings.user.delete.after', $user->id);\n\n            $count++;\n        }\n\n        if (! $count) {\n            return response()->json([\n                'message' => trans('admin::app.settings.users.index.mass-delete-failed'),\n            ], 400);\n        }\n\n        return response()->json([\n            'message' => trans('admin::app.settings.users.index.mass-delete-success'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/ActivityController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings\\Warehouse;\n\nuse Illuminate\\Http\\Response;\nuse Webkul\\Activity\\Repositories\\ActivityRepository;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Resources\\ActivityResource;\nuse Webkul\\Email\\Repositories\\EmailRepository;\n\nclass ActivityController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected ActivityRepository $activityRepository,\n        protected EmailRepository $emailRepository\n    ) {}\n\n    /**\n     * Display a listing of the resource.\n     *\n     * @param  int  $id\n     * @return Response\n     */\n    public function index($id)\n    {\n        $activities = $this->activityRepository\n            ->leftJoin('warehouse_activities', 'activities.id', '=', 'warehouse_activities.activity_id')\n            ->where('warehouse_activities.warehouse_id', $id)\n            ->get();\n\n        return ActivityResource::collection($this->concatEmail($activities));\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function concatEmail($activities)\n    {\n        return $activities->sortByDesc('id')->sortByDesc('created_at');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/TagController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings\\Warehouse;\n\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Event;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Warehouse\\Repositories\\WarehouseRepository;\n\nclass TagController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected WarehouseRepository $warehouseRepository) {}\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @param  int  $id\n     * @return Response\n     */\n    public function attach($id)\n    {\n        Event::dispatch('warehouse.tag.create.before', $id);\n\n        $warehouse = $this->warehouseRepository->find($id);\n\n        if (! $warehouse->tags->contains(request()->input('tag_id'))) {\n            $warehouse->tags()->attach(request()->input('tag_id'));\n        }\n\n        Event::dispatch('warehouse.tag.create.after', $warehouse);\n\n        return response()->json([\n            'message' => trans('admin::app.warehouse.view.tags.create-success'),\n        ]);\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     *\n     * @param  int  $warehouseId\n     * @return Response\n     */\n    public function detach($warehouseId)\n    {\n        Event::dispatch('warehouse.tag.delete.before', $warehouseId);\n\n        $warehouse = $this->warehouseRepository->find($warehouseId);\n\n        $warehouse->tags()->detach(request()->input('tag_id'));\n\n        Event::dispatch('warehouse.tag.delete.after', $warehouse);\n\n        return response()->json([\n            'message' => trans('admin::app.leads.view.tags.destroy-success'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/Warehouse/WarehouseController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings\\Warehouse;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Prettus\\Repository\\Criteria\\RequestCriteria;\nuse Webkul\\Admin\\DataGrids\\Product\\ProductDataGrid;\nuse Webkul\\Admin\\DataGrids\\Settings\\WarehouseDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Requests\\AttributeForm;\nuse Webkul\\Warehouse\\Repositories\\WarehouseRepository;\n\nclass WarehouseController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected WarehouseRepository $warehouseRepository)\n    {\n        request()->request->add(['entity_type' => 'warehouses']);\n    }\n\n    /**\n     * Display a listing of the resource.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(WarehouseDataGrid::class)->process();\n        }\n\n        return view('admin::settings.warehouses.index');\n    }\n\n    /**\n     * Search location results\n     */\n    public function search(): JsonResponse\n    {\n        $results = $this->warehouseRepository\n            ->pushCriteria(app(RequestCriteria::class))\n            ->all();\n\n        return response()->json($results);\n    }\n\n    /**\n     * Display a listing of the product resource.\n     */\n    public function products(int $id)\n    {\n        if (request()->ajax()) {\n            return datagrid(ProductDataGrid::class)->process();\n        }\n\n        $warehouse = $this->warehouseRepository->findOrFail($id);\n\n        return view('admin::settings.warehouses.products', compact('warehouse'));\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function create(): View\n    {\n        return view('admin::settings.warehouses.create');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(AttributeForm $request): RedirectResponse\n    {\n        Event::dispatch('settings.warehouse.create.before');\n\n        $warehouse = $this->warehouseRepository->create($request->all());\n\n        Event::dispatch('settings.warehouse.create.after', $warehouse);\n\n        session()->flash('success', trans('admin::app.settings.warehouses.index.create-success'));\n\n        return redirect()->route('admin.settings.warehouses.index');\n    }\n\n    /**\n     * Show the form for viewing the specified resource.\n     */\n    public function view(int $id): View\n    {\n        $warehouse = $this->warehouseRepository->findOrFail($id);\n\n        return view('admin::settings.warehouses.view', compact('warehouse'));\n    }\n\n    /**\n     * Show the form for editing the specified resource.\n     *\n     * @param  int  $id\n     * @return View\n     */\n    public function edit($id)\n    {\n        $warehouse = $this->warehouseRepository->findOrFail($id);\n\n        return view('admin::settings.warehouses.edit', compact('warehouse'));\n    }\n\n    /**\n     * Update the specified resource in storage.\n     */\n    public function update(AttributeForm $request, int $id): RedirectResponse|JsonResponse\n    {\n        Event::dispatch('settings.warehouse.update.before', $id);\n\n        $warehouse = $this->warehouseRepository->update($request->all(), $id);\n\n        Event::dispatch('settings.warehouse.update.after', $warehouse);\n\n        if (request()->ajax()) {\n            return response()->json([\n                'data' => $warehouse,\n                'message' => trans('admin::app.settings.warehouses.index.update-success'),\n            ]);\n        }\n\n        session()->flash('success', trans('admin::app.settings.warehouses.index.update-success'));\n\n        return redirect()->route('admin.settings.warehouses.index');\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $this->warehouseRepository->findOrFail($id);\n\n        try {\n            Event::dispatch('settings.warehouse.delete.before', $id);\n\n            $this->warehouseRepository->delete($id);\n\n            Event::dispatch('settings.warehouse.delete.after', $id);\n\n            return response()->json([\n                'message' => trans('admin::app.settings.warehouses.index.delete-success'),\n            ], 200);\n        } catch (\\Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.settings.warehouses.index.delete-success'),\n            ], 400);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/WebFormController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\nuse Webkul\\Lead\\Repositories\\LeadRepository;\nuse Webkul\\Lead\\Repositories\\PipelineRepository;\nuse Webkul\\Lead\\Repositories\\SourceRepository;\nuse Webkul\\Lead\\Repositories\\TypeRepository;\nuse Webkul\\WebForm\\DataGrids\\WebFormDataGrid;\nuse Webkul\\WebForm\\Repositories\\WebFormRepository;\n\nclass WebFormController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected WebFormRepository $webFormRepository,\n        protected PersonRepository $personRepository,\n        protected LeadRepository $leadRepository,\n        protected PipelineRepository $pipelineRepository,\n        protected SourceRepository $sourceRepository,\n        protected TypeRepository $typeRepository\n    ) {}\n\n    /**\n     * Display a listing of the email template.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(WebFormDataGrid::class)->process();\n        }\n\n        return view('admin::settings.web-forms.index');\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function create(): View\n    {\n        $tempAttributes = $this->attributeRepository->findWhereIn('entity_type', ['persons', 'leads']);\n\n        $attributes = [];\n\n        foreach ($tempAttributes as $attribute) {\n            if (\n                $attribute->entity_type == 'persons'\n                && in_array($attribute->code, ['name', 'emails', 'contact_numbers'])\n            ) {\n                $attributes['default'][] = $attribute;\n            } else {\n                $attributes['other'][] = $attribute;\n            }\n        }\n\n        return view('admin::settings.web-forms.create', compact('attributes'));\n    }\n\n    /**\n     * Store a newly created email templates in storage.\n     */\n    public function store(): RedirectResponse\n    {\n        $this->validate(request(), [\n            'title' => 'required',\n            'submit_button_label' => 'required',\n            'submit_success_action' => 'required',\n            'submit_success_content' => 'required',\n        ]);\n\n        Event::dispatch('settings.web_forms.create.before');\n\n        $data = request()->all();\n\n        $webForm = $this->webFormRepository->create($data);\n\n        Event::dispatch('settings.web_forms.create.after', $webForm);\n\n        session()->flash('success', trans('admin::app.settings.webforms.index.create-success'));\n\n        return redirect()->route('admin.settings.web_forms.index');\n    }\n\n    /**\n     * Show the form for editing the specified email template.\n     */\n    public function edit(int $id): View\n    {\n        $webForm = $this->webFormRepository->findOrFail($id);\n\n        $attributes = $this->attributeRepository->findWhere([\n            ['entity_type', 'IN', ['persons', 'leads']],\n            ['id', 'NOTIN', $webForm->attributes()->pluck('attribute_id')->toArray()],\n        ]);\n\n        return view('admin::settings.web-forms.edit', compact('webForm', 'attributes'));\n    }\n\n    /**\n     * Update the specified email template in storage.\n     */\n    public function update(int $id): RedirectResponse\n    {\n        $this->validate(request(), [\n            'title' => 'required',\n            'submit_button_label' => 'required',\n            'submit_success_action' => 'required',\n            'submit_success_content' => 'required',\n        ]);\n\n        Event::dispatch('settings.web_forms.update.before', $id);\n\n        $data = request()->all();\n\n        $webForm = $this->webFormRepository->update($data, $id);\n\n        Event::dispatch('settings.web_forms.update.after', $webForm);\n\n        session()->flash('success', trans('admin::app.settings.webforms.index.update-success'));\n\n        return redirect()->route('admin.settings.web_forms.index');\n    }\n\n    /**\n     * Remove the specified email template from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $webForm = $this->webFormRepository->findOrFail($id);\n\n        try {\n            Event::dispatch('settings.web_forms.delete.before', $id);\n\n            $webForm->delete($id);\n\n            Event::dispatch('settings.web_forms.delete.after', $id);\n\n            return response()->json([\n                'message' => trans('admin::app.settings.webforms.index.delete-success'),\n            ]);\n        } catch (\\Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.settings.webforms.index.delete-failed'),\n            ], 400);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/WebhookController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\DataGrids\\Settings\\WebhookDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Requests\\WebhookRequest;\nuse Webkul\\Automation\\Repositories\\WebhookRepository;\n\nclass WebhookController extends Controller\n{\n    public function __construct(protected WebhookRepository $webhookRepository) {}\n\n    /**\n     * Display the listing of the resource.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(WebhookDataGrid::class)->process();\n        }\n\n        return view('admin::settings.webhook.index');\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function create(): View\n    {\n        return view('admin::settings.webhook.create');\n    }\n\n    /**\n     * Store the newly created resource in storage.\n     */\n    public function store(WebhookRequest $webhookRequest): RedirectResponse\n    {\n        Event::dispatch('settings.webhook.create.before');\n\n        $webhook = $this->webhookRepository->create($webhookRequest->validated());\n\n        Event::dispatch('settings.webhook.create.after', $webhook);\n\n        session()->flash('success', trans('admin::app.settings.webhooks.index.create-success'));\n\n        return redirect()->route('admin.settings.webhooks.index');\n    }\n\n    /**\n     * Store the newly created resource in storage.\n     */\n    public function edit(int $id): View\n    {\n        $webhook = $this->webhookRepository->findOrFail($id);\n\n        return view('admin::settings.webhook.edit', compact('webhook'));\n    }\n\n    /**\n     * Update the specified resource in storage.\n     */\n    public function update(WebhookRequest $webhookRequest, int $id): RedirectResponse\n    {\n        Event::dispatch('settings.webhook.update.before', $id);\n\n        $webhook = $this->webhookRepository->update($webhookRequest->validated(), $id);\n\n        Event::dispatch('settings.webhook.update.after', $webhook);\n\n        session()->flash('success', trans('admin::app.settings.webhooks.index.update-success'));\n\n        return redirect()->route('admin.settings.webhooks.index');\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $webhook = $this->webhookRepository->findOrFail($id);\n\n        Event::dispatch('settings.webhook.delete.before', $id);\n\n        $webhook?->delete();\n\n        Event::dispatch('settings.webhook.delete.after', $id);\n\n        return response()->json([\n            'message' => trans('admin::app.settings.webhooks.index.delete-success'),\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/Settings/WorkflowController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\Settings;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\DataGrids\\Settings\\WorkflowDataGrid;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Automation\\Repositories\\WorkflowRepository;\n\nclass WorkflowController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected WorkflowRepository $workflowRepository) {}\n\n    /**\n     * Display a listing of the workflow.\n     */\n    public function index(): View|JsonResponse\n    {\n        if (request()->ajax()) {\n            return datagrid(WorkflowDataGrid::class)->process();\n        }\n\n        return view('admin::settings.workflows.index');\n    }\n\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function create(): View\n    {\n        return view('admin::settings.workflows.create');\n    }\n\n    /**\n     * Store a newly created workflow in storage.\n     */\n    public function store(): RedirectResponse\n    {\n        $this->validate(request(), [\n            'name' => 'required',\n        ]);\n\n        Event::dispatch('settings.workflow.create.before');\n\n        $workflow = $this->workflowRepository->create(request()->all());\n\n        Event::dispatch('settings.workflow.create.after', $workflow);\n\n        session()->flash('success', trans('admin::app.settings.workflows.index.create-success'));\n\n        return redirect()->route('admin.settings.workflows.index');\n    }\n\n    /**\n     * Show the form for editing the specified workflow.\n     */\n    public function edit(int $id): View\n    {\n        $workflow = $this->workflowRepository->findOrFail($id);\n\n        return view('admin::settings.workflows.edit', compact('workflow'));\n    }\n\n    /**\n     * Update the specified workflow in storage.\n     */\n    public function update(int $id): RedirectResponse\n    {\n        $this->validate(request(), [\n            'name' => 'required',\n        ]);\n\n        Event::dispatch('settings.workflow.update.before', $id);\n\n        $workflow = $this->workflowRepository->update(request()->all(), $id);\n\n        Event::dispatch('settings.workflow.update.after', $workflow);\n\n        session()->flash('success', trans('admin::app.settings.workflows.index.update-success'));\n\n        return redirect()->route('admin.settings.workflows.index');\n    }\n\n    /**\n     * Remove the specified workflow from storage.\n     */\n    public function destroy(int $id): JsonResponse\n    {\n        $workflow = $this->workflowRepository->findOrFail($id);\n\n        try {\n            Event::dispatch('settings.workflow.delete.before', $id);\n\n            $workflow->delete($id);\n\n            Event::dispatch('settings.workflow.delete.after', $id);\n\n            return response()->json([\n                'message' => trans('admin::app.settings.workflows.index.delete-success'),\n            ], 200);\n        } catch (\\Exception $exception) {\n            return response()->json([\n                'message' => trans('admin::app.settings.workflows.index.delete-failed'),\n            ], 400);\n        }\n\n        return response()->json([\n            'message' => trans('admin::app.settings.workflows.index.delete-failed'),\n        ], 400);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/TinyMCEController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\UploadedFile;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Webkul\\Core\\Traits\\Sanitizer;\n\nclass TinyMCEController extends Controller\n{\n    use Sanitizer;\n\n    /**\n     * Storage folder path.\n     */\n    private string $storagePath = 'tinymce';\n\n    /**\n     * Upload file from tinymce.\n     */\n    public function upload(): JsonResponse\n    {\n        $media = $this->storeMedia();\n\n        if (! empty($media)) {\n            return response()->json([\n                'location' => $media['file_url'],\n            ]);\n        }\n\n        return response()->json([]);\n    }\n\n    /**\n     * Store media.\n     */\n    public function storeMedia(): array\n    {\n        if (! request()->hasFile('file')) {\n            return [];\n        }\n\n        $file = request()->file('file');\n\n        if (! $file instanceof UploadedFile) {\n            return [];\n        }\n\n        $filename = md5($file->getClientOriginalName().time()).'.'.$file->getClientOriginalExtension();\n\n        $path = $file->storeAs($this->storagePath, $filename);\n\n        $this->sanitizeSVG($path, $file);\n\n        return [\n            'file' => $path,\n            'file_name' => $file->getClientOriginalName(),\n            'file_url' => Storage::url($path),\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/User/AccountController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\User;\n\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Hash;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\n\nclass AccountController extends Controller\n{\n    /**\n     * Show the form for creating a new resource.\n     *\n     * @return View\n     */\n    public function edit()\n    {\n        $user = auth()->guard('user')->user();\n\n        return view('admin::user.account.edit', compact('user'));\n    }\n\n    /**\n     * Update the specified resource in storage.\n     *\n     * @return Response\n     */\n    public function update()\n    {\n        $user = auth()->guard('user')->user();\n\n        $this->validate(request(), [\n            'name' => 'required',\n            'email' => 'email|unique:users,email,'.$user->id,\n            'password' => 'nullable|min:6|confirmed',\n            'current_password' => 'required|min:6',\n            'image.*' => 'nullable|mimes:bmp,jpeg,jpg,png,webp',\n        ]);\n\n        $data = request()->only([\n            'name',\n            'email',\n            'password',\n            'password_confirmation',\n            'current_password',\n            'image',\n        ]);\n\n        if (! Hash::check($data['current_password'], $user->password)) {\n            session()->flash('warning', trans('admin::app.account.edit.invalid-password'));\n\n            return redirect()->back();\n        }\n\n        if (isset($data['role_id']) || isset($data['view_permission'])) {\n            session()->flash('warning', trans('admin::app.user.account.permission-denied'));\n\n            return redirect()->back();\n        }\n\n        $isPasswordChanged = false;\n\n        if (! $data['password']) {\n            unset($data['password']);\n        } else {\n            $isPasswordChanged = true;\n\n            $data['password'] = bcrypt($data['password']);\n        }\n\n        if (request()->hasFile('image')) {\n            $data['image'] = current(request()->file('image'))->store('admins/'.$user->id);\n        } else {\n            if (! isset($data['image'])) {\n                if (! empty($data['image'])) {\n                    Storage::delete($user->image);\n                }\n\n                $data['image'] = null;\n            } else {\n                $data['image'] = $user->image;\n            }\n        }\n\n        $user->update($data);\n\n        if ($isPasswordChanged) {\n            Event::dispatch('user.account.update-password', $user);\n        }\n\n        session()->flash('success', trans('admin::app.account.edit.update-success'));\n\n        return back();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/User/ForgotPasswordController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\User;\n\nuse Illuminate\\Contracts\\Auth\\PasswordBroker;\nuse Illuminate\\Foundation\\Auth\\SendsPasswordResetEmails;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Password;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Notifications\\User\\UserResetPassword;\n\nclass ForgotPasswordController extends Controller\n{\n    use SendsPasswordResetEmails;\n\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function create()\n    {\n        if (auth()->guard('user')->check()) {\n            return redirect()->route('admin.dashboard.index');\n        } else {\n            if (strpos(url()->previous(), 'user') !== false) {\n                $intendedUrl = url()->previous();\n            } else {\n                $intendedUrl = route('admin.dashboard.index');\n            }\n\n            session()->put('url.intended', $intendedUrl);\n\n            return view('admin::sessions.forgot-password');\n        }\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @return Response\n     */\n    public function store()\n    {\n        try {\n            $this->validate(request(), [\n                'email' => 'required|email',\n            ]);\n\n            $response = $this->broker()->sendResetLink(request(['email']), function ($user, $token) {\n                $user->notify(new UserResetPassword($token));\n            });\n\n            if ($response == Password::RESET_LINK_SENT) {\n                session()->flash('success', trans('admin::app.users.forget-password.create.reset-link-sent'));\n\n                return back();\n            }\n\n            return back()\n                ->withInput(request(['email']))\n                ->withErrors([\n                    'email' => trans('admin::app.users.forget-password.create.email-not-exist'),\n                ]);\n        } catch (\\Exception $exception) {\n            session()->flash('error', trans($exception->getMessage()));\n\n            return redirect()->back();\n        }\n    }\n\n    /**\n     * Get the broker to be used during password reset.\n     *\n     * @return PasswordBroker\n     */\n    public function broker()\n    {\n        return Password::broker('users');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/User/ResetPasswordController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\User;\n\nuse Illuminate\\Auth\\Events\\PasswordReset;\nuse Illuminate\\Contracts\\Auth\\CanResetPassword;\nuse Illuminate\\Contracts\\Auth\\PasswordBroker;\nuse Illuminate\\Contracts\\View\\Factory;\nuse Illuminate\\Foundation\\Auth\\ResetsPasswords;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Hash;\nuse Illuminate\\Support\\Facades\\Password;\nuse Illuminate\\Support\\Str;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\n\nclass ResetPasswordController extends Controller\n{\n    use ResetsPasswords;\n\n    /**\n     * Display the password reset view for the given token.\n     *\n     * If no token is present, display the link request form.\n     *\n     * @param  string|null  $token\n     * @return Factory|View\n     */\n    public function create($token = null)\n    {\n        return view('admin::sessions.reset-password')->with([\n            'token' => $token,\n            'email' => request('email'),\n        ]);\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     *\n     * @return Response\n     */\n    public function store()\n    {\n        try {\n            $this->validate(request(), [\n                'token' => 'required',\n                'email' => 'required|email',\n                'password' => 'required|confirmed|min:6',\n            ]);\n\n            $response = $this->broker()->reset(\n                request(['email', 'password', 'password_confirmation', 'token']), function ($admin, $password) {\n                    $this->resetPassword($admin, $password);\n                }\n            );\n\n            if ($response == Password::PASSWORD_RESET) {\n                return redirect()->route('admin.dashboard.index');\n            }\n\n            return back()\n                ->withInput(request(['email']))\n                ->withErrors([\n                    'email' => trans($response),\n                ]);\n        } catch (\\Exception $exception) {\n            session()->flash('error', trans($exception->getMessage()));\n\n            return redirect()->back();\n        }\n    }\n\n    /**\n     * Reset the given admin's password.\n     *\n     * @param  CanResetPassword  $admin\n     * @param  string  $password\n     * @return void\n     */\n    protected function resetPassword($admin, $password)\n    {\n        $admin->password = Hash::make($password);\n\n        $admin->setRememberToken(Str::random(60));\n\n        $admin->save();\n\n        event(new PasswordReset($admin));\n\n        auth()->guard('user')->login($admin);\n    }\n\n    /**\n     * Get the broker to be used during password reset.\n     *\n     * @return PasswordBroker\n     */\n    public function broker()\n    {\n        return Password::broker('users');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Controllers/User/SessionController.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Controllers\\User;\n\nuse Illuminate\\Http\\RedirectResponse;\nuse Illuminate\\Support\\Collection;\nuse Illuminate\\View\\View;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Core\\Menu\\MenuItem;\n\nclass SessionController extends Controller\n{\n    /**\n     * Show the form for creating a new resource.\n     */\n    public function create(): RedirectResponse|View\n    {\n        if (auth()->guard('user')->check()) {\n            return redirect()->route('admin.dashboard.index');\n        }\n\n        $previousUrl = url()->previous();\n\n        $intendedUrl = str_contains($previousUrl, 'admin')\n            ? $previousUrl\n            : route('admin.dashboard.index');\n\n        session()->put('url.intended', $intendedUrl);\n\n        return view('admin::sessions.login');\n    }\n\n    /**\n     * Store a newly created resource in storage.\n     */\n    public function store(): RedirectResponse\n    {\n        $this->validate(request(), [\n            'email' => 'required|email',\n            'password' => 'required',\n        ]);\n\n        if (! auth()->guard('user')->attempt(request(['email', 'password']), request('remember'))) {\n            session()->flash('error', trans('admin::app.users.login-error'));\n\n            return redirect()->back();\n        }\n\n        if (auth()->guard('user')->user()->status == 0) {\n            session()->flash('warning', trans('admin::app.users.activate-warning'));\n\n            auth()->guard('user')->logout();\n\n            return redirect()->route('admin.session.create');\n        }\n\n        $menus = menu()->getItems('admin');\n\n        $availableNextMenu = $menus?->first();\n\n        if (! bouncer()->hasPermission('dashboard')) {\n            if (is_null($availableNextMenu)) {\n                session()->flash('error', trans('admin::app.users.not-permission'));\n\n                auth()->guard('user')->logout();\n\n                return redirect()->route('admin.session.create');\n            }\n\n            return redirect()->to($availableNextMenu->getUrl());\n        }\n\n        $hasAccessToIntendedUrl = $this->canAccessIntendedUrl($menus, redirect()->getIntendedUrl());\n\n        if ($hasAccessToIntendedUrl) {\n            return redirect()->intended(route('admin.dashboard.index'));\n        }\n\n        return redirect()->to($availableNextMenu->getUrl());\n    }\n\n    /**\n     * Remove the specified resource from storage.\n     */\n    public function destroy(): RedirectResponse\n    {\n        auth()->guard('user')->logout();\n\n        return redirect()->route('admin.session.create');\n    }\n\n    /**\n     * Find menu item by URL.\n     */\n    protected function canAccessIntendedUrl(Collection $menus, ?string $url): ?MenuItem\n    {\n        if (is_null($url)) {\n            return null;\n        }\n\n        foreach ($menus as $menu) {\n            if ($menu->getUrl() === $url) {\n                return $menu;\n            }\n\n            if ($menu->haveChildren()) {\n                $found = $this->canAccessIntendedUrl($menu->getChildren(), $url);\n\n                if ($found) {\n                    return $found;\n                }\n            }\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Middleware/Bouncer.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Middleware;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Route;\n\nclass Bouncer\n{\n    /**\n     * Handle an incoming request.\n     *\n     * @param  Request  $request\n     * @param  string|null  $guard\n     * @return mixed\n     */\n    public function handle($request, \\Closure $next, $guard = 'user')\n    {\n        if (! auth()->guard($guard)->check()) {\n            return redirect()->route('admin.session.create');\n        }\n\n        /**\n         * If user status is changed by admin. Then session should be\n         * logged out.\n         */\n        if (! (bool) auth()->guard($guard)->user()->status) {\n            auth()->guard($guard)->logout();\n\n            session()->flash('error', trans('admin::app.errors.401'));\n\n            return redirect()->route('admin.session.create');\n        }\n\n        /**\n         * If somehow the user deleted all permissions, then it should be\n         * auto logged out and need to contact the administrator again.\n         */\n        if ($this->isPermissionsEmpty()) {\n            auth()->guard($guard)->logout();\n\n            session()->flash('error', trans('admin::app.errors.401'));\n\n            return redirect()->route('admin.session.create');\n        }\n\n        return $next($request);\n    }\n\n    /**\n     * Check for user, if they have empty permissions or not except admin.\n     *\n     * @return bool\n     */\n    public function isPermissionsEmpty()\n    {\n        if (! $role = auth()->guard('user')->user()->role) {\n            abort(401, 'This action is unauthorized.');\n        }\n\n        if ($role->permission_type === 'all') {\n            return false;\n        }\n\n        if ($role->permission_type !== 'all' && empty($role->permissions)) {\n            return true;\n        }\n\n        $this->checkIfAuthorized();\n\n        return false;\n    }\n\n    /**\n     * Check authorization.\n     *\n     * @return null\n     */\n    public function checkIfAuthorized()\n    {\n        $roles = acl()->getRoles();\n\n        if (isset($roles[Route::currentRouteName()])) {\n            bouncer()->allow($roles[Route::currentRouteName()]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Middleware/Locale.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Foundation\\Application;\nuse Illuminate\\Http\\Request;\n\nclass Locale\n{\n    /**\n     * The middleware instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        Application $app,\n        Request $request\n    ) {\n        $this->app = $app;\n\n        $this->request = $request;\n    }\n\n    /**\n     * Handle an incoming request.\n     *\n     * @param  Request  $request\n     * @return mixed\n     */\n    public function handle($request, Closure $next)\n    {\n        app()->setLocale(\n            core()->getConfigData('general.general.locale_settings.locale')\n                ?: app()->getLocale()\n        );\n\n        return $next($request);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Middleware/SanitizeUrl.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Str;\nuse Webkul\\Email\\Enums\\SupportedFolderEnum;\n\nclass SanitizeUrl\n{\n    /**\n     * Handle an incoming request.\n     *\n     * @param  Request  $request\n     * @return mixed\n     */\n    public function handle($request, Closure $next)\n    {\n        if ($request->ajax()) {\n            return $next($request);\n        }\n\n        $route = $request->route('route');\n\n        $sanitizedRoute = Str::of($route)->ascii()->lower()->replaceMatches('/[^a-z0-9_-]/', '')->__toString();\n\n        $request->route()->setParameter('route', $sanitizedRoute);\n\n        /**\n         * Whitelist acceptable route values to prevent unexpected input\n         */\n        $allowedRoutes = [\n            SupportedFolderEnum::INBOX->value,\n            SupportedFolderEnum::IMPORTANT->value,\n            SupportedFolderEnum::STARRED->value,\n            SupportedFolderEnum::DRAFT->value,\n            SupportedFolderEnum::OUTBOX->value,\n            SupportedFolderEnum::SENT->value,\n            SupportedFolderEnum::SPAM->value,\n            SupportedFolderEnum::TRASH->value,\n        ];\n\n        if (! in_array($route, $allowedRoutes, true)) {\n            abort(401, trans('admin::app.mail.invalid-route'));\n        }\n\n        return $next($request);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Requests/AttributeForm.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Attribute\\Repositories\\AttributeValueRepository;\nuse Webkul\\Core\\Contracts\\Validations\\Decimal;\n\nclass AttributeForm extends FormRequest\n{\n    /**\n     * @var array\n     */\n    protected $rules = [];\n\n    /**\n     * Create a new form request instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected AttributeValueRepository $attributeValueRepository\n    ) {}\n\n    /**\n     * Determine if the product is authorized to make this request.\n     *\n     * @return bool\n     */\n    public function authorize()\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array\n     */\n    public function rules()\n    {\n        $attributes = $this->attributeRepository->scopeQuery(function ($query) {\n            $query = $query->whereIn('code', array_keys(request()->all()))\n                ->where('entity_type', request('entity_type'));\n\n            if (request()->has('quick_add')) {\n                $query = $query->where('quick_add', 1);\n            }\n\n            return $query;\n        })->get();\n\n        foreach ($attributes as $attribute) {\n            $validations = [];\n\n            if ($attribute->type == 'boolean') {\n                continue;\n            } elseif ($attribute->type == 'address') {\n                if (! $attribute->is_required) {\n                    continue;\n                }\n\n                $validations = [\n                    $attribute->code.'.address' => 'required',\n                    $attribute->code.'.country' => 'required',\n                    $attribute->code.'.state' => 'required',\n                    $attribute->code.'.city' => 'required',\n                    $attribute->code.'.postcode' => 'required',\n                ];\n            } elseif ($attribute->type == 'email') {\n                $validations = [\n                    $attribute->code => [$attribute->is_required ? 'required' : 'nullable'],\n                    $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable', 'email'],\n                    $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable',\n                ];\n            } elseif ($attribute->type == 'phone') {\n                $validations = [\n                    $attribute->code => [$attribute->is_required ? 'required' : 'nullable'],\n                    $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable'],\n                    $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable',\n                ];\n            } else {\n                $validations[$attribute->code] = [$attribute->is_required ? 'required' : 'nullable'];\n\n                if ($attribute->type == 'text' && $attribute->validation) {\n                    array_push($validations[$attribute->code],\n                        $attribute->validation == 'decimal'\n                        ? new Decimal\n                        : $attribute->validation\n                    );\n                }\n\n                if ($attribute->type == 'price') {\n                    array_push($validations[$attribute->code], new Decimal);\n                }\n\n                if ($attribute->type == 'image' && ! request($attribute->code.'.delete')) {\n                    array_push($validations[$attribute->code], 'mimes:bmp,jpeg,jpg,png,webp');\n                }\n            }\n\n            if ($attribute->is_unique) {\n                array_push($validations[in_array($attribute->type, ['email', 'phone'])\n                    ? $attribute->code.'.*.value'\n                    : $attribute->code\n                ], function ($field, $value, $fail) use ($attribute) {\n                    if (! $this->attributeValueRepository->isValueUnique($this->id, $attribute->entity_type, $attribute, request($field))) {\n                        $fail('The value has already been taken.');\n                    }\n                });\n            }\n\n            $this->rules = array_merge($this->rules, $validations);\n        }\n\n        return $this->rules;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Requests/ConfigurationForm.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass ConfigurationForm extends FormRequest\n{\n    /**\n     * Determine if the Configuration is authorized to make this request.\n     *\n     * @return bool\n     */\n    public function authorize()\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array\n     */\n    public function rules()\n    {\n        return collect(request()->input('keys', []))->mapWithKeys(function ($item) {\n            $data = json_decode($item, true);\n\n            return collect($data['fields'])->mapWithKeys(function ($field) use ($data) {\n                $key = $data['key'].'.'.$field['name'];\n\n                // Check delete key exist in the request\n                if (! $this->has($key.'.delete')) {\n                    $validation = isset($field['validation']) && $field['validation'] ? $field['validation'] : 'nullable';\n\n                    return [$key => $validation];\n                }\n\n                return [];\n            })->toArray();\n        })->toArray();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Requests/LeadForm.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Requests;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Foundation\\Http\\FormRequest;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Attribute\\Repositories\\AttributeValueRepository;\nuse Webkul\\Core\\Contracts\\Validations\\Decimal;\n\nclass LeadForm extends FormRequest\n{\n    /**\n     * @var array\n     */\n    protected $rules = [];\n\n    /**\n     * Create a new form request instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected AttributeValueRepository $attributeValueRepository\n    ) {}\n\n    /**\n     * Determine if the product is authorized to make this request.\n     *\n     * @return bool\n     */\n    public function authorize()\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array\n     */\n    public function rules()\n    {\n        foreach (['leads', 'persons'] as $key => $entityType) {\n            $attributes = $this->attributeRepository->scopeQuery(function ($query) use ($entityType) {\n                $attributeCodes = $entityType == 'persons'\n                    ? array_keys(request('person') ?? [])\n                    : array_keys(request()->all());\n\n                $query = $query->whereIn('code', $attributeCodes)\n                    ->where('entity_type', $entityType);\n\n                if (request()->has('quick_add')) {\n                    $query = $query->where('quick_add', 1);\n                }\n\n                return $query;\n            })->get();\n\n            foreach ($attributes as $attribute) {\n                if ($entityType == 'persons') {\n                    $attribute->code = 'person.'.$attribute->code;\n                }\n\n                $validations = [];\n\n                if ($attribute->type == 'boolean') {\n                    continue;\n                } elseif ($attribute->type == 'address') {\n                    if (! $attribute->is_required) {\n                        continue;\n                    }\n\n                    $validations = [\n                        $attribute->code.'.address' => 'required',\n                        $attribute->code.'.country' => 'required',\n                        $attribute->code.'.state' => 'required',\n                        $attribute->code.'.city' => 'required',\n                        $attribute->code.'.postcode' => 'required',\n                    ];\n                } elseif ($attribute->type == 'email') {\n                    $validations = [\n                        $attribute->code => [$attribute->is_required ? 'required' : 'nullable'],\n                        $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable', 'email'],\n                        $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable',\n                    ];\n                } elseif ($attribute->type == 'phone') {\n                    $validations = [\n                        $attribute->code => [$attribute->is_required ? 'required' : 'nullable'],\n                        $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable'],\n                        $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable',\n                    ];\n                } else {\n                    $validations[$attribute->code] = [$attribute->is_required ? 'required' : 'nullable'];\n\n                    if ($attribute->type == 'text' && $attribute->validation) {\n                        array_push($validations[$attribute->code],\n                            $attribute->validation == 'decimal'\n                            ? new Decimal\n                            : $attribute->validation\n                        );\n                    }\n\n                    if ($attribute->type == 'price') {\n                        array_push($validations[$attribute->code], new Decimal);\n                    }\n                }\n\n                if ($attribute->is_unique) {\n                    array_push($validations[in_array($attribute->type, ['email', 'phone'])\n                        ? $attribute->code.'.*.value'\n                        : $attribute->code\n                    ], function ($field, $value, $fail) use ($attribute, $entityType) {\n                        if (! $this->attributeValueRepository->isValueUnique(\n                            $entityType == 'persons' ? request('person.id') : $this->id,\n                            $attribute->entity_type,\n                            $attribute,\n                            request($field)\n                        )\n                        ) {\n                            $fail('The value has already been taken.');\n                        }\n                    });\n                }\n\n                $this->rules = array_merge($this->rules, $validations);\n            }\n        }\n\n        $this->rules['expected_close_date'] = [\n            'date_format:Y-m-d',\n            'after:'.Carbon::yesterday()->format('Y-m-d'),\n        ];\n\n        return [\n            ...$this->rules,\n            'products' => 'array',\n            'products.*.product_id' => 'sometimes|required|exists:products,id',\n            'products.*.name' => 'required_with:products.*.product_id',\n            'products.*.price' => 'required_with:products.*.product_id',\n            'products.*.quantity' => 'required_with:products.*.product_id',\n        ];\n    }\n\n    /**\n     * Get the validation messages that apply to the request.\n     */\n    public function messages(): array\n    {\n        return [\n            'products.*.product_id.exists' => trans('admin::app.leads.selected-product-not-exist'),\n            'products.*.name.required_with' => trans('admin::app.leads.product-name-required'),\n            'products.*.price.required_with' => trans('admin::app.leads.product-price-required'),\n            'products.*.quantity.required_with' => trans('admin::app.leads.product-quantity-required'),\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Requests/MassDestroyRequest.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass MassDestroyRequest extends FormRequest\n{\n    /**\n     * Determine if the request is authorized or not.\n     *\n     * @return bool\n     */\n    public function authorize()\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array\n     */\n    public function rules()\n    {\n        return [\n            'indices' => ['required', 'array'],\n            'indices.*' => ['integer'],\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Requests/MassUpdateRequest.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass MassUpdateRequest extends FormRequest\n{\n    /**\n     * Determine if the request is authorized or not.\n     *\n     * @return bool\n     */\n    public function authorize()\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array\n     */\n    public function rules()\n    {\n        return [\n            'indices' => ['required', 'array'],\n            'indices.*' => ['integer'],\n            'value' => ['required'],\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Requests/PipelineForm.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\nuse Illuminate\\Validation\\Factory as ValidationFactory;\n\nclass PipelineForm extends FormRequest\n{\n    /**\n     * Constructor.\n     *\n     * @return void\n     */\n    public function __construct(ValidationFactory $validationFactory)\n    {\n        $this->validatorExtensions($validationFactory);\n    }\n\n    /**\n     * Determine if the user is authorized to make this request.\n     *\n     * @return bool\n     */\n    public function authorize()\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array\n     */\n    public function rules()\n    {\n        if (request('id')) {\n            return [\n                'name' => 'required|unique:lead_pipelines,name,'.request('id'),\n                'stages.*.name' => 'unique_key',\n                'stages.*.code' => 'unique_key',\n            ];\n        }\n\n        return [\n            'name' => 'required|unique:lead_pipelines,name',\n            'rotten_days' => 'required',\n            'stages.*.name' => 'unique_key',\n            'stages.*.code' => 'unique_key',\n        ];\n    }\n\n    /**\n     * Get the error messages for the defined validation rules.\n     *\n     * @return array\n     */\n    public function messages()\n    {\n        return [\n            'stages.*.name.unique_key' => trans('admin::app.settings.pipelines.duplicate-name'),\n        ];\n    }\n\n    /**\n     * Place all your validator extensions here.\n     *\n     * @return void\n     */\n    public function validatorExtensions(ValidationFactory $validationFactory)\n    {\n        $validationFactory->extend(\n            'unique_key',\n            function ($attribute, $value, $parameters) {\n                $key = last(explode('.', $attribute));\n\n                $stages = collect(request()->get('stages'))->filter(function ($stage) use ($key, $value) {\n                    return $stage[$key] === $value;\n                });\n\n                if ($stages->count() > 1) {\n                    return false;\n                }\n\n                return true;\n            }\n        );\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Requests/UserForm.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\n\nclass UserForm extends FormRequest\n{\n    protected $rules;\n\n    /**\n     * Determine if the user is authorized to make this request.\n     *\n     * @return bool\n     */\n    public function authorize()\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array\n     */\n    public function rules()\n    {\n        $this->rules = [\n            'name' => 'required',\n            'email' => 'email|unique:users,email',\n            'password' => 'nullable',\n            'password_confirmation' => 'nullable|required_with:password|same:password',\n            'status' => 'sometimes',\n            'role_id' => 'required',\n        ];\n\n        if ($this->method() == 'PUT') {\n            $this->rules['email'] = 'email|unique:users,email,'.$this->route('id');\n        }\n\n        return $this->rules;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/ActivityFileResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass ActivityFileResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  Request\n     * @return array\n     */\n    public function toArray($request)\n    {\n        return [\n            'id' => $this->id,\n            'name' => $this->name,\n            'path' => $this->path,\n            'url' => $this->url,\n            'created_at' => $this->created_at,\n            'updated_at' => $this->updated_at,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/ActivityParticipantResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass ActivityParticipantResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  Request\n     * @return array\n     */\n    public function toArray($request)\n    {\n        return [\n            'user' => $this->when($this->user, new UserResource($this->user)),\n            'person' => $this->when($this->person, new PersonResource($this->person)),\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/ActivityResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass ActivityResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  Request\n     * @return array\n     */\n    public function toArray($request)\n    {\n        return [\n            'id' => $this->id,\n            'parent_id' => $this->parent_id ?? null,\n            'title' => $this->title,\n            'type' => $this->type,\n            'comment' => $this->comment,\n            'additional' => is_array($this->resource->additional) ? $this->resource->additional : json_decode($this->resource->additional, true),\n            'schedule_from' => $this->schedule_from,\n            'schedule_to' => $this->schedule_to,\n            'is_done' => $this->is_done,\n            'user' => new UserResource($this->user),\n            'files' => ActivityFileResource::collection($this->files),\n            'participants' => ActivityParticipantResource::collection($this->participants),\n            'location' => $this->location,\n            'created_at' => $this->created_at,\n            'updated_at' => $this->updated_at,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/EmailAttachmentResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass EmailAttachmentResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  Request\n     * @return array\n     */\n    public function toArray($request)\n    {\n        return [\n            'id' => $this->id,\n            'name' => $this->name,\n            'path' => $this->path,\n            'url' => $this->url,\n            'size' => $this->size,\n            'content_type' => $this->content_type,\n            'content_id' => $this->content_id,\n            'created_at' => $this->created_at,\n            'updated_at' => $this->updated_at,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/EmailResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass EmailResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  Request\n     * @return array\n     */\n    public function toArray($request)\n    {\n        return [\n            'id' => $this->id,\n            'subject' => $this->subject,\n            'source' => $this->source,\n            'user_type' => $this->user_type,\n            'name' => $this->name,\n            'reply' => $this->reply,\n            'is_read' => $this->is_read,\n            'folders' => $this->folders,\n            'from' => $this->from,\n            'sender' => $this->sender,\n            'reply_to' => $this->reply_to,\n            'cc' => $this->cc,\n            'bcc' => $this->bcc,\n            'unique_id' => $this->unique_id,\n            'message_id' => $this->message_id,\n            'reference_ids' => $this->reference_ids,\n            'person' => new PersonResource($this->person),\n            'lead' => new LeadResource($this->lead),\n            'parent_id' => $this->parent_id,\n            'parent' => new EmailResource($this->parent),\n            'attachments' => EmailAttachmentResource::collection($this->attachments),\n            'created_at' => $this->created_at,\n            'updated_at' => $this->updated_at,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/LeadResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass LeadResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  Request\n     * @return array\n     */\n    public function toArray($request)\n    {\n        return [\n            'id' => $this->id,\n            'title' => $this->title,\n            'lead_value' => $this->lead_value,\n            'formatted_lead_value' => core()->formatBasePrice($this->lead_value),\n            'status' => $this->status,\n            'expected_close_date' => $this->expected_close_date,\n            'rotten_days' => $this->rotten_days,\n            'closed_at' => $this->closed_at,\n            'created_at' => $this->created_at,\n            'updated_at' => $this->updated_at,\n            'person' => new PersonResource($this->person),\n            'user' => new UserResource($this->user),\n            'type' => new TypeResource($this->type),\n            'source' => new SourceResource($this->source),\n            'pipeline' => new PipelineResource($this->pipeline),\n            'stage' => new StageResource($this->stage),\n            'tags' => TagResource::collection($this->tags),\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/OrganizationResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass OrganizationResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  Request\n     * @return array\n     */\n    public function toArray($request)\n    {\n        return [\n            'id' => $this->id,\n            'name' => $this->name,\n            'address' => $this->address,\n            'created_at' => $this->created_at,\n            'updated_at' => $this->updated_at,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/PersonResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass PersonResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  Request\n     * @return array\n     */\n    public function toArray($request)\n    {\n        return [\n            'id' => $this->id,\n            'name' => $this->name,\n            'emails' => $this->emails,\n            'contact_numbers' => $this->contact_numbers,\n            'organization' => new OrganizationResource($this->organization),\n            'created_at' => $this->created_at,\n            'updated_at' => $this->updated_at,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/PipelineResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass PipelineResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  Request\n     * @return array\n     */\n    public function toArray($request)\n    {\n        return [\n            'id' => $this->id,\n            'name' => $this->name,\n            'is_default' => $this->is_default,\n            'rotten_days' => $this->rotten_days,\n            'stages' => StageResource::collection($this->stages),\n            'created_at' => $this->created_at,\n            'updated_at' => $this->updated_at,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/ProductResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass ProductResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  Request\n     * @return array\n     */\n    public function toArray($request)\n    {\n        return [\n            'id' => $this->id,\n            'name' => $this->name,\n            'description' => $this->description,\n            'sku' => $this->sku,\n            'price' => $this->price,\n            'created_at' => $this->created_at,\n            'updated_at' => $this->updated_at,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/QuoteResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass QuoteResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     */\n    public function toArray(Request $request): array\n    {\n        return [\n            'id' => $this->id,\n            'subject' => $this->subject,\n            'description' => $this->description,\n            'billing_address' => $this->billing_address,\n            'shipping_address' => $this->shipping_address,\n            'discount_percent' => $this->discount_percent,\n            'discount_amount' => $this->discount_amount,\n            'tax_amount' => $this->tax_amount,\n            'adjustment_amount' => $this->adjustment_amount,\n            'sub_total' => $this->sub_total,\n            'grand_total' => $this->grand_total,\n            'expired_at' => $this->expired_at,\n            'user' => new UserResource($this->user),\n            'person' => new PersonResource($this->person),\n            'leads' => LeadResource::collection($this->leads),\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/SourceResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass SourceResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  Request\n     * @return array\n     */\n    public function toArray($request)\n    {\n        return [\n            'id' => $this->id,\n            'name' => $this->name,\n            'created_at' => $this->created_at,\n            'updated_at' => $this->updated_at,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/StageResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass StageResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  Request\n     * @return array\n     */\n    public function toArray($request)\n    {\n        return [\n            'id' => $this->id,\n            'code' => $this->code,\n            'name' => $this->name,\n            'lead_value' => $this->lead_value,\n            'formatted_lead_value' => core()->formatBasePrice($this->lead_value),\n            'is_user_defined' => $this->is_user_defined,\n            'sort_order' => $this->sort_order,\n            'created_at' => $this->created_at,\n            'updated_at' => $this->updated_at,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/TagResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass TagResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  Request\n     * @return array\n     */\n    public function toArray($request)\n    {\n        return [\n            'id' => $this->id,\n            'name' => $this->name,\n            'color' => $this->color,\n            'user' => new UserResource($this->user),\n            'created_at' => $this->created_at,\n            'updated_at' => $this->updated_at,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/TypeResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass TypeResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  Request\n     * @return array\n     */\n    public function toArray($request)\n    {\n        return [\n            'id' => $this->id,\n            'name' => $this->name,\n            'created_at' => $this->created_at,\n            'updated_at' => $this->updated_at,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/Resources/UserResource.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Http\\Resources;\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Http\\Resources\\Json\\JsonResource;\n\nclass UserResource extends JsonResource\n{\n    /**\n     * Transform the resource into an array.\n     *\n     * @param  Request\n     * @return array\n     */\n    public function toArray($request)\n    {\n        return [\n            'id' => $this->id,\n            'name' => $this->name,\n            'email' => $this->email,\n            'image' => $this->image,\n            'created_at' => $this->created_at,\n            'updated_at' => $this->name,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Http/helpers.php",
    "content": "<?php\n\nif (! function_exists('bouncer')) {\n    function bouncer()\n    {\n        return app()->make('bouncer');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Listeners/Activity.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Listeners;\n\nuse Webkul\\Activity\\Contracts\\Activity as ActivityContract;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\nuse Webkul\\Lead\\Repositories\\LeadRepository;\nuse Webkul\\Product\\Repositories\\ProductRepository;\nuse Webkul\\Warehouse\\Repositories\\WarehouseRepository;\n\nclass Activity\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected LeadRepository $leadRepository,\n        protected PersonRepository $personRepository,\n        protected ProductRepository $productRepository,\n        protected WarehouseRepository $warehouseRepository\n    ) {}\n\n    /**\n     * Link activity to lead or person.\n     */\n    public function afterUpdateOrCreate(ActivityContract $activity): void\n    {\n        if (request()->input('lead_id')) {\n            $lead = $this->leadRepository->find(request()->input('lead_id'));\n\n            if (! $lead->activities->contains($activity->id)) {\n                $lead->activities()->attach($activity->id);\n            }\n        } elseif (request()->input('person_id')) {\n            $person = $this->personRepository->find(request()->input('person_id'));\n\n            if (! $person->activities->contains($activity->id)) {\n                $person->activities()->attach($activity->id);\n            }\n        } elseif (request()->input('warehouse_id')) {\n            $warehouse = $this->warehouseRepository->find(request()->input('warehouse_id'));\n\n            if (! $warehouse->activities->contains($activity->id)) {\n                $warehouse->activities()->attach($activity->id);\n            }\n        } elseif (request()->input('product_id')) {\n            $product = $this->productRepository->find(request()->input('product_id'));\n\n            if (! $product->activities->contains($activity->id)) {\n                $product->activities()->attach($activity->id);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Listeners/Lead.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Listeners;\n\nuse Webkul\\Email\\Repositories\\EmailRepository;\n\nclass Lead\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected EmailRepository $emailRepository) {}\n\n    /**\n     * @param  \\Webkul\\Lead\\Models\\Lead  $lead\n     * @return void\n     */\n    public function linkToEmail($lead)\n    {\n        if (! request('email_id')) {\n            return;\n        }\n\n        $this->emailRepository->update([\n            'lead_id' => $lead->id,\n        ], request('email_id'));\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Listeners/Person.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Listeners;\n\nuse Webkul\\Email\\Repositories\\EmailRepository;\n\nclass Person\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(protected EmailRepository $emailRepository) {}\n\n    /**\n     * @param  \\Webkul\\Contact\\Models\\Person  $person\n     * @return void\n     */\n    public function linkToEmail($person)\n    {\n        if (! request('email_id')) {\n            return;\n        }\n\n        $this->emailRepository->update([\n            'person_id' => $person->id,\n        ], request('email_id'));\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Notifications/Common.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Notifications;\n\nuse Illuminate\\Mail\\Mailable;\n\nclass Common extends Mailable\n{\n    /**\n     * Create a new notification instance.\n     *\n     * @return void\n     */\n    public function __construct(public $data) {}\n\n    /**\n     * Build the mail representation of the notification.\n     */\n    public function build()\n    {\n        $message = $this\n            ->to($this->data['to'])\n            ->subject($this->data['subject'])\n            ->view('admin::emails.common.index', [\n                'body' => $this->data['body'],\n            ]);\n\n        if (isset($this->data['attachments'])) {\n            foreach ($this->data['attachments'] as $attachment) {\n                $message->attachData($attachment['content'], $attachment['name'], [\n                    'mime' => $attachment['mime'],\n                ]);\n            }\n        }\n\n        return $message;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Notifications/User/Create.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Notifications\\User;\n\nuse Illuminate\\Mail\\Mailable;\n\nclass Create extends Mailable\n{\n    /**\n     * @param  object  $user\n     * @return void\n     */\n    public function __construct(public $user) {}\n\n    /**\n     * Build the mail representation of the notification.\n     */\n    public function build()\n    {\n        return $this\n            ->to($this->user->email)\n            ->subject(trans('admin::app.emails.common.user.create-subject'))\n            ->view('admin::emails.users.create', [\n                'user_name' => $this->user->name,\n            ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Notifications/User/UserResetPassword.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Notifications\\User;\n\nuse Illuminate\\Auth\\Notifications\\ResetPassword;\nuse Illuminate\\Notifications\\Messages\\MailMessage;\n\nclass UserResetPassword extends ResetPassword\n{\n    /**\n     * Build the mail representation of the notification.\n     *\n     * @param  mixed  $notifiable\n     * @return MailMessage\n     */\n    public function toMail($notifiable)\n    {\n        if (static::$toMailCallback) {\n            return call_user_func(static::$toMailCallback, $notifiable, $this->token);\n        }\n\n        return (new MailMessage)\n            ->view('admin::emails.users.forget-password', [\n                'user_name' => $notifiable->name,\n                'token' => $this->token,\n            ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Notifications/User/UserUpdatePassword.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Notifications\\User;\n\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Mail\\Mailable;\nuse Illuminate\\Queue\\SerializesModels;\nuse Webkul\\User\\Contracts\\User;\n\nclass UserUpdatePassword extends Mailable\n{\n    use Queueable, SerializesModels;\n\n    /**\n     * Create a new admin instance.\n     *\n     * @param  User  $user\n     * @return void\n     */\n    public function __construct(public $user) {}\n\n    /**\n     * Build the message.\n     *\n     * @return $this\n     */\n    public function build()\n    {\n        return $this->from(core()->getSenderEmailDetails()['email'], core()->getSenderEmailDetails()['name'])\n            ->to($this->user->email, $this->user->name)\n            ->subject(trans('shop::app.mail.update-password.subject'))\n            ->view('shop::emails.users.update-password', ['user' => $this->user]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Providers/AdminServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Providers;\n\nuse Illuminate\\Contracts\\Debug\\ExceptionHandler;\nuse Illuminate\\Database\\Eloquent\\Relations\\Relation;\nuse Illuminate\\Foundation\\AliasLoader;\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Facades\\Blade;\nuse Illuminate\\Support\\Facades\\Route;\nuse Illuminate\\Support\\ServiceProvider;\nuse Webkul\\Admin\\Bouncer;\nuse Webkul\\Admin\\Exceptions\\Handler;\nuse Webkul\\Admin\\Http\\Middleware\\Bouncer as BouncerMiddleware;\nuse Webkul\\Admin\\Http\\Middleware\\Locale;\nuse Webkul\\Admin\\Http\\Middleware\\SanitizeUrl;\nuse Webkul\\Contact\\Models\\Organization;\nuse Webkul\\Contact\\Models\\Person;\nuse Webkul\\Lead\\Models\\Lead;\nuse Webkul\\Product\\Models\\Product;\nuse Webkul\\Quote\\Models\\Quote;\nuse Webkul\\Warehouse\\Models\\Warehouse;\n\nclass AdminServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap services.\n     */\n    public function boot(Router $router): void\n    {\n        $router->aliasMiddleware('user', BouncerMiddleware::class);\n\n        $router->aliasMiddleware('admin_locale', Locale::class);\n\n        $router->aliasMiddleware('sanitize_url', SanitizeUrl::class);\n\n        include __DIR__.'/../Http/helpers.php';\n\n        Route::middleware(['web', 'admin_locale', 'user'])\n            ->prefix(config('app.admin_path'))\n            ->group(__DIR__.'/../Routes/Admin/web.php');\n\n        Route::middleware(['web', 'admin_locale'])\n            ->group(__DIR__.'/../Routes/Front/web.php');\n\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n\n        $this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'admin');\n\n        $this->loadViewsFrom(__DIR__.'/../Resources/views', 'admin');\n\n        Blade::anonymousComponentPath(__DIR__.'/../Resources/views/components', 'admin');\n\n        $this->app->bind(ExceptionHandler::class, Handler::class);\n\n        Relation::morphMap([\n            'leads' => Lead::class,\n            'organizations' => Organization::class,\n            'persons' => Person::class,\n            'products' => Product::class,\n            'quotes' => Quote::class,\n            'warehouses' => Warehouse::class,\n        ]);\n\n        $this->app->register(EventServiceProvider::class);\n    }\n\n    /**\n     * Register services.\n     *\n     * @return void\n     */\n    public function register()\n    {\n        $this->registerFacades();\n\n        $this->registerConfig();\n    }\n\n    /**\n     * Register Bouncer as a singleton.\n     */\n    protected function registerFacades(): void\n    {\n        $loader = AliasLoader::getInstance();\n\n        $loader->alias('Bouncer', \\Webkul\\Admin\\Facades\\Bouncer::class);\n\n        $this->app->singleton('bouncer', function () {\n            return new Bouncer;\n        });\n    }\n\n    /**\n     * Register package config.\n     */\n    protected function registerConfig(): void\n    {\n        $this->mergeConfigFrom(dirname(__DIR__).'/Config/acl.php', 'acl');\n\n        $this->mergeConfigFrom(dirname(__DIR__).'/Config/menu.php', 'menu.admin');\n\n        $this->mergeConfigFrom(dirname(__DIR__).'/Config/core_config.php', 'core_config');\n\n        $this->mergeConfigFrom(dirname(__DIR__).'/Config/attribute_lookups.php', 'attribute_lookups');\n\n        $this->mergeConfigFrom(dirname(__DIR__).'/Config/attribute_entity_types.php', 'attribute_entity_types');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Providers/EventServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Providers;\n\nuse Illuminate\\Foundation\\Support\\Providers\\EventServiceProvider as ServiceProvider;\n\nclass EventServiceProvider extends ServiceProvider\n{\n    /**\n     * The event handler mappings for the application.\n     *\n     * @var array\n     */\n    protected $listen = [\n        'contacts.person.create.after' => [\n            'Webkul\\Admin\\Listeners\\Person@linkToEmail',\n        ],\n\n        'lead.create.after' => [\n            'Webkul\\Admin\\Listeners\\Lead@linkToEmail',\n        ],\n\n        'activity.create.after' => [\n            'Webkul\\Admin\\Listeners\\Activity@afterUpdateOrCreate',\n        ],\n\n        'activity.update.after' => [\n            'Webkul\\Admin\\Listeners\\Activity@afterUpdateOrCreate',\n        ],\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Providers;\n\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    protected $models = [];\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Requests/WebhookRequest.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Requests;\n\nuse Illuminate\\Contracts\\Validation\\ValidationRule;\nuse Illuminate\\Foundation\\Http\\FormRequest;\nuse Illuminate\\Validation\\Rule;\n\nclass WebhookRequest extends FormRequest\n{\n    /**\n     * Determine if the user is authorized to make this request.\n     */\n    public function authorize(): bool\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array<string, ValidationRule|array<mixed>|string>\n     */\n    public function rules()\n    {\n        return [\n            'name' => 'required|string|max:255',\n            'entity_type' => 'required|string|max:255',\n            'description' => 'nullable|string|max:255',\n            'method' => 'required|string|max:255',\n            'end_point' => 'required|string|max:255',\n            'query_params' => 'nullable',\n            'headers' => 'nullable',\n            'payload_type' => [\n                'required',\n                'string',\n                'max:255',\n                Rule::in(['default', 'x-www-form-urlencoded', 'raw']),\n            ],\n            'raw_payload_type' => [\n                'string',\n                'max:255',\n                Rule::in(['json', 'text']),\n            ],\n            'payload' => 'nullable',\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/css/app.css",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n/* -------------------------------- new css -------------------------------- */\n\n@font-face {\n    font-family: 'icomoon';\n    src: url('../fonts/icomoon.woff?w2trdd') format('woff');\n    font-weight: normal;\n    font-style: normal;\n    font-display: block;\n  }\n\n  [class^=\"icon-\"], [class*=\" icon-\"] {\n    /* use !important to prevent issues with browser extensions that change fonts */\n    font-family: 'icomoon' !important;\n    speak: never;\n    font-style: normal;\n    font-weight: normal;\n    font-variant: normal;\n    text-transform: none;\n    line-height: 1;\n\n    /* Better Font Rendering =========== */\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n  }\n\n@layer components {\n    .icon-image:before {\n        content: \"\\e956\";\n    }\n      \n    .icon-bookmark:before {\n        content: \"\\e92c\";\n    }\n\n    .icon-bookmark-active:before {\n        content: \"\\e92d\";\n    }\n\n    .icon-stats-down:before {\n        content: \"\\e94d\";\n    }\n\n    .icon-error:before {\n        content: \"\\e951\";\n    }\n\n    .icon-info:before {\n        content: \"\\e952\";\n    }\n\n    .icon-success:before {\n        content: \"\\e953\";\n    }\n\n    .icon-warning:before {\n        content: \"\\e954\";\n    }\n\n    .icon-stats-down:before {\n        content: \"\\e94d\";\n    }\n\n    .icon-stats-up:before {\n        content: \"\\e94f\";\n    }\n\n    .icon-attribute:before {\n        content: \"\\e947\";\n    }\n\n    .icon-download:before {\n        content: \"\\e948\";\n    }\n\n    .icon-settings-warehouse:before {\n        content: \"\\e94e\";\n    }\n\n    .icon-move:before {\n        content: \"\\e949\";\n    }\n\n    .icon-organization:before {\n        content: \"\\e94a\";\n    }\n\n    .icon-role:before {\n        content: \"\\e94b\";\n    }\n\n    .icon-user:before {\n        content: \"\\e94c\";\n    }\n\n    .icon-system-generate:before {\n        content: \"\\e950\";\n    }\n\n    .icon-settings-attributes:before {\n        content: \"\\e93b\";\n    }\n\n    .icon-settings-flow:before {\n        content: \"\\e93c\";\n    }\n\n    .icon-settings-group:before {\n        content: \"\\e93d\";\n    }\n\n    .icon-settings-mail:before {\n        content: \"\\e93e\";\n    }\n\n    .icon-settings-pipeline:before {\n        content: \"\\e93f\";\n    }\n\n    .icon-settings-roles:before {\n        content: \"\\e940\";\n    }\n\n    .icon-settings-sources:before {\n        content: \"\\e941\";\n    }\n\n    .icon-settings-tag:before {\n        content: \"\\e942\";\n    }\n\n    .icon-settings-type:before {\n        content: \"\\e943\";\n    }\n\n    .icon-settings-user:before {\n        content: \"\\e944\";\n    }\n\n    .icon-settings-webforms:before {\n        content: \"\\e945\";\n    }\n\n    .icon-settings-webhooks:before {\n        content: \"\\e946\";\n    }\n\n    .icon-attached-file:before {\n        content: \"\\e932\";\n    }\n\n    .icon-forward:before {\n        content: \"\\e933\";\n    }\n\n    .icon-location:before {\n        content: \"\\e934\";\n    }\n\n    .icon-pin:before {\n        content: \"\\e935\";\n    }\n\n    .icon-print:before {\n        content: \"\\e936\";\n    }\n\n    .icon-reply-all:before {\n        content: \"\\e937\";\n    }\n\n    .icon-reply:before {\n        content: \"\\e938\";\n    }\n\n    .icon-rotten:before {\n        content: \"\\e939\";\n    }\n\n    .icon-tag:before {\n        content: \"\\e93a\";\n    }\n\n    .icon-list:before {\n        content: \"\\e92e\";\n    }\n\n    .icon-enter:before {\n        content: \"\\e92f\";\n    }\n\n    .icon-kanban:before {\n        content: \"\\e930\";\n    }\n\n    .icon-tick:before {\n        content: \"\\e931\";\n    }\n\n    .icon-eye-hide:before {\n        content: \"\\e929\";\n    }\n\n    .icon-percentage:before {\n        content: \"\\e92a\";\n    }\n\n    .icon-dollar:before {\n        content: \"\\e92b\";\n    }\n\n    .icon-radio-selected:before {\n        content: \"\\e924\";\n    }\n\n    .icon-radio-normal:before {\n        content: \"\\e925\";\n    }\n\n    .icon-folder:before {\n        content: \"\\e926\";\n    }\n\n    .icon-file:before {\n        content: \"\\e927\";\n    }\n\n    .icon-eye:before {\n        content: \"\\e928\";\n    }\n\n    .icon-notification:before {\n        content: \"\\e900\";\n    }\n\n    .icon-configuration:before {\n        content: \"\\e901\";\n    }\n\n    .icon-note:before {\n        content: \"\\e902\";\n    }\n\n    .icon-edit:before {\n        content: \"\\e903\";\n    }\n\n    .icon-menu:before {\n        content: \"\\e955\";\n    }\n\n    .icon-calendar:before {\n        content: \"\\e904\";\n    }\n\n    .icon-delete:before {\n        content: \"\\e905\";\n    }\n\n    .icon-more:before {\n        content: \"\\e906\";\n    }\n\n    .icon-checkbox-multiple:before {\n        content: \"\\e907\";\n    }\n\n    .icon-checkbox-select:before {\n        content: \"\\e908\";\n    }\n\n    .icon-checkbox-outline:before {\n        content: \"\\e909\";\n    }\n\n    .icon-message:before {\n        content: \"\\e90a\";\n    }\n\n    .icon-video:before {\n        content: \"\\e90b\";\n    }\n\n    .icon-attachment:before {\n        content: \"\\e90c\";\n    }\n\n    .icon-sent:before {\n        content: \"\\e90d\";\n    }\n\n    .icon-call:before {\n        content: \"\\e90e\";\n    }\n\n    .icon-meeting:before {\n        content: \"\\e90f\";\n    }\n\n    .icon-light:before {\n        content: \"\\e910\";\n    }\n\n    .icon-dark:before {\n        content: \"\\e911\";\n    }\n\n    .icon-mail:before {\n        content: \"\\e912\";\n    }\n\n    .icon-leads:before {\n        content: \"\\e913\";\n    }\n\n    .icon-filter:before {\n        content: \"\\e914\";\n    }\n\n    .icon-setting:before {\n        content: \"\\e915\";\n    }\n\n    .icon-product:before {\n        content: \"\\e916\";\n    }\n\n    .icon-contact:before {\n        content: \"\\e917\";\n    }\n\n    .icon-activity:before {\n        content: \"\\e918\";\n    }\n\n    .icon-perosnal:before {\n        content: \"\\e919\";\n    }\n\n    .icon-quote:before {\n        content: \"\\e91a\";\n    }\n\n    .icon-dashboard:before {\n        content: \"\\e91b\";\n    }\n\n    .icon-cross-large:before {\n        content: \"\\e91c\";\n    }\n\n    .icon-left-arrow:before {\n        content: \"\\e91d\";\n    }\n\n    .icon-right-arrow:before {\n        content: \"\\e91e\";\n    }\n\n    .icon-up-arrow:before {\n        content: \"\\e91f\";\n    }\n\n    .icon-down-arrow:before {\n        content: \"\\e920\";\n    }\n\n    .icon-search:before {\n        content: \"\\e921\";\n    }\n\n    .icon-add:before {\n        content: \"\\e922\";\n    }\n\n    .icon-add-2:before {\n        content: \"\\e923\";\n    }\n\n    .label-active {\n        @apply max-w-max rounded-md bg-emerald-200 px-3 py-1.5 text-xs font-medium text-emerald-900;\n    }\n\n    .label-inactive {\n        @apply max-w-max rounded-md bg-red-200 px-3 py-1.5 text-xs font-medium text-red-800;\n    }\n\n    [dir=\"ltr\"] .sidebar-rounded::after {\n        @apply content-[''] w-[30px] h-[30px] top-0 right-[-30px] absolute bg-no-repeat pointer-events-none bg-[url(\"../images/corner-clip.svg\")] transition-all;\n    }\n\n    [dir=\"rtl\"] .sidebar-rounded::before {\n        @apply content-[''] w-[30px] h-[30px] top-0 left-[-30px] absolute bg-no-repeat pointer-events-none bg-[url(\"../images/corner-clip.svg\")] transition-all rotate-90;\n    }\n\n    .dark .sidebar-rounded::after {\n        @apply bg-[url(\"../images/dark-corner-clip.svg\")]\n    }\n\n    .dark .sidebar-rounded::before {\n        @apply bg-[url(\"../images/dark-corner-clip.svg\")]\n    }\n\n    .tox.tox-silver-sink.tox-tinymce-aux {\n        z-index: 99999;\n    }\n\n    .stage::after {\n        content: '';\n        position: absolute;\n        top: 50%;\n        right: -10px;\n        width: 24px;\n        height: 24px;\n        z-index: 1;\n        border-radius: 0 0 0 25px;\n        transform: translateY(-50%) rotate(45deg);\n        border-right: 4px solid #f3f4f6;\n        border-top: 4px solid #f3f4f6;\n    }\n\n    .dark .stage::after {\n        content: '';\n        position: absolute;\n        top: 50%;\n        right: -10px;\n        width: 24px;\n        height: 24px;\n        z-index: 1;\n        border-radius: 0 0 0 25px;\n        transform: translateY(-50%) rotate(45deg);\n        border-right: 4px solid #030712;\n        border-top: 4px solid #030712;\n    }\n\n    [dir=\"rtl\"] .stage::before {\n        content: '';\n        position: absolute;\n        top: 50%;\n        left: -10px;\n        width: 24px;\n        height: 24px;\n        z-index: 1;\n        border-radius: 0 0 0 25px;\n        transform: translateY(-50%) rotate(225deg);\n        border-right: 4px solid #f3f4f6;\n        border-top: 4px solid #f3f4f6;\n    }\n\n    [dir=\"rtl\"] .stage::after {\n        display: none;\n    }\n\n    .dark\\:bg-gray-400:is(.dark *) {\n       --tw-bg-opacity: 1 !important;\n        background-color: #1f2937 !important;\n        border: #111827 solid !important;\n        color: #e5e7eb !important;\n    }\n\n    .dark\\:bg-gray-800:is(.dark *) {\n        --tw-bg-opacity: 1;\n        background-color: rgb(16 24 39);\n    }\n\n    .shimmer {\n        animation-duration: 2.2s;\n        animation-fill-mode: forwards;\n        animation-iteration-count: infinite;\n        animation-name: skeleton;\n        animation-timing-function: linear;\n        background: linear-gradient(\n            to right,\n            #f6f6f6 8%,\n            #f0f0f0 18%,\n            #f6f6f6 33%\n        );\n        background-size: 1250px 100%;\n    }\n\n    .light-shimmer-bg {\n        background: linear-gradient(\n            to right,\n            #fafafa 8%,\n            #f5f5f5 18%,\n            #fafafa 33%\n        );\n        background-size: 1250px 100%;\n    }\n\n    .dark .shimmer {\n        background: linear-gradient(\n            to right,\n            #1f2937 8%,\n            #1a2232 18%,\n            #1f2937 33%\n        );\n    }\n\n    .primary-button {\n        @apply bg-brandColor border border-brandColor cursor-pointer flex focus:opacity-[0.9] font-semibold gap-x-1 hover:opacity-[0.9] items-center place-content-center px-3 py-1.5 rounded-md text-gray-50 transition-all;\n    }\n\n    .secondary-button {\n        @apply flex cursor-pointer place-content-center items-center gap-x-1 whitespace-nowrap rounded-md border-2 border-brandColor bg-white px-3 py-1.5 font-semibold text-brandColor transition-all hover:bg-[#eff6ff61] focus:bg-[#eff6ff61] dark:border-gray-400 dark:bg-gray-800 dark:text-white dark:hover:opacity-80;\n    }\n\n    .transparent-button {\n        @apply flex cursor-pointer appearance-none place-content-center items-center gap-x-1 whitespace-nowrap rounded-md border-2 border-transparent px-3 py-1.5 font-semibold text-gray-600 transition-all marker:shadow hover:bg-gray-100 focus:bg-gray-100 dark:hover:bg-gray-950 dark:focus:bg-gray-950;\n    }\n\n    ::-webkit-scrollbar {\n        width: 12px;\n    }\n\n    ::-webkit-scrollbar-track {\n        background: #f1f1f1;\n    }\n\n    ::-webkit-scrollbar-thumb {\n        background: #888;\n        border-radius: 6px;\n    }\n\n    ::-webkit-scrollbar-thumb:hover {\n        background: #555;\n    }\n\n    /* Firefox */\n    * {\n        scrollbar-width: thin;\n        scrollbar-color: #888 #f1f1f1;\n    }\n\n    ::selection {\n        background-color: rgba(0, 68, 242, .2);\n    }\n\n    body {\n        @apply bg-gray-100 text-sm text-gray-800;\n    }\n\n    button:disabled {\n        @apply cursor-not-allowed opacity-50;\n    }\n\n    button:disabled:hover {\n        @apply cursor-not-allowed opacity-50;\n    }\n\n    .draggable-ghost {\n        opacity: 0.5;\n        background: #e0e7ff;\n    }\n\n    html.dark [class^=\"icon-\"],\n    html.dark [class*=\" icon-\"]{\n        color: #d1d5db;\n    }\n\n    p {\n        @apply text-[14px] !leading-[17px];\n    }\n\n    input,\n    textarea,\n    select {\n        @apply outline-none;\n    }\n\n    .journal-scroll::-webkit-scrollbar {\n        width: 14px;\n        cursor: pointer;\n        display: none;\n    }\n\n    .journal-scroll::-webkit-scrollbar-track {\n        background-color: #fff;\n        cursor: pointer;\n        border-radius: 12px;\n        border: 1px solid #e9e9e9;\n    }\n\n    .journal-scroll::-webkit-scrollbar-thumb {\n        cursor: pointer;\n        background-color: #e9e9e9;\n        border-radius: 12px;\n        border: 3px solid transparent;\n        background-clip: content-box;\n    }\n\n    .custom-select {\n        -webkit-appearance: none;\n        -moz-appearance: none;\n        background: transparent;\n        background-image: url(\"data:image/svg+xml;utf8,<svg fill='black' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/><path d='M0 0h24v24H0z' fill='none'/></svg>\");\n        background-repeat: no-repeat;\n        background-position-x: calc(100% - 10px);\n        background-position-y: 50%;\n    }\n\n    .dark .custom-select{\n        background-image: url(\"data:image/svg+xml;utf8,<svg fill='white' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/><path d='M0 0h24v24H0z' fill='none'/></svg>\");\n    }\n\n    [dir=\"rtl\"] .custom-select {\n        background-position-x: calc(100% - (100% - 10px));\n    }\n\n    .draggable-ghost {\n        @apply border border-dashed !border-gray-300;\n    }\n\n    @keyframes skeleton {\n        0% {\n            @apply bg-[-1250px_0];\n        }\n\n        100% {\n            @apply bg-[1250px_0];\n        }\n    }\n\n    .required:after {\n        @apply content-['*'];\n    }\n}\n\n.tox .tox-toolbar__group:last-child button {\n    padding: 6px 8px;\n    background: #eff6ff;\n    color: #2563EB;\n}\n\n.tox .tox-toolbar__group:last-child button:hover {\n    background: #dbeafe;\n}\n\n.tox .tox-toolbar__group:last-child button[aria-disabled=\"true\"] {\n    @apply cursor-not-allowed opacity-50;\n}\n\n.tox .tox-toolbar__group:last-child button {\n    @apply !bg-transparent;\n}\n\n.tox .tox-toolbar__group:last-child button:hover {\n    @apply border-0 !bg-[#3389ec] text-white shadow-none;\n}\n\n.tox.tox-silver-sink.tox-tinymce-aux {\n    z-index: 99999;\n}"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/js/app.js",
    "content": "/**\n * This will track all the images and fonts for publishing.\n */\nimport.meta.glob([\"../images/**\", \"../fonts/**\"]);\n\n/**\n * Main vue bundler.\n */\nimport { createApp } from \"vue/dist/vue.esm-bundler\";\n\n/**\n * Main root application registry.\n */\nwindow.app = createApp({\n    data() {\n        return {\n            isMenuActive: false,\n\n            hoveringMenu: '',\n        };\n    },\n\n    created() {\n        window.addEventListener('click', this.handleFocusOut);\n    },\n\n    beforeDestroy() {\n        window.removeEventListener('click', this.handleFocusOut);\n    },\n\n    methods: {\n        onSubmit() {},\n\n        onInvalidSubmit({ values, errors, results }) {\n            setTimeout(() => {\n                const errorKeys = Object.entries(errors)\n                    .map(([key, value]) => ({ key, value }))\n                    .filter(error => error[\"value\"].length);\n\n                let firstErrorElement = document.querySelector('[name=\"' + errorKeys[0][\"key\"] + '\"]');\n\n                firstErrorElement.scrollIntoView({\n                    behavior: \"smooth\",\n                    block: \"center\"\n                });\n            }, 100);\n        },\n\n        handleMouseOver(event) {\n            if (this.isMenuActive) {\n                return;\n            }\n\n            const parentElement = event.currentTarget.parentElement;\n\n            if (parentElement.classList.contains('sidebar-collapsed')) {\n                parentElement.classList.remove('sidebar-collapsed');\n\n                parentElement.classList.add('sidebar-not-collapsed');\n            }\n\n        },\n\n        handleMouseLeave(event) {\n            if (this.isMenuActive) {\n                return;\n            }\n\n            const parentElement = event.currentTarget.parentElement;\n\n            if (parentElement.classList.contains('sidebar-not-collapsed')) {\n                parentElement.classList.remove('sidebar-not-collapsed');\n\n                parentElement.classList.add('sidebar-collapsed');\n            }\n        },\n\n        handleFocusOut(event) {\n            const sidebar = this.$refs.sidebar;\n\n            if (\n                sidebar &&\n                !sidebar.contains(event.target)\n            ) {\n                this.isMenuActive = false;\n\n                const parentElement = sidebar.parentElement;\n\n                if (parentElement.classList.contains('sidebar-not-collapsed')) {\n                    parentElement.classList.remove('sidebar-not-collapsed');\n\n                    parentElement.classList.add('sidebar-collapsed');\n                }\n            }\n        },\n    },\n});\n\n/**\n * Global plugins registration.\n */\nimport Admin from \"./plugins/admin\";\nimport Axios from \"./plugins/axios\";\nimport Emitter from \"./plugins/emitter\";\nimport Flatpickr from \"./plugins/flatpickr\";\nimport VeeValidate from \"./plugins/vee-validate\";\nimport CreateElement from \"./plugins/createElement\";\nimport Draggable from \"./plugins/draggable\";\nimport VueCal from \"./plugins/vue-cal\";\n\n[\n    Admin,\n    Axios,\n    Emitter,\n    CreateElement,\n    Draggable,\n    Flatpickr,\n    VeeValidate,\n    VueCal,\n].forEach((plugin) => app.use(plugin));\n\n/**\n * Global directives.\n */\nimport Debounce from \"./directives/debounce\";\nimport DOMPurify from \"./directives/dompurify\";\nimport ToolTip from \"./directives/tooltip\";\n\napp.directive(\"debounce\", Debounce);\napp.directive(\"safe-html\", DOMPurify);\napp.directive(\"tooltip\", ToolTip);\n\nexport default app;\n\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/js/chart.js",
    "content": "/**\n * Skipped minification because the original files appears to be already minified.\n * Original file: /npm/chart.js@4.4.0/dist/chart.umd.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n/*!\n * Chart.js v4.4.0\n * https://www.chartjs.org\n * (c) 2023 Chart.js Contributors\n * Released under the MIT License\n */\n!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).Chart=e()}(this,(function(){\"use strict\";var t=Object.freeze({__proto__:null,get Colors(){return Go},get Decimation(){return Qo},get Filler(){return ma},get Legend(){return ya},get SubTitle(){return ka},get Title(){return Ma},get Tooltip(){return Ba}});function e(){}const i=(()=>{let t=0;return()=>t++})();function s(t){return null==t}function n(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return\"[object\"===e.slice(0,7)&&\"Array]\"===e.slice(-6)}function o(t){return null!==t&&\"[object Object]\"===Object.prototype.toString.call(t)}function a(t){return(\"number\"==typeof t||t instanceof Number)&&isFinite(+t)}function r(t,e){return a(t)?t:e}function l(t,e){return void 0===t?e:t}const h=(t,e)=>\"string\"==typeof t&&t.endsWith(\"%\")?parseFloat(t)/100:+t/e,c=(t,e)=>\"string\"==typeof t&&t.endsWith(\"%\")?parseFloat(t)/100*e:+t;function d(t,e,i){if(t&&\"function\"==typeof t.call)return t.apply(i,e)}function u(t,e,i,s){let a,r,l;if(n(t))if(r=t.length,s)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;a<r;a++)e.call(i,t[a],a);else if(o(t))for(l=Object.keys(t),r=l.length,a=0;a<r;a++)e.call(i,t[l[a]],l[a])}function f(t,e){let i,s,n,o;if(!t||!e||t.length!==e.length)return!1;for(i=0,s=t.length;i<s;++i)if(n=t[i],o=e[i],n.datasetIndex!==o.datasetIndex||n.index!==o.index)return!1;return!0}function g(t){if(n(t))return t.map(g);if(o(t)){const e=Object.create(null),i=Object.keys(t),s=i.length;let n=0;for(;n<s;++n)e[i[n]]=g(t[i[n]]);return e}return t}function p(t){return-1===[\"__proto__\",\"prototype\",\"constructor\"].indexOf(t)}function m(t,e,i,s){if(!p(t))return;const n=e[t],a=i[t];o(n)&&o(a)?b(n,a,s):e[t]=g(a)}function b(t,e,i){const s=n(e)?e:[e],a=s.length;if(!o(t))return t;const r=(i=i||{}).merger||m;let l;for(let e=0;e<a;++e){if(l=s[e],!o(l))continue;const n=Object.keys(l);for(let e=0,s=n.length;e<s;++e)r(n[e],t,l,i)}return t}function x(t,e){return b(t,e,{merger:_})}function _(t,e,i){if(!p(t))return;const s=e[t],n=i[t];o(s)&&o(n)?x(s,n):Object.prototype.hasOwnProperty.call(e,t)||(e[t]=g(n))}const y={\"\":t=>t,x:t=>t.x,y:t=>t.y};function v(t){const e=t.split(\".\"),i=[];let s=\"\";for(const t of e)s+=t,s.endsWith(\"\\\\\")?s=s.slice(0,-1)+\".\":(i.push(s),s=\"\");return i}function M(t,e){const i=y[e]||(y[e]=function(t){const e=v(t);return t=>{for(const i of e){if(\"\"===i)break;t=t&&t[i]}return t}}(e));return i(t)}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}const k=t=>void 0!==t,S=t=>\"function\"==typeof t,P=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function D(t){return\"mouseup\"===t.type||\"click\"===t.type||\"contextmenu\"===t.type}const C=Math.PI,O=2*C,A=O+C,T=Number.POSITIVE_INFINITY,L=C/180,E=C/2,R=C/4,I=2*C/3,z=Math.log10,F=Math.sign;function V(t,e,i){return Math.abs(t-e)<i}function B(t){const e=Math.round(t);t=V(t,e,t/1e3)?e:t;const i=Math.pow(10,Math.floor(z(t))),s=t/i;return(s<=1?1:s<=2?2:s<=5?5:10)*i}function W(t){const e=[],i=Math.sqrt(t);let s;for(s=1;s<i;s++)t%s==0&&(e.push(s),e.push(t/s));return i===(0|i)&&e.push(i),e.sort(((t,e)=>t-e)).pop(),e}function N(t){return!isNaN(parseFloat(t))&&isFinite(t)}function H(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function j(t,e,i){let s,n,o;for(s=0,n=t.length;s<n;s++)o=t[s][i],isNaN(o)||(e.min=Math.min(e.min,o),e.max=Math.max(e.max,o))}function $(t){return t*(C/180)}function Y(t){return t*(180/C)}function U(t){if(!a(t))return;let e=1,i=0;for(;Math.round(t*e)/e!==t;)e*=10,i++;return i}function X(t,e){const i=e.x-t.x,s=e.y-t.y,n=Math.sqrt(i*i+s*s);let o=Math.atan2(s,i);return o<-.5*C&&(o+=O),{angle:o,distance:n}}function q(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function K(t,e){return(t-e+A)%O-C}function G(t){return(t%O+O)%O}function Z(t,e,i,s){const n=G(t),o=G(e),a=G(i),r=G(o-n),l=G(a-n),h=G(n-o),c=G(n-a);return n===o||n===a||s&&o===a||r>l&&h<c}function J(t,e,i){return Math.max(e,Math.min(i,t))}function Q(t){return J(t,-32768,32767)}function tt(t,e,i,s=1e-6){return t>=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function et(t,e,i){i=i||(i=>t[i]<e);let s,n=t.length-1,o=0;for(;n-o>1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const it=(t,e,i,s)=>et(t,i,s?s=>{const n=t[s][e];return n<i||n===i&&t[s+1][e]===i}:s=>t[s][e]<i),st=(t,e,i)=>et(t,i,(s=>t[s][e]>=i));function nt(t,e,i){let s=0,n=t.length;for(;s<n&&t[s]<e;)s++;for(;n>s&&t[n-1]>i;)n--;return s>0||n<t.length?t.slice(s,n):t}const ot=[\"push\",\"pop\",\"shift\",\"splice\",\"unshift\"];function at(t,e){t._chartjs?t._chartjs.listeners.push(e):(Object.defineProperty(t,\"_chartjs\",{configurable:!0,enumerable:!1,value:{listeners:[e]}}),ot.forEach((e=>{const i=\"_onData\"+w(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=s.apply(this,e);return t._chartjs.listeners.forEach((t=>{\"function\"==typeof t[i]&&t[i](...e)})),n}})})))}function rt(t,e){const i=t._chartjs;if(!i)return;const s=i.listeners,n=s.indexOf(e);-1!==n&&s.splice(n,1),s.length>0||(ot.forEach((e=>{delete t[e]})),delete t._chartjs)}function lt(t){const e=new Set(t);return e.size===t.length?t:Array.from(e)}const ht=\"undefined\"==typeof window?function(t){return t()}:window.requestAnimationFrame;function ct(t,e){let i=[],s=!1;return function(...n){i=n,s||(s=!0,ht.call(window,(()=>{s=!1,t.apply(e,i)})))}}function dt(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const ut=t=>\"start\"===t?\"left\":\"end\"===t?\"right\":\"center\",ft=(t,e,i)=>\"start\"===t?e:\"end\"===t?i:(e+i)/2,gt=(t,e,i,s)=>t===(s?\"left\":\"right\")?i:\"center\"===t?(e+i)/2:e;function pt(t,e,i){const s=e.length;let n=0,o=s;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:h,max:c,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(n=J(Math.min(it(r,l,h).lo,i?s:it(e,l,a.getPixelForValue(h)).lo),0,s-1)),o=u?J(Math.max(it(r,a.axis,c,!0).hi+1,i?0:it(e,l,a.getPixelForValue(c),!0).hi+1),n,s)-n:s-n}return{start:n,count:o}}function mt(t){const{xScale:e,yScale:i,_scaleRanges:s}=t,n={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!s)return t._scaleRanges=n,!0;const o=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),o}class bt{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],o=e.duration;n.forEach((s=>s({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=ht.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let o,a=n.length-1,r=!1;for(;a>=0;--a)o=n[a],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),r=!0):(n[a]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,\"progress\")),n.length||(i.running=!1,this._notify(s,i,t,\"complete\"),i.initial=!1),e+=n.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),\"complete\")}remove(t){return this._charts.delete(t)}}var xt=new bt;\n/*!\n * @kurkle/color v0.3.2\n * https://github.com/kurkle/color#readme\n * (c) 2023 Jukka Kurkela\n * Released under the MIT License\n */function _t(t){return t+.5|0}const yt=(t,e,i)=>Math.max(Math.min(t,i),e);function vt(t){return yt(_t(2.55*t),0,255)}function Mt(t){return yt(_t(255*t),0,255)}function wt(t){return yt(_t(t/2.55)/100,0,1)}function kt(t){return yt(_t(100*t),0,100)}const St={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Pt=[...\"0123456789ABCDEF\"],Dt=t=>Pt[15&t],Ct=t=>Pt[(240&t)>>4]+Pt[15&t],Ot=t=>(240&t)>>4==(15&t);function At(t){var e=(t=>Ot(t.r)&&Ot(t.g)&&Ot(t.b)&&Ot(t.a))(t)?Dt:Ct;return t?\"#\"+e(t.r)+e(t.g)+e(t.b)+((t,e)=>t<255?e(t):\"\")(t.a,e):void 0}const Tt=/^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;function Lt(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function Et(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function Rt(t,e,i){const s=Lt(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function It(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=function(t,e,i,s,n){return t===n?(e-i)/s+(e<i?6:0):e===n?(i-t)/s+2:(t-e)/s+4}(e,i,s,h,n),r=60*r+.5),[0|r,l||0,a]}function zt(t,e,i,s){return(Array.isArray(e)?t(e[0],e[1],e[2]):t(e,i,s)).map(Mt)}function Ft(t,e,i){return zt(Lt,t,e,i)}function Vt(t){return(t%360+360)%360}function Bt(t){const e=Tt.exec(t);let i,s=255;if(!e)return;e[5]!==i&&(s=e[6]?vt(+e[5]):Mt(+e[5]));const n=Vt(+e[2]),o=+e[3]/100,a=+e[4]/100;return i=\"hwb\"===e[1]?function(t,e,i){return zt(Rt,t,e,i)}(n,o,a):\"hsv\"===e[1]?function(t,e,i){return zt(Et,t,e,i)}(n,o,a):Ft(n,o,a),{r:i[0],g:i[1],b:i[2],a:s}}const Wt={x:\"dark\",Z:\"light\",Y:\"re\",X:\"blu\",W:\"gr\",V:\"medium\",U:\"slate\",A:\"ee\",T:\"ol\",S:\"or\",B:\"ra\",C:\"lateg\",D:\"ights\",R:\"in\",Q:\"turquois\",E:\"hi\",P:\"ro\",O:\"al\",N:\"le\",M:\"de\",L:\"yello\",F:\"en\",K:\"ch\",G:\"arks\",H:\"ea\",I:\"ightg\",J:\"wh\"},Nt={OiceXe:\"f0f8ff\",antiquewEte:\"faebd7\",aqua:\"ffff\",aquamarRe:\"7fffd4\",azuY:\"f0ffff\",beige:\"f5f5dc\",bisque:\"ffe4c4\",black:\"0\",blanKedOmond:\"ffebcd\",Xe:\"ff\",XeviTet:\"8a2be2\",bPwn:\"a52a2a\",burlywood:\"deb887\",caMtXe:\"5f9ea0\",KartYuse:\"7fff00\",KocTate:\"d2691e\",cSO:\"ff7f50\",cSnflowerXe:\"6495ed\",cSnsilk:\"fff8dc\",crimson:\"dc143c\",cyan:\"ffff\",xXe:\"8b\",xcyan:\"8b8b\",xgTMnPd:\"b8860b\",xWay:\"a9a9a9\",xgYF:\"6400\",xgYy:\"a9a9a9\",xkhaki:\"bdb76b\",xmagFta:\"8b008b\",xTivegYF:\"556b2f\",xSange:\"ff8c00\",xScEd:\"9932cc\",xYd:\"8b0000\",xsOmon:\"e9967a\",xsHgYF:\"8fbc8f\",xUXe:\"483d8b\",xUWay:\"2f4f4f\",xUgYy:\"2f4f4f\",xQe:\"ced1\",xviTet:\"9400d3\",dAppRk:\"ff1493\",dApskyXe:\"bfff\",dimWay:\"696969\",dimgYy:\"696969\",dodgerXe:\"1e90ff\",fiYbrick:\"b22222\",flSOwEte:\"fffaf0\",foYstWAn:\"228b22\",fuKsia:\"ff00ff\",gaRsbSo:\"dcdcdc\",ghostwEte:\"f8f8ff\",gTd:\"ffd700\",gTMnPd:\"daa520\",Way:\"808080\",gYF:\"8000\",gYFLw:\"adff2f\",gYy:\"808080\",honeyMw:\"f0fff0\",hotpRk:\"ff69b4\",RdianYd:\"cd5c5c\",Rdigo:\"4b0082\",ivSy:\"fffff0\",khaki:\"f0e68c\",lavFMr:\"e6e6fa\",lavFMrXsh:\"fff0f5\",lawngYF:\"7cfc00\",NmoncEffon:\"fffacd\",ZXe:\"add8e6\",ZcSO:\"f08080\",Zcyan:\"e0ffff\",ZgTMnPdLw:\"fafad2\",ZWay:\"d3d3d3\",ZgYF:\"90ee90\",ZgYy:\"d3d3d3\",ZpRk:\"ffb6c1\",ZsOmon:\"ffa07a\",ZsHgYF:\"20b2aa\",ZskyXe:\"87cefa\",ZUWay:\"778899\",ZUgYy:\"778899\",ZstAlXe:\"b0c4de\",ZLw:\"ffffe0\",lime:\"ff00\",limegYF:\"32cd32\",lRF:\"faf0e6\",magFta:\"ff00ff\",maPon:\"800000\",VaquamarRe:\"66cdaa\",VXe:\"cd\",VScEd:\"ba55d3\",VpurpN:\"9370db\",VsHgYF:\"3cb371\",VUXe:\"7b68ee\",VsprRggYF:\"fa9a\",VQe:\"48d1cc\",VviTetYd:\"c71585\",midnightXe:\"191970\",mRtcYam:\"f5fffa\",mistyPse:\"ffe4e1\",moccasR:\"ffe4b5\",navajowEte:\"ffdead\",navy:\"80\",Tdlace:\"fdf5e6\",Tive:\"808000\",TivedBb:\"6b8e23\",Sange:\"ffa500\",SangeYd:\"ff4500\",ScEd:\"da70d6\",pOegTMnPd:\"eee8aa\",pOegYF:\"98fb98\",pOeQe:\"afeeee\",pOeviTetYd:\"db7093\",papayawEp:\"ffefd5\",pHKpuff:\"ffdab9\",peru:\"cd853f\",pRk:\"ffc0cb\",plum:\"dda0dd\",powMrXe:\"b0e0e6\",purpN:\"800080\",YbeccapurpN:\"663399\",Yd:\"ff0000\",Psybrown:\"bc8f8f\",PyOXe:\"4169e1\",saddNbPwn:\"8b4513\",sOmon:\"fa8072\",sandybPwn:\"f4a460\",sHgYF:\"2e8b57\",sHshell:\"fff5ee\",siFna:\"a0522d\",silver:\"c0c0c0\",skyXe:\"87ceeb\",UXe:\"6a5acd\",UWay:\"708090\",UgYy:\"708090\",snow:\"fffafa\",sprRggYF:\"ff7f\",stAlXe:\"4682b4\",tan:\"d2b48c\",teO:\"8080\",tEstN:\"d8bfd8\",tomato:\"ff6347\",Qe:\"40e0d0\",viTet:\"ee82ee\",JHt:\"f5deb3\",wEte:\"ffffff\",wEtesmoke:\"f5f5f5\",Lw:\"ffff00\",LwgYF:\"9acd32\"};let Ht;function jt(t){Ht||(Ht=function(){const t={},e=Object.keys(Nt),i=Object.keys(Wt);let s,n,o,a,r;for(s=0;s<e.length;s++){for(a=r=e[s],n=0;n<i.length;n++)o=i[n],r=r.replace(o,Wt[o]);o=parseInt(Nt[a],16),t[r]=[o>>16&255,o>>8&255,255&o]}return t}(),Ht.transparent=[0,0,0,0]);const e=Ht[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const $t=/^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;const Yt=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,Ut=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function Xt(t,e,i){if(t){let s=It(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=Ft(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function qt(t,e){return t?Object.assign(e||{},t):t}function Kt(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=Mt(t[3]))):(e=qt(t,{r:0,g:0,b:0,a:1})).a=Mt(e.a),e}function Gt(t){return\"r\"===t.charAt(0)?function(t){const e=$t.exec(t);let i,s,n,o=255;if(e){if(e[7]!==i){const t=+e[7];o=e[8]?vt(t):yt(255*t,0,255)}return i=+e[1],s=+e[3],n=+e[5],i=255&(e[2]?vt(i):yt(i,0,255)),s=255&(e[4]?vt(s):yt(s,0,255)),n=255&(e[6]?vt(n):yt(n,0,255)),{r:i,g:s,b:n,a:o}}}(t):Bt(t)}class Zt{constructor(t){if(t instanceof Zt)return t;const e=typeof t;let i;var s,n,o;\"object\"===e?i=Kt(t):\"string\"===e&&(o=(s=t).length,\"#\"===s[0]&&(4===o||5===o?n={r:255&17*St[s[1]],g:255&17*St[s[2]],b:255&17*St[s[3]],a:5===o?17*St[s[4]]:255}:7!==o&&9!==o||(n={r:St[s[1]]<<4|St[s[2]],g:St[s[3]]<<4|St[s[4]],b:St[s[5]]<<4|St[s[6]],a:9===o?St[s[7]]<<4|St[s[8]]:255})),i=n||jt(t)||Gt(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=qt(this._rgb);return t&&(t.a=wt(t.a)),t}set rgb(t){this._rgb=Kt(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${wt(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):void 0;var t}hexString(){return this._valid?At(this._rgb):void 0}hslString(){return this._valid?function(t){if(!t)return;const e=It(t),i=e[0],s=kt(e[1]),n=kt(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${wt(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}(this._rgb):void 0}mix(t,e){if(t){const i=this.rgb,s=t.rgb;let n;const o=e===n?.5:e,a=2*o-1,r=i.a-s.a,l=((a*r==-1?a:(a+r)/(1+a*r))+1)/2;n=1-l,i.r=255&l*i.r+n*s.r+.5,i.g=255&l*i.g+n*s.g+.5,i.b=255&l*i.b+n*s.b+.5,i.a=o*i.a+(1-o)*s.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=function(t,e,i){const s=Ut(wt(t.r)),n=Ut(wt(t.g)),o=Ut(wt(t.b));return{r:Mt(Yt(s+i*(Ut(wt(e.r))-s))),g:Mt(Yt(n+i*(Ut(wt(e.g))-n))),b:Mt(Yt(o+i*(Ut(wt(e.b))-o))),a:t.a+i*(e.a-t.a)}}(this._rgb,t._rgb,e)),this}clone(){return new Zt(this.rgb)}alpha(t){return this._rgb.a=Mt(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=_t(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Xt(this._rgb,2,t),this}darken(t){return Xt(this._rgb,2,-t),this}saturate(t){return Xt(this._rgb,1,t),this}desaturate(t){return Xt(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=It(t);i[0]=Vt(i[0]+e),i=Ft(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function Jt(t){if(t&&\"object\"==typeof t){const e=t.toString();return\"[object CanvasPattern]\"===e||\"[object CanvasGradient]\"===e}return!1}function Qt(t){return Jt(t)?t:new Zt(t)}function te(t){return Jt(t)?t:new Zt(t).saturate(.5).darken(.1).hexString()}const ee=[\"x\",\"y\",\"borderWidth\",\"radius\",\"tension\"],ie=[\"color\",\"borderColor\",\"backgroundColor\"];const se=new Map;function ne(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let s=se.get(i);return s||(s=new Intl.NumberFormat(t,e),se.set(i,s)),s}(e,i).format(t)}const oe={values:t=>n(t)?t:\"\"+t,numeric(t,e,i){if(0===t)return\"0\";const s=this.chart.options.locale;let n,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(n=\"scientific\"),o=function(t,e){let i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}const a=z(Math.abs(o)),r=isNaN(a)?1:Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),ne(t,s,l)},logarithmic(t,e,i){if(0===t)return\"0\";const s=i[e].significand||t/Math.pow(10,Math.floor(z(t)));return[1,2,3,5,10,15].includes(s)||e>.8*i.length?oe.numeric.call(this,t,e,i):\"\"}};var ae={formatters:oe};const re=Object.create(null),le=Object.create(null);function he(t,e){if(!e)return t;const i=e.split(\".\");for(let e=0,s=i.length;e<s;++e){const s=i[e];t=t[s]||(t[s]=Object.create(null))}return t}function ce(t,e,i){return\"string\"==typeof e?b(he(t,e),i):b(he(t,\"\"),e)}class de{constructor(t,e){this.animation=void 0,this.backgroundColor=\"rgba(0,0,0,0.1)\",this.borderColor=\"rgba(0,0,0,0.1)\",this.color=\"#666\",this.datasets={},this.devicePixelRatio=t=>t.chart.platform.getDevicePixelRatio(),this.elements={},this.events=[\"mousemove\",\"mouseout\",\"click\",\"touchstart\",\"touchmove\"],this.font={family:\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",size:12,style:\"normal\",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>te(e.backgroundColor),this.hoverBorderColor=(t,e)=>te(e.borderColor),this.hoverColor=(t,e)=>te(e.color),this.indexAxis=\"x\",this.interaction={mode:\"nearest\",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return ce(this,t,e)}get(t){return he(this,t)}describe(t,e){return ce(le,t,e)}override(t,e){return ce(re,t,e)}route(t,e,i,s){const n=he(this,t),a=he(this,i),r=\"_\"+e;Object.defineProperties(n,{[r]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[r],e=a[s];return o(t)?Object.assign({},e,t):l(t,e)},set(t){this[r]=t}}})}apply(t){t.forEach((t=>t(this)))}}var ue=new de({_scriptable:t=>!t.startsWith(\"on\"),_indexable:t=>\"events\"!==t,hover:{_fallback:\"interaction\"},interaction:{_scriptable:!1,_indexable:!1}},[function(t){t.set(\"animation\",{delay:void 0,duration:1e3,easing:\"easeOutQuart\",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe(\"animation\",{_fallback:!1,_indexable:!1,_scriptable:t=>\"onProgress\"!==t&&\"onComplete\"!==t&&\"fn\"!==t}),t.set(\"animations\",{colors:{type:\"color\",properties:ie},numbers:{type:\"number\",properties:ee}}),t.describe(\"animations\",{_fallback:\"animation\"}),t.set(\"transitions\",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:\"transparent\"},visible:{type:\"boolean\",duration:0}}},hide:{animations:{colors:{to:\"transparent\"},visible:{type:\"boolean\",easing:\"linear\",fn:t=>0|t}}}})},function(t){t.set(\"layout\",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(t){t.set(\"scale\",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:\"ticks\",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:\"\",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:\"\",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:ae.formatters.values,minor:{},major:{},align:\"center\",crossAlign:\"near\",showLabelBackdrop:!1,backdropColor:\"rgba(255, 255, 255, 0.75)\",backdropPadding:2}}),t.route(\"scale.ticks\",\"color\",\"\",\"color\"),t.route(\"scale.grid\",\"color\",\"\",\"borderColor\"),t.route(\"scale.border\",\"color\",\"\",\"borderColor\"),t.route(\"scale.title\",\"color\",\"\",\"color\"),t.describe(\"scale\",{_fallback:!1,_scriptable:t=>!t.startsWith(\"before\")&&!t.startsWith(\"after\")&&\"callback\"!==t&&\"parser\"!==t,_indexable:t=>\"borderDash\"!==t&&\"tickBorderDash\"!==t&&\"dash\"!==t}),t.describe(\"scales\",{_fallback:\"scale\"}),t.describe(\"scale.ticks\",{_scriptable:t=>\"backdropPadding\"!==t&&\"callback\"!==t,_indexable:t=>\"backdropPadding\"!==t})}]);function fe(){return\"undefined\"!=typeof window&&\"undefined\"!=typeof document}function ge(t){let e=t.parentNode;return e&&\"[object ShadowRoot]\"===e.toString()&&(e=e.host),e}function pe(t,e,i){let s;return\"string\"==typeof t?(s=parseInt(t,10),-1!==t.indexOf(\"%\")&&(s=s/100*e.parentNode[i])):s=t,s}const me=t=>t.ownerDocument.defaultView.getComputedStyle(t,null);function be(t,e){return me(t).getPropertyValue(e)}const xe=[\"top\",\"right\",\"bottom\",\"left\"];function _e(t,e,i){const s={};i=i?\"-\"+i:\"\";for(let n=0;n<4;n++){const o=xe[n];s[o]=parseFloat(t[e+\"-\"+o+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}const ye=(t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot);function ve(t,e){if(\"native\"in t)return t;const{canvas:i,currentDevicePixelRatio:s}=e,n=me(i),o=\"border-box\"===n.boxSizing,a=_e(n,\"padding\"),r=_e(n,\"border\",\"width\"),{x:l,y:h,box:c}=function(t,e){const i=t.touches,s=i&&i.length?i[0]:t,{offsetX:n,offsetY:o}=s;let a,r,l=!1;if(ye(n,o,t.target))a=n,r=o;else{const t=e.getBoundingClientRect();a=s.clientX-t.left,r=s.clientY-t.top,l=!0}return{x:a,y:r,box:l}}(t,i),d=a.left+(c&&r.left),u=a.top+(c&&r.top);let{width:f,height:g}=e;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/s),y:Math.round((h-u)/g*i.height/s)}}const Me=t=>Math.round(10*t)/10;function we(t,e,i,s){const n=me(t),o=_e(n,\"margin\"),a=pe(n.maxWidth,t,\"clientWidth\")||T,r=pe(n.maxHeight,t,\"clientHeight\")||T,l=function(t,e,i){let s,n;if(void 0===e||void 0===i){const o=ge(t);if(o){const t=o.getBoundingClientRect(),a=me(o),r=_e(a,\"border\",\"width\"),l=_e(a,\"padding\");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=pe(a.maxWidth,o,\"clientWidth\"),n=pe(a.maxHeight,o,\"clientHeight\")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||T,maxHeight:n||T}}(t,e,i);let{width:h,height:c}=l;if(\"content-box\"===n.boxSizing){const t=_e(n,\"border\",\"width\"),e=_e(n,\"padding\");h-=e.width+t.width,c-=e.height+t.height}h=Math.max(0,h-o.width),c=Math.max(0,s?h/s:c-o.height),h=Me(Math.min(h,a,l.maxWidth)),c=Me(Math.min(c,r,l.maxHeight)),h&&!c&&(c=Me(h/2));return(void 0!==e||void 0!==i)&&s&&l.height&&c>l.height&&(c=l.height,h=Me(Math.floor(c*s))),{width:h,height:c}}function ke(t,e,i){const s=e||1,n=Math.floor(t.height*s),o=Math.floor(t.width*s);t.height=Math.floor(t.height),t.width=Math.floor(t.width);const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==s||a.height!==n||a.width!==o)&&(t.currentDevicePixelRatio=s,a.height=n,a.width=o,t.ctx.setTransform(s,0,0,s,0,0),!0)}const Se=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener(\"test\",null,e),window.removeEventListener(\"test\",null,e)}catch(t){}return t}();function Pe(t,e){const i=be(t,e),s=i&&i.match(/^(\\d+)(\\.\\d+)?px$/);return s?+s[1]:void 0}function De(t){return!t||s(t.size)||s(t.family)?null:(t.style?t.style+\" \":\"\")+(t.weight?t.weight+\" \":\"\")+t.size+\"px \"+t.family}function Ce(t,e,i,s,n){let o=e[n];return o||(o=e[n]=t.measureText(n).width,i.push(n)),o>s&&(s=o),s}function Oe(t,e,i,s){let o=(s=s||{}).data=s.data||{},a=s.garbageCollect=s.garbageCollect||[];s.font!==e&&(o=s.data={},a=s.garbageCollect=[],s.font=e),t.save(),t.font=e;let r=0;const l=i.length;let h,c,d,u,f;for(h=0;h<l;h++)if(u=i[h],null==u||n(u)){if(n(u))for(c=0,d=u.length;c<d;c++)f=u[c],null==f||n(f)||(r=Ce(t,o,a,r,f))}else r=Ce(t,o,a,r,u);t.restore();const g=a.length/2;if(g>i.length){for(h=0;h<g;h++)delete o[a[h]];a.splice(0,g)}return r}function Ae(t,e,i){const s=t.currentDevicePixelRatio,n=0!==i?Math.max(i/2,.5):0;return Math.round((e-n)*s)/s+n}function Te(t,e){(e=e||t.getContext(\"2d\")).save(),e.resetTransform(),e.clearRect(0,0,t.width,t.height),e.restore()}function Le(t,e,i,s){Ee(t,e,i,s,null)}function Ee(t,e,i,s,n){let o,a,r,l,h,c,d,u;const f=e.pointStyle,g=e.rotation,p=e.radius;let m=(g||0)*L;if(f&&\"object\"==typeof f&&(o=f.toString(),\"[object HTMLImageElement]\"===o||\"[object HTMLCanvasElement]\"===o))return t.save(),t.translate(i,s),t.rotate(m),t.drawImage(f,-f.width/2,-f.height/2,f.width,f.height),void t.restore();if(!(isNaN(p)||p<=0)){switch(t.beginPath(),f){default:n?t.ellipse(i,s,n/2,p,0,0,O):t.arc(i,s,p,0,O),t.closePath();break;case\"triangle\":c=n?n/2:p,t.moveTo(i+Math.sin(m)*c,s-Math.cos(m)*p),m+=I,t.lineTo(i+Math.sin(m)*c,s-Math.cos(m)*p),m+=I,t.lineTo(i+Math.sin(m)*c,s-Math.cos(m)*p),t.closePath();break;case\"rectRounded\":h=.516*p,l=p-h,a=Math.cos(m+R)*l,d=Math.cos(m+R)*(n?n/2-h:l),r=Math.sin(m+R)*l,u=Math.sin(m+R)*(n?n/2-h:l),t.arc(i-d,s-r,h,m-C,m-E),t.arc(i+u,s-a,h,m-E,m),t.arc(i+d,s+r,h,m,m+E),t.arc(i-u,s+a,h,m+E,m+C),t.closePath();break;case\"rect\":if(!g){l=Math.SQRT1_2*p,c=n?n/2:l,t.rect(i-c,s-l,2*c,2*l);break}m+=R;case\"rectRot\":d=Math.cos(m)*(n?n/2:p),a=Math.cos(m)*p,r=Math.sin(m)*p,u=Math.sin(m)*(n?n/2:p),t.moveTo(i-d,s-r),t.lineTo(i+u,s-a),t.lineTo(i+d,s+r),t.lineTo(i-u,s+a),t.closePath();break;case\"crossRot\":m+=R;case\"cross\":d=Math.cos(m)*(n?n/2:p),a=Math.cos(m)*p,r=Math.sin(m)*p,u=Math.sin(m)*(n?n/2:p),t.moveTo(i-d,s-r),t.lineTo(i+d,s+r),t.moveTo(i+u,s-a),t.lineTo(i-u,s+a);break;case\"star\":d=Math.cos(m)*(n?n/2:p),a=Math.cos(m)*p,r=Math.sin(m)*p,u=Math.sin(m)*(n?n/2:p),t.moveTo(i-d,s-r),t.lineTo(i+d,s+r),t.moveTo(i+u,s-a),t.lineTo(i-u,s+a),m+=R,d=Math.cos(m)*(n?n/2:p),a=Math.cos(m)*p,r=Math.sin(m)*p,u=Math.sin(m)*(n?n/2:p),t.moveTo(i-d,s-r),t.lineTo(i+d,s+r),t.moveTo(i+u,s-a),t.lineTo(i-u,s+a);break;case\"line\":a=n?n/2:Math.cos(m)*p,r=Math.sin(m)*p,t.moveTo(i-a,s-r),t.lineTo(i+a,s+r);break;case\"dash\":t.moveTo(i,s),t.lineTo(i+Math.cos(m)*(n?n/2:p),s+Math.sin(m)*p);break;case!1:t.closePath()}t.fill(),e.borderWidth>0&&t.stroke()}}function Re(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.x<e.right+i&&t.y>e.top-i&&t.y<e.bottom+i}function Ie(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()}function ze(t){t.restore()}function Fe(t,e,i,s,n){if(!e)return t.lineTo(i.x,i.y);if(\"middle\"===n){const s=(e.x+i.x)/2;t.lineTo(s,e.y),t.lineTo(s,i.y)}else\"after\"===n!=!!s?t.lineTo(e.x,i.y):t.lineTo(i.x,e.y);t.lineTo(i.x,i.y)}function Ve(t,e,i,s){if(!e)return t.lineTo(i.x,i.y);t.bezierCurveTo(s?e.cp1x:e.cp2x,s?e.cp1y:e.cp2y,s?i.cp2x:i.cp1x,s?i.cp2y:i.cp1y,i.x,i.y)}function Be(t,e,i,s,n){if(n.strikethrough||n.underline){const o=t.measureText(s),a=e-o.actualBoundingBoxLeft,r=e+o.actualBoundingBoxRight,l=i-o.actualBoundingBoxAscent,h=i+o.actualBoundingBoxDescent,c=n.strikethrough?(l+h)/2:h;t.strokeStyle=t.fillStyle,t.beginPath(),t.lineWidth=n.decorationWidth||2,t.moveTo(a,c),t.lineTo(r,c),t.stroke()}}function We(t,e){const i=t.fillStyle;t.fillStyle=e.color,t.fillRect(e.left,e.top,e.width,e.height),t.fillStyle=i}function Ne(t,e,i,o,a,r={}){const l=n(e)?e:[e],h=r.strokeWidth>0&&\"\"!==r.strokeColor;let c,d;for(t.save(),t.font=a.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]),s(e.rotation)||t.rotate(e.rotation),e.color&&(t.fillStyle=e.color),e.textAlign&&(t.textAlign=e.textAlign),e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,r),c=0;c<l.length;++c)d=l[c],r.backdrop&&We(t,r.backdrop),h&&(r.strokeColor&&(t.strokeStyle=r.strokeColor),s(r.strokeWidth)||(t.lineWidth=r.strokeWidth),t.strokeText(d,i,o,r.maxWidth)),t.fillText(d,i,o,r.maxWidth),Be(t,i,o,d,r),o+=Number(a.lineHeight);t.restore()}function He(t,e){const{x:i,y:s,w:n,h:o,radius:a}=e;t.arc(i+a.topLeft,s+a.topLeft,a.topLeft,1.5*C,C,!0),t.lineTo(i,s+o-a.bottomLeft),t.arc(i+a.bottomLeft,s+o-a.bottomLeft,a.bottomLeft,C,E,!0),t.lineTo(i+n-a.bottomRight,s+o),t.arc(i+n-a.bottomRight,s+o-a.bottomRight,a.bottomRight,E,0,!0),t.lineTo(i+n,s+a.topRight),t.arc(i+n-a.topRight,s+a.topRight,a.topRight,0,-E,!0),t.lineTo(i+a.topLeft,s)}function je(t,e=[\"\"],i,s,n=(()=>t[0])){const o=i||t;void 0===s&&(s=ti(\"_fallback\",t));const a={[Symbol.toStringTag]:\"Object\",_cacheable:!0,_scopes:t,_rootScopes:o,_fallback:s,_getTarget:n,override:i=>je([i,...t],e,o,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,s)=>qe(i,s,(()=>function(t,e,i,s){let n;for(const o of e)if(n=ti(Ue(o,t),i),void 0!==n)return Xe(t,n)?Je(i,s,t,n):n}(s,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>ei(t).includes(e),ownKeys:t=>ei(t),set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function $e(t,e,i,s){const a={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:Ye(t,s),setContext:e=>$e(t,e,i,s),override:n=>$e(t.override(n),e,i,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>qe(t,e,(()=>function(t,e,i){const{_proxy:s,_context:a,_subProxy:r,_descriptors:l}=t;let h=s[e];S(h)&&l.isScriptable(e)&&(h=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error(\"Recursion detected: \"+Array.from(r).join(\"->\")+\"->\"+t);r.add(t);let l=e(o,a||s);r.delete(t),Xe(t,l)&&(l=Je(n._scopes,n,t,l));return l}(e,h,t,i));n(h)&&h.length&&(h=function(t,e,i,s){const{_proxy:n,_context:a,_subProxy:r,_descriptors:l}=i;if(void 0!==a.index&&s(t))return e[a.index%e.length];if(o(e[0])){const i=e,s=n._scopes.filter((t=>t!==i));e=[];for(const o of i){const i=Je(s,n,t,o);e.push($e(i,a,r&&r[t],l))}}return e}(e,h,t,l.isIndexable));Xe(e,h)&&(h=$e(h,a,r&&r[e],l));return h}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,s)=>(t[i]=s,delete e[i],!0)})}function Ye(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:s=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:i,indexable:s,isScriptable:S(i)?i:()=>i,isIndexable:S(s)?s:()=>s}}const Ue=(t,e)=>t?t+w(e):e,Xe=(t,e)=>o(e)&&\"adapters\"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function qe(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];const s=i();return t[e]=s,s}function Ke(t,e,i){return S(t)?t(e,i):t}const Ge=(t,e)=>!0===t?e:\"string\"==typeof t?M(e,t):void 0;function Ze(t,e,i,s,n){for(const o of e){const e=Ge(i,o);if(e){t.add(e);const o=Ke(e._fallback,i,n);if(void 0!==o&&o!==i&&o!==s)return o}else if(!1===e&&void 0!==s&&i!==s)return null}return!1}function Je(t,e,i,s){const a=e._rootScopes,r=Ke(e._fallback,i,s),l=[...t,...a],h=new Set;h.add(s);let c=Qe(h,l,i,r||i,s);return null!==c&&((void 0===r||r===i||(c=Qe(h,l,r,c,s),null!==c))&&je(Array.from(h),[\"\"],a,r,(()=>function(t,e,i){const s=t._getTarget();e in s||(s[e]={});const a=s[e];if(n(a)&&o(i))return i;return a||{}}(e,i,s))))}function Qe(t,e,i,s,n){for(;i;)i=Ze(t,e,i,s,n);return i}function ti(t,e){for(const i of e){if(!i)continue;const e=i[t];if(void 0!==e)return e}}function ei(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith(\"_\"))))e.add(t);return Array.from(e)}(t._scopes)),e}function ii(t,e,i,s){const{iScale:n}=t,{key:o=\"r\"}=this._parsing,a=new Array(s);let r,l,h,c;for(r=0,l=s;r<l;++r)h=r+i,c=e[h],a[r]={r:n.parse(M(c,o),h)};return a}const si=Number.EPSILON||1e-14,ni=(t,e)=>e<t.length&&!t[e].skip&&t[e],oi=t=>\"x\"===t?\"y\":\"x\";function ai(t,e,i,s){const n=t.skip?e:t,o=e,a=i.skip?e:i,r=q(o,n),l=q(a,o);let h=r/(r+l),c=l/(r+l);h=isNaN(h)?0:h,c=isNaN(c)?0:c;const d=s*h,u=s*c;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function ri(t,e=\"x\"){const i=oi(e),s=t.length,n=Array(s).fill(0),o=Array(s);let a,r,l,h=ni(t,0);for(a=0;a<s;++a)if(r=l,l=h,h=ni(t,a+1),l){if(h){const t=h[e]-l[e];n[a]=0!==t?(h[i]-l[i])/t:0}o[a]=r?h?F(n[a-1])!==F(n[a])?0:(n[a-1]+n[a])/2:n[a-1]:n[a]}!function(t,e,i){const s=t.length;let n,o,a,r,l,h=ni(t,0);for(let c=0;c<s-1;++c)l=h,h=ni(t,c+1),l&&h&&(V(e[c],0,si)?i[c]=i[c+1]=0:(n=i[c]/e[c],o=i[c+1]/e[c],r=Math.pow(n,2)+Math.pow(o,2),r<=9||(a=3/Math.sqrt(r),i[c]=n*a*e[c],i[c+1]=o*a*e[c])))}(t,n,o),function(t,e,i=\"x\"){const s=oi(i),n=t.length;let o,a,r,l=ni(t,0);for(let h=0;h<n;++h){if(a=r,r=l,l=ni(t,h+1),!r)continue;const n=r[i],c=r[s];a&&(o=(n-a[i])/3,r[`cp1${i}`]=n-o,r[`cp1${s}`]=c-o*e[h]),l&&(o=(l[i]-n)/3,r[`cp2${i}`]=n+o,r[`cp2${s}`]=c+o*e[h])}}(t,o,e)}function li(t,e,i){return Math.max(Math.min(t,i),e)}function hi(t,e,i,s,n){let o,a,r,l;if(e.spanGaps&&(t=t.filter((t=>!t.skip))),\"monotone\"===e.cubicInterpolationMode)ri(t,n);else{let i=s?t[t.length-1]:t[0];for(o=0,a=t.length;o<a;++o)r=t[o],l=ai(i,r,t[Math.min(o+1,a-(s?0:1))%a],e.tension),r.cp1x=l.previous.x,r.cp1y=l.previous.y,r.cp2x=l.next.x,r.cp2y=l.next.y,i=r}e.capBezierPoints&&function(t,e){let i,s,n,o,a,r=Re(t[0],e);for(i=0,s=t.length;i<s;++i)a=o,o=r,r=i<s-1&&Re(t[i+1],e),o&&(n=t[i],a&&(n.cp1x=li(n.cp1x,e.left,e.right),n.cp1y=li(n.cp1y,e.top,e.bottom)),r&&(n.cp2x=li(n.cp2x,e.left,e.right),n.cp2y=li(n.cp2y,e.top,e.bottom)))}(t,i)}const ci=t=>0===t||1===t,di=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*O/i),ui=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*O/i)+1,fi={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*E),easeOutSine:t=>Math.sin(t*E),easeInOutSine:t=>-.5*(Math.cos(C*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>ci(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>ci(t)?t:di(t,.075,.3),easeOutElastic:t=>ci(t)?t:ui(t,.075,.3),easeInOutElastic(t){const e=.1125;return ci(t)?t:t<.5?.5*di(2*t,e,.45):.5+.5*ui(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:t=>1-fi.easeOutBounce(1-t),easeOutBounce(t){const e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:t=>t<.5?.5*fi.easeInBounce(2*t):.5*fi.easeOutBounce(2*t-1)+.5};function gi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function pi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:\"middle\"===s?i<.5?t.y:e.y:\"after\"===s?i<1?t.y:e.y:i>0?e.y:t.y}}function mi(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=gi(t,n,i),r=gi(n,o,i),l=gi(o,e,i),h=gi(a,r,i),c=gi(r,l,i);return gi(h,c,i)}const bi=/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/,xi=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function _i(t,e){const i=(\"\"+t).match(bi);if(!i||\"normal\"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case\"px\":return t;case\"%\":t/=100}return e*t}const yi=t=>+t||0;function vi(t,e){const i={},s=o(e),n=s?Object.keys(e):e,a=o(t)?s?i=>l(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of n)i[t]=yi(a(t));return i}function Mi(t){return vi(t,{top:\"y\",right:\"x\",bottom:\"y\",left:\"x\"})}function wi(t){return vi(t,[\"topLeft\",\"topRight\",\"bottomLeft\",\"bottomRight\"])}function ki(t){const e=Mi(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function Si(t,e){t=t||{},e=e||ue.font;let i=l(t.size,e.size);\"string\"==typeof i&&(i=parseInt(i,10));let s=l(t.style,e.style);s&&!(\"\"+s).match(xi)&&(console.warn('Invalid font style specified: \"'+s+'\"'),s=void 0);const n={family:l(t.family,e.family),lineHeight:_i(l(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:l(t.weight,e.weight),string:\"\"};return n.string=De(n),n}function Pi(t,e,i,s){let o,a,r,l=!0;for(o=0,a=t.length;o<a;++o)if(r=t[o],void 0!==r&&(void 0!==e&&\"function\"==typeof r&&(r=r(e),l=!1),void 0!==i&&n(r)&&(r=r[i%r.length],l=!1),void 0!==r))return s&&!l&&(s.cacheable=!1),r}function Di(t,e,i){const{min:s,max:n}=t,o=c(e,(n-s)/2),a=(t,e)=>i&&0===t?0:t+e;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function Ci(t,e){return Object.assign(Object.create(t),e)}function Oi(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>\"center\"===t?t:\"right\"===t?\"left\":\"right\",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function Ai(t,e){let i,s;\"ltr\"!==e&&\"rtl\"!==e||(i=t.canvas.style,s=[i.getPropertyValue(\"direction\"),i.getPropertyPriority(\"direction\")],i.setProperty(\"direction\",e,\"important\"),t.prevTextDirection=s)}function Ti(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty(\"direction\",e[0],e[1]))}function Li(t){return\"angle\"===t?{between:Z,compare:K,normalize:G}:{between:tt,compare:(t,e)=>t-e,normalize:t=>t}}function Ei({start:t,end:e,count:i,loop:s,style:n}){return{start:t%i,end:e%i,loop:s&&(e-t+1)%i==0,style:n}}function Ri(t,e,i){if(!i)return[t];const{property:s,start:n,end:o}=i,a=e.length,{compare:r,between:l,normalize:h}=Li(s),{start:c,end:d,loop:u,style:f}=function(t,e,i){const{property:s,start:n,end:o}=i,{between:a,normalize:r}=Li(s),l=e.length;let h,c,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,h=0,c=l;h<c&&a(r(e[d%l][s]),n,o);++h)d--,u--;d%=l,u%=l}return u<d&&(u+=l),{start:d,end:u,loop:f,style:t.style}}(t,e,i),g=[];let p,m,b,x=!1,_=null;const y=()=>x||l(n,b,p)&&0!==r(n,b),v=()=>!x||0===r(o,p)||l(o,b,p);for(let t=c,i=c;t<=d;++t)m=e[t%a],m.skip||(p=h(m[s]),p!==b&&(x=l(p,n,o),null===_&&y()&&(_=0===r(p,n)?t:i),null!==_&&v()&&(g.push(Ei({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,b=p));return null!==_&&g.push(Ei({start:_,end:d,loop:u,count:a,style:f})),g}function Ii(t,e){const i=[],s=t.segments;for(let n=0;n<s.length;n++){const o=Ri(s[n],t.points,e);o.length&&i.push(...o)}return i}function zi(t,e){const i=t.points,s=t.options.spanGaps,n=i.length;if(!n)return[];const o=!!t._loop,{start:a,end:r}=function(t,e,i,s){let n=0,o=e-1;if(i&&!s)for(;n<e&&!t[n].skip;)n++;for(;n<e&&t[n].skip;)n++;for(n%=e,i&&(o+=n);o>n&&t[o%e].skip;)o--;return o%=e,{start:n,end:o}}(i,n,o,s);if(!0===s)return Fi(t,[{start:a,end:r,loop:o}],i,e);return Fi(t,function(t,e,i,s){const n=t.length,o=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%n];i.skip||i.stop?l.skip||(s=!1,o.push({start:e%n,end:(a-1)%n,loop:s}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&o.push({start:e%n,end:r%n,loop:s}),o}(i,a,r<a?r+n:r,!!t._fullLoop&&0===a&&r===n-1),i,e)}function Fi(t,e,i,s){return s&&s.setContext&&i?function(t,e,i,s){const n=t._chart.getContext(),o=Vi(t.options),{_datasetIndex:a,options:{spanGaps:r}}=t,l=i.length,h=[];let c=o,d=e[0].start,u=d;function f(t,e,s,n){const o=r?-1:1;if(t!==e){for(t+=l;i[t%l].skip;)t-=o;for(;i[e%l].skip;)e+=o;t%l!=e%l&&(h.push({start:t%l,end:e%l,loop:s,style:n}),c=n,d=e%l)}}for(const t of e){d=r?d:t.start;let e,o=i[d%l];for(u=d+1;u<=t.end;u++){const r=i[u%l];e=Vi(s.setContext(Ci(n,{type:\"segment\",p0:o,p1:r,p0DataIndex:(u-1)%l,p1DataIndex:u%l,datasetIndex:a}))),Bi(e,c)&&f(d,u-1,t.loop,c),o=r,c=e}d<u-1&&f(d,u-1,t.loop,c)}return h}(t,e,i,s):e}function Vi(t){return{backgroundColor:t.backgroundColor,borderCapStyle:t.borderCapStyle,borderDash:t.borderDash,borderDashOffset:t.borderDashOffset,borderJoinStyle:t.borderJoinStyle,borderWidth:t.borderWidth,borderColor:t.borderColor}}function Bi(t,e){if(!e)return!1;const i=[],s=function(t,e){return Jt(e)?(i.includes(e)||i.push(e),i.indexOf(e)):e};return JSON.stringify(t,s)!==JSON.stringify(e,s)}var Wi=Object.freeze({__proto__:null,HALF_PI:E,INFINITY:T,PI:C,PITAU:A,QUARTER_PI:R,RAD_PER_DEG:L,TAU:O,TWO_THIRDS_PI:I,_addGrace:Di,_alignPixel:Ae,_alignStartEnd:ft,_angleBetween:Z,_angleDiff:K,_arrayUnique:lt,_attachContext:$e,_bezierCurveTo:Ve,_bezierInterpolation:mi,_boundSegment:Ri,_boundSegments:Ii,_capitalize:w,_computeSegments:zi,_createResolver:je,_decimalPlaces:U,_deprecated:function(t,e,i,s){void 0!==e&&console.warn(t+': \"'+i+'\" is deprecated. Please use \"'+s+'\" instead')},_descriptors:Ye,_elementsEqual:f,_factorize:W,_filterBetween:nt,_getParentNode:ge,_getStartAndCountOfVisiblePoints:pt,_int16Range:Q,_isBetween:tt,_isClickEvent:D,_isDomSupported:fe,_isPointInArea:Re,_limitValue:J,_longestText:Oe,_lookup:et,_lookupByKey:it,_measureText:Ce,_merger:m,_mergerIf:_,_normalizeAngle:G,_parseObjectDataRadialScale:ii,_pointInLine:gi,_readValueToProps:vi,_rlookupByKey:st,_scaleRangesChanged:mt,_setMinAndMaxByKey:j,_splitKey:v,_steppedInterpolation:pi,_steppedLineTo:Fe,_textX:gt,_toLeftRightCenter:ut,_updateBezierControlPoints:hi,addRoundedRectPath:He,almostEquals:V,almostWhole:H,callback:d,clearCanvas:Te,clipArea:Ie,clone:g,color:Qt,createContext:Ci,debounce:dt,defined:k,distanceBetweenPoints:q,drawPoint:Le,drawPointLegend:Ee,each:u,easingEffects:fi,finiteOrDefault:r,fontString:function(t,e,i){return e+\" \"+t+\"px \"+i},formatNumber:ne,getAngleFromPoint:X,getHoverColor:te,getMaximumSize:we,getRelativePosition:ve,getRtlAdapter:Oi,getStyle:be,isArray:n,isFinite:a,isFunction:S,isNullOrUndef:s,isNumber:N,isObject:o,isPatternOrGradient:Jt,listenArrayEvents:at,log10:z,merge:b,mergeIf:x,niceNum:B,noop:e,overrideTextDirection:Ai,readUsedSize:Pe,renderText:Ne,requestAnimFrame:ht,resolve:Pi,resolveObjectKey:M,restoreTextDirection:Ti,retinaScale:ke,setsEqual:P,sign:F,splineCurve:ai,splineCurveMonotone:ri,supportsEventListenerOptions:Se,throttled:ct,toDegrees:Y,toDimension:c,toFont:Si,toFontString:De,toLineHeight:_i,toPadding:ki,toPercentage:h,toRadians:$,toTRBL:Mi,toTRBLCorners:wi,uid:i,unclipArea:ze,unlistenArrayEvents:rt,valueOrDefault:l});function Ni(t,e,i,s){const{controller:n,data:o,_sorted:a}=t,r=n._cachedMeta.iScale;if(r&&e===r.axis&&\"r\"!==e&&a&&o.length){const t=r._reversePixels?st:it;if(!s)return t(o,e,i);if(n._sharedOptions){const s=o[0],n=\"function\"==typeof s.getRange&&s.getRange(e);if(n){const s=t(o,e,i-n),a=t(o,e,i+n);return{lo:s.lo,hi:a.hi}}}}return{lo:0,hi:o.length-1}}function Hi(t,e,i,s,n){const o=t.getSortedVisibleDatasetMetas(),a=i[e];for(let t=0,i=o.length;t<i;++t){const{index:i,data:r}=o[t],{lo:l,hi:h}=Ni(o[t],e,a,n);for(let t=l;t<=h;++t){const e=r[t];e.skip||s(e,i,t)}}}function ji(t,e,i,s,n){const o=[];if(!n&&!t.isPointInArea(e))return o;return Hi(t,i,e,(function(i,a,r){(n||Re(i,t.chartArea,0))&&i.inRange(e.x,e.y,s)&&o.push({element:i,datasetIndex:a,index:r})}),!0),o}function $i(t,e,i,s,n,o){let a=[];const r=function(t){const e=-1!==t.indexOf(\"x\"),i=-1!==t.indexOf(\"y\");return function(t,s){const n=e?Math.abs(t.x-s.x):0,o=i?Math.abs(t.y-s.y):0;return Math.sqrt(Math.pow(n,2)+Math.pow(o,2))}}(i);let l=Number.POSITIVE_INFINITY;return Hi(t,i,e,(function(i,h,c){const d=i.inRange(e.x,e.y,n);if(s&&!d)return;const u=i.getCenterPoint(n);if(!(!!o||t.isPointInArea(u))&&!d)return;const f=r(e,u);f<l?(a=[{element:i,datasetIndex:h,index:c}],l=f):f===l&&a.push({element:i,datasetIndex:h,index:c})})),a}function Yi(t,e,i,s,n,o){return o||t.isPointInArea(e)?\"r\"!==i||s?$i(t,e,i,s,n,o):function(t,e,i,s){let n=[];return Hi(t,i,e,(function(t,i,o){const{startAngle:a,endAngle:r}=t.getProps([\"startAngle\",\"endAngle\"],s),{angle:l}=X(t,{x:e.x,y:e.y});Z(l,a,r)&&n.push({element:t,datasetIndex:i,index:o})})),n}(t,e,i,n):[]}function Ui(t,e,i,s,n){const o=[],a=\"x\"===i?\"inXRange\":\"inYRange\";let r=!1;return Hi(t,i,e,((t,s,l)=>{t[a](e[i],n)&&(o.push({element:t,datasetIndex:s,index:l}),r=r||t.inRange(e.x,e.y,n))})),s&&!r?[]:o}var Xi={evaluateInteractionItems:Hi,modes:{index(t,e,i,s){const n=ve(e,t),o=i.axis||\"x\",a=i.includeInvisible||!1,r=i.intersect?ji(t,n,o,s,a):Yi(t,n,o,!1,s,a),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=r[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})})),l):[]},dataset(t,e,i,s){const n=ve(e,t),o=i.axis||\"xy\",a=i.includeInvisible||!1;let r=i.intersect?ji(t,n,o,s,a):Yi(t,n,o,!1,s,a);if(r.length>0){const e=r[0].datasetIndex,i=t.getDatasetMeta(e).data;r=[];for(let t=0;t<i.length;++t)r.push({element:i[t],datasetIndex:e,index:t})}return r},point:(t,e,i,s)=>ji(t,ve(e,t),i.axis||\"xy\",s,i.includeInvisible||!1),nearest(t,e,i,s){const n=ve(e,t),o=i.axis||\"xy\",a=i.includeInvisible||!1;return Yi(t,n,o,i.intersect,s,a)},x:(t,e,i,s)=>Ui(t,ve(e,t),\"x\",i.intersect,s),y:(t,e,i,s)=>Ui(t,ve(e,t),\"y\",i.intersect,s)}};const qi=[\"left\",\"top\",\"right\",\"bottom\"];function Ki(t,e){return t.filter((t=>t.pos===e))}function Gi(t,e){return t.filter((t=>-1===qi.indexOf(t.pos)&&t.box.axis===e))}function Zi(t,e){return t.sort(((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight}))}function Ji(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:s,stackWeight:n}=i;if(!t||!qi.includes(s))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=n}return e}(t),{vBoxMaxWidth:s,hBoxMaxHeight:n}=e;let o,a,r;for(o=0,a=t.length;o<a;++o){r=t[o];const{fullSize:a}=r.box,l=i[r.stack],h=l&&r.stackWeight/l.weight;r.horizontal?(r.width=h?h*s:a&&e.availableWidth,r.height=n):(r.width=s,r.height=h?h*n:a&&e.availableHeight)}return i}function Qi(t,e,i,s){return Math.max(t[i],e[i])+Math.max(t[s],e[s])}function ts(t,e){t.top=Math.max(t.top,e.top),t.left=Math.max(t.left,e.left),t.bottom=Math.max(t.bottom,e.bottom),t.right=Math.max(t.right,e.right)}function es(t,e,i,s){const{pos:n,box:a}=i,r=t.maxPadding;if(!o(n)){i.size&&(t[n]-=i.size);const e=s[i.stack]||{size:0,count:1};e.size=Math.max(e.size,i.horizontal?a.height:a.width),i.size=e.size/e.count,t[n]+=i.size}a.getPadding&&ts(r,a.getPadding());const l=Math.max(0,e.outerWidth-Qi(r,t,\"left\",\"right\")),h=Math.max(0,e.outerHeight-Qi(r,t,\"top\",\"bottom\")),c=l!==t.w,d=h!==t.h;return t.w=l,t.h=h,i.horizontal?{same:c,other:d}:{same:d,other:c}}function is(t,e){const i=e.maxPadding;function s(t){const s={left:0,top:0,right:0,bottom:0};return t.forEach((t=>{s[t]=Math.max(e[t],i[t])})),s}return s(t?[\"left\",\"right\"]:[\"top\",\"bottom\"])}function ss(t,e,i,s){const n=[];let o,a,r,l,h,c;for(o=0,a=t.length,h=0;o<a;++o){r=t[o],l=r.box,l.update(r.width||e.w,r.height||e.h,is(r.horizontal,e));const{same:a,other:d}=es(e,i,r,s);h|=a&&n.length,c=c||d,l.fullSize||n.push(r)}return h&&ss(n,e,i,s)||c}function ns(t,e,i,s,n){t.top=i,t.left=e,t.right=e+s,t.bottom=i+n,t.width=s,t.height=n}function os(t,e,i,s){const n=i.padding;let{x:o,y:a}=e;for(const r of t){const t=r.box,l=s[r.stack]||{count:1,placed:0,weight:1},h=r.stackWeight/l.weight||1;if(r.horizontal){const s=e.w*h,o=l.size||t.height;k(l.start)&&(a=l.start),t.fullSize?ns(t,n.left,a,i.outerWidth-n.right-n.left,o):ns(t,e.left+l.placed,a,s,o),l.start=a,l.placed+=s,a=t.bottom}else{const s=e.h*h,a=l.size||t.width;k(l.start)&&(o=l.start),t.fullSize?ns(t,o,n.top,a,i.outerHeight-n.bottom-n.top):ns(t,o,e.top+l.placed,a,s),l.start=o,l.placed+=s,o=t.right}}e.x=o,e.y=a}var as={addBox(t,e){t.boxes||(t.boxes=[]),e.fullSize=e.fullSize||!1,e.position=e.position||\"top\",e.weight=e.weight||0,e._layers=e._layers||function(){return[{z:0,draw(t){e.draw(t)}}]},t.boxes.push(e)},removeBox(t,e){const i=t.boxes?t.boxes.indexOf(e):-1;-1!==i&&t.boxes.splice(i,1)},configure(t,e,i){e.fullSize=i.fullSize,e.position=i.position,e.weight=i.weight},update(t,e,i,s){if(!t)return;const n=ki(t.options.layout.padding),o=Math.max(e-n.width,0),a=Math.max(i-n.height,0),r=function(t){const e=function(t){const e=[];let i,s,n,o,a,r;for(i=0,s=(t||[]).length;i<s;++i)n=t[i],({position:o,options:{stack:a,stackWeight:r=1}}=n),e.push({index:i,box:n,pos:o,horizontal:n.isHorizontal(),weight:n.weight,stack:a&&o+a,stackWeight:r});return e}(t),i=Zi(e.filter((t=>t.box.fullSize)),!0),s=Zi(Ki(e,\"left\"),!0),n=Zi(Ki(e,\"right\")),o=Zi(Ki(e,\"top\"),!0),a=Zi(Ki(e,\"bottom\")),r=Gi(e,\"x\"),l=Gi(e,\"y\");return{fullSize:i,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Ki(e,\"chartArea\"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}(t.boxes),l=r.vertical,h=r.horizontal;u(t.boxes,(t=>{\"function\"==typeof t.beforeLayout&&t.beforeLayout()}));const c=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/c,hBoxMaxHeight:a/2}),f=Object.assign({},n);ts(f,ki(s));const g=Object.assign({maxPadding:f,w:o,h:a,x:n.left,y:n.top},n),p=Ji(l.concat(h),d);ss(r.fullSize,g,d,p),ss(l,g,d,p),ss(h,g,d,p)&&ss(l,g,d,p),function(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i(\"top\"),t.x+=i(\"left\"),i(\"right\"),i(\"bottom\")}(g),os(r.leftAndTop,g,d,p),g.x+=g.w,g.y+=g.h,os(r.rightAndBottom,g,d,p),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},u(r.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(g.w,g.h,{left:0,top:0,right:0,bottom:0})}))}};class rs{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}}class ls extends rs{acquireContext(t){return t&&t.getContext&&t.getContext(\"2d\")||null}updateConfig(t){t.options.animation=!1}}const hs=\"$chartjs\",cs={touchstart:\"mousedown\",touchmove:\"mousemove\",touchend:\"mouseup\",pointerenter:\"mouseenter\",pointerdown:\"mousedown\",pointermove:\"mousemove\",pointerup:\"mouseup\",pointerleave:\"mouseout\",pointerout:\"mouseout\"},ds=t=>null===t||\"\"===t;const us=!!Se&&{passive:!0};function fs(t,e,i){t.canvas.removeEventListener(e,i,us)}function gs(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function ps(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||gs(i.addedNodes,s),e=e&&!gs(i.removedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}function ms(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||gs(i.removedNodes,s),e=e&&!gs(i.addedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}const bs=new Map;let xs=0;function _s(){const t=window.devicePixelRatio;t!==xs&&(xs=t,bs.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function ys(t,e,i){const s=t.canvas,n=s&&ge(s);if(!n)return;const o=ct(((t,e)=>{const s=n.clientWidth;i(t,e),s<n.clientWidth&&i()}),window),a=new ResizeObserver((t=>{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||o(i,s)}));return a.observe(n),function(t,e){bs.size||window.addEventListener(\"resize\",_s),bs.set(t,e)}(t,o),a}function vs(t,e,i){i&&i.disconnect(),\"resize\"===e&&function(t){bs.delete(t),bs.size||window.removeEventListener(\"resize\",_s)}(t)}function Ms(t,e,i){const s=t.canvas,n=ct((e=>{null!==t.ctx&&i(function(t,e){const i=cs[t.type]||t.type,{x:s,y:n}=ve(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}(e,t))}),t);return function(t,e,i){t.addEventListener(e,i,us)}(s,e,n),n}class ws extends rs{acquireContext(t,e){const i=t&&t.getContext&&t.getContext(\"2d\");return i&&i.canvas===t?(function(t,e){const i=t.style,s=t.getAttribute(\"height\"),n=t.getAttribute(\"width\");if(t[hs]={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||\"block\",i.boxSizing=i.boxSizing||\"border-box\",ds(n)){const e=Pe(t,\"width\");void 0!==e&&(t.width=e)}if(ds(s))if(\"\"===t.style.height)t.height=t.width/(e||2);else{const e=Pe(t,\"height\");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e[hs])return!1;const i=e[hs].initial;[\"height\",\"width\"].forEach((t=>{const n=i[t];s(n)?e.removeAttribute(t):e.setAttribute(t,n)}));const n=i.style||{};return Object.keys(n).forEach((t=>{e.style[t]=n[t]})),e.width=e.width,delete e[hs],!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:ps,detach:ms,resize:ys}[e]||Ms;s[e]=n(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;({attach:vs,detach:vs,resize:vs}[e]||fs)(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return we(t,e,i,s)}isAttached(t){const e=ge(t);return!(!e||!e.isConnected)}}function ks(t){return!fe()||\"undefined\"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?ls:ws}var Ss=Object.freeze({__proto__:null,BasePlatform:rs,BasicPlatform:ls,DomPlatform:ws,_detectPlatform:ks});const Ps=\"transparent\",Ds={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const s=Qt(t||Ps),n=s.valid&&Qt(e||Ps);return n&&n.valid?n.mix(s,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class Cs{constructor(t,e,i,s){const n=e[i];s=Pi([t.to,s,n,t.from]);const o=Pi([t.from,n,s]);this._active=!0,this._fn=t.fn||Ds[t.type||typeof o],this._easing=fi[t.easing]||fi.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,o=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=Pi([t.to,e,s,t.from]),this._from=Pi([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,o=this._loop,a=this._to;let r;if(this._active=n!==a&&(o||e<i),!this._active)return this._target[s]=a,void this._notify(!0);e<0?this._target[s]=n:(r=e/i%2,r=o&&r>1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,a,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?\"res\":\"rej\",i=this._promises||[];for(let t=0;t<i.length;t++)i[t][e]()}}class Os{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!o(t))return;const e=Object.keys(ue.animation),i=this._properties;Object.getOwnPropertyNames(t).forEach((s=>{const a=t[s];if(!o(a))return;const r={};for(const t of e)r[t]=a[t];(n(a.properties)&&a.properties||[s]).forEach((t=>{t!==s&&i.has(t)||i.set(t,r)}))}))}_animateOptions(t,e){const i=e.options,s=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&function(t,e){const i=[],s=Object.keys(e);for(let e=0;e<s.length;e++){const n=t[s[e]];n&&n.active()&&i.push(n.wait())}return Promise.all(i)}(t.options.$animations,i).then((()=>{t.options=i}),(()=>{})),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now();let r;for(r=o.length-1;r>=0;--r){const l=o[r];if(\"$\"===l.charAt(0))continue;if(\"options\"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,a);continue}c.cancel()}d&&d.duration?(n[l]=c=new Cs(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(xt.add(this._chart,i),!0):void 0}}function As(t,e){const i=t&&t.options||{},s=i.reverse,n=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:s?o:n,end:s?n:o}}function Ts(t,e){const i=[],s=t._getSortedDatasetMetas(e);let n,o;for(n=0,o=s.length;n<o;++n)i.push(s[n].index);return i}function Ls(t,e,i,s={}){const n=t.keys,o=\"single\"===s.mode;let r,l,h,c;if(null!==e){for(r=0,l=n.length;r<l;++r){if(h=+n[r],h===i){if(s.all)continue;break}c=t.values[h],a(c)&&(o||0===e||F(e)===F(c))&&(e+=c)}return e}}function Es(t,e){const i=t&&t.options.stacked;return i||void 0===i&&void 0!==e.stack}function Rs(t,e,i){const s=t[e]||(t[e]={});return s[i]||(s[i]={})}function Is(t,e,i,s){for(const n of e.getMatchingVisibleMetas(s).reverse()){const e=t[n.index];if(i&&e>0||!i&&e<0)return n.index}return null}function zs(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,h=a.axis,c=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,a,s),d=e.length;let u;for(let t=0;t<d;++t){const i=e[t],{[l]:o,[h]:d}=i;u=(i._stacks||(i._stacks={}))[h]=Rs(n,c,o),u[r]=d,u._top=Is(u,a,!0,s.type),u._bottom=Is(u,a,!1,s.type);(u._visualValues||(u._visualValues={}))[r]=d}}function Fs(t,e){const i=t.scales;return Object.keys(i).filter((t=>i[t].axis===e)).shift()}function Vs(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i],void 0!==e[s]._visualValues&&void 0!==e[s]._visualValues[i]&&delete e[s]._visualValues[i]}}}const Bs=t=>\"reset\"===t||\"none\"===t,Ws=(t,e)=>e?t:Object.assign({},t);class Ns{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Es(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled(\"filler\")&&console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\")}updateIndex(t){this.index!==t&&Vs(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>\"x\"===t?e:\"r\"===t?s:i,n=e.xAxisID=l(i.xAxisID,Fs(t,\"x\")),o=e.yAxisID=l(i.yAxisID,Fs(t,\"y\")),a=e.rAxisID=l(i.rAxisID,Fs(t,\"r\")),r=e.indexAxis,h=e.iAxisID=s(r,n,o,a),c=e.vAxisID=s(r,o,n,a);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(h),e.vScale=this.getScaleForId(c)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update(\"reset\")}_destroy(){const t=this._cachedMeta;this._data&&rt(this._data,this),t._stacked&&Vs(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(o(e))this._data=function(t){const e=Object.keys(t),i=new Array(e.length);let s,n,o;for(s=0,n=e.length;s<n;++s)o=e[s],i[s]={x:o,y:t[o]};return i}(e);else if(i!==e){if(i){rt(i,this);const t=this._cachedMeta;Vs(t),t._parsed=[]}e&&Object.isExtensible(e)&&at(e,this),this._syncList=[],this._data=e}}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const e=this._cachedMeta,i=this.getDataset();let s=!1;this._dataCheck();const n=e._stacked;e._stacked=Es(e.vScale,e),e.stack!==i.stack&&(s=!0,Vs(e),e.stack=i.stack),this._resyncElements(t),(s||n!==e._stacked)&&zs(this,e._parsed)}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),i=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(i,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:i,_data:s}=this,{iScale:a,_stacked:r}=i,l=a.axis;let h,c,d,u=0===t&&e===s.length||i._sorted,f=t>0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=s,i._sorted=!0,d=s;else{d=n(s[t])?this.parseArrayData(i,s,t,e):o(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const a=()=>null===c[l]||f&&c[l]<f[l];for(h=0;h<e;++h)i._parsed[h+t]=c=d[h],u&&(a()&&(u=!1),f=c);i._sorted=u}r&&zs(this,d)}parsePrimitiveData(t,e,i,s){const{iScale:n,vScale:o}=t,a=n.axis,r=o.axis,l=n.getLabels(),h=n===o,c=new Array(s);let d,u,f;for(d=0,u=s;d<u;++d)f=d+i,c[d]={[a]:h||n.parse(l[f],f),[r]:o.parse(e[f],f)};return c}parseArrayData(t,e,i,s){const{xScale:n,yScale:o}=t,a=new Array(s);let r,l,h,c;for(r=0,l=s;r<l;++r)h=r+i,c=e[h],a[r]={x:n.parse(c[0],h),y:o.parse(c[1],h)};return a}parseObjectData(t,e,i,s){const{xScale:n,yScale:o}=t,{xAxisKey:a=\"x\",yAxisKey:r=\"y\"}=this._parsing,l=new Array(s);let h,c,d,u;for(h=0,c=s;h<c;++h)d=h+i,u=e[d],l[h]={x:n.parse(M(u,a),d),y:o.parse(M(u,r),d)};return l}getParsed(t){return this._cachedMeta._parsed[t]}getDataElement(t){return this._cachedMeta.data[t]}applyStack(t,e,i){const s=this.chart,n=this._cachedMeta,o=e[t.axis];return Ls({keys:Ts(s,!0),values:e._stacks[t.axis]._visualValues},o,n.index,{mode:i})}updateRangeFromParsed(t,e,i,s){const n=i[e.axis];let o=null===n?NaN:n;const a=s&&i._stacks[e.axis];s&&a&&(s.values=a,o=Ls(s,n,this._cachedMeta.index)),t.min=Math.min(t.min,o),t.max=Math.max(t.max,o)}getMinMax(t,e){const i=this._cachedMeta,s=i._parsed,n=i._sorted&&t===i.iScale,o=s.length,r=this._getOtherScale(t),l=((t,e,i)=>t&&!e.hidden&&e._stacked&&{keys:Ts(i,!0),values:null})(e,i,this.chart),h={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:c,max:d}=function(t){const{min:e,max:i,minDefined:s,maxDefined:n}=t.getUserBounds();return{min:s?e:Number.NEGATIVE_INFINITY,max:n?i:Number.POSITIVE_INFINITY}}(r);let u,f;function g(){f=s[u];const e=f[r.axis];return!a(f[t.axis])||c>e||d<e}for(u=0;u<o&&(g()||(this.updateRangeFromParsed(h,t,f,l),!n));++u);if(n)for(u=o-1;u>=0;--u)if(!g()){this.updateRangeFromParsed(h,t,f,l);break}return h}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,o;for(s=0,n=e.length;s<n;++s)o=e[s][t.axis],a(o)&&i.push(o);return i}getMaxOverflow(){return!1}getLabelAndValue(t){const e=this._cachedMeta,i=e.iScale,s=e.vScale,n=this.getParsed(t);return{label:i?\"\"+i.getLabelForValue(n[i.axis]):\"\",value:s?\"\"+s.getLabelForValue(n[s.axis]):\"\"}}_update(t){const e=this._cachedMeta;this.update(t||\"default\"),e._clip=function(t){let e,i,s,n;return o(t)?(e=t.top,i=t.right,s=t.bottom,n=t.left):e=i=s=n=t,{top:e,right:i,bottom:s,left:n,disabled:!1===t}}(l(this.options.clip,function(t,e,i){if(!1===i)return!1;const s=As(t,i),n=As(e,i);return{top:n.end,right:s.end,bottom:n.start,left:s.start}}(e.xScale,e.yScale,this.getMaxOverflow())))}update(t){}draw(){const t=this._ctx,e=this.chart,i=this._cachedMeta,s=i.data||[],n=e.chartArea,o=[],a=this._drawStart||0,r=this._drawCount||s.length-a,l=this.options.drawActiveElementsOnTop;let h;for(i.dataset&&i.dataset.draw(t,n,a,r),h=a;h<a+r;++h){const e=s[h];e.hidden||(e.active&&l?o.push(e):e.draw(t,n))}for(h=0;h<o.length;++h)o[h].draw(t,n)}getStyle(t,e){const i=e?\"active\":\"default\";return void 0===t&&this._cachedMeta.dataset?this.resolveDatasetElementOptions(i):this.resolveDataElementOptions(t||0,i)}getContext(t,e,i){const s=this.getDataset();let n;if(t>=0&&t<this._cachedMeta.data.length){const e=this._cachedMeta.data[t];n=e.$context||(e.$context=function(t,e,i){return Ci(t,{active:!1,dataIndex:e,parsed:void 0,raw:void 0,element:i,index:e,mode:\"default\",type:\"data\"})}(this.getContext(),t,e)),n.parsed=this.getParsed(t),n.raw=s.data[t],n.index=n.dataIndex=t}else n=this.$context||(this.$context=function(t,e){return Ci(t,{active:!1,dataset:void 0,datasetIndex:e,index:e,mode:\"default\",type:\"dataset\"})}(this.chart.getContext(),this.index)),n.dataset=s,n.index=n.datasetIndex=this.index;return n.active=!!e,n.mode=i,n}resolveDatasetElementOptions(t){return this._resolveElementOptions(this.datasetElementType.id,t)}resolveDataElementOptions(t,e){return this._resolveElementOptions(this.dataElementType.id,e,t)}_resolveElementOptions(t,e=\"default\",i){const s=\"active\"===e,n=this._cachedDataOpts,o=t+\"-\"+e,a=n[o],r=this.enableOptionSharing&&k(i);if(a)return Ws(a,r);const l=this.chart.config,h=l.datasetElementScopeKeys(this._type,t),c=s?[`${t}Hover`,\"hover\",t,\"\"]:[t,\"\"],d=l.getOptionScopes(this.getDataset(),h),u=Object.keys(ue.elements[t]),f=l.resolveNamedOptions(d,u,(()=>this.getContext(i,s,e)),c);return f.$shared&&(f.$shared=r,n[o]=Object.freeze(Ws(f,r))),f}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,o=`animation-${e}`,a=n[o];if(a)return a;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),o=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(o,this.getContext(t,i,e))}const l=new Os(s,r&&r.animations);return r&&r._cacheable&&(n[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||Bs(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,n=this.getSharedOptions(i),o=this.includeOptions(e,n)||n!==s;return this.updateSharedOptions(n,e,i),{sharedOptions:n,includeOptions:o}}updateElement(t,e,i,s){Bs(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!Bs(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,\"active\",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,\"active\",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,\"active\",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,\"active\",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const s=i.length,n=e.length,o=Math.min(n,s);o&&this.parse(0,o),n>s?this._insertElements(s,n-s,t):n<s&&this._removeElements(n,s-n)}_insertElements(t,e,i=!0){const s=this._cachedMeta,n=s.data,o=t+e;let a;const r=t=>{for(t.length+=e,a=t.length-1;a>=o;a--)t[a]=t[a-e]};for(r(n),a=t;a<o;++a)n[a]=new this.dataElementType;this._parsing&&r(s._parsed),this.parse(t,e),i&&this.updateElements(n,t,e,\"reset\")}updateElements(t,e,i,s){}_removeElements(t,e){const i=this._cachedMeta;if(this._parsing){const s=i._parsed.splice(t,e);i._stacked&&Vs(i,s)}i.data.splice(t,e)}_sync(t){if(this._parsing)this._syncList.push(t);else{const[e,i,s]=t;this[e](i,s)}this.chart._dataChanges.push([this.index,...t])}_onDataPush(){const t=arguments.length;this._sync([\"_insertElements\",this.getDataset().data.length-t,t])}_onDataPop(){this._sync([\"_removeElements\",this._cachedMeta.data.length-1,1])}_onDataShift(){this._sync([\"_removeElements\",0,1])}_onDataSplice(t,e){e&&this._sync([\"_removeElements\",t,e]);const i=arguments.length-2;i&&this._sync([\"_insertElements\",t,i])}_onDataUnshift(){this._sync([\"_insertElements\",0,arguments.length])}}class Hs{static defaults={};static defaultRoutes=void 0;x;y;active=!1;options;$animations;tooltipPosition(t){const{x:e,y:i}=this.getProps([\"x\",\"y\"],t);return{x:e,y:i}}hasValue(){return N(this.x)&&N(this.y)}getProps(t,e){const i=this.$animations;if(!e||!i)return this;const s={};return t.forEach((t=>{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),s}}function js(t,e){const i=t.options.ticks,n=function(t){const e=t.options.offset,i=t._tickSize(),s=t._length/i+(e?0:1),n=t._maxLength/i;return Math.floor(Math.min(s,n))}(t),o=Math.min(i.maxTicksLimit||n,n),a=i.major.enabled?function(t){const e=[];let i,s;for(i=0,s=t.length;i<s;i++)t[i].major&&e.push(i);return e}(e):[],r=a.length,l=a[0],h=a[r-1],c=[];if(r>o)return function(t,e,i,s){let n,o=0,a=i[0];for(s=Math.ceil(s),n=0;n<t.length;n++)n===a&&(e.push(t[n]),o++,a=i[o*s])}(e,c,a,r/o),c;const d=function(t,e,i){const s=function(t){const e=t.length;let i,s;if(e<2)return!1;for(s=t[0],i=1;i<e;++i)if(t[i]-t[i-1]!==s)return!1;return s}(t),n=e.length/i;if(!s)return Math.max(n,1);const o=W(s);for(let t=0,e=o.length-1;t<e;t++){const e=o[t];if(e>n)return e}return Math.max(n,1)}(a,e,o);if(r>0){let t,i;const n=r>1?Math.round((h-l)/(r-1)):null;for($s(e,c,d,s(n)?0:l-n,l),t=0,i=r-1;t<i;t++)$s(e,c,d,a[t],a[t+1]);return $s(e,c,d,h,s(n)?e.length:h+n),c}return $s(e,c,d),c}function $s(t,e,i,s,n){const o=l(s,0),a=Math.min(l(n,t.length),t.length);let r,h,c,d=0;for(i=Math.ceil(i),n&&(r=n-s,i=r/Math.floor(r/i)),c=o;c<0;)d++,c=Math.round(o+d*i);for(h=Math.max(o,0);h<a;h++)h===c&&(e.push(t[h]),d++,c=Math.round(o+d*i))}const Ys=(t,e,i)=>\"top\"===e||\"left\"===e?t[e]+i:t[e]-i,Us=(t,e)=>Math.min(e||t,t);function Xs(t,e){const i=[],s=t.length/e,n=t.length;let o=0;for(;o<n;o+=s)i.push(t[Math.floor(o)]);return i}function qs(t,e,i){const s=t.ticks.length,n=Math.min(e,s-1),o=t._startPixel,a=t._endPixel,r=1e-6;let l,h=t.getPixelForTick(n);if(!(i&&(l=1===s?Math.max(h-o,a-h):0===e?(t.getPixelForTick(1)-h)/2:(h-t.getPixelForTick(n-1))/2,h+=n<e?l:-l,h<o-r||h>a+r)))return h}function Ks(t){return t.drawTicks?t.tickLength:0}function Gs(t,e){if(!t.display)return 0;const i=Si(t.font,e),s=ki(t.padding);return(n(t.text)?t.text.length:1)*i.lineHeight+s.height}function Zs(t,e,i){let s=ut(t);return(i&&\"right\"!==e||!i&&\"right\"===e)&&(s=(t=>\"left\"===t?\"right\":\"right\"===t?\"left\":t)(s)),s}class Js extends Hs{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:s}=this;return t=r(t,Number.POSITIVE_INFINITY),e=r(e,Number.NEGATIVE_INFINITY),i=r(i,Number.POSITIVE_INFINITY),s=r(s,Number.NEGATIVE_INFINITY),{min:r(t,i),max:r(e,s),minDefined:a(t),maxDefined:a(e)}}getMinMax(t){let e,{min:i,max:s,minDefined:n,maxDefined:o}=this.getUserBounds();if(n&&o)return{min:i,max:s};const a=this.getMatchingVisibleMetas();for(let r=0,l=a.length;r<l;++r)e=a[r].controller.getMinMax(this,t),n||(i=Math.min(i,e.min)),o||(s=Math.max(s,e.max));return i=o&&i>s?s:i,s=n&&i>s?i:s,{min:r(i,r(s,i)),max:r(s,r(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){d(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:o}=this.options,a=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=Di(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=a<this.ticks.length;this._convertTicksToLabels(r?Xs(this.ticks,a):this.ticks),this.configure(),this.beforeCalculateLabelRotation(),this.calculateLabelRotation(),this.afterCalculateLabelRotation(),o.display&&(o.autoSkip||\"auto\"===o.source)&&(this.ticks=js(this,this.ticks),this._labelSizes=null,this.afterAutoSkip()),r&&this._convertTicksToLabels(this.ticks),this.beforeFit(),this.fit(),this.afterFit(),this.afterUpdate()}configure(){let t,e,i=this.options.reverse;this.isHorizontal()?(t=this.left,e=this.right):(t=this.top,e=this.bottom,i=!i),this._startPixel=t,this._endPixel=e,this._reversePixels=i,this._length=e-t,this._alignToPixels=this.options.alignToPixels}afterUpdate(){d(this.options.afterUpdate,[this])}beforeSetDimensions(){d(this.options.beforeSetDimensions,[this])}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=0,this.right=this.width):(this.height=this.maxHeight,this.top=0,this.bottom=this.height),this.paddingLeft=0,this.paddingTop=0,this.paddingRight=0,this.paddingBottom=0}afterSetDimensions(){d(this.options.afterSetDimensions,[this])}_callHooks(t){this.chart.notifyPlugins(t,this.getContext()),d(this.options[t],[this])}beforeDataLimits(){this._callHooks(\"beforeDataLimits\")}determineDataLimits(){}afterDataLimits(){this._callHooks(\"afterDataLimits\")}beforeBuildTicks(){this._callHooks(\"beforeBuildTicks\")}buildTicks(){return[]}afterBuildTicks(){this._callHooks(\"afterBuildTicks\")}beforeTickToLabelConversion(){d(this.options.beforeTickToLabelConversion,[this])}generateTickLabels(t){const e=this.options.ticks;let i,s,n;for(i=0,s=t.length;i<s;i++)n=t[i],n.label=d(e.callback,[n.value,i,t],this)}afterTickToLabelConversion(){d(this.options.afterTickToLabelConversion,[this])}beforeCalculateLabelRotation(){d(this.options.beforeCalculateLabelRotation,[this])}calculateLabelRotation(){const t=this.options,e=t.ticks,i=Us(this.ticks.length,t.ticks.maxTicksLimit),s=e.minRotation||0,n=e.maxRotation;let o,a,r,l=s;if(!this._isVisible()||!e.display||s>=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=J(this.chart.width-c,0,this.maxWidth);o=t.offset?this.maxWidth/i:u/(i-1),c+6>o&&(o=u/(i-(t.offset?.5:1)),a=this.maxHeight-Ks(t.grid)-e.padding-Gs(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=Y(Math.min(Math.asin(J((h.highest.height+6)/o,-1,1)),Math.asin(J(a/r,-1,1))-Math.asin(J(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){d(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){d(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){const o=Gs(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=Ks(n)+o):(t.height=this.maxHeight,t.width=Ks(n)+o),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:o}=this._getLabelSizes(),r=2*i.padding,l=$(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(a){const e=i.mirror?0:c*n.width+h*o.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*o.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),a?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:o},position:a}=this.options,r=0!==this.labelRotation,l=\"top\"!==a&&\"x\"===this.axis;if(this.isHorizontal()){const a=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):\"start\"===n?d=e.width:\"end\"===n?c=t.width:\"inner\"!==n&&(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-a+o)*this.width/(this.width-a),0),this.paddingRight=Math.max((d-h+o)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;\"start\"===n?(i=0,s=t.height):\"end\"===n&&(i=e.height,s=0),this.paddingTop=i+o,this.paddingBottom=s+o}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){d(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return\"top\"===e||\"bottom\"===e||\"x\"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e<i;e++)s(t[e].label)&&(t.splice(e,1),i--,e--);this.afterTickToLabelConversion()}_getLabelSizes(){let t=this._labelSizes;if(!t){const e=this.options.ticks.sampleSize;let i=this.ticks;e<i.length&&(i=Xs(i,e)),this._labelSizes=t=this._computeLabelSizes(i,i.length,this.options.ticks.maxTicksLimit)}return t}_computeLabelSizes(t,e,i){const{ctx:o,_longestTextCache:a}=this,r=[],l=[],h=Math.floor(e/Us(e,i));let c,d,f,g,p,m,b,x,_,y,v,M=0,w=0;for(c=0;c<e;c+=h){if(g=t[c].label,p=this._resolveTickFontOptions(c),o.font=m=p.string,b=a[m]=a[m]||{data:{},gc:[]},x=p.lineHeight,_=y=0,s(g)||n(g)){if(n(g))for(d=0,f=g.length;d<f;++d)v=g[d],s(v)||n(v)||(_=Ce(o,b.data,b.gc,_,v),y+=x)}else _=Ce(o,b.data,b.gc,_,g),y=x;r.push(_),l.push(y),M=Math.max(_,M),w=Math.max(y,w)}!function(t,e){u(t,(t=>{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;n<s;++n)delete t.data[i[n]];i.splice(0,s)}}))}(a,e);const k=r.indexOf(M),S=l.indexOf(w),P=t=>({width:r[t]||0,height:l[t]||0});return{first:P(0),last:P(e-1),widest:P(k),highest:P(S),widths:r,heights:l}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return Q(this._alignToPixels?Ae(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&t<e.length){const i=e[t];return i.$context||(i.$context=function(t,e,i){return Ci(t,{tick:i,index:e,type:\"tick\"})}(this.getContext(),t,i))}return this.$context||(this.$context=Ci(this.chart.getContext(),{scale:this,type:\"scale\"}))}_tickSize(){const t=this.options.ticks,e=$(this.labelRotation),i=Math.abs(Math.cos(e)),s=Math.abs(Math.sin(e)),n=this._getLabelSizes(),o=t.autoSkipPadding||0,a=n?n.widest.width+o:0,r=n?n.highest.height+o:0;return this.isHorizontal()?r*i>a*s?a/i:r/s:r*s<a*i?r/i:a/s}_isVisible(){const t=this.options.display;return\"auto\"!==t?!!t:this.getMatchingVisibleMetas().length>0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:a,border:r}=s,h=n.offset,c=this.isHorizontal(),d=this.ticks.length+(h?1:0),u=Ks(n),f=[],g=r.setContext(this.getContext()),p=g.display?g.width:0,m=p/2,b=function(t){return Ae(i,t,p)};let x,_,y,v,M,w,k,S,P,D,C,O;if(\"top\"===a)x=b(this.bottom),w=this.bottom-u,S=x-m,D=b(t.top)+m,O=t.bottom;else if(\"bottom\"===a)x=b(this.top),D=t.top,O=b(t.bottom)-m,w=x+m,S=this.top+u;else if(\"left\"===a)x=b(this.right),M=this.right-u,k=x-m,P=b(t.left)+m,C=t.right;else if(\"right\"===a)x=b(this.left),P=t.left,C=b(t.right)-m,M=x+m,k=this.left+u;else if(\"x\"===e){if(\"center\"===a)x=b((t.top+t.bottom)/2+.5);else if(o(a)){const t=Object.keys(a)[0],e=a[t];x=b(this.chart.scales[t].getPixelForValue(e))}D=t.top,O=t.bottom,w=x+m,S=w+u}else if(\"y\"===e){if(\"center\"===a)x=b((t.left+t.right)/2);else if(o(a)){const t=Object.keys(a)[0],e=a[t];x=b(this.chart.scales[t].getPixelForValue(e))}M=x-m,k=M-u,P=t.left,C=t.right}const A=l(s.ticks.maxTicksLimit,d),T=Math.max(1,Math.ceil(d/A));for(_=0;_<d;_+=T){const t=this.getContext(_),e=n.setContext(t),s=r.setContext(t),o=e.lineWidth,a=e.color,l=s.dash||[],d=s.dashOffset,u=e.tickWidth,g=e.tickColor,p=e.tickBorderDash||[],m=e.tickBorderDashOffset;y=qs(this,_,h),void 0!==y&&(v=Ae(i,y,o),c?M=k=P=C=v:w=S=D=O=v,f.push({tx1:M,ty1:w,tx2:k,ty2:S,x1:P,y1:D,x2:C,y2:O,width:o,color:a,borderDash:l,borderDashOffset:d,tickWidth:u,tickColor:g,tickBorderDash:p,tickBorderDashOffset:m}))}return this._ticksLength=d,this._borderValue=x,f}_computeLabelItems(t){const e=this.axis,i=this.options,{position:s,ticks:a}=i,r=this.isHorizontal(),l=this.ticks,{align:h,crossAlign:c,padding:d,mirror:u}=a,f=Ks(i.grid),g=f+d,p=u?-d:g,m=-$(this.labelRotation),b=[];let x,_,y,v,M,w,k,S,P,D,C,O,A=\"middle\";if(\"top\"===s)w=this.bottom-p,k=this._getXAxisLabelAlignment();else if(\"bottom\"===s)w=this.top+p,k=this._getXAxisLabelAlignment();else if(\"left\"===s){const t=this._getYAxisLabelAlignment(f);k=t.textAlign,M=t.x}else if(\"right\"===s){const t=this._getYAxisLabelAlignment(f);k=t.textAlign,M=t.x}else if(\"x\"===e){if(\"center\"===s)w=(t.top+t.bottom)/2+g;else if(o(s)){const t=Object.keys(s)[0],e=s[t];w=this.chart.scales[t].getPixelForValue(e)+g}k=this._getXAxisLabelAlignment()}else if(\"y\"===e){if(\"center\"===s)M=(t.left+t.right)/2-g;else if(o(s)){const t=Object.keys(s)[0],e=s[t];M=this.chart.scales[t].getPixelForValue(e)}k=this._getYAxisLabelAlignment(f).textAlign}\"y\"===e&&(\"start\"===h?A=\"top\":\"end\"===h&&(A=\"bottom\"));const T=this._getLabelSizes();for(x=0,_=l.length;x<_;++x){y=l[x],v=y.label;const t=a.setContext(this.getContext(x));S=this.getPixelForTick(x)+a.labelOffset,P=this._resolveTickFontOptions(x),D=P.lineHeight,C=n(v)?v.length:1;const e=C/2,i=t.color,o=t.textStrokeColor,h=t.textStrokeWidth;let d,f=k;if(r?(M=S,\"inner\"===k&&(f=x===_-1?this.options.reverse?\"left\":\"right\":0===x?this.options.reverse?\"right\":\"left\":\"center\"),O=\"top\"===s?\"near\"===c||0!==m?-C*D+D/2:\"center\"===c?-T.highest.height/2-e*D+D:-T.highest.height+D/2:\"near\"===c||0!==m?D/2:\"center\"===c?T.highest.height/2-e*D:T.highest.height-C*D,u&&(O*=-1),0===m||t.showLabelBackdrop||(M+=D/2*Math.sin(m))):(w=S,O=(1-C)*D/2),t.showLabelBackdrop){const e=ki(t.backdropPadding),i=T.heights[x],s=T.widths[x];let n=O-e.top,o=0-e.left;switch(A){case\"middle\":n-=i/2;break;case\"bottom\":n-=i}switch(k){case\"center\":o-=s/2;break;case\"right\":o-=s}d={left:o,top:n,width:s+e.width,height:i+e.height,color:t.backdropColor}}b.push({label:v,font:P,textOffset:O,options:{rotation:m,color:i,strokeColor:o,strokeWidth:h,textAlign:f,textBaseline:A,translation:[M,w],backdrop:d}})}return b}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options;if(-$(this.labelRotation))return\"top\"===t?\"left\":\"right\";let i=\"center\";return\"start\"===e.align?i=\"left\":\"end\"===e.align?i=\"right\":\"inner\"===e.align&&(i=\"inner\"),i}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:i,mirror:s,padding:n}}=this.options,o=t+n,a=this._getLabelSizes().widest.width;let r,l;return\"left\"===e?s?(l=this.right+n,\"near\"===i?r=\"left\":\"center\"===i?(r=\"center\",l+=a/2):(r=\"right\",l+=a)):(l=this.right-o,\"near\"===i?r=\"right\":\"center\"===i?(r=\"center\",l-=a/2):(r=\"left\",l=this.left)):\"right\"===e?s?(l=this.left+n,\"near\"===i?r=\"right\":\"center\"===i?(r=\"center\",l-=a/2):(r=\"left\",l-=a)):(l=this.left+o,\"near\"===i?r=\"left\":\"center\"===i?(r=\"center\",l+=a/2):(r=\"right\",l=this.right)):r=\"right\",{textAlign:r,x:l}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return\"left\"===e||\"right\"===e?{top:0,left:this.left,bottom:t.height,right:this.right}:\"top\"===e||\"bottom\"===e?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:i,top:s,width:n,height:o}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(i,s,n,o),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const i=this.ticks.findIndex((e=>e.value===t));if(i>=0){return e.setContext(this.getContext(i)).lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,o;const a=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,o=s.length;n<o;++n){const t=s[n];e.drawOnChartArea&&a({x:t.x1,y:t.y1},{x:t.x2,y:t.y2},t),e.drawTicks&&a({x:t.tx1,y:t.ty1},{x:t.tx2,y:t.ty2},{color:t.tickColor,width:t.tickWidth,borderDash:t.tickBorderDash,borderDashOffset:t.tickBorderDashOffset})}}drawBorder(){const{chart:t,ctx:e,options:{border:i,grid:s}}=this,n=i.setContext(this.getContext()),o=i.display?n.width:0;if(!o)return;const a=s.setContext(this.getContext(0)).lineWidth,r=this._borderValue;let l,h,c,d;this.isHorizontal()?(l=Ae(t,this.left,o)-o/2,h=Ae(t,this.right,a)+a/2,c=d=r):(c=Ae(t,this.top,o)-o/2,d=Ae(t,this.bottom,a)+a/2,l=h=r),e.save(),e.lineWidth=n.width,e.strokeStyle=n.color,e.beginPath(),e.moveTo(l,c),e.lineTo(h,d),e.stroke(),e.restore()}drawLabels(t){if(!this.options.ticks.display)return;const e=this.ctx,i=this._computeLabelArea();i&&Ie(e,i);const s=this.getLabelItems(t);for(const t of s){const i=t.options,s=t.font;Ne(e,t.label,0,t.textOffset,s,i)}i&&ze(e)}drawTitle(){const{ctx:t,options:{position:e,title:i,reverse:s}}=this;if(!i.display)return;const a=Si(i.font),r=ki(i.padding),l=i.align;let h=a.lineHeight/2;\"bottom\"===e||\"center\"===e||o(e)?(h+=r.bottom,n(i.text)&&(h+=a.lineHeight*(i.text.length-1))):h+=r.top;const{titleX:c,titleY:d,maxWidth:u,rotation:f}=function(t,e,i,s){const{top:n,left:a,bottom:r,right:l,chart:h}=t,{chartArea:c,scales:d}=h;let u,f,g,p=0;const m=r-n,b=l-a;if(t.isHorizontal()){if(f=ft(s,a,l),o(i)){const t=Object.keys(i)[0],s=i[t];g=d[t].getPixelForValue(s)+m-e}else g=\"center\"===i?(c.bottom+c.top)/2+m-e:Ys(t,i,e);u=l-a}else{if(o(i)){const t=Object.keys(i)[0],s=i[t];f=d[t].getPixelForValue(s)-b+e}else f=\"center\"===i?(c.left+c.right)/2-b+e:Ys(t,i,e);g=ft(s,r,n),p=\"left\"===i?-E:E}return{titleX:f,titleY:g,maxWidth:u,rotation:p}}(this,h,e,l);Ne(t,i.text,0,0,a,{color:i.color,maxWidth:u,rotation:f,textAlign:Zs(l,e,s),textBaseline:\"middle\",translation:[c,d]})}draw(t){this._isVisible()&&(this.drawBackground(),this.drawGrid(t),this.drawBorder(),this.drawTitle(),this.drawLabels(t))}_layers(){const t=this.options,e=t.ticks&&t.ticks.z||0,i=l(t.grid&&t.grid.z,-1),s=l(t.border&&t.border.z,0);return this._isVisible()&&this.draw===Js.prototype.draw?[{z:i,draw:t=>{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:s,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+\"AxisID\",s=[];let n,o;for(n=0,o=e.length;n<o;++n){const o=e[n];o[i]!==this.id||t&&o.type!==t||s.push(o)}return s}_resolveTickFontOptions(t){return Si(this.options.ticks.setContext(this.getContext(t)).font)}_maxDigits(){const t=this._resolveTickFontOptions(0).lineHeight;return(this.isHorizontal()?this.width:this.height)/t}}class Qs{constructor(t,e,i){this.type=t,this.scope=e,this.override=i,this.items=Object.create(null)}isForType(t){return Object.prototype.isPrototypeOf.call(this.type.prototype,t.prototype)}register(t){const e=Object.getPrototypeOf(t);let i;(function(t){return\"id\"in t&&\"defaults\"in t})(e)&&(i=this.register(e));const s=this.items,n=t.id,o=this.scope+\".\"+n;if(!n)throw new Error(\"class does not have id: \"+t);return n in s||(s[n]=t,function(t,e,i){const s=b(Object.create(null),[i?ue.get(i):{},ue.get(e),t.defaults]);ue.set(e,s),t.defaultRoutes&&function(t,e){Object.keys(e).forEach((i=>{const s=i.split(\".\"),n=s.pop(),o=[t].concat(s).join(\".\"),a=e[i].split(\".\"),r=a.pop(),l=a.join(\".\");ue.route(o,n,l,r)}))}(e,t.defaultRoutes);t.descriptors&&ue.describe(e,t.descriptors)}(t,o,i),this.override&&ue.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,s=this.scope;i in e&&delete e[i],s&&i in ue[s]&&(delete ue[s][i],this.override&&delete re[i])}}class tn{constructor(){this.controllers=new Qs(Ns,\"datasets\",!0),this.elements=new Qs(Hs,\"elements\"),this.plugins=new Qs(Object,\"plugins\"),this.scales=new Qs(Js,\"scales\"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each(\"register\",t)}remove(...t){this._each(\"unregister\",t)}addControllers(...t){this._each(\"register\",t,this.controllers)}addElements(...t){this._each(\"register\",t,this.elements)}addPlugins(...t){this._each(\"register\",t,this.plugins)}addScales(...t){this._each(\"register\",t,this.scales)}getController(t){return this._get(t,this.controllers,\"controller\")}getElement(t){return this._get(t,this.elements,\"element\")}getPlugin(t){return this._get(t,this.plugins,\"plugin\")}getScale(t){return this._get(t,this.scales,\"scale\")}removeControllers(...t){this._each(\"unregister\",t,this.controllers)}removeElements(...t){this._each(\"unregister\",t,this.elements)}removePlugins(...t){this._each(\"unregister\",t,this.plugins)}removeScales(...t){this._each(\"unregister\",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):u(e,(e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)}))}))}_exec(t,e,i){const s=w(t);d(i[\"before\"+s],[],i),e[t](i),d(i[\"after\"+s],[],i)}_getRegistryForType(t){for(let e=0;e<this._typedRegistries.length;e++){const i=this._typedRegistries[e];if(i.isForType(t))return i}return this.plugins}_get(t,e,i){const s=e.get(t);if(void 0===s)throw new Error('\"'+t+'\" is not a registered '+i+\".\");return s}}var en=new tn;class sn{constructor(){this._init=[]}notify(t,e,i,s){\"beforeInit\"===e&&(this._init=this._createDescriptors(t,!0),this._notify(this._init,t,\"install\"));const n=s?this._descriptors(t).filter(s):this._descriptors(t),o=this._notify(n,t,e,i);return\"afterDestroy\"===e&&(this._notify(n,t,\"stop\"),this._notify(this._init,t,\"uninstall\")),o}_notify(t,e,i,s){s=s||{};for(const n of t){const t=n.plugin;if(!1===d(t[i],[e,s,n.options],t)&&s.cancelable)return!1}return!0}invalidate(){s(this._cache)||(this._oldCache=this._cache,this._cache=void 0)}_descriptors(t){if(this._cache)return this._cache;const e=this._cache=this._createDescriptors(t);return this._notifyStateChanges(t),e}_createDescriptors(t,e){const i=t&&t.config,s=l(i.options&&i.options.plugins,{}),n=function(t){const e={},i=[],s=Object.keys(en.plugins.items);for(let t=0;t<s.length;t++)i.push(en.getPlugin(s[t]));const n=t.plugins||[];for(let t=0;t<n.length;t++){const s=n[t];-1===i.indexOf(s)&&(i.push(s),e[s.id]=!0)}return{plugins:i,localIds:e}}(i);return!1!==s||e?function(t,{plugins:e,localIds:i},s,n){const o=[],a=t.getContext();for(const r of e){const e=r.id,l=nn(s[e],n);null!==l&&o.push({plugin:r,options:on(t.config,{plugin:r,local:i[e]},l,a)})}return o}(t,n,s,e):[]}_notifyStateChanges(t){const e=this._oldCache||[],i=this._cache,s=(t,e)=>t.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(s(e,i),t,\"stop\"),this._notify(s(i,e),t,\"start\")}}function nn(t,e){return e||!1!==t?!0===t?{}:t:null}function on(t,{plugin:e,local:i},s,n){const o=t.pluginScopeKeys(e),a=t.getOptionScopes(s,o);return i&&e.defaults&&a.push(e.defaults),t.createResolver(a,n,[\"\"],{scriptable:!1,indexable:!1,allKeys:!0})}function an(t,e){const i=ue.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||\"x\"}function rn(t){if(\"x\"===t||\"y\"===t||\"r\"===t)return t}function ln(t,...e){if(rn(t))return t;for(const s of e){const e=s.axis||(\"top\"===(i=s.position)||\"bottom\"===i?\"x\":\"left\"===i||\"right\"===i?\"y\":void 0)||t.length>1&&rn(t[0].toLowerCase());if(e)return e}var i;throw new Error(`Cannot determine type of '${t}' axis. Please provide 'axis' or 'position' option.`)}function hn(t,e,i){if(i[e+\"AxisID\"]===t)return{axis:e}}function cn(t,e){const i=re[t.type]||{scales:{}},s=e.scales||{},n=an(t.type,e),a=Object.create(null);return Object.keys(s).forEach((e=>{const r=s[e];if(!o(r))return console.error(`Invalid scale configuration for scale: ${e}`);if(r._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${e}`);const l=ln(e,r,function(t,e){if(e.data&&e.data.datasets){const i=e.data.datasets.filter((e=>e.xAxisID===t||e.yAxisID===t));if(i.length)return hn(t,\"x\",i[0])||hn(t,\"y\",i[0])}return{}}(e,t),ue.scales[r.type]),h=function(t,e){return t===e?\"_index_\":\"_value_\"}(l,n),c=i.scales||{};a[e]=x(Object.create(null),[{axis:l},r,c[l],c[h]])})),t.data.datasets.forEach((i=>{const n=i.type||t.type,o=i.indexAxis||an(n,e),r=(re[n]||{}).scales||{};Object.keys(r).forEach((t=>{const e=function(t,e){let i=t;return\"_index_\"===t?i=e:\"_value_\"===t&&(i=\"x\"===e?\"y\":\"x\"),i}(t,o),n=i[e+\"AxisID\"]||e;a[n]=a[n]||Object.create(null),x(a[n],[{axis:e},s[n],r[t]])}))})),Object.keys(a).forEach((t=>{const e=a[t];x(e,[ue.scales[e.type],ue.scale])})),a}function dn(t){const e=t.options||(t.options={});e.plugins=l(e.plugins,{}),e.scales=cn(t,e)}function un(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const fn=new Map,gn=new Set;function pn(t,e){let i=fn.get(t);return i||(i=e(),fn.set(t,i),gn.add(i)),i}const mn=(t,e,i)=>{const s=M(e,i);void 0!==s&&t.add(s)};class bn{constructor(t){this._config=function(t){return(t=t||{}).data=un(t.data),dn(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=un(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),dn(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return pn(t,(()=>[[`datasets.${t}`,\"\"]]))}datasetAnimationScopeKeys(t,e){return pn(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,\"\"]]))}datasetElementScopeKeys(t,e){return pn(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,\"\"]]))}pluginScopeKeys(t){const e=t.id;return pn(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>mn(r,t,e)))),e.forEach((t=>mn(r,s,t))),e.forEach((t=>mn(r,re[n]||{},t))),e.forEach((t=>mn(r,ue,t))),e.forEach((t=>mn(r,le,t)))}));const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),gn.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,re[e]||{},ue.datasets[e]||{},{type:e},ue,le]}resolveNamedOptions(t,e,i,s=[\"\"]){const o={$shared:!0},{resolver:a,subPrefixes:r}=xn(this._resolverCache,t,s);let l=a;if(function(t,e){const{isScriptable:i,isIndexable:s}=Ye(t);for(const o of e){const e=i(o),a=s(o),r=(a||e)&&t[o];if(e&&(S(r)||_n(r))||a&&n(r))return!0}return!1}(a,e)){o.$shared=!1;l=$e(a,i=S(i)?i():i,this.createResolver(t,i,r))}for(const t of e)o[t]=l[t];return o}createResolver(t,e,i=[\"\"],s){const{resolver:n}=xn(this._resolverCache,t,i);return o(e)?$e(n,e,void 0,s):n}}function xn(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let o=s.get(n);if(!o){o={resolver:je(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes(\"hover\")))},s.set(n,o)}return o}const _n=t=>o(t)&&Object.getOwnPropertyNames(t).reduce(((e,i)=>e||S(t[i])),!1);const yn=[\"top\",\"bottom\",\"left\",\"right\",\"chartArea\"];function vn(t,e){return\"top\"===t||\"bottom\"===t||-1===yn.indexOf(t)&&\"x\"===e}function Mn(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function wn(t){const e=t.chart,i=e.options.animation;e.notifyPlugins(\"afterRender\"),d(i&&i.onComplete,[t],e)}function kn(t){const e=t.chart,i=e.options.animation;d(i&&i.onProgress,[t],e)}function Sn(t){return fe()&&\"string\"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const Pn={},Dn=t=>{const e=Sn(t);return Object.values(Pn).filter((t=>t.canvas===e)).pop()};function Cn(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const o=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=o)}}}function On(t,e,i){return t.options.clip?t[i]:e[i]}class An{static defaults=ue;static instances=Pn;static overrides=re;static registry=en;static version=\"4.4.0\";static getChart=Dn;static register(...t){en.add(...t),Tn()}static unregister(...t){en.remove(...t),Tn()}constructor(t,e){const s=this.config=new bn(e),n=Sn(t),o=Dn(n);if(o)throw new Error(\"Canvas is already in use. Chart with ID '\"+o.id+\"' must be destroyed before the canvas with ID '\"+o.canvas.id+\"' can be reused.\");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||ks(n)),this.platform.updateConfig(s);const r=this.platform.acquireContext(n,a.aspectRatio),l=r&&r.canvas,h=l&&l.height,c=l&&l.width;this.id=i(),this.ctx=r,this.canvas=l,this.width=c,this.height=h,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new sn,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=dt((t=>this.update(t)),a.resizeDelay||0),this._dataChanges=[],Pn[this.id]=this,r&&l?(xt.listen(this,\"complete\",wn),xt.listen(this,\"progress\",kn),this._initialize(),this.attached&&this.update()):console.error(\"Failed to create chart: can't acquire context from the given item\")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:o}=this;return s(t)?e&&o?o:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return en}_initialize(){return this.notifyPlugins(\"beforeInit\"),this.options.responsive?this.resize():ke(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins(\"afterInit\"),this}clear(){return Te(this.canvas,this.ctx),this}stop(){return xt.stop(this),this}resize(t,e){xt.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(s,t,e,n),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?\"resize\":\"attach\";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,ke(this,a,!0)&&(this.notifyPlugins(\"resize\",{size:o}),d(i.onResize,[this,o],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){u(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let n=[];e&&(n=n.concat(Object.keys(e).map((t=>{const i=e[t],s=ln(t,i),n=\"r\"===s,o=\"x\"===s;return{options:i,dposition:n?\"chartArea\":o?\"bottom\":\"left\",dtype:n?\"radialLinear\":o?\"category\":\"linear\"}})))),u(n,(e=>{const n=e.options,o=n.id,a=ln(o,n),r=l(n.type,e.dtype);void 0!==n.position&&vn(n.position,a)===vn(e.dposition)||(n.position=e.dposition),s[o]=!0;let h=null;if(o in i&&i[o].type===r)h=i[o];else{h=new(en.getScale(r))({id:o,type:r,ctx:this.ctx,chart:this}),i[h.id]=h}h.init(n,t)})),u(s,((t,e)=>{t||delete i[e]})),u(i,(t=>{as.configure(this,t,t.options),as.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;t<i;++t)this._destroyDatasetMeta(t);t.splice(e,i-e)}this._sortedMetasets=t.slice(0).sort(Mn(\"order\",\"index\"))}_removeUnreferencedMetasets(){const{_metasets:t,data:{datasets:e}}=this;t.length>e.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i<s;i++){const s=e[i];let n=this.getDatasetMeta(i);const o=s.type||this.config.type;if(n.type&&n.type!==o&&(this._destroyDatasetMeta(i),n=this.getDatasetMeta(i)),n.type=o,n.indexAxis=s.indexAxis||an(o,this.options),n.order=s.order||0,n.index=i,n.label=\"\"+s.label,n.visible=this.isDatasetVisible(i),n.controller)n.controller.updateIndex(i),n.controller.linkScales();else{const e=en.getController(o),{datasetElementType:s,dataElementType:a}=ue.datasets[o];Object.assign(e,{dataElementType:en.getElement(a),datasetElementType:s&&en.getElement(s)}),n.controller=new e(this,i),t.push(n.controller)}}return this._updateMetasets(),t}_resetElements(){u(this.data.datasets,((t,e)=>{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins(\"reset\")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins(\"beforeUpdate\",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins(\"beforeElementsUpdate\");let o=0;for(let t=0,e=this.data.datasets.length;t<e;t++){const{controller:e}=this.getDatasetMeta(t),i=!s&&-1===n.indexOf(e);e.buildOrUpdateElements(i),o=Math.max(+e.getMaxOverflow(),o)}o=this._minPadding=i.layout.autoPadding?o:0,this._updateLayout(o),s||u(n,(t=>{t.reset()})),this._updateDatasets(t),this.notifyPlugins(\"afterUpdate\",{mode:t}),this._layers.sort(Mn(\"z\",\"_idx\"));const{_active:a,_lastEvent:r}=this;r?this._eventHandler(r,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){u(this.scales,(t=>{as.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);P(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e){Cn(t,s,\"_removeElements\"===i?-n:n)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+\",\"+t.splice(1).join(\",\")))),s=i(0);for(let t=1;t<e;t++)if(!P(s,i(t)))return;return Array.from(s).map((t=>t.split(\",\"))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins(\"beforeLayout\",{cancelable:!0}))return;as.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],u(this.boxes,(t=>{i&&\"chartArea\"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins(\"afterLayout\")}_updateDatasets(t){if(!1!==this.notifyPlugins(\"beforeDatasetsUpdate\",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t<e;++t)this.getDatasetMeta(t).controller.configure();for(let e=0,i=this.data.datasets.length;e<i;++e)this._updateDataset(e,S(t)?t({datasetIndex:e}):t);this.notifyPlugins(\"afterDatasetsUpdate\",{mode:t})}}_updateDataset(t,e){const i=this.getDatasetMeta(t),s={meta:i,index:t,mode:e,cancelable:!0};!1!==this.notifyPlugins(\"beforeDatasetUpdate\",s)&&(i.controller._update(e),s.cancelable=!1,this.notifyPlugins(\"afterDatasetUpdate\",s))}render(){!1!==this.notifyPlugins(\"beforeRender\",{cancelable:!0})&&(xt.has(this)?this.attached&&!xt.running(this)&&xt.start(this):(this.draw(),wn({chart:this})))}draw(){let t;if(this._resizeBeforeDraw){const{width:t,height:e}=this._resizeBeforeDraw;this._resize(t,e),this._resizeBeforeDraw=null}if(this.clear(),this.width<=0||this.height<=0)return;if(!1===this.notifyPlugins(\"beforeDraw\",{cancelable:!0}))return;const e=this._layers;for(t=0;t<e.length&&e[t].z<=0;++t)e[t].draw(this.chartArea);for(this._drawDatasets();t<e.length;++t)e[t].draw(this.chartArea);this.notifyPlugins(\"afterDraw\")}_getSortedDatasetMetas(t){const e=this._sortedMetasets,i=[];let s,n;for(s=0,n=e.length;s<n;++s){const n=e[s];t&&!n.visible||i.push(n)}return i}getSortedVisibleDatasetMetas(){return this._getSortedDatasetMetas(!0)}_drawDatasets(){if(!1===this.notifyPlugins(\"beforeDatasetsDraw\",{cancelable:!0}))return;const t=this.getSortedVisibleDatasetMetas();for(let e=t.length-1;e>=0;--e)this._drawDataset(t[e]);this.notifyPlugins(\"afterDatasetsDraw\")}_drawDataset(t){const e=this.ctx,i=t._clip,s=!i.disabled,n=function(t,e){const{xScale:i,yScale:s}=t;return i&&s?{left:On(i,e,\"left\"),right:On(i,e,\"right\"),top:On(s,e,\"top\"),bottom:On(s,e,\"bottom\")}:e}(t,this.chartArea),o={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins(\"beforeDatasetDraw\",o)&&(s&&Ie(e,{left:!1===i.left?0:n.left-i.left,right:!1===i.right?this.width:n.right+i.right,top:!1===i.top?0:n.top-i.top,bottom:!1===i.bottom?this.height:n.bottom+i.bottom}),t.controller.draw(),s&&ze(e),o.cancelable=!1,this.notifyPlugins(\"afterDatasetDraw\",o))}isPointInArea(t){return Re(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=Xi.modes[e];return\"function\"==typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter((t=>t&&t._dataset===e)).pop();return s||(s={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(s)),s}getContext(){return this.$context||(this.$context=Ci(null,{chart:this,type:\"chart\"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return\"boolean\"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?\"show\":\"hide\",n=this.getDatasetMeta(t),o=n.controller._resolveAnimations(void 0,s);k(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(n,{visible:i}),this.update((e=>e.datasetIndex===t?s:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),xt.remove(this),t=0,e=this.data.datasets.length;t<e;++t)this._destroyDatasetMeta(t)}destroy(){this.notifyPlugins(\"beforeDestroy\");const{canvas:t,ctx:e}=this;this._stop(),this.config.clearCache(),t&&(this.unbindEvents(),Te(t,e),this.platform.releaseContext(e),this.canvas=null,this.ctx=null),delete Pn[this.id],this.notifyPlugins(\"afterDestroy\")}toBase64Image(...t){return this.canvas.toDataURL(...t)}bindEvents(){this.bindUserEvents(),this.options.responsive?this.bindResponsiveEvents():this.attached=!0}bindUserEvents(){const t=this._listeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};u(this.options.events,(t=>i(t,s)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const a=()=>{s(\"attach\",a),this.attached=!0,this.resize(),i(\"resize\",n),i(\"detach\",o)};o=()=>{this.attached=!1,s(\"resize\",n),this._stop(),this._resize(0,0),i(\"attach\",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){u(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},u(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?\"set\":\"remove\";let n,o,a,r;for(\"dataset\"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller[\"_\"+s+\"DatasetHoverStyle\"]()),a=0,r=t.length;a<r;++a){o=t[a];const e=o&&this.getDatasetMeta(o.datasetIndex).controller;e&&e[s+\"HoverStyle\"](o.element,o.datasetIndex,o.index)}}getActiveElements(){return this._active||[]}setActiveElements(t){const e=this._active||[],i=t.map((({datasetIndex:t,index:e})=>{const i=this.getDatasetMeta(t);if(!i)throw new Error(\"No dataset found at index \"+t);return{datasetIndex:t,element:i.data[e],index:e}}));!f(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter((e=>e.plugin.id===t)).length}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=n(e,t),a=i?t:n(t,e);o.length&&this.updateHoverStyle(o,s.mode,!1),a.length&&s.mode&&this.updateHoverStyle(a,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins(\"beforeEvent\",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins(\"afterEvent\",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,o=e,a=this._getActiveElements(t,s,i,o),r=D(t),l=function(t,e,i,s){return i&&\"mouseout\"!==t.type?s?e:t:null}(t,this._lastEvent,i,r);i&&(this._lastEvent=null,d(n.onHover,[t,a,this],this),r&&d(n.onClick,[t,a,this],this));const h=!f(a,s);return(h||e)&&(this._active=a,this._updateHoverStyles(a,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if(\"mouseout\"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}function Tn(){return u(An.instances,(t=>t._plugins.invalidate()))}function Ln(){throw new Error(\"This method is not implemented: Check that a complete date adapter is provided.\")}class En{static override(t){Object.assign(En.prototype,t)}options;constructor(t){this.options=t||{}}init(){}formats(){return Ln()}parse(){return Ln()}format(){return Ln()}add(){return Ln()}diff(){return Ln()}startOf(){return Ln()}endOf(){return Ln()}}var Rn={_date:En};function In(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let s=[];for(let e=0,n=i.length;e<n;e++)s=s.concat(i[e].controller.getAllParsedValues(t));t._cache.$bar=lt(s.sort(((t,e)=>t-e)))}return t._cache.$bar}(e,t.type);let s,n,o,a,r=e._length;const l=()=>{32767!==o&&-32768!==o&&(k(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=i.length;s<n;++s)o=e.getPixelForValue(i[s]),l();for(a=void 0,s=0,n=e.ticks.length;s<n;++s)o=e.getPixelForTick(s),l();return r}function zn(t,e,i,s){return n(t)?function(t,e,i,s){const n=i.parse(t[0],s),o=i.parse(t[1],s),a=Math.min(n,o),r=Math.max(n,o);let l=a,h=r;Math.abs(a)>Math.abs(r)&&(l=r,h=a),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:o,min:a,max:r}}(t,e,i,s):e[i.axis]=i.parse(t,s),e}function Fn(t,e,i,s){const n=t.iScale,o=t.vScale,a=n.getLabels(),r=n===o,l=[];let h,c,d,u;for(h=i,c=i+s;h<c;++h)u=e[h],d={},d[n.axis]=r||n.parse(a[h],h),l.push(zn(u,d,o,h));return l}function Vn(t){return t&&void 0!==t.barStart&&void 0!==t.barEnd}function Bn(t,e,i,s){let n=e.borderSkipped;const o={};if(!n)return void(t.borderSkipped=o);if(!0===n)return void(t.borderSkipped={top:!0,right:!0,bottom:!0,left:!0});const{start:a,end:r,reverse:l,top:h,bottom:c}=function(t){let e,i,s,n,o;return t.horizontal?(e=t.base>t.x,i=\"left\",s=\"right\"):(e=t.base<t.y,i=\"bottom\",s=\"top\"),e?(n=\"end\",o=\"start\"):(n=\"start\",o=\"end\"),{start:i,end:s,reverse:e,top:n,bottom:o}}(t);\"middle\"===n&&i&&(t.enableBorderRadius=!0,(i._top||0)===s?n=h:(i._bottom||0)===s?n=c:(o[Wn(c,a,r,l)]=!0,n=h)),o[Wn(n,a,r,l)]=!0,t.borderSkipped=o}function Wn(t,e,i,s){var n,o,a;return s?(a=i,t=Nn(t=(n=t)===(o=e)?a:n===a?o:n,i,e)):t=Nn(t,e,i),t}function Nn(t,e,i){return\"start\"===t?e:\"end\"===t?i:t}function Hn(t,{inflateAmount:e},i){t.inflateAmount=\"auto\"===e?1===i?.33:0:e}class jn extends Ns{static id=\"doughnut\";static defaults={datasetElementType:!1,dataElementType:\"arc\",animation:{animateRotate:!0,animateScale:!1},animations:{numbers:{type:\"number\",properties:[\"circumference\",\"endAngle\",\"innerRadius\",\"outerRadius\",\"startAngle\",\"x\",\"y\",\"offset\",\"borderWidth\",\"spacing\"]}},cutout:\"50%\",rotation:0,circumference:360,radius:\"100%\",spacing:0,indexAxis:\"r\"};static descriptors={_scriptable:t=>\"spacing\"!==t,_indexable:t=>\"spacing\"!==t&&!t.startsWith(\"borderDash\")&&!t.startsWith(\"hoverBorderDash\")};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}};constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let n,a,r=t=>+i[t];if(o(i[t])){const{key:t=\"value\"}=this._parsing;r=e=>+M(i[e],t)}for(n=t,a=t+e;n<a;++n)s._parsed[n]=r(n)}}_getRotation(){return $(this.options.rotation-90)}_getCircumference(){return $(this.options.circumference)}_getRotationExtents(){let t=O,e=-O;for(let i=0;i<this.chart.data.datasets.length;++i)if(this.chart.isDatasetVisible(i)&&this.chart.getDatasetMeta(i).type===this._type){const s=this.chart.getDatasetMeta(i).controller,n=s._getRotation(),o=s._getCircumference();t=Math.min(t,n),e=Math.max(e,n+o)}return{rotation:t,circumference:e-t}}update(t){const e=this.chart,{chartArea:i}=e,s=this._cachedMeta,n=s.data,o=this.getMaxBorderWidth()+this.getMaxOffset(n)+this.options.spacing,a=Math.max((Math.min(i.width,i.height)-o)/2,0),r=Math.min(h(this.options.cutout,a),1),l=this._getRingWeight(this.index),{circumference:d,rotation:u}=this._getRotationExtents(),{ratioX:f,ratioY:g,offsetX:p,offsetY:m}=function(t,e,i){let s=1,n=1,o=0,a=0;if(e<O){const r=t,l=r+e,h=Math.cos(r),c=Math.sin(r),d=Math.cos(l),u=Math.sin(l),f=(t,e,s)=>Z(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),g=(t,e,s)=>Z(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=f(0,h,d),m=f(E,c,u),b=g(C,h,d),x=g(C+E,c,u);s=(p-b)/2,n=(m-x)/2,o=-(p+b)/2,a=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}(u,d,r),b=(i.width-o)/f,x=(i.height-o)/g,_=Math.max(Math.min(b,x)/2,0),y=c(this.options.radius,_),v=(y-Math.max(y*r,0))/this._getVisibleDatasetWeightTotal();this.offsetX=p*y,this.offsetY=m*y,s.total=this.calculateTotal(),this.outerRadius=y-v*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-v*l,0),this.updateElements(n,0,n.length,t)}_circumference(t,e){const i=this.options,s=this._cachedMeta,n=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===s._parsed[t]||s.data[t].hidden?0:this.calculateCircumference(s._parsed[t]*n/O)}updateElements(t,e,i,s){const n=\"reset\"===s,o=this.chart,a=o.chartArea,r=o.options.animation,l=(a.left+a.right)/2,h=(a.top+a.bottom)/2,c=n&&r.animateScale,d=c?0:this.innerRadius,u=c?0:this.outerRadius,{sharedOptions:f,includeOptions:g}=this._getSharedOptions(e,s);let p,m=this._getRotation();for(p=0;p<e;++p)m+=this._circumference(p,n);for(p=e;p<e+i;++p){const e=this._circumference(p,n),i=t[p],o={x:l+this.offsetX,y:h+this.offsetY,startAngle:m,endAngle:m+e,circumference:e,outerRadius:u,innerRadius:d};g&&(o.options=f||this.resolveDataElementOptions(p,i.active?\"active\":s)),m+=e,this.updateElement(i,p,o,s)}}calculateTotal(){const t=this._cachedMeta,e=t.data;let i,s=0;for(i=0;i<e.length;i++){const n=t._parsed[i];null===n||isNaN(n)||!this.chart.getDataVisibility(i)||e[i].hidden||(s+=Math.abs(n))}return s}calculateCircumference(t){const e=this._cachedMeta.total;return e>0&&!isNaN(t)?O*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t],i.options.locale);return{label:s[t]||\"\",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,o,a,r;if(!t)for(s=0,n=i.data.datasets.length;s<n;++s)if(i.isDatasetVisible(s)){o=i.getDatasetMeta(s),t=o.data,a=o.controller;break}if(!t)return 0;for(s=0,n=t.length;s<n;++s)r=a.resolveDataElementOptions(s),\"inner\"!==r.borderAlign&&(e=Math.max(e,r.borderWidth||0,r.hoverBorderWidth||0));return e}getMaxOffset(t){let e=0;for(let i=0,s=t.length;i<s;++i){const t=this.resolveDataElementOptions(i);e=Math.max(e,t.offset||0,t.hoverOffset||0)}return e}_getRingWeightOffset(t){let e=0;for(let i=0;i<t;++i)this.chart.isDatasetVisible(i)&&(e+=this._getRingWeight(i));return e}_getRingWeight(t){return Math.max(l(this.chart.data.datasets[t].weight,1),0)}_getVisibleDatasetWeightTotal(){return this._getRingWeightOffset(this.chart.data.datasets.length)||1}}class $n extends Ns{static id=\"polarArea\";static defaults={dataElementType:\"arc\",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"startAngle\",\"endAngle\",\"innerRadius\",\"outerRadius\"]}},indexAxis:\"r\",startAngle:0};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:\"radialLinear\",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t].r,i.options.locale);return{label:s[t]||\"\",value:n}}parseObjectData(t,e,i,s){return ii.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach(((t,i)=>{const s=this.getParsed(i).r;!isNaN(s)&&this.chart.getDataVisibility(i)&&(s<e.min&&(e.min=s),s>e.max&&(e.max=s))})),e}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),o=(n-Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n=\"reset\"===s,o=this.chart,a=o.options.animation,r=this._cachedMeta.rScale,l=r.xCenter,h=r.yCenter,c=r.getIndexAngle(0)-.5*C;let d,u=c;const f=360/this.countVisibleElements();for(d=0;d<e;++d)u+=this._computeAngle(d,s,f);for(d=e;d<e+i;d++){const e=t[d];let i=u,g=u+this._computeAngle(d,s,f),p=o.getDataVisibility(d)?r.getDistanceFromCenterForValue(this.getParsed(d).r):0;u=g,n&&(a.animateScale&&(p=0),a.animateRotate&&(i=g=c));const m={x:l,y:h,innerRadius:0,outerRadius:p,startAngle:i,endAngle:g,options:this.resolveDataElementOptions(d,e.active?\"active\":s)};this.updateElement(e,d,m,s)}}countVisibleElements(){const t=this._cachedMeta;let e=0;return t.data.forEach(((t,i)=>{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++})),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?$(this.resolveDataElementOptions(t,e).angle||i):0}}var Yn=Object.freeze({__proto__:null,BarController:class extends Ns{static id=\"bar\";static defaults={datasetElementType:!1,dataElementType:\"bar\",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"base\",\"width\",\"height\"]}}};static overrides={scales:{_index_:{type:\"category\",offset:!0,grid:{offset:!0}},_value_:{type:\"linear\",beginAtZero:!0}}};parsePrimitiveData(t,e,i,s){return Fn(t,e,i,s)}parseArrayData(t,e,i,s){return Fn(t,e,i,s)}parseObjectData(t,e,i,s){const{iScale:n,vScale:o}=t,{xAxisKey:a=\"x\",yAxisKey:r=\"y\"}=this._parsing,l=\"x\"===n.axis?a:r,h=\"x\"===o.axis?a:r,c=[];let d,u,f,g;for(d=i,u=i+s;d<u;++d)g=e[d],f={},f[n.axis]=n.parse(M(g,l),d),c.push(zn(M(g,h),f,o,d));return c}updateRangeFromParsed(t,e,i,s){super.updateRangeFromParsed(t,e,i,s);const n=i._custom;n&&e===this._cachedMeta.vScale&&(t.min=Math.min(t.min,n.min),t.max=Math.max(t.max,n.max))}getMaxOverflow(){return 0}getLabelAndValue(t){const e=this._cachedMeta,{iScale:i,vScale:s}=e,n=this.getParsed(t),o=n._custom,a=Vn(o)?\"[\"+o.start+\", \"+o.end+\"]\":\"\"+s.getLabelForValue(n[s.axis]);return{label:\"\"+i.getLabelForValue(n[i.axis]),value:a}}initialize(){this.enableOptionSharing=!0,super.initialize();this._cachedMeta.stack=this.getDataset().stack}update(t){const e=this._cachedMeta;this.updateElements(e.data,0,e.data.length,t)}updateElements(t,e,i,n){const o=\"reset\"===n,{index:a,_cachedMeta:{vScale:r}}=this,l=r.getBasePixel(),h=r.isHorizontal(),c=this._getRuler(),{sharedOptions:d,includeOptions:u}=this._getSharedOptions(e,n);for(let f=e;f<e+i;f++){const e=this.getParsed(f),i=o||s(e[r.axis])?{base:l,head:l}:this._calculateBarValuePixels(f),g=this._calculateBarIndexPixels(f,c),p=(e._stacks||{})[r.axis],m={horizontal:h,base:i.base,enableBorderRadius:!p||Vn(e._custom)||a===p._top||a===p._bottom,x:h?i.head:g.center,y:h?g.center:i.head,height:h?g.size:Math.abs(i.size),width:h?Math.abs(i.size):g.size};u&&(m.options=d||this.resolveDataElementOptions(f,t[f].active?\"active\":n));const b=m.options||t[f].options;Bn(m,b,p,a),Hn(m,b,c.ratio),this.updateElement(t[f],f,m,n)}}_getStacks(t,e){const{iScale:i}=this._cachedMeta,n=i.getMatchingVisibleMetas(this._type).filter((t=>t.controller.options.grouped)),o=i.options.stacked,a=[],r=t=>{const i=t.controller.getParsed(e),n=i&&i[t.vScale.axis];if(s(n)||isNaN(n))return!0};for(const i of n)if((void 0===e||!r(i))&&((!1===o||-1===a.indexOf(i.stack)||void 0===o&&void 0===i.stack)&&a.push(i.stack),i.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const s=this._getStacks(t,i),n=void 0!==e?s.indexOf(e):-1;return-1===n?s.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,s=[];let n,o;for(n=0,o=e.data.length;n<o;++n)s.push(i.getPixelForValue(this.getParsed(n)[i.axis],n));const a=t.barThickness;return{min:a||In(e),pixels:s,start:i._startPixel,end:i._endPixel,stackCount:this._getStackCount(),scale:i,grouped:t.grouped,ratio:a?1:t.categoryPercentage*t.barPercentage}}_calculateBarValuePixels(t){const{_cachedMeta:{vScale:e,_stacked:i,index:n},options:{base:o,minBarLength:a}}=this,r=o||0,l=this.getParsed(t),h=l._custom,c=Vn(h);let d,u,f=l[e.axis],g=0,p=i?this.applyStack(e,l,i):f;p!==f&&(g=p-f,p=f),c&&(f=h.barStart,p=h.barEnd-h.barStart,0!==f&&F(f)!==F(h.barEnd)&&(g=0),g+=f);const m=s(o)||c?g:o;let b=e.getPixelForValue(m);if(d=this.chart.getDataVisibility(t)?e.getPixelForValue(g+p):b,u=d-b,Math.abs(u)<a){u=function(t,e,i){return 0!==t?F(t):(e.isHorizontal()?1:-1)*(e.min>=i?1:-1)}(u,e,r)*a,f===r&&(b-=u/2);const t=e.getPixelForDecimal(0),s=e.getPixelForDecimal(1),o=Math.min(t,s),h=Math.max(t,s);b=Math.max(Math.min(b,h),o),d=b+u,i&&!c&&(l._stacks[e.axis]._visualValues[n]=e.getValueForPixel(d)-e.getValueForPixel(b))}if(b===e.getPixelForValue(r)){const t=F(u)*e.getLineWidthForValue(r)/2;b+=t,u-=t}return{size:u,base:b,head:d,center:d+u/2}}_calculateBarIndexPixels(t,e){const i=e.scale,n=this.options,o=n.skipNull,a=l(n.maxBarThickness,1/0);let r,h;if(e.grouped){const i=o?this._getStackCount(t):e.stackCount,l=\"flex\"===n.barThickness?function(t,e,i,s){const n=e.pixels,o=n[t];let a=t>0?n[t-1]:null,r=t<n.length-1?n[t+1]:null;const l=i.categoryPercentage;null===a&&(a=o-(null===r?e.end-e.start:r-o)),null===r&&(r=o+o-a);const h=o-(o-Math.min(a,r))/2*l;return{chunk:Math.abs(r-a)/2*l/s,ratio:i.barPercentage,start:h}}(t,e,n,i):function(t,e,i,n){const o=i.barThickness;let a,r;return s(o)?(a=e.min*i.categoryPercentage,r=i.barPercentage):(a=o*n,r=1),{chunk:a/n,ratio:r,start:e.pixels[t]-a/2}}(t,e,n,i),c=this._getStackIndex(this.index,this._cachedMeta.stack,o?t:void 0);r=l.start+l.chunk*c+l.chunk/2,h=Math.min(a,l.chunk*l.ratio)}else r=i.getPixelForValue(this.getParsed(t)[i.axis],t),h=Math.min(a,e.min*e.ratio);return{base:r-h/2,head:r+h/2,center:r,size:h}}draw(){const t=this._cachedMeta,e=t.vScale,i=t.data,s=i.length;let n=0;for(;n<s;++n)null!==this.getParsed(n)[e.axis]&&i[n].draw(this._ctx)}},BubbleController:class extends Ns{static id=\"bubble\";static defaults={datasetElementType:!1,dataElementType:\"point\",animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"borderWidth\",\"radius\"]}}};static overrides={scales:{x:{type:\"linear\"},y:{type:\"linear\"}}};initialize(){this.enableOptionSharing=!0,super.initialize()}parsePrimitiveData(t,e,i,s){const n=super.parsePrimitiveData(t,e,i,s);for(let t=0;t<n.length;t++)n[t]._custom=this.resolveDataElementOptions(t+i).radius;return n}parseArrayData(t,e,i,s){const n=super.parseArrayData(t,e,i,s);for(let t=0;t<n.length;t++){const s=e[i+t];n[t]._custom=l(s[2],this.resolveDataElementOptions(t+i).radius)}return n}parseObjectData(t,e,i,s){const n=super.parseObjectData(t,e,i,s);for(let t=0;t<n.length;t++){const s=e[i+t];n[t]._custom=l(s&&s.r&&+s.r,this.resolveDataElementOptions(t+i).radius)}return n}getMaxOverflow(){const t=this._cachedMeta.data;let e=0;for(let i=t.length-1;i>=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,o=this.getParsed(t),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y),l=o._custom;return{label:i[t]||\"\",value:\"(\"+a+\", \"+r+(l?\", \"+l:\"\")+\")\"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n=\"reset\"===s,{iScale:o,vScale:a}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,s),h=o.axis,c=a.axis;for(let d=e;d<e+i;d++){const e=t[d],i=!n&&this.getParsed(d),u={},f=u[h]=n?o.getPixelForDecimal(.5):o.getPixelForValue(i[h]),g=u[c]=n?a.getBasePixel():a.getPixelForValue(i[c]);u.skip=isNaN(f)||isNaN(g),l&&(u.options=r||this.resolveDataElementOptions(d,e.active?\"active\":s),n&&(u.options.radius=0)),this.updateElement(e,d,u,s)}}resolveDataElementOptions(t,e){const i=this.getParsed(t);let s=super.resolveDataElementOptions(t,e);s.$shared&&(s=Object.assign({},s,{$shared:!1}));const n=s.radius;return\"active\"!==e&&(s.radius=0),s.radius+=l(i&&i._custom,n),s}},DoughnutController:jn,LineController:class extends Ns{static id=\"line\";static defaults={datasetElementType:\"line\",dataElementType:\"point\",showLine:!0,spanGaps:!1};static overrides={scales:{_index_:{type:\"category\"},_value_:{type:\"linear\"}}};initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:i,data:s=[],_dataset:n}=e,o=this.chart._animationsDisabled;let{start:a,count:r}=pt(e,s,o);this._drawStart=a,this._drawCount=r,mt(e)&&(a=0,r=s.length),i._chart=this.chart,i._datasetIndex=this.index,i._decimated=!!n._decimated,i.points=s;const l=this.resolveDatasetElementOptions(t);this.options.showLine||(l.borderWidth=0),l.segment=this.options.segment,this.updateElement(i,void 0,{animated:!o,options:l},t),this.updateElements(s,a,r,t)}updateElements(t,e,i,n){const o=\"reset\"===n,{iScale:a,vScale:r,_stacked:l,_dataset:h}=this._cachedMeta,{sharedOptions:c,includeOptions:d}=this._getSharedOptions(e,n),u=a.axis,f=r.axis,{spanGaps:g,segment:p}=this.options,m=N(g)?g:Number.POSITIVE_INFINITY,b=this.chart._animationsDisabled||o||\"none\"===n,x=e+i,_=t.length;let y=e>0&&this.getParsed(e-1);for(let i=0;i<_;++i){const g=t[i],_=b?g:{};if(i<e||i>=x){_.skip=!0;continue}const v=this.getParsed(i),M=s(v[f]),w=_[u]=a.getPixelForValue(v[u],i),k=_[f]=o||M?r.getBasePixel():r.getPixelForValue(l?this.applyStack(r,v,l):v[f],i);_.skip=isNaN(w)||isNaN(k)||M,_.stop=i>0&&Math.abs(v[u]-y[u])>m,p&&(_.parsed=v,_.raw=h.data[i]),d&&(_.options=c||this.resolveDataElementOptions(i,g.active?\"active\":n)),b||this.updateElement(g,i,_,n),y=v}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}},PieController:class extends jn{static id=\"pie\";static defaults={cutout:0,rotation:0,circumference:360,radius:\"100%\"}},PolarAreaController:$n,RadarController:class extends Ns{static id=\"radar\";static defaults={datasetElementType:\"line\",dataElementType:\"point\",indexAxis:\"r\",showLine:!0,elements:{line:{fill:\"start\"}}};static overrides={aspectRatio:1,scales:{r:{type:\"radialLinear\"}}};getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:\"\"+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return ii.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,\"resize\"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this._cachedMeta.rScale,o=\"reset\"===s;for(let a=e;a<e+i;a++){const e=t[a],i=this.resolveDataElementOptions(a,e.active?\"active\":s),r=n.getPointPositionForValue(a,this.getParsed(a).r),l=o?n.xCenter:r.x,h=o?n.yCenter:r.y,c={x:l,y:h,angle:r.angle,skip:isNaN(l)||isNaN(h),options:i};this.updateElement(e,a,c,s)}}},ScatterController:class extends Ns{static id=\"scatter\";static defaults={datasetElementType:!1,dataElementType:\"point\",showLine:!1,fill:!1};static overrides={interaction:{mode:\"point\"},scales:{x:{type:\"linear\"},y:{type:\"linear\"}}};getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,o=this.getParsed(t),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y);return{label:i[t]||\"\",value:\"(\"+a+\", \"+r+\")\"}}update(t){const e=this._cachedMeta,{data:i=[]}=e,s=this.chart._animationsDisabled;let{start:n,count:o}=pt(e,i,s);if(this._drawStart=n,this._drawCount=o,mt(e)&&(n=0,o=i.length),this.options.showLine){this.datasetElementType||this.addElements();const{dataset:n,_dataset:o}=e;n._chart=this.chart,n._datasetIndex=this.index,n._decimated=!!o._decimated,n.points=i;const a=this.resolveDatasetElementOptions(t);a.segment=this.options.segment,this.updateElement(n,void 0,{animated:!s,options:a},t)}else this.datasetElementType&&(delete e.dataset,this.datasetElementType=!1);this.updateElements(i,n,o,t)}addElements(){const{showLine:t}=this.options;!this.datasetElementType&&t&&(this.datasetElementType=this.chart.registry.getElement(\"line\")),super.addElements()}updateElements(t,e,i,n){const o=\"reset\"===n,{iScale:a,vScale:r,_stacked:l,_dataset:h}=this._cachedMeta,c=this.resolveDataElementOptions(e,n),d=this.getSharedOptions(c),u=this.includeOptions(n,d),f=a.axis,g=r.axis,{spanGaps:p,segment:m}=this.options,b=N(p)?p:Number.POSITIVE_INFINITY,x=this.chart._animationsDisabled||o||\"none\"===n;let _=e>0&&this.getParsed(e-1);for(let c=e;c<e+i;++c){const e=t[c],i=this.getParsed(c),p=x?e:{},y=s(i[g]),v=p[f]=a.getPixelForValue(i[f],c),M=p[g]=o||y?r.getBasePixel():r.getPixelForValue(l?this.applyStack(r,i,l):i[g],c);p.skip=isNaN(v)||isNaN(M)||y,p.stop=c>0&&Math.abs(i[f]-_[f])>b,m&&(p.parsed=i,p.raw=h.data[c]),u&&(p.options=d||this.resolveDataElementOptions(c,e.active?\"active\":n)),x||this.updateElement(e,c,p,n),_=i}this.updateSharedOptions(d,n,c)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;const n=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,n,o)/2}}});function Un(t,e,i,s){const n=vi(t.options.borderRadius,[\"outerStart\",\"outerEnd\",\"innerStart\",\"innerEnd\"]);const o=(i-e)/2,a=Math.min(o,s*e/2),r=t=>{const e=(i-Math.min(o,t))*s/2;return J(t,0,Math.min(o,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:J(n.innerStart,0,a),innerEnd:J(n.innerEnd,0,a)}}function Xn(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function qn(t,e,i,s,n,o){const{x:a,y:r,startAngle:l,pixelMargin:h,innerRadius:c}=e,d=Math.max(e.outerRadius+s+i-h,0),u=c>0?c+s+i+h:0;let f=0;const g=n-l;if(s){const t=((c>0?c-s:0)+(d>0?d-s:0))/2;f=(g-(0!==t?g*t/(t+s):g))/2}const p=(g-Math.max(.001,g*d-i/C)/d)/2,m=l+p+f,b=n-p-f,{outerStart:x,outerEnd:_,innerStart:y,innerEnd:v}=Un(e,u,d,b-m),M=d-x,w=d-_,k=m+x/M,S=b-_/w,P=u+y,D=u+v,O=m+y/P,A=b-v/D;if(t.beginPath(),o){const e=(k+S)/2;if(t.arc(a,r,d,k,e),t.arc(a,r,d,e,S),_>0){const e=Xn(w,S,a,r);t.arc(e.x,e.y,_,S,b+E)}const i=Xn(D,b,a,r);if(t.lineTo(i.x,i.y),v>0){const e=Xn(D,A,a,r);t.arc(e.x,e.y,v,b+E,A+Math.PI)}const s=(b-v/u+(m+y/u))/2;if(t.arc(a,r,u,b-v/u,s,!0),t.arc(a,r,u,s,m+y/u,!0),y>0){const e=Xn(P,O,a,r);t.arc(e.x,e.y,y,O+Math.PI,m-E)}const n=Xn(M,m,a,r);if(t.lineTo(n.x,n.y),x>0){const e=Xn(M,k,a,r);t.arc(e.x,e.y,x,m-E,k)}}else{t.moveTo(a,r);const e=Math.cos(k)*d+a,i=Math.sin(k)*d+r;t.lineTo(e,i);const s=Math.cos(S)*d+a,n=Math.sin(S)*d+r;t.lineTo(s,n)}t.closePath()}function Kn(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r,options:l}=e,{borderWidth:h,borderJoinStyle:c,borderDash:d,borderDashOffset:u}=l,f=\"inner\"===l.borderAlign;if(!h)return;t.setLineDash(d||[]),t.lineDashOffset=u,f?(t.lineWidth=2*h,t.lineJoin=c||\"round\"):(t.lineWidth=h,t.lineJoin=c||\"bevel\");let g=e.endAngle;if(o){qn(t,e,i,s,g,n);for(let e=0;e<o;++e)t.stroke();isNaN(r)||(g=a+(r%O||O))}f&&function(t,e,i){const{startAngle:s,pixelMargin:n,x:o,y:a,outerRadius:r,innerRadius:l}=e;let h=n/r;t.beginPath(),t.arc(o,a,r,s-h,i+h),l>n?(h=n/l,t.arc(o,a,l,i+h,s-h,!0)):t.arc(o,a,n,i+E,s-E),t.closePath(),t.clip()}(t,e,g),o||(qn(t,e,i,s,g,n),t.stroke())}function Gn(t,e,i=e){t.lineCap=l(i.borderCapStyle,e.borderCapStyle),t.setLineDash(l(i.borderDash,e.borderDash)),t.lineDashOffset=l(i.borderDashOffset,e.borderDashOffset),t.lineJoin=l(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=l(i.borderWidth,e.borderWidth),t.strokeStyle=l(i.borderColor,e.borderColor)}function Zn(t,e,i){t.lineTo(i.x,i.y)}function Jn(t,e,i={}){const s=t.length,{start:n=0,end:o=s-1}=i,{start:a,end:r}=e,l=Math.max(n,a),h=Math.min(o,r),c=n<a&&o<a||n>r&&o>r;return{count:s,start:l,loop:e.loop,ilen:h<l&&!c?s+h-l:h-l}}function Qn(t,e,i,s){const{points:n,options:o}=e,{count:a,start:r,loop:l,ilen:h}=Jn(n,i,s),c=function(t){return t.stepped?Fe:t.tension||\"monotone\"===t.cubicInterpolationMode?Ve:Zn}(o);let d,u,f,{move:g=!0,reverse:p}=s||{};for(d=0;d<=h;++d)u=n[(r+(p?h-d:d))%a],u.skip||(g?(t.moveTo(u.x,u.y),g=!1):c(t,f,u,p,o.stepped),f=u);return l&&(u=n[(r+(p?h:0))%a],c(t,f,u,p,o.stepped)),!!l}function to(t,e,i,s){const n=e.points,{count:o,start:a,ilen:r}=Jn(n,i,s),{move:l=!0,reverse:h}=s||{};let c,d,u,f,g,p,m=0,b=0;const x=t=>(a+(h?r-t:t))%o,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=n[x(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[x(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(i<f?f=i:i>g&&(g=i),m=(b*m+e)/++b):(_(),t.lineTo(e,i),u=s,b=0,f=g=i),p=i}_()}function eo(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||\"monotone\"===e.cubicInterpolationMode||e.stepped||i)?to:Qn}const io=\"function\"==typeof Path2D;function so(t,e,i,s){io&&!e.options.segment?function(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),Gn(t,e.options),t.stroke(n)}(t,e,i,s):function(t,e,i,s){const{segments:n,options:o}=e,a=eo(e);for(const r of n)Gn(t,o,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(t,e,i,s)}class no extends Hs{static id=\"line\";static defaults={borderCapStyle:\"butt\",borderDash:[],borderDashOffset:0,borderJoinStyle:\"miter\",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:\"default\",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:\"backgroundColor\",borderColor:\"borderColor\"};static descriptors={_scriptable:!0,_indexable:t=>\"borderDash\"!==t&&\"fill\"!==t};constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||\"monotone\"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;hi(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=zi(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,o=Ii(this,{property:e,start:s,end:s});if(!o.length)return;const a=[],r=function(t){return t.stepped?pi:t.tension||\"monotone\"===t.cubicInterpolationMode?mi:gi}(i);let l,h;for(l=0,h=o.length;l<h;++l){const{start:h,end:c}=o[l],d=n[h],u=n[c];if(d===u){a.push(d);continue}const f=r(d,u,Math.abs((s-d[e])/(u[e]-d[e])),i.stepped);f[e]=t[e],a.push(f)}return 1===a.length?a[0]:a}pathSegment(t,e,i){return eo(this)(t,this,e,i)}path(t,e,i){const s=this.segments,n=eo(this);let o=this._loop;e=e||0,i=i||this.points.length-e;for(const a of s)o&=n(t,this,a,{start:e,end:e+i-1});return!!o}draw(t,e,i,s){const n=this.options||{};(this.points||[]).length&&n.borderWidth&&(t.save(),so(t,this,i,s),t.restore()),this.animated&&(this._pointsUpdated=!1,this._path=void 0)}}function oo(t,e,i,s){const n=t.options,{[i]:o}=t.getProps([i],s);return Math.abs(e-o)<n.radius+n.hitRadius}function ao(t,e){const{x:i,y:s,base:n,width:o,height:a}=t.getProps([\"x\",\"y\",\"base\",\"width\",\"height\"],e);let r,l,h,c,d;return t.horizontal?(d=a/2,r=Math.min(i,n),l=Math.max(i,n),h=s-d,c=s+d):(d=o/2,r=i-d,l=i+d,h=Math.min(s,n),c=Math.max(s,n)),{left:r,top:h,right:l,bottom:c}}function ro(t,e,i,s){return t?0:J(e,i,s)}function lo(t){const e=ao(t),i=e.right-e.left,s=e.bottom-e.top,n=function(t,e,i){const s=t.options.borderWidth,n=t.borderSkipped,o=Mi(s);return{t:ro(n.top,o.top,0,i),r:ro(n.right,o.right,0,e),b:ro(n.bottom,o.bottom,0,i),l:ro(n.left,o.left,0,e)}}(t,i/2,s/2),a=function(t,e,i){const{enableBorderRadius:s}=t.getProps([\"enableBorderRadius\"]),n=t.options.borderRadius,a=wi(n),r=Math.min(e,i),l=t.borderSkipped,h=s||o(n);return{topLeft:ro(!h||l.top||l.left,a.topLeft,0,r),topRight:ro(!h||l.top||l.right,a.topRight,0,r),bottomLeft:ro(!h||l.bottom||l.left,a.bottomLeft,0,r),bottomRight:ro(!h||l.bottom||l.right,a.bottomRight,0,r)}}(t,i/2,s/2);return{outer:{x:e.left,y:e.top,w:i,h:s,radius:a},inner:{x:e.left+n.l,y:e.top+n.t,w:i-n.l-n.r,h:s-n.t-n.b,radius:{topLeft:Math.max(0,a.topLeft-Math.max(n.t,n.l)),topRight:Math.max(0,a.topRight-Math.max(n.t,n.r)),bottomLeft:Math.max(0,a.bottomLeft-Math.max(n.b,n.l)),bottomRight:Math.max(0,a.bottomRight-Math.max(n.b,n.r))}}}}function ho(t,e,i,s){const n=null===e,o=null===i,a=t&&!(n&&o)&&ao(t,s);return a&&(n||tt(e,a.left,a.right))&&(o||tt(i,a.top,a.bottom))}function co(t,e){t.rect(e.x,e.y,e.w,e.h)}function uo(t,e,i={}){const s=t.x!==i.x?-e:0,n=t.y!==i.y?-e:0,o=(t.x+t.w!==i.x+i.w?e:0)-s,a=(t.y+t.h!==i.y+i.h?e:0)-n;return{x:t.x+s,y:t.y+n,w:t.w+o,h:t.h+a,radius:t.radius}}var fo=Object.freeze({__proto__:null,ArcElement:class extends Hs{static id=\"arc\";static defaults={borderAlign:\"center\",borderColor:\"#fff\",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0};static defaultRoutes={backgroundColor:\"backgroundColor\"};static descriptors={_scriptable:!0,_indexable:t=>\"borderDash\"!==t};circumference;endAngle;fullCircles;innerRadius;outerRadius;pixelMargin;startAngle;constructor(t){super(),this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.getProps([\"x\",\"y\"],i),{angle:n,distance:o}=X(s,{x:t,y:e}),{startAngle:a,endAngle:r,innerRadius:h,outerRadius:c,circumference:d}=this.getProps([\"startAngle\",\"endAngle\",\"innerRadius\",\"outerRadius\",\"circumference\"],i),u=(this.options.spacing+this.options.borderWidth)/2,f=l(d,r-a)>=O||Z(n,a,r),g=tt(o,h+u,c+u);return f&&g}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:o,outerRadius:a}=this.getProps([\"x\",\"y\",\"startAngle\",\"endAngle\",\"innerRadius\",\"outerRadius\"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(o+a+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/4,n=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin=\"inner\"===e.borderAlign?.33:0,this.fullCircles=i>O?Math.floor(i/O):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const a=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(a)*s,Math.sin(a)*s);const r=s*(1-Math.sin(Math.min(C,i||0)));t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,function(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r}=e;let l=e.endAngle;if(o){qn(t,e,i,s,l,n);for(let e=0;e<o;++e)t.fill();isNaN(r)||(l=a+(r%O||O))}qn(t,e,i,s,l,n),t.fill()}(t,this,r,n,o),Kn(t,this,r,n,o),t.restore()}},BarElement:class extends Hs{static id=\"bar\";static defaults={borderSkipped:\"start\",borderWidth:0,borderRadius:0,inflateAmount:\"auto\",pointStyle:void 0};static defaultRoutes={backgroundColor:\"backgroundColor\",borderColor:\"borderColor\"};constructor(t){super(),this.options=void 0,this.horizontal=void 0,this.base=void 0,this.width=void 0,this.height=void 0,this.inflateAmount=void 0,t&&Object.assign(this,t)}draw(t){const{inflateAmount:e,options:{borderColor:i,backgroundColor:s}}=this,{inner:n,outer:o}=lo(this),a=(r=o.radius).topLeft||r.topRight||r.bottomLeft||r.bottomRight?He:co;var r;t.save(),o.w===n.w&&o.h===n.h||(t.beginPath(),a(t,uo(o,e,n)),t.clip(),a(t,uo(n,-e,o)),t.fillStyle=i,t.fill(\"evenodd\")),t.beginPath(),a(t,uo(n,e)),t.fillStyle=s,t.fill(),t.restore()}inRange(t,e,i){return ho(this,t,e,i)}inXRange(t,e){return ho(this,t,null,e)}inYRange(t,e){return ho(this,null,t,e)}getCenterPoint(t){const{x:e,y:i,base:s,horizontal:n}=this.getProps([\"x\",\"y\",\"base\",\"horizontal\"],t);return{x:n?(e+s)/2:e,y:n?i:(i+s)/2}}getRange(t){return\"x\"===t?this.width/2:this.height/2}},LineElement:no,PointElement:class extends Hs{static id=\"point\";parsed;skip;stop;static defaults={borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:\"circle\",radius:3,rotation:0};static defaultRoutes={backgroundColor:\"backgroundColor\",borderColor:\"borderColor\"};constructor(t){super(),this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,i){const s=this.options,{x:n,y:o}=this.getProps([\"x\",\"y\"],i);return Math.pow(t-n,2)+Math.pow(e-o,2)<Math.pow(s.hitRadius+s.radius,2)}inXRange(t,e){return oo(this,t,\"x\",e)}inYRange(t,e){return oo(this,t,\"y\",e)}getCenterPoint(t){const{x:e,y:i}=this.getProps([\"x\",\"y\"],t);return{x:e,y:i}}size(t){let e=(t=t||this.options||{}).radius||0;e=Math.max(e,e&&t.hoverRadius||0);return 2*(e+(e&&t.borderWidth||0))}draw(t,e){const i=this.options;this.skip||i.radius<.1||!Re(this,e,this.size(i)/2)||(t.strokeStyle=i.borderColor,t.lineWidth=i.borderWidth,t.fillStyle=i.backgroundColor,Le(t,i,this.x,this.y))}getRange(){const t=this.options||{};return t.radius+t.hitRadius}}});function go(t,e,i,s){const n=t.indexOf(e);if(-1===n)return((t,e,i,s)=>(\"string\"==typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,s);return n!==t.lastIndexOf(e)?i:n}function po(t){const e=this.getLabels();return t>=0&&t<e.length?e[t]:t}function mo(t,e,{horizontal:i,minRotation:s}){const n=$(s),o=(i?Math.sin(n):Math.cos(n))||.001,a=.75*e*(\"\"+t).length;return Math.min(e/o,a)}class bo extends Js{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return s(t)||(\"number\"==typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:i}=this.getUserBounds();let{min:s,max:n}=this;const o=t=>s=e?s:t,a=t=>n=i?n:t;if(t){const t=F(s),e=F(n);t<0&&e<0?a(0):t>0&&e>0&&o(0)}if(s===n){let e=0===n?1:Math.abs(.05*n);a(n+e),t||o(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const n=function(t,e){const i=[],{bounds:n,step:o,min:a,max:r,precision:l,count:h,maxTicks:c,maxDigits:d,includeBounds:u}=t,f=o||1,g=c-1,{min:p,max:m}=e,b=!s(a),x=!s(r),_=!s(h),y=(m-p)/(d+1);let v,M,w,k,S=B((m-p)/g/f)*f;if(S<1e-14&&!b&&!x)return[{value:p},{value:m}];k=Math.ceil(m/S)-Math.floor(p/S),k>g&&(S=B(k*S/g/f)*f),s(l)||(v=Math.pow(10,l),S=Math.ceil(S*v)/v),\"ticks\"===n?(M=Math.floor(p/S)*S,w=Math.ceil(m/S)*S):(M=p,w=m),b&&x&&o&&H((r-a)/o,S/1e3)?(k=Math.round(Math.min((r-a)/S,c)),S=(r-a)/k,M=a,w=r):_?(M=b?a:M,w=x?r:w,k=h-1,S=(w-M)/k):(k=(w-M)/S,k=V(k,Math.round(k),S/1e3)?Math.round(k):Math.ceil(k));const P=Math.max(U(S),U(M));v=Math.pow(10,s(l)?P:l),M=Math.round(M*v)/v,w=Math.round(w*v)/v;let D=0;for(b&&(u&&M!==a?(i.push({value:a}),M<a&&D++,V(Math.round((M+D*S)*v)/v,a,mo(a,y,t))&&D++):M<a&&D++);D<k;++D){const t=Math.round((M+D*S)*v)/v;if(x&&t>r)break;i.push({value:t})}return x&&u&&w!==r?i.length&&V(i[i.length-1].value,r,mo(r,y,t))?i[i.length-1].value=r:i.push({value:r}):x&&w!==r||i.push({value:w}),i}({maxTicks:i,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},this._range||this);return\"ticks\"===t.bounds&&j(n,this,\"value\"),t.reverse?(n.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),n}configure(){const t=this.ticks;let e=this.min,i=this.max;if(super.configure(),this.options.offset&&t.length){const s=(i-e)/Math.max(t.length-1,1)/2;e-=s,i+=s}this._startValue=e,this._endValue=i,this._valueRange=i-e}getLabelForValue(t){return ne(t,this.chart.options.locale,this.options.ticks.format)}}class xo extends bo{static id=\"linear\";static defaults={ticks:{callback:ae.formatters.numeric}};determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?t:0,this.max=a(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,i=$(this.options.ticks.minRotation),s=(t?Math.sin(i):Math.cos(i))||.001,n=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,n.lineHeight/s))}getPixelForValue(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}const _o=t=>Math.floor(z(t)),yo=(t,e)=>Math.pow(10,_o(t)+e);function vo(t){return 1===t/Math.pow(10,_o(t))}function Mo(t,e,i){const s=Math.pow(10,i),n=Math.floor(t/s);return Math.ceil(e/s)-n}function wo(t,{min:e,max:i}){e=r(t.min,e);const s=[],n=_o(e);let o=function(t,e){let i=_o(e-t);for(;Mo(t,e,i)>10;)i++;for(;Mo(t,e,i)<10;)i--;return Math.min(i,_o(t))}(e,i),a=o<0?Math.pow(10,Math.abs(o)):1;const l=Math.pow(10,o),h=n>o?Math.pow(10,n):0,c=Math.round((e-h)*a)/a,d=Math.floor((e-h)/l/10)*l*10;let u=Math.floor((c-d)/Math.pow(10,o)),f=r(t.min,Math.round((h+d+u*Math.pow(10,o))*a)/a);for(;f<i;)s.push({value:f,major:vo(f),significand:u}),u>=10?u=u<15?15:20:u++,u>=20&&(o++,u=2,a=o>=0?1:a),f=Math.round((h+d+u*Math.pow(10,o))*a)/a;const g=r(t.max,f);return s.push({value:g,major:vo(g),significand:u}),s}class ko extends Js{static id=\"logarithmic\";static defaults={ticks:{callback:ae.formatters.logarithmic,major:{enabled:!0}}};constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=bo.prototype.parse.apply(this,[t,e]);if(0!==i)return a(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?Math.max(0,t):null,this.max=a(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!a(this._userMin)&&(this.min=t===yo(this.min,0)?yo(this.min,-1):yo(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,o=t=>s=e?s:t;i===s&&(i<=0?(n(1),o(10)):(n(yo(i,-1)),o(yo(s,1)))),i<=0&&n(yo(s,-1)),s<=0&&o(yo(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e=wo({min:this._userMin,max:this._userMax},this);return\"ticks\"===t.bounds&&j(e,this,\"value\"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}getLabelForValue(t){return void 0===t?\"0\":ne(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=z(t),this._valueRange=z(this.max)-z(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(z(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function So(t){const e=t.ticks;if(e.display&&t.display){const t=ki(e.backdropPadding);return l(e.font&&e.font.size,ue.font.size)+t.height}return 0}function Po(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:t<s||t>n?{start:e-i,end:e}:{start:e,end:e+i}}function Do(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),s=[],o=[],a=t._pointLabels.length,r=t.options.pointLabels,l=r.centerPointLabels?C/a:0;for(let u=0;u<a;u++){const a=r.setContext(t.getPointLabelContext(u));o[u]=a.padding;const f=t.getPointPosition(u,t.drawingArea+o[u],l),g=Si(a.font),p=(h=t.ctx,c=g,d=n(d=t._pointLabels[u])?d:[d],{w:Oe(h,c.string,d),h:d.length*c.lineHeight});s[u]=p;const m=G(t.getIndexAngle(u)+l),b=Math.round(Y(m));Co(i,e,m,Po(b,f.x,p.w,0,180),Po(b,f.y,p.h,90,270))}var h,c,d;t.setCenterPoint(e.l-i.l,i.r-e.r,e.t-i.t,i.b-e.b),t._pointLabelItems=function(t,e,i){const s=[],n=t._pointLabels.length,o=t.options,{centerPointLabels:a,display:r}=o.pointLabels,l={extra:So(o)/2,additionalAngle:a?C/n:0};let h;for(let o=0;o<n;o++){l.padding=i[o],l.size=e[o];const n=Oo(t,o,l);s.push(n),\"auto\"===r&&(n.visible=Ao(n,h),n.visible&&(h=n))}return s}(t,s,o)}function Co(t,e,i,s,n){const o=Math.abs(Math.sin(i)),a=Math.abs(Math.cos(i));let r=0,l=0;s.start<e.l?(r=(e.l-s.start)/o,t.l=Math.min(t.l,e.l-r)):s.end>e.r&&(r=(s.end-e.r)/o,t.r=Math.max(t.r,e.r+r)),n.start<e.t?(l=(e.t-n.start)/a,t.t=Math.min(t.t,e.t-l)):n.end>e.b&&(l=(n.end-e.b)/a,t.b=Math.max(t.b,e.b+l))}function Oo(t,e,i){const s=t.drawingArea,{extra:n,additionalAngle:o,padding:a,size:r}=i,l=t.getPointPosition(e,s+n+a,o),h=Math.round(Y(G(l.angle+E))),c=function(t,e,i){90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e);return t}(l.y,r.h,h),d=function(t){if(0===t||180===t)return\"center\";if(t<180)return\"left\";return\"right\"}(h),u=function(t,e,i){\"right\"===i?t-=e:\"center\"===i&&(t-=e/2);return t}(l.x,r.w,d);return{visible:!0,x:l.x,y:c,textAlign:d,left:u,top:c,right:u+r.w,bottom:c+r.h}}function Ao(t,e){if(!e)return!0;const{left:i,top:s,right:n,bottom:o}=t;return!(Re({x:i,y:s},e)||Re({x:i,y:o},e)||Re({x:n,y:s},e)||Re({x:n,y:o},e))}function To(t,e,i){const{left:n,top:o,right:a,bottom:r}=i,{backdropColor:l}=e;if(!s(l)){const i=wi(e.borderRadius),s=ki(e.backdropPadding);t.fillStyle=l;const h=n-s.left,c=o-s.top,d=a-n+s.width,u=r-o+s.height;Object.values(i).some((t=>0!==t))?(t.beginPath(),He(t,{x:h,y:c,w:d,h:u,radius:i}),t.fill()):t.fillRect(h,c,d,u)}}function Lo(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,O);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let o=1;o<s;o++)i=t.getPointPosition(o,e),n.lineTo(i.x,i.y)}}class Eo extends bo{static id=\"radialLinear\";static defaults={display:!0,animate:!0,position:\"chartArea\",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:ae.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback:t=>t,padding:5,centerPointLabels:!1}};static defaultRoutes={\"angleLines.color\":\"borderColor\",\"pointLabels.color\":\"color\",\"ticks.color\":\"color\"};static descriptors={angleLines:{_fallback:\"grid\"}};constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=ki(So(this.options)/2),e=this.width=this.maxWidth-t.width,i=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+e/2+t.left),this.yCenter=Math.floor(this.top+i/2+t.top),this.drawingArea=Math.floor(Math.min(e,i)/2)}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!1);this.min=a(t)&&!isNaN(t)?t:0,this.max=a(e)&&!isNaN(e)?e:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/So(this.options))}generateTickLabels(t){bo.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map(((t,e)=>{const i=d(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:\"\"})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?Do(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){return G(t*(O/(this._pointLabels.length||1))+$(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if(s(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(s(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t<e.length){const i=e[t];return function(t,e,i){return Ci(t,{label:i,index:e,type:\"pointLabel\"})}(this.getContext(),t,i)}}getPointPosition(t,e,i=0){const s=this.getIndexAngle(t)-E+i;return{x:Math.cos(s)*e+this.xCenter,y:Math.sin(s)*e+this.yCenter,angle:s}}getPointPositionForValue(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))}getBasePosition(t){return this.getPointPositionForValue(t||0,this.getBaseValue())}getPointLabelPosition(t){const{left:e,top:i,right:s,bottom:n}=this._pointLabelItems[t];return{left:e,top:i,right:s,bottom:n}}drawBackground(){const{backgroundColor:t,grid:{circular:e}}=this.options;if(t){const i=this.ctx;i.save(),i.beginPath(),Lo(this,this.getDistanceFromCenterForValue(this._endValue),e,this._pointLabels.length),i.closePath(),i.fillStyle=t,i.fill(),i.restore()}}drawGrid(){const t=this.ctx,e=this.options,{angleLines:i,grid:s,border:n}=e,o=this._pointLabels.length;let a,r,l;if(e.pointLabels.display&&function(t,e){const{ctx:i,options:{pointLabels:s}}=t;for(let n=e-1;n>=0;n--){const e=t._pointLabelItems[n];if(!e.visible)continue;const o=s.setContext(t.getPointLabelContext(n));To(i,o,e);const a=Si(o.font),{x:r,y:l,textAlign:h}=e;Ne(i,t._pointLabels[n],r,l+a.lineHeight/2,a,{color:o.color,textAlign:h,textBaseline:\"middle\"})}}(this,o),s.display&&this.ticks.forEach(((t,e)=>{if(0!==e){r=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),a=s.setContext(i),l=n.setContext(i);!function(t,e,i,s,n){const o=t.ctx,a=e.circular,{color:r,lineWidth:l}=e;!a&&!s||!r||!l||i<0||(o.save(),o.strokeStyle=r,o.lineWidth=l,o.setLineDash(n.dash),o.lineDashOffset=n.dashOffset,o.beginPath(),Lo(t,i,a,s),o.closePath(),o.stroke(),o.restore())}(this,a,r,o,l)}})),i.display){for(t.save(),a=o-1;a>=0;a--){const s=i.setContext(this.getPointLabelContext(a)),{color:n,lineWidth:o}=s;o&&n&&(t.lineWidth=o,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,r=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),l=this.getPointPosition(a,r),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(l.x,l.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign=\"center\",t.textBaseline=\"middle\",this.ticks.forEach(((s,a)=>{if(0===a&&!e.reverse)return;const r=i.setContext(this.getContext(a)),l=Si(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[a].value),r.showLabelBackdrop){t.font=l.string,o=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=ki(r.backdropPadding);t.fillRect(-o/2-e.left,-n-l.size/2-e.top,o+e.width,l.size+e.height)}Ne(t,s.label,0,-n,l,{color:r.color,strokeColor:r.textStrokeColor,strokeWidth:r.textStrokeWidth})})),t.restore()}drawTitle(){}}const Ro={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Io=Object.keys(Ro);function zo(t,e){return t-e}function Fo(t,e){if(s(e))return null;const i=t._adapter,{parser:n,round:o,isoWeekday:r}=t._parseOpts;let l=e;return\"function\"==typeof n&&(l=n(l)),a(l)||(l=\"string\"==typeof n?i.parse(l,n):i.parse(l)),null===l?null:(o&&(l=\"week\"!==o||!N(r)&&!0!==r?i.startOf(l,o):i.startOf(l,\"isoWeek\",r)),+l)}function Vo(t,e,i,s){const n=Io.length;for(let o=Io.indexOf(t);o<n-1;++o){const t=Ro[Io[o]],n=t.steps?t.steps:Number.MAX_SAFE_INTEGER;if(t.common&&Math.ceil((i-e)/(n*t.size))<=s)return Io[o]}return Io[n-1]}function Bo(t,e,i){if(i){if(i.length){const{lo:s,hi:n}=et(i,e);t[i[s]>=e?i[s]:i[n]]=!0}}else t[e]=!0}function Wo(t,e,i){const s=[],n={},o=e.length;let a,r;for(a=0;a<o;++a)r=e[a],n[r]=a,s.push({value:r,major:!1});return 0!==o&&i?function(t,e,i,s){const n=t._adapter,o=+n.startOf(e[0].value,s),a=e[e.length-1].value;let r,l;for(r=o;r<=a;r=+n.add(r,1,s))l=i[r],l>=0&&(e[l].major=!0);return e}(t,s,n,i):s}class No extends Js{static id=\"time\";static defaults={bounds:\"data\",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:\"millisecond\",displayFormats:{}},ticks:{source:\"auto\",callback:!1,major:{enabled:!1}}};constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit=\"day\",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e={}){const i=t.time||(t.time={}),s=this._adapter=new Rn._date(t.adapters.date);s.init(e),x(i.displayFormats,s.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:Fo(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||\"day\";let{min:s,max:n,minDefined:o,maxDefined:r}=this.getUserBounds();function l(t){o||isNaN(t.min)||(s=Math.min(s,t.min)),r||isNaN(t.max)||(n=Math.max(n,t.max))}o&&r||(l(this._getLabelBounds()),\"ticks\"===t.bounds&&\"labels\"===t.ticks.source||l(this.getMinMax(!1))),s=a(s)&&!isNaN(s)?s:+e.startOf(Date.now(),i),n=a(n)&&!isNaN(n)?n:+e.endOf(Date.now(),i)+1,this.min=Math.min(s,n-1),this.max=Math.max(s+1,n)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,s=\"labels\"===i.source?this.getLabelTimestamps():this._generate();\"ticks\"===t.bounds&&s.length&&(this.min=this._userMin||s[0],this.max=this._userMax||s[s.length-1]);const n=this.min,o=nt(s,n,this.max);return this._unit=e.unit||(i.autoSkip?Vo(e.minUnit,this.min,this.max,this._getLabelCapacity(n)):function(t,e,i,s,n){for(let o=Io.length-1;o>=Io.indexOf(i);o--){const i=Io[o];if(Ro[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return Io[i?Io.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&\"year\"!==this._unit?function(t){for(let e=Io.indexOf(t)+1,i=Io.length;e<i;++e)if(Ro[Io[e]].common)return Io[e]}(this._unit):void 0,this.initOffsets(s),t.reverse&&o.reverse(),Wo(this,o,this._majorUnit)}afterAutoSkip(){this.options.offsetAfterAutoskip&&this.initOffsets(this.ticks.map((t=>+t.value)))}initOffsets(t=[]){let e,i,s=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),s=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),n=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;s=J(s,0,o),n=J(n,0,o),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,e=this.min,i=this.max,s=this.options,n=s.time,o=n.unit||Vo(n.minUnit,e,i,this._getLabelCapacity(e)),a=l(s.ticks.stepSize,1),r=\"week\"===o&&n.isoWeekday,h=N(r)||!0===r,c={};let d,u,f=e;if(h&&(f=+t.startOf(f,\"isoWeek\",r)),f=+t.startOf(f,h?\"day\":o),t.diff(i,e,o)>1e5*a)throw new Error(e+\" and \"+i+\" are too far apart with stepSize of \"+a+\" \"+o);const g=\"data\"===s.ticks.source&&this.getDataTimestamps();for(d=f,u=0;d<i;d=+t.add(d,a,o),u++)Bo(c,d,g);return d!==i&&\"ticks\"!==s.bounds&&1!==u||Bo(c,d,g),Object.keys(c).sort(zo).map((t=>+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){const i=this.options.time.displayFormats,s=this._unit,n=e||i[s];return this._adapter.format(t,n)}_tickFormatFunction(t,e,i,s){const n=this.options,o=n.ticks.callback;if(o)return d(o,[t,e,i],this);const a=n.time.displayFormats,r=this._unit,l=this._majorUnit,h=r&&a[r],c=l&&a[l],u=i[e],f=l&&c&&u&&u.major;return this._adapter.format(t,s||(f?c:h))}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e<i;++e)s=t[e],s.label=this._tickFormatFunction(s.value,e,t)}getDecimalForValue(t){return null===t?NaN:(t-this.min)/(this.max-this.min)}getPixelForValue(t){const e=this._offsets,i=this.getDecimalForValue(t);return this.getPixelForDecimal((e.start+i)*e.factor)}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return this.min+i*(this.max-this.min)}_getLabelSize(t){const e=this.options.ticks,i=this.ctx.measureText(t).width,s=$(this.isHorizontal()?e.maxRotation:e.minRotation),n=Math.cos(s),o=Math.sin(s),a=this._resolveTickFontOptions(0).size;return{w:i*n+a*o,h:i*o+a*n}}_getLabelCapacity(t){const e=this.options.time,i=e.displayFormats,s=i[e.unit]||i.millisecond,n=this._tickFormatFunction(t,0,Wo(this,[t],this._majorUnit),s),o=this._getLabelSize(n),a=Math.floor(this.isHorizontal()?this.width/o.w:this.height/o.h)-1;return a>0?a:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t<e;++t)i=i.concat(s[t].controller.getAllParsedValues(this));return this._cache.data=this.normalize(i)}getLabelTimestamps(){const t=this._cache.labels||[];let e,i;if(t.length)return t;const s=this.getLabels();for(e=0,i=s.length;e<i;++e)t.push(Fo(this,s[e]));return this._cache.labels=this._normalized?t:this.normalize(t)}normalize(t){return lt(t.sort(zo))}}function Ho(t,e,i){let s,n,o,a,r=0,l=t.length-1;i?(e>=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=it(t,\"pos\",e)),({pos:s,time:o}=t[r]),({pos:n,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=it(t,\"time\",e)),({time:s,pos:o}=t[r]),({time:n,pos:a}=t[l]));const h=n-s;return h?o+(a-o)*(e-s)/h:o}var jo=Object.freeze({__proto__:null,CategoryScale:class extends Js{static id=\"category\";static defaults={ticks:{callback:po}};constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:s}of e)t[i]===s&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(s(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:J(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:go(i,t,l(e,t),this._addedLabels),i.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:s}=this.getMinMax(!0);\"ticks\"===this.options.bounds&&(t||(i=0),e||(s=this.getLabels().length-1)),this.min=i,this.max=s}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,s=[];let n=this.getLabels();n=0===t&&e===n.length-1?n:n.slice(t,e+1),this._valueRange=Math.max(n.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)s.push({value:i});return s}getLabelForValue(t){return po.call(this,t)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(t){return\"number\"!=typeof t&&(t=this.parse(t)),null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}},LinearScale:xo,LogarithmicScale:ko,RadialLinearScale:Eo,TimeScale:No,TimeSeriesScale:class extends No{static id=\"timeseries\";static defaults=No.defaults;constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Ho(e,this.min),this._tableRange=Ho(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let o,a,r,l,h;for(o=0,a=t.length;o<a;++o)l=t[o],l>=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=s.length;o<a;++o)h=s[o+1],r=s[o-1],l=s[o],Math.round((h+r)/2)!==l&&n.push({time:l,pos:o/(a-1)});return n}_generate(){const t=this.min,e=this.max;let i=super.getDataTimestamps();return i.includes(t)&&i.length||i.splice(0,0,t),i.includes(e)&&1!==i.length||i.push(e),i.sort(((t,e)=>t-e))}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),i=this.getLabelTimestamps();return t=e.length&&i.length?this.normalize(e.concat(i)):e.length?e:i,t=this._cache.all=t,t}getDecimalForValue(t){return(Ho(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,i=this.getDecimalForPixel(t)/e.factor-e.end;return Ho(this._table,i*this._tableRange+this._minPos,!0)}}});const $o=[\"rgb(54, 162, 235)\",\"rgb(255, 99, 132)\",\"rgb(255, 159, 64)\",\"rgb(255, 205, 86)\",\"rgb(75, 192, 192)\",\"rgb(153, 102, 255)\",\"rgb(201, 203, 207)\"],Yo=$o.map((t=>t.replace(\"rgb(\",\"rgba(\").replace(\")\",\", 0.5)\")));function Uo(t){return $o[t%$o.length]}function Xo(t){return Yo[t%Yo.length]}function qo(t){let e=0;return(i,s)=>{const n=t.getDatasetMeta(s).controller;n instanceof jn?e=function(t,e){return t.backgroundColor=t.data.map((()=>Uo(e++))),e}(i,e):n instanceof $n?e=function(t,e){return t.backgroundColor=t.data.map((()=>Xo(e++))),e}(i,e):n&&(e=function(t,e){return t.borderColor=Uo(e),t.backgroundColor=Xo(e),++e}(i,e))}}function Ko(t){let e;for(e in t)if(t[e].borderColor||t[e].backgroundColor)return!0;return!1}var Go={id:\"colors\",defaults:{enabled:!0,forceOverride:!1},beforeLayout(t,e,i){if(!i.enabled)return;const{data:{datasets:s},options:n}=t.config,{elements:o}=n;if(!i.forceOverride&&(Ko(s)||(a=n)&&(a.borderColor||a.backgroundColor)||o&&Ko(o)))return;var a;const r=qo(t);s.forEach(r)}};function Zo(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,\"data\",{configurable:!0,enumerable:!0,writable:!0,value:e})}}function Jo(t){t.data.datasets.forEach((t=>{Zo(t)}))}var Qo={id:\"decimation\",defaults:{algorithm:\"min-max\",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void Jo(t);const n=t.width;t.data.datasets.forEach(((e,o)=>{const{_data:a,indexAxis:r}=e,l=t.getDatasetMeta(o),h=a||e.data;if(\"y\"===Pi([r,t.options.indexAxis]))return;if(!l.controller.supportsDecimation)return;const c=t.scales[l.xAxisID];if(\"linear\"!==c.type&&\"time\"!==c.type)return;if(t.options.parsing)return;let{start:d,count:u}=function(t,e){const i=e.length;let s,n=0;const{iScale:o}=t,{min:a,max:r,minDefined:l,maxDefined:h}=o.getUserBounds();return l&&(n=J(it(e,o.axis,a).lo,0,i-1)),s=h?J(it(e,o.axis,r).hi+1,n,i)-n:i-n,{start:n,count:s}}(l,h);if(u<=(i.threshold||4*n))return void Zo(e);let f;switch(s(a)&&(e._data=h,delete e.data,Object.defineProperty(e,\"data\",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case\"lttb\":f=function(t,e,i,s,n){const o=n.samples||s;if(o>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(o-2);let l=0;const h=e+i-1;let c,d,u,f,g,p=e;for(a[l++]=t[p],c=0;c<o-2;c++){let s,n=0,o=0;const h=Math.floor((c+1)*r)+1+e,m=Math.min(Math.floor((c+2)*r)+1,i)+e,b=m-h;for(s=h;s<m;s++)n+=t[s].x,o+=t[s].y;n/=b,o/=b;const x=Math.floor(c*r)+1+e,_=Math.min(Math.floor((c+1)*r)+1,i)+e,{x:y,y:v}=t[p];for(u=f=-1,s=x;s<_;s++)f=.5*Math.abs((y-n)*(t[s].y-v)-(y-t[s].x)*(o-v)),f>u&&(u=f,d=t[s],g=s);a[l++]=d,p=g}return a[l++]=t[h],a}(h,d,u,n,i);break;case\"min-max\":f=function(t,e,i,n){let o,a,r,l,h,c,d,u,f,g,p=0,m=0;const b=[],x=e+i-1,_=t[e].x,y=t[x].x-_;for(o=e;o<e+i;++o){a=t[o],r=(a.x-_)/y*n,l=a.y;const e=0|r;if(e===h)l<f?(f=l,c=o):l>g&&(g=l,d=o),p=(m*p+a.x)/++m;else{const i=o-1;if(!s(c)&&!s(d)){const e=Math.min(c,d),s=Math.max(c,d);e!==u&&e!==i&&b.push({...t[e],x:p}),s!==u&&s!==i&&b.push({...t[s],x:p})}o>0&&i!==u&&b.push(t[i]),b.push(a),h=e,m=0,f=g=l,c=d=u=o}}return b}(h,d,u,n);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=f}))},destroy(t){Jo(t)}};function ta(t,e,i,s){if(s)return;let n=e[t],o=i[t];return\"angle\"===t&&(n=G(n),o=G(o)),{property:t,start:n,end:o}}function ea(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function ia(t,e,i,s){return t&&e?s(t[i],e[i]):t?t[i]:e?e[i]:0}function sa(t,e){let i=[],s=!1;return n(t)?(s=!0,i=t):i=function(t,e){const{x:i=null,y:s=null}=t||{},n=e.points,o=[];return e.segments.forEach((({start:t,end:e})=>{e=ea(t,e,n);const a=n[t],r=n[e];null!==s?(o.push({x:a.x,y:s}),o.push({x:r.x,y:s})):null!==i&&(o.push({x:i,y:a.y}),o.push({x:i,y:r.y}))})),o}(t,e),i.length?new no({points:i,options:{tension:0},_loop:s,_fullLoop:s}):null}function na(t){return t&&!1!==t.fill}function oa(t,e,i){let s=t[e].fill;const n=[e];let o;if(!i)return s;for(;!1!==s&&-1===n.indexOf(s);){if(!a(s))return s;if(o=t[s],!o)return!1;if(o.visible)return s;n.push(s),s=o.fill}return!1}function aa(t,e,i){const s=function(t){const e=t.options,i=e.fill;let s=l(i&&i.target,i);void 0===s&&(s=!!e.backgroundColor);if(!1===s||null===s)return!1;if(!0===s)return\"origin\";return s}(t);if(o(s))return!isNaN(s.value)&&s;let n=parseFloat(s);return a(n)&&Math.floor(n)===n?function(t,e,i,s){\"-\"!==t&&\"+\"!==t||(i=e+i);if(i===e||i<0||i>=s)return!1;return i}(s[0],e,n,i):[\"origin\",\"start\",\"end\",\"stack\",\"shape\"].indexOf(s)>=0&&s}function ra(t,e,i){const s=[];for(let n=0;n<i.length;n++){const o=i[n],{first:a,last:r,point:l}=la(o,e,\"x\");if(!(!l||a&&r))if(a)s.unshift(l);else if(t.push(l),!r)break}t.push(...s)}function la(t,e,i){const s=t.interpolate(e,i);if(!s)return{};const n=s[i],o=t.segments,a=t.points;let r=!1,l=!1;for(let t=0;t<o.length;t++){const e=o[t],s=a[e.start][i],h=a[e.end][i];if(tt(n,s,h)){r=n===s,l=n===h;break}}return{first:r,last:l,point:s}}class ha{constructor(t){this.x=t.x,this.y=t.y,this.radius=t.radius}pathSegment(t,e,i){const{x:s,y:n,radius:o}=this;return e=e||{start:0,end:O},t.arc(s,n,o,e.end,e.start,!0),!i.bounds}interpolate(t){const{x:e,y:i,radius:s}=this,n=t.angle;return{x:e+Math.cos(n)*s,y:i+Math.sin(n)*s,angle:n}}}function ca(t){const{chart:e,fill:i,line:s}=t;if(a(i))return function(t,e){const i=t.getDatasetMeta(e),s=i&&t.isDatasetVisible(e);return s?i.dataset:null}(e,i);if(\"stack\"===i)return function(t){const{scale:e,index:i,line:s}=t,n=[],o=s.segments,a=s.points,r=function(t,e){const i=[],s=t.getMatchingVisibleMetas(\"line\");for(let t=0;t<s.length;t++){const n=s[t];if(n.index===e)break;n.hidden||i.unshift(n.dataset)}return i}(e,i);r.push(sa({x:null,y:e.bottom},s));for(let t=0;t<o.length;t++){const e=o[t];for(let t=e.start;t<=e.end;t++)ra(n,a[t],r)}return new no({points:n,options:{}})}(t);if(\"shape\"===i)return!0;const n=function(t){const e=t.scale||{};if(e.getPointPositionForValue)return function(t){const{scale:e,fill:i}=t,s=e.options,n=e.getLabels().length,a=s.reverse?e.max:e.min,r=function(t,e,i){let s;return s=\"start\"===t?i:\"end\"===t?e.options.reverse?e.min:e.max:o(t)?t.value:e.getBaseValue(),s}(i,e,a),l=[];if(s.grid.circular){const t=e.getPointPositionForValue(0,a);return new ha({x:t.x,y:t.y,radius:e.getDistanceFromCenterForValue(r)})}for(let t=0;t<n;++t)l.push(e.getPointPositionForValue(t,r));return l}(t);return function(t){const{scale:e={},fill:i}=t,s=function(t,e){let i=null;return\"start\"===t?i=e.bottom:\"end\"===t?i=e.top:o(t)?i=e.getPixelForValue(t.value):e.getBasePixel&&(i=e.getBasePixel()),i}(i,e);if(a(s)){const t=e.isHorizontal();return{x:t?s:null,y:t?null:s}}return null}(t)}(t);return n instanceof ha?n:sa(n,s)}function da(t,e,i){const s=ca(e),{line:n,scale:o,axis:a}=e,r=n.options,l=r.fill,h=r.backgroundColor,{above:c=h,below:d=h}=l||{};s&&n.points.length&&(Ie(t,i),function(t,e){const{line:i,target:s,above:n,below:o,area:a,scale:r}=e,l=i._loop?\"angle\":e.axis;t.save(),\"x\"===l&&o!==n&&(ua(t,s,a.top),fa(t,{line:i,target:s,color:n,scale:r,property:l}),t.restore(),t.save(),ua(t,s,a.bottom));fa(t,{line:i,target:s,color:o,scale:r,property:l}),t.restore()}(t,{line:n,target:s,above:c,below:d,area:i,scale:o,axis:a}),ze(t))}function ua(t,e,i){const{segments:s,points:n}=e;let o=!0,a=!1;t.beginPath();for(const r of s){const{start:s,end:l}=r,h=n[s],c=n[ea(s,l,n)];o?(t.moveTo(h.x,h.y),o=!1):(t.lineTo(h.x,i),t.lineTo(h.x,h.y)),a=!!e.pathSegment(t,r,{move:a}),a?t.closePath():t.lineTo(c.x,i)}t.lineTo(e.first().x,i),t.closePath(),t.clip()}function fa(t,e){const{line:i,target:s,property:n,color:o,scale:a}=e,r=function(t,e,i){const s=t.segments,n=t.points,o=e.points,a=[];for(const t of s){let{start:s,end:r}=t;r=ea(s,r,n);const l=ta(i,n[s],n[r],t.loop);if(!e.segments){a.push({source:t,target:l,start:n[s],end:n[r]});continue}const h=Ii(e,l);for(const e of h){const s=ta(i,o[e.start],o[e.end],e.loop),r=Ri(t,n,s);for(const t of r)a.push({source:t,target:e,start:{[i]:ia(l,s,\"start\",Math.max)},end:{[i]:ia(l,s,\"end\",Math.min)}})}}return a}(i,s,n);for(const{source:e,target:l,start:h,end:c}of r){const{style:{backgroundColor:r=o}={}}=e,d=!0!==s;t.save(),t.fillStyle=r,ga(t,a,d&&ta(n,h,c)),t.beginPath();const u=!!i.pathSegment(t,e);let f;if(d){u?t.closePath():pa(t,s,c,n);const e=!!s.pathSegment(t,l,{move:u,reverse:!0});f=u&&e,f||pa(t,s,h,n)}t.closePath(),t.fill(f?\"evenodd\":\"nonzero\"),t.restore()}}function ga(t,e,i){const{top:s,bottom:n}=e.chart.chartArea,{property:o,start:a,end:r}=i||{};\"x\"===o&&(t.beginPath(),t.rect(a,s,r-a,n-s),t.clip())}function pa(t,e,i,s){const n=e.interpolate(i,s);n&&t.lineTo(n.x,n.y)}var ma={id:\"filler\",afterDatasetsUpdate(t,e,i){const s=(t.data.datasets||[]).length,n=[];let o,a,r,l;for(a=0;a<s;++a)o=t.getDatasetMeta(a),r=o.dataset,l=null,r&&r.options&&r instanceof no&&(l={visible:t.isDatasetVisible(a),index:a,fill:aa(r,a,s),chart:t,axis:o.controller.options.indexAxis,scale:o.vScale,line:r}),o.$filler=l,n.push(l);for(a=0;a<s;++a)l=n[a],l&&!1!==l.fill&&(l.fill=oa(n,a,i.propagate))},beforeDraw(t,e,i){const s=\"beforeDraw\"===i.drawTime,n=t.getSortedVisibleDatasetMetas(),o=t.chartArea;for(let e=n.length-1;e>=0;--e){const i=n[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),s&&i.fill&&da(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if(\"beforeDatasetsDraw\"!==i.drawTime)return;const s=t.getSortedVisibleDatasetMetas();for(let e=s.length-1;e>=0;--e){const i=s[e].$filler;na(i)&&da(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const s=e.meta.$filler;na(s)&&\"beforeDatasetDraw\"===i.drawTime&&da(t.ctx,s,t.chartArea)},defaults:{propagate:!0,drawTime:\"beforeDatasetDraw\"}};const ba=(t,e)=>{let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=t.pointStyleWidth||Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}};class xa extends Hs{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=d(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=Si(i.font),n=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:r}=ba(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(o,n,a,r)+10):(h=this.maxHeight,l=this._fitCols(o,s,a,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+a;let c=t;n.textAlign=\"left\",n.textBaseline=\"middle\";let d=-1,u=-h;return this.legendItems.forEach(((t,f)=>{const g=i+e/2+n.measureText(t.text).width;(0===f||l[l.length-1]+g+2*a>o)&&(c+=h,l[l.length-(f>0?0:1)]=0,u+=h,d++),r[f]={left:0,top:u,row:d,width:g,height:s},l[l.length-1]+=g+a})),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=o-t;let c=a,d=0,u=0,f=0,g=0;return this.legendItems.forEach(((t,o)=>{const{itemWidth:p,itemHeight:m}=function(t,e,i,s,n){const o=function(t,e,i,s){let n=t.text;n&&\"string\"!=typeof n&&(n=n.reduce(((t,e)=>t.length>e.length?t:e)));return e+i.size/2+s.measureText(n).width}(s,t,e,i),a=function(t,e,i){let s=t;\"string\"!=typeof e.text&&(s=_a(e,i));return s}(n,s,e.lineHeight);return{itemWidth:o,itemHeight:a}}(i,e,n,t,s);o>0&&u+m+2*a>h&&(c+=d+a,l.push({width:d,height:u}),f+=d+a,g++,d=u=0),r[o]={left:f,top:u,col:g,width:p,height:m},d=Math.max(d,p),u+=m+a})),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:n}}=this,o=Oi(n,this.left,this.width);if(this.isHorizontal()){let n=0,a=ft(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,a=ft(i,this.left+s,this.right-this.lineWidths[n])),r.top+=this.top+t+s,r.left=o.leftForLtr(o.x(a),r.width),a+=r.width+s}else{let n=0,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height)),r.top=a,r.left+=this.left+s,r.left=o.leftForLtr(o.x(r.left),r.width),a+=r.height+s}}isHorizontal(){return\"top\"===this.options.position||\"bottom\"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Ie(t,this),this._draw(),ze(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:o}=t,a=ue.color,r=Oi(t.rtl,this.left,this.width),h=Si(o.font),{padding:c}=o,d=h.size,u=d/2;let f;this.drawTitle(),s.textAlign=r.textAlign(\"left\"),s.textBaseline=\"middle\",s.lineWidth=.5,s.font=h.string;const{boxWidth:g,boxHeight:p,itemHeight:m}=ba(o,d),b=this.isHorizontal(),x=this._computeTitleHeight();f=b?{x:ft(n,this.left+c,this.right-i[0]),y:this.top+c+x,line:0}:{x:this.left+c,y:ft(n,this.top+x+c,this.bottom-e[0].height),line:0},Ai(this.ctx,t.textDirection);const _=m+c;this.legendItems.forEach(((y,v)=>{s.strokeStyle=y.fontColor,s.fillStyle=y.fontColor;const M=s.measureText(y.text).width,w=r.textAlign(y.textAlign||(y.textAlign=o.textAlign)),k=g+u+M;let S=f.x,P=f.y;r.setWidth(this.width),b?v>0&&S+k+c>this.right&&(P=f.y+=_,f.line++,S=f.x=ft(n,this.left+c,this.right-i[f.line])):v>0&&P+_>this.bottom&&(S=f.x=S+e[f.line].width+c,f.line++,P=f.y=ft(n,this.top+x+c,this.bottom-e[f.line].height));if(function(t,e,i){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;s.save();const n=l(i.lineWidth,1);if(s.fillStyle=l(i.fillStyle,a),s.lineCap=l(i.lineCap,\"butt\"),s.lineDashOffset=l(i.lineDashOffset,0),s.lineJoin=l(i.lineJoin,\"miter\"),s.lineWidth=n,s.strokeStyle=l(i.strokeStyle,a),s.setLineDash(l(i.lineDash,[])),o.usePointStyle){const a={radius:p*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,g/2);Ee(s,a,l,e+u,o.pointStyleWidth&&g)}else{const o=e+Math.max((d-p)/2,0),a=r.leftForLtr(t,g),l=wi(i.borderRadius);s.beginPath(),Object.values(l).some((t=>0!==t))?He(s,{x:a,y:o,w:g,h:p,radius:l}):s.rect(a,o,g,p),s.fill(),0!==n&&s.stroke()}s.restore()}(r.x(S),P,y),S=gt(w,S+g+u,b?S+k:this.right,t.rtl),function(t,e,i){Ne(s,i.text,t,e+m/2,h,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})}(r.x(S),P,y),b)f.x+=k+c;else if(\"string\"!=typeof y.text){const t=h.lineHeight;f.y+=_a(y,t)+c}else f.y+=_})),Ti(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=Si(e.font),s=ki(e.padding);if(!e.display)return;const n=Oi(t.rtl,this.left,this.width),o=this.ctx,a=e.position,r=i.size/2,l=s.top+r;let h,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+l,c=ft(t.align,c,this.right-d);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);h=l+ft(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=ft(a,c,c+d);o.textAlign=n.textAlign(ut(a)),o.textBaseline=\"middle\",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,Ne(o,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=Si(t.font),i=ki(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(tt(t,this.left,this.right)&&tt(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;i<n.length;++i)if(s=n[i],tt(t,s.left,s.left+s.width)&&tt(e,s.top,s.top+s.height))return this.legendItems[i];return null}handleEvent(t){const e=this.options;if(!function(t,e){if((\"mousemove\"===t||\"mouseout\"===t)&&(e.onHover||e.onLeave))return!0;if(e.onClick&&(\"click\"===t||\"mouseup\"===t))return!0;return!1}(t.type,e))return;const i=this._getLegendItemAt(t.x,t.y);if(\"mousemove\"===t.type||\"mouseout\"===t.type){const o=this._hoveredItem,a=(n=i,null!==(s=o)&&null!==n&&s.datasetIndex===n.datasetIndex&&s.index===n.index);o&&!a&&d(e.onLeave,[t,o,this],this),this._hoveredItem=i,i&&!a&&d(e.onHover,[t,i,this],this)}else i&&d(e.onClick,[t,i,this],this);var s,n}}function _a(t,e){return e*(t.text?t.text.length:0)}var ya={id:\"legend\",_element:xa,start(t,e,i){const s=t.legend=new xa({ctx:t.ctx,options:i,chart:t});as.configure(t,s,i),as.addBox(t,s)},stop(t){as.removeBox(t,t.legend),delete t.legend},beforeUpdate(t,e,i){const s=t.legend;as.configure(t,s,i),s.options=i},afterUpdate(t){const e=t.legend;e.buildLabels(),e.adjustHitBoxes()},afterEvent(t,e){e.replay||t.legend.handleEvent(e.event)},defaults:{display:!0,position:\"top\",align:\"center\",fullSize:!0,reverse:!1,weight:1e3,onClick(t,e,i){const s=e.datasetIndex,n=i.chart;n.isDatasetVisible(s)?(n.hide(s),e.hidden=!0):(n.show(s),e.hidden=!1)},onHover:null,onLeave:null,labels:{color:t=>t.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const l=t.controller.getStyle(i?0:void 0),h=ki(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:l.borderColor,pointStyle:s||l.pointStyle,rotation:l.rotation,textAlign:n||l.textAlign,borderRadius:a&&(r||l.borderRadius),datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:\"center\",text:\"\"}},descriptors:{_scriptable:t=>!t.startsWith(\"on\"),labels:{_scriptable:t=>![\"generateLabels\",\"filter\",\"sort\"].includes(t)}}};class va extends Hs{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const s=n(i.text)?i.text.length:1;this._padding=ki(i.padding);const o=s*Si(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){const t=this.options.position;return\"top\"===t||\"bottom\"===t}_drawArgs(t){const{top:e,left:i,bottom:s,right:n,options:o}=this,a=o.align;let r,l,h,c=0;return this.isHorizontal()?(l=ft(a,i,n),h=e+t,r=n-i):(\"left\"===o.position?(l=i+t,h=ft(a,s,e),c=-.5*C):(l=n-t,h=ft(a,e,s),c=.5*C),r=s-e),{titleX:l,titleY:h,maxWidth:r,rotation:c}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=Si(e.font),s=i.lineHeight/2+this._padding.top,{titleX:n,titleY:o,maxWidth:a,rotation:r}=this._drawArgs(s);Ne(t,e.text,0,0,i,{color:e.color,maxWidth:a,rotation:r,textAlign:ut(e.align),textBaseline:\"middle\",translation:[n,o]})}}var Ma={id:\"title\",_element:va,start(t,e,i){!function(t,e){const i=new va({ctx:t.ctx,options:e,chart:t});as.configure(t,i,e),as.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;as.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const s=t.titleBlock;as.configure(t,s,i),s.options=i},defaults:{align:\"center\",display:!1,font:{weight:\"bold\"},fullSize:!0,padding:10,position:\"top\",text:\"\",weight:2e3},defaultRoutes:{color:\"color\"},descriptors:{_scriptable:!0,_indexable:!1}};const wa=new WeakMap;var ka={id:\"subtitle\",start(t,e,i){const s=new va({ctx:t.ctx,options:i,chart:t});as.configure(t,s,i),as.addBox(t,s),wa.set(t,s)},stop(t){as.removeBox(t,wa.get(t)),wa.delete(t)},beforeUpdate(t,e,i){const s=wa.get(t);as.configure(t,s,i),s.options=i},defaults:{align:\"center\",display:!1,font:{weight:\"normal\"},fullSize:!0,padding:0,position:\"top\",text:\"\",weight:1500},defaultRoutes:{color:\"color\"},descriptors:{_scriptable:!0,_indexable:!1}};const Sa={average(t){if(!t.length)return!1;let e,i,s=0,n=0,o=0;for(e=0,i=t.length;e<i;++e){const i=t[e].element;if(i&&i.hasValue()){const t=i.tooltipPosition();s+=t.x,n+=t.y,++o}}return{x:s/o,y:n/o}},nearest(t,e){if(!t.length)return!1;let i,s,n,o=e.x,a=e.y,r=Number.POSITIVE_INFINITY;for(i=0,s=t.length;i<s;++i){const s=t[i].element;if(s&&s.hasValue()){const t=q(e,s.getCenterPoint());t<r&&(r=t,n=s)}}if(n){const t=n.tooltipPosition();o=t.x,a=t.y}return{x:o,y:a}}};function Pa(t,e){return e&&(n(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function Da(t){return(\"string\"==typeof t||t instanceof String)&&t.indexOf(\"\\n\")>-1?t.split(\"\\n\"):t}function Ca(t,e){const{element:i,datasetIndex:s,index:n}=e,o=t.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:t,label:a,parsed:o.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function Oa(t,e){const i=t.chart.ctx,{body:s,footer:n,title:o}=t,{boxWidth:a,boxHeight:r}=e,l=Si(e.bodyFont),h=Si(e.titleFont),c=Si(e.footerFont),d=o.length,f=n.length,g=s.length,p=ki(e.padding);let m=p.height,b=0,x=s.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(x+=t.beforeBody.length+t.afterBody.length,d&&(m+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),x){m+=g*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(x-g)*l.lineHeight+(x-1)*e.bodySpacing}f&&(m+=e.footerMarginTop+f*c.lineHeight+(f-1)*e.footerSpacing);let _=0;const y=function(t){b=Math.max(b,i.measureText(t).width+_)};return i.save(),i.font=h.string,u(t.title,y),i.font=l.string,u(t.beforeBody.concat(t.afterBody),y),_=e.displayColors?a+2+e.boxPadding:0,u(s,(t=>{u(t.before,y),u(t.lines,y),u(t.after,y)})),_=0,i.font=c.string,u(t.footer,y),i.restore(),b+=p.width,{width:b,height:m}}function Aa(t,e,i,s){const{x:n,width:o}=i,{width:a,chartArea:{left:r,right:l}}=t;let h=\"center\";return\"center\"===s?h=n<=(r+l)/2?\"left\":\"right\":n<=o/2?h=\"left\":n>=a-o/2&&(h=\"right\"),function(t,e,i,s){const{x:n,width:o}=s,a=i.caretSize+i.caretPadding;return\"left\"===t&&n+o+a>e.width||\"right\"===t&&n-o-a<0||void 0}(h,t,e,i)&&(h=\"center\"),h}function Ta(t,e,i){const s=i.yAlign||e.yAlign||function(t,e){const{y:i,height:s}=e;return i<s/2?\"top\":i>t.height-s/2?\"bottom\":\"center\"}(t,i);return{xAlign:i.xAlign||e.xAlign||Aa(t,e,i,s),yAlign:s}}function La(t,e,i,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,h=n+o,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=wi(a);let g=function(t,e){let{x:i,width:s}=t;return\"right\"===e?i-=s:\"center\"===e&&(i-=s/2),i}(e,r);const p=function(t,e,i){let{y:s,height:n}=t;return\"top\"===e?s+=i:s-=\"bottom\"===e?n+i:n/2,s}(e,l,h);return\"center\"===l?\"left\"===r?g+=h:\"right\"===r&&(g-=h):\"left\"===r?g-=Math.max(c,u)+n:\"right\"===r&&(g+=Math.max(d,f)+n),{x:J(g,0,s.width-e.width),y:J(p,0,s.height-e.height)}}function Ea(t,e,i){const s=ki(i.padding);return\"center\"===e?t.x+t.width/2:\"right\"===e?t.x+t.width-s.right:t.x+s.left}function Ra(t){return Pa([],Da(t))}function Ia(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const za={beforeTitle:e,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&\"dataset\"===this.options.mode)return e.dataset.label||\"\";if(e.label)return e.label;if(s>0&&e.dataIndex<s)return i[e.dataIndex]}return\"\"},afterTitle:e,beforeBody:e,beforeLabel:e,label(t){if(this&&this.options&&\"dataset\"===this.options.mode)return t.label+\": \"+t.formattedValue||t.formattedValue;let e=t.dataset.label||\"\";e&&(e+=\": \");const i=t.formattedValue;return s(i)||(e+=i),e},labelColor(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{borderColor:e.borderColor,backgroundColor:e.backgroundColor,borderWidth:e.borderWidth,borderDash:e.borderDash,borderDashOffset:e.borderDashOffset,borderRadius:0}},labelTextColor(){return this.options.bodyColor},labelPointStyle(t){const e=t.chart.getDatasetMeta(t.datasetIndex).controller.getStyle(t.dataIndex);return{pointStyle:e.pointStyle,rotation:e.rotation}},afterLabel:e,afterBody:e,beforeFooter:e,footer:e,afterFooter:e};function Fa(t,e,i,s){const n=t[e].call(i,s);return void 0===n?za[e].call(i,s):n}class Va extends Hs{static positioners=Sa;constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this._cachedAnimations;if(t)return t;const e=this.chart,i=this.options.setContext(this.getContext()),s=i.enabled&&e.options.animation&&i.animations,n=new Os(this.chart,s);return s._cacheable&&(this._cachedAnimations=Object.freeze(n)),n}getContext(){return this.$context||(this.$context=(t=this.chart.getContext(),e=this,i=this._tooltipItems,Ci(t,{tooltip:e,tooltipItems:i,type:\"tooltip\"})));var t,e,i}getTitle(t,e){const{callbacks:i}=e,s=Fa(i,\"beforeTitle\",this,t),n=Fa(i,\"title\",this,t),o=Fa(i,\"afterTitle\",this,t);let a=[];return a=Pa(a,Da(s)),a=Pa(a,Da(n)),a=Pa(a,Da(o)),a}getBeforeBody(t,e){return Ra(Fa(e.callbacks,\"beforeBody\",this,t))}getBody(t,e){const{callbacks:i}=e,s=[];return u(t,(t=>{const e={before:[],lines:[],after:[]},n=Ia(i,t);Pa(e.before,Da(Fa(n,\"beforeLabel\",this,t))),Pa(e.lines,Fa(n,\"label\",this,t)),Pa(e.after,Da(Fa(n,\"afterLabel\",this,t))),s.push(e)})),s}getAfterBody(t,e){return Ra(Fa(e.callbacks,\"afterBody\",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Fa(i,\"beforeFooter\",this,t),n=Fa(i,\"footer\",this,t),o=Fa(i,\"afterFooter\",this,t);let a=[];return a=Pa(a,Da(s)),a=Pa(a,Da(n)),a=Pa(a,Da(o)),a}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],o=[];let a,r,l=[];for(a=0,r=e.length;a<r;++a)l.push(Ca(this.chart,e[a]));return t.filter&&(l=l.filter(((e,s,n)=>t.filter(e,s,n,i)))),t.itemSort&&(l=l.sort(((e,s)=>t.itemSort(e,s,i)))),u(l,(e=>{const i=Ia(t.callbacks,e);s.push(Fa(i,\"labelColor\",this,e)),n.push(Fa(i,\"labelPointStyle\",this,e)),o.push(Fa(i,\"labelTextColor\",this,e))})),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,o=[];if(s.length){const t=Sa[i.position].call(this,s,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=Oa(this,i),a=Object.assign({},t,e),r=Ta(this.chart,i,a),l=La(i,a,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=o,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=wi(a),{x:d,y:u}=t,{width:f,height:g}=e;let p,m,b,x,_,y;return\"center\"===n?(_=u+g/2,\"left\"===s?(p=d,m=p-o,x=_+o,y=_-o):(p=d+f,m=p+o,x=_-o,y=_+o),b=p):(m=\"left\"===s?d+Math.max(r,h)+o:\"right\"===s?d+f-Math.max(l,c)-o:this.caretX,\"top\"===n?(x=u,_=x-o,p=m-o,b=m+o):(x=u+g,_=x+o,p=m+o,b=m-o),y=x),{x1:p,x2:m,x3:b,y1:x,y2:_,y3:y}}drawTitle(t,e,i){const s=this.title,n=s.length;let o,a,r;if(n){const l=Oi(i.rtl,this.x,this.width);for(t.x=Ea(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline=\"middle\",o=Si(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,r=0;r<n;++r)e.fillText(s[r],l.x(t.x),t.y+o.lineHeight/2),t.y+=o.lineHeight+a,r+1===n&&(t.y+=i.titleMarginBottom-a)}}_drawColorBox(t,e,i,s,n){const a=this.labelColors[i],r=this.labelPointStyles[i],{boxHeight:l,boxWidth:h}=n,c=Si(n.bodyFont),d=Ea(this,\"left\",n),u=s.x(d),f=l<c.lineHeight?(c.lineHeight-l)/2:0,g=e.y+f;if(n.usePointStyle){const e={radius:Math.min(h,l)/2,pointStyle:r.pointStyle,rotation:r.rotation,borderWidth:1},i=s.leftForLtr(u,h)+h/2,o=g+l/2;t.strokeStyle=n.multiKeyBackground,t.fillStyle=n.multiKeyBackground,Le(t,e,i,o),t.strokeStyle=a.borderColor,t.fillStyle=a.backgroundColor,Le(t,e,i,o)}else{t.lineWidth=o(a.borderWidth)?Math.max(...Object.values(a.borderWidth)):a.borderWidth||1,t.strokeStyle=a.borderColor,t.setLineDash(a.borderDash||[]),t.lineDashOffset=a.borderDashOffset||0;const e=s.leftForLtr(u,h),i=s.leftForLtr(s.xPlus(u,1),h-2),r=wi(a.borderRadius);Object.values(r).some((t=>0!==t))?(t.beginPath(),t.fillStyle=n.multiKeyBackground,He(t,{x:e,y:g,w:h,h:l,radius:r}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),He(t,{x:i,y:g+1,w:h-2,h:l-2,radius:r}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,g,h,l),t.strokeRect(e,g,h,l),t.fillStyle=a.backgroundColor,t.fillRect(i,g+1,h-2,l-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:o,displayColors:a,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=Si(i.bodyFont);let d=c.lineHeight,f=0;const g=Oi(i.rtl,this.x,this.width),p=function(i){e.fillText(i,g.x(t.x+f),t.y+d/2),t.y+=d+n},m=g.textAlign(o);let b,x,_,y,v,M,w;for(e.textAlign=o,e.textBaseline=\"middle\",e.font=c.string,t.x=Ea(this,m,i),e.fillStyle=i.bodyColor,u(this.beforeBody,p),f=a&&\"right\"!==m?\"center\"===o?l/2+h:l+2+h:0,y=0,M=s.length;y<M;++y){for(b=s[y],x=this.labelTextColors[y],e.fillStyle=x,u(b.before,p),_=b.lines,a&&_.length&&(this._drawColorBox(e,t,y,g,i),d=Math.max(c.lineHeight,r)),v=0,w=_.length;v<w;++v)p(_[v]),d=c.lineHeight;u(b.after,p)}f=0,d=c.lineHeight,u(this.afterBody,p),t.y-=n}drawFooter(t,e,i){const s=this.footer,n=s.length;let o,a;if(n){const r=Oi(i.rtl,this.x,this.width);for(t.x=Ea(this,i.footerAlign,i),t.y+=i.footerMarginTop,e.textAlign=r.textAlign(i.footerAlign),e.textBaseline=\"middle\",o=Si(i.footerFont),e.fillStyle=i.footerColor,e.font=o.string,a=0;a<n;++a)e.fillText(s[a],r.x(t.x),t.y+o.lineHeight/2),t.y+=o.lineHeight+i.footerSpacing}}drawBackground(t,e,i,s){const{xAlign:n,yAlign:o}=this,{x:a,y:r}=t,{width:l,height:h}=i,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=wi(s.cornerRadius);e.fillStyle=s.backgroundColor,e.strokeStyle=s.borderColor,e.lineWidth=s.borderWidth,e.beginPath(),e.moveTo(a+c,r),\"top\"===o&&this.drawCaret(t,e,i,s),e.lineTo(a+l-d,r),e.quadraticCurveTo(a+l,r,a+l,r+d),\"center\"===o&&\"right\"===n&&this.drawCaret(t,e,i,s),e.lineTo(a+l,r+h-f),e.quadraticCurveTo(a+l,r+h,a+l-f,r+h),\"bottom\"===o&&this.drawCaret(t,e,i,s),e.lineTo(a+u,r+h),e.quadraticCurveTo(a,r+h,a,r+h-u),\"center\"===o&&\"left\"===n&&this.drawCaret(t,e,i,s),e.lineTo(a,r+c),e.quadraticCurveTo(a,r,a+c,r),e.closePath(),e.fill(),s.borderWidth>0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=Sa[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=Oa(this,t),a=Object.assign({},i,this._size),r=Ta(e,t,a),l=La(t,a,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=ki(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),Ai(t,e.textDirection),n.y+=o.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Ti(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error(\"Cannot find a dataset at index \"+t);return{datasetIndex:t,element:i.data[e],index:e}})),n=!f(i,s),o=this._positionChanged(s,e);(n||o)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],o=this._getActiveElements(t,n,e,i),a=this._positionChanged(o,t),r=e||!f(o,n)||a;return r&&(this._active=o,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if(\"mouseout\"===t.type)return[];if(!s)return e;const o=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,o=Sa[n.position].call(this,t,e);return!1!==o&&(i!==o.x||s!==o.y)}}var Ba={id:\"tooltip\",_element:Va,positioners:Sa,afterInit(t,e,i){i&&(t.tooltip=new Va({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins(\"beforeTooltipDraw\",{...i,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins(\"afterTooltipDraw\",i)}},afterEvent(t,e){if(t.tooltip){const i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:\"average\",backgroundColor:\"rgba(0,0,0,0.8)\",titleColor:\"#fff\",titleFont:{weight:\"bold\"},titleSpacing:2,titleMarginBottom:6,titleAlign:\"left\",bodyColor:\"#fff\",bodySpacing:2,bodyFont:{},bodyAlign:\"left\",footerColor:\"#fff\",footerSpacing:2,footerMarginTop:6,footerFont:{weight:\"bold\"},footerAlign:\"left\",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>e.bodyFont.size,multiKeyBackground:\"#fff\",displayColors:!0,boxPadding:0,borderColor:\"rgba(0,0,0,0)\",borderWidth:0,animation:{duration:400,easing:\"easeOutQuart\"},animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"width\",\"height\",\"caretX\",\"caretY\"]},opacity:{easing:\"linear\",duration:200}},callbacks:za},defaultRoutes:{bodyFont:\"font\",footerFont:\"font\",titleFont:\"font\"},descriptors:{_scriptable:t=>\"filter\"!==t&&\"itemSort\"!==t&&\"external\"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:\"animation\"}},additionalOptionScopes:[\"interaction\"]};return An.register(Yn,jo,fo,t),An.helpers={...Wi},An._adapters=Rn,An.Animation=Cs,An.Animations=Os,An.animator=xt,An.controllers=en.controllers.items,An.DatasetController=Ns,An.Element=Hs,An.elements=fo,An.Interaction=Xi,An.layouts=as,An.platforms=Ss,An.Scale=Js,An.Ticks=ae,Object.assign(An,Yn,jo,fo,t,Ss),An.Chart=An,\"undefined\"!=typeof window&&(window.Chart=An),An}));\n//# sourceMappingURL=chart.umd.js.map"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/js/directives/debounce.js",
    "content": "var timeoutID = null;\n\nexport default {\n    mounted(el, binding) {\n        let handler = function (e) {\n            if (binding.value !== binding.oldValue) {\n                clearTimeout(timeoutID)\n                \n                timeoutID = setTimeout(function () {\n                    el.dispatchEvent(new Event('change'))\n                }, binding.value || 500)\n            }\n        };\n\n        el.addEventListener('input', handler);\n    }\n}"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/js/directives/dompurify.js",
    "content": "import DOMPurify from 'dompurify';\n\nexport default {\n    beforeMount(el, binding) {\n        el.innerHTML = DOMPurify.sanitize(binding.value);\n    },\n    updated(el, binding) {\n        el.innerHTML = DOMPurify.sanitize(binding.value);\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/js/directives/tooltip.js",
    "content": "export default {\n    mounted(el, binding) {\n        initTooltip(el, binding);\n    },\n    updated(el, binding) {\n        initTooltip(el, binding);\n    }\n};\n\nconst initTooltip = (el, binding) => {\n    const defaultOptions = {\n        placement: 'top',\n        trigger: 'hover',\n        html: false,\n        content: '',\n        delay: { show: 200, hide: 100 }\n    };\n\n    const options = {\n        ...defaultOptions,\n        ...(typeof binding.value === 'object' ? binding.value : { content: binding.value })\n    };\n\n    let tooltip = document.getElementById(`tooltip-${el.tooltipId}`);\n\n    if (! tooltip) {\n        el.tooltipId = Math.random().toString(36).substring(2, 9);\n        tooltip = document.createElement('div');\n        tooltip.id = `tooltip-${el.tooltipId}`;\n        tooltip.className = 'max-w-[250px] break-words rounded-lg bg-gray-800 px-4 py-3 text-sm leading-snug text-white shadow-lg transition-opacity transition-transform duration-200';\n        tooltip.style.display = 'none';\n        tooltip.style.position = 'absolute';\n        tooltip.style.zIndex = '10000';\n\n        const inner = document.createElement('div');\n        inner.className = 'tooltip-inner';\n\n        const arrow = document.createElement('div');\n        arrow.className = 'absolute h-0 w-0 border-solid';\n\n        tooltip.appendChild(inner);\n        tooltip.appendChild(arrow);\n        document.body.appendChild(tooltip);\n\n        if (options.html) {\n            inner.innerHTML = options.content;\n        } else {\n            inner.textContent = options.content;\n        }\n\n        el._tooltip = tooltip;\n\n        const showTooltip = () => {\n            tooltip.style.display = 'block';\n\n            const rect = el.getBoundingClientRect();\n            const tooltipRect = tooltip.getBoundingClientRect();\n\n            let top, left;\n\n            switch (options.placement) {\n                case 'top':\n                    top = rect.top - tooltipRect.height - 10;\n                    left = rect.left + (rect.width / 2) - (tooltipRect.width / 2);\n                    arrow.style.top = 'auto';\n                    arrow.style.bottom = '-5px';\n                    arrow.style.left = '50%';\n                    arrow.style.transform = 'translateX(-50%)';\n                    break;\n                case 'bottom':\n                    top = rect.bottom + 10;\n                    left = rect.left + (rect.width / 2) - (tooltipRect.width / 2);\n                    arrow.style.bottom = 'auto';\n                    arrow.style.top = '-5px';\n                    arrow.style.left = '50%';\n                    arrow.style.transform = 'translateX(-50%) rotate(180deg)';\n                    break;\n                case 'left':\n                    top = rect.top + (rect.height / 2) - (tooltipRect.height / 2);\n                    left = rect.left - tooltipRect.width - 10;\n                    arrow.style.top = '50%';\n                    arrow.style.left = 'auto';\n                    arrow.style.right = '-5px';\n                    arrow.style.transform = 'translateY(-50%) rotate(-90deg)';\n                    break;\n                case 'right':\n                    top = rect.top + (rect.height / 2) - (tooltipRect.height / 2);\n                    left = rect.right + 10;\n                    arrow.style.top = '50%';\n                    arrow.style.right = 'auto';\n                    arrow.style.left = '-5px';\n                    arrow.style.transform = 'translateY(-50%) rotate(90deg)';\n                    break;\n            }\n\n            if (top < 0) {\n                top = 0;\n            }\n\n            if (left < 0) {\n                left = 0;\n            }\n\n            if (left + tooltipRect.width > window.innerWidth) {\n                left = window.innerWidth - tooltipRect.width;\n            }\n\n            tooltip.style.top = `${top + window.scrollY}px`;\n            tooltip.style.left = `${left + window.scrollX}px`;\n        };\n\n        const hideTooltip = () => {\n            tooltip.style.display = 'none';\n        };\n\n        if (options.trigger === 'hover') {\n            el.addEventListener('mouseenter', () => {\n                el._showTimeout = setTimeout(showTooltip, options.delay.show);\n            });\n\n            el.addEventListener('mouseleave', () => {\n                clearTimeout(el._showTimeout);\n                el._hideTimeout = setTimeout(hideTooltip, options.delay.hide);\n            });\n        } else if (options.trigger === 'click') {\n            el.addEventListener('click', showTooltip);\n\n            document.addEventListener('click', (e) => {\n                if (e.target !== el && !el.contains(e.target)) {\n                    hideTooltip();\n                }\n            });\n        }\n    } else {\n        const inner = tooltip.querySelector('.tooltip-inner');\n\n        if (options.html) {\n            inner.innerHTML = options.content;\n        } else {\n            inner.textContent = options.content;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/js/plugins/admin.js",
    "content": "export default {\n    install(app) {\n        app.config.globalProperties.$admin = {\n            /**\n             * Generates a formatted price.\n             *\n             * @param {number} price - The price value to be formatted.\n             * @returns {string} - The formatted price string.\n             */\n            formatPrice: (price) => {\n                let locale = document.querySelector(\n                    'meta[http-equiv=\"content-language\"]'\n                ).content;\n\n                locale = locale.replace(/([a-z]{2})_([A-Z]{2})/g, \"$1-$2\");\n\n                const currency = JSON.parse(\n                    document.querySelector('meta[name=\"currency\"]').content\n                );\n\n                const symbol =\n                    currency.symbol !== \"\" ? currency.symbol : currency.code;\n\n                if (!currency.currency_position) {\n                    return new Intl.NumberFormat(locale, {\n                        style: \"currency\",\n                        currency: currency.code,\n                    }).format(price);\n                }\n\n                const formatter = new Intl.NumberFormat(locale, {\n                    style: \"currency\",\n                    currency: currency.code,\n                    minimumFractionDigits: currency.decimal ?? 2,\n                });\n\n                const formattedCurrency = formatter\n                    .formatToParts(price)\n                    .map((part) => {\n                        switch (part.type) {\n                            case \"currency\":\n                                return \"\";\n\n                            case \"group\":\n                                return currency.group_separator === \"\"\n                                    ? part.value\n                                    : currency.group_separator;\n\n                            case \"decimal\":\n                                return currency.decimal_separator === \"\"\n                                    ? part.value\n                                    : currency.decimal_separator;\n\n                            default:\n                                return part.value;\n                        }\n                    })\n                    .join(\"\");\n\n                switch (currency.currency_position) {\n                    case \"left\":\n                        return symbol + formattedCurrency;\n\n                    case \"left_with_space\":\n                        return symbol + \" \" + formattedCurrency;\n\n                    case \"right\":\n                        return formattedCurrency + symbol;\n\n                    case \"right_with_space\":\n                        return formattedCurrency + \" \" + symbol;\n\n                    default:\n                        return formattedCurrency;\n                }\n            },\n\n            /**\n             * Generates a formatted date based on specified timezone.\n             *\n             * @param {string} dateString - The date value to be formatted.\n             * @param {string} format - The format to be used for formatting the date.\n             * @param {string} timezone - The timezone to use (e.g., 'America/New_York').\n             * @returns {string} - The formatted date string.\n             */\n            formatDate: (dateString, format, timezone) => {\n                const date = new Date(dateString);\n\n                const options = { timeZone: timezone };\n\n                const formatter = new Intl.DateTimeFormat(\"en-US\", {\n                    ...options,\n                    hour12: false,\n                    year: \"numeric\",\n                    month: \"numeric\",\n                    day: \"numeric\",\n                    hour: \"numeric\",\n                    minute: \"numeric\",\n                    second: \"numeric\",\n                });\n\n                const parts = formatter.formatToParts(date);\n                const dateParts = {};\n\n                parts.forEach((part) => {\n                    if (part.type !== \"literal\") {\n                        dateParts[part.type] = part.value;\n                    }\n                });\n\n                const tzDay = parseInt(dateParts.day, 10);\n                const tzMonth = parseInt(dateParts.month, 10);\n                const tzYear = parseInt(dateParts.year, 10);\n                const tzHour = parseInt(dateParts.hour, 10);\n                const tzMinute = parseInt(dateParts.minute, 10);\n\n                const formatters = {\n                    d: tzDay,\n                    DD: tzDay.toString().padStart(2, \"0\"),\n                    M: tzMonth,\n                    MM: tzMonth.toString().padStart(2, \"0\"),\n                    MMM: new Date(tzYear, tzMonth - 1, 1).toLocaleString(\n                        \"en-US\",\n                        { month: \"short\" }\n                    ),\n                    MMMM: new Date(tzYear, tzMonth - 1, 1).toLocaleString(\n                        \"en-US\",\n                        { month: \"long\" }\n                    ),\n                    yy: tzYear.toString().slice(-2),\n                    yyyy: tzYear,\n                    H: tzHour,\n                    HH: tzHour.toString().padStart(2, \"0\"),\n                    h: tzHour % 12 || 12,\n                    hh: (tzHour % 12 || 12).toString().padStart(2, \"0\"),\n                    m: tzMinute,\n                    mm: tzMinute.toString().padStart(2, \"0\"),\n                    A: tzHour < 12 ? \"AM\" : \"PM\",\n                };\n\n                return format.replace(\n                    /\\b(?:d|DD|M|MM|MMM|MMMM|yy|yyyy|H|HH|h|hh|m|mm|A)\\b/g,\n                    (match) => formatters[match]\n                );\n            },\n        };\n    },\n};\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/js/plugins/axios.js",
    "content": "/**\n * We'll load the axios HTTP library which allows us to easily issue requests\n * to our Laravel back-end. This library automatically handles sending the\n * CSRF token as a header based on the value of the \"XSRF\" token cookie.\n */\nimport axios from \"axios\";\nwindow.axios = axios;\nwindow.axios.defaults.headers.common[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\nexport default {\n    install(app) {\n        app.config.globalProperties.$axios = axios;\n    },\n};\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/js/plugins/createElement.js",
    "content": "import { h, resolveComponent } from \"vue/dist/vue.esm-bundler\";\n\nexport default {\n    install(app) {\n        /**\n         * Create the virtual dom element\n         */\n        app.config.globalProperties.$h = h;\n\n        /**\n         * Resolve the component which is globally registered\n         */\n        app.config.globalProperties.$resolveComponent = resolveComponent;\n    },\n};\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/js/plugins/draggable.js",
    "content": "import Draggable from 'vuedraggable';\n\nexport default {\n    install: (app) => {\n        /**\n         * Global component registration;\n         */\n        app.component(\"draggable\", Draggable);\n    },\n};\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/js/plugins/emitter.js",
    "content": "import mitt from \"mitt\";\n\nconst emitter = mitt();\n\nwindow.emitter = emitter;\n\nexport default {\n    install: (app, options) => {\n        app.config.globalProperties.$emitter = emitter;\n    },\n};\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/js/plugins/flatpickr.js",
    "content": "import Flatpickr from \"flatpickr\";\nimport \"flatpickr/dist/flatpickr.css\";\nimport { Spanish } from \"flatpickr/dist/l10n/es.js\";\nimport { Arabic } from \"flatpickr/dist/l10n/ar.js\";\nimport { Persian } from \"flatpickr/dist/l10n/fa.js\";\nimport { Turkish } from \"flatpickr/dist/l10n/tr.js\";\n\nexport default {\n    install: (app) => {\n        window.Flatpickr = Flatpickr;\n\n        const setLocaleFromLang = () => {\n            const lang = document.documentElement.lang || \"en\";\n\n            const localeMap = {\n                es: Spanish,\n                ar: Arabic,\n                fa: Persian,\n                tr: Turkish\n            };\n\n            const locale = localeMap[lang] || null;\n\n            if (locale) {\n                window.Flatpickr.localize(locale);\n            }\n        };\n\n        setLocaleFromLang();\n\n        const changeTheme = (theme) => {\n            document.getElementById('flatpickr')?.remove();\n\n            if (theme === 'light') {\n                return;\n            }\n\n            const linkElement = document.createElement(\"link\");\n\n            linkElement.rel = \"stylesheet\";\n            linkElement.type = \"text/css\";\n            linkElement.href = `https://npmcdn.com/flatpickr/dist/themes/${theme}.css`;\n            linkElement.id = 'flatpickr';\n\n            document.head.appendChild(linkElement);\n        };\n\n        const currentTheme = document.documentElement.classList.contains(\"dark\")\n            ? \"dark\"\n            : \"light\";\n\n        changeTheme(currentTheme);\n\n        window.emitter.on(\"change-theme\", (theme) => changeTheme(theme));\n    },\n};\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/js/plugins/vee-validate.js",
    "content": "/**\n * We are defining all the global rules here and configuring\n * all the `vee-validate` settings.\n */\nimport { configure, defineRule, Field, Form, ErrorMessage } from \"vee-validate\";\nimport { localize, setLocale } from \"@vee-validate/i18n\";\nimport ar from \"@vee-validate/i18n/dist/locale/ar.json\";\nimport bn from \"@vee-validate/i18n/dist/locale/bn.json\";\nimport de from \"@vee-validate/i18n/dist/locale/de.json\";\nimport en from \"@vee-validate/i18n/dist/locale/en.json\";\nimport es from \"@vee-validate/i18n/dist/locale/es.json\";\nimport fa from \"@vee-validate/i18n/dist/locale/fa.json\";\nimport fr from \"@vee-validate/i18n/dist/locale/fr.json\";\nimport he from \"@vee-validate/i18n/dist/locale/he.json\";\nimport hi_IN from \"../../locales/hi_IN.json\";\nimport it from \"@vee-validate/i18n/dist/locale/it.json\";\nimport ja from \"@vee-validate/i18n/dist/locale/ja.json\";\nimport nl from \"@vee-validate/i18n/dist/locale/nl.json\";\nimport pl from \"@vee-validate/i18n/dist/locale/pl.json\";\nimport pt_BR from \"@vee-validate/i18n/dist/locale/pt_BR.json\";\nimport ru from \"@vee-validate/i18n/dist/locale/ru.json\";\nimport sin from \"../../locales/sin.json\";\nimport tr from \"@vee-validate/i18n/dist/locale/tr.json\";\nimport uk from \"@vee-validate/i18n/dist/locale/uk.json\";\nimport zh_CN from \"@vee-validate/i18n/dist/locale/zh_CN.json\";\nimport { all } from '@vee-validate/rules';\n\nwindow.defineRule = defineRule;\n\nexport default {\n    install: (app) => {\n        /**\n         * Global components registration;\n         */\n        app.component(\"VForm\", Form);\n        app.component(\"VField\", Field);\n        app.component(\"VErrorMessage\", ErrorMessage);\n\n        window.addEventListener(\"load\", () => setLocale(document.documentElement.attributes.lang.value));\n\n        /**\n         * Registration of all global validators.\n         */\n        Object.entries(all).forEach(([name, rule]) => defineRule(name, rule));\n\n        /**\n         * This regular expression allows phone numbers with the following conditions:\n         * - The phone number can start with an optional \"+\" sign.\n         * - After the \"+\" sign, there should be one or more digits.\n         *\n         * This validation is sufficient for global-level phone number validation. If\n         * someone wants to customize it, they can override this rule.\n         */\n        defineRule(\"phone\", (value) => {\n            if (! value || ! value.length) {\n                return true;\n            }\n\n            if (! /^\\+?\\d+$/.test(value)) {\n                return false;\n            }\n\n            return true;\n        });\n                \n        defineRule(\"address\", (value) => {\n            if (!value || !value.length) {\n                return true;\n            }\n\n            if (\n                !/^[a-zA-Z0-9\\s.\\/*'\\u0600-\\u06FF\\u0750-\\u077F\\u08A0-\\u08FF\\u0590-\\u05FF\\u3040-\\u309F\\u30A0-\\u30FF\\u0400-\\u04FF\\u0D80-\\u0DFF\\u3400-\\u4DBF\\u2000-\\u2A6D\\u00C0-\\u017F\\u0980-\\u09FF\\u0900-\\u097F\\u4E00-\\u9FFF,\\(\\)-]{1,60}$/iu.test(\n                    value\n                )\n            ) {\n                return false;\n            }\n\n            return true;\n        });\n\n        defineRule(\"postcode\", (value) => {\n            if (! value || ! value.length) {\n                return true;\n            }\n\n            if (! /^[a-zA-Z0-9][a-zA-Z0-9\\s-]*[a-zA-Z0-9]$/.test(value)) {\n                return false;\n            }\n\n            return true;\n        });\n\n        defineRule(\"decimal\", (value, { decimals = '*', separator = '.' } = {}) => {\n            if (value === null || value === undefined || value === '') {\n                return true;\n            }\n\n            if (Number(decimals) === 0) {\n                return /^-?\\d*$/.test(value);\n            }\n\n            const regexPart = decimals === '*' ? '+' : `{1,${decimals}}`;\n            const regex = new RegExp(`^[-+]?\\\\d*(\\\\${separator}\\\\d${regexPart})?([eE]{1}[-]?\\\\d+)?$`);\n\n            return regex.test(value);\n        });\n\n        defineRule(\"required_if\", (value, { condition = true } = {}) => {\n            if (condition) {\n                if (value === null || value === undefined || value === '') {\n                    return false;\n                }\n            }\n\n            return true;\n        });\n\n        defineRule(\"\", () => true);\n\n        defineRule(\"date_format\", (value) => {\n            const regex = /^\\d{4}-\\d{2}-\\d{2}$/;\n            \n            return regex.test(value);\n        });\n\n        defineRule(\"after\", (value) => {\n            const today = new Date();\n            const inputDate = new Date(value);\n          \n            today.setHours(0, 0, 0, 0);\n            inputDate.setHours(0, 0, 0, 0);\n          \n            return inputDate >= today;\n        });\n\n        configure({\n            /**\n             * Built-in error messages and custom error messages are available. Multiple\n             * locales can be added in the same way.\n             */\n            generateMessage: localize({\n                ar: {\n                    ...ar,\n                    messages: {\n                        ...ar.messages,\n                        phone: \"يجب أن يكون هذا {field} رقم هاتف صالحًا\",\n                        after: \"يجب أن يكون {field} تاريخًا في المستقبل أو اليوم.\",\n                    },\n                },\n        \n                en: {\n                    ...en,\n                    messages: {\n                        ...en.messages,\n                        phone: \"This {field} must be a valid phone number\",\n                        after: \"The {field} must be a date in the future or today.\",\n                    },\n                },\n        \n                es: {\n                    ...es,\n                    messages: {\n                        ...es.messages,\n                        phone: \"Este {field} debe ser un número de teléfono válido.\",\n                        after: \"El {field} debe ser una fecha en el futuro o hoy.\",\n                    },\n                },\n        \n                fa: {\n                    ...fa,\n                    messages: {\n                        ...fa.messages,\n                        phone: \"این {field} باید یک شماره تلفن معتبر باشد.\",\n                        after: \"{field} باید یک تاریخ در آینده یا امروز باشد.\",\n                    },\n                },\n        \n                tr: {\n                    ...tr,\n                    messages: {\n                        ...tr.messages,\n                        phone: \"Bu {field} geçerli bir telefon numarası olmalıdır.\",\n                        after: \"{field} gelecekte veya bugün olmalıdır.\",\n                    },\n                },\n            }),\n\n            validateOnBlur: true,\n            validateOnInput: true,\n            validateOnChange: true,\n        });\n    },\n};\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/js/plugins/vue-cal.js",
    "content": "\nimport VueCal from 'vue-cal';\n\nimport 'vue-cal/dist/vuecal.css';\n\nimport 'vue-cal/dist/i18n/ar.es.js';\nimport 'vue-cal/dist/i18n/en.es.js';\nimport 'vue-cal/dist/i18n/es.es.js';\nimport 'vue-cal/dist/i18n/fa.es.js';\nimport 'vue-cal/dist/i18n/tr.es.js';\nimport 'vue-cal/dist/i18n/pt-br.es.js';\nimport 'vue-cal/dist/i18n/vi.es.js';\n\nexport default {\n    install: (app, options) => app.component('v-vue-cal', VueCal),\n};\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/locales/hi_IN.json",
    "content": "{\n  \"code\": \"hi_IN\",\n  \"messages\": {\n    \"_default\": \"यह {field} मान्य नहीं है\",\n    \"alpha\": \"{field} फ़ील्ड में केवल वर्णात्मक अक्षर हो सकते हैं\",\n    \"alpha_num\": \"{field} फ़ील्ड में केवल वर्णात्मक और संख्यात्मक अक्षर हो सकते हैं\",\n    \"alpha_dash\": \"{field} फ़ील्ड में वर्णात्मक और संख्यात्मक अक्षरों के साथ डैश और अंडरस्कोर हो सकते हैं\",\n    \"alpha_spaces\": \"{field} फ़ील्ड में केवल वर्णात्मक अक्षर और अंतर हो सकते हैं\",\n    \"between\": \"{field} फ़ील्ड 0:{min} और 1:{max} के बीच होना चाहिए\",\n    \"confirmed\": \"{field} फ़ील्ड की पुष्टि मेल नहीं खाती\",\n    \"digits\": \"{field} फ़ील्ड संख्यात्मक होनी चाहिए और बिल्कुल 0:{length} अंक होने चाहिए\",\n    \"dimensions\": \"{field} फ़ील्ड 0:{width} पिक्सेल और 1:{height} पिक्सेल होना चाहिए\",\n    \"email\": \"{field} फ़ील्ड में एक मान्य ईमेल होना चाहिए\",\n    \"not_one_of\": \"{field} फ़ील्ड मान्य मूल्य नहीं है\",\n    \"ext\": \"{field} फ़ील्ड में मान्य फ़ाइल नहीं है\",\n    \"image\": \"{field} फ़ील्ड एक छवि होनी चाहिए\",\n    \"integer\": \"{field} फ़ील्ड एक पूर्णांक होना चाहिए\",\n    \"length\": \"{field} फ़ील्ड 0:{length} लंबा होना चाहिए\",\n    \"max_value\": \"{field} फ़ील्ड 0:{max} या उससे कम होना चाहिए\",\n    \"max\": \"{field} फ़ील्ड 0:{length} अक्षरों से अधिक नहीं हो सकता\",\n    \"mimes\": \"{field} फ़ील्ड को मान्य फ़ाइल प्रकार होना चाहिए\",\n    \"min_value\": \"{field} फ़ील्ड 0:{min} या उससे अधिक होना चाहिए\",\n    \"min\": \"{field} फ़ील्ड कम से कम 0:{length} अक्षरों का होना चाहिए\",\n    \"numeric\": \"{field} फ़ील्ड में केवल संख्याएँ हो सकती हैं\",\n    \"one_of\": \"{field} फ़ील्ड मान्य मूल्य नहीं है\",\n    \"regex\": \"{field} फ़ील्ड का प्रारूप अवैध है\",\n    \"required_if\": \"{field} फ़ील्ड आवश्यक है\",\n    \"required\": \"{field} फ़ील्ड आवश्यक है\",\n    \"size\": \"{field} फ़ील्ड का आकार 0:{size}KB से कम होना चाहिए\",\n    \"url\": \"{field} फ़ील्ड में एक मान्य URL नहीं है\"\n  }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/assets/locales/sin.json",
    "content": "{\n    \"code\": \"sin\",\n    \"messages\": {\n        \"_default\": \"මේ {field} වල වලංගු නොවේ\",\n        \"alpha\": \"{field} ක්ෂණික සංඛ්‍යාවක් පිළිබඳව සියල්ල සියල්ල සහිතව හැකිය\",\n        \"alpha_num\": \"{field} ක්ෂණික සහ සංඛ්‍යාවක් පිළිබඳව සියල්ල සහිතව හැකිය\",\n        \"alpha_dash\": \"{field} ක්ෂණික සහ සංඛ්‍යාවක් සමග දැහැ හෝ පරිදි ලොව සහිතව හැකිය\",\n        \"alpha_spaces\": \"{field} ක්ෂණික සංඛ්‍යාවක් සහිතව හැකිය, සහ වීඩියෝ හෝම්හෝ සහිතව හැකිය\",\n        \"between\": \"{field} ක්ෂණික 0:{min} සහ 1:{max} අතර විය යුතුය\",\n        \"confirmed\": \"{field} ක්ෂණික තහවුරු නොගත් බව තහවුරු කර නොයාය\",\n        \"digits\": \"{field} ක්ෂණික සෂ්යෝගයක් හා සියලුමේ විය 0:{length} දිගු විය යුතුය\",\n        \"dimensions\": \"{field} ක්ෂණික 0:{width} පික්සල සහ 1:{height} පික්සල විය යුතුය\",\n        \"email\": \"{field} ක්ෂණික වලංගු ඊමේල් එක හෝ යුක්ත විය යුතුය\",\n        \"not_one_of\": \"{field} ක්ෂණික වලංගු අගය නොවේ\",\n        \"ext\": \"{field} ක්ෂණික වලංගු ගොනුව නොවේ\",\n        \"image\": \"{field} ක්ෂණික වලංගු ඡායාරූපය යුතුය\",\n        \"integer\": \"{field} ක්ෂණික වලංගු නික්මෙර වර්ගයේ යුතුය\",\n        \"length\": \"{field} ක්ෂණික වලංගු 0:{length} හෝමාව යුතුය\",\n        \"max_value\": \"{field} ක්ෂණික 0:{max} හෝමා හෝමා හෝමා යුතුය\",\n        \"max\": \"{field} ක්ෂණික 0:{length} අකුරු වලංගු වී නොයාය\",\n        \"mimes\": \"{field} ක්ෂණික ගොනුවේ වලංගු ගොනු වර්ගය හෝ හෝ හෝ යුතුය\",\n        \"min_value\": \"{field} ක්ෂණික 0:{min} හෝමාව හෝමාව හෝමාව හෝමාව හෝමාව යුතුය\",\n        \"min\": \"{field} ක්ෂණික 0:{length} හෝමාවක් හෝමාවක් හෝමාවක් හෝමාවක් යුතුය\",\n        \"numeric\": \"{field} ක්ෂණික වලංගු සංඛ්‍යාවෙන් වයස්ක්‍ර සංඛ්‍යාවෙන් වයස්ක්‍ර විය ෺\",\n        \"one_of\": \"{field} ක්ෂණික වලංගු අගය නොවේ\",\n        \"regex\": \"{field} ක්ෂණික වලංගු ආකාරය අවලංගුය\",\n        \"required_if\": \"{field} ක්ෂණිකයෙන් හෝයි\",\n        \"required\": \"{field} ක්ෂණිකයෙන් හෝයි\",\n        \"size\": \"{field} ක්ෂණික වලංගු විය හැකි ආකාරය 0:{size}KB හෝ හොයා යුතුයි\",\n        \"url\": \"{field} ක්ෂණික වලංගු වර්ගවල URL නොවේ\"\n    }\n}"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/lang/ar/app.php",
    "content": "<?php\n\nreturn [\n    'acl' => [\n        'leads' => 'العملاء المحتملون',\n        'lead' => 'عميل محتمل',\n        'quotes' => 'عروض الأسعار',\n        'mail' => 'البريد',\n        'inbox' => 'الوارد',\n        'draft' => 'المسودات',\n        'outbox' => 'الصادر',\n        'sent' => 'المرسل',\n        'trash' => 'المحذوفات',\n        'activities' => 'الأنشطة',\n        'webhook' => 'Webhook',\n        'contacts' => 'جهات الاتصال',\n        'persons' => 'الأشخاص',\n        'organizations' => 'المنظمات',\n        'products' => 'المنتجات',\n        'settings' => 'الإعدادات',\n        'groups' => 'المجموعات',\n        'roles' => 'الأدوار',\n        'users' => 'المستخدمون',\n        'user' => 'المستخدم',\n        'automation' => 'الأتمتة',\n        'attributes' => 'السمات',\n        'pipelines' => 'قنوات البيع',\n        'sources' => 'المصادر',\n        'types' => 'الأنواع',\n        'email-templates' => 'قوالب البريد الإلكتروني',\n        'workflows' => 'سير العمل',\n        'other-settings' => 'إعدادات أخرى',\n        'tags' => 'الوسوم',\n        'configuration' => 'التهيئة',\n        'create' => 'إنشاء',\n        'edit' => 'تعديل',\n        'view' => 'عرض',\n        'print' => 'طباعة',\n        'delete' => 'حذف',\n        'export' => 'تصدير',\n        'mass-delete' => 'حذف جماعي',\n        'data-transfer' => 'نقل البيانات',\n        'imports' => 'الاستيرادات',\n        'import' => 'استيراد',\n        'event' => 'حدث',\n        'campaigns' => 'الحملات',\n        'warehouses' => 'المستودعات',\n        'inventory' => 'المخزون',\n    ],\n    'users' => [\n        'activate-warning' => 'حسابك لم يتم تفعيله بعد. يرجى الاتصال بالمسؤول.',\n        'login-error' => 'بيانات الاعتماد لا تتطابق مع سجلاتنا.',\n        'not-permission' => 'ليس لديك إذن للوصول إلى لوحة الإدارة.',\n        'login' => [\n            'email' => 'عنوان البريد الإلكتروني',\n            'forget-password-link' => 'نسيت كلمة المرور؟',\n            'password' => 'كلمة المرور',\n            'submit-btn' => 'تسجيل الدخول',\n            'title' => 'تسجيل الدخول',\n        ],\n        'forget-password' => [\n            'create' => [\n                'email' => 'البريد الإلكتروني المسجل',\n                'email-not-exist' => 'البريد الإلكتروني غير موجود',\n                'page-title' => 'نسيت كلمة المرور',\n                'reset-link-sent' => 'تم إرسال رابط إعادة تعيين كلمة المرور',\n                'sign-in-link' => 'العودة إلى تسجيل الدخول؟',\n                'submit-btn' => 'إعادة تعيين',\n                'title' => 'استعادة كلمة المرور',\n            ],\n        ],\n        'reset-password' => [\n            'back-link-title' => 'العودة إلى تسجيل الدخول؟',\n            'confirm-password' => 'تأكيد كلمة المرور',\n            'email' => 'البريد الإلكتروني المسجل',\n            'password' => 'كلمة المرور',\n            'submit-btn' => 'إعادة تعيين كلمة المرور',\n            'title' => 'إعادة تعيين كلمة المرور',\n        ],\n    ],\n    'account' => [\n        'edit' => [\n            'back-btn' => 'رجوع',\n            'change-password' => 'تغيير كلمة المرور',\n            'confirm-password' => 'تأكيد كلمة المرور',\n            'current-password' => 'كلمة المرور الحالية',\n            'email' => 'البريد الإلكتروني',\n            'general' => 'عام',\n            'invalid-password' => 'كلمة المرور الحالية التي أدخلتها غير صحيحة.',\n            'name' => 'الاسم',\n            'password' => 'كلمة المرور',\n            'profile-image' => 'صورة الملف الشخصي',\n            'save-btn' => 'حفظ الحساب',\n            'title' => 'حسابي',\n            'update-success' => 'تم تحديث الحساب بنجاح',\n            'upload-image-info' => 'قم بتحميل صورة الملف الشخصي (110px X 110px) بتنسيق PNG أو JPG',\n        ],\n    ],\n    'components' => [\n        'activities' => [\n            'actions' => [\n                'mail' => [\n                    'btn' => 'بريد',\n                    'title' => 'كتابة بريد',\n                    'to' => 'إلى',\n                    'enter-emails' => 'اضغط Enter لإضافة عناوين البريد الإلكتروني',\n                    'cc' => 'نسخة',\n                    'bcc' => 'نسخة مخفية',\n                    'subject' => 'الموضوع',\n                    'send-btn' => 'إرسال',\n                    'message' => 'رسالة',\n                ],\n                'file' => [\n                    'btn' => 'ملف',\n                    'title' => 'إضافة ملف',\n                    'title-control' => 'عنوان',\n                    'name' => 'اسم',\n                    'description' => 'وصف',\n                    'file' => 'ملف',\n                    'save-btn' => 'حفظ الملف',\n                ],\n                'note' => [\n                    'btn' => 'ملاحظة',\n                    'title' => 'إضافة ملاحظة',\n                    'comment' => 'تعليق',\n                    'save-btn' => 'حفظ الملاحظة',\n                ],\n                'activity' => [\n                    'btn' => 'نشاط',\n                    'title' => 'إضافة نشاط',\n                    'title-control' => 'عنوان',\n                    'description' => 'وصف',\n                    'schedule-from' => 'الجدولة من',\n                    'schedule-to' => 'الجدولة إلى',\n                    'location' => 'موقع',\n                    'call' => 'مكالمة',\n                    'meeting' => 'اجتماع',\n                    'lunch' => 'غداء',\n                    'save-btn' => 'حفظ النشاط',\n                    'participants' => [\n                        'title' => 'المشاركون',\n                        'placeholder' => 'اكتب للبحث عن المشاركين',\n                        'users' => 'المستخدمون',\n                        'persons' => 'الأشخاص',\n                        'no-results' => 'لم يتم العثور على نتائج...',\n                    ],\n                ],\n            ],\n            'index' => [\n                'all' => 'الكل',\n                'bcc' => 'نسخة مخفية',\n                'by-user' => 'بواسطة :user',\n                'calls' => 'المكالمات',\n                'cc' => 'نسخة',\n                'change-log' => 'سجلات التغيير',\n                'delete' => 'حذف',\n                'edit' => 'تعديل',\n                'emails' => 'البريد الإلكتروني',\n                'empty' => 'فارغ',\n                'files' => 'الملفات',\n                'from' => 'من',\n                'location' => 'موقع',\n                'lunches' => 'الغداء',\n                'mark-as-done' => 'وضع علامة تم',\n                'meetings' => 'الاجتماعات',\n                'notes' => 'الملاحظات',\n                'participants' => 'المشاركون',\n                'planned' => 'مخطط له',\n                'quotes' => 'الاقتباسات',\n                'scheduled-on' => 'مجدول في',\n                'system' => 'النظام',\n                'to' => 'إلى',\n                'unlink' => 'إلغاء الارتباط',\n                'view' => 'عرض',\n                'empty-placeholders' => [\n                    'all' => [\n                        'title' => 'لم يتم العثور على أي أنشطة',\n                        'description' => 'لم يتم العثور على أي أنشطة لهذا العنصر. يمكنك إضافة الأنشطة من خلال النقر على زر \"النشاط\" في اللوحة الجانبية اليسرى.',\n                    ],\n                    'planned' => [\n                        'title' => 'لم يتم العثور على أنشطة مخططة',\n                        'description' => 'لم يتم العثور على أنشطة مخططة لهذا العنصر. يمكنك إضافة أنشطة مخططة من خلال النقر على زر \"النشاط\" في اللوحة الجانبية اليسرى.',\n                    ],\n                    'notes' => [\n                        'title' => 'لم يتم العثور على ملاحظات',\n                        'description' => 'لم يتم العثور على ملاحظات لهذا العنصر. يمكنك إضافة الملاحظات من خلال النقر على زر \"الملاحظة\" في اللوحة الجانبية اليسرى.',\n                    ],\n                    'calls' => [\n                        'title' => 'لم يتم العثور على مكالمات',\n                        'description' => 'لم يتم العثور على مكالمات لهذا العنصر. يمكنك إضافة المكالمات من خلال النقر على زر \"النشاط\" في اللوحة الجانبية اليسرى واختيار نوع المكالمة.',\n                    ],\n                    'meetings' => [\n                        'title' => 'لم يتم العثور على اجتماعات',\n                        'description' => 'لم يتم العثور على اجتماعات لهذا العنصر. يمكنك إضافة الاجتماعات من خلال النقر على زر \"النشاط\" في اللوحة الجانبية اليسرى واختيار نوع الاجتماع.',\n                    ],\n                    'lunches' => [\n                        'title' => 'لم يتم العثور على غداءات',\n                        'description' => 'لم يتم العثور على غداءات لهذا العنصر. يمكنك إضافة الغداءات من خلال النقر على زر \"النشاط\" في اللوحة الجانبية اليسرى واختيار نوع الغداء.',\n                    ],\n                    'files' => [\n                        'title' => 'لم يتم العثور على ملفات',\n                        'description' => 'لم يتم العثور على ملفات لهذا العنصر. يمكنك إضافة الملفات من خلال النقر على زر \"الملف\" في اللوحة الجانبية اليسرى.',\n                    ],\n                    'emails' => [\n                        'title' => 'لم يتم العثور على رسائل بريد إلكتروني',\n                        'description' => 'لم يتم العثور على رسائل بريد إلكتروني لهذا العنصر. يمكنك إضافة الرسائل من خلال النقر على زر \"البريد\" في اللوحة الجانبية اليسرى.',\n                    ],\n                    'system' => [\n                        'title' => 'لم يتم العثور على سجلات التغيير',\n                        'description' => 'لم يتم العثور على سجلات التغيير لهذا العنصر.',\n                    ],\n                ],\n            ],\n        ],\n        'media' => [\n            'images' => [\n                'add-image-btn' => 'إضافة صورة',\n                'ai-add-image-btn' => 'الذكاء الاصطناعي السحري',\n                'allowed-types' => 'png, jpeg, jpg',\n                'not-allowed-error' => 'فقط ملفات الصور (.jpeg, .jpg, .png) مسموح بها.',\n                'placeholders' => [\n                    'front' => 'الأمام',\n                    'next' => 'التالي',\n                    'size' => 'الحجم',\n                    'use-cases' => 'حالات الاستخدام',\n                    'zoom' => 'تكبير',\n                ],\n            ],\n            'videos' => [\n                'add-video-btn' => 'إضافة فيديو',\n                'allowed-types' => 'mp4, webm, mkv',\n                'not-allowed-error' => 'فقط ملفات الفيديو (.mp4, .mov, .ogg) مسموح بها.',\n            ],\n        ],\n        'datagrid' => [\n            'index' => [\n                'no-records-selected' => 'لم يتم اختيار أي سجلات.',\n                'must-select-a-mass-action-option' => 'يجب أن تختار خيارًا للإجراء الجماعي.',\n                'must-select-a-mass-action' => 'يجب أن تختار إجراءً جماعيًا.',\n            ],\n            'toolbar' => [\n                'length-of' => ':length من',\n                'of' => 'من',\n                'per-page' => 'لكل صفحة',\n                'results' => ':total نتائج',\n                'delete' => 'حذف',\n                'selected' => ':total عناصر مختارة',\n                'mass-actions' => [\n                    'submit' => 'إرسال',\n                    'select-option' => 'اختر خيارًا',\n                    'select-action' => 'اختر إجراءً',\n                ],\n                'filter' => [\n                    'apply-filters-btn' => 'تطبيق الفلاتر',\n                    'back-btn' => 'رجوع',\n                    'create-new-filter' => 'إنشاء فلتر جديد',\n                    'custom-filters' => 'فلاتر مخصصة',\n                    'delete-error' => 'حدث خطأ أثناء حذف الفلتر، يرجى المحاولة مرة أخرى.',\n                    'delete-success' => 'تم حذف الفلتر بنجاح.',\n                    'empty-description' => 'لا توجد فلاتر محددة للحفظ. يرجى اختيار الفلاتر للحفظ.',\n                    'empty-title' => 'أضف فلاتر للحفظ',\n                    'name' => 'الاسم',\n                    'quick-filters' => 'الفلاتر السريعة',\n                    'save-btn' => 'حفظ',\n                    'save-filter' => 'حفظ الفلتر',\n                    'saved-success' => 'تم حفظ الفلتر بنجاح.',\n                    'selected-filters' => 'الفلاتر المحددة',\n                    'title' => 'فلتر',\n                    'update' => 'تحديث',\n                    'update-filter' => 'تحديث الفلتر',\n                    'updated-success' => 'تم تحديث الفلتر بنجاح.',\n                ],\n                'search' => [\n                    'title' => 'بحث',\n                ],\n            ],\n            'filters' => [\n                'select' => 'اختر',\n                'title' => 'فلاتر',\n                'dropdown' => [\n                    'searchable' => [\n                        'at-least-two-chars' => 'اكتب حرفين على الأقل...',\n                        'no-results' => 'لم يتم العثور على نتائج...',\n                    ],\n                ],\n                'custom-filters' => [\n                    'clear-all' => 'مسح الكل',\n                    'title' => 'فلاتر مخصصة',\n                ],\n                'boolean-options' => [\n                    'false' => 'خاطئ',\n                    'true' => 'صحيح',\n                ],\n                'date-options' => [\n                    'last-month' => 'الشهر الماضي',\n                    'last-six-months' => 'آخر 6 أشهر',\n                    'last-three-months' => 'آخر 3 أشهر',\n                    'this-month' => 'هذا الشهر',\n                    'this-week' => 'هذا الأسبوع',\n                    'this-year' => 'هذا العام',\n                    'today' => 'اليوم',\n                    'yesterday' => 'الأمس',\n                ],\n            ],\n            'table' => [\n                'actions' => 'الإجراءات',\n                'no-records-available' => 'لا توجد سجلات متاحة.',\n            ],\n        ],\n        'modal' => [\n            'confirm' => [\n                'agree-btn' => 'موافق',\n                'disagree-btn' => 'غير موافق',\n                'message' => 'هل أنت متأكد أنك تريد تنفيذ هذا الإجراء؟',\n                'title' => 'هل أنت متأكد؟',\n            ],\n        ],\n        'tags' => [\n            'index' => [\n                'title' => 'الوسوم',\n                'added-tags' => 'الوسوم المضافة',\n                'save-btn' => 'حفظ الوسم',\n                'placeholder' => 'اكتب للبحث عن الوسوم',\n                'add-tag' => 'إضافة \":term\"...',\n                'aquarelle-red' => 'أحمر مائي',\n                'crushed-cashew' => 'كاجو مطحون',\n                'beeswax' => 'شمع العسل',\n                'lemon-chiffon' => 'شيفون الليمون',\n                'snow-flurry' => 'زوبعة ثلجية',\n                'honeydew' => 'شمام',\n            ],\n        ],\n        'layouts' => [\n            'powered-by' => [\n                'description' => 'Powered by :krayin, an open-source project by :webkul.',\n            ],\n            'header' => [\n                'mega-search' => [\n                    'title' => 'البحث الشامل',\n                    'tabs' => [\n                        'leads' => 'العملاء المحتملين',\n                        'quotes' => 'عروض الأسعار',\n                        'persons' => 'الأشخاص',\n                        'products' => 'المنتجات',\n                    ],\n                    'explore-all-products' => 'استكشاف جميع المنتجات',\n                    'explore-all-leads' => 'استكشاف جميع العملاء المحتملين',\n                    'explore-all-contacts' => 'استكشاف جميع جهات الاتصال',\n                    'explore-all-quotes' => 'استكشاف جميع عروض الأسعار',\n                    'explore-all-matching-products' => 'استكشاف جميع المنتجات المطابقة لـ \":query\" (:count)',\n                    'explore-all-matching-leads' => 'استكشاف جميع العملاء المحتملين المطابقين لـ \":query\" (:count)',\n                    'explore-all-matching-contacts' => 'استكشاف جميع جهات الاتصال المطابقة لـ \":query\" (:count)',\n                    'explore-all-matching-quotes' => 'استكشاف جميع عروض الأسعار المطابقة لـ \":query\" (:count)',\n                ],\n            ],\n        ],\n        'attributes' => [\n            'edit' => [\n                'delete' => 'حذف',\n            ],\n            'lookup' => [\n                'click-to-add' => 'انقر للإضافة',\n                'search' => 'بحث...',\n                'no-result-found' => 'لم يتم العثور على نتائج',\n            ],\n        ],\n        'lookup' => [\n            'click-to-add' => 'انقر للإضافة',\n            'no-results' => 'لم يتم العثور على نتائج',\n            'add-as-new' => 'إضافة كجديد',\n            'search' => 'بحث...',\n        ],\n        'flash-group' => [\n            'success' => 'نجاح',\n            'error' => 'خطأ',\n            'warning' => 'تحذير',\n            'info' => 'معلومات',\n        ],\n        'tiny-mce' => [\n            'http-error' => 'خطأ في HTTP',\n            'invalid-json' => 'استجابة JSON غير صالحة من الخادم.',\n            'upload-failed' => 'فشل تحميل الملف. يرجى المحاولة مرة أخرى.',\n        ],\n    ],\n    'quotes' => [\n        'index' => [\n            'title' => 'عروض الأسعار',\n            'create-btn' => 'إنشاء عرض سعر',\n            'create-success' => 'تم إنشاء عرض السعر بنجاح.',\n            'update-success' => 'تم تحديث عرض السعر بنجاح.',\n            'delete-success' => 'تم حذف عرض السعر بنجاح.',\n            'delete-failed' => 'لا يمكن حذف عرض السعر.',\n            'datagrid' => [\n                'subject' => 'الموضوع',\n                'sales-person' => 'مندوب المبيعات',\n                'expired-at' => 'تاريخ الانتهاء',\n                'created-at' => 'تاريخ الإنشاء',\n                'person' => 'الشخص',\n                'subtotal' => 'المجموع الفرعي',\n                'discount' => 'الخصم',\n                'tax' => 'الضريبة',\n                'adjustment' => 'التعديل',\n                'grand-total' => 'المجموع الكلي',\n                'edit' => 'تعديل',\n                'delete' => 'حذف',\n                'print' => 'طباعة',\n            ],\n            'pdf' => [\n                'adjustment' => 'التعديل',\n                'amount' => 'المبلغ',\n                'billing-address' => 'عنوان الفوترة',\n                'date' => 'التاريخ',\n                'discount' => 'الخصم',\n                'expired-at' => 'تاريخ الانتهاء',\n                'grand-total' => 'المجموع الكلي',\n                'person' => 'Person',\n                'price' => 'السعر',\n                'product-name' => 'اسم المنتج',\n                'quantity' => 'الكمية',\n                'quote-id' => 'رقم عرض السعر',\n                'sales-person' => 'مندوب المبيعات',\n                'shipping-address' => 'عنوان الشحن',\n                'sku' => 'رمز المنتج',\n                'sub-total' => 'المجموع الفرعي',\n                'subject' => 'Subject',\n                'tax' => 'الضريبة',\n                'title' => 'عرض السعر',\n            ],\n        ],\n        'create' => [\n            'title' => 'إنشاء عرض سعر',\n            'save-btn' => 'حفظ عرض السعر',\n            'quote-info' => 'معلومات عرض السعر',\n            'quote-info-info' => 'أدخل المعلومات الأساسية لعرض السعر.',\n            'address-info' => 'معلومات العنوان',\n            'address-info-info' => 'معلومات عن العنوان المتعلق بعرض السعر.',\n            'quote-items' => 'بنود عرض السعر',\n            'search-products' => 'البحث عن المنتجات',\n            'link-to-lead' => 'ربط بالعميل المحتمل',\n            'quote-item-info' => 'أضف طلب المنتج لهذا العرض.',\n            'quote-name' => 'اسم عرض السعر',\n            'quantity' => 'الكمية',\n            'price' => 'السعر',\n            'discount' => 'الخصم',\n            'tax' => 'الضريبة',\n            'total' => 'المجموع',\n            'amount' => 'المبلغ',\n            'add-item' => '+ إضافة بند',\n            'sub-total' => 'المجموع الفرعي (:symbol)',\n            'total-discount' => 'الخصم (:symbol)',\n            'total-tax' => 'الضريبة (:symbol)',\n            'total-adjustment' => 'التعديل (:symbol)',\n            'grand-total' => 'المجموع الكلي (:symbol)',\n            'discount-amount' => 'مبلغ الخصم',\n            'tax-amount' => 'مبلغ الضريبة',\n            'adjustment-amount' => 'مبلغ التعديل',\n            'product-name' => 'اسم المنتج',\n            'action' => 'الإجراء',\n        ],\n        'edit' => [\n            'title' => 'تعديل عرض السعر',\n            'save-btn' => 'حفظ عرض السعر',\n            'quote-info' => 'معلومات عرض السعر',\n            'quote-info-info' => 'أدخل المعلومات الأساسية لعرض السعر.',\n            'address-info' => 'معلومات العنوان',\n            'address-info-info' => 'معلومات عن العنوان المتعلق بعرض السعر.',\n            'quote-items' => 'بنود عرض السعر',\n            'link-to-lead' => 'ربط بالعميل المحتمل',\n            'quote-item-info' => 'أضف طلب المنتج لهذا العرض.',\n            'quote-name' => 'اسم عرض السعر',\n            'quantity' => 'الكمية',\n            'price' => 'السعر',\n            'search-products' => 'البحث عن المنتجات',\n            'discount' => 'الخصم',\n            'tax' => 'الضريبة',\n            'total' => 'المجموع',\n            'amount' => 'المبلغ',\n            'add-item' => '+ إضافة بند',\n            'sub-total' => 'المجموع الفرعي (:symbol)',\n            'total-discount' => 'الخصم (:symbol)',\n            'total-tax' => 'الضريبة (:symbol)',\n            'total-adjustment' => 'التعديل (:symbol)',\n            'grand-total' => 'المجموع الكلي (:symbol)',\n            'discount-amount' => 'مبلغ الخصم',\n            'tax-amount' => 'مبلغ الضريبة',\n            'adjustment-amount' => 'مبلغ التعديل',\n            'product-name' => 'اسم المنتج',\n            'action' => 'الإجراء',\n        ],\n    ],\n    'contacts' => [\n        'persons' => [\n            'index' => [\n                'title' => 'الأشخاص',\n                'create-btn' => 'إنشاء شخص',\n                'create-success' => 'تم إنشاء الشخص بنجاح.',\n                'update-success' => 'تم تحديث الشخص بنجاح.',\n                'all-delete-success' => 'تم حذف جميع الأشخاص المحددين بنجاح.',\n                'partial-delete-warning' => 'تم حذف بعض الأشخاص بنجاح. لم يتم حذف الآخرين لأنهم مرتبطون بعملاء محتملين.',\n                'none-delete-warning' => 'لم يتم حذف أي من الأشخاص المحددين لأنهم مرتبطون بعملاء محتملين.',\n                'no-selection' => 'لم يتم تحديد أي أشخاص للحذف.',\n                'delete-failed' => 'فشل في حذف الأشخاص المحددين.',\n                'datagrid' => [\n                    'contact-numbers' => 'أرقام الاتصال',\n                    'delete' => 'حذف',\n                    'edit' => 'تعديل',\n                    'emails' => 'البريد الإلكتروني',\n                    'id' => 'المعرف',\n                    'view' => 'عرض',\n                    'name' => 'الاسم',\n                    'organization-name' => 'اسم المؤسسة',\n                ],\n            ],\n            'view' => [\n                'title' => ':name',\n                'about-person' => 'عن الشخص',\n                'about-organization' => 'حول المؤسسة',\n                'activities' => [\n                    'index' => [\n                        'all' => 'الكل',\n                        'calls' => 'المكالمات',\n                        'meetings' => 'الاجتماعات',\n                        'lunches' => 'الغداء',\n                        'files' => 'الملفات',\n                        'quotes' => 'عروض الأسعار',\n                        'notes' => 'الملاحظات',\n                        'emails' => 'رسائل البريد الإلكتروني',\n                        'by-user' => 'بواسطة :user',\n                        'scheduled-on' => 'مجدول في',\n                        'location' => 'الموقع',\n                        'participants' => 'المشاركون',\n                        'mark-as-done' => 'وضع علامة كمنتهي',\n                        'delete' => 'حذف',\n                        'edit' => 'تعديل',\n                    ],\n                    'actions' => [\n                        'mail' => [\n                            'btn' => 'بريد',\n                            'title' => 'إنشاء بريد',\n                            'to' => 'إلى',\n                            'cc' => 'نسخة',\n                            'bcc' => 'نسخة مخفية',\n                            'subject' => 'الموضوع',\n                            'send-btn' => 'إرسال',\n                            'message' => 'الرسالة',\n                        ],\n                        'file' => [\n                            'btn' => 'ملف',\n                            'title' => 'إضافة ملف',\n                            'title-control' => 'العنوان',\n                            'name' => 'اسم الملف',\n                            'description' => 'الوصف',\n                            'file' => 'الملف',\n                            'save-btn' => 'حفظ الملف',\n                        ],\n                        'note' => [\n                            'btn' => 'ملاحظة',\n                            'title' => 'إضافة ملاحظة',\n                            'comment' => 'التعليق',\n                            'save-btn' => 'حفظ الملاحظة',\n                        ],\n                        'activity' => [\n                            'btn' => 'نشاط',\n                            'title' => 'إضافة نشاط',\n                            'title-control' => 'العنوان',\n                            'description' => 'الوصف',\n                            'schedule-from' => 'مجدول من',\n                            'schedule-to' => 'مجدول إلى',\n                            'location' => 'الموقع',\n                            'call' => 'مكالمة',\n                            'meeting' => 'اجتماع',\n                            'lunch' => 'غداء',\n                            'save-btn' => 'حفظ النشاط',\n                        ],\n                    ],\n                ],\n                'tags' => [\n                    'create-success' => 'تم إنشاء الوسم بنجاح.',\n                    'destroy-success' => 'تم حذف الوسم بنجاح.',\n                ],\n            ],\n            'create' => [\n                'title' => 'إنشاء شخص',\n                'save-btn' => 'حفظ الشخص',\n            ],\n            'edit' => [\n                'title' => 'تعديل الشخص',\n                'save-btn' => 'حفظ الشخص',\n            ],\n        ],\n        'organizations' => [\n            'index' => [\n                'title' => 'المؤسسات',\n                'create-btn' => 'إنشاء مؤسسة',\n                'create-success' => 'تم إنشاء المؤسسة بنجاح.',\n                'update-success' => 'تم تحديث المؤسسة بنجاح.',\n                'delete-success' => 'تم حذف المؤسسة بنجاح.',\n                'delete-failed' => 'لا يمكن حذف المؤسسة.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'edit' => 'تعديل',\n                    'id' => 'المعرف',\n                    'name' => 'الاسم',\n                    'persons-count' => 'عدد الأشخاص',\n                ],\n            ],\n            'create' => [\n                'title' => 'إنشاء مؤسسة',\n                'save-btn' => 'حفظ المؤسسة',\n            ],\n            'edit' => [\n                'title' => 'تعديل المؤسسة',\n                'save-btn' => 'حفظ المؤسسة',\n            ],\n        ],\n    ],\n    'products' => [\n        'index' => [\n            'title' => 'المنتجات',\n            'create-btn' => 'إنشاء منتج',\n            'create-success' => 'تم إنشاء المنتج بنجاح.',\n            'update-success' => 'تم تحديث المنتج بنجاح.',\n            'delete-success' => 'تم حذف المنتج بنجاح.',\n            'delete-failed' => 'لا يمكن حذف المنتج.',\n            'datagrid' => [\n                'allocated' => 'مخصص',\n                'delete' => 'حذف',\n                'edit' => 'تعديل',\n                'id' => 'المعرف',\n                'in-stock' => 'في المخزون',\n                'name' => 'الاسم',\n                'on-hand' => 'متوفر',\n                'tag-name' => 'اسم الوسم',\n                'price' => 'السعر',\n                'sku' => 'رمز المنتج',\n                'view' => 'عرض',\n            ],\n        ],\n        'create' => [\n            'save-btn' => 'حفظ المنتجات',\n            'title' => 'إنشاء منتجات',\n            'general' => 'عام',\n            'price' => 'السعر',\n        ],\n        'edit' => [\n            'title' => 'تعديل المنتجات',\n            'save-btn' => 'حفظ المنتجات',\n            'general' => 'عام',\n            'price' => 'السعر',\n        ],\n        'view' => [\n            'sku' => 'رمز المنتج',\n            'all' => 'الكل',\n            'notes' => 'الملاحظات',\n            'files' => 'الملفات',\n            'inventories' => 'المخزون',\n            'change-logs' => 'سجلات التغيير',\n            'attributes' => [\n                'about-product' => 'عن المنتج',\n            ],\n            'inventory' => [\n                'source' => 'المصدر',\n                'in-stock' => 'في المخزون',\n                'allocated' => 'مخصص',\n                'on-hand' => 'متوفر',\n                'actions' => 'الإجراءات',\n                'assign' => 'تعيين',\n                'add-source' => 'إضافة مصدر',\n                'location' => 'الموقع',\n                'add-more' => 'إضافة المزيد',\n                'save' => 'حفظ',\n            ],\n        ],\n    ],\n    'settings' => [\n        'title' => 'الإعدادات',\n        'groups' => [\n            'index' => [\n                'create-btn' => 'إنشاء مجموعة',\n                'title' => 'المجموعات',\n                'create-success' => 'تم إنشاء المجموعة بنجاح.',\n                'update-success' => 'تم تحديث المجموعة بنجاح.',\n                'destroy-success' => 'تم حذف المجموعة بنجاح.',\n                'delete-failed' => 'لا يمكن حذف المجموعة.',\n                'delete-failed-associated-users' => 'لا يمكن حذف المجموعة لأنها مستخدمة من قبل المستخدمين.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'description' => 'الوصف',\n                    'edit' => 'تعديل',\n                    'id' => 'المعرف',\n                    'name' => 'الاسم',\n                ],\n                'edit' => [\n                    'title' => 'تعديل المجموعة',\n                ],\n                'create' => [\n                    'name' => 'الاسم',\n                    'title' => 'إنشاء مجموعة',\n                    'description' => 'الوصف',\n                    'save-btn' => 'حفظ المجموعة',\n                ],\n            ],\n        ],\n        'roles' => [\n            'index' => [\n                'being-used' => 'لا يمكن حذف الدور، حيث أنه قيد الاستخدام في مستخدم الإدارة.',\n                'create-btn' => 'إنشاء الأدوار',\n                'create-success' => 'تم إنشاء الدور بنجاح.',\n                'current-role-delete-error' => 'لا يمكن حذف الدور المخصص للمستخدم الحالي.',\n                'delete-failed' => 'لا يمكن حذف الدور.',\n                'delete-success' => 'تم حذف الدور بنجاح.',\n                'last-delete-error' => 'مطلوب دور واحد على الأقل.',\n                'settings' => 'الإعدادات',\n                'title' => 'الأدوار',\n                'update-success' => 'تم تحديث الدور بنجاح.',\n                'user-define-error' => 'لا يمكن حذف دور النظام.',\n                'datagrid' => [\n                    'all' => 'الكل',\n                    'custom' => 'مخصص',\n                    'delete' => 'حذف',\n                    'description' => 'الوصف',\n                    'edit' => 'تعديل',\n                    'id' => 'المعرف',\n                    'name' => 'الاسم',\n                    'permission-type' => 'نوع الإذن',\n                ],\n            ],\n            'create' => [\n                'access-control' => 'التحكم في الوصول',\n                'all' => 'الكل',\n                'back-btn' => 'رجوع',\n                'custom' => 'مخصص',\n                'description' => 'الوصف',\n                'general' => 'عام',\n                'name' => 'الاسم',\n                'permissions' => 'الأذونات',\n                'save-btn' => 'حفظ الدور',\n                'title' => 'إنشاء دور',\n            ],\n            'edit' => [\n                'access-control' => 'التحكم في الوصول',\n                'all' => 'الكل',\n                'back-btn' => 'رجوع',\n                'custom' => 'مخصص',\n                'description' => 'الوصف',\n                'general' => 'عام',\n                'name' => 'الاسم',\n                'permissions' => 'الأذونات',\n                'save-btn' => 'حفظ الدور',\n                'title' => 'تعديل الدور',\n            ],\n        ],\n        'types' => [\n            'index' => [\n                'create-btn' => 'إنشاء نوع',\n                'create-success' => 'تم إنشاء النوع بنجاح.',\n                'delete-failed' => 'لا يمكن حذف النوع.',\n                'delete-success' => 'تم حذف النوع بنجاح.',\n                'title' => 'الأنواع',\n                'update-success' => 'تم تحديث النوع بنجاح.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'description' => 'الوصف',\n                    'edit' => 'تعديل',\n                    'id' => 'المعرف',\n                    'name' => 'الاسم',\n                ],\n                'create' => [\n                    'name' => 'الاسم',\n                    'save-btn' => 'حفظ النوع',\n                    'title' => 'إنشاء نوع',\n                ],\n                'edit' => [\n                    'title' => 'تعديل النوع',\n                ],\n            ],\n        ],\n        'sources' => [\n            'index' => [\n                'title' => 'المصادر',\n                'create-btn' => 'إنشاء مصدر',\n                'create-success' => 'تم إنشاء المصدر بنجاح.',\n                'delete-failed' => 'لا يمكن حذف المصدر.',\n                'delete-success' => 'تم حذف المصدر بنجاح.',\n                'update-success' => 'تم تحديث المصدر بنجاح.',\n                'delete-failed-associated-leads' => 'لا يمكن حذف المصدر لأنه مرتبط بعملاء محتملين موجودين. يرجى فصل أو تحديث هؤلاء العملاء قبل الحذف.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'edit' => 'تعديل',\n                    'id' => 'المعرف',\n                    'name' => 'الاسم',\n                ],\n                'create' => [\n                    'name' => 'اسم',\n                    'save-btn' => 'حفظ المصدر',\n                    'title' => 'إنشاء مصدر',\n                ],\n                'edit' => [\n                    'title' => 'تعديل المصدر',\n                ],\n            ],\n        ],\n        'workflows' => [\n            'index' => [\n                'title' => 'سير العمل',\n                'create-btn' => 'إنشاء سير عمل',\n                'create-success' => 'تم إنشاء سير العمل بنجاح.',\n                'update-success' => 'تم تحديث سير العمل بنجاح.',\n                'delete-success' => 'تم حذف سير العمل بنجاح.',\n                'delete-failed' => 'لا يمكن حذف سير العمل.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'description' => 'الوصف',\n                    'edit' => 'تعديل',\n                    'id' => 'المعرف',\n                    'name' => 'الاسم',\n                ],\n            ],\n            'helpers' => [\n                'update-related-leads' => 'تحديث العملاء المحتملين ذوي الصلة',\n                'send-email-to-sales-owner' => 'إرسال بريد إلكتروني إلى مسؤول المبيعات',\n                'send-email-to-participants' => 'إرسال بريد إلكتروني إلى المشاركين',\n                'add-webhook' => 'إضافة Webhook',\n                'update-lead' => 'تحديث العميل المحتمل',\n                'update-person' => 'تحديث الشخص',\n                'send-email-to-person' => 'إرسال بريد إلكتروني إلى الشخص',\n                'add-tag' => 'إضافة علامة',\n                'add-note-as-activity' => 'إضافة ملاحظة كنشاط',\n                'update-quote' => 'تحديث العرض',\n            ],\n            'create' => [\n                'title' => 'إنشاء سير عمل',\n                'event' => 'الحدث',\n                'back-btn' => 'رجوع',\n                'save-btn' => 'حفظ سير العمل',\n                'name' => 'الاسم',\n                'basic-details' => 'التفاصيل الأساسية',\n                'description' => 'الوصف',\n                'actions' => 'الإجراءات',\n                'basic-details-info' => 'ضع المعلومات الأساسية لسير العمل.',\n                'event-info' => 'يقوم الحدث بتشغيل والتحقق من الشروط وتنفيذ الإجراءات المحددة مسبقًا.',\n                'conditions' => 'الشروط',\n                'conditions-info' => 'الشروط هي قواعد تتحقق من السيناريوهات، ويتم تشغيلها في مناسبات محددة.',\n                'actions-info' => 'الإجراء لا يقلل فقط من عبء العمل ولكنه يجعل أتمتة CRM أسهل بكثير',\n                'value' => 'القيمة',\n                'condition-type' => 'نوع الشرط',\n                'all-condition-are-true' => 'جميع الشروط صحيحة',\n                'any-condition-are-true' => 'أي شرط صحيح',\n                'add-condition' => 'إضافة شرط',\n                'add-action' => 'إضافة إجراء',\n                'yes' => 'نعم',\n                'no' => 'لا',\n                'email' => 'البريد الإلكتروني',\n                'is-equal-to' => 'يساوي',\n                'is-not-equal-to' => 'لا يساوي',\n                'equals-or-greater-than' => 'يساوي أو أكبر من',\n                'equals-or-less-than' => 'يساوي أو أقل من',\n                'greater-than' => 'أكبر من',\n                'less-than' => 'أقل من',\n                'type' => 'النوع',\n                'contain' => 'يحتوي',\n                'contains' => 'يحتوي',\n                'does-not-contain' => 'لا يحتوي',\n            ],\n            'edit' => [\n                'title' => 'تعديل سير العمل',\n                'event' => 'الحدث',\n                'back-btn' => 'رجوع',\n                'save-btn' => 'حفظ سير العمل',\n                'name' => 'الاسم',\n                'basic-details' => 'التفاصيل الأساسية',\n                'description' => 'الوصف',\n                'actions' => 'الإجراءات',\n                'type' => 'النوع',\n                'basic-details-info' => 'ضع المعلومات الأساسية لسير العمل.',\n                'event-info' => 'يقوم الحدث بتشغيل والتحقق من الشروط وتنفيذ الإجراءات المحددة مسبقًا.',\n                'conditions' => 'الشروط',\n                'conditions-info' => 'الشروط هي قواعد تتحقق من السيناريوهات، ويتم تشغيلها في مناسبات محددة.',\n                'actions-info' => 'الإجراء لا يقلل فقط من عبء العمل ولكنه يجعل أتمتة CRM أسهل بكثير',\n                'value' => 'القيمة',\n                'condition-type' => 'نوع الشرط',\n                'all-condition-are-true' => 'جميع الشروط صحيحة',\n                'any-condition-are-true' => 'أي شرط صحيح',\n                'add-condition' => 'إضافة شرط',\n                'add-action' => 'إضافة إجراء',\n                'yes' => 'نعم',\n                'no' => 'لا',\n                'email' => 'البريد الإلكتروني',\n                'is-equal-to' => 'يساوي',\n                'is-not-equal-to' => 'لا يساوي',\n                'equals-or-greater-than' => 'يساوي أو أكبر من',\n                'equals-or-less-than' => 'يساوي أو أقل من',\n                'greater-than' => 'أكبر من',\n                'less-than' => 'أقل من',\n                'contain' => 'يحتوي',\n                'contains' => 'يحتوي',\n                'does-not-contain' => 'لا يحتوي',\n            ],\n        ],\n        'webforms' => [\n            'index' => [\n                'title' => 'نماذج الويب',\n                'create-btn' => 'إنشاء نموذج ويب',\n                'create-success' => 'تم إنشاء نموذج الويب بنجاح.',\n                'update-success' => 'تم تحديث نموذج الويب بنجاح.',\n                'delete-success' => 'تم حذف نموذج الويب بنجاح.',\n                'delete-failed' => 'لا يمكن حذف نموذج الويب.',\n                'datagrid' => [\n                    'id' => 'المعرف',\n                    'title' => 'العنوان',\n                    'edit' => 'تعديل',\n                    'delete' => 'حذف',\n                ],\n            ],\n            'create' => [\n                'title' => 'إنشاء استمارة ويب',\n                'add-attribute-btn' => 'زر إضافة سمة',\n                'attribute-label-color' => 'لون تسمية السمة',\n                'attributes' => 'السمات',\n                'attributes-info' => 'أضف سمات مخصصة إلى النموذج.',\n                'background-color' => 'لون الخلفية',\n                'create-lead' => 'إنشاء عميل محتمل',\n                'customize-webform' => 'تخصيص نموذج الويب',\n                'customize-webform-info' => 'خصص نموذج الويب الخاص بك بألوان العناصر التي تختارها.',\n                'description' => 'الوصف',\n                'display-custom-message' => 'عرض رسالة مخصصة',\n                'form-background-color' => 'لون خلفية النموذج',\n                'form-submit-btn-color' => 'لون زر إرسال النموذج',\n                'form-submit-button-color' => 'لون زر إرسال النموذج',\n                'form-title-color' => 'لون عنوان النموذج',\n                'general' => 'عام',\n                'leads' => 'العملاء المحتملون',\n                'person' => 'شخص',\n                'save-btn' => 'حفظ نموذج الويب',\n                'submit-button-label' => 'تسمية زر الإرسال',\n                'submit-success-action' => 'إجراء نجاح الإرسال',\n                'redirect-to-url' => 'إعادة التوجيه إلى الرابط',\n                'choose-value' => 'اختر قيمة',\n                'select-file' => 'اختر ملف',\n                'select-image' => 'اختر صورة',\n                'enter-value' => 'أدخل القيمة',\n            ],\n            'edit' => [\n                'add-attribute-btn' => 'زر إضافة سمة',\n                'attribute-label-color' => 'لون تسمية السمة',\n                'attributes' => 'السمات',\n                'attributes-info' => 'أضف سمات مخصصة إلى النموذج.',\n                'background-color' => 'لون الخلفية',\n                'choose-value' => 'اختر القيمة',\n                'code-snippet' => 'مقتطف الكود',\n                'copied' => 'تم النسخ',\n                'copy' => 'نسخ',\n                'create-lead' => 'إنشاء عميل محتمل',\n                'customize-webform' => 'تخصيص نموذج الويب',\n                'customize-webform-info' => 'خصص نموذج الويب الخاص بك بألوان العناصر التي تختارها.',\n                'description' => 'الوصف',\n                'display-custom-message' => 'عرض رسالة مخصصة',\n                'embed' => 'تضمين',\n                'enter-value' => 'أدخل القيمة',\n                'form-background-color' => 'لون خلفية النموذج',\n                'form-submit-btn-color' => 'لون زر إرسال النموذج',\n                'form-submit-button-color' => 'لون زر إرسال النموذج',\n                'form-title-color' => 'لون عنوان النموذج',\n                'general' => 'عام',\n                'leads' => 'العملاء المحتملون',\n                'person' => 'شخص',\n                'preview' => 'معاينة',\n                'public-url' => 'الرابط العام',\n                'redirect-to-url' => 'إعادة التوجيه إلى الرابط',\n                'save-btn' => 'حفظ نموذج الويب',\n                'select-file' => 'اختر ملف',\n                'select-image' => 'اختر صورة',\n                'submit-button-label' => 'تسمية زر الإرسال',\n                'submit-success-action' => 'إجراء نجاح الإرسال',\n                'title' => 'تعديل استمارة ويب',\n            ],\n        ],\n        'email-template' => [\n            'index' => [\n                'create-btn' => 'إنشاء قالب بريد إلكتروني',\n                'title' => 'قوالب البريد الإلكتروني',\n                'create-success' => 'تم إنشاء قالب البريد الإلكتروني بنجاح.',\n                'update-success' => 'تم تحديث قالب البريد الإلكتروني بنجاح.',\n                'delete-success' => 'تم حذف قالب البريد الإلكتروني بنجاح.',\n                'delete-failed' => 'لا يمكن حذف قالب البريد الإلكتروني.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'edit' => 'تعديل',\n                    'id' => 'المعرف',\n                    'name' => 'الاسم',\n                    'subject' => 'الموضوع',\n                ],\n            ],\n            'create' => [\n                'title' => 'إنشاء قالب بريد إلكتروني',\n                'save-btn' => 'حفظ قالب البريد الإلكتروني',\n                'email-template' => 'قالب البريد الإلكتروني',\n                'subject' => 'الموضوع',\n                'content' => 'المحتوى',\n                'subject-placeholders' => 'العناصر النائبة للموضوع',\n                'general' => 'عام',\n                'name' => 'الاسم',\n            ],\n            'edit' => [\n                'title' => 'تعديل قالب البريد الإلكتروني',\n                'save-btn' => 'حفظ قالب البريد الإلكتروني',\n                'email-template' => 'قالب البريد الإلكتروني',\n                'subject' => 'الموضوع',\n                'content' => 'المحتوى',\n                'subject-placeholders' => 'العناصر النائبة للموضوع',\n                'general' => 'عام',\n                'name' => 'الاسم',\n            ],\n        ],\n        'marketing' => [\n            'events' => [\n                'index' => [\n                    'create-btn' => 'إنشاء حدث',\n                    'title' => 'الأحداث',\n                    'create-success' => 'تم إنشاء الحدث بنجاح.',\n                    'update-success' => 'تم تحديث الحدث بنجاح.',\n                    'delete-success' => 'تم حذف الحدث بنجاح.',\n                    'delete-failed' => 'لا يمكن حذف الحدث.',\n                    'mass-delete-success' => 'تم حذف الأحداث بنجاح',\n                    'delete-failed-associated-campaigns' => 'لا يمكن حذف الحدث لأنه مرتبط بحملات موجودة. يرجى إلغاء ربط أو تحديث تلك الحملات قبل الحذف.',\n                    'datagrid' => [\n                        'delete' => 'حذف',\n                        'edit' => 'تحرير',\n                        'id' => 'المعرف',\n                        'name' => 'الاسم',\n                        'description' => 'الوصف',\n                        'date' => 'التاريخ',\n                    ],\n                    'create' => [\n                        'title' => 'إنشاء حدث',\n                        'name' => 'الاسم',\n                        'date' => 'التاريخ',\n                        'description' => 'الوصف',\n                        'save-btn' => 'حفظ الحدث',\n                    ],\n                    'edit' => [\n                        'title' => 'تحرير الحدث',\n                    ],\n                ],\n            ],\n            'campaigns' => [\n                'index' => [\n                    'create-btn' => 'إنشاء حملة',\n                    'title' => 'الحملات',\n                    'create-success' => 'تم إنشاء الحملة بنجاح.',\n                    'update-success' => 'تم تحديث الحملة بنجاح.',\n                    'delete-success' => 'تم حذف الحملة بنجاح.',\n                    'delete-failed' => 'لا يمكن حذف الحملة.',\n                    'mass-delete-success' => 'تم حذف الحملات بنجاح.',\n                    'datagrid' => [\n                        'id' => 'المعرف',\n                        'name' => 'الاسم',\n                        'subject' => 'الموضوع',\n                        'status' => 'الحالة',\n                        'active' => 'نشط',\n                        'inactive' => 'غير نشط',\n                        'edit' => 'تحرير',\n                        'delete' => 'حذف',\n                    ],\n                    'create' => [\n                        'title' => 'إنشاء حملة',\n                        'name' => 'الاسم',\n                        'type' => 'النوع',\n                        'subject' => 'الموضوع',\n                        'event' => 'الحدث',\n                        'email-template' => 'نموذج البريد الإلكتروني',\n                        'status' => 'الحالة',\n                    ],\n                    'edit' => [\n                        'title' => 'تحرير الحملة',\n                    ],\n                ],\n            ],\n        ],\n        'tags' => [\n            'index' => [\n                'create-btn' => 'إنشاء وسم',\n                'title' => 'الوسوم',\n                'create-success' => 'تم إنشاء الوسم بنجاح.',\n                'update-success' => 'تم تحديث الوسم بنجاح.',\n                'delete-success' => 'تم حذف الوسم بنجاح.',\n                'delete-failed' => 'لا يمكن حذف الوسم.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'edit' => 'تعديل',\n                    'id' => 'المعرف',\n                    'name' => 'الاسم',\n                    'users' => 'المستخدمون',\n                    'created-at' => 'تم الإنشاء في',\n                ],\n                'create' => [\n                    'name' => 'الاسم',\n                    'save-btn' => 'حفظ الوسم',\n                    'title' => 'إنشاء وسم',\n                    'color' => 'اللون',\n                ],\n                'edit' => [\n                    'title' => 'تعديل الوسم',\n                ],\n            ],\n        ],\n        'users' => [\n            'index' => [\n                'create-btn' => 'إنشاء مستخدم',\n                'create-success' => 'تم إنشاء المستخدم بنجاح.',\n                'delete-failed' => 'لا يمكن حذف المستخدم.',\n                'delete-success' => 'تم حذف المستخدم بنجاح.',\n                'last-delete-error' => 'مطلوب مستخدم واحد على الأقل.',\n                'mass-delete-failed' => 'لا يمكن حذف المستخدمين.',\n                'mass-delete-success' => 'تم حذف المستخدمين بنجاح.',\n                'mass-update-failed' => 'لا يمكن تحديث المستخدمين.',\n                'mass-update-success' => 'تم تحديث المستخدمين بنجاح.',\n                'title' => 'المستخدمون',\n                'update-success' => 'تم تحديث المستخدم بنجاح.',\n                'user-define-error' => 'لا يمكن حذف مستخدم النظام.',\n                'active' => 'نشط',\n                'inactive' => 'غير نشط',\n                'datagrid' => [\n                    'active' => 'نشط',\n                    'created-at' => 'تم الإنشاء في',\n                    'delete' => 'حذف',\n                    'edit' => 'تعديل',\n                    'email' => 'البريد الإلكتروني',\n                    'id' => 'المعرف',\n                    'inactive' => 'غير نشط',\n                    'name' => 'الاسم',\n                    'status' => 'الحالة',\n                    'update-status' => 'تحديث الحالة',\n                    'users' => 'المستخدمون',\n                ],\n                'create' => [\n                    'confirm-password' => 'تأكيد كلمة المرور',\n                    'email' => 'البريد الإلكتروني',\n                    'general' => 'عام',\n                    'global' => 'عالمي',\n                    'group' => 'مجموعة',\n                    'individual' => 'فردي',\n                    'name' => 'الاسم',\n                    'password' => 'كلمة المرور',\n                    'permission' => 'الصلاحية',\n                    'role' => 'الدور',\n                    'save-btn' => 'حفظ المستخدم',\n                    'status' => 'الحالة',\n                    'title' => 'إنشاء مستخدم',\n                    'view-permission' => 'عرض الصلاحية',\n                    'select-at-lest-one-group' => 'Select at least one group',\n                ],\n                'edit' => [\n                    'title' => 'تعديل المستخدم',\n                ],\n            ],\n        ],\n        'pipelines' => [\n            'index' => [\n                'title' => 'خطوط الأنابيب',\n                'create-btn' => 'إنشاء خط أنابيب',\n                'create-success' => 'تم إنشاء خط الأنابيب بنجاح.',\n                'update-success' => 'تم تحديث خط الأنابيب بنجاح.',\n                'default-required' => 'مطلوب وجود خط أنابيب افتراضي واحد على الأقل.',\n                'delete-success' => 'تم حذف خط الأنابيب بنجاح.',\n                'delete-failed' => 'لا يمكن حذف خط الأنابيب.',\n                'default-delete-error' => 'لا يمكن حذف خط الأنابيب الافتراضي.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'edit' => 'تعديل',\n                    'id' => 'المعرف',\n                    'is-default' => 'افتراضي',\n                    'name' => 'الاسم',\n                    'no' => 'لا',\n                    'rotten-days' => 'أيام التعفن',\n                    'yes' => 'نعم',\n                ],\n            ],\n            'create' => [\n                'title' => 'إنشاء خط أنابيب',\n                'save-btn' => 'حفظ خط الأنابيب',\n                'name' => 'الاسم',\n                'rotten-days' => 'أيام التعفن',\n                'mark-as-default' => 'تعيين كافتراضي',\n                'general' => 'عام',\n                'probability' => 'الاحتمالية (%)',\n                'new-stage' => 'جديد',\n                'won-stage' => 'فاز',\n                'lost-stage' => 'خسر',\n                'stage-btn' => 'إضافة مرحلة',\n                'stages' => 'المراحل',\n                'duplicate-name' => 'لا يمكن تكرار حقل \"الاسم\"',\n                'delete-stage' => 'حذف المرحلة',\n                'add-new-stages' => 'إضافة مراحل جديدة',\n                'add-stage-info' => 'أضف مرحلة جديدة لخط الأنابيب الخاص بك',\n                'newly-added' => 'تمت الإضافة حديثًا',\n                'stage-delete-success' => 'تم حذف المرحلة بنجاح',\n            ],\n            'edit' => [\n                'title' => 'تعديل خط الأنابيب',\n                'save-btn' => 'حفظ خط الأنابيب',\n                'name' => 'الاسم',\n                'rotten-days' => 'أيام التعفن',\n                'mark-as-default' => 'تعيين كافتراضي',\n                'general' => 'عام',\n                'probability' => 'الاحتمالية (%)',\n                'new-stage' => 'جديد',\n                'won-stage' => 'فاز',\n                'lost-stage' => 'خسر',\n                'stage-btn' => 'إضافة مرحلة',\n                'stages' => 'المراحل',\n                'duplicate-name' => 'لا يمكن تكرار حقل \"الاسم\"',\n                'delete-stage' => 'حذف المرحلة',\n                'add-new-stages' => 'إضافة مراحل جديدة',\n                'add-stage-info' => 'أضف مرحلة جديدة لخط الأنابيب الخاص بك',\n                'stage-delete-success' => 'تم حذف المرحلة بنجاح',\n            ],\n        ],\n        'webhooks' => [\n            'index' => [\n                'title' => 'الويب هوكس',\n                'create-btn' => 'إنشاء ويب هوك',\n                'create-success' => 'تم إنشاء الويب هوك بنجاح.',\n                'update-success' => 'تم تحديث الويب هوك بنجاح.',\n                'delete-success' => 'تم حذف الويب هوك بنجاح.',\n                'delete-failed' => 'لا يمكن حذف الويب هوك.',\n                'datagrid' => [\n                    'id' => 'المعرف',\n                    'delete' => 'حذف',\n                    'edit' => 'تعديل',\n                    'name' => 'الاسم',\n                    'entity-type' => 'نوع الكيان',\n                    'end-point' => 'نقطة النهاية',\n                ],\n            ],\n            'create' => [\n                'title' => 'إنشاء ويب هوك',\n                'save-btn' => 'حفظ الويب هوك',\n                'info' => 'أدخل تفاصيل الويب هوكس',\n                'url-and-parameters' => 'الرابط والمعلمات',\n                'method' => 'الطريقة',\n                'post' => 'إرسال',\n                'put' => 'تحديث',\n                'url-endpoint' => 'نقطة نهاية الرابط',\n                'parameters' => 'المعلمات',\n                'add-new-parameter' => 'إضافة معلمة جديدة',\n                'url-preview' => 'معاينة الرابط:',\n                'headers' => 'الرؤوس',\n                'add-new-header' => 'إضافة رأس جديد',\n                'body' => 'الجسم',\n                'default' => 'افتراضي',\n                'x-www-form-urlencoded' => 'x-www-form-urlencoded',\n                'key-and-value' => 'المفتاح والقيمة',\n                'add-new-payload' => 'إضافة حمولة جديدة',\n                'raw' => 'خام',\n                'general' => 'عام',\n                'name' => 'الاسم',\n                'entity-type' => 'نوع الكيان',\n                'insert-placeholder' => 'إدراج العنصر النائب',\n                'description' => 'الوصف',\n                'json' => 'Json',\n                'text' => 'نص',\n            ],\n            'edit' => [\n                'title' => 'تعديل الويب هوك',\n                'edit-btn' => 'حفظ الويب هوك',\n                'save-btn' => 'حفظ الويب هوك',\n                'info' => 'أدخل تفاصيل الويب هوكس',\n                'url-and-parameters' => 'الرابط والمعلمات',\n                'method' => 'الطريقة',\n                'post' => 'إرسال',\n                'put' => 'تحديث',\n                'url-endpoint' => 'نقطة نهاية الرابط',\n                'parameters' => 'المعلمات',\n                'add-new-parameter' => 'إضافة معلمة جديدة',\n                'url-preview' => 'معاينة الرابط:',\n                'headers' => 'الرؤوس',\n                'add-new-header' => 'إضافة رأس جديد',\n                'body' => 'الجسم',\n                'default' => 'افتراضي',\n                'x-www-form-urlencoded' => 'x-www-form-urlencoded',\n                'key-and-value' => 'المفتاح والقيمة',\n                'add-new-payload' => 'إضافة حمولة جديدة',\n                'raw' => 'خام',\n                'general' => 'عام',\n                'name' => 'الاسم',\n                'entity-type' => 'نوع الكيان',\n                'insert-placeholder' => 'إدراج العنصر النائب',\n                'description' => 'الوصف',\n                'json' => 'Json',\n                'text' => 'نص',\n            ],\n        ],\n        'warehouses' => [\n            'index' => [\n                'title' => 'المستودعات',\n                'create-btn' => 'إنشاء مستودع',\n                'create-success' => 'تم إنشاء المستودع بنجاح.',\n                'name-exists' => 'اسم المستودع موجود بالفعل.',\n                'update-success' => 'تم تحديث المستودع بنجاح.',\n                'delete-success' => 'تم حذف المستودع بنجاح.',\n                'delete-failed' => 'لا يمكن حذف المستودع.',\n                'datagrid' => [\n                    'id' => 'المعرف',\n                    'name' => 'الاسم',\n                    'contact-name' => 'اسم جهة الاتصال',\n                    'delete' => 'حذف',\n                    'edit' => 'تعديل',\n                    'view' => 'عرض',\n                    'created-at' => 'تم الإنشاء في',\n                    'products' => 'المنتجات',\n                    'contact-emails' => 'البريد الإلكتروني للاتصال',\n                    'contact-numbers' => 'أرقام الاتصال',\n                ],\n            ],\n            'create' => [\n                'title' => 'إنشاء مستودع',\n                'save-btn' => 'حفظ المستودع',\n                'contact-info' => 'معلومات الاتصال',\n            ],\n            'edit' => [\n                'title' => 'تعديل المستودع',\n                'save-btn' => 'حفظ المستودع',\n                'contact-info' => 'معلومات الاتصال',\n            ],\n            'view' => [\n                'all' => 'الكل',\n                'notes' => 'الملاحظات',\n                'files' => 'الملفات',\n                'location' => 'الموقع',\n                'change-logs' => 'سجلات التغيير',\n                'locations' => [\n                    'action' => 'إجراء',\n                    'add-location' => 'إضافة موقع',\n                    'create-success' => 'تم إنشاء الموقع بنجاح.',\n                    'delete' => 'حذف',\n                    'delete-failed' => 'لا يمكن حذف الموقع.',\n                    'delete-success' => 'تم حذف الموقع بنجاح.',\n                    'name' => 'الاسم',\n                    'save-btn' => 'حفظ',\n                ],\n                'general-information' => [\n                    'title' => 'معلومات عامة',\n                ],\n                'contact-information' => [\n                    'title' => 'معلومات الاتصال',\n                ],\n            ],\n        ],\n        'attributes' => [\n            'index' => [\n                'title' => 'السمات',\n                'create-btn' => 'إنشاء سمة',\n                'create-success' => 'تم إنشاء السمة بنجاح.',\n                'update-success' => 'تم تحديث السمة بنجاح.',\n                'delete-success' => 'تم حذف السمة بنجاح.',\n                'delete-failed' => 'لا يمكن حذف السمة.',\n                'user-define-error' => 'لا يمكن حذف سمة النظام.',\n                'mass-delete-failed' => 'لا يمكن حذف سمات النظام.',\n                'datagrid' => [\n                    'yes' => 'نعم',\n                    'no' => 'لا',\n                    'id' => 'المعرف',\n                    'code' => 'الرمز',\n                    'name' => 'الاسم',\n                    'entity-type' => 'نوع الكيان',\n                    'type' => 'النوع',\n                    'is-default' => 'افتراضي',\n                    'edit' => 'تعديل',\n                    'delete' => 'حذف',\n                    'entity-types' => [\n                        'leads' => 'العملاء المحتملين',\n                        'organizations' => 'المنظمات',\n                        'persons' => 'الأشخاص',\n                        'products' => 'المنتجات',\n                        'quotes' => 'عروض الأسعار',\n                        'warehouses' => 'المستودعات',\n                    ],\n                    'types' => [\n                        'text' => 'نص',\n                        'textarea' => 'منطقة نصية',\n                        'price' => 'سعر',\n                        'boolean' => 'قيمة منطقية',\n                        'select' => 'قائمة منسدلة',\n                        'multiselect' => 'اختيار متعدد',\n                        'checkbox' => 'مربع اختيار',\n                        'email' => 'بريد إلكتروني',\n                        'address' => 'عنوان',\n                        'phone' => 'هاتف',\n                        'lookup' => 'بحث',\n                        'datetime' => 'تاريخ ووقت',\n                        'date' => 'تاريخ',\n                        'image' => 'صورة',\n                        'file' => 'ملف',\n                    ],\n                ],\n            ],\n            'create' => [\n                'title' => 'إنشاء سمة',\n                'save-btn' => 'حفظ السمة',\n                'code' => 'الرمز',\n                'name' => 'الاسم',\n                'entity-type' => 'نوع الكيان',\n                'type' => 'النوع',\n                'validations' => 'التحققات',\n                'is-required' => 'مطلوب',\n                'input-validation' => 'التحقق من الإدخال',\n                'is-unique' => 'فريد',\n                'labels' => 'التسميات',\n                'general' => 'عام',\n                'numeric' => 'رقمي',\n                'decimal' => 'عشري',\n                'url' => 'رابط',\n                'options' => 'الخيارات',\n                'option-type' => 'نوع الخيار',\n                'lookup-type' => 'نوع البحث',\n                'add-option' => 'إضافة خيار',\n                'save-option' => 'حفظ الخيار',\n                'option-name' => 'اسم الخيار',\n                'add-attribute-options' => 'إضافة خيارات السمة',\n                'text' => 'نص',\n                'textarea' => 'منطقة نص',\n                'price' => 'السعر',\n                'boolean' => 'منطقي',\n                'select' => 'اختيار',\n                'multiselect' => 'اختيار متعدد',\n                'email' => 'بريد إلكتروني',\n                'address' => 'عنوان',\n                'phone' => 'هاتف',\n                'datetime' => 'تاريخ ووقت',\n                'date' => 'تاريخ',\n                'image' => 'صورة',\n                'file' => 'ملف',\n                'lookup' => 'بحث',\n                'entity_type' => 'نوع الكيان',\n                'checkbox' => 'خانة اختيار',\n                'is_required' => 'مطلوب',\n                'is_unique' => 'فريد',\n                'actions' => 'الإجراءات',\n            ],\n            'edit' => [\n                'actions' => 'الإجراءات',\n                'add-attribute-options' => 'إضافة خيارات السمة',\n                'add-option' => 'إضافة خيار',\n                'address' => 'عنوان',\n                'boolean' => 'منطقي',\n                'checkbox' => 'خانة اختيار',\n                'code' => 'الرمز',\n                'date' => 'تاريخ',\n                'datetime' => 'تاريخ ووقت',\n                'decimal' => 'عشري',\n                'email' => 'بريد إلكتروني',\n                'entity-type' => 'نوع الكيان',\n                'entity_type' => 'نوع الكيان',\n                'file' => 'ملف',\n                'general' => 'عام',\n                'image' => 'صورة',\n                'input-validation' => 'التحقق من الإدخال',\n                'is-required' => 'مطلوب',\n                'is-unique' => 'فريد',\n                'is_required' => 'مطلوب',\n                'is_unique' => 'فريد',\n                'labels' => 'التسميات',\n                'lookup' => 'بحث',\n                'lookup-type' => 'نوع البحث',\n                'multiselect' => 'اختيار متعدد',\n                'name' => 'الاسم',\n                'numeric' => 'رقمي',\n                'option-deleted' => 'Attribute Option is deleted successfully',\n                'option-name' => 'اسم الخيار',\n                'option-type' => 'نوع الخيار',\n                'options' => 'الخيارات',\n                'phone' => 'هاتف',\n                'price' => 'السعر',\n                'save-btn' => 'حفظ السمة',\n                'save-option' => 'حفظ الخيار',\n                'select' => 'اختيار',\n                'text' => 'نص',\n                'textarea' => 'منطقة نص',\n                'title' => 'تعديل السمة',\n                'type' => 'النوع',\n                'url' => 'رابط',\n                'validations' => 'التحققات',\n            ],\n        ],\n        'data-transfer' => [\n            'imports' => [\n                'create' => [\n                    'action' => 'إجراء',\n                    'allowed-errors' => 'الأخطاء المسموح بها',\n                    'back-btn' => 'عودة',\n                    'create-update' => 'إنشاء/تحديث',\n                    'delete' => 'حذف',\n                    'download-sample' => 'تنزيل العينة',\n                    'field-separator' => 'فاصل الحقول',\n                    'file' => 'ملف',\n                    'general' => 'عام',\n                    'images-directory' => 'مسار دليل الصور',\n                    'process-in-queue' => 'معالجة في قائمة الانتظار',\n                    'results' => 'النتائج',\n                    'save-btn' => 'حفظ الاستيراد',\n                    'settings' => 'الإعدادات',\n                    'skip-errors' => 'تخطي الأخطاء',\n                    'stop-on-errors' => 'التوقف عند الأخطاء',\n                    'title' => 'إنشاء استيراد',\n                    'type' => 'النوع',\n                    'validation-strategy' => 'استراتيجية التحقق',\n                ],\n                'edit' => [\n                    'action' => 'إجراء',\n                    'allowed-errors' => 'الأخطاء المسموح بها',\n                    'back-btn' => 'عودة',\n                    'create-update' => 'إنشاء/تحديث',\n                    'delete' => 'حذف',\n                    'download-sample' => 'تنزيل العينة',\n                    'field-separator' => 'فاصل الحقول',\n                    'file' => 'ملف',\n                    'general' => 'عام',\n                    'images-directory' => 'مسار دليل الصور',\n                    'process-in-queue' => 'معالجة في قائمة الانتظار',\n                    'results' => 'النتائج',\n                    'save-btn' => 'حفظ الاستيراد',\n                    'settings' => 'الإعدادات',\n                    'skip-errors' => 'تخطي الأخطاء',\n                    'stop-on-errors' => 'التوقف عند الأخطاء',\n                    'title' => 'تحرير الاستيراد',\n                    'type' => 'النوع',\n                    'validation-strategy' => 'استراتيجية التحقق',\n                ],\n                'index' => [\n                    'button-title' => 'إنشاء استيراد',\n                    'title' => 'الاستيرادات',\n                    'datagrid' => [\n                        'actions' => 'الإجراءات',\n                        'completed-at' => 'اكتمل في',\n                        'created' => 'تم الإنشاء',\n                        'delete' => 'حذف',\n                        'deleted' => 'تم الحذف',\n                        'edit' => 'تحرير',\n                        'error-file' => 'ملف الأخطاء',\n                        'id' => 'الرقم التعريفي',\n                        'started-at' => 'بدأ في',\n                        'state' => 'الحالة',\n                        'summary' => 'الملخص',\n                        'type' => 'النوع',\n                        'updated' => 'تم التحديث',\n                        'uploaded-file' => 'الملف المرفوع',\n                    ],\n                ],\n                'import' => [\n                    'back-btn' => 'عودة',\n                    'completed-batches' => 'إجمالي الدفعات المكتملة:',\n                    'download-error-report' => 'تنزيل التقرير الكامل',\n                    'edit-btn' => 'تحرير',\n                    'imported-info' => 'تهانينا! تم استيرادك بنجاح.',\n                    'importing-info' => 'الاستيراد قيد المعالجة',\n                    'indexing-info' => 'تجميع الموارد (الأسعار، المخزون و Elastic Search) جارٍ',\n                    'linking-info' => 'ربط الموارد جارٍ',\n                    'progress' => 'التقدم:',\n                    'title' => 'استيراد',\n                    'total-batches' => 'إجمالي الدفعات:',\n                    'total-created' => 'إجمالي السجلات التي تم إنشاؤها:',\n                    'total-deleted' => 'إجمالي السجلات المحذوفة:',\n                    'total-errors' => 'إجمالي الأخطاء:',\n                    'total-invalid-rows' => 'إجمالي الصفوف غير الصالحة:',\n                    'total-rows-processed' => 'إجمالي الصفوف المعالجة:',\n                    'total-updated' => 'إجمالي السجلات التي تم تحديثها:',\n                    'validate' => 'التحقق',\n                    'validate-info' => 'انقر على التحقق من البيانات لفحص الاستيراد.',\n                    'validating-info' => 'بدأت قراءة البيانات والتحقق منها',\n                    'validation-failed-info' => 'استيرادك غير صالح. يرجى إصلاح الأخطاء التالية والمحاولة مرة أخرى.',\n                    'validation-success-info' => 'استيرادك صالح. انقر على استيراد لبدء عملية الاستيراد.',\n                ],\n                'create-success' => 'تم إنشاء الاستيراد بنجاح.',\n                'delete-failed' => 'فشل حذف الاستيراد بشكل غير متوقع.',\n                'delete-success' => 'تم حذف الاستيراد بنجاح.',\n                'not-valid' => 'الاستيراد غير صالح',\n                'nothing-to-import' => 'لا توجد موارد لاستيرادها.',\n                'setup-queue-error' => 'يرجى تغيير برنامج تشغيل قائمة الانتظار إلى \"قاعدة البيانات\" أو \"ريديس\" لبدء عملية الاستيراد.',\n                'update-success' => 'تم تحديث الاستيراد بنجاح.',\n            ],\n        ],\n    ],\n    'activities' => [\n        'index' => [\n            'title' => 'الأنشطة',\n            'datagrid' => [\n                'comment' => 'تعليق',\n                'created_at' => 'تاريخ الإنشاء',\n                'created_by' => 'تم الإنشاء بواسطة',\n                'edit' => 'تحرير',\n                'id' => 'المعرف',\n                'done' => 'تم',\n                'not-done' => 'لم يتم',\n                'lead' => 'القيادة',\n                'mass-delete' => 'حذف جماعي',\n                'mass-update' => 'تحديث جماعي',\n                'schedule-from' => 'جدولة من',\n                'schedule-to' => 'جدولة إلى',\n                'schedule_from' => 'جدولة من',\n                'schedule_to' => 'جدولة إلى',\n                'title' => 'العنوان',\n                'is_done' => 'تم',\n                'type' => 'النوع',\n                'update' => 'تحديث',\n                'call' => 'مكالمة',\n                'meeting' => 'اجتماع',\n                'lunch' => 'غداء',\n            ],\n        ],\n        'edit' => [\n            'title' => 'تحرير النشاط',\n            'back-btn' => 'رجوع',\n            'save-btn' => 'حفظ النشاط',\n            'type' => 'نوع النشاط',\n            'call' => 'مكالمة',\n            'meeting' => 'اجتماع',\n            'lunch' => 'غداء',\n            'schedule_to' => 'جدولة إلى',\n            'schedule_from' => 'جدولة من',\n            'location' => 'الموقع',\n            'comment' => 'تعليق',\n            'lead' => 'القيادة',\n            'participants' => 'المشاركون',\n            'general' => 'عام',\n            'persons' => 'الأشخاص',\n            'no-result-found' => 'لم يتم العثور على سجلات.',\n            'users' => 'المستخدمون',\n        ],\n        'updated' => 'تم تحديث :attribute',\n        'created' => 'تم الإنشاء',\n        'duration-overlapping' => 'لدى المشاركين اجتماع آخر في هذا الوقت. هل تريد المتابعة؟',\n        'create-success' => 'تم إنشاء النشاط بنجاح.',\n        'update-success' => 'تم تحديث النشاط بنجاح.',\n        'overlapping-error' => 'لدى المشاركين اجتماع آخر في هذا الوقت.',\n        'destroy-success' => 'تم حذف النشاط بنجاح.',\n        'delete-failed' => 'لا يمكن حذف النشاط.',\n        'mass-update-success' => 'تم تحديث الأنشطة بنجاح.',\n        'mass-destroy-success' => 'تم حذف الأنشطة بنجاح.',\n        'mass-delete-failed' => 'لا يمكن حذف الأنشطة.',\n    ],\n    'mail' => [\n        'index' => [\n            'compose' => 'إنشاء',\n            'draft' => 'مسودة',\n            'inbox' => 'الوارد',\n            'outbox' => 'الصادر',\n            'sent' => 'تم الإرسال',\n            'trash' => 'المهملات',\n            'compose-mail-btn' => 'إنشاء بريد',\n            'btn' => 'البريد',\n            'mail' => [\n                'title' => 'إنشاء بريد',\n                'to' => 'إلى',\n                'enter-emails' => 'اضغط على Enter لإضافة البريد الإلكتروني',\n                'cc' => 'نسخة إلى',\n                'bcc' => 'نسخة مخفية إلى',\n                'subject' => 'الموضوع',\n                'send-btn' => 'إرسال',\n                'message' => 'الرسالة',\n                'draft' => 'مسودة',\n            ],\n            'datagrid' => [\n                'id' => 'المعرف',\n                'from' => 'من',\n                'to' => 'إلى',\n                'subject' => 'الموضوع',\n                'tags' => 'العلامات',\n                'content' => 'المحتوى',\n                'attachments' => 'المرفقات',\n                'date' => 'التاريخ',\n                'move-to-inbox' => 'نقل إلى البريد الوارد',\n                'move-to-trash' => 'تم النقل إلى سلة المهملات',\n                'edit' => 'تعديل',\n                'view' => 'عرض',\n                'delete' => 'حذف',\n            ],\n        ],\n\n        'create-success' => 'تم إرسال البريد الإلكتروني بنجاح.',\n        'update-success' => 'تم تحديث البريد الإلكتروني بنجاح.',\n        'mass-update-success' => 'تم تحديث البريد الإلكتروني بنجاح.',\n        'delete-success' => 'تم حذف البريد الإلكتروني بنجاح.',\n        'delete-failed' => 'لا يمكن حذف البريد الإلكتروني.',\n        'invalid-route' => 'مسار غير صالح للبريد.',\n        'unauthorized' => 'هذا الإجراء غير مصرح به.',\n\n        'view' => [\n            'title' => 'الرسائل',\n            'subject' => ':الموضوع',\n            'link-mail' => 'ربط البريد',\n            'to' => 'إلى',\n            'cc' => 'نسخة إلى',\n            'bcc' => 'نسخة مخفية إلى',\n            'reply' => 'رد',\n            'reply-all' => 'رد على الجميع',\n            'forward' => 'إعادة توجيه',\n            'delete' => 'حذف',\n            'enter-mails' => 'أدخل معرف البريد الإلكتروني',\n            'rotten-days' => 'العميل المحتمل مهمل لمدة :days يومًا',\n            'search-an-existing-lead' => 'البحث عن عميل محتمل موجود',\n            'search-an-existing-contact' => 'البحث عن جهة اتصال موجودة',\n            'message' => 'الرسالة',\n            'add-attachments' => 'إضافة مرفقات',\n            'discard' => 'تجاهل',\n            'send' => 'إرسال',\n            'no-result-found' => 'لم يتم العثور على نتائج',\n            'add-new-contact' => 'إضافة جهة اتصال جديدة',\n            'description' => 'الوصف',\n            'search' => 'بحث...',\n            'add-new-lead' => 'إضافة عميل محتمل جديد',\n            'create-new-contact' => 'إنشاء جهة اتصال جديدة',\n            'save-contact' => 'حفظ جهة الاتصال',\n            'create-lead' => 'إنشاء عميل محتمل',\n            'linked-contact' => 'جهة الاتصال المرتبطة',\n            'link-to-contact' => 'ربط بجهة اتصال',\n            'link-to-lead' => 'ربط بالعميل المحتمل',\n            'linked-lead' => 'العميل المحتمل المرتبط',\n            'lead-details' => 'تفاصيل العميل المحتمل',\n            'contact-person' => 'الشخص المسؤول',\n            'product' => 'المنتج',\n            'tags' => [\n                'create-success' => 'تم إنشاء العلامة بنجاح.',\n                'destroy-success' => 'تم حذف العلامة بنجاح.',\n            ],\n        ],\n    ],\n    'common' => [\n        'custom-attributes' => [\n            'add-more' => 'أضف المزيد',\n            'address' => 'العنوان',\n            'city' => 'المدينة',\n            'contact' => 'أرقام الاتصال',\n            'country' => 'الدولة',\n            'email' => 'البريد الإلكتروني',\n            'home' => 'المنزل',\n            'postcode' => 'الرمز البريدي',\n            'save' => 'حفظ',\n            'select' => 'اختر',\n            'select-country' => 'اختر الدولة',\n            'select-state' => 'اختر الولاية',\n            'state' => 'الولاية',\n            'update-contact-title' => 'تحديث أرقام الاتصال',\n            'update-emails-title' => 'تحديث عناوين البريد الإلكتروني',\n            'work' => 'العمل',\n        ],\n    ],\n    'leads' => [\n        'create-success' => 'تم إنشاء العميل المحتمل بنجاح.',\n        'update-success' => 'تم تحديث العميل المحتمل بنجاح.',\n        'update-failed' => 'Leads can not be deleted.',\n        'destroy-success' => 'تم حذف العميل المحتمل بنجاح.',\n        'destroy-failed' => 'لا يمكن حذف العميل المحتمل.',\n        'file' => [\n            'data-not-found' => 'البيانات غير موجودة.',\n            'empty-content' => 'محتوى PDF فارغ أو لم يتم استخراجه.',\n            'failed-extract' => 'فشل في استخراج النص من الملف.',\n            'insufficient-info' => 'بسبب نقص البيانات، لا يمكننا معالجة طلبك في الوقت الحالي.',\n            'invalid-base64' => 'تنسيق base64 غير صالح.',\n            'invalid-format' => 'تنسيق JSON غير صالح.',\n            'invalid-response' => 'تنسيق استجابة الذكاء الاصطناعي غير صالح.',\n            'missing-api-key' => 'مفتاح API أو تكوين النموذج مفقود.',\n            'not-found' => 'الملف غير موجود.',\n            'recursive-call' => 'تم الكشف عن استدعاء متكرر.',\n            'text-generation-failed' => 'فشل استخراج النص. قد يكون الملف فارغًا أو غير قابل للقراءة.',\n        ],\n        'index' => [\n            'title' => 'العملاء المحتملون',\n            'create-btn' => 'إنشاء عميل محتمل',\n            'datagrid' => [\n                'id' => 'ID',\n                'sales-person' => 'مندوب المبيعات',\n                'subject' => 'الموضوع',\n                'source' => 'المصدر',\n                'lead-value' => 'قيمة العميل المحتمل',\n                'lead-type' => 'نوع العميل المحتمل',\n                'tag-name' => 'اسم العلامة',\n                'contact-person' => 'شخص الاتصال',\n                'stage' => 'المرحلة',\n                'rotten-lead' => 'عميل محتمل متعفن',\n                'date-to' => 'تاريخ إلى',\n                'created-at' => 'تم الإنشاء في',\n                'no' => 'لا',\n                'yes' => 'نعم',\n                'delete' => 'حذف',\n                'mass-delete' => 'حذف جماعي',\n                'mass-update' => 'تحديث جماعي',\n            ],\n            'kanban' => [\n                'rotten-days' => 'العميل الفاسد منذ :days أيام',\n                'empty-list' => 'قائمة العملاء الخاصة بك فارغة',\n                'empty-list-description' => 'قم بإنشاء عميل لتنظيم أهدافك.',\n                'create-lead-btn' => 'إنشاء عميل',\n                'columns' => [\n                    'contact-person' => 'شخص الاتصال',\n                    'id' => 'ID',\n                    'lead-type' => 'نوع العميل المحتمل',\n                    'lead-value' => 'قيمة العميل المحتمل',\n                    'sales-person' => 'مندوب المبيعات',\n                    'source' => 'المصدر',\n                    'title' => 'العنوان',\n                    'tags' => 'العلامات',\n                    'expected-close-date' => 'تاريخ الإغلاق المتوقع',\n                    'created-at' => 'تم الإنشاء في',\n                ],\n                'toolbar' => [\n                    'search' => [\n                        'title' => 'البحث حسب العنوان',\n                    ],\n                    'filters' => [\n                        'apply-filters' => 'تطبيق الفلاتر',\n                        'clear-all' => 'مسح الكل',\n                        'filter' => 'تصفية',\n                        'filters' => 'الفلاتر',\n                        'from' => 'من',\n                        'select' => 'اختر',\n                        'to' => 'إلى',\n                    ],\n                ],\n            ],\n            'view-switcher' => [\n                'all-pipelines' => 'كل المسارات',\n                'create-new-pipeline' => 'إنشاء مسار جديد',\n            ],\n            'upload' => [\n                'create-lead' => 'إنشاء عميل محتمل باستخدام الذكاء الاصطناعي',\n                'file' => 'رفع ملف',\n                'file-info' => 'يتم قبول الملفات بتنسيق pdf, bmp, jpg, jpeg, png فقط.',\n                'file-required' => 'يرجى اختيار ملف صالح واحد على الأقل للمتابعة.',\n                'save-btn' => 'حفظ',\n                'upload-file' => 'رفع الملف',\n            ],\n        ],\n        'create' => [\n            'title' => 'إنشاء عميل محتمل',\n            'save-btn' => 'حفظ',\n            'details' => 'التفاصيل',\n            'details-info' => 'ضع المعلومات الأساسية للعميل المحتمل',\n            'contact-person' => 'شخص الاتصال',\n            'contact-info' => 'معلومات عن شخص الاتصال',\n            'products' => 'المنتجات',\n            'products-info' => 'معلومات عن المنتجات',\n        ],\n        'edit' => [\n            'title' => 'تعديل العميل المحتمل',\n            'save-btn' => 'حفظ',\n            'details' => 'التفاصيل',\n            'details-info' => 'ضع المعلومات الأساسية للعميل المحتمل',\n            'contact-person' => 'شخص الاتصال',\n            'contact-info' => 'معلومات عن شخص الاتصال',\n            'products' => 'المنتجات',\n            'products-info' => 'معلومات عن المنتجات',\n        ],\n        'common' => [\n            'contact' => [\n                'name' => 'الاسم',\n                'email' => 'البريد الإلكتروني',\n                'contact-number' => 'رقم الاتصال',\n                'organization' => 'المنظمة',\n            ],\n            'products' => [\n                'product-name' => 'اسم المنتج',\n                'quantity' => 'الكمية',\n                'price' => 'السعر',\n                'amount' => 'المبلغ',\n                'action' => 'الإجراء',\n                'add-more' => 'أضف المزيد',\n                'total' => 'الإجمالي',\n            ],\n        ],\n        'view' => [\n            'title' => 'الفرصة: :title',\n            'rotten-days' => ':days أيام',\n            'tabs' => [\n                'description' => 'الوصف',\n                'products' => 'المنتجات',\n                'quotes' => 'الاقتباسات',\n            ],\n            'attributes' => [\n                'title' => 'حول الفرصة',\n            ],\n            'quotes' => [\n                'subject' => 'الموضوع',\n                'expired-at' => 'تنتهي في',\n                'sub-total' => 'المجموع الفرعي',\n                'discount' => 'الخصم',\n                'tax' => 'الضريبة',\n                'adjustment' => 'التعديل',\n                'grand-total' => 'المجموع الكلي',\n                'delete' => 'حذف',\n                'edit' => 'تعديل',\n                'download' => 'تحميل',\n                'destroy-success' => 'تم حذف العرض بنجاح.',\n                'empty-title' => 'لا توجد عروض',\n                'empty-info' => 'لم يتم العثور على عروض لهذه الفرصة',\n                'add-btn' => 'إضافة عرض',\n            ],\n            'products' => [\n                'product-name' => 'اسم المنتج',\n                'quantity' => 'الكمية',\n                'price' => 'السعر',\n                'amount' => 'المبلغ',\n                'action' => 'الإجراء',\n                'add-more' => 'إضافة المزيد',\n                'total' => 'الإجمالي',\n                'empty-title' => 'لا توجد منتجات',\n                'empty-info' => 'لم يتم العثور على منتجات لهذه الفرصة',\n                'add-product' => 'إضافة منتج',\n            ],\n            'persons' => [\n                'title' => 'حول الأشخاص',\n                'job-title' => ':job_title في :organization',\n            ],\n            'stages' => [\n                'won' => 'ربحت',\n                'lost' => 'خسرت',\n                'need-more-info' => 'تحتاج إلى مزيد من التفاصيل',\n                'closed-at' => 'أغلقت في',\n                'won-value' => 'قيمة الربح',\n                'lost-reason' => 'سبب الخسارة',\n                'save-btn' => 'حفظ',\n            ],\n            'tags' => [\n                'create-success' => 'تم إنشاء العلامة بنجاح.',\n                'destroy-success' => 'تم حذف العلامة بنجاح.',\n            ],\n        ],\n    ],\n    'configuration' => [\n        'index' => [\n            'back' => 'رجوع',\n            'delete' => 'حذف',\n            'save-btn' => 'حفظ التكوين',\n            'save-success' => 'تم حفظ التكوين بنجاح.',\n            'search' => 'بحث',\n            'select-country' => 'اختر الدولة',\n            'select-state' => 'اختر الولاية',\n            'title' => 'التكوين',\n            'general' => [\n                'title' => 'عام',\n                'info' => 'تكوين عام',\n                'general' => [\n                    'title' => 'عام',\n                    'info' => 'قم بتحديث إعداداتك العامة هنا.',\n                    'locale-settings' => [\n                        'title' => 'إعدادات اللغة',\n                        'title-info' => 'تعريف اللغة المستخدمة في واجهة المستخدم، مثل العربية (ar)، الإنجليزية (en)، الإسبانية (es)، الفارسية (fa) والتركية (tr).',\n                    ],\n                    'admin-logo' => [\n                        'logo-image' => 'صورة الشعار',\n                        'title' => 'شعار الإدارة',\n                        'title-info' => 'تكوين صورة الشعار للوحة الإدارة الخاصة بك.',\n                    ],\n                ],\n                'settings' => [\n                    'title' => 'Settings',\n                    'info' => 'Update your settings here.',\n                    'footer' => [\n                        'info' => 'We can configure the powered by section here.',\n                        'powered-by' => 'Powered by text editor',\n                        'title' => 'Powered by Section Configurations',\n                    ],\n                    'menu' => [\n                        'activities' => 'Activities',\n                        'configuration' => 'Configuration',\n                        'contacts' => 'Contacts',\n                        'dashboard' => 'Dashboard',\n                        'draft' => 'Draft',\n                        'inbox' => 'Inbox',\n                        'info' => 'We can configure the menu items name here.',\n                        'leads' => 'Leads',\n                        'mail' => 'Mail',\n                        'organizations' => 'Organizations',\n                        'outbox' => 'Outbox',\n                        'persons' => 'Persons',\n                        'products' => 'Products',\n                        'quotes' => 'Quotes',\n                        'sent' => 'Sent',\n                        'settings' => 'Settings',\n                        'title' => 'Menu Item Configurations',\n                        'trash' => 'Trash',\n                    ],\n                    'menu-color' => [\n                        'brand-color' => 'Brand Color',\n                        'info' => 'We can change the menu items colors here.',\n                        'title' => 'Menu Item Color Configurations',\n                    ],\n                ],\n            ],\n            'email' => [\n                'title' => 'إعدادات البريد الإلكتروني',\n                'info' => 'تكوين البريد الإلكتروني للتطبيق.',\n                'imap' => [\n                    'title' => 'إعدادات IMAP',\n                    'info' => 'تكوين البريد الإلكتروني IMAP لتلقي الرسائل.',\n                    'account' => [\n                        'title' => 'حساب IMAP',\n                        'title-info' => 'قم بتكوين إعدادات حساب IMAP هنا.',\n                        'host' => 'المضيف',\n                        'port' => 'المنفذ',\n                        'encryption' => 'نوع التشفير',\n                        'validate-cert' => 'التحقق من شهادة SSL',\n                        'username' => 'اسم مستخدم IMAP',\n                        'password' => 'كلمة مرور IMAP',\n                    ],\n                ],\n            ],\n            'magic-ai' => [\n                'title' => 'الذكاء الاصطناعي السحري',\n                'info' => 'تكوين الذكاء الاصطناعي السحري للتطبيق.',\n                'settings' => [\n                    'api-key' => 'مفتاح API',\n                    'api-key-info' => 'تذكر استخدام مفتاح API من OpenRouter لكل نموذج. إنها خطوة بسيطة لتعزيز الأمان والأداء.',\n                    'enable' => 'تمكين',\n                    'info' => 'عزز تجربتك مع الذكاء الاصطناعي السحري باستخدام مفتاح API من OpenRouter. قم بدمجه الآن لتجربة ذكاء اصطناعي سلسة ومخصصة لك! قم بتخصيص الإعدادات بسهولة وتحكم في رحلتك مع الذكاء الاصطناعي.',\n                    'other' => 'نموذج آخر',\n                    'other-model' => 'بالنسبة للنماذج الأخرى، استخدم معرف النموذج من OpenRouter.',\n                    'doc-generation' => 'توليد DOC',\n                    'doc-generation-info' => 'قم بتمكين ميزة توليد DOC لاستخراج البيانات تلقائيًا من ملفات DOC وتحويلها إلى تنسيق نصي. عزز إنتاجيتك وكفاءتك من خلال تفعيل هذه الميزة لتبسيط سير عملك.',\n                    'title' => 'الإعدادات العامة',\n                    'models' => [\n                        'deepseek-r1' => 'Deepseek R1 Distill-llama-8b',\n                        'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001',\n                        'gpt-4o' => 'GPT-4.0',\n                        'gpt-4o-mini' => 'GPT-4.0 mini',\n                        'grok-2-1212' => 'Grok 2.12',\n                        'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct',\n                        'title' => 'النماذج',\n                    ],\n                ],\n            ],\n        ],\n    ],\n    'dashboard' => [\n        'index' => [\n            'title' => 'لوحة القيادة',\n            'start-date' => 'Start Date',\n            'end-date' => 'End Date',\n            'revenue' => [\n                'lost-revenue' => 'الإيرادات المفقودة',\n                'won-revenue' => 'الإيرادات المكتسبة',\n            ],\n            'over-all' => [\n                'average-lead-value' => 'متوسط قيمة العملاء المحتملين',\n                'total-leads' => 'إجمالي العملاء المحتملين',\n                'average-leads-per-day' => 'متوسط العملاء المحتملين في اليوم',\n                'total-quotations' => 'إجمالي العروض',\n                'total-persons' => 'إجمالي الأشخاص',\n                'total-organizations' => 'إجمالي المؤسسات',\n            ],\n            'total-leads' => [\n                'title' => 'العملاء المحتملين',\n                'total' => 'إجمالي العملاء المحتملين',\n                'won' => 'العملاء المحتملين المكتسبين',\n                'lost' => 'العملاء المحتملين المفقودين',\n            ],\n            'revenue-by-sources' => [\n                'title' => 'الإيرادات حسب المصادر',\n                'empty-title' => 'لا توجد بيانات متاحة',\n                'empty-info' => 'لا توجد بيانات متاحة للفترة المختارة',\n            ],\n            'revenue-by-types' => [\n                'title' => 'الإيرادات حسب الأنواع',\n                'empty-title' => 'لا توجد بيانات متاحة',\n                'empty-info' => 'لا توجد بيانات متاحة للفترة المختارة',\n            ],\n            'top-selling-products' => [\n                'title' => 'أفضل المنتجات مبيعاً',\n                'empty-title' => 'لم يتم العثور على منتجات',\n                'empty-info' => 'لا توجد منتجات متاحة للفترة المختارة',\n            ],\n            'top-persons' => [\n                'title' => 'أفضل الأشخاص',\n                'empty-title' => 'لم يتم العثور على أشخاص',\n                'empty-info' => 'لا توجد أشخاص متاحة للفترة المختارة',\n            ],\n            'open-leads-by-states' => [\n                'title' => 'العملاء المحتملين المفتوحين حسب المراحل',\n                'empty-title' => 'لا توجد بيانات متاحة',\n                'empty-info' => 'لا توجد بيانات متاحة للفترة المختارة',\n            ],\n        ],\n    ],\n    'layouts' => [\n        'app-version' => 'الإصدار: :version',\n        'dashboard' => 'لوحة القيادة',\n        'leads' => 'العملاء المحتملين',\n        'quotes' => 'العروض',\n        'quote' => 'عرض',\n        'mail' => [\n            'title' => 'البريد',\n            'compose' => 'إنشاء رسالة',\n            'inbox' => 'البريد الوارد',\n            'draft' => 'المسودات',\n            'outbox' => 'الصادر',\n            'sent' => 'المرسل',\n            'trash' => 'سلة المهملات',\n            'setting' => 'الإعدادات',\n        ],\n        'activities' => 'الأنشطة',\n        'contacts' => 'جهات الاتصال',\n        'persons' => 'الأشخاص',\n        'person' => 'شخص',\n        'organizations' => 'المؤسسات',\n        'organization' => 'مؤسسة',\n        'products' => 'المنتجات',\n        'product' => 'منتج',\n        'settings' => 'الإعدادات',\n        'user' => 'المستخدم',\n        'user-info' => 'إدارة جميع مستخدميك وصلاحياتهم في نظام CRM، وما يُسمح لهم بفعله.',\n        'groups' => 'المجموعات',\n        'groups-info' => 'إضافة أو تعديل أو حذف المجموعات من نظام CRM',\n        'roles' => 'الأدوار',\n        'role' => 'دور',\n        'roles-info' => 'إضافة أو تعديل أو حذف الأدوار من نظام CRM',\n        'users' => 'المستخدمين',\n        'users-info' => 'إضافة أو تعديل أو حذف المستخدمين من نظام CRM',\n        'lead' => 'عميل محتمل',\n        'lead-info' => 'إدارة جميع إعدادات العملاء المحتملين الخاصة بك في نظام CRM',\n        'pipelines' => 'الأنابيب',\n        'pipelines-info' => 'إضافة أو تعديل أو حذف الأنابيب من نظام CRM',\n        'sources' => 'المصادر',\n        'sources-info' => 'إضافة أو تعديل أو حذف المصادر من نظام CRM',\n        'types' => 'الأنواع',\n        'types-info' => 'إضافة أو تعديل أو حذف الأنواع من نظام CRM',\n        'automation' => 'الأتمتة',\n        'automation-info' => 'إدارة جميع إعدادات الأتمتة الخاصة بك في نظام CRM',\n        'attributes' => 'الخصائص',\n        'attribute' => 'خاصية',\n        'attributes-info' => 'إضافة أو تعديل أو حذف الخصائص من نظام CRM',\n        'email-templates' => 'قوالب البريد الإلكتروني',\n        'email' => 'البريد الإلكتروني',\n        'email-templates-info' => 'إضافة أو تعديل أو حذف قوالب البريد الإلكتروني من نظام CRM',\n        'events' => 'الفعاليات',\n        'events-info' => 'إضافة، تعديل أو حذف الفعاليات من إدارة العلاقات',\n        'campaigns' => 'الحملات',\n        'campaigns-info' => 'إضافة، تعديل أو حذف الحملات من إدارة العلاقات',\n        'workflows' => 'سير العمل',\n        'workflows-info' => 'إضافة أو تعديل أو حذف سير العمل من نظام CRM',\n        'webhooks' => 'الويب هوك',\n        'webhooks-info' => 'إضافة، تحرير أو حذف الويب هوك من CRM',\n        'other-settings' => 'إعدادات أخرى',\n        'other-settings-info' => 'إدارة جميع إعداداتك الإضافية في نظام CRM',\n        'tags' => 'العلامات',\n        'tags-info' => 'إضافة أو تعديل أو حذف العلامات من نظام CRM',\n        'my-account' => 'حسابي',\n        'sign-out' => 'تسجيل الخروج',\n        'back' => 'رجوع',\n        'name' => 'الاسم',\n        'configuration' => 'الإعدادات',\n        'howdy' => 'مرحبا!',\n        'warehouses' => 'المستودعات',\n        'warehouse' => 'مستودع',\n        'warehouses-info' => 'إضافة أو تعديل أو حذف المستودعات من نظام CRM',\n        'inventory' => 'المخزون',\n        'inventory-info' => 'إدارة جميع إعدادات المخزون المتعلقة في نظام إدارة علاقات العملاء (CRM)',\n        'data_transfer' => 'نقل البيانات',\n        'data_transfer_info' => 'إدارة إعدادات نقل البيانات المتعلقة بالأشخاص والمنتجات والعملاء المحتملين في إدارة علاقات العملاء (CRM)',\n    ],\n    'user' => [\n        'account' => [\n            'name' => 'الاسم',\n            'email' => 'البريد الإلكتروني',\n            'password' => 'كلمة المرور',\n            'my_account' => 'حسابي',\n            'update_details' => 'تحديث التفاصيل',\n            'current_password' => 'كلمة المرور الحالية',\n            'confirm_password' => 'تأكيد كلمة المرور',\n            'password-match' => 'كلمة المرور الحالية لا تطابق.',\n            'account-save' => 'تم حفظ تغييرات الحساب بنجاح.',\n            'permission-denied' => 'تم رفض الإذن',\n            'remove-image' => 'إزالة الصورة',\n            'upload_image_pix' => 'تحميل صورة الملف الشخصي (100 بكسل × 100 بكسل)',\n            'upload_image_format' => 'بصيغة PNG أو JPG',\n            'image_upload_message' => 'فقط الصور (.jpeg، .jpg، .png، ..) مسموح بها.',\n        ],\n    ],\n    'emails' => [\n        'common' => [\n            'dear' => 'عزيزي :name',\n            'cheers' => 'مع أطيب التحيات،</br>فريق :app_name',\n            'user' => [\n                'dear' => 'عزيزي :username',\n                'create-subject' => 'تم إضافتك كعضو.',\n                'create-body' => 'تهانينا! أنت الآن عضو في فريقنا.',\n                'forget-password' => [\n                    'subject' => 'إعادة تعيين كلمة مرور العميل',\n                    'dear' => 'عزيزي :username',\n                    'reset-password' => 'إعادة تعيين كلمة المرور',\n                    'info' => 'تتلقى هذا البريد الإلكتروني لأننا تلقينا طلب إعادة تعيين كلمة المرور لحسابك',\n                    'final-summary' => 'إذا لم تكن قد طلبت إعادة تعيين كلمة المرور، فلا يلزم اتخاذ أي إجراء إضافي',\n                    'thanks' => 'شكراً!',\n                ],\n            ],\n        ],\n    ],\n    'validations' => [\n        'message' => [\n            'decimal' => ':attribute يجب أن يكون رقمًا عشريًا.',\n        ],\n    ],\n    'errors' => [\n        'dashboard' => 'لوحة التحكم',\n        'go-back' => 'العودة',\n        'support' => 'إذا استمرت المشكلة، تواصل معنا على <a href=\":link\" class=\":class\">:email</a> للحصول على المساعدة.',\n        '404' => [\n            'description' => 'عذرًا! الصفحة التي تبحث عنها في إجازة. يبدو أننا لم نجد ما كنت تبحث عنه.',\n            'title' => '404 الصفحة غير موجودة',\n        ],\n        '401' => [\n            'description' => 'عذرًا! يبدو أنك غير مصرح لك بالوصول إلى هذه الصفحة. يبدو أنك تفتقد الأوراق اللازمة.',\n            'title' => '401 غير مصرح',\n        ],\n        '403' => [\n            'description' => 'عذرًا! هذه الصفحة محظورة. يبدو أنك لا تملك الأذونات اللازمة لعرض هذا المحتوى.',\n            'title' => '403 ممنوع الدخول',\n        ],\n        '500' => [\n            'description' => 'عذرًا! حدث خطأ ما. يبدو أننا نواجه مشكلة في تحميل الصفحة التي تبحث عنها.',\n            'title' => '500 خطأ داخلي في الخادم',\n        ],\n        '503' => [\n            'description' => 'عذرًا! يبدو أننا متوقفون مؤقتًا للصيانة. يرجى العودة لاحقًا.',\n            'title' => '503 الخدمة غير متوفرة',\n        ],\n    ],\n    'export' => [\n        'csv' => 'CSV',\n        'download' => 'تحميل',\n        'export' => 'تصدير',\n        'no-records' => 'لا توجد سجلات للتصدير',\n        'xls' => 'XLS',\n        'xlsx' => 'XLSX',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/lang/en/app.php",
    "content": "<?php\n\nreturn [\n    'acl' => [\n        'leads' => 'Leads',\n        'lead' => 'Lead',\n        'quotes' => 'Quotes',\n        'mail' => 'Mail',\n        'inbox' => 'Inbox',\n        'draft' => 'Draft',\n        'outbox' => 'Outbox',\n        'sent' => 'Sent',\n        'trash' => 'Trash',\n        'activities' => 'Activities',\n        'webhook' => 'Webhook',\n        'contacts' => 'Contacts',\n        'persons' => 'Persons',\n        'organizations' => 'Organizations',\n        'products' => 'Products',\n        'settings' => 'Settings',\n        'groups' => 'Groups',\n        'roles' => 'Roles',\n        'users' => 'Users',\n        'user' => 'User',\n        'automation' => 'Automation',\n        'attributes' => 'Attributes',\n        'pipelines' => 'Pipelines',\n        'sources' => 'Sources',\n        'types' => 'Types',\n        'email-templates' => 'Email Templates',\n        'workflows' => 'Workflows',\n        'other-settings' => 'Other Settings',\n        'tags' => 'Tags',\n        'configuration' => 'Configuration',\n        'create' => 'Create',\n        'edit' => 'Edit',\n        'view' => 'View',\n        'print' => 'Print',\n        'delete' => 'Delete',\n        'export' => 'Export',\n        'mass-delete' => 'Mass Delete',\n        'data-transfer' => 'Data Transfer',\n        'imports' => 'Imports',\n        'import' => 'Import',\n        'event' => 'Event',\n        'campaigns' => 'Campaigns',\n        'warehouses' => 'Warehouses',\n        'inventory' => 'Inventory',\n    ],\n\n    'users' => [\n        'activate-warning' => 'Your account is not activated yet. Please contact the administrator.',\n        'login-error' => 'The credentials do not match our records.',\n        'not-permission' => 'You do not have permission to access the admin panel.',\n\n        'login' => [\n            'email' => 'Email Address',\n            'forget-password-link' => 'Forget Password ?',\n            'password' => 'Password',\n            'submit-btn' => 'Sign In',\n            'title' => 'Sign In',\n        ],\n\n        'forget-password' => [\n            'create' => [\n                'email' => 'Registered Email',\n                'email-not-exist' => 'Email Not Exists',\n                'page-title' => 'Forget Password',\n                'reset-link-sent' => 'Reset Password link sent',\n                'sign-in-link' => 'Back to Sign In ?',\n                'submit-btn' => 'Reset',\n                'title' => 'Recover Password',\n            ],\n        ],\n\n        'reset-password' => [\n            'back-link-title' => 'Back to Sign In ?',\n            'confirm-password' => 'Confirm Password',\n            'email' => 'Registered Email',\n            'password' => 'Password',\n            'submit-btn' => 'Reset Password',\n            'title' => 'Reset Password',\n        ],\n    ],\n\n    'account' => [\n        'edit' => [\n            'back-btn' => 'Back',\n            'change-password' => 'Change Password',\n            'confirm-password' => 'Confirm Password',\n            'current-password' => 'Current Password',\n            'email' => 'Email',\n            'general' => 'General',\n            'invalid-password' => 'The current password you entered is incorrect.',\n            'name' => 'Name',\n            'password' => 'Password',\n            'profile-image' => 'Profile Image',\n            'save-btn' => 'Save Account',\n            'title' => 'My Account',\n            'update-success' => 'Account updated successfully',\n            'upload-image-info' => 'Upload a Profile Image (110px X 110px) in PNG or JPG Format',\n        ],\n    ],\n\n    'components' => [\n        'activities' => [\n            'actions' => [\n                'mail' => [\n                    'btn' => 'Mail',\n                    'title' => 'Compose Mail',\n                    'to' => 'To',\n                    'enter-emails' => 'Press enter to add emails',\n                    'cc' => 'CC',\n                    'bcc' => 'BCC',\n                    'subject' => 'Subject',\n                    'send-btn' => 'Send',\n                    'message' => 'Message',\n                ],\n\n                'file' => [\n                    'btn' => 'File',\n                    'title' => 'Add File',\n                    'title-control' => 'Title',\n                    'name' => 'Name',\n                    'description' => 'Description',\n                    'file' => 'File',\n                    'save-btn' => 'Save File',\n                ],\n\n                'note' => [\n                    'btn' => 'Note',\n                    'title' => 'Add Note',\n                    'comment' => 'Comment',\n                    'save-btn' => 'Save Note',\n                ],\n\n                'activity' => [\n                    'btn' => 'Activity',\n                    'title' => 'Add Activity',\n                    'title-control' => 'Title',\n                    'description' => 'Description',\n                    'schedule-from' => 'Schedule From',\n                    'schedule-to' => 'Schedule To',\n                    'location' => 'Location',\n                    'call' => 'Call',\n                    'meeting' => 'Meeting',\n                    'lunch' => 'Lunch',\n                    'save-btn' => 'Save Activity',\n\n                    'participants' => [\n                        'title' => 'Participants',\n                        'placeholder' => 'Type to search participants',\n                        'users' => 'Users',\n                        'persons' => 'Persons',\n                        'no-results' => 'No result found...',\n                    ],\n                ],\n            ],\n\n            'index' => [\n                'all' => 'All',\n                'bcc' => 'Bcc',\n                'by-user' => 'By :user',\n                'calls' => 'Calls',\n                'cc' => 'Cc',\n                'change-log' => 'Changelogs',\n                'delete' => 'Delete',\n                'edit' => 'Edit',\n                'emails' => 'Emails',\n                'empty' => 'Empty',\n                'files' => 'Files',\n                'from' => 'From',\n                'location' => 'Location',\n                'lunches' => 'Lunches',\n                'mark-as-done' => 'Mark as Done',\n                'meetings' => 'Meetings',\n                'notes' => 'Notes',\n                'participants' => 'Participants',\n                'planned' => 'Planned',\n                'quotes' => 'Quotes',\n                'scheduled-on' => 'Scheduled on',\n                'system' => 'System',\n                'to' => 'To',\n                'unlink' => 'Unlink',\n                'view' => 'View',\n\n                'empty-placeholders' => [\n                    'all' => [\n                        'title' => 'No Activities Found',\n                        'description' => 'No activities found for this. You can add activities by clicking on the Activity button on the left panel.',\n                    ],\n\n                    'planned' => [\n                        'title' => 'No Planned Activities Found',\n                        'description' => 'No planned activities found for this. You can add planned activities by clicking on the Activity button on the left panel.',\n                    ],\n\n                    'notes' => [\n                        'title' => 'No Notes Found',\n                        'description' => 'No notes found for this. You can add notes by clicking on the Note button on the left panel.',\n                    ],\n\n                    'calls' => [\n                        'title' => 'No Calls Found',\n                        'description' => 'No calls found for this. You can add calls by clicking on the Activity button on the left panel and selecting the Call type.',\n                    ],\n\n                    'meetings' => [\n                        'title' => 'No Meetings Found',\n                        'description' => 'No meetings found for this. You can add meetings by clicking on the Activity button on the left panel and selecting the Meeting type.',\n                    ],\n\n                    'lunches' => [\n                        'title' => 'No Lunches Found',\n                        'description' => 'No lunches found for this. You can add lunches by clicking on the Activity button on the left panel and selecting the Lunch type.',\n                    ],\n\n                    'files' => [\n                        'title' => 'No Files Found',\n                        'description' => 'No files found for this. You can add files by clicking on the File button on the left panel.',\n                    ],\n\n                    'emails' => [\n                        'title' => 'No Emails Found',\n                        'description' => 'No emails found for this. You can add emails by clicking on the Mail button on the left panel.',\n                    ],\n\n                    'system' => [\n                        'title' => 'No Changelogs Found',\n                        'description' => 'No changelogs found for this.',\n                    ],\n                ],\n            ],\n        ],\n\n        'media' => [\n            'images' => [\n                'add-image-btn' => 'Add Image',\n                'ai-add-image-btn' => 'Magic AI',\n                'allowed-types' => 'png, jpeg, jpg',\n                'not-allowed-error' => 'Only images files (.jpeg, .jpg, .png, ..) are allowed.',\n\n                'placeholders' => [\n                    'front' => 'Front',\n                    'next' => 'Next',\n                    'size' => 'Size',\n                    'use-cases' => 'Use Cases',\n                    'zoom' => 'Zoom',\n                ],\n            ],\n\n            'videos' => [\n                'add-video-btn' => 'Add Video',\n                'allowed-types' => 'mp4, webm, mkv',\n                'not-allowed-error' => 'Only videos files (.mp4, .mov, .ogg ..) are allowed.',\n            ],\n        ],\n\n        'datagrid' => [\n            'index' => [\n                'no-records-selected' => 'No records have been selected.',\n                'must-select-a-mass-action-option' => 'You must select a mass action\\'s option.',\n                'must-select-a-mass-action' => 'You must select a mass action.',\n            ],\n\n            'toolbar' => [\n                'length-of' => ':length of',\n                'of' => 'of',\n                'per-page' => 'Per Page',\n                'results' => ':total Results',\n                'delete' => 'Delete',\n                'selected' => ':total Items Selected',\n\n                'mass-actions' => [\n                    'submit' => 'Submit',\n                    'select-option' => 'Select Option',\n                    'select-action' => 'Select Action',\n                ],\n\n                'filter' => [\n                    'apply-filters-btn' => 'Apply Filters',\n                    'back-btn' => 'Back',\n                    'create-new-filter' => 'Create New Filter',\n                    'custom-filters' => 'Custom Filters',\n                    'delete-error' => 'Something went wrong while deleting the filter, please try again.',\n                    'delete-success' => 'Filter has been deleted successfully.',\n                    'empty-description' => 'There is no selected filters available to save. Please select filters to save.',\n                    'empty-title' => 'Add Filters to Save',\n                    'name' => 'Name',\n                    'quick-filters' => 'Quick Filters',\n                    'save-btn' => 'Save',\n                    'save-filter' => 'Save Filter',\n                    'saved-success' => 'Filter has been saved successfully.',\n                    'selected-filters' => 'Selected Filters',\n                    'title' => 'Filter',\n                    'update' => 'Update',\n                    'update-filter' => 'Update Filter',\n                    'updated-success' => 'Filter has been updated successfully.',\n                ],\n\n                'search' => [\n                    'title' => 'Search',\n                ],\n            ],\n\n            'filters' => [\n                'select' => 'Select',\n                'title' => 'Filters',\n\n                'dropdown' => [\n                    'searchable' => [\n                        'at-least-two-chars' => 'Type at least 2 characters...',\n                        'no-results' => 'No result found...',\n                    ],\n                ],\n\n                'custom-filters' => [\n                    'clear-all' => 'Clear All',\n                    'title' => 'Custom Filters',\n                ],\n\n                'boolean-options' => [\n                    'false' => 'False',\n                    'true' => 'True',\n                ],\n\n                'date-options' => [\n                    'last-month' => 'Last Month',\n                    'last-six-months' => 'Last 6 Months',\n                    'last-three-months' => 'Last 3 Months',\n                    'this-month' => 'This Month',\n                    'this-week' => 'This Week',\n                    'this-year' => 'This Year',\n                    'today' => 'Today',\n                    'yesterday' => 'Yesterday',\n                ],\n            ],\n\n            'table' => [\n                'actions' => 'Actions',\n                'no-records-available' => 'No Records Available.',\n            ],\n        ],\n\n        'modal' => [\n            'confirm' => [\n                'agree-btn' => 'Agree',\n                'disagree-btn' => 'Disagree',\n                'message' => 'Are you sure you want to perform this action?',\n                'title' => 'Are you sure?',\n            ],\n        ],\n\n        'tags' => [\n            'index' => [\n                'title' => 'Tags',\n                'added-tags' => 'Added Tags',\n                'save-btn' => 'Save Tag',\n                'placeholder' => 'Type to search tags',\n                'add-tag' => 'Add \\\":term\\\"...',\n                'aquarelle-red' => 'Aquarelle Red',\n                'crushed-cashew' => 'Crushed Cashew',\n                'beeswax' => 'Beeswax',\n                'lemon-chiffon' => 'Lemon Chiffon',\n                'snow-flurry' => 'Snow Flurry',\n                'honeydew' => 'Honeydew',\n            ],\n        ],\n\n        'layouts' => [\n            'powered-by' => [\n                'description' => 'Powered by :krayin, an open-source project by :webkul.',\n            ],\n\n            'header' => [\n                'mega-search' => [\n                    'title' => 'Mega Search',\n\n                    'tabs' => [\n                        'leads' => 'Leads',\n                        'quotes' => 'Quotes',\n                        'persons' => 'Persons',\n                        'products' => 'Products',\n                    ],\n\n                    'explore-all-products' => 'Explore all Products',\n                    'explore-all-leads' => 'Explore all Leads',\n                    'explore-all-contacts' => 'Explore all Contacts',\n                    'explore-all-quotes' => 'Explore all Quotes',\n                    'explore-all-matching-products' => 'Explore all products matching \":query\" (:count)',\n                    'explore-all-matching-leads' => 'Explore all leads matching \":query\" (:count)',\n                    'explore-all-matching-contacts' => 'Explore all contacts matching \":query\" (:count)',\n                    'explore-all-matching-quotes' => 'Explore all quotes matching \":query\" (:count)',\n                ],\n            ],\n        ],\n\n        'attributes' => [\n            'edit' => [\n                'delete' => 'Delete',\n            ],\n\n            'lookup' => [\n                'click-to-add' => 'Click to add',\n                'search' => 'Search',\n                'no-result-found' => 'No result found',\n                'search' => 'Search...',\n            ],\n        ],\n\n        'lookup' => [\n            'click-to-add' => 'Click to Add',\n            'no-results' => 'No Results Found',\n            'add-as-new' => 'Add as New',\n            'search' => 'Search...',\n        ],\n\n        'flash-group' => [\n            'success' => 'Success',\n            'error' => 'Error',\n            'warning' => 'Warning',\n            'info' => 'Info',\n        ],\n\n        'tiny-mce' => [\n            'http-error' => 'HTTP Error',\n            'invalid-json' => 'Invalid JSON response from the server.',\n            'upload-failed' => 'File upload failed. Please try again.',\n        ],\n    ],\n\n    'quotes' => [\n        'index' => [\n            'title' => 'Quotes',\n            'create-btn' => 'Create Quote',\n            'create-success' => 'Quote created successfully.',\n            'update-success' => 'Quote updated successfully.',\n            'delete-success' => 'Quote deleted successfully.',\n            'delete-failed' => 'Quote can not be deleted.',\n\n            'datagrid' => [\n                'subject' => 'Subject',\n                'sales-person' => 'Sales Person',\n                'expired-at' => 'Expired At',\n                'created-at' => 'Created At',\n                'person' => 'Person',\n                'subtotal' => 'Subtotal',\n                'discount' => 'Discount',\n                'tax' => 'Tax',\n                'adjustment' => 'Adjustment',\n                'grand-total' => 'Grand Total',\n                'edit' => 'Edit',\n                'delete' => 'Delete',\n                'print' => 'Print',\n            ],\n\n            'pdf' => [\n                'adjustment' => 'Adjustment',\n                'amount' => 'Amount',\n                'billing-address' => 'Billing Address',\n                'date' => 'Date',\n                'discount' => 'Discount',\n                'expired-at' => 'Expired At',\n                'grand-total' => 'Grand Total',\n                'person' => 'Person',\n                'price' => 'Price',\n                'product-name' => 'Product Name',\n                'quantity' => 'Quantity',\n                'quote-id' => 'Quote ID',\n                'sales-person' => 'Sales Person',\n                'shipping-address' => 'Shipping Address',\n                'sku' => 'SKU',\n                'sub-total' => 'Sub Total',\n                'subject' => 'Subject',\n                'tax' => 'Tax',\n                'title' => 'Quote',\n            ],\n        ],\n\n        'create' => [\n            'title' => 'Create Quote',\n            'save-btn' => 'Save Quote',\n            'quote-info' => 'Quote Information',\n            'quote-info-info' => 'Put the basic information of the quote.',\n            'address-info' => 'Address Information',\n            'address-info-info' => 'Information about the address related to quote.',\n            'quote-items' => 'Quote Items',\n            'search-products' => 'Search Products',\n            'link-to-lead' => 'Link to lead',\n            'quote-item-info' => 'Add Product Request for this quote.',\n            'quote-name' => 'Quote name',\n            'quantity' => 'Quantity',\n            'price' => 'Price',\n            'discount' => 'Discount',\n            'tax' => 'Tax',\n            'total' => 'Total',\n            'amount' => 'Amount',\n            'add-item' => '+ Add Item',\n            'sub-total' => 'Sub Total (:symbol)',\n            'total-discount' => 'Discount (:symbol)',\n            'total-tax' => 'Tax (:symbol)',\n            'total-adjustment' => 'Adjustment (:symbol)',\n            'grand-total' => 'Grand Total (:symbol)',\n            'discount-amount' => 'Discount amount',\n            'tax-amount' => 'Tax amount',\n            'adjustment-amount' => 'Adjustment amount',\n            'product-name' => 'Product Name',\n            'action' => 'Action',\n        ],\n\n        'edit' => [\n            'title' => 'Edit Quote',\n            'save-btn' => 'Save Quote',\n            'quote-info' => 'Quote Information',\n            'quote-info-info' => 'Put the basic information of the quote.',\n            'address-info' => 'Address Information',\n            'address-info-info' => 'Information about the address related to quote.',\n            'quote-items' => 'Quote Items',\n            'link-to-lead' => 'Link to lead',\n            'quote-item-info' => 'Add Product Request for this quote.',\n            'quote-name' => 'Quote name',\n            'quantity' => 'Quantity',\n            'price' => 'Price',\n            'search-products' => 'Search Products',\n            'discount' => 'Discount',\n            'tax' => 'Tax',\n            'total' => 'Total',\n            'amount' => 'Amount',\n            'add-item' => '+ Add Item',\n            'sub-total' => 'Sub Total (:symbol)',\n            'total-discount' => 'Discount (:symbol)',\n            'total-tax' => 'Tax (:symbol)',\n            'total-adjustment' => 'Adjustment (:symbol)',\n            'grand-total' => 'Grand Total (:symbol)',\n            'discount-amount' => 'Discount amount',\n            'tax-amount' => 'Tax amount',\n            'adjustment-amount' => 'Adjustment amount',\n            'product-name' => 'Product Name',\n            'action' => 'Action',\n        ],\n    ],\n\n    'contacts' => [\n        'persons' => [\n            'index' => [\n                'title' => 'Persons',\n                'create-btn' => 'Create Person',\n                'create-success' => 'Person created successfully.',\n                'update-success' => 'Person updated successfully.',\n                'all-delete-success' => 'All selected persons were deleted successfully.',\n                'partial-delete-warning' => 'Some persons were deleted successfully. Others could not be deleted because they are linked to leads.',\n                'none-delete-warning' => 'None of the selected persons could be deleted because they are linked to leads.',\n                'no-selection' => 'No persons were selected for deletion.',\n                'delete-failed' => 'Failed to delete selected persons.',\n\n                'datagrid' => [\n                    'contact-numbers' => 'Contact Numbers',\n                    'delete' => 'Delete',\n                    'edit' => 'Edit',\n                    'emails' => 'Emails',\n                    'id' => 'ID',\n                    'view' => 'View',\n                    'name' => 'Name',\n                    'organization-name' => 'Organization Name',\n                ],\n            ],\n\n            'view' => [\n                'title' => ':name',\n                'about-person' => 'About Person',\n                'about-organization' => 'About Organization',\n\n                'activities' => [\n                    'index' => [\n                        'all' => 'All',\n                        'calls' => 'Calls',\n                        'meetings' => 'Meetings',\n                        'lunches' => 'Lunches',\n                        'files' => 'Files',\n                        'quotes' => 'Quotes',\n                        'notes' => 'Notes',\n                        'emails' => 'Emails',\n                        'by-user' => 'By :user',\n                        'scheduled-on' => 'Scheduled on',\n                        'location' => 'Location',\n                        'participants' => 'Participants',\n                        'mark-as-done' => 'Mark as Done',\n                        'delete' => 'Delete',\n                        'edit' => 'Edit',\n                    ],\n\n                    'actions' => [\n                        'mail' => [\n                            'btn' => 'Mail',\n                            'title' => 'Compose Mail',\n                            'to' => 'To',\n                            'cc' => 'CC',\n                            'bcc' => 'BCC',\n                            'subject' => 'Subject',\n                            'send-btn' => 'Send',\n                            'message' => 'Message',\n                        ],\n\n                        'file' => [\n                            'btn' => 'File',\n                            'title' => 'Add File',\n                            'title-control' => 'Title',\n                            'name' => 'File Name',\n                            'description' => 'Description',\n                            'file' => 'File',\n                            'save-btn' => 'Save File',\n                        ],\n\n                        'note' => [\n                            'btn' => 'Note',\n                            'title' => 'Add Note',\n                            'comment' => 'Comment',\n                            'save-btn' => 'Save Note',\n                        ],\n\n                        'activity' => [\n                            'btn' => 'Activity',\n                            'title' => 'Add Activity',\n                            'title-control' => 'Title',\n                            'description' => 'Description',\n                            'schedule-from' => 'Schedule From',\n                            'schedule-to' => 'Schedule To',\n                            'location' => 'Location',\n                            'call' => 'Call',\n                            'meeting' => 'Meeting',\n                            'lunch' => 'Lunch',\n                            'save-btn' => 'Save Activity',\n                        ],\n                    ],\n                ],\n\n                'tags' => [\n                    'create-success' => 'Tag created successfully.',\n                    'destroy-success' => 'Tag deleted successfully.',\n                ],\n            ],\n\n            'create' => [\n                'title' => 'Create Person',\n                'save-btn' => 'Save Person',\n            ],\n\n            'edit' => [\n                'title' => 'Edit Person',\n                'save-btn' => 'Save Person',\n            ],\n        ],\n\n        'organizations' => [\n            'index' => [\n                'title' => 'Organizations',\n                'create-btn' => 'Create Organization',\n                'create-success' => 'Organization created successfully.',\n                'update-success' => 'Organization updated successfully.',\n                'delete-success' => 'Organization deleted successfully.',\n                'delete-failed' => 'Organization can not be deleted.',\n\n                'datagrid' => [\n                    'delete' => 'Delete',\n                    'edit' => 'Edit',\n                    'id' => 'ID',\n                    'name' => 'Name',\n                    'persons-count' => 'Person Count',\n                ],\n            ],\n\n            'create' => [\n                'title' => 'Create Organization',\n                'save-btn' => 'Save Organization',\n            ],\n\n            'edit' => [\n                'title' => 'Edit Organization',\n                'save-btn' => 'Save Organization',\n            ],\n        ],\n    ],\n\n    'products' => [\n        'index' => [\n            'title' => 'Products',\n            'create-btn' => 'Create Product',\n            'create-success' => 'Product created successfully.',\n            'update-success' => 'Product updated successfully.',\n            'delete-success' => 'Product deleted successfully.',\n            'delete-failed' => 'Product can not be deleted.',\n\n            'datagrid' => [\n                'allocated' => 'Allocated',\n                'delete' => 'Delete',\n                'edit' => 'Edit',\n                'id' => 'ID',\n                'in-stock' => 'In Stock',\n                'name' => 'Name',\n                'on-hand' => 'On Hand',\n                'tag-name' => 'Tag Name',\n                'price' => 'Price',\n                'sku' => 'SKU',\n                'view' => 'View',\n            ],\n        ],\n\n        'create' => [\n            'save-btn' => 'Save Products',\n            'title' => 'Create Products',\n            'general' => 'General',\n            'price' => 'Price',\n        ],\n\n        'edit' => [\n            'title' => 'Edit Products',\n            'save-btn' => 'Save Products',\n            'general' => 'General',\n            'price' => 'Price',\n        ],\n\n        'view' => [\n            'sku' => 'SKU',\n            'all' => 'All',\n            'notes' => 'Notes',\n            'files' => 'Files',\n            'inventories' => 'Inventory',\n            'change-logs' => 'Changelogs',\n\n            'attributes' => [\n                'about-product' => 'About Product',\n            ],\n\n            'inventory' => [\n                'source' => 'Source',\n                'in-stock' => 'In Stock',\n                'allocated' => 'Allocated',\n                'on-hand' => 'On Hand',\n                'actions' => 'Actions',\n                'assign' => 'Assign',\n                'add-source' => 'Add Source',\n                'location' => 'Location',\n                'add-more' => 'Add More',\n                'save' => 'Save',\n            ],\n        ],\n    ],\n\n    'settings' => [\n        'title' => 'Settings',\n\n        'groups' => [\n            'index' => [\n                'create-btn' => 'Create Group',\n                'title' => 'Groups',\n                'create-success' => 'Group created successfully.',\n                'update-success' => 'Group updated successfully.',\n                'destroy-success' => 'Group deleted successfully.',\n                'delete-failed' => 'Group can not be deleted.',\n                'delete-failed-associated-users' => 'Group can not be deleted, as this is being used by users.',\n\n                'datagrid' => [\n                    'delete' => 'Delete',\n                    'description' => 'Description',\n                    'edit' => 'Edit',\n                    'id' => 'ID',\n                    'name' => 'Name',\n                ],\n\n                'edit' => [\n                    'title' => 'Edit Group',\n                ],\n\n                'create' => [\n                    'name' => 'Name',\n                    'title' => 'Create Group',\n                    'description' => 'Description',\n                    'save-btn' => 'Save Group',\n                ],\n            ],\n        ],\n\n        'roles' => [\n            'index' => [\n                'being-used' => 'Role can not be deleted, as this is being used in admin user.',\n                'create-btn' => 'Create Roles',\n                'create-success' => 'Role created successfully.',\n                'current-role-delete-error' => 'Can not delete role assigned to the current user.',\n                'delete-failed' => 'Role can not be deleted.',\n                'delete-success' => 'Role deleted successfully.',\n                'last-delete-error' => 'At least one role is required.',\n                'settings' => 'Settings',\n                'title' => 'Roles',\n                'update-success' => 'Role updated successfully.',\n                'user-define-error' => 'Can not delete system role.',\n\n                'datagrid' => [\n                    'all' => 'All',\n                    'custom' => 'Custom',\n                    'delete' => 'Delete',\n                    'description' => 'Description',\n                    'edit' => 'Edit',\n                    'id' => 'ID',\n                    'name' => 'Name',\n                    'permission-type' => 'Permission Type',\n                ],\n            ],\n\n            'create' => [\n                'access-control' => 'Access Control',\n                'all' => 'All',\n                'back-btn' => 'Back',\n                'custom' => 'Custom',\n                'description' => 'Description',\n                'general' => 'General',\n                'name' => 'Name',\n                'permissions' => 'Permissions',\n                'save-btn' => 'Save Role',\n                'title' => 'Create Role',\n            ],\n\n            'edit' => [\n                'access-control' => 'Access Control',\n                'all' => 'All',\n                'back-btn' => 'Back',\n                'custom' => 'Custom',\n                'description' => 'Description',\n                'general' => 'General',\n                'name' => 'Name',\n                'permissions' => 'Permissions',\n                'save-btn' => 'Save Role',\n                'title' => 'Edit Role',\n            ],\n        ],\n\n        'types' => [\n            'index' => [\n                'create-btn' => 'Create Type',\n                'create-success' => 'Type created successfully.',\n                'delete-failed' => 'Type can not be deleted.',\n                'delete-success' => 'Type deleted successfully.',\n                'title' => 'Types',\n                'update-success' => 'Type updated successfully.',\n\n                'datagrid' => [\n                    'delete' => 'Delete',\n                    'description' => 'Description',\n                    'edit' => 'Edit',\n                    'id' => 'ID',\n                    'name' => 'Name',\n                ],\n\n                'create' => [\n                    'name' => 'Name',\n                    'save-btn' => 'Save Type',\n                    'title' => 'Create Type',\n                ],\n\n                'edit' => [\n                    'title' => 'Edit Type',\n                ],\n            ],\n        ],\n\n        'sources' => [\n            'index' => [\n                'title' => 'Sources',\n                'create-btn' => 'Create Source',\n                'create-success' => 'Source created successfully.',\n                'delete-failed' => 'Source can not be deleted.',\n                'delete-success' => 'Source deleted successfully.',\n                'update-success' => 'Source updated successfully.',\n                'delete-failed-associated-leads' => 'Source cannot be deleted because it is associated with existing leads. Please detach or update those leads before deletion.',\n\n                'datagrid' => [\n                    'delete' => 'Delete',\n                    'edit' => 'Edit',\n                    'id' => 'ID',\n                    'name' => 'Name',\n                ],\n\n                'create' => [\n                    'name' => 'Name',\n                    'save-btn' => 'Save Source',\n                    'title' => 'Create Source',\n                ],\n\n                'edit' => [\n                    'title' => 'Edit Source',\n                ],\n            ],\n        ],\n\n        'workflows' => [\n            'index' => [\n                'title' => 'Workflows',\n                'create-btn' => 'Create Workflow',\n                'create-success' => 'Workflow created successfully.',\n                'update-success' => 'Workflow updated successfully.',\n                'delete-success' => 'Workflow deleted successfully.',\n                'delete-failed' => 'Workflow can not be deleted.',\n                'datagrid' => [\n                    'delete' => 'Delete',\n                    'description' => 'Description',\n                    'edit' => 'Edit',\n                    'id' => 'ID',\n                    'name' => 'Name',\n                ],\n            ],\n\n            'helpers' => [\n                'update-related-leads' => 'Update related leads',\n                'send-email-to-sales-owner' => 'Send email to sales owner',\n                'send-email-to-participants' => 'Send email to participants',\n                'add-webhook' => 'Add Webhook',\n                'update-lead' => 'Update Lead',\n                'update-person' => 'Update Person',\n                'send-email-to-person' => 'Send email to person',\n                'add-tag' => 'Add Tag',\n                'add-note-as-activity' => 'Add Note as Activity',\n                'update-quote' => 'Update Quote',\n            ],\n\n            'create' => [\n                'title' => 'Create Workflow',\n                'event' => 'Event',\n                'back-btn' => 'Back',\n                'save-btn' => 'Save Workflow',\n                'name' => 'Name',\n                'basic-details' => 'Basic Details',\n                'description' => 'Description',\n                'actions' => 'Actions',\n                'basic-details-info' => 'Put the basic information of the workflow.',\n                'event-info' => 'An event triggers, checks, conditions, and performs predefined actions.',\n                'conditions' => 'Conditions',\n                'conditions-info' => 'Conditions are rules checking scenarios, triggered on specific occasions.',\n                'actions-info' => 'An action not only reduces the workload but also make it quite easier for CRM automation',\n                'value' => 'Value',\n                'condition-type' => 'Condition Type',\n                'all-condition-are-true' => 'All condition are true',\n                'any-condition-are-true' => 'Any condition are true',\n                'add-condition' => 'Add Condition',\n                'add-action' => 'Add Action',\n                'yes' => 'Yes',\n                'no' => 'No',\n                'email' => 'Email',\n                'is-equal-to' => 'Is equal to',\n                'is-not-equal-to' => 'Is not equal to',\n                'equals-or-greater-than' => 'Equals or greater than',\n                'equals-or-less-than' => 'Equals or less than',\n                'greater-than' => 'Greater than',\n                'less-than' => 'Less than',\n                'type' => 'Type',\n                'contain' => 'Contain',\n                'contains' => 'Contains',\n                'does-not-contain' => 'Does not contain',\n            ],\n\n            'edit' => [\n                'title' => 'Edit Workflow',\n                'event' => 'Event',\n                'back-btn' => 'Back',\n                'save-btn' => 'Save Workflow',\n                'name' => 'Name',\n                'basic-details' => 'Basic Details',\n                'description' => 'Description',\n                'actions' => 'Actions',\n                'type' => 'Type',\n                'basic-details-info' => 'Put the basic information of the workflow.',\n                'event-info' => 'An event triggers, checks, conditions, and performs predefined actions.',\n                'conditions' => 'Conditions',\n                'conditions-info' => 'Conditions are rules checking scenarios, triggered on specific occasions.',\n                'actions-info' => 'An action not only reduces the workload but also make it quite easier for CRM automation',\n                'value' => 'Value',\n                'condition-type' => 'Condition Type',\n                'all-condition-are-true' => 'All condition are true',\n                'any-condition-are-true' => 'Any condition are true',\n                'add-condition' => 'Add Condition',\n                'add-action' => 'Add Action',\n                'yes' => 'Yes',\n                'no' => 'No',\n                'email' => 'Email',\n                'is-equal-to' => 'Is equal to',\n                'is-not-equal-to' => 'Is not equal to',\n                'equals-or-greater-than' => 'Equals or greater than',\n                'equals-or-less-than' => 'Equals or less than',\n                'greater-than' => 'Greater than',\n                'less-than' => 'Less than',\n                'contain' => 'Contain',\n                'contains' => 'Contains',\n                'does-not-contain' => 'Does not contain',\n            ],\n        ],\n\n        'webforms' => [\n            'index' => [\n                'title' => 'Webforms',\n                'create-btn' => 'Create Webform',\n                'create-success' => 'Webform created successfully.',\n                'update-success' => 'Webform updated successfully.',\n                'delete-success' => 'Webform deleted successfully.',\n                'delete-failed' => 'Webform can not be deleted.',\n\n                'datagrid' => [\n                    'id' => 'ID',\n                    'title' => 'Title',\n                    'edit' => 'Edit',\n                    'delete' => 'Delete',\n                ],\n            ],\n\n            'create' => [\n                'title' => 'Create Webform',\n                'add-attribute-btn' => 'Add Attribute Button',\n                'attribute-label-color' => 'Attribute Label Color',\n                'attributes' => 'Attributes',\n                'attributes-info' => 'Add custom attributes to the form.',\n                'background-color' => 'Background Color',\n                'create-lead' => 'Create Lead',\n                'customize-webform' => 'Customize Webform',\n                'customize-webform-info' => 'Customize your web form with element colors of your choosing.',\n                'description' => 'Description',\n                'display-custom-message' => 'Display custom message',\n                'form-background-color' => 'Form Background Color',\n                'form-submit-btn-color' => 'Form Submit Button Color',\n                'form-submit-button-color' => 'Form Submit Button Color',\n                'form-title-color' => 'Form Title Color',\n                'general' => 'General',\n                'leads' => 'Leads',\n                'person' => 'Person',\n                'save-btn' => 'Save Webform',\n                'submit-button-label' => 'Submit Button Label',\n                'submit-success-action' => 'Submit Success Action',\n                'redirect-to-url' => 'Redirect To Url',\n                'choose-value' => 'Choose Value',\n                'select-file' => 'Select File',\n                'select-image' => 'Select Image',\n                'enter-value' => 'Enter Value',\n            ],\n\n            'edit' => [\n                'add-attribute-btn' => 'Add Attribute Button',\n                'attribute-label-color' => 'Attribute Label Color',\n                'attributes' => 'Attributes',\n                'attributes-info' => 'Add custom attributes to the form.',\n                'background-color' => 'Background Color',\n                'choose-value' => 'Choose Value',\n                'code-snippet' => 'Code Snippet',\n                'copied' => 'Copied',\n                'copy' => 'Copy',\n                'create-lead' => 'Create Lead',\n                'customize-webform' => 'Customize Webform',\n                'customize-webform-info' => 'Customize your web form with element colors of your choosing.',\n                'description' => 'Description',\n                'display-custom-message' => 'Display custom message',\n                'embed' => 'Embed',\n                'enter-value' => 'Enter Value',\n                'form-background-color' => 'Form Background Color',\n                'form-submit-btn-color' => 'Form Submit Button Color',\n                'form-submit-button-color' => 'Form Submit Button Color',\n                'form-title-color' => 'Form Title Color',\n                'general' => 'General',\n                'leads' => 'Leads',\n                'person' => 'Person',\n                'preview' => 'Preview',\n                'public-url' => 'Public URL',\n                'redirect-to-url' => 'Redirect To URL',\n                'save-btn' => 'Save Webform',\n                'select-file' => 'Select File',\n                'select-image' => 'Select Image',\n                'submit-button-label' => 'Submit Button Label',\n                'submit-success-action' => 'Submit Success Action',\n                'title' => 'Edit Webform',\n            ],\n        ],\n\n        'email-template' => [\n            'index' => [\n                'create-btn' => 'Create Email Template',\n                'title' => 'Email Templates',\n                'create-success' => 'Email Template created successfully.',\n                'update-success' => 'Email Template updated successfully.',\n                'delete-success' => 'Email Template deleted successfully.',\n                'delete-failed' => 'Email Template can not be deleted.',\n\n                'datagrid' => [\n                    'delete' => 'Delete',\n                    'edit' => 'Edit',\n                    'id' => 'ID',\n                    'name' => 'Name',\n                    'subject' => 'Subject',\n                ],\n            ],\n\n            'create' => [\n                'title' => 'Create Email Template',\n                'save-btn' => 'Save Email Template',\n                'email-template' => 'Email Template',\n                'subject' => 'Subject',\n                'content' => 'Content',\n                'subject-placeholders' => 'Subject Placeholders',\n                'general' => 'General',\n                'name' => 'Name',\n            ],\n\n            'edit' => [\n                'title' => 'Edit Email Template',\n                'save-btn' => 'Save Email Template',\n                'email-template' => 'Email Template',\n                'subject' => 'Subject',\n                'content' => 'Content',\n                'subject-placeholders' => 'Subject Placeholders',\n                'general' => 'General',\n                'name' => 'Name',\n            ],\n        ],\n\n        'marketing' => [\n            'events' => [\n                'index' => [\n                    'create-btn' => 'Create Event',\n                    'title' => 'Events',\n                    'create-success' => 'Event created successfully.',\n                    'update-success' => 'Event updated successfully.',\n                    'delete-success' => 'Event deleted successfully.',\n                    'delete-failed' => 'Event can not be deleted.',\n                    'mass-delete-success' => 'Events deleted successfully',\n                    'delete-failed-associated-campaigns' => 'Event can not be deleted as it is associated with existing campaigns. Please detach or update those campaigns before deletion.',\n\n                    'datagrid' => [\n                        'delete' => 'Delete',\n                        'edit' => 'Edit',\n                        'id' => 'ID',\n                        'name' => 'Name',\n                        'description' => 'Description',\n                        'date' => 'Date',\n                    ],\n\n                    'create' => [\n                        'title' => 'Create Event',\n                        'name' => 'Name',\n                        'date' => 'Date',\n                        'description' => 'Description',\n                        'save-btn' => 'Save Event',\n                    ],\n\n                    'edit' => [\n                        'title' => 'Edit Event',\n                    ],\n                ],\n            ],\n\n            'campaigns' => [\n                'index' => [\n                    'create-btn' => 'Create Campaigns',\n                    'title' => 'Campaigns',\n                    'create-success' => 'Campaign created successfully.',\n                    'update-success' => 'Campaign updated successfully.',\n                    'delete-success' => 'Campaign deleted successfully.',\n                    'delete-failed' => 'Campaign can not be deleted.',\n                    'mass-delete-success' => 'Campaigns deleted successfully.',\n\n                    'datagrid' => [\n                        'id' => 'ID',\n                        'name' => 'Name',\n                        'subject' => 'Subject',\n                        'status' => 'Status',\n                        'active' => 'Active',\n                        'inactive' => 'Inactive',\n                        'edit' => 'Edit',\n                        'delete' => 'Delete',\n                    ],\n\n                    'create' => [\n                        'title' => 'Create Campaign',\n                        'name' => 'Name',\n                        'type' => 'Type',\n                        'subject' => 'Subject',\n                        'event' => 'Event',\n                        'email-template' => 'Email Template',\n                        'status' => 'Status',\n                    ],\n\n                    'edit' => [\n                        'title' => 'Edit Campaign',\n                    ],\n                ],\n            ],\n        ],\n\n        'tags' => [\n            'index' => [\n                'create-btn' => 'Create Tag',\n                'title' => 'Tags',\n                'create-success' => 'Tag created successfully.',\n                'update-success' => 'Tag updated successfully.',\n                'delete-success' => 'Tag deleted successfully.',\n                'delete-failed' => 'Tag can not be deleted.',\n\n                'datagrid' => [\n                    'delete' => 'Delete',\n                    'edit' => 'Edit',\n                    'id' => 'ID',\n                    'name' => 'Name',\n                    'users' => 'Users',\n                    'created-at' => 'Created At',\n                ],\n\n                'create' => [\n                    'name' => 'Name',\n                    'save-btn' => 'Save Tag',\n                    'title' => 'Create Tag',\n                    'color' => 'Color',\n                ],\n\n                'edit' => [\n                    'title' => 'Edit Tag',\n                ],\n            ],\n        ],\n\n        'users' => [\n            'index' => [\n                'create-btn' => 'Create User',\n                'create-success' => 'User created successfully.',\n                'delete-failed' => 'User can not be deleted.',\n                'delete-success' => 'User deleted successfully.',\n                'last-delete-error' => 'At least one user is required.',\n                'mass-delete-failed' => 'Users can not be deleted.',\n                'mass-delete-success' => 'Users deleted successfully.',\n                'mass-update-failed' => 'Users can not be updated.',\n                'mass-update-success' => 'Users updated successfully.',\n                'title' => 'Users',\n                'update-success' => 'User updated successfully.',\n                'user-define-error' => 'Can not delete system user.',\n                'active' => 'Active',\n                'inactive' => 'Inactive',\n\n                'datagrid' => [\n                    'active' => 'Active',\n                    'created-at' => 'Created At',\n                    'delete' => 'Delete',\n                    'edit' => 'Edit',\n                    'email' => 'Email',\n                    'id' => 'ID',\n                    'inactive' => 'Inactive',\n                    'name' => 'Name',\n                    'status' => 'Status',\n                    'update-status' => 'Update Status',\n                    'users' => 'Users',\n                ],\n\n                'create' => [\n                    'confirm-password' => 'Confirm Password',\n                    'email' => 'Email',\n                    'general' => 'General',\n                    'global' => 'Global',\n                    'group' => 'Group',\n                    'individual' => 'Individual',\n                    'name' => 'Name',\n                    'password' => 'Password',\n                    'permission' => 'Permission',\n                    'role' => 'Role',\n                    'save-btn' => 'Save User',\n                    'status' => 'Status',\n                    'title' => 'Create User',\n                    'view-permission' => 'View Permission',\n                    'select-at-lest-one-group' => 'Select at least one group',\n                ],\n\n                'edit' => [\n                    'title' => 'Edit User',\n                ],\n            ],\n        ],\n\n        'pipelines' => [\n            'index' => [\n                'title' => 'Pipelines',\n                'create-btn' => 'Create Pipeline',\n                'create-success' => 'Pipeline created successfully.',\n                'update-success' => 'Pipeline updated successfully.',\n                'default-required' => 'At least one default pipeline is required.',\n                'delete-success' => 'Pipeline deleted successfully.',\n                'delete-failed' => 'Pipeline can not be deleted.',\n                'default-delete-error' => 'Default pipeline can not be deleted.',\n\n                'datagrid' => [\n                    'delete' => 'Delete',\n                    'edit' => 'Edit',\n                    'id' => 'ID',\n                    'is-default' => 'Is Default',\n                    'name' => 'Name',\n                    'no' => 'No',\n                    'rotten-days' => 'Rotten Days',\n                    'yes' => 'Yes',\n                ],\n            ],\n\n            'create' => [\n                'title' => 'Create Pipeline',\n                'save-btn' => 'Save Pipeline',\n                'name' => 'Name',\n                'rotten-days' => 'Rotten Days',\n                'mark-as-default' => 'Mark as Default',\n                'general' => 'General',\n                'probability' => 'Probability(%)',\n                'new-stage' => 'New',\n                'won-stage' => 'Won',\n                'lost-stage' => 'Lost',\n                'stage-btn' => 'Add Stage',\n                'stages' => 'Stages',\n                'duplicate-name' => 'The \"Name\" field cannot be duplicate',\n                'delete-stage' => 'Delete Stage',\n                'add-new-stages' => 'Add New Stages',\n                'add-stage-info' => 'Add new stage for your Pipeline',\n                'newly-added' => 'Newly Added',\n                'stage-delete-success' => 'Stage Deleted Successfully',\n            ],\n\n            'edit' => [\n                'title' => 'Edit Pipeline',\n                'save-btn' => 'Save Pipeline',\n                'name' => 'Name',\n                'rotten-days' => 'Rotten Days',\n                'mark-as-default' => 'Mark as Default',\n                'general' => 'General',\n                'probability' => 'Probability(%)',\n                'new-stage' => 'New',\n                'won-stage' => 'Won',\n                'lost-stage' => 'Lost',\n                'stage-btn' => 'Add Stage',\n                'stages' => 'Stages',\n                'duplicate-name' => 'The \"Name\" field cannot be duplicate',\n                'delete-stage' => 'Delete Stage',\n                'add-new-stages' => 'Add New Stages',\n                'add-stage-info' => 'Add new stage for your Pipeline',\n                'stage-delete-success' => 'Stage Deleted Successfully',\n            ],\n        ],\n\n        'webhooks' => [\n            'index' => [\n                'title' => 'Webhooks',\n                'create-btn' => 'Create Webhook',\n                'create-success' => 'Webhook created successfully.',\n                'update-success' => 'Webhook updated successfully.',\n                'delete-success' => 'Webhook deleted successfully.',\n                'delete-failed' => 'Webhook can not be deleted.',\n\n                'datagrid' => [\n                    'id' => 'ID',\n                    'delete' => 'Delete',\n                    'edit' => 'Edit',\n                    'name' => 'Name',\n                    'entity-type' => 'Entity Type',\n                    'end-point' => 'End Point',\n                ],\n            ],\n\n            'create' => [\n                'title' => 'Create Webhook',\n                'save-btn' => 'Save Webhook',\n                'info' => 'Enter the details of webhooks',\n                'url-and-parameters' => 'URL And Parameters',\n                'method' => 'Method',\n                'post' => 'Post',\n                'put' => 'Put',\n                'url-endpoint' => 'Url Endpoint',\n                'parameters' => 'Parameters',\n                'add-new-parameter' => 'Add New Parameter',\n                'url-preview' => 'Url Preview:',\n                'headers' => 'Headers',\n                'add-new-header' => 'Add New Header',\n                'body' => 'Body',\n                'default' => 'Default',\n                'x-www-form-urlencoded' => 'x-www-form-urlencoded',\n                'key-and-value' => 'Key and Value',\n                'add-new-payload' => 'Add new payload',\n                'raw' => 'Raw',\n                'general' => 'General',\n                'name' => 'Name',\n                'entity-type' => 'Entity Type',\n                'insert-placeholder' => 'Insert Placeholder',\n                'description' => 'Description',\n                'json' => 'Json',\n                'text' => 'Text',\n            ],\n\n            'edit' => [\n                'title' => 'Edit Webhook',\n                'edit-btn' => 'Save Webhook',\n                'save-btn' => 'Save Webhook',\n                'info' => 'Enter the details of webhooks',\n                'url-and-parameters' => 'URL And Parameters',\n                'method' => 'Method',\n                'post' => 'Post',\n                'put' => 'Put',\n                'url-endpoint' => 'Url Endpoint',\n                'parameters' => 'Parameters',\n                'add-new-parameter' => 'Add New Parameter',\n                'url-preview' => 'Url Preview:',\n                'headers' => 'Headers',\n                'add-new-header' => 'Add New Header',\n                'body' => 'Body',\n                'default' => 'Default',\n                'x-www-form-urlencoded' => 'x-www-form-urlencoded',\n                'key-and-value' => 'Key and Value',\n                'add-new-payload' => 'Add new payload',\n                'raw' => 'Raw',\n                'general' => 'General',\n                'name' => 'Name',\n                'entity-type' => 'Entity Type',\n                'insert-placeholder' => 'Insert Placeholder',\n                'description' => 'Description',\n                'json' => 'Json',\n                'text' => 'Text',\n            ],\n        ],\n\n        'warehouses' => [\n            'index' => [\n                'title' => 'Warehouses',\n                'create-btn' => 'Create Warehouse',\n                'create-success' => 'Warehouse created successfully.',\n                'name-exists' => 'Warehouse name already exists.',\n                'update-success' => 'Warehouse updated successfully.',\n                'delete-success' => 'Warehouse deleted successfully.',\n                'delete-failed' => 'Warehouse can not be deleted.',\n\n                'datagrid' => [\n                    'id' => 'ID',\n                    'name' => 'Name',\n                    'contact-name' => 'Contact Name',\n                    'delete' => 'Delete',\n                    'edit' => 'Edit',\n                    'view' => 'View',\n                    'created-at' => 'Created At',\n                    'products' => 'Products',\n                    'contact-emails' => 'Contact Emails',\n                    'contact-numbers' => 'Contact Numbers',\n                ],\n            ],\n\n            'create' => [\n                'title' => 'Create Warehouse',\n                'save-btn' => 'Save Warehouse',\n                'contact-info' => 'Contact Information',\n            ],\n\n            'edit' => [\n                'title' => 'Edit Warehouse',\n                'save-btn' => 'Save Warehouse',\n                'contact-info' => 'Contact Information',\n            ],\n\n            'view' => [\n                'all' => 'All',\n                'notes' => 'Notes',\n                'files' => 'Files',\n                'location' => 'Location',\n                'change-logs' => 'Changelogs',\n\n                'locations' => [\n                    'action' => 'Action',\n                    'add-location' => 'Add Location',\n                    'create-success' => 'Location created successfully.',\n                    'delete' => 'Delete',\n                    'delete-failed' => 'Location can not be deleted.',\n                    'delete-success' => 'Location deleted successfully.',\n                    'name' => 'Name',\n                    'save-btn' => 'Save',\n                ],\n\n                'general-information' => [\n                    'title' => 'General Information',\n                ],\n\n                'contact-information' => [\n                    'title' => 'Contact Information',\n                ],\n            ],\n        ],\n\n        'attributes' => [\n            'index' => [\n                'title' => 'Attributes',\n                'create-btn' => 'Create Attribute',\n                'create-success' => 'Attribute created successfully.',\n                'update-success' => 'Attribute updated successfully.',\n                'delete-success' => 'Attribute deleted successfully.',\n                'delete-failed' => 'Attribute can not be deleted.',\n                'user-define-error' => 'Can not delete system attribute.',\n                'mass-delete-failed' => 'System attributes can not be deleted.',\n\n                'datagrid' => [\n                    'yes' => 'Yes',\n                    'no' => 'No',\n                    'id' => 'ID',\n                    'code' => 'Code',\n                    'name' => 'Name',\n                    'entity-type' => 'Entity Type',\n                    'type' => 'Type',\n                    'is-default' => 'Is Default',\n                    'edit' => 'Edit',\n                    'delete' => 'Delete',\n\n                    'entity-types' => [\n                        'leads' => 'Leads',\n                        'organizations' => 'Organizations',\n                        'persons' => 'Persons',\n                        'products' => 'Products',\n                        'quotes' => 'Quotes',\n                        'warehouses' => 'Warehouses',\n                    ],\n\n                    'types' => [\n                        'text' => 'Text',\n                        'textarea' => 'Textarea',\n                        'price' => 'Price',\n                        'boolean' => 'Boolean',\n                        'select' => 'Select',\n                        'multiselect' => 'Multiselect',\n                        'checkbox' => 'Checkbox',\n                        'email' => 'Email',\n                        'address' => 'Address',\n                        'phone' => 'Phone',\n                        'lookup' => 'Lookup',\n                        'datetime' => 'Datetime',\n                        'date' => 'Date',\n                        'image' => 'Image',\n                        'file' => 'File',\n                    ],\n                ],\n            ],\n\n            'create' => [\n                'title' => 'Create Attribute',\n                'save-btn' => 'Save Attribute',\n                'code' => 'Code',\n                'name' => 'Name',\n                'entity-type' => 'Entity Type',\n                'type' => 'Type',\n                'validations' => 'Validations',\n                'is-required' => 'Is Required',\n                'input-validation' => 'Input Validation',\n                'is-unique' => 'Is Unique',\n                'labels' => 'Labels',\n                'general' => 'General',\n                'numeric' => 'Numeric',\n                'decimal' => 'Decimal',\n                'url' => 'Url',\n                'options' => 'Options',\n                'option-type' => 'Option Type',\n                'lookup-type' => 'Lookup Type',\n                'add-option' => 'Add Option',\n                'save-option' => 'Save Option',\n                'option-name' => 'Option Name',\n                'add-attribute-options' => 'Add Attribute Options',\n                'text' => 'Text',\n                'textarea' => 'Textarea',\n                'price' => 'Price',\n                'boolean' => 'Boolean',\n                'select' => 'Select',\n                'multiselect' => 'Multiselect',\n                'email' => 'Email',\n                'address' => 'Address',\n                'phone' => 'Phone',\n                'datetime' => 'Datetime',\n                'date' => 'Date',\n                'image' => 'Image',\n                'file' => 'File',\n                'lookup' => 'Lookup',\n                'entity_type' => 'Entity type',\n                'checkbox' => 'Checkbox',\n                'is_required' => 'Is Required',\n                'is_unique' => 'Is Unique',\n                'actions' => 'Actions',\n            ],\n\n            'edit' => [\n                'actions' => 'Actions',\n                'add-attribute-options' => 'Add Attribute Options',\n                'add-option' => 'Add Option',\n                'address' => 'Address',\n                'boolean' => 'Boolean',\n                'checkbox' => 'Checkbox',\n                'code' => 'Code',\n                'date' => 'Date',\n                'datetime' => 'Datetime',\n                'decimal' => 'Decimal',\n                'email' => 'Email',\n                'entity-type' => 'Entity Type',\n                'entity_type' => 'Entity type',\n                'file' => 'File',\n                'general' => 'General',\n                'image' => 'Image',\n                'input-validation' => 'Input Validation',\n                'is-required' => 'Is Required',\n                'is-unique' => 'Is Unique',\n                'is_required' => 'Is Required',\n                'is_unique' => 'Is Unique',\n                'labels' => 'Labels',\n                'lookup' => 'Lookup',\n                'lookup-type' => 'Lookup Type',\n                'multiselect' => 'Multiselect',\n                'name' => 'Name',\n                'numeric' => 'Numeric',\n                'option-deleted' => 'Attribute Option is deleted successfully',\n                'option-name' => 'Option Name',\n                'option-type' => 'Option Type',\n                'options' => 'Options',\n                'phone' => 'Phone',\n                'price' => 'Price',\n                'save-btn' => 'Save Attribute',\n                'save-option' => 'Save Option',\n                'select' => 'Select',\n                'text' => 'Text',\n                'textarea' => 'Textarea',\n                'title' => 'Edit Attribute',\n                'type' => 'Type',\n                'url' => 'Url',\n                'validations' => 'Validations',\n            ],\n        ],\n\n        'data-transfer' => [\n            'imports' => [\n                'create' => [\n                    'action' => 'Action',\n                    'allowed-errors' => 'Allowed Errors',\n                    'back-btn' => 'Back',\n                    'create-update' => 'Create/Update',\n                    'delete' => 'Delete',\n                    'download-sample' => 'Download Sample',\n                    'field-separator' => 'Field Separator',\n                    'file' => 'File',\n                    'general' => 'General',\n                    'images-directory' => 'Images Directory Path',\n                    'process-in-queue' => 'Process In Queue',\n                    'results' => 'Results',\n                    'save-btn' => 'Save Import',\n                    'settings' => 'Settings',\n                    'skip-errors' => 'Skip Errors',\n                    'stop-on-errors' => 'Stop on Errors',\n                    'title' => 'Create Import',\n                    'type' => 'Type',\n                    'validation-strategy' => 'Validation Strategy',\n                ],\n\n                'edit' => [\n                    'action' => 'Action',\n                    'allowed-errors' => 'Allowed Errors',\n                    'back-btn' => 'Back',\n                    'create-update' => 'Create/Update',\n                    'delete' => 'Delete',\n                    'download-sample' => 'Download Sample',\n                    'field-separator' => 'Field Separator',\n                    'file' => 'File',\n                    'general' => 'General',\n                    'images-directory' => 'Images Directory Path',\n                    'process-in-queue' => 'Process In Queue',\n                    'results' => 'Results',\n                    'save-btn' => 'Save Import',\n                    'settings' => 'Settings',\n                    'skip-errors' => 'Skip Errors',\n                    'stop-on-errors' => 'Stop on Errors',\n                    'title' => 'Edit Import',\n                    'type' => 'Type',\n                    'validation-strategy' => 'Validation Strategy',\n                ],\n\n                'index' => [\n                    'button-title' => 'Create Import',\n                    'title' => 'Imports',\n\n                    'datagrid' => [\n                        'actions' => 'Actions',\n                        'completed-at' => 'Completed At',\n                        'created' => 'Created',\n                        'delete' => 'Delete',\n                        'deleted' => 'Deleted',\n                        'edit' => 'Edit',\n                        'error-file' => 'Error File',\n                        'id' => 'ID',\n                        'started-at' => 'Started At',\n                        'state' => 'State',\n                        'summary' => 'Summary',\n                        'type' => 'Type',\n                        'updated' => 'Updated',\n                        'uploaded-file' => 'Uploaded File',\n                    ],\n                ],\n\n                'import' => [\n                    'back-btn' => 'Back',\n                    'completed-batches' => 'Total Batches Completed:',\n                    'download-error-report' => 'Download Full Report',\n                    'edit-btn' => 'Edit',\n                    'imported-info' => 'Congratulations! Your import was successful.',\n                    'importing-info' => 'Import In Process',\n                    'indexing-info' => 'Resources Indexing (Price, Inventory and Elastic Search) In Progress',\n                    'linking-info' => 'Resources Linking In Progress',\n                    'progress' => 'Progress:',\n                    'title' => 'Import',\n                    'total-batches' => 'Total Batches:',\n                    'total-created' => 'Total Records Created:',\n                    'total-deleted' => 'Total Records Deleted:',\n                    'total-errors' => 'Total Errors:',\n                    'total-invalid-rows' => 'Total Invalid Rows:',\n                    'total-rows-processed' => 'Total Rows Processed:',\n                    'total-updated' => 'Total Records Updated:',\n                    'validate' => 'Validate',\n                    'validate-info' => 'Click on Validate Data to check your import.',\n                    'validating-info' => 'The data started reading and Validating',\n                    'validation-failed-info' => 'Your import is invalid. Please fix the following errors and try again.',\n                    'validation-success-info' => 'Your import is valid. Click on Import to start the import process.',\n                ],\n\n                'create-success' => 'Import created successfully.',\n                'delete-failed' => 'Import deletion failed unexpectedly.',\n                'delete-success' => 'Import deleted successfully.',\n                'not-valid' => 'Import is invalid',\n                'nothing-to-import' => 'There are no resources to import.',\n                'setup-queue-error' => 'Please change your queue driver to \"database\" or \"redis\" to start the import process.',\n                'update-success' => 'Import updated successfully.',\n            ],\n        ],\n    ],\n\n    'activities' => [\n        'index' => [\n            'title' => 'Activities',\n\n            'datagrid' => [\n                'comment' => 'Comment',\n                'created_at' => 'Created At',\n                'created_by' => 'Created By',\n                'edit' => 'Edit',\n                'id' => 'ID',\n                'done' => 'Is Done',\n                'not-done' => 'Not Done',\n                'lead' => 'Lead',\n                'mass-delete' => 'Mass Delete',\n                'mass-update' => 'Mass Update',\n                'schedule-from' => 'Schedule From',\n                'schedule-to' => 'Schedule To',\n                'schedule_from' => 'Schedule From',\n                'schedule_to' => 'Schedule To',\n                'title' => 'Title',\n                'is_done' => 'Is Done',\n                'type' => 'Type',\n                'update' => 'Update',\n                'call' => 'Call',\n                'meeting' => 'Meeting',\n                'lunch' => 'Lunch',\n            ],\n        ],\n\n        'edit' => [\n            'title' => 'Edit Activity',\n            'back-btn' => 'Back',\n            'save-btn' => 'Save Activity',\n            'type' => 'Activity Type',\n            'call' => 'Call',\n            'meeting' => 'Meeting',\n            'lunch' => 'Lunch',\n            'schedule_to' => 'Schedule To',\n            'schedule_from' => 'Schedule From',\n            'location' => 'Location',\n            'comment' => 'Comment',\n            'lead' => 'Lead',\n            'participants' => 'Participants',\n            'general' => 'General',\n            'persons' => 'Persons',\n            'no-result-found' => 'Records not found.',\n            'users' => 'Users',\n        ],\n\n        'updated' => 'Updated :attribute',\n        'created' => 'Created',\n        'duration-overlapping' => 'Participants have another meeting at this time. Do you want to continue?',\n        'create-success' => 'Activity created successfully.',\n        'update-success' => 'Activity updated successfully.',\n        'overlapping-error' => 'Participants have another meeting at this time.',\n        'destroy-success' => 'Activity deleted successfully.',\n        'delete-failed' => 'Activity can not be deleted.',\n        'mass-update-success' => 'Activities updated successfully.',\n        'mass-destroy-success' => 'Activities deleted successfully.',\n        'mass-delete-failed' => 'Activities can not be deleted.',\n    ],\n\n    'mail' => [\n        'index' => [\n            'compose' => 'Compose',\n            'draft' => 'Draft',\n            'inbox' => 'Inbox',\n            'outbox' => 'Outbox',\n            'sent' => 'Sent',\n            'trash' => 'Trash',\n            'compose-mail-btn' => 'Compose Mail',\n            'btn' => 'Mail',\n            'mail' => [\n                'title' => 'Compose Mail',\n                'to' => 'To',\n                'enter-emails' => 'Press enter to add emails',\n                'cc' => 'CC',\n                'bcc' => 'BCC',\n                'subject' => 'Subject',\n                'send-btn' => 'Send',\n                'message' => 'Message',\n                'draft' => 'Draft',\n            ],\n\n            'datagrid' => [\n                'id' => 'ID',\n                'from' => 'From',\n                'to' => 'To',\n                'subject' => 'Subject',\n                'tags' => 'Tags',\n                'content' => 'Content',\n                'attachments' => 'Attachments',\n                'date' => 'Date',\n                'move-to-inbox' => 'Moved To Inbox',\n                'move-to-trash' => 'Moved To Trash',\n                'edit' => 'Edit',\n                'view' => 'View',\n                'delete' => 'Delete',\n            ],\n        ],\n\n        'create-success' => 'Email sent successfully.',\n        'update-success' => 'Email updated successfully.',\n        'mass-update-success' => 'Emails updated successfully.',\n        'delete-success' => 'Email deleted successfully.',\n        'delete-failed' => 'Email can not be deleted.',\n        'invalid-route' => 'Invalid route for mail.',\n        'unauthorized' => 'This action is unauthorized.',\n\n        'view' => [\n            'title' => 'Mails',\n            'subject' => ':subject',\n            'link-mail' => 'Link Mail',\n            'to' => 'To',\n            'cc' => 'CC',\n            'bcc' => 'BCC',\n            'reply' => 'Reply',\n            'reply-all' => 'Reply All',\n            'forward' => 'Forward',\n            'delete' => 'Delete',\n            'enter-mails' => 'Enter email id',\n            'rotten-days' => 'Lead is rotten for :days days',\n            'search-an-existing-lead' => 'Search an existing lead',\n            'search-an-existing-contact' => 'Search an existing contact',\n            'message' => 'Message',\n            'add-attachments' => 'Add Attachments',\n            'discard' => 'Discard',\n            'send' => 'Send',\n            'no-result-found' => 'No Results found',\n            'add-new-contact' => 'Add New Contact',\n            'description' => 'Description',\n            'search' => 'Search...',\n            'add-new-lead' => 'Add New Lead',\n            'create-new-contact' => 'Create New Contact',\n            'save-contact' => 'Save Contact',\n            'create-lead' => 'Create Lead',\n            'linked-contact' => 'Linked Contact',\n            'link-to-contact' => 'Link To Contact',\n            'link-to-lead' => 'Link To Lead',\n            'linked-lead' => 'Linked Lead',\n            'lead-details' => 'Lead Details',\n            'contact-person' => 'Contact Person',\n            'product' => 'Product',\n\n            'tags' => [\n                'create-success' => 'Tag created successfully.',\n                'destroy-success' => 'Tag deleted successfully.',\n            ],\n        ],\n    ],\n\n    'common' => [\n        'custom-attributes' => [\n            'add-more' => 'Add More',\n            'address' => 'Address',\n            'city' => 'City',\n            'contact' => 'Contact Numbers',\n            'country' => 'Country',\n            'email' => 'Email',\n            'home' => 'Home',\n            'postcode' => 'Postcode',\n            'save' => 'Save',\n            'select' => 'Select',\n            'select-country' => 'Select Country',\n            'select-state' => 'Select State',\n            'state' => 'State',\n            'update-contact-title' => 'Update Contact Numbers',\n            'update-emails-title' => 'Update Contact Emails',\n            'work' => 'Work',\n        ],\n    ],\n\n    'leads' => [\n        'create-success' => 'Lead created successfully.',\n        'update-success' => 'Leads updated successfully.',\n        'update-failed' => 'Leads can not be deleted.',\n        'destroy-success' => 'Lead deleted successfully.',\n        'destroy-failed' => 'Lead can not be deleted.',\n\n        'file' => [\n            'data-not-found' => 'Data not found.',\n            'empty-content' => 'PDF content is empty or could not be extracted.',\n            'failed-extract' => 'Failed to extract text from file.',\n            'insufficient-info' => 'Due to insufficient data, we are unable to process your request at the moment.',\n            'invalid-base64' => 'Invalid base64 format.',\n            'invalid-format' => 'Invalid JSON format.',\n            'invalid-response' => 'Invalid AI response format.',\n            'missing-api-key' => 'Missing API key or model configuration.',\n            'not-found' => 'File not found.',\n            'recursive-call' => 'Recursive call detected.',\n            'text-generation-failed' => 'Text extraction failed. The file might be empty or unreadable.',\n        ],\n\n        'index' => [\n            'title' => 'Leads',\n            'create-btn' => 'Create Lead',\n\n            'datagrid' => [\n                'id' => 'ID',\n                'sales-person' => 'Sales Person',\n                'subject' => 'Subject',\n                'source' => 'Source',\n                'lead-value' => 'Lead Value',\n                'lead-type' => 'Lead Type',\n                'tag-name' => 'Tag Name',\n                'contact-person' => 'Contact Person',\n                'stage' => 'Stage',\n                'rotten-lead' => 'Rotten Lead',\n                'date-to' => 'Date To',\n                'created-at' => 'Created At',\n                'no' => 'No',\n                'yes' => 'Yes',\n                'delete' => 'Delete',\n                'mass-delete' => 'Mass Delete',\n                'mass-update' => 'Mass Update',\n            ],\n\n            'kanban' => [\n                'rotten-days' => 'Lead is rotten for :days days',\n                'empty-list' => 'Your Leads List is Empty',\n                'empty-list-description' => 'Create a lead to organize your goals.',\n                'create-lead-btn' => 'Create Lead',\n\n                'columns' => [\n                    'contact-person' => 'Contact Person',\n                    'id' => 'ID',\n                    'lead-type' => 'Lead Type',\n                    'lead-value' => 'Lead Value',\n                    'sales-person' => 'Sales Person',\n                    'source' => 'Source',\n                    'title' => 'Title',\n                    'tags' => 'Tags',\n                    'expected-close-date' => 'Expected Close Date',\n                    'created-at' => 'Created At',\n                ],\n\n                'toolbar' => [\n                    'search' => [\n                        'title' => 'Search by Title',\n                    ],\n\n                    'filters' => [\n                        'apply-filters' => 'Apply Filters',\n                        'clear-all' => 'Clear All',\n                        'filter' => 'Filter',\n                        'filters' => 'Filters',\n                        'from' => 'From',\n                        'select' => 'Select',\n                        'to' => 'To',\n                    ],\n                ],\n            ],\n\n            'view-switcher' => [\n                'all-pipelines' => 'All Pipelines',\n                'create-new-pipeline' => 'Create New Pipeline',\n            ],\n\n            'upload' => [\n                'create-lead' => 'Create Lead Using AI',\n                'file' => 'File Upload',\n                'file-info' => 'Only pdf,bmp,jpg,jpeg,png format files are accepted.',\n                'file-required' => 'Please select at least one valid file to proceed.',\n                'save-btn' => 'Save',\n                'upload-file' => 'Upload File',\n            ],\n        ],\n\n        'create' => [\n            'title' => 'Create Lead',\n            'save-btn' => 'Save',\n            'details' => 'Details',\n            'details-info' => 'Put The Basic Information of the Lead',\n            'contact-person' => 'Contact Person',\n            'contact-info' => 'Information About the Contact Person',\n            'products' => 'Products',\n            'products-info' => 'Information About the Products',\n        ],\n\n        'edit' => [\n            'title' => 'Edit Lead',\n            'save-btn' => 'Save',\n            'details' => 'Details',\n            'details-info' => 'Put The Basic Information of the Lead',\n            'contact-person' => 'Contact Person',\n            'contact-info' => 'Information About the Contact Person',\n            'products' => 'Products',\n            'products-info' => 'Information About the Products',\n        ],\n\n        'common' => [\n            'contact' => [\n                'name' => 'Name',\n                'email' => 'Email',\n                'contact-number' => 'Contact Number',\n                'organization' => 'Organization',\n            ],\n\n            'products' => [\n                'product-name' => 'Product Name',\n                'quantity' => 'Quantity',\n                'price' => 'Price',\n                'amount' => 'Amount',\n                'action' => 'Action',\n                'add-more' => 'Add More',\n                'total' => 'Total',\n            ],\n        ],\n\n        'view' => [\n            'title' => 'Lead: :title',\n            'rotten-days' => ':days Days',\n\n            'tabs' => [\n                'description' => 'Description',\n                'products' => 'Products',\n                'quotes' => 'Quotes',\n            ],\n\n            'attributes' => [\n                'title' => 'About Lead',\n            ],\n\n            'quotes' => [\n                'subject' => 'Subject',\n                'expired-at' => 'Expired At',\n                'sub-total' => 'Sub Total',\n                'discount' => 'Discount',\n                'tax' => 'Tax',\n                'adjustment' => 'Adjustment',\n                'grand-total' => 'Grand Total',\n                'delete' => 'Delete',\n                'edit' => 'Edit',\n                'download' => 'Download',\n                'destroy-success' => 'Quote deleted successfully.',\n                'empty-title' => 'No Quotes Found',\n                'empty-info' => 'No Quotes Found for this Lead',\n                'add-btn' => 'Add Quote',\n            ],\n\n            'products' => [\n                'product-name' => 'Product Name',\n                'quantity' => 'Quantity',\n                'price' => 'Price',\n                'amount' => 'Amount',\n                'action' => 'Action',\n                'add-more' => 'Add More',\n                'total' => 'Total',\n                'empty-title' => 'No Products Found',\n                'empty-info' => 'No Products Found for this Lead',\n                'add-product' => 'Add Product',\n            ],\n\n            'persons' => [\n                'title' => 'About Persons',\n                'job-title' => ':job_title at :organization',\n            ],\n\n            'stages' => [\n                'won' => 'Won',\n                'lost' => 'Lost',\n                'need-more-info' => 'Need More Details',\n                'closed-at' => 'Closed At',\n                'won-value' => 'Won Value',\n                'lost-reason' => 'Lost Reason',\n                'save-btn' => 'Save',\n            ],\n\n            'tags' => [\n                'create-success' => 'Tag created successfully.',\n                'destroy-success' => 'Tag deleted successfully.',\n            ],\n        ],\n    ],\n\n    'configuration' => [\n        'index' => [\n            'back' => 'Back',\n            'delete' => 'Delete',\n            'save-btn' => 'Save Configuration',\n            'save-success' => 'Configuration Saved Successfully.',\n            'search' => 'Search',\n            'select-country' => 'Select Country',\n            'select-state' => 'Select State',\n            'title' => 'Configuration',\n\n            'general' => [\n                'title' => 'General',\n                'info' => 'General Configuration',\n\n                'general' => [\n                    'title' => 'General',\n                    'info' => 'Update your general settings here.',\n                    'locale-settings' => [\n                        'title' => 'Locale Settings',\n                        'title-info' => 'Defines the language used in the user interface, such as Arabic (ar), English (en), Spanish (es), Persian(fa) and Turkish (tr).',\n                    ],\n\n                    'admin-logo' => [\n                        'logo-image' => 'Logo Image',\n                        'title' => 'Admin Logo',\n                        'title-info' => 'Configure logo image for your admin panel.',\n                    ],\n                ],\n\n                'settings' => [\n                    'title' => 'Settings',\n                    'info' => 'Update your settings here.',\n\n                    'footer' => [\n                        'info' => 'We can configure the powered by section here.',\n                        'powered-by' => 'Powered by text editor',\n                        'title' => 'Powered by Section Configurations',\n                    ],\n\n                    'menu' => [\n                        'activities' => 'Activities',\n                        'configuration' => 'Configuration',\n                        'contacts' => 'Contacts',\n                        'dashboard' => 'Dashboard',\n                        'draft' => 'Draft',\n                        'inbox' => 'Inbox',\n                        'info' => 'We can configure the menu items name here.',\n                        'leads' => 'Leads',\n                        'mail' => 'Mail',\n                        'organizations' => 'Organizations',\n                        'outbox' => 'Outbox',\n                        'persons' => 'Persons',\n                        'products' => 'Products',\n                        'quotes' => 'Quotes',\n                        'sent' => 'Sent',\n                        'settings' => 'Settings',\n                        'title' => 'Menu Item Configurations',\n                        'trash' => 'Trash',\n                    ],\n\n                    'menu-color' => [\n                        'brand-color' => 'Brand Color',\n                        'info' => 'We can change the menu items colors here.',\n                        'title' => 'Menu Item Color Configurations',\n                    ],\n                ],\n            ],\n\n            'email' => [\n                'title' => 'Email Settings',\n                'info' => 'Email configuration for the application.',\n\n                'imap' => [\n                    'title' => 'IMAP Settings',\n                    'info' => 'IMAP email configuration for receiving emails.',\n\n                    'account' => [\n                        'title' => 'IMAP Account',\n                        'title-info' => 'Configure your IMAP account settings here.',\n                        'host' => 'Host',\n                        'port' => 'Port',\n                        'encryption' => 'Encryption Type',\n                        'validate-cert' => 'Validate SSL Certificate',\n                        'username' => 'IMAP Username',\n                        'password' => 'IMAP Password',\n                    ],\n                ],\n            ],\n\n            'magic-ai' => [\n                'title' => 'Magic AI',\n                'info' => 'Magic AI configuration for the application.',\n\n                'settings' => [\n                    'api-key' => 'API Key',\n                    'api-key-info' => 'Remember to use a OpenRouter API key for each model. It\\'s a simple step to enhance security and performance.',\n                    'enable' => 'Enable',\n                    'info' => 'Enhance your Magic AI experience with your OpenRouter API Key. Integrate it now for a seamless, personalized AI adventure tailored just for you! Effortlessly customize settings and take control of your AI journey.',\n                    'other' => 'Other Model',\n                    'other-model' => 'For other models, use the Model ID from OpenRouter.',\n                    'doc-generation' => 'DOC Generation',\n                    'doc-generation-info' => 'Enable the DOC Generation feature to automatically extract data from DOC files and convert them into text format. Enhance your productivity and efficiency by enabling this feature to streamline your workflow.',\n                    'title' => 'General Settings',\n\n                    'models' => [\n                        'deepseek-r1' => 'Deepseek R1 Distill-llama-8b',\n                        'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001',\n                        'gpt-4o' => 'GPT-4.0',\n                        'gpt-4o-mini' => 'GPT-4.0 mini',\n                        'grok-2-1212' => 'Grok 2.12',\n                        'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct',\n                        'title' => 'Models',\n                    ],\n                ],\n            ],\n        ],\n    ],\n\n    'dashboard' => [\n        'index' => [\n            'title' => 'Dashboard',\n\n            'start-date' => 'Start Date',\n            'end-date' => 'End Date',\n\n            'revenue' => [\n                'lost-revenue' => 'Lost Revenue',\n                'won-revenue' => 'Won Revenue',\n            ],\n\n            'over-all' => [\n                'average-lead-value' => 'Average Lead Value',\n                'total-leads' => 'Total Leads',\n                'average-leads-per-day' => 'Average Leads Per Day',\n                'total-quotations' => 'Total Quotations',\n                'total-persons' => 'Total Persons',\n                'total-organizations' => 'Total Organizations',\n            ],\n\n            'total-leads' => [\n                'title' => 'Leads',\n                'total' => 'Total Leads',\n                'won' => 'Won Leads',\n                'lost' => 'Lost Leads',\n            ],\n\n            'revenue-by-sources' => [\n                'title' => 'Revenue By Sources',\n                'empty-title' => 'No Data Available',\n                'empty-info' => 'No data available for selected interval',\n            ],\n\n            'revenue-by-types' => [\n                'title' => 'Revenue By Types',\n                'empty-title' => 'No Data Available',\n                'empty-info' => 'No data available for selected interval',\n            ],\n\n            'top-selling-products' => [\n                'title' => 'Top Products',\n                'empty-title' => 'No Products Found',\n                'empty-info' => 'No products available for selected interval',\n            ],\n\n            'top-persons' => [\n                'title' => 'Top Persons',\n                'empty-title' => 'No Persons Found',\n                'empty-info' => 'No persons available for selected interval',\n            ],\n\n            'open-leads-by-states' => [\n                'title' => 'Open Leads By Stages',\n                'empty-title' => 'No Data Available',\n                'empty-info' => 'No data available for selected interval',\n            ],\n        ],\n    ],\n\n    'layouts' => [\n        'app-version' => 'Version: :version',\n        'dashboard' => 'Dashboard',\n        'leads' => 'Leads',\n        'quotes' => 'Quotes',\n        'quote' => 'Quote',\n        'mail' => [\n            'title' => 'Mail',\n            'compose' => 'Compose',\n            'inbox' => 'Inbox',\n            'draft' => 'Draft',\n            'outbox' => 'Outbox',\n            'sent' => 'Sent',\n            'trash' => 'Trash',\n            'setting' => 'Setting',\n        ],\n        'activities' => 'Activities',\n        'contacts' => 'Contacts',\n        'persons' => 'Persons',\n        'person' => 'Person',\n        'organizations' => 'Organizations',\n        'organization' => 'Organization',\n        'products' => 'Products',\n        'product' => 'Product',\n        'settings' => 'Settings',\n        'user' => 'User',\n        'user-info' => 'Manage all your users and their permissions in the CRM, what they’re allowed to do.',\n        'groups' => 'Groups',\n        'groups-info' => 'Add, edit or delete groups from CRM',\n        'roles' => 'Roles',\n        'role' => 'Role',\n        'roles-info' => 'Add, edit or delete roles from CRM',\n        'users' => 'Users',\n        'users-info' => 'Add, edit or delete users from CRM',\n        'lead' => 'Lead',\n        'lead-info' => 'Manage all your leads related settings in the CRM',\n        'pipelines' => 'Pipelines',\n        'pipelines-info' => 'Add, edit or delete pipelines from CRM',\n        'sources' => 'Sources',\n        'sources-info' => 'Add, edit or delete sources from CRM',\n        'types' => 'Types',\n        'types-info' => 'Add, edit or delete types from CRM',\n        'automation' => 'Automation',\n        'automation-info' => 'Manage all your automation related settings in the CRM',\n        'attributes' => 'Attributes',\n        'attribute' => 'Attribute',\n        'attributes-info' => 'Add, edit or delete attributes from CRM',\n        'email-templates' => 'Email Templates',\n        'email' => 'Email',\n        'email-templates-info' => 'Add, edit or delete email templates from CRM',\n        'events' => 'Events',\n        'events-info' => 'Add, edit or delete events from CRM',\n        'campaigns' => 'Campaigns',\n        'campaigns-info' => 'Add, edit or delete campaigns from CRM',\n        'workflows' => 'Workflows',\n        'workflows-info' => 'Add, edit or delete workflows from CRM',\n        'webhooks' => 'Webhooks',\n        'webhooks-info' => 'Add, edit or delete webhooks from CRM',\n        'other-settings' => 'Other Settings',\n        'other-settings-info' => 'Manage all your extra settings in the CRM',\n        'tags' => 'Tags',\n        'tags-info' => 'Add, edit or delete tags from CRM',\n        'my-account' => 'My Account',\n        'sign-out' => 'Sign Out',\n        'back' => 'Back',\n        'name' => 'Name',\n        'configuration' => 'Configuration',\n        'activities' => 'Activities',\n        'howdy' => 'Howdy!',\n        'warehouses' => 'Warehouses',\n        'warehouse' => 'Warehouse',\n        'warehouses-info' => 'Add, edit or delete warehouses from CRM',\n        'inventory' => 'Inventory',\n        'inventory-info' => 'Manage all your inventory related settings in the CRM',\n        'data_transfer' => 'Data Transfer',\n        'data_transfer_info' => 'Manage persons, products and leads data transfer related settings in the CRM',\n    ],\n\n    'user' => [\n        'account' => [\n            'name' => 'Name',\n            'email' => 'Email',\n            'password' => 'Password',\n            'my_account' => 'My account',\n            'update_details' => 'Update Details',\n            'current_password' => 'Current password',\n            'confirm_password' => 'Confirm password',\n            'password-match' => 'Current password does not match.',\n            'account-save' => 'Account changes saved successfully.',\n            'permission-denied' => 'Permission Denied',\n            'remove-image' => 'Remove Image',\n            'upload_image_pix' => 'Upload a Profile Image (100px x 100px)',\n            'upload_image_format' => 'in PNG or JPG Format',\n            'image_upload_message' => 'Only images (.jpeg, .jpg, .png, ..) are allowed.',\n        ],\n    ],\n\n    'emails' => [\n        'common' => [\n            'dear' => 'Dear :name',\n            'cheers' => 'Cheers,</br>Team :app_name',\n\n            'user' => [\n                'dear' => 'Dear :username',\n                'create-subject' => 'You are added as a member.',\n                'create-body' => 'Congratulations! You are now a member of our team.',\n\n                'forget-password' => [\n                    'subject' => 'Customer Reset Password',\n                    'dear' => 'Dear :username',\n                    'reset-password' => 'Reset Password',\n                    'info' => 'You are receiving this email because we received a password reset request for your account',\n                    'final-summary' => 'If you did not request a password reset, no further action is required',\n                    'thanks' => 'Thanks!',\n                ],\n            ],\n        ],\n    ],\n\n    'validations' => [\n        'message' => [\n            'decimal' => 'The :attribute must be a decimal.',\n        ],\n    ],\n\n    'errors' => [\n        'dashboard' => 'Dashboard',\n        'go-back' => 'Go Back',\n        'support' => 'If the problem persists, reach out to us at <a href=\":link\" class=\":class\">:email</a> for assistance.',\n\n        '404' => [\n            'description' => 'Oops! The page you\\'re looking for is on vacation. It seems we couldn\\'t find what you were searching for.',\n            'title' => '404 Page Not Found',\n        ],\n\n        '401' => [\n            'description' => 'Oops! Looks like you\\'re not allowed to access this page. It seems you\\'re missing the necessary credentials.',\n            'title' => '401 Unauthorized',\n        ],\n\n        '403' => [\n            'description' => 'Oops! This page is off-limits. It appears you don\\'t have the required permissions to view this content.',\n            'title' => '403 Forbidden',\n        ],\n\n        '500' => [\n            'description' => 'Oops! Something went wrong. It seems we\\'re having trouble loading the page you\\'re looking for.',\n            'title' => '500 Internal Server Error',\n        ],\n\n        '503' => [\n            'description' => 'Oops! Looks like we\\'re temporarily down for maintenance. Please check back in a bit.',\n            'title' => '503 Service Unavailable',\n        ],\n    ],\n\n    'export' => [\n        'csv' => 'CSV',\n        'download' => 'Download',\n        'export' => 'Export',\n        'no-records' => 'Nothing to export',\n        'xls' => 'XLS',\n        'xlsx' => 'XLSX',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/lang/es/app.php",
    "content": "<?php\n\nreturn [\n    'acl' => [\n        'leads' => 'Clientes potenciales',\n        'lead' => 'Cliente potencial',\n        'quotes' => 'Cotizaciones',\n        'mail' => 'Correo',\n        'inbox' => 'Bandeja de entrada',\n        'draft' => 'Borradores',\n        'outbox' => 'Bandeja de salida',\n        'sent' => 'Enviados',\n        'trash' => 'Papelera',\n        'activities' => 'Actividades',\n        'webhook' => 'Webhook',\n        'contacts' => 'Contactos',\n        'persons' => 'Personas',\n        'organizations' => 'Organizaciones',\n        'products' => 'Productos',\n        'settings' => 'Configuraciones',\n        'groups' => 'Grupos',\n        'roles' => 'Roles',\n        'users' => 'Usuarios',\n        'user' => 'Usuario',\n        'automation' => 'Automatización',\n        'attributes' => 'Atributos',\n        'pipelines' => 'Canales',\n        'sources' => 'Fuentes',\n        'types' => 'Tipos',\n        'email-templates' => 'Plantillas de correo electrónico',\n        'workflows' => 'Flujos de trabajo',\n        'other-settings' => 'Otras configuraciones',\n        'tags' => 'Etiquetas',\n        'configuration' => 'Configuración',\n        'create' => 'Crear',\n        'edit' => 'Editar',\n        'view' => 'Ver',\n        'print' => 'Imprimir',\n        'delete' => 'Eliminar',\n        'export' => 'Exportar',\n        'mass-delete' => 'Eliminar en masa',\n        'data-transfer' => 'Transferencia de Datos',\n        'imports' => 'Importaciones',\n        'import' => 'Importar',\n        'event' => 'Evento',\n        'campaigns' => 'Campañas',\n        'warehouses' => 'Almacenes',\n        'inventory' => 'Inventario',\n    ],\n    'users' => [\n        'activate-warning' => 'Tu cuenta aún no está activada. Por favor, contacta al administrador.',\n        'login-error' => 'Las credenciales no coinciden con nuestros registros.',\n        'not-permission' => 'No tienes permiso para acceder al panel de administración.',\n        'login' => [\n            'email' => 'Dirección de correo electrónico',\n            'forget-password-link' => '¿Olvidaste tu contraseña?',\n            'password' => 'Contraseña',\n            'submit-btn' => 'Iniciar sesión',\n            'title' => 'Iniciar sesión',\n        ],\n        'forget-password' => [\n            'create' => [\n                'email' => 'Correo electrónico registrado',\n                'email-not-exist' => 'El correo electrónico no existe',\n                'page-title' => 'Olvidé mi contraseña',\n                'reset-link-sent' => 'Enlace para restablecer la contraseña enviado',\n                'sign-in-link' => '¿Volver a iniciar sesión?',\n                'submit-btn' => 'Restablecer',\n                'title' => 'Recuperar contraseña',\n            ],\n        ],\n        'reset-password' => [\n            'back-link-title' => '¿Volver a iniciar sesión?',\n            'confirm-password' => 'Confirmar contraseña',\n            'email' => 'Correo electrónico registrado',\n            'password' => 'Contraseña',\n            'submit-btn' => 'Restablecer contraseña',\n            'title' => 'Restablecer contraseña',\n        ],\n    ],\n    'account' => [\n        'edit' => [\n            'back-btn' => 'Regresar',\n            'change-password' => 'Cambiar contraseña',\n            'confirm-password' => 'Confirmar contraseña',\n            'current-password' => 'Contraseña actual',\n            'email' => 'Correo electrónico',\n            'general' => 'General',\n            'invalid-password' => 'La contraseña actual que ingresaste es incorrecta.',\n            'name' => 'Nombre',\n            'password' => 'Contraseña',\n            'profile-image' => 'Imagen de perfil',\n            'save-btn' => 'Guardar cuenta',\n            'title' => 'Mi cuenta',\n            'update-success' => 'Cuenta actualizada con éxito',\n            'upload-image-info' => 'Sube una imagen de perfil (110 px × 110 px) en formato PNG o JPG',\n        ],\n    ],\n    'components' => [\n        'activities' => [\n            'actions' => [\n                'mail' => [\n                    'btn' => 'Correo',\n                    'title' => 'Redactar correo',\n                    'to' => 'Para',\n                    'enter-emails' => 'Presiona Enter para agregar direcciones de correo electrónico',\n                    'cc' => 'CC',\n                    'bcc' => 'CCO',\n                    'subject' => 'Asunto',\n                    'send-btn' => 'Enviar',\n                    'message' => 'Mensaje',\n                ],\n                'file' => [\n                    'btn' => 'Archivo',\n                    'title' => 'Agregar archivo',\n                    'title-control' => 'Título',\n                    'name' => 'Nombre',\n                    'description' => 'Descripción',\n                    'file' => 'Archivo',\n                    'save-btn' => 'Guardar archivo',\n                ],\n                'note' => [\n                    'btn' => 'Nota',\n                    'title' => 'Agregar nota',\n                    'comment' => 'Comentario',\n                    'save-btn' => 'Guardar nota',\n                ],\n                'activity' => [\n                    'btn' => 'Actividad',\n                    'title' => 'Agregar actividad',\n                    'title-control' => 'Título',\n                    'description' => 'Descripción',\n                    'schedule-from' => 'Programar desde',\n                    'schedule-to' => 'Programar hasta',\n                    'location' => 'Ubicación',\n                    'call' => 'Llamada',\n                    'meeting' => 'Reunión',\n                    'lunch' => 'Almuerzo',\n                    'save-btn' => 'Guardar actividad',\n                    'participants' => [\n                        'title' => 'Participantes',\n                        'placeholder' => 'Escribe para buscar participantes',\n                        'users' => 'Usuarios',\n                        'persons' => 'Personas',\n                        'no-results' => 'No se encontraron resultados...',\n                    ],\n                ],\n            ],\n            'index' => [\n                'all' => 'Todo',\n                'bcc' => 'CCO',\n                'by-user' => 'Por :user',\n                'calls' => 'Llamadas',\n                'cc' => 'CC',\n                'change-log' => 'Registros de cambios',\n                'delete' => 'Eliminar',\n                'edit' => 'Editar',\n                'emails' => 'Correos electrónicos',\n                'empty' => 'Vacío',\n                'files' => 'Archivos',\n                'from' => 'De',\n                'location' => 'Ubicación',\n                'lunches' => 'Almuerzos',\n                'mark-as-done' => 'Marcar como hecho',\n                'meetings' => 'Reuniones',\n                'notes' => 'Notas',\n                'participants' => 'Participantes',\n                'planned' => 'Planificado',\n                'quotes' => 'Cotizaciones',\n                'scheduled-on' => 'Programado en',\n                'system' => 'Sistema',\n                'to' => 'A',\n                'unlink' => 'Desvincular',\n                'view' => 'Ver',\n                'empty-placeholders' => [\n                    'all' => [\n                        'title' => 'No se encontraron actividades',\n                        'description' => 'No se encontraron actividades para esto. Puedes agregar actividades haciendo clic en el botón Actividad en el panel izquierdo.',\n                    ],\n                    'planned' => [\n                        'title' => 'No se encontraron actividades planificadas',\n                        'description' => 'No se encontraron actividades planificadas para esto. Puedes agregarlas haciendo clic en el botón Actividad en el panel izquierdo.',\n                    ],\n                    'notes' => [\n                        'title' => 'No se encontraron notas',\n                        'description' => 'No se encontraron notas para esto. Puedes agregarlas haciendo clic en el botón Nota en el panel izquierdo.',\n                    ],\n                    'calls' => [\n                        'title' => 'No se encontraron llamadas',\n                        'description' => 'No se encontraron llamadas para esto. Puedes agregarlas haciendo clic en el botón Actividad en el panel izquierdo y seleccionando el tipo Llamada.',\n                    ],\n                    'meetings' => [\n                        'title' => 'No se encontraron reuniones',\n                        'description' => 'No se encontraron reuniones para esto. Puedes agregarlas haciendo clic en el botón Actividad en el panel izquierdo y seleccionando el tipo Reunión.',\n                    ],\n                    'lunches' => [\n                        'title' => 'No se encontraron almuerzos',\n                        'description' => 'No se encontraron almuerzos para esto. Puedes agregarlos haciendo clic en el botón Actividad en el panel izquierdo y seleccionando el tipo Almuerzo.',\n                    ],\n                    'files' => [\n                        'title' => 'No se encontraron archivos',\n                        'description' => 'No se encontraron archivos para esto. Puedes agregarlos haciendo clic en el botón Archivo en el panel izquierdo.',\n                    ],\n                    'emails' => [\n                        'title' => 'No se encontraron correos electrónicos',\n                        'description' => 'No se encontraron correos electrónicos para esto. Puedes agregarlos haciendo clic en el botón Correo en el panel izquierdo.',\n                    ],\n                    'system' => [\n                        'title' => 'No se encontraron registros de cambios',\n                        'description' => 'No se encontraron registros de cambios para esto.',\n                    ],\n                ],\n            ],\n        ],\n        'media' => [\n            'images' => [\n                'add-image-btn' => 'Agregar imagen',\n                'ai-add-image-btn' => 'Inteligencia artificial mágica',\n                'allowed-types' => 'png, jpeg, jpg',\n                'not-allowed-error' => 'Solo se aceptan archivos de imagen (.jpeg, .jpg, .png, ..)',\n                'placeholders' => [\n                    'front' => 'Frontal',\n                    'next' => 'Siguiente',\n                    'size' => 'Tamaño',\n                    'use-cases' => 'Casos de uso',\n                    'zoom' => 'Acercar',\n                ],\n            ],\n            'videos' => [\n                'add-video-btn' => 'Agregar video',\n                'allowed-types' => 'mp4, webm, mkv',\n                'not-allowed-error' => 'Solo se aceptan archivos de video (.mp4, .mov, .ogg ..)',\n            ],\n        ],\n        'datagrid' => [\n            'index' => [\n                'no-records-selected' => 'No se han seleccionado registros.',\n                'must-select-a-mass-action-option' => 'Debes seleccionar una opción de acción en masa.',\n                'must-select-a-mass-action' => 'Debes seleccionar una acción en masa.',\n            ],\n            'toolbar' => [\n                'length-of' => ':length de',\n                'of' => 'de',\n                'per-page' => 'Por Página',\n                'results' => ':total Resultados',\n                'delete' => 'Eliminar',\n                'selected' => ':total Elementos Seleccionados',\n                'mass-actions' => [\n                    'submit' => 'Enviar',\n                    'select-option' => 'Seleccionar Opción',\n                    'select-action' => 'Seleccionar Acción',\n                ],\n                'filter' => [\n                    'apply-filters-btn' => 'Aplicar Filtros',\n                    'back-btn' => 'Regresar',\n                    'create-new-filter' => 'Crear Nuevo Filtro',\n                    'custom-filters' => 'Filtros Personalizados',\n                    'delete-error' => 'Hubo un error al eliminar el filtro, por favor intente de nuevo.',\n                    'delete-success' => 'Filtro eliminado con éxito.',\n                    'empty-description' => 'No hay filtros seleccionados disponibles para guardar. Por favor, seleccione filtros para guardar.',\n                    'empty-title' => 'Agregar Filtros para Guardar',\n                    'name' => 'Nombre',\n                    'quick-filters' => 'Filtros Rápidos',\n                    'save-btn' => 'Guardar',\n                    'save-filter' => 'Guardar Filtro',\n                    'saved-success' => 'Filtro guardado con éxito.',\n                    'selected-filters' => 'Filtros Seleccionados',\n                    'title' => 'Filtro',\n                    'update' => 'Actualizar',\n                    'update-filter' => 'Actualizar Filtro',\n                    'updated-success' => 'Filtro actualizado con éxito.',\n                ],\n                'search' => [\n                    'title' => 'Buscar',\n                ],\n            ],\n            'filters' => [\n                'select' => 'Seleccionar',\n                'title' => 'Filtros',\n                'dropdown' => [\n                    'searchable' => [\n                        'at-least-two-chars' => 'Escribe al menos 2 caracteres...',\n                        'no-results' => 'No se encontraron resultados...',\n                    ],\n                ],\n                'custom-filters' => [\n                    'clear-all' => 'Borrar Todo',\n                    'title' => 'Filtros Personalizados',\n                ],\n                'boolean-options' => [\n                    'false' => 'Falso',\n                    'true' => 'Verdadero',\n                ],\n                'date-options' => [\n                    'last-month' => 'Mes Pasado',\n                    'last-six-months' => 'Últimos 6 Meses',\n                    'last-three-months' => 'Últimos 3 Meses',\n                    'this-month' => 'Este Mes',\n                    'this-week' => 'Esta Semana',\n                    'this-year' => 'Este Año',\n                    'today' => 'Hoy',\n                    'yesterday' => 'Ayer',\n                ],\n            ],\n            'table' => [\n                'actions' => 'Acciones',\n                'no-records-available' => 'No hay Registros Disponibles.',\n            ],\n        ],\n        'modal' => [\n            'confirm' => [\n                'agree-btn' => 'Aceptar',\n                'disagree-btn' => 'Rechazar',\n                'message' => '¿Estás seguro de que quieres realizar esta acción?',\n                'title' => '¿Estás seguro?',\n            ],\n        ],\n        'tags' => [\n            'index' => [\n                'title' => 'Etiquetas',\n                'added-tags' => 'Etiquetas Agregadas',\n                'save-btn' => 'Guardar Etiqueta',\n                'placeholder' => 'Escribe para buscar etiquetas',\n                'add-tag' => 'Agregar \\\\\":term\\\\\"...',\n                'aquarelle-red' => 'Rojo Aquarelle',\n                'crushed-cashew' => 'Anacardo Triturado',\n                'beeswax' => 'Cera de Abejas',\n                'lemon-chiffon' => 'Chiffon de Limón',\n                'snow-flurry' => 'Tormenta de Nieve',\n                'honeydew' => 'Melón',\n            ],\n        ],\n        'layouts' => [\n            'powered-by' => [\n                'description' => 'Desarrollado por :krayin, un proyecto de código abierto de :webkul.',\n            ],\n            'header' => [\n                'mega-search' => [\n                    'title' => 'Búsqueda Mega',\n                    'tabs' => [\n                        'leads' => 'Oportunidades',\n                        'quotes' => 'Cotizaciones',\n                        'persons' => 'Personas',\n                        'products' => 'Productos',\n                    ],\n                    'explore-all-products' => 'Explorar todos los Productos',\n                    'explore-all-leads' => 'Explorar todas las Oportunidades',\n                    'explore-all-contacts' => 'Explorar todos los Contactos',\n                    'explore-all-quotes' => 'Explorar todas las Cotizaciones',\n                    'explore-all-matching-products' => 'Explorar todos los productos que coinciden con \":query\" (:count)',\n                    'explore-all-matching-leads' => 'Explorar todas las oportunidades que coinciden con \":query\" (:count)',\n                    'explore-all-matching-contacts' => 'Explorar todos los contactos que coinciden con \":query\" (:count)',\n                    'explore-all-matching-quotes' => 'Explorar todas las cotizaciones que coinciden con \":query\" (:count)',\n                ],\n            ],\n        ],\n        'attributes' => [\n            'edit' => [\n                'delete' => 'Eliminar',\n            ],\n            'lookup' => [\n                'click-to-add' => 'Haz clic para agregar',\n                'search' => 'Buscar...',\n                'no-result-found' => 'No se encontraron resultados',\n            ],\n        ],\n        'lookup' => [\n            'click-to-add' => 'Haz clic para agregar',\n            'no-results' => 'No se encontraron resultados',\n            'add-as-new' => 'Agregar como nuevo',\n            'search' => 'Buscar...',\n        ],\n        'flash-group' => [\n            'success' => 'Éxito',\n            'error' => 'Error',\n            'warning' => 'Advertencia',\n            'info' => 'Información',\n        ],\n        'tiny-mce' => [\n            'http-error' => 'Error HTTP',\n            'invalid-json' => 'Respuesta JSON no válida del servidor.',\n            'upload-failed' => 'Error al subir el archivo. Por favor, inténtelo de nuevo.',\n        ],\n    ],\n    'quotes' => [\n        'index' => [\n            'title' => 'Cotizaciones',\n            'create-btn' => 'Crear Cotización',\n            'create-success' => 'Cotización creada con éxito.',\n            'update-success' => 'Cotización actualizada con éxito.',\n            'delete-success' => 'Cotización eliminada con éxito.',\n            'delete-failed' => 'No se puede eliminar la cotización.',\n            'datagrid' => [\n                'subject' => 'Asunto',\n                'sales-person' => 'Vendedor',\n                'expired-at' => 'Vence en',\n                'created-at' => 'Creado en',\n                'person' => 'Persona',\n                'subtotal' => 'Subtotal',\n                'discount' => 'Descuento',\n                'tax' => 'Impuesto',\n                'adjustment' => 'Ajuste',\n                'grand-total' => 'Total General',\n                'edit' => 'Editar',\n                'delete' => 'Eliminar',\n                'print' => 'Imprimir',\n            ],\n            'pdf' => [\n                'adjustment' => 'Ajuste',\n                'amount' => 'Monto',\n                'billing-address' => 'Dirección de Facturación',\n                'date' => 'Fecha',\n                'discount' => 'Descuento',\n                'expired-at' => 'Vence en',\n                'grand-total' => 'Total General',\n                'person' => 'Persona',\n                'price' => 'Precio',\n                'product-name' => 'Nombre del Producto',\n                'quantity' => 'Cantidad',\n                'quote-id' => 'ID de Cotización',\n                'sales-person' => 'Vendedor',\n                'shipping-address' => 'Dirección de Envío',\n                'sku' => 'SKU',\n                'sub-total' => 'Subtotal',\n                'subject' => 'Asunto',\n                'tax' => 'Impuesto',\n                'title' => 'Cotización',\n            ],\n        ],\n        'create' => [\n            'title' => 'Crear Cotización',\n            'save-btn' => 'Guardar Cotización',\n            'quote-info' => 'Información de la Cotización',\n            'quote-info-info' => 'Introduce la información básica de la cotización.',\n            'address-info' => 'Información de la Dirección',\n            'address-info-info' => 'Información sobre la dirección relacionada con la cotización.',\n            'quote-items' => 'Artículos de la Cotización',\n            'search-products' => 'Buscar Productos',\n            'link-to-lead' => 'Vincular a cliente potencial',\n            'quote-item-info' => 'Agregar Solicitud de Producto para esta cotización.',\n            'quote-name' => 'Nombre de la Cotización',\n            'quantity' => 'Cantidad',\n            'price' => 'Precio',\n            'discount' => 'Descuento',\n            'tax' => 'Impuesto',\n            'total' => 'Total',\n            'amount' => 'Monto',\n            'add-item' => '+ Agregar Artículo',\n            'sub-total' => 'Subtotal (:symbol)',\n            'total-discount' => 'Descuento (:symbol)',\n            'total-tax' => 'Impuesto (:symbol)',\n            'total-adjustment' => 'Ajuste (:symbol)',\n            'grand-total' => 'Total General (:symbol)',\n            'discount-amount' => 'Monto del Descuento',\n            'tax-amount' => 'Monto del Impuesto',\n            'adjustment-amount' => 'Monto del Ajuste',\n            'product-name' => 'Nombre del Producto',\n            'action' => 'Acción',\n        ],\n        'edit' => [\n            'title' => 'Editar Cotización',\n            'save-btn' => 'Guardar Cotización',\n            'quote-info' => 'Información de la Cotización',\n            'quote-info-info' => 'Introduce la información básica de la cotización.',\n            'address-info' => 'Información de la Dirección',\n            'address-info-info' => 'Información sobre la dirección relacionada con la cotización.',\n            'quote-items' => 'Artículos de la Cotización',\n            'link-to-lead' => 'Vincular a cliente potencial',\n            'quote-item-info' => 'Agregar Solicitud de Producto para esta cotización.',\n            'quote-name' => 'Nombre de la Cotización',\n            'quantity' => 'Cantidad',\n            'price' => 'Precio',\n            'search-products' => 'Buscar Productos',\n            'discount' => 'Descuento',\n            'tax' => 'Impuesto',\n            'total' => 'Total',\n            'amount' => 'Monto',\n            'add-item' => '+ Agregar Artículo',\n            'sub-total' => 'Subtotal (:symbol)',\n            'total-discount' => 'Descuento (:symbol)',\n            'total-tax' => 'Impuesto (:symbol)',\n            'total-adjustment' => 'Ajuste (:symbol)',\n            'grand-total' => 'Total General (:symbol)',\n            'discount-amount' => 'Monto del Descuento',\n            'tax-amount' => 'Monto del Impuesto',\n            'adjustment-amount' => 'Monto del Ajuste',\n            'product-name' => 'Nombre del Producto',\n            'action' => 'Acción',\n        ],\n    ],\n    'contacts' => [\n        'persons' => [\n            'index' => [\n                'title' => 'Personas',\n                'create-btn' => 'Crear Persona',\n                'create-success' => 'Persona creada con éxito.',\n                'update-success' => 'Persona actualizada con éxito.',\n                'all-delete-success' => 'Todas las personas seleccionadas fueron eliminadas exitosamente.',\n                'partial-delete-warning' => 'Algunas personas fueron eliminadas con éxito. Otras no se pudieron eliminar porque están vinculadas a clientes potenciales.',\n                'none-delete-warning' => 'Ninguna de las personas seleccionadas pudo ser eliminada porque están vinculadas a clientes potenciales.',\n                'no-selection' => 'No se seleccionaron personas para eliminar.',\n                'delete-failed' => 'No se pudieron eliminar las personas seleccionadas.',\n                'datagrid' => [\n                    'contact-numbers' => 'Números de Contacto',\n                    'delete' => 'Eliminar',\n                    'edit' => 'Editar',\n                    'emails' => 'Correos Electrónicos',\n                    'id' => 'ID',\n                    'view' => 'Ver',\n                    'name' => 'Nombre',\n                    'organization-name' => 'Nombre de la Organización',\n                ],\n            ],\n            'view' => [\n                'title' => ':name',\n                'about-person' => 'Sobre la Persona',\n                'about-organization' => 'Acerca de la organización',\n                'activities' => [\n                    'index' => [\n                        'all' => 'Todos',\n                        'calls' => 'Llamadas',\n                        'meetings' => 'Reuniones',\n                        'lunches' => 'Almuerzos',\n                        'files' => 'Archivos',\n                        'quotes' => 'Cotizaciones',\n                        'notes' => 'Notas',\n                        'emails' => 'Correos Electrónicos',\n                        'by-user' => 'Por :user',\n                        'scheduled-on' => 'Programado para',\n                        'location' => 'Ubicación',\n                        'participants' => 'Participantes',\n                        'mark-as-done' => 'Marcar como Hecho',\n                        'delete' => 'Eliminar',\n                        'edit' => 'Editar',\n                    ],\n                    'actions' => [\n                        'mail' => [\n                            'btn' => 'Correo',\n                            'title' => 'Redactar Correo',\n                            'to' => 'Para',\n                            'cc' => 'CC',\n                            'bcc' => 'CCO',\n                            'subject' => 'Asunto',\n                            'send-btn' => 'Enviar',\n                            'message' => 'Mensaje',\n                        ],\n                        'file' => [\n                            'btn' => 'Archivo',\n                            'title' => 'Agregar Archivo',\n                            'title-control' => 'Título',\n                            'name' => 'Nombre del Archivo',\n                            'description' => 'Descripción',\n                            'file' => 'Archivo',\n                            'save-btn' => 'Guardar Archivo',\n                        ],\n                        'note' => [\n                            'btn' => 'Nota',\n                            'title' => 'Agregar Nota',\n                            'comment' => 'Comentario',\n                            'save-btn' => 'Guardar Nota',\n                        ],\n                        'activity' => [\n                            'btn' => 'Actividad',\n                            'title' => 'Agregar Actividad',\n                            'title-control' => 'Título',\n                            'description' => 'Descripción',\n                            'schedule-from' => 'Programar Desde',\n                            'schedule-to' => 'Programar Hasta',\n                            'location' => 'Ubicación',\n                            'call' => 'Llamada',\n                            'meeting' => 'Reunión',\n                            'lunch' => 'Almuerzo',\n                            'save-btn' => 'Guardar Actividad',\n                        ],\n                    ],\n                ],\n                'tags' => [\n                    'create-success' => 'Etiqueta creada con éxito.',\n                    'destroy-success' => 'Etiqueta eliminada con éxito.',\n                ],\n            ],\n            'create' => [\n                'title' => 'Crear Persona',\n                'save-btn' => 'Guardar Persona',\n            ],\n            'edit' => [\n                'title' => 'Editar Persona',\n                'save-btn' => 'Guardar Persona',\n            ],\n        ],\n        'organizations' => [\n            'index' => [\n                'title' => 'Organizaciones',\n                'create-btn' => 'Crear Organización',\n                'create-success' => 'Organización creada con éxito.',\n                'update-success' => 'Organización actualizada con éxito.',\n                'delete-success' => 'Organización eliminada con éxito.',\n                'delete-failed' => 'No se puede eliminar la organización.',\n                'datagrid' => [\n                    'delete' => 'Eliminar',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nombre',\n                    'persons-count' => 'Número de Personas',\n                ],\n            ],\n            'create' => [\n                'title' => 'Crear Organización',\n                'save-btn' => 'Guardar Organización',\n            ],\n            'edit' => [\n                'title' => 'Editar Organización',\n                'save-btn' => 'Guardar Organización',\n            ],\n        ],\n    ],\n    'products' => [\n        'index' => [\n            'title' => 'Productos',\n            'create-btn' => 'Crear Producto',\n            'create-success' => 'Producto creado con éxito.',\n            'update-success' => 'Producto actualizado con éxito.',\n            'delete-success' => 'Producto eliminado con éxito.',\n            'delete-failed' => 'No se puede eliminar el producto.',\n            'datagrid' => [\n                'allocated' => 'Asignado',\n                'delete' => 'Eliminar',\n                'edit' => 'Editar',\n                'id' => 'ID',\n                'in-stock' => 'En Stock',\n                'name' => 'Nombre',\n                'on-hand' => 'Disponible',\n                'tag-name' => 'Nombre de etiqueta',\n                'price' => 'Precio',\n                'sku' => 'SKU',\n                'view' => 'Ver',\n            ],\n        ],\n        'create' => [\n            'save-btn' => 'Guardar Productos',\n            'title' => 'Crear Productos',\n            'general' => 'General',\n            'price' => 'Precio',\n        ],\n        'edit' => [\n            'title' => 'Editar Productos',\n            'save-btn' => 'Guardar Productos',\n            'general' => 'General',\n            'price' => 'Precio',\n        ],\n        'view' => [\n            'sku' => 'SKU',\n            'all' => 'Todos',\n            'notes' => 'Notas',\n            'files' => 'Archivos',\n            'inventories' => 'Inventario',\n            'change-logs' => 'Registros de Cambios',\n            'attributes' => [\n                'about-product' => 'Sobre el Producto',\n            ],\n            'inventory' => [\n                'source' => 'Fuente',\n                'in-stock' => 'En Stock',\n                'allocated' => 'Asignado',\n                'on-hand' => 'Disponible',\n                'actions' => 'Acciones',\n                'assign' => 'Asignar',\n                'add-source' => 'Agregar Fuente',\n                'location' => 'Ubicación',\n                'add-more' => 'Agregar Más',\n                'save' => 'Guardar',\n            ],\n        ],\n    ],\n    'settings' => [\n        'title' => 'Configuraciones',\n        'groups' => [\n            'index' => [\n                'create-btn' => 'Crear Grupo',\n                'title' => 'Grupos',\n                'create-success' => 'Grupo creado con éxito.',\n                'update-success' => 'Grupo actualizado con éxito.',\n                'destroy-success' => 'Grupo eliminado con éxito.',\n                'delete-failed' => 'No se puede eliminar el grupo.',\n                'delete-failed-associated-users' => 'No se puede eliminar el grupo, ya que está siendo utilizado por usuarios.',\n                'datagrid' => [\n                    'delete' => 'Eliminar',\n                    'description' => 'Descripción',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nombre',\n                ],\n                'edit' => [\n                    'title' => 'Editar Grupo',\n                ],\n                'create' => [\n                    'name' => 'Nombre',\n                    'title' => 'Crear Grupo',\n                    'description' => 'Descripción',\n                    'save-btn' => 'Guardar Grupo',\n                ],\n            ],\n        ],\n        'roles' => [\n            'index' => [\n                'being-used' => 'El rol no se puede eliminar, ya que está siendo utilizado por un usuario administrador.',\n                'create-btn' => 'Crear Roles',\n                'create-success' => 'Rol creado con éxito.',\n                'current-role-delete-error' => 'No se puede eliminar el rol asignado al usuario actual.',\n                'delete-failed' => 'No se puede eliminar el rol.',\n                'delete-success' => 'Rol eliminado con éxito.',\n                'last-delete-error' => 'Se requiere al menos un rol.',\n                'settings' => 'Configuraciones',\n                'title' => 'Roles',\n                'update-success' => 'Rol actualizado con éxito.',\n                'user-define-error' => 'No se puede eliminar el rol del sistema.',\n                'datagrid' => [\n                    'all' => 'Todos',\n                    'custom' => 'Personalizado',\n                    'delete' => 'Eliminar',\n                    'description' => 'Descripción',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nombre',\n                    'permission-type' => 'Tipo de Permiso',\n                ],\n            ],\n            'create' => [\n                'access-control' => 'Control de Acceso',\n                'all' => 'Todos',\n                'back-btn' => 'Volver',\n                'custom' => 'Personalizado',\n                'description' => 'Descripción',\n                'general' => 'General',\n                'name' => 'Nombre',\n                'permissions' => 'Permisos',\n                'save-btn' => 'Guardar Rol',\n                'title' => 'Crear Rol',\n            ],\n            'edit' => [\n                'access-control' => 'Control de Acceso',\n                'all' => 'Todos',\n                'back-btn' => 'Volver',\n                'custom' => 'Personalizado',\n                'description' => 'Descripción',\n                'general' => 'General',\n                'name' => 'Nombre',\n                'permissions' => 'Permisos',\n                'save-btn' => 'Guardar Rol',\n                'title' => 'Editar Rol',\n            ],\n        ],\n        'types' => [\n            'index' => [\n                'create-btn' => 'Crear Tipo',\n                'create-success' => 'Tipo creado con éxito.',\n                'delete-failed' => 'No se puede eliminar el tipo.',\n                'delete-success' => 'Tipo eliminado con éxito.',\n                'title' => 'Tipos',\n                'update-success' => 'Tipo actualizado con éxito.',\n                'datagrid' => [\n                    'delete' => 'Eliminar',\n                    'description' => 'Descripción',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nombre',\n                ],\n                'create' => [\n                    'name' => 'Nombre',\n                    'save-btn' => 'Guardar Tipo',\n                    'title' => 'Crear Tipo',\n                ],\n                'edit' => [\n                    'title' => 'Editar Tipo',\n                ],\n            ],\n        ],\n        'sources' => [\n            'index' => [\n                'title' => 'Fuentes',\n                'create-btn' => 'Crear Fuente',\n                'create-success' => 'Fuente creada con éxito.',\n                'delete-failed' => 'No se puede eliminar la fuente.',\n                'delete-success' => 'Fuente eliminada con éxito.',\n                'update-success' => 'Fuente actualizada con éxito.',\n                'delete-failed-associated-leads' => 'No se puede eliminar la fuente porque está asociada a clientes potenciales existentes. Por favor, desvincúlelos o actualícelos antes de eliminar.',\n                'datagrid' => [\n                    'delete' => 'Eliminar',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nombre',\n                ],\n                'create' => [\n                    'name' => 'Nombre',\n                    'save-btn' => 'Guardar fuente',\n                    'title' => 'Crear fuente',\n                ],\n                'edit' => [\n                    'title' => 'Editar fuente',\n                ],\n            ],\n        ],\n        'workflows' => [\n            'index' => [\n                'title' => 'Flujos de Trabajo',\n                'create-btn' => 'Crear Flujo de Trabajo',\n                'create-success' => 'Flujo de trabajo creado con éxito.',\n                'update-success' => 'Flujo de trabajo actualizado con éxito.',\n                'delete-success' => 'Flujo de trabajo eliminado con éxito.',\n                'delete-failed' => 'No se puede eliminar el flujo de trabajo.',\n                'datagrid' => [\n                    'delete' => 'Eliminar',\n                    'description' => 'Descripción',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nombre',\n                ],\n            ],\n            'helpers' => [\n                'update-related-leads' => 'Actualizar leads relacionados',\n                'send-email-to-sales-owner' => 'Enviar correo al propietario de ventas',\n                'send-email-to-participants' => 'Enviar correo a los participantes',\n                'add-webhook' => 'Agregar Webhook',\n                'update-lead' => 'Actualizar Lead',\n                'update-person' => 'Actualizar Persona',\n                'send-email-to-person' => 'Enviar correo a la persona',\n                'add-tag' => 'Agregar Etiqueta',\n                'add-note-as-activity' => 'Agregar Nota como Actividad',\n                'update-quote' => 'Actualizar cotización',\n            ],\n            'create' => [\n                'title' => 'Crear Flujo de Trabajo',\n                'event' => 'Evento',\n                'back-btn' => 'Volver',\n                'save-btn' => 'Guardar Flujo de Trabajo',\n                'name' => 'Nombre',\n                'basic-details' => 'Detalles Básicos',\n                'description' => 'Descripción',\n                'actions' => 'Acciones',\n                'basic-details-info' => 'Coloque la información básica del flujo de trabajo.',\n                'event-info' => 'Un evento desencadena, verifica, condiciones y realiza acciones predefinidas.',\n                'conditions' => 'Condiciones',\n                'conditions-info' => 'Las condiciones son reglas que verifican escenarios, desencadenadas en ocasiones específicas.',\n                'actions-info' => 'Una acción no solo reduce la carga de trabajo, sino que también facilita la automatización de CRM.',\n                'value' => 'Valor',\n                'condition-type' => 'Tipo de Condición',\n                'all-condition-are-true' => 'Todas las condiciones son verdaderas',\n                'any-condition-are-true' => 'Cualquiera de las condiciones es verdadera',\n                'add-condition' => 'Agregar Condición',\n                'add-action' => 'Agregar Acción',\n                'yes' => 'Sí',\n                'no' => 'No',\n                'email' => 'Correo Electrónico',\n                'is-equal-to' => 'Es igual a',\n                'is-not-equal-to' => 'No es igual a',\n                'equals-or-greater-than' => 'Es igual o mayor que',\n                'equals-or-less-than' => 'Es igual o menor que',\n                'greater-than' => 'Mayor que',\n                'less-than' => 'Menor que',\n                'type' => 'Tipo',\n                'contain' => 'Contiene',\n                'contains' => 'Contiene',\n                'does-not-contain' => 'No contiene',\n            ],\n            'edit' => [\n                'title' => 'Editar Flujo de Trabajo',\n                'event' => 'Evento',\n                'back-btn' => 'Volver',\n                'save-btn' => 'Guardar Flujo de Trabajo',\n                'name' => 'Nombre',\n                'basic-details' => 'Detalles Básicos',\n                'description' => 'Descripción',\n                'actions' => 'Acciones',\n                'type' => 'Tipo',\n                'basic-details-info' => 'Coloque la información básica del flujo de trabajo.',\n                'event-info' => 'Un evento desencadena, verifica, condiciones y realiza acciones predefinidas.',\n                'conditions' => 'Condiciones',\n                'conditions-info' => 'Las condiciones son reglas que verifican escenarios, desencadenadas en ocasiones específicas.',\n                'actions-info' => 'Una acción no solo reduce la carga de trabajo, sino que también facilita la automatización de CRM.',\n                'value' => 'Valor',\n                'condition-type' => 'Tipo de Condición',\n                'all-condition-are-true' => 'Todas las condiciones son verdaderas',\n                'any-condition-are-true' => 'Cualquiera de las condiciones es verdadera',\n                'add-condition' => 'Agregar Condición',\n                'add-action' => 'Agregar Acción',\n                'yes' => 'Sí',\n                'no' => 'No',\n                'email' => 'Correo Electrónico',\n                'is-equal-to' => 'Es igual a',\n                'is-not-equal-to' => 'No es igual a',\n                'equals-or-greater-than' => 'Es igual o mayor que',\n                'equals-or-less-than' => 'Es igual o menor que',\n                'greater-than' => 'Mayor que',\n                'less-than' => 'Menor que',\n                'contain' => 'Contiene',\n                'contains' => 'Contiene',\n                'does-not-contain' => 'No contiene',\n            ],\n        ],\n        'webforms' => [\n            'index' => [\n                'title' => 'Webforms',\n                'create-btn' => 'Crear Webform',\n                'create-success' => 'Webform creado con éxito.',\n                'update-success' => 'Webform actualizado con éxito.',\n                'delete-success' => 'Webform eliminado con éxito.',\n                'delete-failed' => 'No se puede eliminar el Webform.',\n                'datagrid' => [\n                    'id' => 'ID',\n                    'title' => 'Título',\n                    'edit' => 'Editar',\n                    'delete' => 'Eliminar',\n                ],\n            ],\n            'create' => [\n                'title' => 'Crear formulario web',\n                'add-attribute-btn' => 'Agregar Botón de Atributo',\n                'attribute-label-color' => 'Color de Etiqueta del Atributo',\n                'attributes' => 'Atributos',\n                'attributes-info' => 'Agregue atributos personalizados al formulario.',\n                'background-color' => 'Color de Fondo',\n                'create-lead' => 'Crear Lead',\n                'customize-webform' => 'Personalizar Webform',\n                'customize-webform-info' => 'Personalice su formulario web con los colores de los elementos de su elección.',\n                'description' => 'Descripción',\n                'display-custom-message' => 'Mostrar mensaje personalizado',\n                'form-background-color' => 'Color de Fondo del Formulario',\n                'form-submit-btn-color' => 'Color del Botón de Enviar del Formulario',\n                'form-submit-button-color' => 'Color del Botón de Enviar del Formulario',\n                'form-title-color' => 'Color del Título del Formulario',\n                'general' => 'General',\n                'leads' => 'Leads',\n                'person' => 'Persona',\n                'save-btn' => 'Guardar Webform',\n                'submit-button-label' => 'Etiqueta del Botón de Enviar',\n                'submit-success-action' => 'Acción en caso de éxito de envío',\n                'redirect-to-url' => 'Redirigir a la URL',\n                'choose-value' => 'Elige un valor',\n                'select-file' => 'Seleccionar archivo',\n                'select-image' => 'Seleccionar imagen',\n                'enter-value' => 'Introducir valor',\n            ],\n            'edit' => [\n                'add-attribute-btn' => 'Agregar Botón de Atributo',\n                'attribute-label-color' => 'Color de Etiqueta del Atributo',\n                'attributes' => 'Atributos',\n                'attributes-info' => 'Agregue atributos personalizados al formulario.',\n                'background-color' => 'Color de Fondo',\n                'choose-value' => 'Elige un valor',\n                'code-snippet' => 'Fragmento de Código',\n                'copied' => 'Copiado',\n                'copy' => 'Copiar',\n                'create-lead' => 'Crear Lead',\n                'customize-webform' => 'Personalizar Webform',\n                'customize-webform-info' => 'Personalice su formulario web con los colores de los elementos de su elección.',\n                'description' => 'Descripción',\n                'display-custom-message' => 'Mostrar mensaje personalizado',\n                'embed' => 'Incrustar',\n                'enter-value' => 'Introducir valor',\n                'form-background-color' => 'Color de Fondo del Formulario',\n                'form-submit-btn-color' => 'Color del Botón de Enviar del Formulario',\n                'form-submit-button-color' => 'Color del Botón de Enviar del Formulario',\n                'form-title-color' => 'Color del Título del Formulario',\n                'general' => 'General',\n                'leads' => 'Leads',\n                'person' => 'Persona',\n                'preview' => 'Vista Previa',\n                'public-url' => 'URL Pública',\n                'redirect-to-url' => 'Redirigir a la URL',\n                'save-btn' => 'Guardar Webform',\n                'select-file' => 'Seleccionar archivo',\n                'select-image' => 'Seleccionar imagen',\n                'submit-button-label' => 'Etiqueta del Botón de Enviar',\n                'submit-success-action' => 'Acción en caso de éxito de envío',\n                'title' => 'Editar formulario web',\n            ],\n        ],\n        'email-template' => [\n            'index' => [\n                'create-btn' => 'Crear Plantilla de Correo Electrónico',\n                'title' => 'Plantillas de Correo Electrónico',\n                'create-success' => 'Plantilla de Correo Electrónico creada exitosamente.',\n                'update-success' => 'Plantilla de Correo Electrónico actualizada exitosamente.',\n                'delete-success' => 'Plantilla de Correo Electrónico eliminada exitosamente.',\n                'delete-failed' => 'No se puede eliminar la Plantilla de Correo Electrónico.',\n                'datagrid' => [\n                    'delete' => 'Eliminar',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nombre',\n                    'subject' => 'Asunto',\n                ],\n            ],\n            'create' => [\n                'title' => 'Crear Plantilla de Correo Electrónico',\n                'save-btn' => 'Guardar Plantilla de Correo Electrónico',\n                'email-template' => 'Plantilla de Correo Electrónico',\n                'subject' => 'Asunto',\n                'content' => 'Contenido',\n                'subject-placeholders' => 'Marcadores de Posición del Asunto',\n                'general' => 'General',\n                'name' => 'Nombre',\n            ],\n            'edit' => [\n                'title' => 'Editar Plantilla de Correo Electrónico',\n                'save-btn' => 'Guardar Plantilla de Correo Electrónico',\n                'email-template' => 'Plantilla de Correo Electrónico',\n                'subject' => 'Asunto',\n                'content' => 'Contenido',\n                'subject-placeholders' => 'Marcadores de Posición del Asunto',\n                'general' => 'General',\n                'name' => 'Nombre',\n            ],\n        ],\n        'marketing' => [\n            'events' => [\n                'index' => [\n                    'create-btn' => 'Crear Evento',\n                    'title' => 'Eventos',\n                    'create-success' => 'Evento creado con éxito.',\n                    'update-success' => 'Evento actualizado con éxito.',\n                    'delete-success' => 'Evento eliminado con éxito.',\n                    'delete-failed' => 'No se puede eliminar el evento.',\n                    'mass-delete-success' => 'Eventos eliminados con éxito',\n                    'delete-failed-associated-campaigns' => 'No se puede eliminar el evento porque está asociado a campañas existentes. Por favor, desvincúlelas o actualícelas antes de eliminar.',\n                    'datagrid' => [\n                        'delete' => 'Eliminar',\n                        'edit' => 'Editar',\n                        'id' => 'ID',\n                        'name' => 'Nombre',\n                        'description' => 'Descripción',\n                        'date' => 'Fecha',\n                    ],\n                    'create' => [\n                        'title' => 'Crear Evento',\n                        'name' => 'Nombre',\n                        'date' => 'Fecha',\n                        'description' => 'Descripción',\n                        'save-btn' => 'Guardar Evento',\n                    ],\n                    'edit' => [\n                        'title' => 'Editar Evento',\n                    ],\n                ],\n            ],\n            'campaigns' => [\n                'index' => [\n                    'create-btn' => 'Crear Campaña',\n                    'title' => 'Campañas',\n                    'create-success' => 'Campaña creada con éxito.',\n                    'update-success' => 'Campaña actualizada con éxito.',\n                    'delete-success' => 'Campaña eliminada con éxito.',\n                    'delete-failed' => 'No se puede eliminar la campaña.',\n                    'mass-delete-success' => 'Campañas eliminadas con éxito.',\n                    'datagrid' => [\n                        'id' => 'ID',\n                        'name' => 'Nombre',\n                        'subject' => 'Asunto',\n                        'status' => 'Estado',\n                        'active' => 'Activo',\n                        'inactive' => 'Inactivo',\n                        'edit' => 'Editar',\n                        'delete' => 'Eliminar',\n                    ],\n                    'create' => [\n                        'title' => 'Crear Campaña',\n                        'name' => 'Nombre',\n                        'type' => 'Tipo',\n                        'subject' => 'Asunto',\n                        'event' => 'Evento',\n                        'email-template' => 'Plantilla de Correo',\n                        'status' => 'Estado',\n                    ],\n                    'edit' => [\n                        'title' => 'Editar Campaña',\n                    ],\n                ],\n            ],\n        ],\n        'tags' => [\n            'index' => [\n                'create-btn' => 'Crear Etiqueta',\n                'title' => 'Etiquetas',\n                'create-success' => 'Etiqueta creada exitosamente.',\n                'update-success' => 'Etiqueta actualizada exitosamente.',\n                'delete-success' => 'Etiqueta eliminada exitosamente.',\n                'delete-failed' => 'No se puede eliminar la Etiqueta.',\n                'datagrid' => [\n                    'delete' => 'Eliminar',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nombre',\n                    'users' => 'Usuarios',\n                    'created-at' => 'Creado En',\n                ],\n                'create' => [\n                    'name' => 'Nombre',\n                    'save-btn' => 'Guardar Etiqueta',\n                    'title' => 'Crear Etiqueta',\n                    'color' => 'Color',\n                ],\n                'edit' => [\n                    'title' => 'Editar Etiqueta',\n                ],\n            ],\n        ],\n        'users' => [\n            'index' => [\n                'create-btn' => 'Crear Usuario',\n                'create-success' => 'Usuario creado exitosamente.',\n                'delete-failed' => 'No se puede eliminar el Usuario.',\n                'delete-success' => 'Usuario eliminado exitosamente.',\n                'last-delete-error' => 'Se requiere al menos un usuario.',\n                'mass-delete-failed' => 'No se pueden eliminar los Usuarios.',\n                'mass-delete-success' => 'Usuarios eliminados exitosamente.',\n                'mass-update-failed' => 'No se pueden actualizar los Usuarios.',\n                'mass-update-success' => 'Usuarios actualizados exitosamente.',\n                'title' => 'Usuarios',\n                'update-success' => 'Usuario actualizado exitosamente.',\n                'user-define-error' => 'No se puede eliminar el usuario del sistema.',\n                'active' => 'Activo',\n                'inactive' => 'Inactivo',\n                'datagrid' => [\n                    'active' => 'Activo',\n                    'created-at' => 'Creado En',\n                    'delete' => 'Eliminar',\n                    'edit' => 'Editar',\n                    'email' => 'Correo Electrónico',\n                    'id' => 'ID',\n                    'inactive' => 'Inactivo',\n                    'name' => 'Nombre',\n                    'status' => 'Estado',\n                    'update-status' => 'Actualizar Estado',\n                    'users' => 'Usuarios',\n                ],\n                'create' => [\n                    'confirm-password' => 'Confirmar Contraseña',\n                    'email' => 'Correo Electrónico',\n                    'general' => 'General',\n                    'global' => 'Global',\n                    'group' => 'Grupo',\n                    'individual' => 'Individual',\n                    'name' => 'Nombre',\n                    'password' => 'Contraseña',\n                    'permission' => 'Permiso',\n                    'role' => 'Rol',\n                    'save-btn' => 'Guardar Usuario',\n                    'status' => 'Estado',\n                    'title' => 'Crear Usuario',\n                    'view-permission' => 'Ver Permiso',\n                    'select-at-lest-one-group' => 'Select at least one group',\n                ],\n                'edit' => [\n                    'title' => 'Editar Usuario',\n                ],\n            ],\n        ],\n        'pipelines' => [\n            'index' => [\n                'title' => 'Canales',\n                'create-btn' => 'Crear Canal',\n                'create-success' => 'Canal creado exitosamente.',\n                'update-success' => 'Canal actualizado exitosamente.',\n                'default-required' => 'Se requiere al menos una canalización predeterminada.',\n                'delete-success' => 'Canal eliminado exitosamente.',\n                'delete-failed' => 'No se puede eliminar el Canal.',\n                'default-delete-error' => 'No se puede eliminar el canal predeterminado.',\n                'datagrid' => [\n                    'delete' => 'Eliminar',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'is-default' => 'Es Predeterminado',\n                    'name' => 'Nombre',\n                    'no' => 'No',\n                    'rotten-days' => 'Días de Pudrición',\n                    'yes' => 'Sí',\n                ],\n            ],\n            'create' => [\n                'title' => 'Crear Canal',\n                'save-btn' => 'Guardar Canal',\n                'name' => 'Nombre',\n                'rotten-days' => 'Días de Pudrición',\n                'mark-as-default' => 'Marcar como Predeterminado',\n                'general' => 'General',\n                'probability' => 'Probabilidad (%)',\n                'new-stage' => 'Nuevo',\n                'won-stage' => 'Ganado',\n                'lost-stage' => 'Perdido',\n                'stage-btn' => 'Añadir Etapa',\n                'stages' => 'Etapas',\n                'duplicate-name' => 'El campo \"Nombre\" no puede ser duplicado',\n                'delete-stage' => 'Eliminar Etapa',\n                'add-new-stages' => 'Añadir Nuevas Etapas',\n                'add-stage-info' => 'Añadir nueva etapa para tu Canal',\n                'newly-added' => 'Añadido Recientemente',\n                'stage-delete-success' => 'Etapa Eliminada Exitosamente',\n            ],\n            'edit' => [\n                'title' => 'Editar Canal',\n                'save-btn' => 'Guardar Canal',\n                'name' => 'Nombre',\n                'rotten-days' => 'Días de Pudrición',\n                'mark-as-default' => 'Marcar como Predeterminado',\n                'general' => 'General',\n                'probability' => 'Probabilidad (%)',\n                'new-stage' => 'Nuevo',\n                'won-stage' => 'Ganado',\n                'lost-stage' => 'Perdido',\n                'stage-btn' => 'Añadir Etapa',\n                'stages' => 'Etapas',\n                'duplicate-name' => 'El campo \"Nombre\" no puede ser duplicado',\n                'delete-stage' => 'Eliminar Etapa',\n                'add-new-stages' => 'Añadir Nuevas Etapas',\n                'add-stage-info' => 'Añadir nueva etapa para tu Canal',\n                'stage-delete-success' => 'Etapa Eliminada Exitosamente',\n            ],\n        ],\n        'webhooks' => [\n            'index' => [\n                'title' => 'Webhooks',\n                'create-btn' => 'Crear Webhook',\n                'create-success' => 'Webhook creado exitosamente.',\n                'update-success' => 'Webhook actualizado exitosamente.',\n                'delete-success' => 'Webhook eliminado exitosamente.',\n                'delete-failed' => 'No se puede eliminar el Webhook.',\n                'datagrid' => [\n                    'id' => 'ID',\n                    'delete' => 'Eliminar',\n                    'edit' => 'Editar',\n                    'name' => 'Nombre',\n                    'entity-type' => 'Tipo de Entidad',\n                    'end-point' => 'Punto Final',\n                ],\n            ],\n            'create' => [\n                'title' => 'Crear Webhook',\n                'save-btn' => 'Guardar Webhook',\n                'info' => 'Ingrese los detalles del webhook',\n                'url-and-parameters' => 'URL Y Parámetros',\n                'method' => 'Método',\n                'post' => 'Post',\n                'put' => 'Put',\n                'url-endpoint' => 'Punto Final de URL',\n                'parameters' => 'Parámetros',\n                'add-new-parameter' => 'Añadir Nuevo Parámetro',\n                'url-preview' => 'Vista Previa de URL:',\n                'headers' => 'Encabezados',\n                'add-new-header' => 'Añadir Nuevo Encabezado',\n                'body' => 'Cuerpo',\n                'default' => 'Predeterminado',\n                'x-www-form-urlencoded' => 'x-www-form-urlencoded',\n                'key-and-value' => 'Clave y Valor',\n                'add-new-payload' => 'Añadir nueva carga',\n                'raw' => 'Crudo',\n                'general' => 'General',\n                'name' => 'Nombre',\n                'entity-type' => 'Tipo de Entidad',\n                'insert-placeholder' => 'Insertar Marcador de Posición',\n                'description' => 'Descripción',\n                'json' => 'Json',\n                'text' => 'Texto',\n            ],\n            'edit' => [\n                'title' => 'Editar Webhook',\n                'edit-btn' => 'Guardar Webhook',\n                'save-btn' => 'Guardar Webhook',\n                'info' => 'Ingrese los detalles del webhook',\n                'url-and-parameters' => 'URL Y Parámetros',\n                'method' => 'Método',\n                'post' => 'Post',\n                'put' => 'Put',\n                'url-endpoint' => 'Punto Final de URL',\n                'parameters' => 'Parámetros',\n                'add-new-parameter' => 'Añadir Nuevo Parámetro',\n                'url-preview' => 'Vista Previa de URL:',\n                'headers' => 'Encabezados',\n                'add-new-header' => 'Añadir Nuevo Encabezado',\n                'body' => 'Cuerpo',\n                'default' => 'Predeterminado',\n                'x-www-form-urlencoded' => 'x-www-form-urlencoded',\n                'key-and-value' => 'Clave y Valor',\n                'add-new-payload' => 'Añadir nueva carga',\n                'raw' => 'Crudo',\n                'general' => 'General',\n                'name' => 'Nombre',\n                'entity-type' => 'Tipo de Entidad',\n                'insert-placeholder' => 'Insertar Marcador de Posición',\n                'description' => 'Descripción',\n                'json' => 'Json',\n                'text' => 'Texto',\n            ],\n        ],\n        'warehouses' => [\n            'index' => [\n                'title' => 'Almacenes',\n                'create-btn' => 'Crear Almacén',\n                'create-success' => 'Almacén creado con éxito.',\n                'name-exists' => 'El nombre del almacén ya existe.',\n                'update-success' => 'Almacén actualizado con éxito.',\n                'delete-success' => 'Almacén eliminado con éxito.',\n                'delete-failed' => 'No se puede eliminar el almacén.',\n                'datagrid' => [\n                    'id' => 'ID',\n                    'name' => 'Nombre',\n                    'contact-name' => 'Nombre del Contacto',\n                    'delete' => 'Eliminar',\n                    'edit' => 'Editar',\n                    'view' => 'Ver',\n                    'created-at' => 'Creado En',\n                    'products' => 'Productos',\n                    'contact-emails' => 'Correos Electrónicos de Contacto',\n                    'contact-numbers' => 'Números de Teléfono de Contacto',\n                ],\n            ],\n            'create' => [\n                'title' => 'Crear Almacén',\n                'save-btn' => 'Guardar Almacén',\n                'contact-info' => 'Información de Contacto',\n            ],\n            'edit' => [\n                'title' => 'Editar Almacén',\n                'save-btn' => 'Guardar Almacén',\n                'contact-info' => 'Información de Contacto',\n            ],\n            'view' => [\n                'all' => 'Todos',\n                'notes' => 'Notas',\n                'files' => 'Archivos',\n                'location' => 'Ubicación',\n                'change-logs' => 'Registros de Cambios',\n                'locations' => [\n                    'action' => 'Acción',\n                    'add-location' => 'Agregar Ubicación',\n                    'create-success' => 'Ubicación creada con éxito.',\n                    'delete' => 'Eliminar',\n                    'delete-failed' => 'No se puede eliminar la ubicación.',\n                    'delete-success' => 'Ubicación eliminada con éxito.',\n                    'name' => 'Nombre',\n                    'save-btn' => 'Guardar',\n                ],\n                'general-information' => [\n                    'title' => 'Información General',\n                ],\n                'contact-information' => [\n                    'title' => 'Información de Contacto',\n                ],\n            ],\n        ],\n        'attributes' => [\n            'index' => [\n                'title' => 'Atributos',\n                'create-btn' => 'Crear Atributo',\n                'create-success' => 'Atributo creados con éxito.',\n                'update-success' => 'Atributo actualizados con éxito.',\n                'delete-success' => 'Atributo eliminados con éxito.',\n                'delete-failed' => 'No se pueden eliminar los atributo.',\n                'user-define-error' => 'No se puede eliminar el atributo del sistema.',\n                'mass-delete-failed' => 'No se pueden eliminar los atributos del sistema.',\n                'datagrid' => [\n                    'yes' => 'Sí',\n                    'no' => 'No',\n                    'id' => 'ID',\n                    'code' => 'Código',\n                    'name' => 'Nombre',\n                    'entity-type' => 'Tipo de Entidad',\n                    'type' => 'Tipo',\n                    'is-default' => 'Es Predeterminado',\n                    'edit' => 'Editar',\n                    'delete' => 'Eliminar',\n                    'entity-types' => [\n                        'leads' => 'Clientes potenciales',\n                        'organizations' => 'Organizaciones',\n                        'persons' => 'Personas',\n                        'products' => 'Productos',\n                        'quotes' => 'Cotizaciones',\n                        'warehouses' => 'Almacenes',\n                    ],\n                    'types' => [\n                        'text' => 'Texto',\n                        'textarea' => 'Área de texto',\n                        'price' => 'Precio',\n                        'boolean' => 'Booleano',\n                        'select' => 'Seleccionar',\n                        'multiselect' => 'Selección múltiple',\n                        'checkbox' => 'Casilla de verificación',\n                        'email' => 'Correo electrónico',\n                        'address' => 'Dirección',\n                        'phone' => 'Teléfono',\n                        'lookup' => 'Búsqueda',\n                        'datetime' => 'Fecha y hora',\n                        'date' => 'Fecha',\n                        'image' => 'Imagen',\n                        'file' => 'Archivo',\n                    ],\n                ],\n            ],\n            'create' => [\n                'title' => 'Crear Atributo',\n                'save-btn' => 'Guardar Atributo',\n                'code' => 'Código',\n                'name' => 'Nombre',\n                'entity-type' => 'Tipo de Entidad',\n                'type' => 'Tipo',\n                'validations' => 'Validaciones',\n                'is-required' => 'Es Requerido',\n                'input-validation' => 'Validación de Entrada',\n                'is-unique' => 'Es Único',\n                'labels' => 'Etiquetas',\n                'general' => 'General',\n                'numeric' => 'Numérico',\n                'decimal' => 'Decimal',\n                'url' => 'Url',\n                'options' => 'Opciones',\n                'option-type' => 'Tipo de Opción',\n                'lookup-type' => 'Tipo de Búsqueda',\n                'add-option' => 'Agregar Opción',\n                'save-option' => 'Guardar Opción',\n                'option-name' => 'Nombre de Opción',\n                'add-attribute-options' => 'Agregar Opciones de Atributo',\n                'text' => 'Texto',\n                'textarea' => 'Área de Texto',\n                'price' => 'Precio',\n                'boolean' => 'Booleano',\n                'select' => 'Seleccionar',\n                'multiselect' => 'Selección Múltiple',\n                'email' => 'Correo Electrónico',\n                'address' => 'Dirección',\n                'phone' => 'Teléfono',\n                'datetime' => 'Fecha y Hora',\n                'date' => 'Fecha',\n                'image' => 'Imagen',\n                'file' => 'Archivo',\n                'lookup' => 'Búsqueda',\n                'entity_type' => 'Tipo de Entidad',\n                'checkbox' => 'Casilla de Verificación',\n                'is_required' => 'Es Requerido',\n                'is_unique' => 'Es Único',\n                'actions' => 'Acciones',\n            ],\n            'edit' => [\n                'actions' => 'Acciones',\n                'add-attribute-options' => 'Agregar Opciones de Atributo',\n                'add-option' => 'Agregar Opción',\n                'address' => 'Dirección',\n                'boolean' => 'Booleano',\n                'checkbox' => 'Casilla de Verificación',\n                'code' => 'Código',\n                'date' => 'Fecha',\n                'datetime' => 'Fecha y Hora',\n                'decimal' => 'Decimal',\n                'email' => 'Correo Electrónico',\n                'entity-type' => 'Tipo de Entidad',\n                'entity_type' => 'Tipo de Entidad',\n                'file' => 'Archivo',\n                'general' => 'General',\n                'image' => 'Imagen',\n                'input-validation' => 'Validación de Entrada',\n                'is-required' => 'Es Requerido',\n                'is-unique' => 'Es Único',\n                'is_required' => 'Es Requerido',\n                'is_unique' => 'Es Único',\n                'labels' => 'Etiquetas',\n                'lookup' => 'Búsqueda',\n                'lookup-type' => 'Tipo de Búsqueda',\n                'multiselect' => 'Selección Múltiple',\n                'name' => 'Nombre',\n                'numeric' => 'Numérico',\n                'option-deleted' => 'Attribute Option is deleted successfully',\n                'option-name' => 'Nombre de Opción',\n                'option-type' => 'Tipo de Opción',\n                'options' => 'Opciones',\n                'phone' => 'Teléfono',\n                'price' => 'Precio',\n                'save-btn' => 'Guardar Atributo',\n                'save-option' => 'Guardar Opción',\n                'select' => 'Seleccionar',\n                'text' => 'Texto',\n                'textarea' => 'Área de Texto',\n                'title' => 'Editar Atributo',\n                'type' => 'Tipo',\n                'url' => 'Url',\n                'validations' => 'Validaciones',\n            ],\n        ],\n        'data-transfer' => [\n            'imports' => [\n                'create' => [\n                    'action' => 'Acción',\n                    'allowed-errors' => 'Errores Permitidos',\n                    'back-btn' => 'Atrás',\n                    'create-update' => 'Crear/Actualizar',\n                    'delete' => 'Eliminar',\n                    'download-sample' => 'Descargar Muestra',\n                    'field-separator' => 'Separador de Campos',\n                    'file' => 'Archivo',\n                    'general' => 'General',\n                    'images-directory' => 'Ruta del Directorio de Imágenes',\n                    'process-in-queue' => 'Procesar en Cola',\n                    'results' => 'Resultados',\n                    'save-btn' => 'Guardar Importación',\n                    'settings' => 'Configuraciones',\n                    'skip-errors' => 'Omitir Errores',\n                    'stop-on-errors' => 'Detener en Errores',\n                    'title' => 'Crear Importación',\n                    'type' => 'Tipo',\n                    'validation-strategy' => 'Estrategia de Validación',\n                ],\n                'edit' => [\n                    'action' => 'Acción',\n                    'allowed-errors' => 'Errores Permitidos',\n                    'back-btn' => 'Atrás',\n                    'create-update' => 'Crear/Actualizar',\n                    'delete' => 'Eliminar',\n                    'download-sample' => 'Descargar Muestra',\n                    'field-separator' => 'Separador de Campos',\n                    'file' => 'Archivo',\n                    'general' => 'General',\n                    'images-directory' => 'Ruta del Directorio de Imágenes',\n                    'process-in-queue' => 'Procesar en Cola',\n                    'results' => 'Resultados',\n                    'save-btn' => 'Guardar Importación',\n                    'settings' => 'Configuraciones',\n                    'skip-errors' => 'Omitir Errores',\n                    'stop-on-errors' => 'Detener en Errores',\n                    'title' => 'Editar Importación',\n                    'type' => 'Tipo',\n                    'validation-strategy' => 'Estrategia de Validación',\n                ],\n                'index' => [\n                    'button-title' => 'Crear Importación',\n                    'title' => 'Importaciones',\n                    'datagrid' => [\n                        'actions' => 'Acciones',\n                        'completed-at' => 'Completado en',\n                        'created' => 'Creado',\n                        'delete' => 'Eliminar',\n                        'deleted' => 'Eliminado',\n                        'edit' => 'Editar',\n                        'error-file' => 'Archivo de Errores',\n                        'id' => 'ID',\n                        'started-at' => 'Iniciado en',\n                        'state' => 'Estado',\n                        'summary' => 'Resumen',\n                        'type' => 'Tipo',\n                        'updated' => 'Actualizado',\n                        'uploaded-file' => 'Archivo Subido',\n                    ],\n                ],\n                'import' => [\n                    'back-btn' => 'Atrás',\n                    'completed-batches' => 'Total de Lotes Completados:',\n                    'download-error-report' => 'Descargar Informe Completo',\n                    'edit-btn' => 'Editar',\n                    'imported-info' => '¡Felicidades! Tu importación fue exitosa.',\n                    'importing-info' => 'Importación en Proceso',\n                    'indexing-info' => 'Indexación de Recursos (Precios, Inventario y Elastic Search) en Progreso',\n                    'linking-info' => 'Vinculación de Recursos en Progreso',\n                    'progress' => 'Progreso:',\n                    'title' => 'Importación',\n                    'total-batches' => 'Total de Lotes:',\n                    'total-created' => 'Total de Registros Creados:',\n                    'total-deleted' => 'Total de Registros Eliminados:',\n                    'total-errors' => 'Total de Errores:',\n                    'total-invalid-rows' => 'Total de Filas Inválidas:',\n                    'total-rows-processed' => 'Total de Filas Procesadas:',\n                    'total-updated' => 'Total de Registros Actualizados:',\n                    'validate' => 'Validar',\n                    'validate-info' => 'Haz clic en Validar Datos para comprobar tu importación.',\n                    'validating-info' => 'La lectura y validación de los datos ha comenzado',\n                    'validation-failed-info' => 'Tu importación no es válida. Por favor, corrige los siguientes errores e intenta de nuevo.',\n                    'validation-success-info' => 'Tu importación es válida. Haz clic en Importar para iniciar el proceso de importación.',\n                ],\n                'create-success' => 'Importación creada exitosamente.',\n                'delete-failed' => 'La eliminación de la importación falló inesperadamente.',\n                'delete-success' => 'Importación eliminada exitosamente.',\n                'not-valid' => 'La importación no es válida',\n                'nothing-to-import' => 'No hay recursos para importar.',\n                'setup-queue-error' => 'Por favor, cambia tu controlador de cola a \"database\" o \"redis\" para iniciar el proceso de importación.',\n                'update-success' => 'Importación actualizada exitosamente.',\n            ],\n        ],\n    ],\n    'activities' => [\n        'index' => [\n            'title' => 'Actividades',\n            'datagrid' => [\n                'comment' => 'Comentario',\n                'created_at' => 'Creado En',\n                'created_by' => 'Creado Por',\n                'edit' => 'Editar',\n                'id' => 'ID',\n                'done' => 'Completado',\n                'not-done' => 'No Completado',\n                'lead' => 'Oportunidad',\n                'mass-delete' => 'Eliminación Masiva',\n                'mass-update' => 'Actualización Masiva',\n                'schedule-from' => 'Programar Desde',\n                'schedule-to' => 'Programar Hasta',\n                'schedule_from' => 'Programar Desde',\n                'schedule_to' => 'Programar Hasta',\n                'title' => 'Título',\n                'is_done' => 'Completado',\n                'type' => 'Tipo',\n                'update' => 'Actualizar',\n                'call' => 'Llamada',\n                'meeting' => 'Reunión',\n                'lunch' => 'Almuerzo',\n            ],\n        ],\n        'edit' => [\n            'title' => 'Editar Actividad',\n            'back-btn' => 'Volver',\n            'save-btn' => 'Guardar Actividad',\n            'type' => 'Tipo de Actividad',\n            'call' => 'Llamada',\n            'meeting' => 'Reunión',\n            'lunch' => 'Almuerzo',\n            'schedule_to' => 'Programar Hasta',\n            'schedule_from' => 'Programar Desde',\n            'location' => 'Ubicación',\n            'comment' => 'Comentario',\n            'lead' => 'Oportunidad',\n            'participants' => 'Participantes',\n            'general' => 'General',\n            'persons' => 'Personas',\n            'no-result-found' => 'No se encontraron registros.',\n            'users' => 'Usuarios',\n        ],\n        'updated' => 'Actualizado :attribute',\n        'created' => 'Creado',\n        'duration-overlapping' => 'Los participantes tienen otra reunión en este momento. ¿Deseas continuar?',\n        'create-success' => 'Actividad creada con éxito.',\n        'update-success' => 'Actividad actualizada con éxito.',\n        'overlapping-error' => 'Los participantes tienen otra reunión en este momento.',\n        'destroy-success' => 'Actividad eliminada con éxito.',\n        'delete-failed' => 'No se puede eliminar la actividad.',\n        'mass-update-success' => 'Actividades actualizadas con éxito.',\n        'mass-destroy-success' => 'Actividades eliminadas con éxito.',\n        'mass-delete-failed' => 'No se pueden eliminar las actividades.',\n    ],\n    'mail' => [\n        'index' => [\n            'compose' => 'Redactar',\n            'draft' => 'Borrador',\n            'inbox' => 'Bandeja de entrada',\n            'outbox' => 'Bandeja de salida',\n            'sent' => 'Enviados',\n            'trash' => 'Papelera',\n            'compose-mail-btn' => 'Redactar Correo',\n            'btn' => 'Correo',\n            'mail' => [\n                'title' => 'Redactar Correo',\n                'to' => 'Para',\n                'enter-emails' => 'Presiona enter para añadir correos',\n                'cc' => 'CC',\n                'bcc' => 'BCC',\n                'subject' => 'Asunto',\n                'send-btn' => 'Enviar',\n                'message' => 'Mensaje',\n                'draft' => 'Borrador',\n            ],\n            'datagrid' => [\n                'id' => 'ID',\n                'from' => 'De',\n                'to' => 'Para',\n                'subject' => 'Asunto',\n                'tags' => 'Etiquetas',\n                'content' => 'Contenido',\n                'attachments' => 'Archivos adjuntos',\n                'date' => 'Fecha',\n                'move-to-inbox' => 'Mover a la bandeja de entrada',\n                'move-to-trash' => 'Movido a la papelera',\n                'edit' => 'Editar',\n                'view' => 'Ver',\n                'delete' => 'Eliminar',\n            ],\n        ],\n\n        'create-success' => 'Correo enviado con éxito.',\n        'update-success' => 'Correo actualizado con éxito.',\n        'mass-update-success' => 'Correos actualizados con éxito.',\n        'delete-success' => 'Correo eliminado con éxito.',\n        'delete-failed' => 'No se puede eliminar el correo.',\n        'invalid-route' => 'Ruta inválida para el correo.',\n        'unauthorized' => 'Esta acción no está autorizada.',\n\n        'view' => [\n            'title' => 'Correos',\n            'subject' => ':subject',\n            'link-mail' => 'Enlace de Correo',\n            'to' => 'Para',\n            'cc' => 'CC',\n            'bcc' => 'BCC',\n            'reply' => 'Responder',\n            'reply-all' => 'Responder a Todos',\n            'forward' => 'Reenviar',\n            'delete' => 'Eliminar',\n            'enter-mails' => 'Ingresar id de correo',\n            'rotten-days' => 'El lead está en estado crítico por :days días',\n            'search-an-existing-lead' => 'Buscar un lead existente',\n            'search-an-existing-contact' => 'Buscar un contacto existente',\n            'message' => 'Mensaje',\n            'add-attachments' => 'Añadir Archivos Adjuntos',\n            'discard' => 'Descartar',\n            'send' => 'Enviar',\n            'no-result-found' => 'No se encontraron resultados',\n            'add-new-contact' => 'Añadir Nuevo Contacto',\n            'description' => 'Descripción',\n            'search' => 'Buscar...',\n            'add-new-lead' => 'Añadir Nuevo Lead',\n            'create-new-contact' => 'Crear Nuevo Contacto',\n            'save-contact' => 'Guardar Contacto',\n            'create-lead' => 'Crear Lead',\n            'linked-contact' => 'Contacto Vinculado',\n            'link-to-contact' => 'Vincular a Contacto',\n            'link-to-lead' => 'Vincular a Lead',\n            'linked-lead' => 'Lead Vinculado',\n            'lead-details' => 'Detalles del Lead',\n            'contact-person' => 'Persona de Contacto',\n            'product' => 'Producto',\n            'tags' => [\n                'create-success' => 'Etiqueta creada con éxito.',\n                'destroy-success' => 'Etiqueta eliminada con éxito.',\n            ],\n        ],\n    ],\n    'common' => [\n        'custom-attributes' => [\n            'add-more' => 'Añadir Más',\n            'address' => 'Dirección',\n            'city' => 'Ciudad',\n            'contact' => 'Números de Contacto',\n            'country' => 'País',\n            'email' => 'Correo Electrónico',\n            'home' => 'Hogar',\n            'postcode' => 'Código Postal',\n            'save' => 'Guardar',\n            'select' => 'Seleccionar',\n            'select-country' => 'Seleccionar País',\n            'select-state' => 'Seleccionar Estado',\n            'state' => 'Estado',\n            'update-contact-title' => 'Actualizar Números de Contacto',\n            'update-emails-title' => 'Actualizar Correos Electrónicos de Contacto',\n            'work' => 'Trabajo',\n        ],\n    ],\n    'leads' => [\n        'create-success' => 'Lead creado exitosamente.',\n        'update-success' => 'Lead actualizado exitosamente.',\n        'update-failed' => 'No se pueden eliminar los clientes potenciales.',\n        'destroy-success' => 'Lead eliminado exitosamente.',\n        'destroy-failed' => 'No se puede eliminar el lead.',\n        'file' => [\n            'data-not-found' => 'Datos no encontrados.',\n            'empty-content' => 'El contenido del PDF está vacío o no se pudo extraer.',\n            'failed-extract' => 'No se pudo extraer el texto del archivo.',\n            'insufficient-info' => 'Debido a datos insuficientes, no podemos procesar su solicitud en este momento.',\n            'invalid-base64' => 'Formato base64 inválido.',\n            'invalid-format' => 'Formato JSON inválido.',\n            'invalid-response' => 'Formato de respuesta de IA inválido.',\n            'missing-api-key' => 'Falta la clave API o la configuración del modelo.',\n            'not-found' => 'Archivo no encontrado.',\n            'recursive-call' => 'Se detectó una llamada recursiva.',\n            'text-generation-failed' => 'La extracción de texto falló. El archivo podría estar vacío o ilegible.',\n        ],\n        'index' => [\n            'title' => 'Leads',\n            'create-btn' => 'Crear Lead',\n            'datagrid' => [\n                'id' => 'ID',\n                'sales-person' => 'Persona de Ventas',\n                'subject' => 'Asunto',\n                'source' => 'Fuente',\n                'lead-value' => 'Valor del Lead',\n                'lead-type' => 'Tipo de cliente potencial',\n                'tag-name' => 'Nombre de la etiqueta',\n                'contact-person' => 'Persona de Contacto',\n                'stage' => 'Etapa',\n                'rotten-lead' => 'Lead Podrido',\n                'date-to' => 'Fecha Hasta',\n                'created-at' => 'Creado En',\n                'no' => 'No',\n                'yes' => 'Sí',\n                'delete' => 'Eliminar',\n                'mass-delete' => 'Eliminar en Masa',\n                'mass-update' => 'Actualizar en Masa',\n            ],\n            'kanban' => [\n                'rotten-days' => 'El lead está podrido desde hace :days días',\n                'empty-list' => 'Tu lista de leads está vacía',\n                'empty-list-description' => 'Crea un lead para organizar tus objetivos.',\n                'create-lead-btn' => 'Crear Lead',\n                'columns' => [\n                    'contact-person' => 'Persona de Contacto',\n                    'id' => 'ID',\n                    'lead-type' => 'Tipo de Lead',\n                    'lead-value' => 'Valor del Lead',\n                    'sales-person' => 'Persona de Ventas',\n                    'source' => 'Fuente',\n                    'title' => 'Título',\n                    'tags' => 'Etiquetas',\n                    'expected-close-date' => 'Fecha de Cierre Esperada',\n                    'created-at' => 'Creado En',\n                ],\n                'toolbar' => [\n                    'search' => [\n                        'title' => 'Buscar por título',\n                    ],\n                    'filters' => [\n                        'apply-filters' => 'Aplicar Filtros',\n                        'clear-all' => 'Limpiar Todo',\n                        'filter' => 'Filtrar',\n                        'filters' => 'Filtros',\n                        'from' => 'De',\n                        'select' => 'Seleccionar',\n                        'to' => 'A',\n                    ],\n                ],\n            ],\n            'view-switcher' => [\n                'all-pipelines' => 'Todos los Canales',\n                'create-new-pipeline' => 'Crear Nuevo Canal',\n            ],\n            'upload' => [\n                'create-lead' => 'Crear Lead Usando IA',\n                'file' => 'Carga de archivo',\n                'file-info' => 'Solo se aceptan archivos en formato pdf, bmp, jpg, jpeg, png.',\n                'file-required' => 'Por favor, selecciona al menos un archivo válido para continuar.',\n                'save-btn' => 'Guardar',\n                'upload-file' => 'Subir archivo',\n            ],\n        ],\n        'create' => [\n            'title' => 'Crear Lead',\n            'save-btn' => 'Guardar',\n            'details' => 'Detalles',\n            'details-info' => 'Introduce la Información Básica del Lead',\n            'contact-person' => 'Persona de Contacto',\n            'contact-info' => 'Información Sobre la Persona de Contacto',\n            'products' => 'Productos',\n            'products-info' => 'Información Sobre los Productos',\n        ],\n        'edit' => [\n            'title' => 'Editar Lead',\n            'save-btn' => 'Guardar',\n            'details' => 'Detalles',\n            'details-info' => 'Introduce la Información Básica del Lead',\n            'contact-person' => 'Persona de Contacto',\n            'contact-info' => 'Información Sobre la Persona de Contacto',\n            'products' => 'Productos',\n            'products-info' => 'Información Sobre los Productos',\n        ],\n        'common' => [\n            'contact' => [\n                'name' => 'Nombre',\n                'email' => 'Correo Electrónico',\n                'contact-number' => 'Número de Contacto',\n                'organization' => 'Organización',\n            ],\n            'products' => [\n                'product-name' => 'Nombre del Producto',\n                'quantity' => 'Cantidad',\n                'price' => 'Precio',\n                'amount' => 'Monto',\n                'action' => 'Acción',\n                'add-more' => 'Agregar Más',\n                'total' => 'Total',\n            ],\n        ],\n        'view' => [\n            'title' => 'Lead: :title',\n            'rotten-days' => ':days Días',\n            'tabs' => [\n                'description' => 'Descripción',\n                'products' => 'Productos',\n                'quotes' => 'Cotizaciones',\n            ],\n            'attributes' => [\n                'title' => 'Sobre el Lead',\n            ],\n            'quotes' => [\n                'subject' => 'Asunto',\n                'expired-at' => 'Expirado En',\n                'sub-total' => 'Subtotal',\n                'discount' => 'Descuento',\n                'tax' => 'Impuesto',\n                'adjustment' => 'Ajuste',\n                'grand-total' => 'Total General',\n                'delete' => 'Eliminar',\n                'edit' => 'Editar',\n                'download' => 'Descargar',\n                'destroy-success' => 'Cotización eliminada exitosamente.',\n                'empty-title' => 'No se Encontraron Cotizaciones',\n                'empty-info' => 'No se Encontraron Cotizaciones para este Lead',\n                'add-btn' => 'Agregar Cotización',\n            ],\n            'products' => [\n                'product-name' => 'Nombre del Producto',\n                'quantity' => 'Cantidad',\n                'price' => 'Precio',\n                'amount' => 'Monto',\n                'action' => 'Acción',\n                'add-more' => 'Agregar Más',\n                'total' => 'Total',\n                'empty-title' => 'No se Encontraron Productos',\n                'empty-info' => 'No se Encontraron Productos para este Lead',\n                'add-product' => 'Agregar Producto',\n            ],\n            'persons' => [\n                'title' => 'Sobre las Personas',\n                'job-title' => ':job_title en :organization',\n            ],\n            'stages' => [\n                'won' => 'Ganado',\n                'lost' => 'Perdido',\n                'need-more-info' => 'Necesita Más Información',\n                'closed-at' => 'Cerrado En',\n                'won-value' => 'Valor Ganado',\n                'lost-reason' => 'Razón de la Pérdida',\n                'save-btn' => 'Guardar',\n            ],\n            'tags' => [\n                'create-success' => 'Etiqueta creada con éxito.',\n                'destroy-success' => 'Etiqueta eliminada con éxito.',\n            ],\n        ],\n    ],\n    'configuration' => [\n        'index' => [\n            'back' => 'Regresar',\n            'delete' => 'Eliminar',\n            'save-btn' => 'Guardar Configuración',\n            'save-success' => 'Configuración Guardada Exitosamente.',\n            'search' => 'Buscar',\n            'select-country' => 'Seleccionar País',\n            'select-state' => 'Seleccionar Estado',\n            'title' => 'Configuración',\n            'general' => [\n                'title' => 'General',\n                'info' => 'Configuración General',\n                'general' => [\n                    'title' => 'General',\n                    'info' => 'Actualiza tus configuraciones generales aquí.',\n                    'locale-settings' => [\n                        'title' => 'Configuraciones de Idioma',\n                        'title-info' => 'Define el idioma utilizado en la interfaz de usuario, como Árabe (ar), Inglés (en), Español (es), Persa (fa) y Turco (tr).',\n                    ],\n                    'admin-logo' => [\n                        'logo-image' => 'Imagen del Logo',\n                        'title' => 'Logo del Administrador',\n                        'title-info' => 'Configura la imagen del logo para tu panel de administración.',\n                    ],\n                ],\n                'settings' => [\n                    'title' => 'Configuraciones',\n                    'info' => 'Actualiza tus configuraciones aquí.',\n                    'footer' => [\n                        'info' => 'Podemos configurar la sección de powered by aquí.',\n                        'powered-by' => 'Editor de texto impulsado por',\n                        'title' => 'Configuraciones de la Sección Powered by',\n                    ],\n                    'menu' => [\n                        'activities' => 'Actividades',\n                        'configuration' => 'Configuración',\n                        'contacts' => 'Contactos',\n                        'dashboard' => 'Tablero',\n                        'draft' => 'Borrador',\n                        'inbox' => 'Bandeja de Entrada',\n                        'info' => 'Podemos configurar los nombres de los elementos del menú aquí.',\n                        'leads' => 'Leads',\n                        'mail' => 'Correo',\n                        'organizations' => 'Organizaciones',\n                        'outbox' => 'Bandeja de Salida',\n                        'persons' => 'Personas',\n                        'products' => 'Productos',\n                        'quotes' => 'Cotizaciones',\n                        'sent' => 'Enviados',\n                        'settings' => 'Configuraciones',\n                        'title' => 'Configuraciones de Elementos del Menú',\n                        'trash' => 'Papelera',\n                    ],\n                    'menu-color' => [\n                        'brand-color' => 'Brand Color',\n                        'info' => 'Podemos cambiar los colores de los elementos del menú aquí.',\n                        'title' => 'Configuraciones de Color de Elementos del Menú',\n                    ],\n                ],\n            ],\n            'email' => [\n                'title' => 'Configuración de Correo Electrónico',\n                'info' => 'Configuración de correo electrónico para la aplicación.',\n                'imap' => [\n                    'title' => 'Configuración IMAP',\n                    'info' => 'Configuración de correo electrónico IMAP para recibir correos electrónicos.',\n                    'account' => [\n                        'title' => 'Cuenta IMAP',\n                        'title-info' => 'Configura los ajustes de tu cuenta IMAP aquí.',\n                        'host' => 'Host',\n                        'port' => 'Puerto',\n                        'encryption' => 'Tipo de Cifrado',\n                        'validate-cert' => 'Validar Certificado SSL',\n                        'username' => 'Nombre de Usuario IMAP',\n                        'password' => 'Contraseña IMAP',\n                    ],\n                ],\n            ],\n            'magic-ai' => [\n                'title' => 'Magic AI',\n                'info' => 'Configuración de Magic AI para la aplicación.',\n                'settings' => [\n                    'api-key' => 'Clave API',\n                    'api-key-info' => 'Recuerda usar una clave API de OpenRouter para cada modelo. Es un paso simple para mejorar la seguridad y el rendimiento.',\n                    'enable' => 'Habilitar',\n                    'info' => 'Mejora tu experiencia con Magic AI con tu clave API de OpenRouter. ¡Intégrala ahora para una aventura de IA personalizada y sin problemas, hecha a tu medida! Personaliza la configuración sin esfuerzo y toma el control de tu viaje de IA.',\n                    'other' => 'Otro Modelo',\n                    'other-model' => 'Para otros modelos, usa el ID del Modelo de OpenRouter.',\n                    'doc-generation' => 'Generación de DOC',\n                    'doc-generation-info' => 'Habilita la función de generación de DOC para extraer automáticamente datos de archivos DOC y convertirlos a formato de texto. Mejora tu productividad y eficiencia habilitando esta función para agilizar tu flujo de trabajo.',\n                    'title' => 'Configuraciones Generales',\n                    'models' => [\n                        'deepseek-r1' => 'Deepseek R1 Distill-llama-8b',\n                        'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001',\n                        'gpt-4o' => 'GPT-4.0',\n                        'gpt-4o-mini' => 'GPT-4.0 mini',\n                        'grok-2-1212' => 'Grok 2.12',\n                        'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct',\n                        'title' => 'Modelos',\n                    ],\n                ],\n            ],\n        ],\n    ],\n    'dashboard' => [\n        'index' => [\n            'title' => 'Tablero',\n            'start-date' => 'Start Date',\n            'end-date' => 'End Date',\n            'revenue' => [\n                'lost-revenue' => 'Ingresos Perdidos',\n                'won-revenue' => 'Ingresos Ganados',\n            ],\n            'over-all' => [\n                'average-lead-value' => 'Valor Promedio de Lead',\n                'total-leads' => 'Total de Leads',\n                'average-leads-per-day' => 'Leads Promedio por Día',\n                'total-quotations' => 'Total de Cotizaciones',\n                'total-persons' => 'Total de Personas',\n                'total-organizations' => 'Total de Organizaciones',\n            ],\n            'total-leads' => [\n                'title' => 'Leads',\n                'total' => 'Total de Leads',\n                'won' => 'Leads Ganados',\n                'lost' => 'Leads Perdidos',\n            ],\n            'revenue-by-sources' => [\n                'title' => 'Ingresos por Fuentes',\n                'empty-title' => 'No Hay Datos Disponibles',\n                'empty-info' => 'No hay datos disponibles para el intervalo seleccionado',\n            ],\n            'revenue-by-types' => [\n                'title' => 'Ingresos por Tipos',\n                'empty-title' => 'No Hay Datos Disponibles',\n                'empty-info' => 'No hay datos disponibles para el intervalo seleccionado',\n            ],\n            'top-selling-products' => [\n                'title' => 'Productos Más Vendidos',\n                'empty-title' => 'No Se Encontraron Productos',\n                'empty-info' => 'No hay productos disponibles para el intervalo seleccionado',\n            ],\n            'top-persons' => [\n                'title' => 'Personas Más Destacadas',\n                'empty-title' => 'No Se Encontraron Personas',\n                'empty-info' => 'No hay personas disponibles para el intervalo seleccionado',\n            ],\n            'open-leads-by-states' => [\n                'title' => 'Leads Abiertos por Etapas',\n                'empty-title' => 'No Hay Datos Disponibles',\n                'empty-info' => 'No hay datos disponibles para el intervalo seleccionado',\n            ],\n        ],\n    ],\n    'layouts' => [\n        'app-version' => 'Versión: :version',\n        'dashboard' => 'Tablero',\n        'leads' => 'Leads',\n        'quotes' => 'Cotizaciones',\n        'quote' => 'Cotización',\n        'mail' => [\n            'title' => 'Correo',\n            'compose' => 'Redactar',\n            'inbox' => 'Bandeja de Entrada',\n            'draft' => 'Borradores',\n            'outbox' => 'Enviados',\n            'sent' => 'Enviados',\n            'trash' => 'Papelera',\n            'setting' => 'Configuración',\n        ],\n        'activities' => 'Actividades',\n        'contacts' => 'Contactos',\n        'persons' => 'Personas',\n        'person' => 'Persona',\n        'organizations' => 'Organizaciones',\n        'organization' => 'Organización',\n        'products' => 'Productos',\n        'product' => 'Producto',\n        'settings' => 'Configuraciones',\n        'user' => 'Usuario',\n        'user-info' => 'Administra todos tus usuarios y sus permisos en el CRM, lo que están autorizados a hacer.',\n        'groups' => 'Grupos',\n        'groups-info' => 'Agregar, editar o eliminar grupos del CRM',\n        'roles' => 'Roles',\n        'role' => 'Rol',\n        'roles-info' => 'Agregar, editar o eliminar roles del CRM',\n        'users' => 'Usuarios',\n        'users-info' => 'Agregar, editar o eliminar usuarios del CRM',\n        'lead' => 'Lead',\n        'lead-info' => 'Administra todas las configuraciones relacionadas con los leads en el CRM',\n        'pipelines' => 'Pipelines',\n        'pipelines-info' => 'Agregar, editar o eliminar pipelines del CRM',\n        'sources' => 'Fuentes',\n        'sources-info' => 'Agregar, editar o eliminar fuentes del CRM',\n        'types' => 'Tipos',\n        'types-info' => 'Agregar, editar o eliminar tipos del CRM',\n        'automation' => 'Automatización',\n        'automation-info' => 'Administra todas las configuraciones relacionadas con la automatización en el CRM',\n        'attributes' => 'Atributos',\n        'attribute' => 'Atributo',\n        'attributes-info' => 'Agregar, editar o eliminar atributos del CRM',\n        'email-templates' => 'Plantillas de Correo',\n        'email' => 'Correo',\n        'email-templates-info' => 'Agregar, editar o eliminar plantillas de correo del CRM',\n        'events' => 'Eventos',\n        'events-info' => 'Agregar, editar o eliminar eventos del CRM',\n        'campaigns' => 'Campañas',\n        'campaigns-info' => 'Agregar, editar o eliminar campañas del CRM',\n        'workflows' => 'Flujos de Trabajo',\n        'workflows-info' => 'Agregar, editar o eliminar flujos de trabajo del CRM',\n        'webhooks' => 'Webhooks',\n        'webhooks-info' => 'Agregar, editar o eliminar webhooks desde CRM',\n        'other-settings' => 'Otras Configuraciones',\n        'other-settings-info' => 'Administra todas tus configuraciones adicionales en el CRM',\n        'tags' => 'Etiquetas',\n        'tags-info' => 'Agregar, editar o eliminar etiquetas del CRM',\n        'my-account' => 'Mi Cuenta',\n        'sign-out' => 'Cerrar Sesión',\n        'back' => 'Volver',\n        'name' => 'Nombre',\n        'configuration' => 'Configuración',\n        'howdy' => '¡Hola!',\n        'warehouses' => 'Almacenes',\n        'warehouse' => 'Almacén',\n        'warehouses-info' => 'Agregar, editar o eliminar almacenes del CRM',\n        'inventory' => 'Inventario',\n        'inventory-info' => 'Gestionar todos los ajustes relacionados con el inventario en el CRM',\n        'data_transfer' => 'Transferencia de Datos',\n        'data_transfer_info' => 'Gestionar la configuración relacionada con la transferencia de datos de personas, productos y clientes potenciales en el CRM',\n    ],\n    'user' => [\n        'account' => [\n            'name' => 'Nombre',\n            'email' => 'Correo Electrónico',\n            'password' => 'Contraseña',\n            'my_account' => 'Mi cuenta',\n            'update_details' => 'Actualizar Detalles',\n            'current_password' => 'Contraseña Actual',\n            'confirm_password' => 'Confirmar Contraseña',\n            'password-match' => 'La contraseña actual no coincide.',\n            'account-save' => 'Cambios en la cuenta guardados exitosamente.',\n            'permission-denied' => 'Permiso Denegado',\n            'remove-image' => 'Eliminar Imagen',\n            'upload_image_pix' => 'Sube una Imagen de Perfil (100px x 100px)',\n            'upload_image_format' => 'en formato PNG o JPG',\n            'image_upload_message' => 'Solo se permiten imágenes (.jpeg, .jpg, .png, ..).',\n        ],\n    ],\n    'emails' => [\n        'common' => [\n            'dear' => 'Estimado/a :name',\n            'cheers' => 'Saludos,</br>Equipo :app_name',\n            'user' => [\n                'dear' => 'Estimado/a :username',\n                'create-subject' => 'Has sido agregado como miembro.',\n                'create-body' => '¡Felicidades! Ahora eres miembro de nuestro equipo.',\n                'forget-password' => [\n                    'subject' => 'Restablecimiento de Contraseña del Cliente',\n                    'dear' => 'Estimado/a :username',\n                    'reset-password' => 'Restablecer Contraseña',\n                    'info' => 'Estás recibiendo este correo porque recibimos una solicitud de restablecimiento de contraseña para tu cuenta',\n                    'final-summary' => 'Si no solicitaste el restablecimiento de contraseña, no se requiere ninguna acción adicional',\n                    'thanks' => '¡Gracias!',\n                ],\n            ],\n        ],\n    ],\n    'validations' => [\n        'message' => [\n            'decimal' => 'El :attribute debe ser un número decimal.',\n        ],\n    ],\n    'errors' => [\n        'dashboard' => 'Tablero',\n        'go-back' => 'Volver',\n        'support' => 'Si el problema persiste, contáctanos en <a href=\":link\" class=\":class\">:email</a> para obtener ayuda.',\n        '404' => [\n            'description' => '¡Ups! La página que estás buscando está de vacaciones. Parece que no pudimos encontrar lo que estabas buscando.',\n            'title' => '404 Página No Encontrada',\n        ],\n        '401' => [\n            'description' => '¡Ups! Parece que no tienes permiso para acceder a esta página. Parece que te faltan las credenciales necesarias.',\n            'title' => '401 No Autorizado',\n        ],\n        '403' => [\n            'description' => '¡Ups! Esta página está fuera de límites. Parece que no tienes los permisos necesarios para ver este contenido.',\n            'title' => '403 Prohibido',\n        ],\n        '500' => [\n            'description' => '¡Ups! Algo salió mal. Parece que tenemos problemas para cargar la página que estás buscando.',\n            'title' => '500 Error Interno del Servidor',\n        ],\n        '503' => [\n            'description' => '¡Ups! Parece que estamos temporalmente fuera de servicio por mantenimiento. Vuelve a intentarlo en un rato.',\n            'title' => '503 Servicio No Disponible',\n        ],\n    ],\n    'export' => [\n        'csv' => 'CSV',\n        'download' => 'Descargar',\n        'export' => 'Exportar',\n        'no-records' => 'No se encontraron registros.',\n        'xls' => 'XLS',\n        'xlsx' => 'XLSX',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/lang/fa/app.php",
    "content": "<?php\n\nreturn [\n    'acl' => [\n        'leads' => 'سرنخ‌ها',\n        'lead' => 'سرنخ',\n        'quotes' => 'پیشنهادات',\n        'mail' => 'ایمیل',\n        'inbox' => 'صندوق ورودی',\n        'draft' => 'پیش‌نویس',\n        'outbox' => 'صندوق خروجی',\n        'sent' => 'ارسال شده',\n        'trash' => 'زباله‌دان',\n        'activities' => 'فعالیت‌ها',\n        'webhook' => 'وب‌هوک',\n        'contacts' => 'مخاطبین',\n        'persons' => 'افراد',\n        'organizations' => 'سازمان‌ها',\n        'products' => 'محصولات',\n        'settings' => 'تنظیمات',\n        'groups' => 'گروه‌ها',\n        'roles' => 'نقش‌ها',\n        'users' => 'کاربران',\n        'user' => 'کاربر',\n        'automation' => 'اتوماسیون',\n        'attributes' => 'ویژگی‌ها',\n        'pipelines' => 'لوله‌ها',\n        'sources' => 'منابع',\n        'types' => 'انواع',\n        'email-templates' => 'قالب‌های ایمیل',\n        'workflows' => 'جریان‌کار',\n        'other-settings' => 'سایر تنظیمات',\n        'tags' => 'برچسب‌ها',\n        'configuration' => 'پیکربندی',\n        'create' => 'ایجاد',\n        'edit' => 'ویرایش',\n        'view' => 'نمایش',\n        'print' => 'چاپ',\n        'delete' => 'حذف',\n        'export' => 'صادر کردن',\n        'mass-delete' => 'حذف انبوه',\n        'data-transfer' => 'انتقال داده',\n        'imports' => 'واردات',\n        'import' => 'وارد کردن',\n        'event' => 'رویداد',\n        'campaigns' => 'کمپین‌ها',\n        'warehouses' => 'انبارها',\n        'inventory' => 'موجودی',\n    ],\n    'users' => [\n        'activate-warning' => 'حساب شما هنوز فعال نشده است. لطفاً با مدیر سیستم تماس بگیرید.',\n        'login-error' => 'اطلاعات وارد شده با سوابق ما مطابقت ندارد.',\n        'not-permission' => 'شما اجازه دسترسی به پنل مدیریت را ندارید.',\n        'login' => [\n            'email' => 'آدرس ایمیل',\n            'forget-password-link' => 'فراموشی رمز عبور؟',\n            'password' => 'رمز عبور',\n            'submit-btn' => 'ورود',\n            'title' => 'ورود',\n        ],\n        'forget-password' => [\n            'create' => [\n                'email' => 'ایمیل ثبت‌شده',\n                'email-not-exist' => 'ایمیل وجود ندارد',\n                'page-title' => 'فراموشی رمز عبور',\n                'reset-link-sent' => 'لینک بازنشانی رمز عبور ارسال شد',\n                'sign-in-link' => 'بازگشت به ورود؟',\n                'submit-btn' => 'بازنشانی',\n                'title' => 'بازیابی رمز عبور',\n            ],\n        ],\n        'reset-password' => [\n            'back-link-title' => 'بازگشت به ورود؟',\n            'confirm-password' => 'تأیید رمز عبور',\n            'email' => 'ایمیل ثبت‌شده',\n            'password' => 'رمز عبور',\n            'submit-btn' => 'بازنشانی رمز عبور',\n            'title' => 'بازنشانی رمز عبور',\n        ],\n    ],\n    'account' => [\n        'edit' => [\n            'back-btn' => 'بازگشت',\n            'change-password' => 'تغییر رمز عبور',\n            'confirm-password' => 'تایید رمز عبور',\n            'current-password' => 'رمز عبور فعلی',\n            'email' => 'ایمیل',\n            'general' => 'عمومی',\n            'invalid-password' => 'رمز عبور فعلی شما نادرست است.',\n            'name' => 'نام',\n            'password' => 'رمز عبور',\n            'profile-image' => 'تصویر پروفایل',\n            'save-btn' => 'ذخیره حساب کاربری',\n            'title' => 'حساب من',\n            'update-success' => 'حساب کاربری با موفقیت به‌روزرسانی شد',\n            'upload-image-info' => 'آپلود یک تصویر پروفایل (110px X 110px) در فرمت PNG یا JPG',\n        ],\n    ],\n    'components' => [\n        'activities' => [\n            'actions' => [\n                'mail' => [\n                    'btn' => 'ایمیل',\n                    'title' => 'نگارش ایمیل',\n                    'to' => 'به',\n                    'enter-emails' => 'برای افزودن ایمیل‌ها اینتر را فشار دهید',\n                    'cc' => 'کپی',\n                    'bcc' => 'کپی مخفی',\n                    'subject' => 'موضوع',\n                    'send-btn' => 'ارسال',\n                    'message' => 'پیام',\n                ],\n                'file' => [\n                    'btn' => 'فایل',\n                    'title' => 'افزودن فایل',\n                    'title-control' => 'عنوان',\n                    'name' => 'نام',\n                    'description' => 'توضیحات',\n                    'file' => 'فایل',\n                    'save-btn' => 'ذخیره فایل',\n                ],\n                'note' => [\n                    'btn' => 'یادداشت',\n                    'title' => 'افزودن یادداشت',\n                    'comment' => 'نظر',\n                    'save-btn' => 'ذخیره یادداشت',\n                ],\n                'activity' => [\n                    'btn' => 'فعالیت',\n                    'title' => 'افزودن فعالیت',\n                    'title-control' => 'عنوان',\n                    'description' => 'توضیحات',\n                    'schedule-from' => 'زمان‌بندی از',\n                    'schedule-to' => 'زمان‌بندی تا',\n                    'location' => 'محل',\n                    'call' => 'تماس',\n                    'meeting' => 'جلسه',\n                    'lunch' => 'ناهار',\n                    'save-btn' => 'ذخیره فعالیت',\n                    'participants' => [\n                        'title' => 'شرکت‌کنندگان',\n                        'placeholder' => 'برای جستجوی شرکت‌کنندگان تایپ کنید',\n                        'users' => 'کاربران',\n                        'persons' => 'افراد',\n                        'no-results' => 'هیچ نتیجه‌ای یافت نشد...',\n                    ],\n                ],\n            ],\n            'index' => [\n                'all' => 'همه',\n                'bcc' => 'کپی مخفی',\n                'by-user' => 'توسط :user',\n                'calls' => 'تماس‌ها',\n                'cc' => 'کپی',\n                'change-log' => 'تغییرات',\n                'delete' => 'حذف',\n                'edit' => 'ویرایش',\n                'emails' => 'ایمیل‌ها',\n                'empty' => 'خالی',\n                'files' => 'فایل‌ها',\n                'from' => 'از',\n                'location' => 'محل',\n                'lunches' => 'ناهارها',\n                'mark-as-done' => 'علامت زدن به عنوان انجام شده',\n                'meetings' => 'جلسات',\n                'notes' => 'یادداشت‌ها',\n                'participants' => 'شرکت‌کنندگان',\n                'planned' => 'برنامه‌ریزی شده',\n                'quotes' => 'نقل قول‌ها',\n                'scheduled-on' => 'برنامه‌ریزی شده در',\n                'system' => 'سیستم',\n                'to' => 'تا',\n                'unlink' => 'لغو پیوند',\n                'view' => 'مشاهده',\n                'empty-placeholders' => [\n                    'all' => [\n                        'title' => 'هیچ فعالیتی یافت نشد',\n                        'description' => 'هیچ فعالیتی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه \"فعالیت\" در پنل سمت چپ، فعالیت اضافه کنید.',\n                    ],\n                    'planned' => [\n                        'title' => 'هیچ فعالیت برنامه‌ریزی‌شده‌ای یافت نشد',\n                        'description' => 'هیچ فعالیت برنامه‌ریزی‌شده‌ای برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه \"فعالیت\" در پنل سمت چپ، فعالیت اضافه کنید.',\n                    ],\n                    'notes' => [\n                        'title' => 'یادداشتی یافت نشد',\n                        'description' => 'هیچ یادداشتی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه \"یادداشت\" در پنل سمت چپ، یادداشت اضافه کنید.',\n                    ],\n                    'calls' => [\n                        'title' => 'تماسی یافت نشد',\n                        'description' => 'هیچ تماسی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه \"فعالیت\" و انتخاب نوع تماس، تماس اضافه کنید.',\n                    ],\n                    'meetings' => [\n                        'title' => 'ملاقاتی یافت نشد',\n                        'description' => 'هیچ ملاقاتی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه \"فعالیت\" و انتخاب نوع جلسه، جلسه اضافه کنید.',\n                    ],\n                    'lunches' => [\n                        'title' => 'ناهاری یافت نشد',\n                        'description' => 'هیچ ناهاری برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه \"فعالیت\" و انتخاب نوع ناهار، ناهار اضافه کنید.',\n                    ],\n                    'files' => [\n                        'title' => 'فایلی یافت نشد',\n                        'description' => 'هیچ فایلی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه \"فایل\" در پنل سمت چپ، فایل اضافه کنید.',\n                    ],\n                    'emails' => [\n                        'title' => 'ایمیلی یافت نشد',\n                        'description' => 'هیچ ایمیلی برای این مورد یافت نشد. می‌توانید با کلیک روی دکمه \"ایمیل\" در پنل سمت چپ، ایمیل اضافه کنید.',\n                    ],\n                    'system' => [\n                        'title' => 'تغییری ثبت نشده است',\n                        'description' => 'هیچ گزارش تغییری برای این مورد یافت نشد.',\n                    ],\n                ],\n            ],\n        ],\n        'media' => [\n            'images' => [\n                'add-image-btn' => 'افزودن تصویر',\n                'ai-add-image-btn' => 'هوش مصنوعی جادویی',\n                'allowed-types' => 'png, jpeg, jpg',\n                'not-allowed-error' => 'فقط فایل‌های تصویری (.jpeg, .jpg, .png, ..) مجاز هستند.',\n                'placeholders' => [\n                    'front' => 'جلو',\n                    'next' => 'بعدی',\n                    'size' => 'اندازه',\n                    'use-cases' => 'موارد استفاده',\n                    'zoom' => 'بزرگنمایی',\n                ],\n            ],\n            'videos' => [\n                'add-video-btn' => 'افزودن ویدیو',\n                'allowed-types' => 'mp4, webm, mkv',\n                'not-allowed-error' => 'فقط فایل‌های ویدیویی (.mp4, .mov, .ogg ..) مجاز هستند.',\n            ],\n        ],\n        'datagrid' => [\n            'index' => [\n                'no-records-selected' => 'هیچ رکوردی انتخاب نشده است.',\n                'must-select-a-mass-action-option' => 'باید یک گزینه از اقدامات انبوه را انتخاب کنید.',\n                'must-select-a-mass-action' => 'باید یک اقدام انبوه را انتخاب کنید.',\n            ],\n            'toolbar' => [\n                'length-of' => ':length از',\n                'of' => 'از',\n                'per-page' => 'در هر صفحه',\n                'results' => ':total نتایج',\n                'delete' => 'حذف',\n                'selected' => ':total موارد انتخاب شده',\n                'mass-actions' => [\n                    'submit' => 'ارسال',\n                    'select-option' => 'انتخاب گزینه',\n                    'select-action' => 'انتخاب اقدام',\n                ],\n                'filter' => [\n                    'apply-filters-btn' => 'اعمال فیلترها',\n                    'back-btn' => 'بازگشت',\n                    'create-new-filter' => 'ایجاد فیلتر جدید',\n                    'custom-filters' => 'فیلترهای سفارشی',\n                    'delete-error' => 'خطایی در هنگام حذف فیلتر رخ داد، لطفاً دوباره تلاش کنید.',\n                    'delete-success' => 'فیلتر با موفقیت حذف شد.',\n                    'empty-description' => 'هیچ فیلتری برای ذخیره انتخاب نشده است. لطفاً فیلترها را برای ذخیره انتخاب کنید.',\n                    'empty-title' => 'افزودن فیلترها برای ذخیره',\n                    'name' => 'نام',\n                    'quick-filters' => 'فیلترهای سریع',\n                    'save-btn' => 'ذخیره',\n                    'save-filter' => 'ذخیره فیلتر',\n                    'saved-success' => 'فیلتر با موفقیت ذخیره شد.',\n                    'selected-filters' => 'فیلترهای انتخاب شده',\n                    'title' => 'فیلتر',\n                    'update' => 'به‌روزرسانی',\n                    'update-filter' => 'به‌روزرسانی فیلتر',\n                    'updated-success' => 'فیلتر با موفقیت به‌روزرسانی شد.',\n                ],\n                'search' => [\n                    'title' => 'جستجو',\n                ],\n            ],\n            'filters' => [\n                'select' => 'انتخاب',\n                'title' => 'فیلترها',\n                'dropdown' => [\n                    'searchable' => [\n                        'at-least-two-chars' => 'حداقل ۲ حرف تایپ کنید...',\n                        'no-results' => 'هیچ نتیجه‌ای یافت نشد...',\n                    ],\n                ],\n                'custom-filters' => [\n                    'clear-all' => 'پاک کردن همه',\n                    'title' => 'فیلترهای سفارشی',\n                ],\n                'boolean-options' => [\n                    'false' => 'نادرست',\n                    'true' => 'درست',\n                ],\n                'date-options' => [\n                    'last-month' => 'ماه گذشته',\n                    'last-six-months' => '۶ ماه گذشته',\n                    'last-three-months' => '۳ ماه گذشته',\n                    'this-month' => 'این ماه',\n                    'this-week' => 'این هفته',\n                    'this-year' => 'امسال',\n                    'today' => 'امروز',\n                    'yesterday' => 'دیروز',\n                ],\n            ],\n            'table' => [\n                'actions' => 'اقدامات',\n                'no-records-available' => 'رکوردی موجود نیست.',\n            ],\n        ],\n        'modal' => [\n            'confirm' => [\n                'agree-btn' => 'موافقم',\n                'disagree-btn' => 'مخالفم',\n                'message' => 'آیا مطمئن هستید که می‌خواهید این عمل را انجام دهید؟',\n                'title' => 'آیا مطمئن هستید؟',\n            ],\n        ],\n        'tags' => [\n            'index' => [\n                'title' => 'برچسب‌ها',\n                'added-tags' => 'برچسب‌های اضافه شده',\n                'save-btn' => 'ذخیره برچسب',\n                'placeholder' => 'برای جستجوی برچسب‌ها تایپ کنید',\n                'add-tag' => 'اضافه کردن \":term\"...',\n                'aquarelle-red' => 'قرمز آبرنگی',\n                'crushed-cashew' => 'بادام هندی خرد شده',\n                'beeswax' => 'موم عسل',\n                'lemon-chiffon' => 'لیمویی',\n                'snow-flurry' => 'برف سبک',\n                'honeydew' => 'شهد عسل',\n            ],\n        ],\n        'layouts' => [\n            'powered-by' => [\n                'description' => 'توسعه یافته توسط :krayin، یک پروژه متن باز از :webkul.',\n            ],\n            'header' => [\n                'mega-search' => [\n                    'title' => 'جستجوی بزرگ',\n                    'tabs' => [\n                        'leads' => 'سرنخ‌ها',\n                        'quotes' => 'پیشنهادات',\n                        'persons' => 'افراد',\n                        'products' => 'محصولات',\n                    ],\n                    'explore-all-products' => 'کاوش در تمامی محصولات',\n                    'explore-all-leads' => 'کاوش در تمامی سرنخ‌ها',\n                    'explore-all-contacts' => 'کاوش در تمامی مخاطبین',\n                    'explore-all-quotes' => 'کاوش در تمامی پیشنهادات',\n                    'explore-all-matching-products' => 'کاوش در تمامی محصولات مطابق \":query\" (:count)',\n                    'explore-all-matching-leads' => 'کاوش در تمامی سرنخ‌های مطابق \":query\" (:count)',\n                    'explore-all-matching-contacts' => 'کاوش در تمامی مخاطبین مطابق \":query\" (:count)',\n                    'explore-all-matching-quotes' => 'کاوش در تمامی پیشنهادات مطابق \":query\" (:count)',\n                ],\n            ],\n        ],\n        'attributes' => [\n            'edit' => [\n                'delete' => 'حذف',\n            ],\n            'lookup' => [\n                'click-to-add' => 'برای اضافه کردن کلیک کنید',\n                'search' => 'جستجو...',\n                'no-result-found' => 'نتیجه‌ای یافت نشد',\n            ],\n        ],\n        'lookup' => [\n            'click-to-add' => 'برای اضافه کردن کلیک کنید',\n            'no-results' => 'نتیجه‌ای یافت نشد',\n            'add-as-new' => 'اضافه کردن به عنوان جدید',\n            'search' => 'جستجو...',\n        ],\n        'flash-group' => [\n            'success' => 'موفقیت',\n            'error' => 'خطا',\n            'warning' => 'هشدار',\n            'info' => 'اطلاعات',\n        ],\n        'tiny-mce' => [\n            'http-error' => 'خطای HTTP',\n            'invalid-json' => 'پاسخ JSON نامعتبر از سرور.',\n            'upload-failed' => 'آپلود فایل ناموفق بود. لطفاً دوباره تلاش کنید.',\n        ],\n    ],\n    'quotes' => [\n        'index' => [\n            'title' => 'نقل‌قول‌ها',\n            'create-btn' => 'ایجاد نقل‌قول',\n            'create-success' => 'نقل‌قول با موفقیت ایجاد شد.',\n            'update-success' => 'نقل‌قول با موفقیت به‌روزرسانی شد.',\n            'delete-success' => 'نقل‌قول با موفقیت حذف شد.',\n            'delete-failed' => 'حذف نقل‌قول ممکن نیست.',\n            'datagrid' => [\n                'subject' => 'موضوع',\n                'sales-person' => 'فروشنده',\n                'expired-at' => 'تاریخ انقضا',\n                'created-at' => 'تاریخ ایجاد',\n                'person' => 'شخص',\n                'subtotal' => 'جمع جزء',\n                'discount' => 'تخفیف',\n                'tax' => 'مالیات',\n                'adjustment' => 'تنظیم',\n                'grand-total' => 'جمع کل',\n                'edit' => 'ویرایش',\n                'delete' => 'حذف',\n                'print' => 'چاپ',\n            ],\n            'pdf' => [\n                'adjustment' => 'تنظیم',\n                'amount' => 'مقدار',\n                'billing-address' => 'آدرس صورتحساب',\n                'date' => 'تاریخ',\n                'discount' => 'تخفیف',\n                'expired-at' => 'تاریخ انقضا',\n                'grand-total' => 'جمع کل',\n                'person' => 'شخص',\n                'price' => 'قیمت',\n                'product-name' => 'نام محصول',\n                'quantity' => 'تعداد',\n                'quote-id' => 'شناسه نقل‌قول',\n                'sales-person' => 'فروشنده',\n                'shipping-address' => 'آدرس ارسال',\n                'sku' => 'کد SKU',\n                'sub-total' => 'جمع جزء',\n                'subject' => 'موضوع',\n                'tax' => 'مالیات',\n                'title' => 'نقل‌قول',\n            ],\n        ],\n        'create' => [\n            'title' => 'ایجاد نقل‌قول',\n            'save-btn' => 'ذخیره نقل‌قول',\n            'quote-info' => 'اطلاعات نقل‌قول',\n            'quote-info-info' => 'اطلاعات پایه نقل‌قول را وارد کنید.',\n            'address-info' => 'اطلاعات آدرس',\n            'address-info-info' => 'اطلاعات مربوط به آدرس مرتبط با نقل‌قول.',\n            'quote-items' => 'موارد نقل‌قول',\n            'search-products' => 'جستجوی محصولات',\n            'link-to-lead' => 'پیوند به سرنخ',\n            'quote-item-info' => 'درخواست محصول را برای این نقل‌قول اضافه کنید.',\n            'quote-name' => 'نام نقل‌قول',\n            'quantity' => 'تعداد',\n            'price' => 'قیمت',\n            'discount' => 'تخفیف',\n            'tax' => 'مالیات',\n            'total' => 'مجموع',\n            'amount' => 'مقدار',\n            'add-item' => '+ افزودن مورد',\n            'sub-total' => 'جمع جزء (:symbol)',\n            'total-discount' => 'تخفیف (:symbol)',\n            'total-tax' => 'مالیات (:symbol)',\n            'total-adjustment' => 'تنظیم (:symbol)',\n            'grand-total' => 'جمع کل (:symbol)',\n            'discount-amount' => 'مقدار تخفیف',\n            'tax-amount' => 'مقدار مالیات',\n            'adjustment-amount' => 'مقدار تنظیم',\n            'product-name' => 'نام محصول',\n            'action' => 'عملیات',\n        ],\n        'edit' => [\n            'title' => 'ویرایش نقل‌قول',\n            'save-btn' => 'ذخیره نقل‌قول',\n            'quote-info' => 'اطلاعات نقل‌قول',\n            'quote-info-info' => 'اطلاعات پایه نقل‌قول را وارد کنید.',\n            'address-info' => 'اطلاعات آدرس',\n            'address-info-info' => 'اطلاعات مربوط به آدرس مرتبط با نقل‌قول.',\n            'quote-items' => 'موارد نقل‌قول',\n            'link-to-lead' => 'پیوند به سرنخ',\n            'quote-item-info' => 'درخواست محصول را برای این نقل‌قول اضافه کنید.',\n            'quote-name' => 'نام نقل‌قول',\n            'quantity' => 'تعداد',\n            'price' => 'قیمت',\n            'search-products' => 'جستجوی محصولات',\n            'discount' => 'تخفیف',\n            'tax' => 'مالیات',\n            'total' => 'مجموع',\n            'amount' => 'مقدار',\n            'add-item' => '+ افزودن مورد',\n            'sub-total' => 'جمع جزء (:symbol)',\n            'total-discount' => 'تخفیف (:symbol)',\n            'total-tax' => 'مالیات (:symbol)',\n            'total-adjustment' => 'تنظیم (:symbol)',\n            'grand-total' => 'جمع کل (:symbol)',\n            'discount-amount' => 'مقدار تخفیف',\n            'tax-amount' => 'مقدار مالیات',\n            'adjustment-amount' => 'مقدار تنظیم',\n            'product-name' => 'نام محصول',\n            'action' => 'عملیات',\n        ],\n    ],\n    'contacts' => [\n        'persons' => [\n            'index' => [\n                'title' => 'اشخاص',\n                'create-btn' => 'ایجاد شخص',\n                'create-success' => 'شخص با موفقیت ایجاد شد.',\n                'update-success' => 'شخص با موفقیت به‌روزرسانی شد.',\n                'all-delete-success' => 'همه افراد انتخاب‌شده با موفقیت حذف شدند.',\n                'partial-delete-warning' => 'برخی از افراد با موفقیت حذف شدند. بقیه به دلیل مرتبط بودن با سرنخ‌ها حذف نشدند.',\n                'none-delete-warning' => 'هیچ‌یک از افراد انتخاب‌شده به دلیل مرتبط بودن با سرنخ‌ها حذف نشدند.',\n                'no-selection' => 'هیچ فردی برای حذف انتخاب نشده است.',\n                'delete-failed' => 'حذف افراد انتخاب‌شده با شکست مواجه شد.',\n                'datagrid' => [\n                    'contact-numbers' => 'شماره‌های تماس',\n                    'delete' => 'حذف',\n                    'edit' => 'ویرایش',\n                    'emails' => 'ایمیل‌ها',\n                    'id' => 'شناسه',\n                    'view' => 'مشاهده',\n                    'name' => 'نام',\n                    'organization-name' => 'نام سازمان',\n                ],\n            ],\n            'view' => [\n                'title' => ':name',\n                'about-person' => 'درباره شخص',\n                'about-organization' => 'درباره سازمان',\n                'activities' => [\n                    'index' => [\n                        'all' => 'همه',\n                        'calls' => 'تماس‌ها',\n                        'meetings' => 'جلسات',\n                        'lunches' => 'ناهارها',\n                        'files' => 'فایل‌ها',\n                        'quotes' => 'نقل‌قول‌ها',\n                        'notes' => 'یادداشت‌ها',\n                        'emails' => 'ایمیل‌ها',\n                        'by-user' => 'توسط :user',\n                        'scheduled-on' => 'برنامه‌ریزی شده در',\n                        'location' => 'مکان',\n                        'participants' => 'شرکت‌کنندگان',\n                        'mark-as-done' => 'علامت‌گذاری به‌عنوان انجام شده',\n                        'delete' => 'حذف',\n                        'edit' => 'ویرایش',\n                    ],\n                    'actions' => [\n                        'mail' => [\n                            'btn' => 'ایمیل',\n                            'title' => 'ایمیل جدید',\n                            'to' => 'به',\n                            'cc' => 'کپی (CC)',\n                            'bcc' => 'کپی مخفی (BCC)',\n                            'subject' => 'موضوع',\n                            'send-btn' => 'ارسال',\n                            'message' => 'پیام',\n                        ],\n                        'file' => [\n                            'btn' => 'فایل',\n                            'title' => 'افزودن فایل',\n                            'title-control' => 'عنوان',\n                            'name' => 'نام فایل',\n                            'description' => 'توضیحات',\n                            'file' => 'فایل',\n                            'save-btn' => 'ذخیره فایل',\n                        ],\n                        'note' => [\n                            'btn' => 'یادداشت',\n                            'title' => 'افزودن یادداشت',\n                            'comment' => 'نظر',\n                            'save-btn' => 'ذخیره یادداشت',\n                        ],\n                        'activity' => [\n                            'btn' => 'فعالیت',\n                            'title' => 'افزودن فعالیت',\n                            'title-control' => 'عنوان',\n                            'description' => 'توضیحات',\n                            'schedule-from' => 'برنامه‌ریزی از',\n                            'schedule-to' => 'برنامه‌ریزی تا',\n                            'location' => 'مکان',\n                            'call' => 'تماس',\n                            'meeting' => 'جلسه',\n                            'lunch' => 'ناهار',\n                            'save-btn' => 'ذخیره فعالیت',\n                        ],\n                    ],\n                ],\n                'tags' => [\n                    'create-success' => 'برچسب با موفقیت ایجاد شد.',\n                    'destroy-success' => 'برچسب با موفقیت حذف شد.',\n                ],\n            ],\n            'create' => [\n                'title' => 'ایجاد شخص',\n                'save-btn' => 'ذخیره شخص',\n            ],\n            'edit' => [\n                'title' => 'ویرایش شخص',\n                'save-btn' => 'ذخیره شخص',\n            ],\n        ],\n        'organizations' => [\n            'index' => [\n                'title' => 'سازمان‌ها',\n                'create-btn' => 'ایجاد سازمان',\n                'create-success' => 'سازمان با موفقیت ایجاد شد.',\n                'update-success' => 'سازمان با موفقیت به‌روزرسانی شد.',\n                'delete-success' => 'سازمان با موفقیت حذف شد.',\n                'delete-failed' => 'سازمان قابل حذف نیست.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'edit' => 'ویرایش',\n                    'id' => 'شناسه',\n                    'name' => 'نام',\n                    'persons-count' => 'تعداد اشخاص',\n                ],\n            ],\n            'create' => [\n                'title' => 'ایجاد سازمان',\n                'save-btn' => 'ذخیره سازمان',\n            ],\n            'edit' => [\n                'title' => 'ویرایش سازمان',\n                'save-btn' => 'ذخیره سازمان',\n            ],\n        ],\n    ],\n    'products' => [\n        'index' => [\n            'title' => 'محصولات',\n            'create-btn' => 'ایجاد محصول',\n            'create-success' => 'محصول با موفقیت ایجاد شد.',\n            'update-success' => 'محصول با موفقیت به‌روزرسانی شد.',\n            'delete-success' => 'محصول با موفقیت حذف شد.',\n            'delete-failed' => 'محصول قابل حذف نیست.',\n            'datagrid' => [\n                'allocated' => 'اختصاص داده شده',\n                'delete' => 'حذف',\n                'edit' => 'ویرایش',\n                'id' => 'شناسه',\n                'in-stock' => 'در انبار',\n                'name' => 'نام',\n                'on-hand' => 'موجودی',\n                'tag-name' => 'نام برچسب',\n                'price' => 'قیمت',\n                'sku' => 'SKU',\n                'view' => 'مشاهده',\n            ],\n        ],\n        'create' => [\n            'save-btn' => 'ذخیره محصولات',\n            'title' => 'ایجاد محصولات',\n            'general' => 'عمومی',\n            'price' => 'قیمت',\n        ],\n        'edit' => [\n            'title' => 'ویرایش محصولات',\n            'save-btn' => 'ذخیره محصولات',\n            'general' => 'عمومی',\n            'price' => 'قیمت',\n        ],\n        'view' => [\n            'sku' => 'SKU',\n            'all' => 'همه',\n            'notes' => 'یادداشت‌ها',\n            'files' => 'فایل‌ها',\n            'inventories' => 'موجودی',\n            'change-logs' => 'تغییرات',\n            'attributes' => [\n                'about-product' => 'درباره محصول',\n            ],\n            'inventory' => [\n                'source' => 'منبع',\n                'in-stock' => 'در انبار',\n                'allocated' => 'اختصاص داده شده',\n                'on-hand' => 'موجودی',\n                'actions' => 'عملیات',\n                'assign' => 'اختصاص دادن',\n                'add-source' => 'افزودن منبع',\n                'location' => 'مکان',\n                'add-more' => 'افزودن بیشتر',\n                'save' => 'ذخیره',\n            ],\n        ],\n    ],\n    'settings' => [\n        'title' => 'تنظیمات',\n        'groups' => [\n            'index' => [\n                'create-btn' => 'ایجاد گروه',\n                'title' => 'گروه‌ها',\n                'create-success' => 'گروه با موفقیت ایجاد شد.',\n                'update-success' => 'گروه با موفقیت به‌روزرسانی شد.',\n                'destroy-success' => 'گروه با موفقیت حذف شد.',\n                'delete-failed' => 'امکان حذف گروه وجود ندارد.',\n                'delete-failed-associated-users' => 'امکان حذف گروه وجود ندارد زیرا توسط کاربران استفاده می‌شود.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'description' => 'توضیحات',\n                    'edit' => 'ویرایش',\n                    'id' => 'شناسه',\n                    'name' => 'نام',\n                ],\n                'edit' => [\n                    'title' => 'ویرایش گروه',\n                ],\n                'create' => [\n                    'name' => 'نام',\n                    'title' => 'ایجاد گروه',\n                    'description' => 'توضیحات',\n                    'save-btn' => 'ذخیره گروه',\n                ],\n            ],\n        ],\n        'roles' => [\n            'index' => [\n                'being-used' => 'نقش قابل حذف نیست، زیرا در کاربر مدیر استفاده می‌شود.',\n                'create-btn' => 'ایجاد نقش‌ها',\n                'create-success' => 'نقش با موفقیت ایجاد شد.',\n                'current-role-delete-error' => 'نقش اختصاص داده شده به کاربر فعلی قابل حذف نیست.',\n                'delete-failed' => 'نقش قابل حذف نیست.',\n                'delete-success' => 'نقش با موفقیت حذف شد.',\n                'last-delete-error' => 'حداقل یک نقش لازم است.',\n                'settings' => 'تنظیمات',\n                'title' => 'نقش‌ها',\n                'update-success' => 'نقش با موفقیت به‌روزرسانی شد.',\n                'user-define-error' => 'نقش سیستمی قابل حذف نیست.',\n                'datagrid' => [\n                    'all' => 'همه',\n                    'custom' => 'سفارشی',\n                    'delete' => 'حذف',\n                    'description' => 'توضیحات',\n                    'edit' => 'ویرایش',\n                    'id' => 'شناسه',\n                    'name' => 'نام',\n                    'permission-type' => 'نوع مجوز',\n                ],\n            ],\n            'create' => [\n                'access-control' => 'کنترل دسترسی',\n                'all' => 'همه',\n                'back-btn' => 'بازگشت',\n                'custom' => 'سفارشی',\n                'description' => 'توضیحات',\n                'general' => 'عمومی',\n                'name' => 'نام',\n                'permissions' => 'مجوزها',\n                'save-btn' => 'ذخیره نقش',\n                'title' => 'ایجاد نقش',\n            ],\n            'edit' => [\n                'access-control' => 'کنترل دسترسی',\n                'all' => 'همه',\n                'back-btn' => 'بازگشت',\n                'custom' => 'سفارشی',\n                'description' => 'توضیحات',\n                'general' => 'عمومی',\n                'name' => 'نام',\n                'permissions' => 'مجوزها',\n                'save-btn' => 'ذخیره نقش',\n                'title' => 'ویرایش نقش',\n            ],\n        ],\n        'types' => [\n            'index' => [\n                'create-btn' => 'ایجاد نوع',\n                'create-success' => 'نوع با موفقیت ایجاد شد.',\n                'delete-failed' => 'نوع قابل حذف نیست.',\n                'delete-success' => 'نوع با موفقیت حذف شد.',\n                'title' => 'نوع‌ها',\n                'update-success' => 'نوع با موفقیت به‌روزرسانی شد.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'description' => 'توضیحات',\n                    'edit' => 'ویرایش',\n                    'id' => 'شناسه',\n                    'name' => 'نام',\n                ],\n                'create' => [\n                    'name' => 'نام',\n                    'save-btn' => 'ذخیره نوع',\n                    'title' => 'ایجاد نوع',\n                ],\n                'edit' => [\n                    'title' => 'ویرایش نوع',\n                ],\n            ],\n        ],\n        'sources' => [\n            'index' => [\n                'title' => 'منابع',\n                'create-btn' => 'ایجاد منبع',\n                'create-success' => 'منبع با موفقیت ایجاد شد.',\n                'delete-failed' => 'امکان حذف منبع وجود ندارد.',\n                'delete-success' => 'منبع با موفقیت حذف شد.',\n                'update-success' => 'منبع با موفقیت به‌روزرسانی شد.',\n                'delete-failed-associated-leads' => 'نمی‌توان منبع را حذف کرد زیرا با سرنخ‌های موجود مرتبط است. لطفاً ابتدا آن‌ها را جدا کرده یا به‌روزرسانی کنید.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'edit' => 'ویرایش',\n                    'id' => 'شناسه',\n                    'name' => 'نام',\n                ],\n                'create' => [\n                    'name' => 'نام',\n                    'save-btn' => 'ذخیره منبع',\n                    'title' => 'ایجاد منبع',\n                ],\n                'edit' => [\n                    'title' => 'ویرایش منبع',\n                ],\n            ],\n        ],\n        'workflows' => [\n            'index' => [\n                'title' => 'جریان‌های کاری',\n                'create-btn' => 'ایجاد جریان کاری',\n                'create-success' => 'جریان کاری با موفقیت ایجاد شد.',\n                'update-success' => 'جریان کاری با موفقیت به‌روزرسانی شد.',\n                'delete-success' => 'جریان کاری با موفقیت حذف شد.',\n                'delete-failed' => 'جریان کاری قابل حذف نیست.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'description' => 'توضیحات',\n                    'edit' => 'ویرایش',\n                    'id' => 'شناسه',\n                    'name' => 'نام',\n                ],\n            ],\n            'helpers' => [\n                'update-related-leads' => 'به‌روزرسانی سرنخ‌های مرتبط',\n                'send-email-to-sales-owner' => 'ارسال ایمیل به صاحب فروش',\n                'send-email-to-participants' => 'ارسال ایمیل به شرکت‌کنندگان',\n                'add-webhook' => 'افزودن وب‌هوک',\n                'update-lead' => 'به‌روزرسانی سرنخ',\n                'update-person' => 'به‌روزرسانی شخص',\n                'send-email-to-person' => 'ارسال ایمیل به شخص',\n                'add-tag' => 'افزودن برچسب',\n                'add-note-as-activity' => 'افزودن یادداشت به‌عنوان فعالیت',\n                'update-quote' => 'به‌روزرسانی نقل‌قول',\n            ],\n            'create' => [\n                'title' => 'ایجاد جریان کاری',\n                'event' => 'رویداد',\n                'back-btn' => 'بازگشت',\n                'save-btn' => 'ذخیره جریان کاری',\n                'name' => 'نام',\n                'basic-details' => 'جزئیات پایه',\n                'description' => 'توضیحات',\n                'actions' => 'اقدامات',\n                'basic-details-info' => 'اطلاعات پایه جریان کاری را وارد کنید.',\n                'event-info' => 'یک رویداد triggers، چک‌ها، شرایط و اقدامات از پیش تعریف شده را انجام می‌دهد.',\n                'conditions' => 'شرایط',\n                'conditions-info' => 'شرایط قوانینی هستند که سناریوها را بررسی می‌کنند و در مواقع خاص فعال می‌شوند.',\n                'actions-info' => 'یک اقدام نه تنها بار کاری را کاهش می‌دهد بلکه فرآیند اتوماسیون CRM را بسیار آسان‌تر می‌کند.',\n                'value' => 'مقدار',\n                'condition-type' => 'نوع شرط',\n                'all-condition-are-true' => 'تمام شرایط صحیح هستند',\n                'any-condition-are-true' => 'هر شرطی صحیح است',\n                'add-condition' => 'افزودن شرط',\n                'add-action' => 'افزودن اقدام',\n                'yes' => 'بله',\n                'no' => 'خیر',\n                'email' => 'ایمیل',\n                'is-equal-to' => 'برابر است با',\n                'is-not-equal-to' => 'برابر نیست با',\n                'equals-or-greater-than' => 'برابر یا بزرگ‌تر از',\n                'equals-or-less-than' => 'برابر یا کوچک‌تر از',\n                'greater-than' => 'بزرگ‌تر از',\n                'less-than' => 'کوچک‌تر از',\n                'type' => 'نوع',\n                'contain' => 'شامل',\n                'contains' => 'شامل می‌شود',\n                'does-not-contain' => 'شامل نمی‌شود',\n            ],\n            'edit' => [\n                'title' => 'ویرایش جریان کاری',\n                'event' => 'رویداد',\n                'back-btn' => 'بازگشت',\n                'save-btn' => 'ذخیره جریان کاری',\n                'name' => 'نام',\n                'basic-details' => 'جزئیات پایه',\n                'description' => 'توضیحات',\n                'actions' => 'اقدامات',\n                'type' => 'نوع',\n                'basic-details-info' => 'اطلاعات پایه جریان کاری را وارد کنید.',\n                'event-info' => 'یک رویداد triggers، چک‌ها، شرایط و اقدامات از پیش تعریف شده را انجام می‌دهد.',\n                'conditions' => 'شرایط',\n                'conditions-info' => 'شرایط قوانینی هستند که سناریوها را بررسی می‌کنند و در مواقع خاص فعال می‌شوند.',\n                'actions-info' => 'یک اقدام نه تنها بار کاری را کاهش می‌دهد بلکه فرآیند اتوماسیون CRM را بسیار آسان‌تر می‌کند.',\n                'value' => 'مقدار',\n                'condition-type' => 'نوع شرط',\n                'all-condition-are-true' => 'تمام شرایط صحیح هستند',\n                'any-condition-are-true' => 'هر شرطی صحیح است',\n                'add-condition' => 'افزودن شرط',\n                'add-action' => 'افزودن اقدام',\n                'yes' => 'بله',\n                'no' => 'خیر',\n                'email' => 'ایمیل',\n                'is-equal-to' => 'برابر است با',\n                'is-not-equal-to' => 'برابر نیست با',\n                'equals-or-greater-than' => 'برابر یا بزرگ‌تر از',\n                'equals-or-less-than' => 'برابر یا کوچک‌تر از',\n                'greater-than' => 'بزرگ‌تر از',\n                'less-than' => 'کوچک‌تر از',\n                'contain' => 'شامل',\n                'contains' => 'شامل می‌شود',\n                'does-not-contain' => 'شامل نمی‌شود',\n            ],\n        ],\n        'webforms' => [\n            'index' => [\n                'title' => 'فرم‌های وب',\n                'create-btn' => 'ایجاد فرم وب',\n                'create-success' => 'فرم وب با موفقیت ایجاد شد.',\n                'update-success' => 'فرم وب با موفقیت به‌روزرسانی شد.',\n                'delete-success' => 'فرم وب با موفقیت حذف شد.',\n                'delete-failed' => 'فرم وب قابل حذف نیست.',\n                'datagrid' => [\n                    'id' => 'شناسه',\n                    'title' => 'عنوان',\n                    'edit' => 'ویرایش',\n                    'delete' => 'حذف',\n                ],\n            ],\n            'create' => [\n                'title' => 'ایجاد فرم وب',\n                'add-attribute-btn' => 'افزودن دکمه ویژگی',\n                'attribute-label-color' => 'رنگ برچسب ویژگی',\n                'attributes' => 'ویژگی‌ها',\n                'attributes-info' => 'ویژگی‌های سفارشی را به فرم اضافه کنید.',\n                'background-color' => 'رنگ پس‌زمینه',\n                'create-lead' => 'ایجاد سرب',\n                'customize-webform' => 'سفارشی‌سازی فرم وب',\n                'customize-webform-info' => 'فرم وب خود را با رنگ‌های انتخابی سفارشی‌سازی کنید.',\n                'description' => 'توضیحات',\n                'display-custom-message' => 'نمایش پیام سفارشی',\n                'form-background-color' => 'رنگ پس‌زمینه فرم',\n                'form-submit-btn-color' => 'رنگ دکمه ارسال فرم',\n                'form-submit-button-color' => 'رنگ دکمه ارسال فرم',\n                'form-title-color' => 'رنگ عنوان فرم',\n                'general' => 'عمومی',\n                'leads' => 'سرنخ‌ها',\n                'person' => 'شخص',\n                'save-btn' => 'ذخیره فرم وب',\n                'submit-button-label' => 'برچسب دکمه ارسال',\n                'submit-success-action' => 'عملکرد موفقیت آمیز ارسال',\n                'redirect-to-url' => 'انتقال به آدرس',\n                'choose-value' => 'انتخاب مقدار',\n                'select-file' => 'انتخاب فایل',\n                'select-image' => 'انتخاب تصویر',\n                'enter-value' => 'مقدار را وارد کنید',\n            ],\n            'edit' => [\n                'add-attribute-btn' => 'افزودن دکمه ویژگی',\n                'attribute-label-color' => 'رنگ برچسب ویژگی',\n                'attributes' => 'ویژگی‌ها',\n                'attributes-info' => 'ویژگی‌های سفارشی را به فرم اضافه کنید.',\n                'background-color' => 'رنگ پس‌زمینه',\n                'choose-value' => 'انتخاب مقدار',\n                'code-snippet' => 'کد نمونه',\n                'copied' => 'کپی شد',\n                'copy' => 'کپی',\n                'create-lead' => 'ایجاد سرب',\n                'customize-webform' => 'سفارشی‌سازی فرم وب',\n                'customize-webform-info' => 'فرم وب خود را با رنگ‌های انتخابی سفارشی‌سازی کنید.',\n                'description' => 'توضیحات',\n                'display-custom-message' => 'نمایش پیام سفارشی',\n                'embed' => 'گنجاندن',\n                'enter-value' => 'مقدار را وارد کنید',\n                'form-background-color' => 'رنگ پس‌زمینه فرم',\n                'form-submit-btn-color' => 'رنگ دکمه ارسال فرم',\n                'form-submit-button-color' => 'رنگ دکمه ارسال فرم',\n                'form-title-color' => 'رنگ عنوان فرم',\n                'general' => 'عمومی',\n                'leads' => 'سرنخ‌ها',\n                'person' => 'شخص',\n                'preview' => 'پیش‌نمایش',\n                'public-url' => 'آدرس عمومی',\n                'redirect-to-url' => 'انتقال به آدرس',\n                'save-btn' => 'ذخیره فرم وب',\n                'select-file' => 'انتخاب فایل',\n                'select-image' => 'انتخاب تصویر',\n                'submit-button-label' => 'برچسب دکمه ارسال',\n                'submit-success-action' => 'عملکرد موفقیت آمیز ارسال',\n                'title' => 'ویرایش فرم وب',\n            ],\n        ],\n        'email-template' => [\n            'index' => [\n                'create-btn' => 'ایجاد قالب ایمیل',\n                'title' => 'قالب‌های ایمیل',\n                'create-success' => 'قالب ایمیل با موفقیت ایجاد شد.',\n                'update-success' => 'قالب ایمیل با موفقیت به‌روزرسانی شد.',\n                'delete-success' => 'قالب ایمیل با موفقیت حذف شد.',\n                'delete-failed' => 'قالب ایمیل قابل حذف نیست.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'edit' => 'ویرایش',\n                    'id' => 'شناسه',\n                    'name' => 'نام',\n                    'subject' => 'موضوع',\n                ],\n            ],\n            'create' => [\n                'title' => 'ایجاد قالب ایمیل',\n                'save-btn' => 'ذخیره قالب ایمیل',\n                'email-template' => 'قالب ایمیل',\n                'subject' => 'موضوع',\n                'content' => 'محتوا',\n                'subject-placeholders' => 'متغیرهای موضوع',\n                'general' => 'عمومی',\n                'name' => 'نام',\n            ],\n            'edit' => [\n                'title' => 'ویرایش قالب ایمیل',\n                'save-btn' => 'ذخیره قالب ایمیل',\n                'email-template' => 'قالب ایمیل',\n                'subject' => 'موضوع',\n                'content' => 'محتوا',\n                'subject-placeholders' => 'متغیرهای موضوع',\n                'general' => 'عمومی',\n                'name' => 'نام',\n            ],\n        ],\n        'marketing' => [\n            'events' => [\n                'index' => [\n                    'create-btn' => 'ایجاد رویداد',\n                    'title' => 'رویدادها',\n                    'create-success' => 'رویداد با موفقیت ایجاد شد.',\n                    'update-success' => 'رویداد با موفقیت به‌روزرسانی شد.',\n                    'delete-success' => 'رویداد با موفقیت حذف شد.',\n                    'delete-failed' => 'رویداد قابل حذف نیست.',\n                    'mass-delete-success' => 'رویدادها با موفقیت حذف شدند',\n                    'delete-failed-associated-campaigns' => 'رویداد قابل حذف نیست زیرا با کمپین‌های موجود مرتبط است. لطفاً ابتدا آن‌ها را جدا کرده یا به‌روزرسانی کنید.',\n                    'datagrid' => [\n                        'delete' => 'حذف',\n                        'edit' => 'ویرایش',\n                        'id' => 'شناسه',\n                        'name' => 'نام',\n                        'description' => 'توضیحات',\n                        'date' => 'تاریخ',\n                    ],\n                    'create' => [\n                        'title' => 'ایجاد رویداد',\n                        'name' => 'نام',\n                        'date' => 'تاریخ',\n                        'description' => 'توضیحات',\n                        'save-btn' => 'ذخیره رویداد',\n                    ],\n                    'edit' => [\n                        'title' => 'ویرایش رویداد',\n                    ],\n                ],\n            ],\n            'campaigns' => [\n                'index' => [\n                    'create-btn' => 'ایجاد کمپین',\n                    'title' => 'کمپین‌ها',\n                    'create-success' => 'کمپین با موفقیت ایجاد شد.',\n                    'update-success' => 'کمپین با موفقیت به‌روزرسانی شد.',\n                    'delete-success' => 'کمپین با موفقیت حذف شد.',\n                    'delete-failed' => 'کمپین قابل حذف نیست.',\n                    'mass-delete-success' => 'کمپین‌ها با موفقیت حذف شدند',\n                    'datagrid' => [\n                        'id' => 'شناسه',\n                        'name' => 'نام',\n                        'subject' => 'موضوع',\n                        'status' => 'وضعیت',\n                        'active' => 'فعال',\n                        'inactive' => 'غیرفعال',\n                        'edit' => 'ویرایش',\n                        'delete' => 'حذف',\n                    ],\n                    'create' => [\n                        'title' => 'ایجاد کمپین',\n                        'name' => 'نام',\n                        'type' => 'نوع',\n                        'subject' => 'موضوع',\n                        'event' => 'رویداد',\n                        'email-template' => 'قالب ایمیل',\n                        'status' => 'وضعیت',\n                    ],\n                    'edit' => [\n                        'title' => 'ویرایش کمپین',\n                    ],\n                ],\n            ],\n        ],\n        'tags' => [\n            'index' => [\n                'create-btn' => 'ایجاد برچسب',\n                'title' => 'برچسب‌ها',\n                'create-success' => 'برچسب با موفقیت ایجاد شد.',\n                'update-success' => 'برچسب با موفقیت به‌روزرسانی شد.',\n                'delete-success' => 'برچسب با موفقیت حذف شد.',\n                'delete-failed' => 'برچسب قابل حذف نیست.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'edit' => 'ویرایش',\n                    'id' => 'شناسه',\n                    'name' => 'نام',\n                    'users' => 'کاربران',\n                    'created-at' => 'تاریخ ایجاد',\n                ],\n                'create' => [\n                    'name' => 'نام',\n                    'save-btn' => 'ذخیره برچسب',\n                    'title' => 'ایجاد برچسب',\n                    'color' => 'رنگ',\n                ],\n                'edit' => [\n                    'title' => 'ویرایش برچسب',\n                ],\n            ],\n        ],\n        'users' => [\n            'index' => [\n                'create-btn' => 'ایجاد کاربر',\n                'create-success' => 'کاربر با موفقیت ایجاد شد.',\n                'delete-failed' => 'کاربر قابل حذف نیست.',\n                'delete-success' => 'کاربر با موفقیت حذف شد.',\n                'last-delete-error' => 'حداقل یک کاربر لازم است.',\n                'mass-delete-failed' => 'کاربران قابل حذف نیستند.',\n                'mass-delete-success' => 'کاربران با موفقیت حذف شدند.',\n                'mass-update-failed' => 'کاربران قابل به‌روزرسانی نیستند.',\n                'mass-update-success' => 'کاربران با موفقیت به‌روزرسانی شدند.',\n                'title' => 'کاربران',\n                'update-success' => 'کاربر با موفقیت به‌روزرسانی شد.',\n                'user-define-error' => 'قابل حذف نیست.',\n                'active' => 'فعال',\n                'inactive' => 'غیرفعال',\n                'datagrid' => [\n                    'active' => 'فعال',\n                    'created-at' => 'تاریخ ایجاد',\n                    'delete' => 'حذف',\n                    'edit' => 'ویرایش',\n                    'email' => 'ایمیل',\n                    'id' => 'شناسه',\n                    'inactive' => 'غیرفعال',\n                    'name' => 'نام',\n                    'status' => 'وضعیت',\n                    'update-status' => 'به‌روزرسانی وضعیت',\n                    'users' => 'کاربران',\n                ],\n                'create' => [\n                    'confirm-password' => 'تأیید رمز عبور',\n                    'email' => 'ایمیل',\n                    'general' => 'عمومی',\n                    'global' => 'سراسری',\n                    'group' => 'گروه',\n                    'individual' => 'فردی',\n                    'name' => 'نام',\n                    'password' => 'رمز عبور',\n                    'permission' => 'مجوز',\n                    'role' => 'نقش',\n                    'save-btn' => 'ذخیره کاربر',\n                    'status' => 'وضعیت',\n                    'title' => 'ایجاد کاربر',\n                    'view-permission' => 'مجوز مشاهده',\n                    'select-at-lest-one-group' => 'Select at least one group',\n                ],\n                'edit' => [\n                    'title' => 'ویرایش کاربر',\n                ],\n            ],\n        ],\n        'pipelines' => [\n            'index' => [\n                'title' => 'پایپ‌لاین‌ها',\n                'create-btn' => 'ایجاد پایپ‌لاین',\n                'create-success' => 'پایپ‌لاین با موفقیت ایجاد شد.',\n                'update-success' => 'پایپ‌لاین با موفقیت به‌روزرسانی شد.',\n                'default-required' => 'حداقل یک پایپ‌لاین پیش‌فرض مورد نیاز است.',\n                'delete-success' => 'پایپ‌لاین با موفقیت حذف شد.',\n                'delete-failed' => 'پایپ‌لاین قابل حذف نیست.',\n                'default-delete-error' => 'پایپ‌لاین پیش‌فرض قابل حذف نیست.',\n                'datagrid' => [\n                    'delete' => 'حذف',\n                    'edit' => 'ویرایش',\n                    'id' => 'شناسه',\n                    'is-default' => 'پیش‌فرض',\n                    'name' => 'نام',\n                    'no' => 'خیر',\n                    'rotten-days' => 'روزهای فاسد',\n                    'yes' => 'بله',\n                ],\n            ],\n            'create' => [\n                'title' => 'ایجاد پایپ‌لاین',\n                'save-btn' => 'ذخیره پایپ‌لاین',\n                'name' => 'نام',\n                'rotten-days' => 'روزهای فاسد',\n                'mark-as-default' => 'علامت‌گذاری به‌عنوان پیش‌فرض',\n                'general' => 'عمومی',\n                'probability' => 'احتمال(%)',\n                'new-stage' => 'جدید',\n                'won-stage' => 'برنده',\n                'lost-stage' => 'بازنده',\n                'stage-btn' => 'افزودن مرحله',\n                'stages' => 'مراحل',\n                'duplicate-name' => 'فیلد \"نام\" نمی‌تواند تکراری باشد',\n                'delete-stage' => 'حذف مرحله',\n                'add-new-stages' => 'افزودن مراحل جدید',\n                'add-stage-info' => 'مرحله جدیدی برای پایپ‌لاین خود اضافه کنید',\n                'newly-added' => 'تازه اضافه شده',\n                'stage-delete-success' => 'مرحله با موفقیت حذف شد',\n            ],\n            'edit' => [\n                'title' => 'ویرایش پایپ‌لاین',\n                'save-btn' => 'ذخیره پایپ‌لاین',\n                'name' => 'نام',\n                'rotten-days' => 'روزهای فاسد',\n                'mark-as-default' => 'علامت‌گذاری به‌عنوان پیش‌فرض',\n                'general' => 'عمومی',\n                'probability' => 'احتمال(%)',\n                'new-stage' => 'جدید',\n                'won-stage' => 'برنده',\n                'lost-stage' => 'بازنده',\n                'stage-btn' => 'افزودن مرحله',\n                'stages' => 'مراحل',\n                'duplicate-name' => 'فیلد \"نام\" نمی‌تواند تکراری باشد',\n                'delete-stage' => 'حذف مرحله',\n                'add-new-stages' => 'افزودن مراحل جدید',\n                'add-stage-info' => 'مرحله جدیدی برای پایپ‌لاین خود اضافه کنید',\n                'stage-delete-success' => 'مرحله با موفقیت حذف شد',\n            ],\n        ],\n        'webhooks' => [\n            'index' => [\n                'title' => 'وب‌هوک‌ها',\n                'create-btn' => 'ایجاد وب‌هوک',\n                'create-success' => 'وب‌هوک با موفقیت ایجاد شد.',\n                'update-success' => 'وب‌هوک با موفقیت به‌روزرسانی شد.',\n                'delete-success' => 'وب‌هوک با موفقیت حذف شد.',\n                'delete-failed' => 'وب‌هوک قابل حذف نیست.',\n                'datagrid' => [\n                    'id' => 'شناسه',\n                    'delete' => 'حذف',\n                    'edit' => 'ویرایش',\n                    'name' => 'نام',\n                    'entity-type' => 'نوع موجودیت',\n                    'end-point' => 'پایان نقطه',\n                ],\n            ],\n            'create' => [\n                'title' => 'ایجاد وب‌هوک',\n                'save-btn' => 'ذخیره وب‌هوک',\n                'info' => 'جزئیات وب‌هوک‌ها را وارد کنید',\n                'url-and-parameters' => 'آدرس و پارامترها',\n                'method' => 'متد',\n                'post' => 'پست',\n                'put' => 'پوت',\n                'url-endpoint' => 'آدرس پایان',\n                'parameters' => 'پارامترها',\n                'add-new-parameter' => 'افزودن پارامتر جدید',\n                'url-preview' => 'پیش‌نمایش آدرس:',\n                'headers' => 'هدینگ‌ها',\n                'add-new-header' => 'افزودن هدینگ جدید',\n                'body' => 'بدن',\n                'default' => 'پیش‌فرض',\n                'x-www-form-urlencoded' => 'x-www-form-urlencoded',\n                'key-and-value' => 'کلید و مقدار',\n                'add-new-payload' => 'اضافه کردن بار جدید',\n                'raw' => 'خام',\n                'general' => 'عمومی',\n                'name' => 'نام',\n                'entity-type' => 'نوع موجودیت',\n                'insert-placeholder' => 'درج نشانه‌گذاری',\n                'description' => 'توضیحات',\n                'json' => 'جی‌سان',\n                'text' => 'متن',\n            ],\n            'edit' => [\n                'title' => 'ویرایش وب‌هوک',\n                'edit-btn' => 'ذخیره وب‌هوک',\n                'save-btn' => 'ذخیره وب‌هوک',\n                'info' => 'جزئیات وب‌هوک‌ها را وارد کنید',\n                'url-and-parameters' => 'آدرس و پارامترها',\n                'method' => 'متد',\n                'post' => 'پست',\n                'put' => 'پوت',\n                'url-endpoint' => 'آدرس پایان',\n                'parameters' => 'پارامترها',\n                'add-new-parameter' => 'افزودن پارامتر جدید',\n                'url-preview' => 'پیش‌نمایش آدرس:',\n                'headers' => 'هدینگ‌ها',\n                'add-new-header' => 'افزودن هدینگ جدید',\n                'body' => 'بدن',\n                'default' => 'پیش‌فرض',\n                'x-www-form-urlencoded' => 'x-www-form-urlencoded',\n                'key-and-value' => 'کلید و مقدار',\n                'add-new-payload' => 'اضافه کردن بار جدید',\n                'raw' => 'خام',\n                'general' => 'عمومی',\n                'name' => 'نام',\n                'entity-type' => 'نوع موجودیت',\n                'insert-placeholder' => 'درج نشانه‌گذاری',\n                'description' => 'توضیحات',\n                'json' => 'جی‌سان',\n                'text' => 'متن',\n            ],\n        ],\n        'warehouses' => [\n            'index' => [\n                'title' => 'انبارها',\n                'create-btn' => 'ایجاد انبار',\n                'create-success' => 'انبار با موفقیت ایجاد شد.',\n                'name-exists' => 'نام انبار قبلاً موجود است.',\n                'update-success' => 'انبار با موفقیت به‌روزرسانی شد.',\n                'delete-success' => 'انبار با موفقیت حذف شد.',\n                'delete-failed' => 'انبار قابل حذف نیست.',\n                'datagrid' => [\n                    'id' => 'شناسه',\n                    'name' => 'نام',\n                    'contact-name' => 'نام تماس',\n                    'delete' => 'حذف',\n                    'edit' => 'ویرایش',\n                    'view' => 'مشاهده',\n                    'created-at' => 'تاریخ ایجاد',\n                    'products' => 'محصولات',\n                    'contact-emails' => 'ایمیل‌های تماس',\n                    'contact-numbers' => 'شماره‌های تماس',\n                ],\n            ],\n            'create' => [\n                'title' => 'ایجاد انبار',\n                'save-btn' => 'ذخیره انبار',\n                'contact-info' => 'اطلاعات تماس',\n            ],\n            'edit' => [\n                'title' => 'ویرایش انبار',\n                'save-btn' => 'ذخیره انبار',\n                'contact-info' => 'اطلاعات تماس',\n            ],\n            'view' => [\n                'all' => 'همه',\n                'notes' => 'یادداشت‌ها',\n                'files' => 'فایل‌ها',\n                'location' => 'مکان',\n                'change-logs' => 'لاگ‌های تغییرات',\n                'locations' => [\n                    'action' => 'عملیات',\n                    'add-location' => 'افزودن مکان',\n                    'create-success' => 'مکان با موفقیت ایجاد شد.',\n                    'delete' => 'حذف',\n                    'delete-failed' => 'مکان قابل حذف نیست.',\n                    'delete-success' => 'مکان با موفقیت حذف شد.',\n                    'name' => 'نام',\n                    'save-btn' => 'ذخیره',\n                ],\n                'general-information' => [\n                    'title' => 'اطلاعات عمومی',\n                ],\n                'contact-information' => [\n                    'title' => 'اطلاعات تماس',\n                ],\n            ],\n        ],\n        'attributes' => [\n            'index' => [\n                'title' => 'ویژگی‌ها',\n                'create-btn' => 'ایجاد ویژگی',\n                'create-success' => 'ویژگی با موفقیت ایجاد شد.',\n                'update-success' => 'ویژگی با موفقیت به‌روزرسانی شد.',\n                'delete-success' => 'ویژگی با موفقیت حذف شد.',\n                'delete-failed' => 'ویژگی قابل حذف نیست.',\n                'user-define-error' => 'قادر به حذف ویژگی سیستم نیست.',\n                'mass-delete-failed' => 'ویژگی‌های سیستمی قابل حذف نیستند.',\n                'datagrid' => [\n                    'yes' => 'بله',\n                    'no' => 'خیر',\n                    'id' => 'شناسه',\n                    'code' => 'کد',\n                    'name' => 'نام',\n                    'entity-type' => 'نوع موجودیت',\n                    'type' => 'نوع',\n                    'is-default' => 'پیش‌فرض است',\n                    'edit' => 'ویرایش',\n                    'delete' => 'حذف',\n                    'entity-types' => [\n                        'leads' => 'سرنخ‌ها',\n                        'organizations' => 'سازمان‌ها',\n                        'persons' => 'افراد',\n                        'products' => 'محصولات',\n                        'quotes' => 'نقل‌قول‌ها',\n                        'warehouses' => 'انبارها',\n                    ],\n                    'types' => [\n                        'text' => 'متن',\n                        'textarea' => 'ناحیه متنی',\n                        'price' => 'قیمت',\n                        'boolean' => 'بولی',\n                        'select' => 'انتخاب',\n                        'multiselect' => 'چند انتخابی',\n                        'checkbox' => 'چک‌باکس',\n                        'email' => 'ایمیل',\n                        'address' => 'آدرس',\n                        'phone' => 'تلفن',\n                        'lookup' => 'جستجو',\n                        'datetime' => 'تاریخ و زمان',\n                        'date' => 'تاریخ',\n                        'image' => 'تصویر',\n                        'file' => 'فایل',\n                    ],\n                ],\n            ],\n            'create' => [\n                'title' => 'ایجاد ویژگی',\n                'save-btn' => 'ذخیره ویژگی',\n                'code' => 'کد',\n                'name' => 'نام',\n                'entity-type' => 'نوع موجودیت',\n                'type' => 'نوع',\n                'validations' => 'اعتبارسنجی‌ها',\n                'is-required' => 'الزامی است',\n                'input-validation' => 'اعتبارسنجی ورودی',\n                'is-unique' => 'منحصربه‌فرد است',\n                'labels' => 'برچسب‌ها',\n                'general' => 'عمومی',\n                'numeric' => 'عددی',\n                'decimal' => 'اعشاری',\n                'url' => 'آدرس',\n                'options' => 'گزینه‌ها',\n                'option-type' => 'نوع گزینه',\n                'lookup-type' => 'نوع جستجو',\n                'add-option' => 'افزودن گزینه',\n                'save-option' => 'ذخیره گزینه',\n                'option-name' => 'نام گزینه',\n                'add-attribute-options' => 'افزودن گزینه‌های ویژگی',\n                'text' => 'متن',\n                'textarea' => 'میدان متن',\n                'price' => 'قیمت',\n                'boolean' => 'بولی',\n                'select' => 'انتخاب',\n                'multiselect' => 'چند انتخابی',\n                'email' => 'ایمیل',\n                'address' => 'آدرس',\n                'phone' => 'تلفن',\n                'datetime' => 'تاریخ و زمان',\n                'date' => 'تاریخ',\n                'image' => 'تصویر',\n                'file' => 'فایل',\n                'lookup' => 'جستجو',\n                'entity_type' => 'نوع موجودیت',\n                'checkbox' => 'چک باکس',\n                'is_required' => 'الزامی است',\n                'is_unique' => 'منحصربه‌فرد است',\n                'actions' => 'عملیات',\n            ],\n            'edit' => [\n                'actions' => 'عملیات',\n                'add-attribute-options' => 'افزودن گزینه‌های ویژگی',\n                'add-option' => 'افزودن گزینه',\n                'address' => 'آدرس',\n                'boolean' => 'بولی',\n                'checkbox' => 'چک باکس',\n                'code' => 'کد',\n                'date' => 'تاریخ',\n                'datetime' => 'تاریخ و زمان',\n                'decimal' => 'اعشاری',\n                'email' => 'ایمیل',\n                'entity-type' => 'نوع موجودیت',\n                'entity_type' => 'نوع موجودیت',\n                'file' => 'فایل',\n                'general' => 'عمومی',\n                'image' => 'تصویر',\n                'input-validation' => 'اعتبارسنجی ورودی',\n                'is-required' => 'الزامی است',\n                'is-unique' => 'منحصربه‌فرد است',\n                'is_required' => 'الزامی است',\n                'is_unique' => 'منحصربه‌فرد است',\n                'labels' => 'برچسب‌ها',\n                'lookup' => 'جستجو',\n                'lookup-type' => 'نوع جستجو',\n                'multiselect' => 'چند انتخابی',\n                'name' => 'نام',\n                'numeric' => 'عددی',\n                'option-deleted' => 'Attribute Option is deleted successfully',\n                'option-name' => 'نام گزینه',\n                'option-type' => 'نوع گزینه',\n                'options' => 'گزینه‌ها',\n                'phone' => 'تلفن',\n                'price' => 'قیمت',\n                'save-btn' => 'ذخیره ویژگی',\n                'save-option' => 'ذخیره گزینه',\n                'select' => 'انتخاب',\n                'text' => 'متن',\n                'textarea' => 'میدان متن',\n                'title' => 'ویرایش ویژگی',\n                'type' => 'نوع',\n                'url' => 'آدرس',\n                'validations' => 'اعتبارسنجی‌ها',\n            ],\n        ],\n        'data-transfer' => [\n            'imports' => [\n                'create' => [\n                    'action' => 'عملیات',\n                    'allowed-errors' => 'خطاهای مجاز',\n                    'back-btn' => 'بازگشت',\n                    'create-update' => 'ایجاد/به‌روزرسانی',\n                    'delete' => 'حذف',\n                    'download-sample' => 'دانلود نمونه',\n                    'field-separator' => 'جداکننده فیلد',\n                    'file' => 'فایل',\n                    'general' => 'عمومی',\n                    'images-directory' => 'مسیر پوشه تصاویر',\n                    'process-in-queue' => 'پردازش در صف',\n                    'results' => 'نتایج',\n                    'save-btn' => 'ذخیره واردات',\n                    'settings' => 'تنظیمات',\n                    'skip-errors' => 'رد کردن خطاها',\n                    'stop-on-errors' => 'توقف در صورت خطا',\n                    'title' => 'ایجاد واردات',\n                    'type' => 'نوع',\n                    'validation-strategy' => 'استراتژی اعتبارسنجی',\n                ],\n                'edit' => [\n                    'action' => 'عملیات',\n                    'allowed-errors' => 'خطاهای مجاز',\n                    'back-btn' => 'بازگشت',\n                    'create-update' => 'ایجاد/به‌روزرسانی',\n                    'delete' => 'حذف',\n                    'download-sample' => 'دانلود نمونه',\n                    'field-separator' => 'جداکننده فیلد',\n                    'file' => 'فایل',\n                    'general' => 'عمومی',\n                    'images-directory' => 'مسیر پوشه تصاویر',\n                    'process-in-queue' => 'پردازش در صف',\n                    'results' => 'نتایج',\n                    'save-btn' => 'ذخیره واردات',\n                    'settings' => 'تنظیمات',\n                    'skip-errors' => 'رد کردن خطاها',\n                    'stop-on-errors' => 'توقف در صورت خطا',\n                    'title' => 'ویرایش واردات',\n                    'type' => 'نوع',\n                    'validation-strategy' => 'استراتژی اعتبارسنجی',\n                ],\n                'index' => [\n                    'button-title' => 'ایجاد واردات',\n                    'title' => 'واردات‌ها',\n                    'datagrid' => [\n                        'actions' => 'عملیات',\n                        'completed-at' => 'تکمیل شده در',\n                        'created' => 'ایجاد شده',\n                        'delete' => 'حذف',\n                        'deleted' => 'حذف شده',\n                        'edit' => 'ویرایش',\n                        'error-file' => 'فایل خطا',\n                        'id' => 'شناسه',\n                        'started-at' => 'شروع شده در',\n                        'state' => 'وضعیت',\n                        'summary' => 'خلاصه',\n                        'type' => 'نوع',\n                        'updated' => 'به‌روزرسانی شده',\n                        'uploaded-file' => 'فایل آپلود شده',\n                    ],\n                ],\n                'import' => [\n                    'back-btn' => 'بازگشت',\n                    'completed-batches' => 'کل دسته‌های تکمیل شده:',\n                    'download-error-report' => 'دانلود گزارش کامل',\n                    'edit-btn' => 'ویرایش',\n                    'imported-info' => 'تبریک! واردات شما با موفقیت انجام شد.',\n                    'importing-info' => 'واردات در حال انجام است',\n                    'indexing-info' => 'ایندکس‌گذاری منابع (قیمت، موجودی و Elastic Search) در حال پیشرفت است',\n                    'linking-info' => 'پیونددهی منابع در حال انجام است',\n                    'progress' => 'پیشرفت:',\n                    'title' => 'واردات',\n                    'total-batches' => 'کل دسته‌ها:',\n                    'total-created' => 'کل رکوردهای ایجاد شده:',\n                    'total-deleted' => 'کل رکوردهای حذف شده:',\n                    'total-errors' => 'کل خطاها:',\n                    'total-invalid-rows' => 'کل ردیف‌های نامعتبر:',\n                    'total-rows-processed' => 'کل ردیف‌های پردازش شده:',\n                    'total-updated' => 'کل رکوردهای به‌روزرسانی شده:',\n                    'validate' => 'اعتبارسنجی',\n                    'validate-info' => 'برای بررسی واردات خود، روی \"اعتبارسنجی داده‌ها\" کلیک کنید.',\n                    'validating-info' => 'خواندن و اعتبارسنجی داده‌ها آغاز شده است',\n                    'validation-failed-info' => 'واردات شما نامعتبر است. لطفاً خطاهای زیر را رفع کرده و دوباره تلاش کنید.',\n                    'validation-success-info' => 'واردات شما معتبر است. برای شروع فرآیند واردات، روی \"واردات\" کلیک کنید.',\n                ],\n                'create-success' => 'واردات با موفقیت ایجاد شد.',\n                'delete-failed' => 'حذف واردات به طور غیرمنتظره‌ای ناکام ماند.',\n                'delete-success' => 'واردات با موفقیت حذف شد.',\n                'not-valid' => 'واردات نامعتبر است',\n                'nothing-to-import' => 'هیچ منبعی برای واردات وجود ندارد.',\n                'setup-queue-error' => 'لطفاً درایور صف خود را به \"database\" یا \"redis\" تغییر دهید تا فرآیند واردات شروع شود.',\n                'update-success' => 'واردات با موفقیت به‌روزرسانی شد.',\n            ],\n        ],\n    ],\n    'activities' => [\n        'index' => [\n            'title' => 'فعالیت‌ها',\n            'datagrid' => [\n                'comment' => 'نظر',\n                'created_at' => 'تاریخ ایجاد',\n                'created_by' => 'ایجاد شده توسط',\n                'edit' => 'ویرایش',\n                'id' => 'شناسه',\n                'done' => 'انجام شده',\n                'not-done' => 'انجام نشده',\n                'lead' => 'سرنخ',\n                'mass-delete' => 'حذف انبوه',\n                'mass-update' => 'به‌روزرسانی انبوه',\n                'schedule-from' => 'برنامه‌ریزی از',\n                'schedule-to' => 'برنامه‌ریزی تا',\n                'schedule_from' => 'برنامه‌ریزی از',\n                'schedule_to' => 'برنامه‌ریزی تا',\n                'title' => 'عنوان',\n                'is_done' => 'انجام شده',\n                'type' => 'نوع',\n                'update' => 'به‌روزرسانی',\n                'call' => 'تماس',\n                'meeting' => 'جلسه',\n                'lunch' => 'ناهار',\n            ],\n        ],\n        'edit' => [\n            'title' => 'ویرایش فعالیت',\n            'back-btn' => 'برگشت',\n            'save-btn' => 'ذخیره فعالیت',\n            'type' => 'نوع فعالیت',\n            'call' => 'تماس',\n            'meeting' => 'جلسه',\n            'lunch' => 'ناهار',\n            'schedule_to' => 'برنامه‌ریزی تا',\n            'schedule_from' => 'برنامه‌ریزی از',\n            'location' => 'مکان',\n            'comment' => 'نظر',\n            'lead' => 'سرنخ',\n            'participants' => 'شرکت‌کنندگان',\n            'general' => 'عمومی',\n            'persons' => 'افراد',\n            'no-result-found' => 'سوابقی یافت نشد.',\n            'users' => 'کاربران',\n        ],\n        'updated' => 'به‌روزرسانی شد :attribute',\n        'created' => 'ایجاد شد',\n        'duration-overlapping' => 'شرکت‌کنندگان در این زمان جلسه دیگری دارند. آیا می‌خواهید ادامه دهید؟',\n        'create-success' => 'فعالیت با موفقیت ایجاد شد.',\n        'update-success' => 'فعالیت با موفقیت به‌روزرسانی شد.',\n        'overlapping-error' => 'شرکت‌کنندگان در این زمان جلسه دیگری دارند.',\n        'destroy-success' => 'فعالیت با موفقیت حذف شد.',\n        'delete-failed' => 'امکان حذف فعالیت وجود ندارد.',\n        'mass-update-success' => 'فعالیت‌ها با موفقیت به‌روزرسانی شدند.',\n        'mass-destroy-success' => 'فعالیت‌ها با موفقیت حذف شدند.',\n        'mass-delete-failed' => 'امکان حذف فعالیت‌ها وجود ندارد.',\n    ],\n    'mail' => [\n        'index' => [\n            'compose' => 'نوشتن',\n            'draft' => 'پیش‌نویس',\n            'inbox' => 'صندوق ورودی',\n            'outbox' => 'صندوق خروجی',\n            'sent' => 'ارسال شده',\n            'trash' => 'سطل زباله',\n            'compose-mail-btn' => 'نوشتن ایمیل',\n            'btn' => 'ایمیل',\n            'mail' => [\n                'title' => 'نوشتن ایمیل',\n                'to' => 'به',\n                'enter-emails' => 'برای اضافه کردن ایمیل‌ها، کلید Enter را فشار دهید',\n                'cc' => 'CC',\n                'bcc' => 'BCC',\n                'subject' => 'موضوع',\n                'send-btn' => 'ارسال',\n                'message' => 'پیام',\n                'draft' => 'پیش‌نویس',\n            ],\n            'datagrid' => [\n                'id' => 'شناسه',\n                'from' => 'از',\n                'to' => 'به',\n                'subject' => 'موضوع',\n                'tags' => 'برچسب‌ها',\n                'content' => 'محتوا',\n                'attachments' => 'پیوست‌ها',\n                'date' => 'تاریخ',\n                'move-to-inbox' => 'انتقال به صندوق ورودی',\n                'move-to-trash' => 'به سطل زباله منتقل شد',\n                'edit' => 'ویرایش',\n                'view' => 'نمایش',\n                'delete' => 'حذف',\n            ],\n        ],\n        'create-success' => 'ایمیل با موفقیت ارسال شد.',\n        'update-success' => 'ایمیل با موفقیت به‌روزرسانی شد.',\n        'mass-update-success' => 'ایمیل‌ها با موفقیت به‌روزرسانی شدند.',\n        'delete-success' => 'ایمیل با موفقیت حذف شد.',\n        'delete-failed' => 'ایمیل قابل حذف نیست.',\n        'invalid-route' => 'مسیر نامعتبر برای ایمیل.',\n        'unauthorized' => 'این عمل مجاز نیست.',\n        'view' => [\n            'title' => 'ایمیل‌ها',\n            'subject' => ':subject',\n            'link-mail' => 'لینک ایمیل',\n            'to' => 'به',\n            'cc' => 'CC',\n            'bcc' => 'BCC',\n            'reply' => 'پاسخ',\n            'reply-all' => 'پاسخ به همه',\n            'forward' => 'فوروارد',\n            'delete' => 'حذف',\n            'enter-mails' => 'شناسه ایمیل را وارد کنید',\n            'rotten-days' => 'سرنخ به مدت :days روز خراب شده است',\n            'search-an-existing-lead' => 'جستجوی سرنخ موجود',\n            'search-an-existing-contact' => 'جستجوی مخاطب موجود',\n            'message' => 'پیام',\n            'add-attachments' => 'اضافه کردن پیوست‌ها',\n            'discard' => 'لغو',\n            'send' => 'ارسال',\n            'no-result-found' => 'نتیجه‌ای یافت نشد',\n            'add-new-contact' => 'افزودن مخاطب جدید',\n            'description' => 'توضیحات',\n            'search' => 'جستجو...',\n            'add-new-lead' => 'افزودن سرنخ جدید',\n            'create-new-contact' => 'ایجاد مخاطب جدید',\n            'save-contact' => 'ذخیره مخاطب',\n            'create-lead' => 'ایجاد سرنخ',\n            'linked-contact' => 'مخاطب مرتبط',\n            'link-to-contact' => 'لینک به مخاطب',\n            'link-to-lead' => 'لینک به سرنخ',\n            'linked-lead' => 'سرنخ مرتبط',\n            'lead-details' => 'جزئیات سرنخ',\n            'contact-person' => 'شخص تماس',\n            'product' => 'محصول',\n            'tags' => [\n                'create-success' => 'برچسب با موفقیت ایجاد شد.',\n                'destroy-success' => 'برچسب با موفقیت حذف شد.',\n            ],\n        ],\n    ],\n    'common' => [\n        'custom-attributes' => [\n            'add-more' => 'افزودن بیشتر',\n            'address' => 'آدرس',\n            'city' => 'شهر',\n            'contact' => 'شماره‌های تماس',\n            'country' => 'کشور',\n            'email' => 'ایمیل',\n            'home' => 'خانه',\n            'postcode' => 'کد پستی',\n            'save' => 'ذخیره',\n            'select' => 'انتخاب',\n            'select-country' => 'انتخاب کشور',\n            'select-state' => 'انتخاب ایالت',\n            'state' => 'ایالت',\n            'update-contact-title' => 'به‌روزرسانی شماره‌های تماس',\n            'update-emails-title' => 'به‌روزرسانی ایمیل‌های تماس',\n            'work' => 'محل کار',\n        ],\n    ],\n    'leads' => [\n        'create-success' => 'سرنخ با موفقیت ایجاد شد.',\n        'update-success' => 'سرنخ با موفقیت به‌روزرسانی شد.',\n        'update-failed' => 'سرنخ‌ها قابل حذف نیستند.',\n        'destroy-success' => 'سرنخ با موفقیت حذف شد.',\n        'destroy-failed' => 'سرنخ قابل حذف نیست.',\n        'file' => [\n            'data-not-found' => 'داده‌ای یافت نشد.',\n            'empty-content' => 'محتوای PDF خالی است یا نمی‌توان آن را استخراج کرد.',\n            'failed-extract' => 'استخراج متن از فایل ناموفق بود.',\n            'insufficient-info' => 'به دلیل اطلاعات ناکافی، در حال حاضر نمی‌توانیم درخواست شما را پردازش کنیم.',\n            'invalid-base64' => 'فرمت base64 نامعتبر است.',\n            'invalid-format' => 'فرمت JSON نامعتبر است.',\n            'invalid-response' => 'فرمت پاسخ هوش مصنوعی نامعتبر است.',\n            'missing-api-key' => 'کلید API یا پیکربندی مدل مفقود است.',\n            'not-found' => 'فایل یافت نشد.',\n            'recursive-call' => 'تماس بازگشتی شناسایی شد.',\n            'text-generation-failed' => 'استخراج متن ناموفق بود. فایل ممکن است خالی یا غیرقابل خواندن باشد.',\n        ],\n        'index' => [\n            'title' => 'سرنخ‌ها',\n            'create-btn' => 'ایجاد سرنخ',\n            'datagrid' => [\n                'id' => 'شناسه',\n                'sales-person' => 'کارشناس فروش',\n                'subject' => 'موضوع',\n                'source' => 'منبع',\n                'lead-value' => 'ارزش سرنخ',\n                'lead-type' => 'نوع سرنخ',\n                'tag-name' => 'نام برچسب',\n                'contact-person' => 'شخص تماس',\n                'stage' => 'مرحله',\n                'rotten-lead' => 'سرنخ خراب شده',\n                'date-to' => 'تاریخ تا',\n                'created-at' => 'تاریخ ایجاد',\n                'no' => 'خیر',\n                'yes' => 'بله',\n                'delete' => 'حذف',\n                'mass-delete' => 'حذف گروهی',\n                'mass-update' => 'به‌روزرسانی گروهی',\n            ],\n            'kanban' => [\n                'rotten-days' => 'سرنخ برای :days روز خراب شده است',\n                'empty-list' => 'لیست سرنخ‌های شما خالی است',\n                'empty-list-description' => 'یک سرنخ ایجاد کنید تا اهداف خود را سازماندهی کنید.',\n                'create-lead-btn' => 'ایجاد سرنخ',\n                'columns' => [\n                    'contact-person' => 'شخص تماس',\n                    'id' => 'شناسه',\n                    'lead-type' => 'نوع سرنخ',\n                    'lead-value' => 'ارزش سرنخ',\n                    'sales-person' => 'کارشناس فروش',\n                    'source' => 'منبع',\n                    'title' => 'عنوان',\n                    'tags' => 'برچسب‌ها',\n                    'expected-close-date' => 'تاریخ بسته شدن مورد انتظار',\n                    'created-at' => 'تاریخ ایجاد',\n                ],\n                'toolbar' => [\n                    'search' => [\n                        'title' => 'جستجو بر اساس عنوان',\n                    ],\n                    'filters' => [\n                        'apply-filters' => 'اعمال فیلترها',\n                        'clear-all' => 'پاک کردن همه',\n                        'filter' => 'فیلتر',\n                        'filters' => 'فیلترها',\n                        'from' => 'از',\n                        'select' => 'انتخاب',\n                        'to' => 'تا',\n                    ],\n                ],\n            ],\n            'view-switcher' => [\n                'all-pipelines' => 'تمام خطوط تولید',\n                'create-new-pipeline' => 'ایجاد خط تولید جدید',\n            ],\n            'upload' => [\n                'create-lead' => 'ایجاد سرنخ با استفاده از هوش مصنوعی',\n                'file' => 'آپلود فایل',\n                'file-info' => 'فقط فایل‌های با فرمت pdf, bmp, jpg, jpeg, png پذیرفته می‌شوند.',\n                'file-required' => 'لطفاً حداقل یک فایل معتبر برای ادامه انتخاب کنید.',\n                'save-btn' => 'ذخیره',\n                'upload-file' => 'بارگذاری فایل',\n            ],\n        ],\n        'create' => [\n            'title' => 'ایجاد سرنخ',\n            'save-btn' => 'ذخیره',\n            'details' => 'جزئیات',\n            'details-info' => 'اطلاعات پایه سرنخ را وارد کنید',\n            'contact-person' => 'شخص تماس',\n            'contact-info' => 'اطلاعات درباره شخص تماس',\n            'products' => 'محصولات',\n            'products-info' => 'اطلاعات درباره محصولات',\n        ],\n        'edit' => [\n            'title' => 'ویرایش سرنخ',\n            'save-btn' => 'ذخیره',\n            'details' => 'جزئیات',\n            'details-info' => 'اطلاعات پایه سرنخ را وارد کنید',\n            'contact-person' => 'شخص تماس',\n            'contact-info' => 'اطلاعات درباره شخص تماس',\n            'products' => 'محصولات',\n            'products-info' => 'اطلاعات درباره محصولات',\n        ],\n        'common' => [\n            'contact' => [\n                'name' => 'نام',\n                'email' => 'ایمیل',\n                'contact-number' => 'شماره تماس',\n                'organization' => 'سازمان',\n            ],\n            'products' => [\n                'product-name' => 'نام محصول',\n                'quantity' => 'تعداد',\n                'price' => 'قیمت',\n                'amount' => 'مقدار',\n                'action' => 'عملیات',\n                'add-more' => 'افزودن بیشتر',\n                'total' => 'جمع',\n            ],\n        ],\n        'view' => [\n            'title' => 'سرنخ: :title',\n            'rotten-days' => ':days روز',\n            'tabs' => [\n                'description' => 'توضیحات',\n                'products' => 'محصولات',\n                'quotes' => 'نقل‌قول‌ها',\n            ],\n            'attributes' => [\n                'title' => 'درباره سرنخ',\n            ],\n            'quotes' => [\n                'subject' => 'موضوع',\n                'expired-at' => 'تاریخ انقضا',\n                'sub-total' => 'جمع جزئی',\n                'discount' => 'تخفیف',\n                'tax' => 'مالیات',\n                'adjustment' => 'تنظیمات',\n                'grand-total' => 'جمع کل',\n                'delete' => 'حذف',\n                'edit' => 'ویرایش',\n                'download' => 'دانلود',\n                'destroy-success' => 'پیشنهاد با موفقیت حذف شد.',\n                'empty-title' => 'هیچ پیشنهادی یافت نشد',\n                'empty-info' => 'هیچ پیشنهادی برای این سرنخ یافت نشد',\n                'add-btn' => 'افزودن پیشنهاد',\n            ],\n            'products' => [\n                'product-name' => 'نام محصول',\n                'quantity' => 'تعداد',\n                'price' => 'قیمت',\n                'amount' => 'مقدار',\n                'action' => 'عملیات',\n                'add-more' => 'افزودن بیشتر',\n                'total' => 'جمع',\n                'empty-title' => 'هیچ محصولی یافت نشد',\n                'empty-info' => 'هیچ محصولی برای این سرنخ یافت نشد',\n                'add-product' => 'افزودن محصول',\n            ],\n            'persons' => [\n                'title' => 'درباره افراد',\n                'job-title' => ':job_title در :organization',\n            ],\n            'stages' => [\n                'won' => 'برد',\n                'lost' => 'باخت',\n                'need-more-info' => 'نیاز به اطلاعات بیشتر',\n                'closed-at' => 'بسته شده در',\n                'won-value' => 'ارزش برد',\n                'lost-reason' => 'دلیل باخت',\n                'save-btn' => 'ذخیره',\n            ],\n            'tags' => [\n                'create-success' => 'برچسب با موفقیت ایجاد شد.',\n                'destroy-success' => 'برچسب با موفقیت حذف شد.',\n            ],\n        ],\n    ],\n    'configuration' => [\n        'index' => [\n            'back' => 'بازگشت',\n            'delete' => 'حذف',\n            'save-btn' => 'ذخیره پیکربندی',\n            'save-success' => 'پیکربندی با موفقیت ذخیره شد.',\n            'search' => 'جستجو',\n            'select-country' => 'انتخاب کشور',\n            'select-state' => 'انتخاب ایالت',\n            'title' => 'پیکربندی',\n            'general' => [\n                'title' => 'عمومی',\n                'info' => 'پیکربندی عمومی',\n                'general' => [\n                    'title' => 'عمومی',\n                    'info' => 'تنظیمات عمومی خود را اینجا به‌روزرسانی کنید.',\n                    'locale-settings' => [\n                        'title' => 'تنظیمات محلی',\n                        'title-info' => 'زبان مورد استفاده در رابط کاربری را تعریف می‌کند، مانند عربی (ar)، انگلیسی (en)، اسپانیایی (es)، فارسی (fa) و ترکی (tr).',\n                    ],\n                    'admin-logo' => [\n                        'logo-image' => 'تصویر لوگو',\n                        'title' => 'لوگوی مدیر',\n                        'title-info' => 'تصویر لوگو برای پنل مدیریت خود را پیکربندی کنید.',\n                    ],\n                ],\n                'settings' => [\n                    'title' => 'تنظیمات',\n                    'info' => 'تنظیمات خود را اینجا به‌روزرسانی کنید.',\n                    'footer' => [\n                        'info' => 'ما می‌توانیم بخش \"توسعه یافته توسط\" را اینجا پیکربندی کنیم.',\n                        'powered-by' => 'توسعه یافته توسط ویرایشگر متن',\n                        'title' => 'پیکربندی بخش \"توسعه یافته توسط\"',\n                    ],\n                    'menu' => [\n                        'activities' => 'فعالیت‌ها',\n                        'configuration' => 'پیکربندی',\n                        'contacts' => 'مخاطبین',\n                        'dashboard' => 'داشبورد',\n                        'draft' => 'پیش‌نویس',\n                        'inbox' => 'صندوق ورودی',\n                        'info' => 'ما می‌توانیم نام آیتم‌های منو را اینجا پیکربندی کنیم.',\n                        'leads' => 'سرنخ‌ها',\n                        'mail' => 'ایمیل',\n                        'organizations' => 'سازمان‌ها',\n                        'outbox' => 'صندوق خروجی',\n                        'persons' => 'افراد',\n                        'products' => 'محصولات',\n                        'quotes' => 'نقل‌قول‌ها',\n                        'sent' => 'ارسال شده',\n                        'settings' => 'تنظیمات',\n                        'title' => 'پیکربندی آیتم‌های منو',\n                        'trash' => 'زباله‌دان',\n                    ],\n                    'menu-color' => [\n                        'brand-color' => 'Brand Color',\n                        'info' => 'ما می‌توانیم رنگ آیتم‌های منو را اینجا تغییر دهیم.',\n                        'title' => 'پیکربندی رنگ آیتم‌های منو',\n                    ],\n                ],\n            ],\n            'email' => [\n                'title' => 'تنظیمات ایمیل',\n                'info' => 'پیکربندی ایمیل برای برنامه.',\n                'imap' => [\n                    'title' => 'تنظیمات IMAP',\n                    'info' => 'پیکربندی ایمیل IMAP برای دریافت ایمیل‌ها.',\n                    'account' => [\n                        'title' => 'حساب IMAP',\n                        'title-info' => 'تنظیمات حساب IMAP خود را اینجا پیکربندی کنید.',\n                        'host' => 'میزبان',\n                        'port' => 'پورت',\n                        'encryption' => 'نوع رمزگذاری',\n                        'validate-cert' => 'اعتبارسنجی گواهی SSL',\n                        'username' => 'نام کاربری IMAP',\n                        'password' => 'رمز عبور IMAP',\n                    ],\n                ],\n            ],\n            'magic-ai' => [\n                'title' => 'هوش مصنوعی جادویی',\n                'info' => 'پیکربندی هوش مصنوعی جادویی برای برنامه.',\n                'settings' => [\n                    'api-key' => 'کلید API',\n                    'api-key-info' => 'به یاد داشته باشید که برای هر مدل از کلید API OpenRouter استفاده کنید. این یک گام ساده برای افزایش امنیت و عملکرد است.',\n                    'enable' => 'فعال کردن',\n                    'info' => 'تجربه هوش مصنوعی جادویی خود را با کلید API OpenRouter خود بهبود بخشید. اکنون آن را یکپارچه کنید تا یک ماجراجویی هوش مصنوعی شخصی‌سازی شده و بدون درز برای شما فراهم شود! به راحتی تنظیمات را سفارشی کنید و کنترل سفر هوش مصنوعی خود را به دست بگیرید.',\n                    'other' => 'مدل دیگر',\n                    'other-model' => 'برای مدل‌های دیگر، از شناسه مدل از OpenRouter استفاده کنید.',\n                    'doc-generation' => 'تولید DOC',\n                    'doc-generation-info' => 'ویژگی تولید DOC را فعال کنید تا به‌صورت خودکار داده‌ها را از فایل‌های DOC استخراج و به فرمت متنی تبدیل کند. با فعال‌سازی این ویژگی، بهره‌وری و کارایی خود را افزایش دهید و فرآیند کاری را ساده‌تر کنید.',\n                    'title' => 'تنظیمات عمومی',\n                    'models' => [\n                        'deepseek-r1' => 'Deepseek R1 Distill-llama-8b',\n                        'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001',\n                        'gpt-4o' => 'GPT-4.0',\n                        'gpt-4o-mini' => 'GPT-4.0 mini',\n                        'grok-2-1212' => 'Grok 2.12',\n                        'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct',\n                        'title' => 'مدل‌ها',\n                    ],\n                ],\n            ],\n        ],\n    ],\n    'dashboard' => [\n        'index' => [\n            'title' => 'داشبورد',\n            'start-date' => 'Start Date',\n            'end-date' => 'End Date',\n            'revenue' => [\n                'lost-revenue' => 'درآمد از دست رفته',\n                'won-revenue' => 'درآمد برنده',\n            ],\n            'over-all' => [\n                'average-lead-value' => 'میانگین ارزش لید',\n                'total-leads' => 'کل لیدها',\n                'average-leads-per-day' => 'میانگین لیدها در روز',\n                'total-quotations' => 'کل نقل قول‌ها',\n                'total-persons' => 'کل افراد',\n                'total-organizations' => 'کل سازمان‌ها',\n            ],\n            'total-leads' => [\n                'title' => 'لیدها',\n                'total' => 'کل لیدها',\n                'won' => 'لیدهای برنده',\n                'lost' => 'لیدهای از دست رفته',\n            ],\n            'revenue-by-sources' => [\n                'title' => 'درآمد بر اساس منابع',\n                'empty-title' => 'هیچ داده‌ای موجود نیست',\n                'empty-info' => 'داده‌ای برای بازه زمانی انتخاب شده وجود ندارد',\n            ],\n            'revenue-by-types' => [\n                'title' => 'درآمد بر اساس انواع',\n                'empty-title' => 'هیچ داده‌ای موجود نیست',\n                'empty-info' => 'داده‌ای برای بازه زمانی انتخاب شده وجود ندارد',\n            ],\n            'top-selling-products' => [\n                'title' => 'محصولات برتر',\n                'empty-title' => 'هیچ محصولی پیدا نشد',\n                'empty-info' => 'محصولی برای بازه زمانی انتخاب شده موجود نیست',\n            ],\n            'top-persons' => [\n                'title' => 'افراد برتر',\n                'empty-title' => 'هیچ فردی پیدا نشد',\n                'empty-info' => 'فردی برای بازه زمانی انتخاب شده موجود نیست',\n            ],\n            'open-leads-by-states' => [\n                'title' => 'سرنخ‌های باز بر اساس مراحل',\n                'empty-title' => 'هیچ داده‌ای موجود نیست',\n                'empty-info' => 'داده‌ای برای بازه زمانی انتخاب شده وجود ندارد',\n            ],\n        ],\n    ],\n    'layouts' => [\n        'app-version' => 'نسخه: :version',\n        'dashboard' => 'داشبورد',\n        'leads' => 'لیدها',\n        'quotes' => 'نقل قول‌ها',\n        'quote' => 'نقل قول',\n        'mail' => [\n            'title' => 'ایمیل',\n            'compose' => 'تدوین',\n            'inbox' => 'صندوق ورودی',\n            'draft' => 'پیش‌نویس',\n            'outbox' => 'صندوق خروجی',\n            'sent' => 'ارسال شده',\n            'trash' => 'زباله‌دان',\n            'setting' => 'تنظیمات',\n        ],\n        'activities' => 'فعالیت‌ها',\n        'contacts' => 'مخاطبین',\n        'persons' => 'افراد',\n        'person' => 'فرد',\n        'organizations' => 'سازمان‌ها',\n        'organization' => 'سازمان',\n        'products' => 'محصولات',\n        'product' => 'محصول',\n        'settings' => 'تنظیمات',\n        'user' => 'کاربر',\n        'user-info' => 'مدیریت همه کاربران و مجوزهای آنها در CRM، آنچه که اجازه دارند انجام دهند.',\n        'groups' => 'گروه‌ها',\n        'groups-info' => 'اضافه، ویرایش یا حذف گروه‌ها از CRM',\n        'roles' => 'نقش‌ها',\n        'role' => 'نقش',\n        'roles-info' => 'اضافه، ویرایش یا حذف نقش‌ها از CRM',\n        'users' => 'کاربران',\n        'users-info' => 'اضافه، ویرایش یا حذف کاربران از CRM',\n        'lead' => 'لید',\n        'lead-info' => 'مدیریت همه تنظیمات مربوط به لیدها در CRM',\n        'pipelines' => 'پایپ‌لاین‌ها',\n        'pipelines-info' => 'اضافه، ویرایش یا حذف پایپ‌لاین‌ها از CRM',\n        'sources' => 'منابع',\n        'sources-info' => 'اضافه، ویرایش یا حذف منابع از CRM',\n        'types' => 'انواع',\n        'types-info' => 'اضافه، ویرایش یا حذف انواع از CRM',\n        'automation' => 'اتوماسیون',\n        'automation-info' => 'مدیریت همه تنظیمات مربوط به اتوماسیون در CRM',\n        'attributes' => 'ویژگی‌ها',\n        'attribute' => 'ویژگی',\n        'attributes-info' => 'اضافه، ویرایش یا حذف ویژگی‌ها از CRM',\n        'email-templates' => 'قالب‌های ایمیل',\n        'email' => 'ایمیل',\n        'email-templates-info' => 'اضافه، ویرایش یا حذف قالب‌های ایمیل از CRM',\n        'events' => 'رویدادها',\n        'events-info' => 'افزودن، ویرایش یا حذف رویدادها از CRM',\n        'campaigns' => 'کمپین‌ها',\n        'campaigns-info' => 'افزودن، ویرایش یا حذف کمپین‌ها از CRM',\n        'workflows' => 'فرایندها',\n        'workflows-info' => 'اضافه، ویرایش یا حذف فرایندها از CRM',\n        'webhooks' => 'وب‌هوک‌ها',\n        'webhooks-info' => 'افزودن، ویرایش یا حذف وب‌هوک‌ها از CRM',\n        'other-settings' => 'تنظیمات دیگر',\n        'other-settings-info' => 'مدیریت همه تنظیمات اضافی در CRM',\n        'tags' => 'برچسب‌ها',\n        'tags-info' => 'اضافه، ویرایش یا حذف برچسب‌ها از CRM',\n        'my-account' => 'حساب من',\n        'sign-out' => 'خروج',\n        'back' => 'برگشت',\n        'name' => 'نام',\n        'configuration' => 'پیکربندی',\n        'howdy' => 'سلام!',\n        'warehouses' => 'انبارها',\n        'warehouse' => 'انبار',\n        'warehouses-info' => 'اضافه، ویرایش یا حذف انبارها از CRM',\n        'inventory' => 'موجودی',\n        'inventory-info' => 'مدیریت تمام تنظیمات مربوط به موجودی در CRM',\n        'data_transfer' => 'انتقال داده',\n        'data_transfer_info' => 'مدیریت تنظیمات مربوط به انتقال داده‌های اشخاص، محصولات و سرنخ‌ها در CRM',\n    ],\n    'user' => [\n        'account' => [\n            'name' => 'نام',\n            'email' => 'ایمیل',\n            'password' => 'رمز عبور',\n            'my_account' => 'حساب من',\n            'update_details' => 'بروزرسانی جزئیات',\n            'current_password' => 'رمز عبور فعلی',\n            'confirm_password' => 'تأیید رمز عبور',\n            'password-match' => 'رمز عبور فعلی مطابقت ندارد.',\n            'account-save' => 'تغییرات حساب با موفقیت ذخیره شد.',\n            'permission-denied' => 'دسترسی مجاز نیست',\n            'remove-image' => 'حذف تصویر',\n            'upload_image_pix' => 'بارگذاری تصویر پروفایل (100px x 100px)',\n            'upload_image_format' => 'در فرمت PNG یا JPG',\n            'image_upload_message' => 'فقط تصاویر (.jpeg, .jpg, .png, ..) مجاز هستند.',\n        ],\n    ],\n    'emails' => [\n        'common' => [\n            'dear' => 'عزیز :name',\n            'cheers' => 'با احترام،</br>تیم :app_name',\n            'user' => [\n                'dear' => 'سلام :username',\n                'create-subject' => 'شما به عنوان عضو اضافه شدید.',\n                'create-body' => 'تبریک می‌گوییم! شما اکنون عضو تیم ما هستید.',\n                'forget-password' => [\n                    'subject' => 'بازنشانی رمز عبور مشتری',\n                    'dear' => 'سلام :username',\n                    'reset-password' => 'بازنشانی رمز عبور',\n                    'info' => 'شما این ایمیل را دریافت کرده‌اید زیرا ما درخواست بازنشانی رمز عبور برای حساب شما دریافت کرده‌ایم',\n                    'final-summary' => 'اگر درخواست بازنشانی رمز عبور نکرده‌اید، نیازی به انجام اقدام دیگری نیست',\n                    'thanks' => 'متشکریم!',\n                ],\n            ],\n        ],\n    ],\n    'validations' => [\n        'message' => [\n            'decimal' => ':attribute باید یک عدد اعشاری باشد.',\n        ],\n    ],\n    'errors' => [\n        'dashboard' => 'داشبورد',\n        'go-back' => 'بازگشت',\n        'support' => 'اگر مشکل ادامه داشت، برای کمک با ما از طریق <a href=\":link\" class=\":class\">:email</a> تماس بگیرید.',\n        '404' => [\n            'description' => 'اوه! به نظر می‌رسد صفحه‌ای که دنبال آن بودید، در دسترس نیست. نتوانستیم چیزی که دنبالش بودید را پیدا کنیم.',\n            'title' => '404 صفحه پیدا نشد',\n        ],\n        '401' => [\n            'description' => 'اوه! به نظر می‌رسد که شما مجاز به دسترسی به این صفحه نیستید. شما مجوزهای لازم را ندارید.',\n            'title' => '401 مجاز نیست',\n        ],\n        '403' => [\n            'description' => 'اوه! این صفحه ممنوع است. به نظر می‌رسد شما مجوزهای لازم برای مشاهده این محتوا را ندارید.',\n            'title' => '403 ممنوع',\n        ],\n        '500' => [\n            'description' => 'اوه! مشکلی پیش آمده است. به نظر می‌رسد مشکلی در بارگذاری صفحه مورد نظر شما وجود دارد.',\n            'title' => '500 خطای سرور داخلی',\n        ],\n        '503' => [\n            'description' => 'اوه! به نظر می‌رسد که به طور موقت برای نگهداری آفلاین هستیم. لطفاً بعداً دوباره بررسی کنید.',\n            'title' => '503 سرویس در دسترس نیست',\n        ],\n    ],\n    'export' => [\n        'csv' => 'CSV',\n        'download' => 'دانلود',\n        'export' => 'صادر کردن',\n        'no-records' => 'هیچ سوابقی برای صادر کردن وجود ندارد.',\n        'xls' => 'XLS',\n        'xlsx' => 'XLSX',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/lang/pt_BR/app.php",
    "content": "<?php\n\nreturn [\n    'acl' => [\n        'leads' => 'Oportunidades',\n        'lead' => 'Oportunidade',\n        'quotes' => 'Cotações',\n        'mail' => 'E-mail',\n        'inbox' => 'Caixa de Entrada',\n        'draft' => 'Rascunho',\n        'outbox' => 'Caixa de Saída',\n        'sent' => 'Enviados',\n        'trash' => 'Lixeira',\n        'activities' => 'Atividades',\n        'webhook' => 'Webhook',\n        'contacts' => 'Contatos',\n        'persons' => 'Pessoas',\n        'organizations' => 'Empresas',\n        'products' => 'Produtos',\n        'settings' => 'Configurações',\n        'groups' => 'Grupos',\n        'roles' => 'Funções',\n        'users' => 'Usuários',\n        'user' => 'Usuário',\n        'automation' => 'Automação',\n        'attributes' => 'Atributos',\n        'pipelines' => 'Funil',\n        'sources' => 'Origem',\n        'types' => 'Tipos',\n        'email-templates' => 'Modelos de E-mail',\n        'workflows' => 'Fluxos de Trabalho',\n        'other-settings' => 'Outras Configurações',\n        'tags' => 'Tags',\n        'configuration' => 'Configuração',\n        'create' => 'Adicionar',\n        'edit' => 'Editar',\n        'view' => 'Visualizar',\n        'print' => 'Imprimir',\n        'delete' => 'Excluir',\n        'export' => 'Exportar',\n        'mass-delete' => 'Exclusão em Massa',\n        'data-transfer' => 'Data Transfer',\n        'imports' => 'Imports',\n        'import' => 'Import',\n        'event' => 'Evento',\n        'campaigns' => 'Campanhas',\n        'warehouses' => 'Armazéns',\n        'inventory' => 'Estoque',\n    ],\n    'users' => [\n        'activate-warning' => 'Sua conta ainda não foi ativada. Por favor, entre em contato com o administrador.',\n        'login-error' => 'As credenciais não correspondem aos nossos registros.',\n        'not-permission' => 'You do not have permission to access the admin panel.',\n        'login' => [\n            'email' => 'Endereço de E-mail',\n            'forget-password-link' => 'Esqueceu a Senha?',\n            'password' => 'Senha',\n            'submit-btn' => 'Acessar',\n            'title' => 'Acessar',\n        ],\n        'forget-password' => [\n            'create' => [\n                'email' => 'E-mail Registrado',\n                'email-not-exist' => 'E-mail Não Existe',\n                'page-title' => 'Esqueceu a Senha',\n                'reset-link-sent' => 'Link para redefinir a senha foi enviado',\n                'sign-in-link' => 'Voltar para tela de acesso?',\n                'submit-btn' => 'Redefinir',\n                'title' => 'Recuperar Senha',\n            ],\n        ],\n        'reset-password' => [\n            'back-link-title' => 'Voltar para tela de acesso?',\n            'confirm-password' => 'Confirmar Senha',\n            'email' => 'E-mail Registrado',\n            'password' => 'Senha',\n            'submit-btn' => 'Redefinir Senha',\n            'title' => 'Redefinir Senha',\n        ],\n    ],\n    'account' => [\n        'edit' => [\n            'back-btn' => 'Voltar',\n            'change-password' => 'Alterar Senha',\n            'confirm-password' => 'Confirmar Senha',\n            'current-password' => 'Senha Atual',\n            'email' => 'E-mail',\n            'general' => 'Geral',\n            'invalid-password' => 'A senha atual que você digitou está incorreta.',\n            'name' => 'Nome',\n            'password' => 'Senha',\n            'profile-image' => 'Imagem de Perfil',\n            'save-btn' => 'Salvar Conta',\n            'title' => 'Minha Conta',\n            'update-success' => 'Conta atualizada com sucesso',\n            'upload-image-info' => 'Carregue uma imagem de perfil (110px X 110px) no formato PNG ou JPG',\n        ],\n    ],\n    'components' => [\n        'activities' => [\n            'actions' => [\n                'mail' => [\n                    'btn' => 'E-mail',\n                    'title' => 'Escrever e-mail',\n                    'to' => 'Para',\n                    'enter-emails' => 'Pressione Enter para adicionar e-mails',\n                    'cc' => 'Cópia',\n                    'bcc' => 'Cópia oculta',\n                    'subject' => 'Assunto',\n                    'send-btn' => 'Enviar',\n                    'message' => 'Mensagem',\n                ],\n                'file' => [\n                    'btn' => 'Arquivo',\n                    'title' => 'Adicionar Arquivo',\n                    'title-control' => 'Título',\n                    'name' => 'Nome',\n                    'description' => 'Descrição',\n                    'file' => 'Arquivo',\n                    'save-btn' => 'Salvar Arquivo',\n                ],\n                'note' => [\n                    'btn' => 'Nota',\n                    'title' => 'Adicionar Nota',\n                    'comment' => 'Comentário',\n                    'save-btn' => 'Salvar Nota',\n                ],\n                'activity' => [\n                    'btn' => 'Atividade',\n                    'title' => 'Adicionar Atividade',\n                    'title-control' => 'Título',\n                    'description' => 'Descrição',\n                    'schedule-from' => 'Agendar De',\n                    'schedule-to' => 'Agendar Até',\n                    'location' => 'Localização',\n                    'call' => 'Chamada',\n                    'meeting' => 'Reunião',\n                    'lunch' => 'Almoço',\n                    'save-btn' => 'Salvar Atividade',\n                    'participants' => [\n                        'title' => 'Participantes',\n                        'placeholder' => 'Digite para pesquisar participantes',\n                        'users' => 'Usuários',\n                        'persons' => 'Pessoas',\n                        'no-results' => 'Nenhum resultado encontrado...',\n                    ],\n                ],\n            ],\n            'index' => [\n                'all' => 'Todos',\n                'bcc' => 'Cópia oculta',\n                'by-user' => 'Por usuário',\n                'calls' => 'Chamadas',\n                'cc' => 'Cópia',\n                'change-log' => 'Logs de Alterações',\n                'delete' => 'Excluir',\n                'edit' => 'Editar',\n                'emails' => 'E-mails',\n                'empty' => 'Vazio',\n                'files' => 'Arquivos',\n                'from' => 'De',\n                'location' => 'Localização',\n                'lunches' => 'Almoços',\n                'mark-as-done' => 'Marcar como Concluído',\n                'meetings' => 'Reuniões',\n                'notes' => 'Notas',\n                'participants' => 'Participantes',\n                'planned' => 'Planejado',\n                'quotes' => 'Cotações',\n                'scheduled-on' => 'Agendado em',\n                'system' => 'Sistema',\n                'to' => 'Para',\n                'unlink' => 'Desvincular',\n                'view' => 'Visualizar',\n                'empty-placeholders' => [\n                    'all' => [\n                        'title' => 'Nenhuma atividade encontrada',\n                        'description' => 'Nenhuma atividade foi encontrada para este item. Você pode adicionar atividades clicando no botão Atividade no painel à esquerda.',\n                    ],\n                    'planned' => [\n                        'title' => 'Nenhuma atividade planejada encontrada',\n                        'description' => 'Nenhuma atividade planejada foi encontrada. Adicione uma clicando no botão Atividade no painel à esquerda.',\n                    ],\n                    'notes' => [\n                        'title' => 'Nenhuma nota encontrada',\n                        'description' => 'Nenhuma nota foi encontrada. Adicione notas clicando no botão Nota no painel à esquerda.',\n                    ],\n                    'calls' => [\n                        'title' => 'Nenhuma chamada encontrada',\n                        'description' => 'Nenhuma chamada foi encontrada. Adicione chamadas clicando no botão Atividade e selecionando o tipo Chamada.',\n                    ],\n                    'meetings' => [\n                        'title' => 'Nenhuma reunião encontrada',\n                        'description' => 'Nenhuma reunião foi encontrada. Adicione reuniões clicando no botão Atividade e selecionando o tipo Reunião.',\n                    ],\n                    'lunches' => [\n                        'title' => 'Nenhum almoço encontrado',\n                        'description' => 'Nenhum almoço foi encontrado. Adicione almoços clicando no botão Atividade e selecionando o tipo Almoço.',\n                    ],\n                    'files' => [\n                        'title' => 'Nenhum arquivo encontrado',\n                        'description' => 'Nenhum arquivo foi encontrado. Adicione arquivos clicando no botão Arquivo no painel à esquerda.',\n                    ],\n                    'emails' => [\n                        'title' => 'Nenhum e-mail encontrado',\n                        'description' => 'Nenhum e-mail foi encontrado. Adicione e-mails clicando no botão Correio no painel à esquerda.',\n                    ],\n                    'system' => [\n                        'title' => 'Nenhum registro de alteração encontrado',\n                        'description' => 'Nenhum registro de alteração foi encontrado.',\n                    ],\n                ],\n            ],\n        ],\n        'media' => [\n            'images' => [\n                'add-image-btn' => 'Adicionar Imagem',\n                'ai-add-image-btn' => 'Mágica AI',\n                'allowed-types' => 'png, jpeg, jpg',\n                'not-allowed-error' => 'Apenas arquivos de imagem (.jpeg, .jpg, .png, ..) são permitidos.',\n                'placeholders' => [\n                    'front' => 'Frente',\n                    'next' => 'Próximo',\n                    'size' => 'Tamanho',\n                    'use-cases' => 'Casos de Uso',\n                    'zoom' => 'Zoom',\n                ],\n            ],\n            'videos' => [\n                'add-video-btn' => 'Adicionar Vídeo',\n                'allowed-types' => 'mp4, webm, mkv',\n                'not-allowed-error' => 'Apenas arquivos de vídeo (.mp4, .mov, .ogg ..) são permitidos.',\n            ],\n        ],\n        'datagrid' => [\n            'index' => [\n                'no-records-selected' => 'Nenhum registro foi selecionado.',\n                'must-select-a-mass-action-option' => 'Você deve selecionar uma opção de ação em massa.',\n                'must-select-a-mass-action' => 'Você deve selecionar uma ação em massa.',\n            ],\n            'toolbar' => [\n                'length-of' => 'tamanho de',\n                'of' => 'de',\n                'per-page' => 'Por Página',\n                'results' => 'Resultados',\n                'delete' => 'Excluir',\n                'selected' => 'Itens Selecionados',\n                'mass-actions' => [\n                    'submit' => 'Enviar',\n                    'select-option' => 'Selecionar Opção',\n                    'select-action' => 'Selecionar Ação',\n                ],\n                'filter' => [\n                    'apply-filters-btn' => 'Aplicar Filtros',\n                    'back-btn' => 'Voltar',\n                    'create-new-filter' => 'Adicionar novo Filtro',\n                    'custom-filters' => 'Filtros Personalizados',\n                    'delete-error' => 'Algo deu errado ao excluir o filtro, por favor tente novamente.',\n                    'delete-success' => 'Filtro excluído com sucesso.',\n                    'empty-description' => 'Não há filtros selecionados disponíveis para salvar. Por favor, selecione filtros para salvar.',\n                    'empty-title' => 'Adicionar Filtros para Salvar',\n                    'name' => 'Nome',\n                    'quick-filters' => 'Filtros Rápidos',\n                    'save-btn' => 'Salvar',\n                    'save-filter' => 'Salvar Filtro',\n                    'saved-success' => 'Filtro salvo com sucesso.',\n                    'selected-filters' => 'Filtros Selecionados',\n                    'title' => 'Filtro',\n                    'update' => 'Atualizar',\n                    'update-filter' => 'Atualizar Filtro',\n                    'updated-success' => 'Filtro atualizado com sucesso.',\n                ],\n                'search' => [\n                    'title' => 'Pesquisar',\n                ],\n            ],\n            'filters' => [\n                'select' => 'Selecionar',\n                'title' => 'Filtros',\n                'dropdown' => [\n                    'searchable' => [\n                        'at-least-two-chars' => 'Digite pelo menos 2 caracteres...',\n                        'no-results' => 'Nenhum resultado encontrado...',\n                    ],\n                ],\n                'custom-filters' => [\n                    'clear-all' => 'Limpar Todos',\n                    'title' => 'Filtros Personalizados',\n                ],\n                'boolean-options' => [\n                    'false' => 'Falso',\n                    'true' => 'Verdadeiro',\n                ],\n                'date-options' => [\n                    'last-month' => 'Último Mês',\n                    'last-six-months' => 'Últimos 6 Meses',\n                    'last-three-months' => 'Últimos 3 Meses',\n                    'this-month' => 'Este Mês',\n                    'this-week' => 'Esta Semana',\n                    'this-year' => 'Este Ano',\n                    'today' => 'Hoje',\n                    'yesterday' => 'Ontem',\n                ],\n            ],\n            'table' => [\n                'actions' => 'Ações',\n                'no-records-available' => 'Nenhum Registro Disponível.',\n            ],\n        ],\n        'modal' => [\n            'confirm' => [\n                'agree-btn' => 'Concordar',\n                'disagree-btn' => 'Discordar',\n                'message' => 'Você tem certeza de que deseja realizar esta ação?',\n                'title' => 'Você tem certeza?',\n            ],\n        ],\n        'tags' => [\n            'index' => [\n                'title' => 'Tags',\n                'added-tags' => 'Tags Adicionadas',\n                'save-btn' => 'Salvar Tag',\n                'placeholder' => 'Digite para procurar tags',\n                'add-tag' => 'Adicionar Tag',\n                'aquarelle-red' => 'Vermelho',\n                'crushed-cashew' => 'Castanho',\n                'beeswax' => 'Amarelado',\n                'lemon-chiffon' => 'Limão',\n                'snow-flurry' => 'Neve',\n                'honeydew' => 'Melão',\n            ],\n        ],\n        'layouts' => [\n            'powered-by' => [\n                'description' => 'Desenvolvido por :krayin, um projeto de código aberto da :webkul.',\n            ],\n            'header' => [\n                'mega-search' => [\n                    'title' => 'Busca rápida',\n                    'tabs' => [\n                        'leads' => 'Oportunidades',\n                        'quotes' => 'Cotações',\n                        'persons' => 'Pessoas',\n                        'products' => 'Produtos',\n                    ],\n                    'explore-all-products' => 'Explorar todos os Produtos',\n                    'explore-all-leads' => 'Explorar todos as Oportunidades',\n                    'explore-all-contacts' => 'Explorar todos os Contatos',\n                    'explore-all-quotes' => 'Explorar todas as Cotações',\n                    'explore-all-matching-products' => 'Explorar todos os produtos correspondentes a \":query\" (:count)',\n                    'explore-all-matching-leads' => 'Explorar todos os negócios correspondentes a \":query\" (:count)',\n                    'explore-all-matching-contacts' => 'Explorar todos os contatos correspondentes a \":query\" (:count)',\n                    'explore-all-matching-quotes' => 'Explorar todas as cotações correspondentes a \":query\" (:count)',\n                ],\n            ],\n        ],\n        'attributes' => [\n            'edit' => [\n                'delete' => 'Excluir',\n            ],\n            'lookup' => [\n                'click-to-add' => 'Clique para adicionar',\n                'search' => 'Pesquisar...',\n                'no-result-found' => 'Nenhum resultado encontrado',\n            ],\n        ],\n        'lookup' => [\n            'click-to-add' => 'Clique para Adicionar',\n            'no-results' => 'Nenhum Resultado Encontrado',\n            'add-as-new' => 'Adicionar como Novo',\n            'search' => 'Pesquisar...',\n        ],\n        'flash-group' => [\n            'success' => 'Sucesso',\n            'error' => 'Erro',\n            'warning' => 'Aviso',\n            'info' => 'Informação',\n        ],\n        'tiny-mce' => [\n            'http-error' => 'Erro HTTP',\n            'invalid-json' => 'Resposta JSON inválida do servidor.',\n            'upload-failed' => 'Falha no upload do arquivo. Por favor, tente novamente.',\n        ],\n    ],\n    'quotes' => [\n        'index' => [\n            'title' => 'Cotações',\n            'create-btn' => 'Adicionar Cotação',\n            'create-success' => 'Cotação adicionada com sucesso.',\n            'update-success' => 'Cotação atualizada com sucesso.',\n            'delete-success' => 'Cotação excluída com sucesso.',\n            'delete-failed' => 'Não é possível excluir a cotação.',\n            'datagrid' => [\n                'subject' => 'Assunto',\n                'sales-person' => 'Vendedor',\n                'expired-at' => 'Expirado em',\n                'created-at' => 'Criado em',\n                'person' => 'Pessoa',\n                'subtotal' => 'Subtotal',\n                'discount' => 'Desconto',\n                'tax' => 'Imposto',\n                'adjustment' => 'Ajuste',\n                'grand-total' => 'Total Geral',\n                'edit' => 'Editar',\n                'delete' => 'Excluir',\n                'print' => 'Imprimir',\n            ],\n            'pdf' => [\n                'adjustment' => 'Ajuste',\n                'amount' => 'Valor',\n                'billing-address' => 'Endereço de Cobrança',\n                'date' => 'Data',\n                'discount' => 'Desconto',\n                'expired-at' => 'Expirado em',\n                'grand-total' => 'Total Geral',\n                'person' => 'Pessoa',\n                'price' => 'Preço',\n                'product-name' => 'Nome do Produto',\n                'quantity' => 'Quantidade',\n                'quote-id' => 'ID da Cotação',\n                'sales-person' => 'Vendedor',\n                'shipping-address' => 'Endereço de Envio',\n                'sku' => 'Código',\n                'sub-total' => 'Subtotal',\n                'subject' => 'Assunto',\n                'tax' => 'Imposto',\n                'title' => 'Cotação',\n            ],\n        ],\n        'create' => [\n            'title' => 'Adicionar Cotação',\n            'save-btn' => 'Salvar Cotação',\n            'quote-info' => 'Informações da Cotação',\n            'quote-info-info' => 'Informe as informações básicas da cotação.',\n            'address-info' => 'Informações de Endereço',\n            'address-info-info' => 'Informações sobre o endereço relacionado à cotação.',\n            'quote-items' => 'Itens da Cotação',\n            'search-products' => 'Pesquisar Produtos',\n            'link-to-lead' => 'Vincular a um negócio',\n            'quote-item-info' => 'Adicionar solicitação de produto para esta cotação.',\n            'quote-name' => 'Nome da Cotação',\n            'quantity' => 'Quantidade',\n            'price' => 'Preço',\n            'discount' => 'Desconto',\n            'tax' => 'Imposto',\n            'total' => 'Total',\n            'amount' => 'Valor',\n            'add-item' => '+ Adicionar Item',\n            'sub-total' => 'Subtotal (:symbol)',\n            'total-discount' => 'Desconto (:symbol)',\n            'total-tax' => 'Imposto (:symbol)',\n            'total-adjustment' => 'Ajuste (:symbol)',\n            'grand-total' => 'Total Geral (:symbol)',\n            'discount-amount' => 'Valor do Desconto',\n            'tax-amount' => 'Valor do Imposto',\n            'adjustment-amount' => 'Valor do Ajuste',\n            'product-name' => 'Nome do Produto',\n            'action' => 'Ação',\n        ],\n        'edit' => [\n            'title' => 'Editar Cotação',\n            'save-btn' => 'Salvar Cotação',\n            'quote-info' => 'Informações da Cotação',\n            'quote-info-info' => 'Informe as informações básicas da cotação.',\n            'address-info' => 'Informações de Endereço',\n            'address-info-info' => 'Informações sobre o endereço relacionado à cotação.',\n            'quote-items' => 'Itens da Cotação',\n            'link-to-lead' => 'Vincular a um negócio',\n            'quote-item-info' => 'Adicionar solicitação de produto para esta cotação.',\n            'quote-name' => 'Nome da Cotação',\n            'quantity' => 'Quantidade',\n            'price' => 'Preço',\n            'search-products' => 'Pesquisar Produtos',\n            'discount' => 'Desconto',\n            'tax' => 'Imposto',\n            'total' => 'Total',\n            'amount' => 'Valor',\n            'add-item' => '+ Adicionar Item',\n            'sub-total' => 'Subtotal (:symbol)',\n            'total-discount' => 'Desconto (:symbol)',\n            'total-tax' => 'Imposto (:symbol)',\n            'total-adjustment' => 'Ajuste (:symbol)',\n            'grand-total' => 'Total Geral (:symbol)',\n            'discount-amount' => 'Valor do Desconto',\n            'tax-amount' => 'Valor do Imposto',\n            'adjustment-amount' => 'Valor do Ajuste',\n            'product-name' => 'Nome do Produto',\n            'action' => 'Ação',\n        ],\n    ],\n    'contacts' => [\n        'persons' => [\n            'index' => [\n                'title' => 'Pessoas',\n                'create-btn' => 'Adicionar Pessoa',\n                'create-success' => 'Pessoa adicionada com sucesso.',\n                'update-success' => 'Pessoa atualizada com sucesso.',\n                'all-delete-success' => 'Todas as pessoas selecionadas foram excluídas com sucesso.',\n                'partial-delete-warning' => 'Algumas pessoas foram excluídas com sucesso. Outras não puderam ser excluídas porque estão vinculadas a leads.',\n                'none-delete-warning' => 'Nenhuma das pessoas selecionadas pôde ser excluída porque estão vinculadas a leads.',\n                'no-selection' => 'Nenhuma pessoa foi selecionada para exclusão.',\n                'delete-failed' => 'Falha ao excluir as pessoas selecionadas.',\n                'datagrid' => [\n                    'contact-numbers' => 'Números de Contato',\n                    'delete' => 'Excluir',\n                    'edit' => 'Editar',\n                    'emails' => 'E-mails',\n                    'id' => 'ID',\n                    'view' => 'Visualizar',\n                    'name' => 'Nome',\n                    'organization-name' => 'Nome da Empresa',\n                ],\n            ],\n            'view' => [\n                'title' => ':name',\n                'about-person' => 'Sobre a Pessoa',\n                'about-organization' => 'Sobre a Empresa',\n                'activities' => [\n                    'index' => [\n                        'all' => 'Todos',\n                        'calls' => 'Chamadas',\n                        'meetings' => 'Reuniões',\n                        'lunches' => 'Almoços',\n                        'files' => 'Arquivos',\n                        'quotes' => 'Cotações',\n                        'notes' => 'Notas',\n                        'emails' => 'E-mails',\n                        'by-user' => 'Por usuário',\n                        'scheduled-on' => 'Agendado em',\n                        'location' => 'Localização',\n                        'participants' => 'Participantes',\n                        'mark-as-done' => 'Marcar como Concluído',\n                        'delete' => 'Excluir',\n                        'edit' => 'Editar',\n                    ],\n                    'actions' => [\n                        'mail' => [\n                            'btn' => 'E-mail',\n                            'title' => 'Escrever e-mail',\n                            'to' => 'Para',\n                            'cc' => 'Cópia',\n                            'bcc' => 'Cópia oculta',\n                            'subject' => 'Assunto',\n                            'send-btn' => 'Enviar',\n                            'message' => 'Mensagem',\n                        ],\n                        'file' => [\n                            'btn' => 'Arquivo',\n                            'title' => 'Adicionar Arquivo',\n                            'title-control' => 'Título',\n                            'name' => 'Nome do Arquivo',\n                            'description' => 'Descrição',\n                            'file' => 'Arquivo',\n                            'save-btn' => 'Salvar Arquivo',\n                        ],\n                        'note' => [\n                            'btn' => 'Nota',\n                            'title' => 'Adicionar Nota',\n                            'comment' => 'Comentário',\n                            'save-btn' => 'Salvar Nota',\n                        ],\n                        'activity' => [\n                            'btn' => 'Atividade',\n                            'title' => 'Adicionar Atividade',\n                            'title-control' => 'Título',\n                            'description' => 'Descrição',\n                            'schedule-from' => 'Agendar De',\n                            'schedule-to' => 'Agendar Até',\n                            'location' => 'Localização',\n                            'call' => 'Chamada',\n                            'meeting' => 'Reunião',\n                            'lunch' => 'Almoço',\n                            'save-btn' => 'Salvar Atividade',\n                        ],\n                    ],\n                ],\n                'tags' => [\n                    'create-success' => 'Tag criada com sucesso.',\n                    'destroy-success' => 'Tag excluída com sucesso.',\n                ],\n            ],\n            'create' => [\n                'title' => 'Adicionar Pessoa',\n                'save-btn' => 'Salvar Pessoa',\n            ],\n            'edit' => [\n                'title' => 'Editar Pessoa',\n                'save-btn' => 'Salvar Pessoa',\n            ],\n        ],\n        'organizations' => [\n            'index' => [\n                'title' => 'Empresas',\n                'create-btn' => 'Adicionar Empresa',\n                'create-success' => 'Empresa adicionada com sucesso.',\n                'update-success' => 'Empresa atualizada com sucesso.',\n                'delete-success' => 'Empresa excluída com sucesso.',\n                'delete-failed' => 'Não foi possível excluir a empresa.',\n                'datagrid' => [\n                    'delete' => 'Excluir',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nome',\n                    'persons-count' => 'Quantidade de Pessoas',\n                ],\n            ],\n            'create' => [\n                'title' => 'Adicionar Empresa',\n                'save-btn' => 'Salvar Empresa',\n            ],\n            'edit' => [\n                'title' => 'Editar Empresa',\n                'save-btn' => 'Salvar Empresa',\n            ],\n        ],\n    ],\n    'products' => [\n        'index' => [\n            'title' => 'Produtos',\n            'create-btn' => 'Adicionar Produto',\n            'create-success' => 'Produto adicionado com sucesso.',\n            'update-success' => 'Produto atualizado com sucesso.',\n            'delete-success' => 'Produto excluído com sucesso.',\n            'delete-failed' => 'Não foi possível excluir o produto.',\n            'datagrid' => [\n                'allocated' => 'Alocado',\n                'delete' => 'Excluir',\n                'edit' => 'Editar',\n                'id' => 'ID',\n                'in-stock' => 'Em Estoque',\n                'name' => 'Nome',\n                'on-hand' => 'Disponível',\n                'tag-name' => 'Nome da Tag',\n                'price' => 'Preço',\n                'sku' => 'Código',\n                'view' => 'Visualizar',\n            ],\n        ],\n        'create' => [\n            'save-btn' => 'Salvar Produtos',\n            'title' => 'Adicionar Produtos',\n            'general' => 'Geral',\n            'price' => 'Preço',\n        ],\n        'edit' => [\n            'title' => 'Editar Produtos',\n            'save-btn' => 'Salvar Produtos',\n            'general' => 'Geral',\n            'price' => 'Preço',\n        ],\n        'view' => [\n            'sku' => 'Código',\n            'all' => 'Todos',\n            'notes' => 'Notas',\n            'files' => 'Arquivos',\n            'inventories' => 'Inventário',\n            'change-logs' => 'Histórico de Alterações',\n            'attributes' => [\n                'about-product' => 'Sobre o Produto',\n            ],\n            'inventory' => [\n                'source' => 'Origem',\n                'in-stock' => 'Em Estoque',\n                'allocated' => 'Alocado',\n                'on-hand' => 'Disponível',\n                'actions' => 'Ações',\n                'assign' => 'Atribuir',\n                'add-source' => 'Adicionar Origem',\n                'location' => 'Localização',\n                'add-more' => 'Adicionar Mais',\n                'save' => 'Salvar',\n            ],\n        ],\n    ],\n    'settings' => [\n        'title' => 'Configurações',\n        'groups' => [\n            'index' => [\n                'create-btn' => 'Criar Grupo',\n                'title' => 'Grupos',\n                'create-success' => 'Grupo criado com sucesso.',\n                'update-success' => 'Grupo atualizado com sucesso.',\n                'destroy-success' => 'Grupo excluído com sucesso.',\n                'delete-failed' => 'Não foi possível excluir o grupo.',\n                'delete-failed-associated-users' => 'Não foi possível excluir o grupo, pois está sendo utilizado por usuários.',\n                'datagrid' => [\n                    'delete' => 'Excluir',\n                    'description' => 'Descrição',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nome',\n                ],\n                'edit' => [\n                    'title' => 'Editar Grupo',\n                ],\n                'create' => [\n                    'name' => 'Nome',\n                    'title' => 'Adicionar Grupo',\n                    'description' => 'Descrição',\n                    'save-btn' => 'Salvar Grupo',\n                ],\n            ],\n        ],\n        'roles' => [\n            'index' => [\n                'being-used' => 'Não é possível excluir o cargo, pois está sendo usado por um usuário administrador.',\n                'create-btn' => 'Adicionar Cargos',\n                'create-success' => 'Cargo adicionado com sucesso.',\n                'current-role-delete-error' => 'Não é possível excluir o cargo atribuído ao usuário atual.',\n                'delete-failed' => 'Não foi possível excluir o cargo.',\n                'delete-success' => 'Cargo excluído com sucesso.',\n                'last-delete-error' => 'É necessário pelo menos um cargo.',\n                'settings' => 'Configurações',\n                'title' => 'Cargos',\n                'update-success' => 'Cargo atualizado com sucesso.',\n                'user-define-error' => 'Não é possível excluir cargo do sistema.',\n                'datagrid' => [\n                    'all' => 'Todos',\n                    'custom' => 'Personalizado',\n                    'delete' => 'Excluir',\n                    'description' => 'Descrição',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nome',\n                    'permission-type' => 'Tipo de Permissão',\n                ],\n            ],\n            'create' => [\n                'access-control' => 'Controle de Acesso',\n                'all' => 'Todos',\n                'back-btn' => 'Voltar',\n                'custom' => 'Personalizado',\n                'description' => 'Descrição',\n                'general' => 'Geral',\n                'name' => 'Nome',\n                'permissions' => 'Permissões',\n                'save-btn' => 'Salvar Cargo',\n                'title' => 'Adicionar Cargo',\n            ],\n            'edit' => [\n                'access-control' => 'Controle de Acesso',\n                'all' => 'Todos',\n                'back-btn' => 'Voltar',\n                'custom' => 'Personalizado',\n                'description' => 'Descrição',\n                'general' => 'Geral',\n                'name' => 'Nome',\n                'permissions' => 'Permissões',\n                'save-btn' => 'Salvar Cargo',\n                'title' => 'Editar Cargo',\n            ],\n        ],\n        'types' => [\n            'index' => [\n                'create-btn' => 'Adicionar Tipo',\n                'create-success' => 'Tipo adicionado com sucesso.',\n                'delete-failed' => 'Não é possível excluir o tipo.',\n                'delete-success' => 'Tipo excluído com sucesso.',\n                'title' => 'Tipos',\n                'update-success' => 'Tipo atualizado com sucesso.',\n                'datagrid' => [\n                    'delete' => 'Excluir',\n                    'description' => 'Descrição',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nome',\n                ],\n                'create' => [\n                    'name' => 'Nome',\n                    'save-btn' => 'Salvar Tipo',\n                    'title' => 'Adicionar Tipo',\n                ],\n                'edit' => [\n                    'title' => 'Editar Tipo',\n                ],\n            ],\n        ],\n        'sources' => [\n            'index' => [\n                'title' => 'Fontes',\n                'create-btn' => 'Criar Fonte',\n                'create-success' => 'Fonte criada com sucesso.',\n                'delete-failed' => 'Não foi possível excluir a fonte.',\n                'delete-success' => 'Fonte excluída com sucesso.',\n                'update-success' => 'Fonte atualizada com sucesso.',\n                'delete-failed-associated-leads' => 'Não é possível excluir a fonte porque está associada a leads existentes. Por favor, desvincule ou atualize esses leads antes da exclusão.',\n                'datagrid' => [\n                    'delete' => 'Excluir',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nome',\n                ],\n                'create' => [\n                    'name' => 'Nome',\n                    'save-btn' => 'Salvar Origem',\n                    'title' => 'Adicionar Origem',\n                ],\n                'edit' => [\n                    'title' => 'Editar Origem',\n                ],\n            ],\n        ],\n        'workflows' => [\n            'index' => [\n                'title' => 'Workflows',\n                'create-btn' => 'Adicionar Workflow',\n                'create-success' => 'Workflow adicionado com sucesso.',\n                'update-success' => 'Workflow atualizado com sucesso.',\n                'delete-success' => 'Workflow excluído com sucesso.',\n                'delete-failed' => 'Não é possível excluir o Workflow.',\n                'datagrid' => [\n                    'delete' => 'Excluir',\n                    'description' => 'Descrição',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nome',\n                ],\n            ],\n            'helpers' => [\n                'update-related-leads' => 'Atualizar leads relacionados',\n                'send-email-to-sales-owner' => 'Enviar e-mail para o proprietário de vendas',\n                'send-email-to-participants' => 'Enviar e-mail para os participantes',\n                'add-webhook' => 'Adicionar Webhook',\n                'update-lead' => 'Atualizar Oportunidade',\n                'update-person' => 'Atualizar Pessoa',\n                'send-email-to-person' => 'Enviar e-mail para a pessoa',\n                'add-tag' => 'Adicionar Tag',\n                'add-note-as-activity' => 'Adicionar Nota como Atividade',\n                'update-quote' => 'Update Quote',\n            ],\n            'create' => [\n                'title' => 'Adicionar Workflow',\n                'event' => 'Evento',\n                'back-btn' => 'Voltar',\n                'save-btn' => 'Salvar Workflow',\n                'name' => 'Nome',\n                'basic-details' => 'Detalhes Básicos',\n                'description' => 'Descrição',\n                'actions' => 'Ações',\n                'basic-details-info' => 'Informe as informações básicas do workflow.',\n                'event-info' => 'Um evento dispara, verifica, aplica condições e executa ações predefinidas.',\n                'conditions' => 'Condições',\n                'conditions-info' => 'As condições são regras que verificam cenários, acionadas em ocasiões específicas.',\n                'actions-info' => 'Uma ação não apenas reduz a carga de trabalho, mas também facilita a automação do CRM.',\n                'value' => 'Valor',\n                'condition-type' => 'Tipo de Condição',\n                'all-condition-are-true' => 'Todas as condições são verdadeiras',\n                'any-condition-are-true' => 'Qualquer condição é verdadeira',\n                'add-condition' => 'Adicionar Condição',\n                'add-action' => 'Adicionar Ação',\n                'yes' => 'Sim',\n                'no' => 'Não',\n                'email' => 'E-mail',\n                'is-equal-to' => 'É igual a',\n                'is-not-equal-to' => 'Não é igual a',\n                'equals-or-greater-than' => 'É igual ou maior que',\n                'equals-or-less-than' => 'É igual ou menor que',\n                'greater-than' => 'Maior que',\n                'less-than' => 'Menor que',\n                'type' => 'Tipo',\n                'contain' => 'Contém',\n                'contains' => 'Contém',\n                'does-not-contain' => 'Não contém',\n            ],\n            'edit' => [\n                'title' => 'Editar Workflow',\n                'event' => 'Evento',\n                'back-btn' => 'Voltar',\n                'save-btn' => 'Salvar Workflow',\n                'name' => 'Nome',\n                'basic-details' => 'Detalhes Básicos',\n                'description' => 'Descrição',\n                'actions' => 'Ações',\n                'type' => 'Tipo',\n                'basic-details-info' => 'Informe as informações básicas do workflow.',\n                'event-info' => 'Um evento dispara, verifica, aplica condições e executa ações predefinidas.',\n                'conditions' => 'Condições',\n                'conditions-info' => 'As condições são regras que verificam cenários, acionadas em ocasiões específicas.',\n                'actions-info' => 'Uma ação não apenas reduz a carga de trabalho, mas também facilita a automação do CRM.',\n                'value' => 'Valor',\n                'condition-type' => 'Tipo de Condição',\n                'all-condition-are-true' => 'Todas as condições são verdadeiras',\n                'any-condition-are-true' => 'Qualquer condição é verdadeira',\n                'add-condition' => 'Adicionar Condição',\n                'add-action' => 'Adicionar Ação',\n                'yes' => 'Sim',\n                'no' => 'Não',\n                'email' => 'E-mail',\n                'is-equal-to' => 'É igual a',\n                'is-not-equal-to' => 'Não é igual a',\n                'equals-or-greater-than' => 'É igual ou maior que',\n                'equals-or-less-than' => 'É igual ou menor que',\n                'greater-than' => 'Maior que',\n                'less-than' => 'Menor que',\n                'contain' => 'Contém',\n                'contains' => 'Contém',\n                'does-not-contain' => 'Não contém',\n            ],\n        ],\n        'webforms' => [\n            'index' => [\n                'title' => 'Webforms',\n                'create-btn' => 'Adicionar Webform',\n                'create-success' => 'Webform adicionado com sucesso.',\n                'update-success' => 'Webform atualizado com sucesso.',\n                'delete-success' => 'Webform excluído com sucesso.',\n                'delete-failed' => 'Não é possível excluir o Webform.',\n                'datagrid' => [\n                    'id' => 'ID',\n                    'title' => 'Título',\n                    'edit' => 'Editar',\n                    'delete' => 'Excluir',\n                ],\n            ],\n            'create' => [\n                'title' => 'Adicionar Webform',\n                'add-attribute-btn' => 'Adicionar Botão de Atributo',\n                'attribute-label-color' => 'Cor do Rótulo do Atributo',\n                'attributes' => 'Atributos',\n                'attributes-info' => 'Adicione atributos personalizados ao formulário.',\n                'background-color' => 'Cor de Fundo',\n                'create-lead' => 'Adicionar Oportunidade',\n                'customize-webform' => 'Personalizar Webform',\n                'customize-webform-info' => 'Personalize seu formulário com as cores dos elementos de sua escolha.',\n                'description' => 'Descrição',\n                'display-custom-message' => 'Exibir mensagem personalizada',\n                'form-background-color' => 'Cor de Fundo do Formulário',\n                'form-submit-btn-color' => 'Cor do Botão de Envio do Formulário',\n                'form-submit-button-color' => 'Cor do Botão de Envio do Formulário',\n                'form-title-color' => 'Cor do Título do Formulário',\n                'general' => 'Geral',\n                'leads' => 'Oportunidades',\n                'person' => 'Pessoa',\n                'save-btn' => 'Salvar Webform',\n                'submit-button-label' => 'Rótulo do Botão de Envio',\n                'submit-success-action' => 'Ação de Sucesso ao Enviar',\n                'redirect-to-url' => 'Redirecionar Para URL',\n                'choose-value' => 'Escolher Valor',\n                'select-file' => 'Selecionar Arquivo',\n                'select-image' => 'Selecionar Imagem',\n                'enter-value' => 'Inserir Valor',\n            ],\n            'edit' => [\n                'add-attribute-btn' => 'Adicionar Botão de Atributo',\n                'attribute-label-color' => 'Cor do Rótulo do Atributo',\n                'attributes' => 'Atributos',\n                'attributes-info' => 'Adicione atributos personalizados ao formulário.',\n                'background-color' => 'Cor de Fundo',\n                'choose-value' => 'Escolher Valor',\n                'code-snippet' => 'Trecho de Código',\n                'copied' => 'Copiado',\n                'copy' => 'Copiar',\n                'create-lead' => 'Adicionar Oportunidade',\n                'customize-webform' => 'Personalizar Webform',\n                'customize-webform-info' => 'Personalize seu formulário com as cores dos elementos de sua escolha.',\n                'description' => 'Descrição',\n                'display-custom-message' => 'Exibir mensagem personalizada',\n                'embed' => 'Incorporar',\n                'enter-value' => 'Inserir Valor',\n                'form-background-color' => 'Cor de Fundo do Formulário',\n                'form-submit-btn-color' => 'Cor do Botão de Envio do Formulário',\n                'form-submit-button-color' => 'Cor do Botão de Envio do Formulário',\n                'form-title-color' => 'Cor do Título do Formulário',\n                'general' => 'Geral',\n                'leads' => 'Oportunidades',\n                'person' => 'Pessoa',\n                'preview' => 'Visualizar',\n                'public-url' => 'URL Pública',\n                'redirect-to-url' => 'Redirecionar Para URL',\n                'save-btn' => 'Salvar Webform',\n                'select-file' => 'Selecionar Arquivo',\n                'select-image' => 'Selecionar Imagem',\n                'submit-button-label' => 'Rótulo do Botão de Envio',\n                'submit-success-action' => 'Ação de Sucesso ao Enviar',\n                'title' => 'Editar Webform',\n            ],\n        ],\n        'email-template' => [\n            'index' => [\n                'create-btn' => 'Adicionar Modelo de E-mail',\n                'title' => 'Modelos de E-mail',\n                'create-success' => 'Modelo de E-mail adicionado com sucesso.',\n                'update-success' => 'Modelo de E-mail atualizado com sucesso.',\n                'delete-success' => 'Modelo de E-mail excluído com sucesso.',\n                'delete-failed' => 'Não é possível excluir o Modelo de E-mail.',\n                'datagrid' => [\n                    'delete' => 'Excluir',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nome',\n                    'subject' => 'Assunto',\n                ],\n            ],\n            'create' => [\n                'title' => 'Adicionar Modelo de E-mail',\n                'save-btn' => 'Salvar Modelo de E-mail',\n                'email-template' => 'Modelo de E-mail',\n                'subject' => 'Assunto',\n                'content' => 'Conteúdo',\n                'subject-placeholders' => 'Descrição do Assunto',\n                'general' => 'Geral',\n                'name' => 'Nome',\n            ],\n            'edit' => [\n                'title' => 'Editar Modelo de E-mail',\n                'save-btn' => 'Salvar Modelo de E-mail',\n                'email-template' => 'Modelo de E-mail',\n                'subject' => 'Assunto',\n                'content' => 'Conteúdo',\n                'subject-placeholders' => 'Descrição do Assunto',\n                'general' => 'Geral',\n                'name' => 'Nome',\n            ],\n        ],\n        'marketing' => [\n            'events' => [\n                'index' => [\n                    'create-btn' => 'Adicionar Evento',\n                    'title' => 'Eventos',\n                    'create-success' => 'Evento adicionado com sucesso.',\n                    'update-success' => 'Evento atualizado com sucesso.',\n                    'delete-success' => 'Evento excluído com sucesso.',\n                    'delete-failed' => 'Não é possível excluir o evento.',\n                    'mass-delete-success' => 'Eventos excluídos com sucesso',\n                    'delete-failed-associated-campaigns' => 'Não é possível excluir o evento, pois está associado a campanhas existentes. Por favor, desvincule ou atualize essas campanhas antes da exclusão.',\n                    'datagrid' => [\n                        'delete' => 'Excluir',\n                        'edit' => 'Editar',\n                        'id' => 'ID',\n                        'name' => 'Nome',\n                        'description' => 'Descrição',\n                        'date' => 'Data',\n                    ],\n                    'create' => [\n                        'title' => 'Adicionar Evento',\n                        'name' => 'Nome',\n                        'date' => 'Data',\n                        'description' => 'Descrição',\n                        'save-btn' => 'Salvar Evento',\n                    ],\n                    'edit' => [\n                        'title' => 'Editar Evento',\n                    ],\n                ],\n            ],\n            'campaigns' => [\n                'index' => [\n                    'create-btn' => 'Adcionar Campanha',\n                    'title' => 'Campanhas',\n                    'create-success' => 'Campanha adicionada com sucesso.',\n                    'update-success' => 'Campanha atualizada com sucesso.',\n                    'delete-success' => 'Campanha excluída com sucesso.',\n                    'delete-failed' => 'Não é possível excluir a campanha.',\n                    'mass-delete-success' => 'Campanhas excluídas com sucesso',\n                    'datagrid' => [\n                        'id' => 'ID',\n                        'name' => 'Nome',\n                        'subject' => 'Assunto',\n                        'status' => 'Status',\n                        'active' => 'Ativo',\n                        'inactive' => 'Inativo',\n                        'edit' => 'Editar',\n                        'delete' => 'Excluir',\n                    ],\n                    'create' => [\n                        'title' => 'Adicionar Campanha',\n                        'name' => 'Nome',\n                        'type' => 'Tipo',\n                        'subject' => 'Assunto',\n                        'event' => 'Evento',\n                        'email-template' => 'Modelo de E-mail',\n                        'status' => 'Status',\n                    ],\n                    'edit' => [\n                        'title' => 'Editar Campanha',\n                    ],\n                ],\n            ],\n        ],\n        'tags' => [\n            'index' => [\n                'create-btn' => 'Adicionar Tag',\n                'title' => 'Tags',\n                'create-success' => 'Tag adicionada com sucesso.',\n                'update-success' => 'Tag atualizada com sucesso.',\n                'delete-success' => 'Tag excluída com sucesso.',\n                'delete-failed' => 'Não é possível excluir a Tag.',\n                'datagrid' => [\n                    'delete' => 'Excluir',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'name' => 'Nome',\n                    'users' => 'Usuários',\n                    'created-at' => 'Criado Em',\n                ],\n                'create' => [\n                    'name' => 'Nome',\n                    'save-btn' => 'Salvar Tag',\n                    'title' => 'Adicionar Tag',\n                    'color' => 'Cor',\n                ],\n                'edit' => [\n                    'title' => 'Editar Tag',\n                ],\n            ],\n        ],\n        'users' => [\n            'index' => [\n                'create-btn' => 'Adicionar Usuário',\n                'create-success' => 'Usuário adicionado com sucesso.',\n                'delete-failed' => 'Não foi possível excluir o usuário.',\n                'delete-success' => 'Usuário excluído com sucesso.',\n                'last-delete-error' => 'É necessário pelo menos um usuário.',\n                'mass-delete-failed' => 'Não foi possível excluir os usuários.',\n                'mass-delete-success' => 'Usuários excluídos com sucesso.',\n                'mass-update-failed' => 'Não foi possível atualizar os usuários.',\n                'mass-update-success' => 'Usuários atualizados com sucesso.',\n                'title' => 'Usuários',\n                'update-success' => 'Usuário atualizado com sucesso.',\n                'user-define-error' => 'Não é possível excluir o usuário do sistema.',\n                'active' => 'Ativo',\n                'inactive' => 'Inativo',\n                'datagrid' => [\n                    'active' => 'Ativo',\n                    'created-at' => 'Criado Em',\n                    'delete' => 'Excluir',\n                    'edit' => 'Editar',\n                    'email' => 'E-mail',\n                    'id' => 'ID',\n                    'inactive' => 'Inativo',\n                    'name' => 'Nome',\n                    'status' => 'Status',\n                    'update-status' => 'Atualizar Status',\n                    'users' => 'Usuários',\n                ],\n                'create' => [\n                    'confirm-password' => 'Confirmar Senha',\n                    'email' => 'E-mail',\n                    'general' => 'Geral',\n                    'global' => 'Global',\n                    'group' => 'Grupo',\n                    'individual' => 'Individual',\n                    'name' => 'Nome',\n                    'password' => 'Senha',\n                    'permission' => 'Permissão',\n                    'role' => 'Função',\n                    'save-btn' => 'Salvar Usuário',\n                    'status' => 'Status',\n                    'title' => 'Adicionar Usuário',\n                    'view-permission' => 'Visualizar Permissão',\n                    'select-at-lest-one-group' => 'Select at least one group',\n                ],\n                'edit' => [\n                    'title' => 'Editar Usuário',\n                ],\n            ],\n        ],\n        'pipelines' => [\n            'index' => [\n                'title' => 'Funis',\n                'create-btn' => 'Adicionar Funil',\n                'create-success' => 'Funil adicionado com sucesso.',\n                'update-success' => 'Funil atualizado com sucesso.',\n                'default-required' => 'É necessário pelo menos um pipeline padrão.',\n                'delete-success' => 'Funil excluído com sucesso.',\n                'delete-failed' => 'Não foi possível excluir o funil.',\n                'default-delete-error' => 'Não é possível excluir o funil padrão.',\n                'datagrid' => [\n                    'delete' => 'Excluir',\n                    'edit' => 'Editar',\n                    'id' => 'ID',\n                    'is-default' => 'É Padrão',\n                    'name' => 'Nome',\n                    'no' => 'Não',\n                    'rotten-days' => 'Dias parado nesta etapa',\n                    'yes' => 'Sim',\n                ],\n            ],\n            'create' => [\n                'title' => 'Adicionar Funil',\n                'save-btn' => 'Salvar Funil',\n                'name' => 'Nome',\n                'rotten-days' => 'Dias parado nesta etapa',\n                'mark-as-default' => 'Marcar como Padrão',\n                'general' => 'Geral',\n                'probability' => 'Probabilidade (%)',\n                'new-stage' => 'Novo',\n                'won-stage' => 'Ganho',\n                'lost-stage' => 'Perdido',\n                'stage-btn' => 'Adicionar Estágio',\n                'stages' => 'Estágios',\n                'duplicate-name' => 'O campo \"Nome\" não pode ser duplicado',\n                'delete-stage' => 'Excluir Estágio',\n                'add-new-stages' => 'Adicionar Novos Estágios',\n                'add-stage-info' => 'Adicionar novo estágio para o seu Funil',\n                'newly-added' => 'Adicionado Recentemente',\n                'stage-delete-success' => 'Estágio excluído com sucesso',\n            ],\n            'edit' => [\n                'title' => 'Editar Funil',\n                'save-btn' => 'Salvar Funil',\n                'name' => 'Nome',\n                'rotten-days' => 'Dias parado nesta etapa',\n                'mark-as-default' => 'Marcar como Padrão',\n                'general' => 'Geral',\n                'probability' => 'Probabilidade (%)',\n                'new-stage' => 'Novo',\n                'won-stage' => 'Ganho',\n                'lost-stage' => 'Perdido',\n                'stage-btn' => 'Adicionar Estágio',\n                'stages' => 'Estágios',\n                'duplicate-name' => 'O campo \"Nome\" não pode ser duplicado',\n                'delete-stage' => 'Excluir Estágio',\n                'add-new-stages' => 'Adicionar Novos Estágios',\n                'add-stage-info' => 'Adicionar novo estágio para o seu Funil',\n                'stage-delete-success' => 'Estágio excluído com sucesso',\n            ],\n        ],\n        'webhooks' => [\n            'index' => [\n                'title' => 'Webhooks',\n                'create-btn' => 'Adicionar Webhook',\n                'create-success' => 'Webhook adicionado com sucesso.',\n                'update-success' => 'Webhook atualizado com sucesso.',\n                'delete-success' => 'Webhook deletado com sucesso.',\n                'delete-failed' => 'Webhook não pode ser deletado.',\n                'datagrid' => [\n                    'id' => 'ID',\n                    'delete' => 'Deletar',\n                    'edit' => 'Editar',\n                    'name' => 'Nome',\n                    'entity-type' => 'Tipo de Entidade',\n                    'end-point' => 'Ponto de Acesso',\n                ],\n            ],\n            'create' => [\n                'title' => 'Adcionar Webhook',\n                'save-btn' => 'Salvar Webhook',\n                'info' => 'Digite os detalhes dos webhooks',\n                'url-and-parameters' => 'URL e Parâmetros',\n                'method' => 'Método',\n                'post' => 'Post',\n                'put' => 'Put',\n                'url-endpoint' => 'Endpoint da URL',\n                'parameters' => 'Parâmetros',\n                'add-new-parameter' => 'Adicionar Novo Parâmetro',\n                'url-preview' => 'Pré-visualização da URL:',\n                'headers' => 'Cabeçalhos',\n                'add-new-header' => 'Adicionar Novo Cabeçalho',\n                'body' => 'Corpo',\n                'default' => 'Padrão',\n                'x-www-form-urlencoded' => 'x-www-form-urlencoded',\n                'key-and-value' => 'Chave e Valor',\n                'add-new-payload' => 'Adicionar novo payload',\n                'raw' => 'Raw',\n                'general' => 'Geral',\n                'name' => 'Nome',\n                'entity-type' => 'Tipo de Entidade',\n                'insert-placeholder' => 'Inserir Placeholder',\n                'description' => 'Descrição',\n                'json' => 'Json',\n                'text' => 'Texto',\n            ],\n            'edit' => [\n                'title' => 'Editar Webhook',\n                'edit-btn' => 'Salvar Webhook',\n                'save-btn' => 'Salvar Webhook',\n                'info' => 'Digite os detalhes dos webhooks',\n                'url-and-parameters' => 'URL e Parâmetros',\n                'method' => 'Método',\n                'post' => 'Post',\n                'put' => 'Put',\n                'url-endpoint' => 'Endpoint da URL',\n                'parameters' => 'Parâmetros',\n                'add-new-parameter' => 'Adicionar Novo Parâmetro',\n                'url-preview' => 'Pré-visualização da URL:',\n                'headers' => 'Cabeçalhos',\n                'add-new-header' => 'Adicionar Novo Cabeçalho',\n                'body' => 'Corpo',\n                'default' => 'Padrão',\n                'x-www-form-urlencoded' => 'x-www-form-urlencoded',\n                'key-and-value' => 'Chave e Valor',\n                'add-new-payload' => 'Adicionar novo payload',\n                'raw' => 'Raw',\n                'general' => 'Geral',\n                'name' => 'Nome',\n                'entity-type' => 'Tipo de Entidade',\n                'insert-placeholder' => 'Inserir Placeholder',\n                'description' => 'Descrição',\n                'json' => 'Json',\n                'text' => 'Texto',\n            ],\n        ],\n        'warehouses' => [\n            'index' => [\n                'title' => 'Depósitos',\n                'create-btn' => 'Adicionar Depósito',\n                'create-success' => 'Depósito adicionado com sucesso.',\n                'name-exists' => 'Nome do depósito já existe.',\n                'update-success' => 'Depósito atualizado com sucesso.',\n                'delete-success' => 'Depósito deletado com sucesso.',\n                'delete-failed' => 'Depósito não pode ser deletado.',\n                'datagrid' => [\n                    'id' => 'ID',\n                    'name' => 'Nome',\n                    'contact-name' => 'Nome de Contato',\n                    'delete' => 'Deletar',\n                    'edit' => 'Editar',\n                    'view' => 'Visualizar',\n                    'created-at' => 'Criado em',\n                    'products' => 'Produtos',\n                    'contact-emails' => 'Emails de Contato',\n                    'contact-numbers' => 'Números de Contato',\n                ],\n            ],\n            'create' => [\n                'title' => 'Adicionar Depósito',\n                'save-btn' => 'Salvar Depósito',\n                'contact-info' => 'Informações de Contato',\n            ],\n            'edit' => [\n                'title' => 'Editar Depósito',\n                'save-btn' => 'Salvar Depósito',\n                'contact-info' => 'Informações de Contato',\n            ],\n            'view' => [\n                'all' => 'Todos',\n                'notes' => 'Notas',\n                'files' => 'Arquivos',\n                'location' => 'Localização',\n                'change-logs' => 'Registros de Alterações',\n                'locations' => [\n                    'action' => 'Ação',\n                    'add-location' => 'Adicionar Localização',\n                    'create-success' => 'Localização adicionada com sucesso.',\n                    'delete' => 'Deletar',\n                    'delete-failed' => 'Localização não pode ser deletada.',\n                    'delete-success' => 'Localização deletada com sucesso.',\n                    'name' => 'Nome',\n                    'save-btn' => 'Salvar',\n                ],\n                'general-information' => [\n                    'title' => 'Informações Gerais',\n                ],\n                'contact-information' => [\n                    'title' => 'Informações de Contato',\n                ],\n            ],\n        ],\n        'attributes' => [\n            'index' => [\n                'title' => 'Atributos',\n                'create-btn' => 'Adicionar Atributo',\n                'create-success' => 'Atributo criados com sucesso.',\n                'update-success' => 'Atributo atualizados com sucesso.',\n                'delete-success' => 'Atributo deletados com sucesso.',\n                'delete-failed' => 'Atributo não podem ser deletados.',\n                'user-define-error' => 'Não é possível deletar atributos do sistema.',\n                'mass-delete-failed' => 'Atributos do sistema não podem ser deletados.',\n                'datagrid' => [\n                    'yes' => 'Sim',\n                    'no' => 'Não',\n                    'id' => 'ID',\n                    'code' => 'Código',\n                    'name' => 'Nome',\n                    'entity-type' => 'Tipo de Entidade',\n                    'type' => 'Tipo',\n                    'is-default' => 'É Padrão',\n                    'edit' => 'Editar',\n                    'delete' => 'Deletar',\n                    'entity-types' => [\n                        'leads' => 'Oportunidades',\n                        'organizations' => 'Empresas',\n                        'persons' => 'Pessoas',\n                        'products' => 'Produtos',\n                        'quotes' => 'Cotações',\n                        'warehouses' => 'Depósitos',\n                    ],\n                    'types' => [\n                        'text' => 'Texto',\n                        'textarea' => 'Área de texto',\n                        'price' => 'Preço',\n                        'boolean' => 'Booleano',\n                        'select' => 'Selecionar',\n                        'multiselect' => 'Seleção múltipla',\n                        'checkbox' => 'Caixa de seleção',\n                        'email' => 'Email',\n                        'address' => 'Endereço',\n                        'phone' => 'Telefone',\n                        'lookup' => 'Busca',\n                        'datetime' => 'Data e hora',\n                        'date' => 'Data',\n                        'image' => 'Imagem',\n                        'file' => 'Arquivo',\n                    ],\n                ],\n            ],\n            'create' => [\n                'title' => 'Adicionar Atributo',\n                'save-btn' => 'Salvar Atributo',\n                'code' => 'Código',\n                'name' => 'Nome',\n                'entity-type' => 'Tipo de Entidade',\n                'type' => 'Tipo',\n                'validations' => 'Validações',\n                'is-required' => 'É Obrigatório',\n                'input-validation' => 'Validação de Entrada',\n                'is-unique' => 'É Único',\n                'labels' => 'Rótulos',\n                'general' => 'Geral',\n                'numeric' => 'Numérico',\n                'decimal' => 'Decimal',\n                'url' => 'URL',\n                'options' => 'Opções',\n                'option-type' => 'Tipo de Opção',\n                'lookup-type' => 'Tipo de Pesquisa',\n                'add-option' => 'Adicionar Opção',\n                'save-option' => 'Salvar Opção',\n                'option-name' => 'Nome da Opção',\n                'add-attribute-options' => 'Adicionar Opções de Atributo',\n                'text' => 'Texto',\n                'textarea' => 'Área de Texto',\n                'price' => 'Preço',\n                'boolean' => 'Verdadeiro ou falso',\n                'select' => 'Seleção',\n                'multiselect' => 'Multiseleção',\n                'email' => 'E-mail',\n                'address' => 'Endereço',\n                'phone' => 'Telefone',\n                'datetime' => 'Data e Hora',\n                'date' => 'Data',\n                'image' => 'Imagem',\n                'file' => 'Arquivo',\n                'lookup' => 'Pesquisa',\n                'entity_type' => 'Tipo de Entidade',\n                'checkbox' => 'Caixa de Seleção',\n                'is_required' => 'É Obrigatório',\n                'is_unique' => 'É Único',\n                'actions' => 'Ações',\n            ],\n            'edit' => [\n                'actions' => 'Ações',\n                'add-attribute-options' => 'Adicionar Opções de Atributo',\n                'add-option' => 'Adicionar Opção',\n                'address' => 'Endereço',\n                'boolean' => 'Verdadeiro ou falso',\n                'checkbox' => 'Caixa de Seleção',\n                'code' => 'Código',\n                'date' => 'Data',\n                'datetime' => 'Data e Hora',\n                'decimal' => 'Decimal',\n                'email' => 'E-mail',\n                'entity-type' => 'Tipo de Entidade',\n                'entity_type' => 'Tipo de Entidade',\n                'file' => 'Arquivo',\n                'general' => 'Geral',\n                'image' => 'Imagem',\n                'input-validation' => 'Validação de Entrada',\n                'is-required' => 'É Obrigatório',\n                'is-unique' => 'É Único',\n                'is_required' => 'É Obrigatório',\n                'is_unique' => 'É Único',\n                'labels' => 'Rótulos',\n                'lookup' => 'Pesquisa',\n                'lookup-type' => 'Tipo de Pesquisa',\n                'multiselect' => 'Multiseleção',\n                'name' => 'Nome',\n                'numeric' => 'Numérico',\n                'option-deleted' => 'Attribute Option is deleted successfully',\n                'option-name' => 'Nome da Opção',\n                'option-type' => 'Tipo de Opção',\n                'options' => 'Opções',\n                'phone' => 'Telefone',\n                'price' => 'Preço',\n                'save-btn' => 'Salvar Atributo',\n                'save-option' => 'Salvar Opção',\n                'select' => 'Seleção',\n                'text' => 'Texto',\n                'textarea' => 'Área de Texto',\n                'title' => 'Editar Atributo',\n                'type' => 'Tipo',\n                'url' => 'URL',\n                'validations' => 'Validações',\n            ],\n        ],\n        'data-transfer' => [\n            'imports' => [\n                'create' => [\n                    'action' => 'Action',\n                    'allowed-errors' => 'Allowed Errors',\n                    'back-btn' => 'Back',\n                    'create-update' => 'Create/Update',\n                    'delete' => 'Delete',\n                    'download-sample' => 'Download Sample',\n                    'field-separator' => 'Field Separator',\n                    'file' => 'File',\n                    'general' => 'General',\n                    'images-directory' => 'Images Directory Path',\n                    'process-in-queue' => 'Process In Queue',\n                    'results' => 'Results',\n                    'save-btn' => 'Save Import',\n                    'settings' => 'Settings',\n                    'skip-errors' => 'Skip Errors',\n                    'stop-on-errors' => 'Stop on Errors',\n                    'title' => 'Create Import',\n                    'type' => 'Type',\n                    'validation-strategy' => 'Validation Strategy',\n                ],\n                'edit' => [\n                    'action' => 'Action',\n                    'allowed-errors' => 'Allowed Errors',\n                    'back-btn' => 'Back',\n                    'create-update' => 'Create/Update',\n                    'delete' => 'Delete',\n                    'download-sample' => 'Download Sample',\n                    'field-separator' => 'Field Separator',\n                    'file' => 'File',\n                    'general' => 'General',\n                    'images-directory' => 'Images Directory Path',\n                    'process-in-queue' => 'Process In Queue',\n                    'results' => 'Results',\n                    'save-btn' => 'Save Import',\n                    'settings' => 'Settings',\n                    'skip-errors' => 'Skip Errors',\n                    'stop-on-errors' => 'Stop on Errors',\n                    'title' => 'Edit Import',\n                    'type' => 'Type',\n                    'validation-strategy' => 'Validation Strategy',\n                ],\n                'index' => [\n                    'button-title' => 'Create Import',\n                    'title' => 'Imports',\n                    'datagrid' => [\n                        'actions' => 'Actions',\n                        'completed-at' => 'Completed At',\n                        'created' => 'Created',\n                        'delete' => 'Delete',\n                        'deleted' => 'Deleted',\n                        'edit' => 'Edit',\n                        'error-file' => 'Error File',\n                        'id' => 'ID',\n                        'started-at' => 'Started At',\n                        'state' => 'State',\n                        'summary' => 'Summary',\n                        'type' => 'Type',\n                        'updated' => 'Updated',\n                        'uploaded-file' => 'Uploaded File',\n                    ],\n                ],\n                'import' => [\n                    'back-btn' => 'Back',\n                    'completed-batches' => 'Total Batches Completed:',\n                    'download-error-report' => 'Download Full Report',\n                    'edit-btn' => 'Edit',\n                    'imported-info' => 'Congratulations! Your import was successful.',\n                    'importing-info' => 'Import In Process',\n                    'indexing-info' => 'Resources Indexing (Price, Inventory and Elastic Search) In Progress',\n                    'linking-info' => 'Resources Linking In Progress',\n                    'progress' => 'Progress:',\n                    'title' => 'Import',\n                    'total-batches' => 'Total Batches:',\n                    'total-created' => 'Total Records Created:',\n                    'total-deleted' => 'Total Records Deleted:',\n                    'total-errors' => 'Total Errors:',\n                    'total-invalid-rows' => 'Total Invalid Rows:',\n                    'total-rows-processed' => 'Total Rows Processed:',\n                    'total-updated' => 'Total Records Updated:',\n                    'validate' => 'Validate',\n                    'validate-info' => 'Click on Validate Data to check your import.',\n                    'validating-info' => 'The data started reading and Validating',\n                    'validation-failed-info' => 'Your import is invalid. Please fix the following errors and try again.',\n                    'validation-success-info' => 'Your import is valid. Click on Import to start the import process.',\n                ],\n                'create-success' => 'Import created successfully.',\n                'delete-failed' => 'Import deletion failed unexpectedly.',\n                'delete-success' => 'Import deleted successfully.',\n                'not-valid' => 'Import is invalid',\n                'nothing-to-import' => 'There are no resources to import.',\n                'setup-queue-error' => 'Please change your queue driver to \"database\" or \"redis\" to start the import process.',\n                'update-success' => 'Import updated successfully.',\n            ],\n        ],\n    ],\n    'activities' => [\n        'index' => [\n            'title' => 'Atividades',\n            'datagrid' => [\n                'comment' => 'Comentário',\n                'created_at' => 'Criado Em',\n                'created_by' => 'Criado Por',\n                'edit' => 'Editar',\n                'id' => 'ID',\n                'done' => 'Concluído',\n                'not-done' => 'Não Concluído',\n                'lead' => 'Oportunidade',\n                'mass-delete' => 'Excluir em Massa',\n                'mass-update' => 'Atualizar em Massa',\n                'schedule-from' => 'Agendado de',\n                'schedule-to' => 'Agendado até',\n                'schedule_from' => 'Agendado de',\n                'schedule_to' => 'Agendado até',\n                'title' => 'Título',\n                'is_done' => 'Está Concluído',\n                'type' => 'Tipo',\n                'update' => 'Atualizar',\n                'call' => 'Chamada',\n                'meeting' => 'Reunião',\n                'lunch' => 'Almoço',\n            ],\n        ],\n        'edit' => [\n            'title' => 'Editar Atividade',\n            'back-btn' => 'Voltar',\n            'save-btn' => 'Salvar Atividade',\n            'type' => 'Tipo de Atividade',\n            'call' => 'Chamada',\n            'meeting' => 'Reunião',\n            'lunch' => 'Almoço',\n            'schedule_to' => 'Agendado até',\n            'schedule_from' => 'Agendado de',\n            'location' => 'Localização',\n            'comment' => 'Comentário',\n            'lead' => 'Oportunidade',\n            'participants' => 'Participantes',\n            'general' => 'Geral',\n            'persons' => 'Pessoas',\n            'no-result-found' => 'Nenhum registro encontrado.',\n            'users' => 'Usuários',\n        ],\n        'updated' => 'Atualizado',\n        'created' => 'Criado',\n        'duration-overlapping' => 'Os participantes têm outra reunião neste horário. Deseja continuar?',\n        'create-success' => 'Atividade adicionada com sucesso.',\n        'update-success' => 'Atividade atualizada com sucesso.',\n        'overlapping-error' => 'Os participantes têm outra reunião neste horário.',\n        'destroy-success' => 'Atividade deletada com sucesso.',\n        'delete-failed' => 'A atividade não pode ser deletada.',\n        'mass-update-success' => 'Atividades atualizadas com sucesso.',\n        'mass-destroy-success' => 'Activities deleted successfully.',\n        'mass-delete-failed' => 'Activities can not be deleted.',\n    ],\n    'mail' => [\n        'index' => [\n            'compose' => 'Escrever',\n            'draft' => 'Rascunho',\n            'inbox' => 'Caixa de Entrada',\n            'outbox' => 'Caixa de Saída',\n            'sent' => 'Enviado',\n            'trash' => 'Lixeira',\n            'compose-mail-btn' => 'Escrever E-mail',\n            'btn' => 'E-mail',\n            'mail' => [\n                'title' => 'Escrever E-mail',\n                'to' => 'Para',\n                'enter-emails' => 'Pressione Enter para adicionar e-mails',\n                'cc' => 'Cópia',\n                'bcc' => 'Cópia oculta',\n                'subject' => 'Assunto',\n                'send-btn' => 'Enviar',\n                'message' => 'Mensagem',\n                'draft' => 'Rascunho',\n            ],\n            'datagrid' => [\n                'id' => 'ID',\n                'from' => 'De',\n                'to' => 'Para',\n                'subject' => 'Assunto',\n                'tags' => 'Tags',\n                'content' => 'Content',\n                'attachments' => 'Attachments',\n                'date' => 'Date',\n                'move-to-inbox' => 'Movido para Caixa de Entrada',\n                'move-to-trash' => 'Movido para a lixeira',\n                'edit' => 'Editar',\n                'view' => 'Visualizar',\n                'delete' => 'Excluir',\n            ],\n        ],\n\n        'create-success' => 'E-mail enviado com sucesso.',\n        'update-success' => 'E-mail atualizado com sucesso.',\n        'mass-update-success' => 'E-mails atualizados com sucesso.',\n        'delete-success' => 'E-mail excluído com sucesso.',\n        'delete-failed' => 'E-mail não pode ser excluído.',\n        'invalid-route' => 'Rota inválida para o e-mail.',\n        'unauthorized' => 'Esta ação não está autorizada.',\n\n        'view' => [\n            'title' => 'E-mails',\n            'subject' => ':subject',\n            'link-mail' => 'Link do E-mail',\n            'to' => 'Para',\n            'cc' => 'Cópia',\n            'bcc' => 'Cópia oculta',\n            'reply' => 'Responder',\n            'reply-all' => 'Responder a Todos',\n            'forward' => 'Encaminhar',\n            'delete' => 'Excluir',\n            'enter-mails' => 'Digite o id do e-mail',\n            'rotten-days' => 'O negócio está sem movimentação há :days dias',\n            'search-an-existing-lead' => 'Pesquisar um negócio existente',\n            'search-an-existing-contact' => 'Pesquisar um contato existente',\n            'message' => 'Mensagem',\n            'add-attachments' => 'Adicionar Anexos',\n            'discard' => 'Descartar',\n            'send' => 'Enviar',\n            'no-result-found' => 'Nenhum resultado encontrado',\n            'add-new-contact' => 'Adicionar Novo Contato',\n            'description' => 'Descrição',\n            'search' => 'Pesquisar...',\n            'add-new-lead' => 'Adicionar Nova Oportunidade',\n            'create-new-contact' => 'Adicionar Novo Contato',\n            'save-contact' => 'Salvar Contato',\n            'create-lead' => 'Adicionar Oportunidade',\n            'linked-contact' => 'Contato Vinculado',\n            'link-to-contact' => 'Vincular ao Contato',\n            'link-to-lead' => 'Vincular a uma Oportunidade',\n            'linked-lead' => 'Oportunidade Vinculado',\n            'lead-details' => 'Detalhes da Oportunidade',\n            'contact-person' => 'Pessoa de Contato',\n            'product' => 'Produto',\n            'tags' => [\n                'create-success' => 'Tag adicionada com sucesso.',\n                'destroy-success' => 'Tag excluída com sucesso.',\n            ],\n        ],\n    ],\n    'common' => [\n        'custom-attributes' => [\n            'add-more' => 'Adicionar Mais',\n            'address' => 'Endereço',\n            'city' => 'Cidade',\n            'contact' => 'Números de Contato',\n            'country' => 'País',\n            'email' => 'E-mail',\n            'home' => 'Casa',\n            'postcode' => 'CEP',\n            'save' => 'Salvar',\n            'select' => 'Selecionar',\n            'select-country' => 'Selecionar País',\n            'select-state' => 'Selecionar Estado',\n            'state' => 'Estado',\n            'update-contact-title' => 'Atualizar Números de Contato',\n            'update-emails-title' => 'Atualizar E-mails de Contato',\n            'work' => 'Trabalho',\n        ],\n    ],\n    'leads' => [\n        'create-success' => 'Negócio adicionado com sucesso.',\n        'update-success' => 'Negócio atualizado com sucesso.',\n        'update-failed' => 'Leads can not be deleted.',\n        'destroy-success' => 'Negócio excluído com sucesso.',\n        'destroy-failed' => 'Este negócio não pode ser excluído.',\n        'file' => [\n            'data-not-found' => 'Dados não encontrados.',\n            'empty-content' => 'O conteúdo do PDF está vazio ou não pôde ser extraído.',\n            'failed-extract' => 'Falha ao extrair texto do arquivo.',\n            'insufficient-info' => 'Devido a dados insuficientes, não podemos processar sua solicitação no momento.',\n            'invalid-base64' => 'Formato base64 inválido.',\n            'invalid-format' => 'Formato JSON inválido.',\n            'invalid-response' => 'Formato de resposta de IA inválido.',\n            'missing-api-key' => 'Chave API ou configuração do modelo ausente.',\n            'not-found' => 'Arquivo não encontrado.',\n            'recursive-call' => 'Chamada recursiva detectada.',\n            'text-generation-failed' => 'Falha na extração de texto. O arquivo pode estar vazio ou ilegível.',\n        ],\n        'index' => [\n            'title' => 'Oportunidades',\n            'create-btn' => 'Adicionar Negócio',\n            'datagrid' => [\n                'id' => 'ID',\n                'sales-person' => 'Vendedor',\n                'subject' => 'Assunto',\n                'source' => 'Origem',\n                'lead-value' => 'Valor do Negócio',\n                'lead-type' => 'Tipo de Negócio',\n                'tag-name' => 'Nome da Tag',\n                'contact-person' => 'Pessoa de Contato',\n                'stage' => 'Etapa',\n                'rotten-lead' => 'Negócio estagnado',\n                'date-to' => 'Data fechamento',\n                'created-at' => 'Criado em',\n                'no' => 'Não',\n                'yes' => 'Sim',\n                'delete' => 'Excluir',\n                'mass-delete' => 'Excluir em Massa',\n                'mass-update' => 'Atualizar em Massa',\n            ],\n            'kanban' => [\n                'rotten-days' => 'Negócio estagnado por :days dias',\n                'empty-list' => 'Sua lista de Negócios está vazia',\n                'empty-list-description' => 'Adicione um negócio para organizar seus objetivos.',\n                'create-lead-btn' => 'Adicionar Negócio',\n                'columns' => [\n                    'contact-person' => 'Pessoa de Contato',\n                    'id' => 'ID',\n                    'lead-type' => 'Tipo de Negócio',\n                    'lead-value' => 'Valor do negócio',\n                    'sales-person' => 'Vendedor',\n                    'source' => 'Origem',\n                    'title' => 'Título',\n                    'tags' => 'Tags',\n                    'expected-close-date' => 'Data Esperada de Fechamento',\n                    'created-at' => 'Criado em',\n                ],\n                'toolbar' => [\n                    'search' => [\n                        'title' => 'Buscar por título',\n                    ],\n                    'filters' => [\n                        'apply-filters' => 'Aplicar Filtros',\n                        'clear-all' => 'Limpar Tudo',\n                        'filter' => 'Filtrar',\n                        'filters' => 'Filtros',\n                        'from' => 'De',\n                        'select' => 'Selecionar',\n                        'to' => 'Para',\n                    ],\n                ],\n            ],\n            'view-switcher' => [\n                'all-pipelines' => 'Todos os Funis',\n                'create-new-pipeline' => 'Adicionar Novo Funil',\n            ],\n            'upload' => [\n                'create-lead' => 'Adicionar Negócio Usando AI',\n                'file' => 'Upload de arquivo',\n                'file-info' => 'Apenas arquivos nos formatos pdf, bmp, jpg, jpeg, png são aceitos.',\n                'file-required' => 'Por favor, selecione pelo menos um arquivo válido para prosseguir.',\n                'save-btn' => 'Salvar',\n                'upload-file' => 'Enviar arquivo',\n            ],\n        ],\n        'create' => [\n            'title' => 'Adicionar Negócio',\n            'save-btn' => 'Salvar',\n            'details' => 'Detalhes',\n            'details-info' => 'Coloque as informações básicas do Negócio',\n            'contact-person' => 'Pessoa de Contato',\n            'contact-info' => 'Informações sobre a Pessoa de Contato',\n            'products' => 'Produtos',\n            'products-info' => 'Informações sobre os Produtos',\n        ],\n        'edit' => [\n            'title' => 'Editar Negócio',\n            'save-btn' => 'Salvar',\n            'details' => 'Detalhes',\n            'details-info' => 'Coloque as informações básicas do Negócio',\n            'contact-person' => 'Pessoa de Contato',\n            'contact-info' => 'Informações sobre a Pessoa de Contato',\n            'products' => 'Produtos',\n            'products-info' => 'Informações sobre os Produtos',\n        ],\n        'common' => [\n            'contact' => [\n                'name' => 'Nome',\n                'email' => 'E-mail',\n                'contact-number' => 'Número de Contato',\n                'organization' => 'Empresa',\n            ],\n            'products' => [\n                'product-name' => 'Nome do Produto',\n                'quantity' => 'Quantidade',\n                'price' => 'Preço',\n                'amount' => 'Valor',\n                'action' => 'Ação',\n                'add-more' => 'Adicionar Mais',\n                'total' => 'Total',\n            ],\n        ],\n        'view' => [\n            'title' => 'Negócio: :title',\n            'rotten-days' => ':days Dias',\n            'tabs' => [\n                'description' => 'Descrição',\n                'products' => 'Produtos',\n                'quotes' => 'Cotações',\n            ],\n            'attributes' => [\n                'title' => 'Sobre o Negócio',\n            ],\n            'quotes' => [\n                'subject' => 'Assunto',\n                'expired-at' => 'Expirado em',\n                'sub-total' => 'Subtotal',\n                'discount' => 'Desconto',\n                'tax' => 'Imposto',\n                'adjustment' => 'Ajuste',\n                'grand-total' => 'Total Geral',\n                'delete' => 'Excluir',\n                'edit' => 'Editar',\n                'download' => 'Baixar',\n                'destroy-success' => 'Cotação excluída com sucesso.',\n                'empty-title' => 'Nenhuma Cotação Encontrada',\n                'empty-info' => 'Nenhuma Cotação Encontrada para este Negócio',\n                'add-btn' => 'Adicionar Cotação',\n            ],\n            'products' => [\n                'product-name' => 'Nome do Produto',\n                'quantity' => 'Quantidade',\n                'price' => 'Preço',\n                'amount' => 'Valor',\n                'action' => 'Ação',\n                'add-more' => 'Adicionar Mais',\n                'total' => 'Total',\n                'empty-title' => 'Nenhum Produto Encontrado',\n                'empty-info' => 'Nenhum Produto Encontrado para este Negócio',\n                'add-product' => 'Adicionar Produto',\n            ],\n            'persons' => [\n                'title' => 'Sobre as Pessoas',\n                'job-title' => ':job_title em :organization',\n            ],\n            'stages' => [\n                'won' => 'Ganho',\n                'lost' => 'Perdido',\n                'need-more-info' => 'Precisa de Mais Informações',\n                'closed-at' => 'Fechado em',\n                'won-value' => 'Valor Ganhado',\n                'lost-reason' => 'Motivo da Perda',\n                'save-btn' => 'Salvar',\n            ],\n            'tags' => [\n                'create-success' => 'Tag adicionada com sucesso.',\n                'destroy-success' => 'Tag excluída com sucesso.',\n            ],\n        ],\n    ],\n    'configuration' => [\n        'index' => [\n            'back' => 'Voltar',\n            'delete' => 'Excluir',\n            'save-btn' => 'Salvar Configuração',\n            'save-success' => 'Configuração Salva com Sucesso.',\n            'search' => 'Pesquisar',\n            'select-country' => 'Selecionar País',\n            'select-state' => 'Selecionar Estado',\n            'title' => 'Configuração',\n            'general' => [\n                'title' => 'Geral',\n                'info' => 'Configuração Geral',\n                'general' => [\n                    'title' => 'Geral',\n                    'info' => 'Atualize suas configurações gerais aqui.',\n                    'locale-settings' => [\n                        'title' => 'Configurações de Idioma',\n                        'title-info' => 'Define o idioma usado na interface do usuário.',\n                    ],\n                    'admin-logo' => [\n                        'logo-image' => 'Imagem do Logo',\n                        'title' => 'Logo do Admin',\n                        'title-info' => 'Configure a imagem do logo para o seu painel de administração.',\n                    ],\n                ],\n                'settings' => [\n                    'title' => 'Settings',\n                    'info' => 'Update your settings here.',\n                    'footer' => [\n                        'info' => 'We can configure the powered by section here.',\n                        'powered-by' => 'Powered by text editor',\n                        'title' => 'Powered by Section Configurations',\n                    ],\n                    'menu' => [\n                        'activities' => 'Activities',\n                        'configuration' => 'Configuration',\n                        'contacts' => 'Contacts',\n                        'dashboard' => 'Dashboard',\n                        'draft' => 'Draft',\n                        'inbox' => 'Inbox',\n                        'info' => 'We can configure the menu items name here.',\n                        'leads' => 'Leads',\n                        'mail' => 'Mail',\n                        'organizations' => 'Organizations',\n                        'outbox' => 'Outbox',\n                        'persons' => 'Persons',\n                        'products' => 'Products',\n                        'quotes' => 'Quotes',\n                        'sent' => 'Sent',\n                        'settings' => 'Settings',\n                        'title' => 'Menu Item Configurations',\n                        'trash' => 'Trash',\n                    ],\n                    'menu-color' => [\n                        'brand-color' => 'Brand Color',\n                        'info' => 'We can change the menu items colors here.',\n                        'title' => 'Menu Item Color Configurations',\n                    ],\n                ],\n            ],\n            'email' => [\n                'title' => 'Configurações de E-mail',\n                'info' => 'Configuração de e-mail para a aplicação.',\n                'imap' => [\n                    'title' => 'Configurações IMAP',\n                    'info' => 'Configuração de e-mail IMAP para receber emails.',\n                    'account' => [\n                        'title' => 'Conta IMAP',\n                        'title-info' => 'Configure as configurações da sua conta IMAP aqui.',\n                        'host' => 'Host',\n                        'port' => 'Porta',\n                        'encryption' => 'Tipo de Criptografia',\n                        'validate-cert' => 'Validar Certificado SSL',\n                        'username' => 'Nome de Usuário IMAP',\n                        'password' => 'Senha IMAP',\n                    ],\n                ],\n            ],\n            'magic-ai' => [\n                'title' => 'Magic AI',\n                'info' => 'Configuração do Magic AI para a aplicação.',\n                'settings' => [\n                    'api-key' => 'Chave API',\n                    'api-key-info' => 'Lembre-se de usar uma chave API do OpenRouter para cada modelo. É um passo simples para melhorar a segurança e o desempenho.',\n                    'enable' => 'Habilitar',\n                    'info' => 'Melhore sua experiência com o Magic AI com sua chave API do OpenRouter. Integre-a agora para uma aventura de IA personalizada e perfeita, feita sob medida para você! Personalize as configurações com facilidade e assuma o controle da sua jornada de IA.',\n                    'other' => 'Outro Modelo',\n                    'other-model' => 'Para outros modelos, use o ID do Modelo do OpenRouter.',\n                    'doc-generation' => 'Geração de DOC',\n                    'doc-generation-info' => 'Ative o recurso de geração de DOC para extrair automaticamente dados de arquivos DOC e convertê-los em formato de texto. Aumente sua produtividade e eficiência ativando este recurso para simplificar seu fluxo de trabalho.',\n                    'title' => 'Configurações Gerais',\n                    'models' => [\n                        'deepseek-r1' => 'Deepseek R1 Distill-llama-8b',\n                        'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001',\n                        'gpt-4o' => 'GPT-4.0',\n                        'gpt-4o-mini' => 'GPT-4.0 mini',\n                        'grok-2-1212' => 'Grok 2.12',\n                        'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct',\n                        'title' => 'Modelos',\n                    ],\n                ],\n            ],\n        ],\n    ],\n    'dashboard' => [\n        'index' => [\n            'title' => 'Início',\n            'start-date' => 'Start Date',\n            'end-date' => 'End Date',\n            'revenue' => [\n                'lost-revenue' => 'Negócios Perdidos',\n                'won-revenue' => 'Negócios Ganhos',\n            ],\n            'over-all' => [\n                'average-lead-value' => 'Ticket médio',\n                'total-leads' => 'Total de negócios',\n                'average-leads-per-day' => 'Média de negócios por dia',\n                'total-quotations' => 'Total de cotações',\n                'total-persons' => 'Total de pessoas',\n                'total-organizations' => 'Total de empresas',\n            ],\n            'total-leads' => [\n                'title' => 'Negócios',\n                'total' => 'Total de negócios',\n                'won' => 'Negócios ganhos',\n                'lost' => 'Negócios perdidos',\n            ],\n            'revenue-by-sources' => [\n                'title' => 'Faturamento por origens',\n                'empty-title' => 'Ainda não há dados',\n                'empty-info' => 'Nenhum dado disponível para o intervalo selecionado',\n            ],\n            'revenue-by-types' => [\n                'title' => 'Faturamento por tipos',\n                'empty-title' => 'Ainda não há dados',\n                'empty-info' => 'Nenhum dado disponível para o intervalo selecionado',\n            ],\n            'top-selling-products' => [\n                'title' => 'Produtos mais vendidos',\n                'empty-title' => 'Ainda não há dados',\n                'empty-info' => 'Nenhum produto disponível para o intervalo selecionado',\n            ],\n            'top-persons' => [\n                'title' => 'Principais pessoas',\n                'empty-title' => 'Ainda não há dados',\n                'empty-info' => 'Nenhuma pessoa disponível para o intervalo selecionado',\n            ],\n            'open-leads-by-states' => [\n                'title' => 'Negócios por estágios',\n                'empty-title' => 'Ainda não há dados',\n                'empty-info' => 'Nenhum dado disponível para o intervalo selecionado',\n            ],\n        ],\n    ],\n    'layouts' => [\n        'app-version' => 'Versão: :version',\n        'dashboard' => 'Início',\n        'leads' => 'Oportunidades',\n        'quotes' => 'Cotações',\n        'quote' => 'Cotação',\n        'mail' => [\n            'title' => 'E-mail',\n            'compose' => 'Escrever',\n            'inbox' => 'Caixa de Entrada',\n            'draft' => 'Rascunho',\n            'outbox' => 'Caixa de Saída',\n            'sent' => 'Enviado',\n            'trash' => 'Lixeira',\n            'setting' => 'Configurações',\n        ],\n        'activities' => 'Atividades',\n        'contacts' => 'Contatos',\n        'persons' => 'Pessoas',\n        'person' => 'Pessoa',\n        'organizations' => 'Empresas',\n        'organization' => 'Empresa',\n        'products' => 'Produtos',\n        'product' => 'Produto',\n        'settings' => 'Configurações',\n        'user' => 'Usuário',\n        'user-info' => 'Gerencie todos os seus usuários e suas permissões no CRM, o que eles estão autorizados a fazer.',\n        'groups' => 'Grupos',\n        'groups-info' => 'Adicionar, editar ou excluir grupos do CRM',\n        'roles' => 'Funções',\n        'role' => 'Função',\n        'roles-info' => 'Adicionar, editar ou excluir funções do CRM',\n        'users' => 'Usuários',\n        'users-info' => 'Adicionar, editar ou excluir usuários do CRM',\n        'lead' => 'Negócio',\n        'lead-info' => 'Gerencie todas as configurações relacionadas aos Negócios no CRM',\n        'pipelines' => 'Funis',\n        'pipelines-info' => 'Adicionar, editar ou excluir funis do CRM',\n        'sources' => 'Origens',\n        'sources-info' => 'Adicionar, editar ou excluir origems do CRM',\n        'types' => 'Tipos',\n        'types-info' => 'Adicionar, editar ou excluir tipos do CRM',\n        'automation' => 'Automação',\n        'automation-info' => 'Gerencie todas as configurações de automação no CRM',\n        'attributes' => 'Atributos',\n        'attribute' => 'Atributo',\n        'attributes-info' => 'Adicionar, editar ou excluir atributos do CRM',\n        'email-templates' => 'Modelos de E-mail',\n        'email' => 'E-mail',\n        'email-templates-info' => 'Adicionar, editar ou excluir modelos de e-mail do CRM',\n        'events' => 'Events',\n        'events-info' => 'Add, edit or delete events from CRM',\n        'campaigns' => 'Campaigns',\n        'campaigns-info' => 'Add, edit or delete campaigns from CRM',\n        'workflows' => 'Fluxos de Trabalho',\n        'workflows-info' => 'Adicionar, editar ou excluir fluxos de trabalho do CRM',\n        'webhooks' => 'Webhooks',\n        'webhooks-info' => 'Add, edit or delete webhooks from CRM',\n        'other-settings' => 'Outras Configurações',\n        'other-settings-info' => 'Gerencie todas as configurações extras no CRM',\n        'tags' => 'Tags',\n        'tags-info' => 'Adicionar, editar ou excluir tags do CRM',\n        'my-account' => 'Minha conta',\n        'sign-out' => 'Sair',\n        'back' => 'Voltar',\n        'name' => 'Nome',\n        'configuration' => 'Configuração',\n        'howdy' => 'Olá!',\n        'warehouses' => 'Depósitos',\n        'warehouse' => 'Depósito',\n        'warehouses-info' => 'Adicionar, editar ou excluir depósitos do CRM',\n        'inventory' => 'Estoque',\n        'inventory-info' => 'Gerenciar todas as configurações relacionadas ao estoque no CRM',\n        'data_transfer' => 'Data Transfer',\n        'data_transfer_info' => 'Manage persons, products and leads data transfer related settings in the CRM',\n    ],\n    'user' => [\n        'account' => [\n            'name' => 'Nome',\n            'email' => 'E-mail',\n            'password' => 'Senha',\n            'my_account' => 'Minha conta',\n            'update_details' => 'Atualizar Detalhes',\n            'current_password' => 'Senha atual',\n            'confirm_password' => 'Confirmar senha',\n            'password-match' => 'A senha atual não corresponde.',\n            'account-save' => 'Alterações na conta salvas com sucesso.',\n            'permission-denied' => 'Permissão Negada',\n            'remove-image' => 'Remover Imagem',\n            'upload_image_pix' => 'Carregar uma Imagem de Perfil (100px x 100px)',\n            'upload_image_format' => 'em formato PNG ou JPG',\n            'image_upload_message' => 'Somente imagens (.jpeg, .jpg, .png, ..) são permitidas.',\n        ],\n    ],\n    'emails' => [\n        'common' => [\n            'dear' => 'Prezado(a) :name',\n            'cheers' => 'Atenciosamente,</br>Equipe :app_name',\n            'user' => [\n                'dear' => 'Prezado(a) :username',\n                'create-subject' => 'Você foi adicionado como membro.',\n                'create-body' => 'Parabéns! Agora você é um membro da nossa equipe.',\n                'forget-password' => [\n                    'subject' => 'Redefinir Senha do Cliente',\n                    'dear' => 'Prezado(a) :username',\n                    'reset-password' => 'Redefinir Senha',\n                    'info' => 'Você está recebendo este e-mail porque recebemos uma solicitação de redefinição de senha para sua conta.',\n                    'final-summary' => 'Se você não solicitou a redefinição de senha, nenhuma outra ação é necessária.',\n                    'thanks' => 'Obrigado!',\n                ],\n            ],\n        ],\n    ],\n    'validations' => [\n        'message' => [\n            'decimal' => 'The :attribute must be a decimal.',\n        ],\n    ],\n    'errors' => [\n        'dashboard' => 'Dashboard',\n        'go-back' => 'Go Back',\n        'support' => 'If the problem persists, reach out to us at <a href=\":link\" class=\":class\">:email</a> for assistance.',\n        '404' => [\n            'description' => 'Oops! The page you\\'re looking for is on vacation. It seems we couldn\\'t find what you were searching for.',\n            'title' => '404 Page Not Found',\n        ],\n        '401' => [\n            'description' => 'Ops! Parece que você não tem permissão para acessar esta página. Parece que estão faltando as credenciais necessárias.',\n            'title' => '401 Não autorizado.',\n        ],\n        '403' => [\n            'description' => 'Oops! This page is off-limits. It appears you don\\'t have the required permissions to view this content.',\n            'title' => '403 Forbidden',\n        ],\n        '500' => [\n            'description' => 'Oops! Something went wrong. It seems we\\'re having trouble loading the page you\\'re looking for.',\n            'title' => '500 Internal Server Error',\n        ],\n        '503' => [\n            'description' => 'Oops! Looks like we\\'re temporarily down for maintenance. Please check back in a bit.',\n            'title' => '503 Service Unavailable',\n        ],\n    ],\n    'export' => [\n        'csv' => 'CSV',\n        'download' => 'Download',\n        'export' => 'Exportar',\n        'no-records' => 'Nenhum registro encontrado.',\n        'xls' => 'XLS',\n        'xlsx' => 'XLSX',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/lang/tr/app.php",
    "content": "<?php\n\nreturn [\n    'acl' => [\n        'leads' => 'Potansiyeller',\n        'lead' => 'Potansiyel',\n        'quotes' => 'Teklifler',\n        'mail' => 'Posta',\n        'inbox' => 'Gelen Kutusu',\n        'draft' => 'Taslak',\n        'outbox' => 'Gönderilenler',\n        'sent' => 'Gönderildi',\n        'trash' => 'Çöp Kutusu',\n        'activities' => 'Etkinlikler',\n        'webhook' => 'Web Kancası',\n        'contacts' => 'Kişiler',\n        'persons' => 'Kişiler',\n        'organizations' => 'Organizasyonlar',\n        'products' => 'Ürünler',\n        'settings' => 'Ayarlar',\n        'groups' => 'Gruplar',\n        'roles' => 'Roller',\n        'users' => 'Kullanıcılar',\n        'user' => 'Kullanıcı',\n        'automation' => 'Otomasyon',\n        'attributes' => 'Öznitelikler',\n        'pipelines' => 'Pipelines',\n        'sources' => 'Kaynaklar',\n        'types' => 'Türler',\n        'email-templates' => 'E-posta Şablonları',\n        'workflows' => 'İş Akışları',\n        'other-settings' => 'Diğer Ayarlar',\n        'tags' => 'Etiketler',\n        'configuration' => 'Yapılandırma',\n        'create' => 'Oluştur',\n        'edit' => 'Düzenle',\n        'view' => 'Görüntüle',\n        'print' => 'Yazdır',\n        'delete' => 'Sil',\n        'export' => 'Dışa Aktar',\n        'mass-delete' => 'Toplu Sil',\n        'data-transfer' => 'Veri Transferi',\n        'imports' => 'İthalatlar',\n        'import' => 'İthalat',\n        'event' => 'Etkinlik',\n        'campaigns' => 'Kampanyalar',\n        'warehouses' => 'Depolar',\n        'inventory' => 'Envanter',\n    ],\n    'users' => [\n        'activate-warning' => 'Hesabınız henüz etkinleştirilmedi. Lütfen yönetici ile iletişime geçin.',\n        'login-error' => 'Kimlik bilgileri kayıtlarımızla eşleşmiyor.',\n        'not-permission' => 'Yönetici paneline erişim izniniz yok.',\n        'login' => [\n            'email' => 'E-posta Adresi',\n            'forget-password-link' => 'Şifremi Unuttum?',\n            'password' => 'Şifre',\n            'submit-btn' => 'Giriş Yap',\n            'title' => 'Giriş Yap',\n        ],\n        'forget-password' => [\n            'create' => [\n                'email' => 'Kayıtlı E-posta',\n                'email-not-exist' => 'E-posta Mevcut Değil',\n                'page-title' => 'Şifremi Unuttum',\n                'reset-link-sent' => 'Şifre sıfırlama bağlantısı gönderildi',\n                'sign-in-link' => 'Giriş Yapmaya Dön?',\n                'submit-btn' => 'Sıfırla',\n                'title' => 'Şifre Kurtarma',\n            ],\n        ],\n        'reset-password' => [\n            'back-link-title' => 'Giriş Yapmaya Dön?',\n            'confirm-password' => 'Şifreyi Onayla',\n            'email' => 'Kayıtlı E-posta',\n            'password' => 'Şifre',\n            'submit-btn' => 'Şifreyi Sıfırla',\n            'title' => 'Şifre Sıfırlama',\n        ],\n    ],\n    'account' => [\n        'edit' => [\n            'back-btn' => 'Geri',\n            'change-password' => 'Şifreyi Değiştir',\n            'confirm-password' => 'Şifreyi Onayla',\n            'current-password' => 'Mevcut Şifre',\n            'email' => 'E-posta',\n            'general' => 'Genel',\n            'invalid-password' => 'Girdiğiniz mevcut şifre yanlış.',\n            'name' => 'Ad',\n            'password' => 'Şifre',\n            'profile-image' => 'Profil Resmi',\n            'save-btn' => 'Hesabı Kaydet',\n            'title' => 'Hesabım',\n            'update-success' => 'Hesap başarıyla güncellendi',\n            'upload-image-info' => 'Profil Resmi Yükleyin (110px X 110px) PNG veya JPG Formatında',\n        ],\n    ],\n    'components' => [\n        'activities' => [\n            'actions' => [\n                'mail' => [\n                    'btn' => 'Mail',\n                    'title' => 'Compose Mail',\n                    'to' => 'To',\n                    'enter-emails' => 'Press enter to add emails',\n                    'cc' => 'CC',\n                    'bcc' => 'BCC',\n                    'subject' => 'Subject',\n                    'send-btn' => 'Send',\n                    'message' => 'Message',\n                ],\n                'file' => [\n                    'btn' => 'File',\n                    'title' => 'Add File',\n                    'title-control' => 'Title',\n                    'name' => 'Name',\n                    'description' => 'Description',\n                    'file' => 'File',\n                    'save-btn' => 'Save File',\n                ],\n                'note' => [\n                    'btn' => 'Note',\n                    'title' => 'Add Note',\n                    'comment' => 'Comment',\n                    'save-btn' => 'Save Note',\n                ],\n                'activity' => [\n                    'btn' => 'Activity',\n                    'title' => 'Add Activity',\n                    'title-control' => 'Title',\n                    'description' => 'Description',\n                    'schedule-from' => 'Schedule From',\n                    'schedule-to' => 'Schedule To',\n                    'location' => 'Location',\n                    'call' => 'Call',\n                    'meeting' => 'Meeting',\n                    'lunch' => 'Lunch',\n                    'save-btn' => 'Save Activity',\n                    'participants' => [\n                        'title' => 'Participants',\n                        'placeholder' => 'Type to search participants',\n                        'users' => 'Users',\n                        'persons' => 'Persons',\n                        'no-results' => 'No result found...',\n                    ],\n                ],\n            ],\n            'index' => [\n                'all' => 'All',\n                'bcc' => 'Bcc',\n                'by-user' => 'By :user',\n                'calls' => 'Calls',\n                'cc' => 'Cc',\n                'change-log' => 'Changelogs',\n                'delete' => 'Delete',\n                'edit' => 'Edit',\n                'emails' => 'Emails',\n                'empty' => 'Empty',\n                'files' => 'Files',\n                'from' => 'From',\n                'location' => 'Location',\n                'lunches' => 'Lunches',\n                'mark-as-done' => 'Mark as Done',\n                'meetings' => 'Meetings',\n                'notes' => 'Notes',\n                'participants' => 'Participants',\n                'planned' => 'Planned',\n                'quotes' => 'Quotes',\n                'scheduled-on' => 'Scheduled on',\n                'system' => 'System',\n                'to' => 'To',\n                'unlink' => 'Unlink',\n                'view' => 'View',\n                'empty-placeholders' => [\n                    'all' => [\n                        'title' => 'No Activities Found',\n                        'description' => 'No activities found for this. You can add activities by clicking on the Activity button on the left panel.',\n                    ],\n                    'planned' => [\n                        'title' => 'No Planned Activities Found',\n                        'description' => 'No planned activities found for this. You can add planned activities by clicking on the Activity button on the left panel.',\n                    ],\n                    'notes' => [\n                        'title' => 'No Notes Found',\n                        'description' => 'No notes found for this. You can add notes by clicking on the Note button on the left panel.',\n                    ],\n                    'calls' => [\n                        'title' => 'No Calls Found',\n                        'description' => 'No calls found for this. You can add calls by clicking on the Activity button on the left panel and selecting the Call type.',\n                    ],\n                    'meetings' => [\n                        'title' => 'No Meetings Found',\n                        'description' => 'No meetings found for this. You can add meetings by clicking on the Activity button on the left panel and selecting the Meeting type.',\n                    ],\n                    'lunches' => [\n                        'title' => 'No Lunches Found',\n                        'description' => 'No lunches found for this. You can add lunches by clicking on the Activity button on the left panel and selecting the Lunch type.',\n                    ],\n                    'files' => [\n                        'title' => 'No Files Found',\n                        'description' => 'No files found for this. You can add files by clicking on the File button on the left panel.',\n                    ],\n                    'emails' => [\n                        'title' => 'No Emails Found',\n                        'description' => 'No emails found for this. You can add emails by clicking on the Mail button on the left panel.',\n                    ],\n                    'system' => [\n                        'title' => 'No Changelogs Found',\n                        'description' => 'No changelogs found for this.',\n                    ],\n                ],\n            ],\n        ],\n        'media' => [\n            'images' => [\n                'add-image-btn' => 'Resim Ekle',\n                'ai-add-image-btn' => 'Sihirli AI',\n                'allowed-types' => 'png, jpeg, jpg',\n                'not-allowed-error' => 'Sadece resim dosyalarına (.jpeg, .jpg, .png, vb.) izin verilmektedir.',\n                'placeholders' => [\n                    'front' => 'Ön',\n                    'next' => 'Sonraki',\n                    'size' => 'Boyut',\n                    'use-cases' => 'Kullanım Alanları',\n                    'zoom' => 'Yakınlaştır',\n                ],\n            ],\n            'videos' => [\n                'add-video-btn' => 'Video Ekle',\n                'allowed-types' => 'mp4, webm, mkv',\n                'not-allowed-error' => 'Sadece video dosyalarına (.mp4, .mov, .ogg vb.) izin verilmektedir.',\n            ],\n        ],\n        'datagrid' => [\n            'index' => [\n                'no-records-selected' => 'Hiçbir kayıt seçilmedi.',\n                'must-select-a-mass-action-option' => 'Bir toplu işlem seçeneği seçmelisiniz.',\n                'must-select-a-mass-action' => 'Bir toplu işlem seçmelisiniz.',\n            ],\n            'toolbar' => [\n                'length-of' => ':length kadar',\n                'of' => 'üzerinden',\n                'per-page' => 'Sayfa Başına',\n                'results' => ':total Sonuç',\n                'delete' => 'Sil',\n                'selected' => ':total Seçilen Öğeler',\n                'mass-actions' => [\n                    'submit' => 'Gönder',\n                    'select-option' => 'Seçim Yap',\n                    'select-action' => 'Eylem Seç',\n                ],\n                'filter' => [\n                    'apply-filters-btn' => 'Filtreleri Uygula',\n                    'back-btn' => 'Geri',\n                    'create-new-filter' => 'Yeni Filtre Oluştur',\n                    'custom-filters' => 'Özel Filtreler',\n                    'delete-error' => 'Filtre silinirken bir hata oluştu, lütfen tekrar deneyin.',\n                    'delete-success' => 'Filtre başarıyla silindi.',\n                    'empty-description' => 'Kaydedilecek seçili filtre bulunmamaktadır. Lütfen kaydetmek için filtreler seçin.',\n                    'empty-title' => 'Kaydetmek İçin Filtreler Ekleyin',\n                    'name' => 'Ad',\n                    'quick-filters' => 'Hızlı Filtreler',\n                    'save-btn' => 'Kaydet',\n                    'save-filter' => 'Filtreyi Kaydet',\n                    'saved-success' => 'Filtre başarıyla kaydedildi.',\n                    'selected-filters' => 'Seçilen Filtreler',\n                    'title' => 'Filtre',\n                    'update' => 'Güncelle',\n                    'update-filter' => 'Filtreyi Güncelle',\n                    'updated-success' => 'Filtre başarıyla güncellendi.',\n                ],\n                'search' => [\n                    'title' => 'Ara',\n                ],\n            ],\n            'filters' => [\n                'select' => 'Seç',\n                'title' => 'Filtreler',\n                'dropdown' => [\n                    'searchable' => [\n                        'at-least-two-chars' => 'En az 2 karakter yazın...',\n                        'no-results' => 'Sonuç bulunamadı...',\n                    ],\n                ],\n                'custom-filters' => [\n                    'clear-all' => 'Hepsini Temizle',\n                    'title' => 'Özel Filtreler',\n                ],\n                'boolean-options' => [\n                    'false' => 'Yanlış',\n                    'true' => 'Doğru',\n                ],\n                'date-options' => [\n                    'last-month' => 'Geçen Ay',\n                    'last-six-months' => 'Son 6 Ay',\n                    'last-three-months' => 'Son 3 Ay',\n                    'this-month' => 'Bu Ay',\n                    'this-week' => 'Bu Hafta',\n                    'this-year' => 'Bu Yıl',\n                    'today' => 'Bugün',\n                    'yesterday' => 'Dün',\n                ],\n            ],\n            'table' => [\n                'actions' => 'Eylemler',\n                'no-records-available' => 'Kayıt Bulunmuyor.',\n            ],\n        ],\n        'modal' => [\n            'confirm' => [\n                'agree-btn' => 'Kabul Et',\n                'disagree-btn' => 'Reddet',\n                'message' => 'Bu işlemi gerçekleştirmek istediğinizden emin misiniz?',\n                'title' => 'Emin Misiniz?',\n            ],\n        ],\n        'tags' => [\n            'index' => [\n                'title' => 'Etiketler',\n                'added-tags' => 'Eklenen Etiketler',\n                'save-btn' => 'Etiketi Kaydet',\n                'placeholder' => 'Etiketleri aramak için yazın',\n                'add-tag' => '\\\\\" :term \\\\\" Ekle...',\n                'aquarelle-red' => 'Aquarelle Kırmızı',\n                'crushed-cashew' => 'Ezilmiş Antep Fıstığı',\n                'beeswax' => 'Abeş Mum',\n                'lemon-chiffon' => 'Limon Şifon',\n                'snow-flurry' => 'Kar Fırtınası',\n                'honeydew' => 'Honeydew',\n            ],\n        ],\n        'layouts' => [\n            'powered-by' => [\n                'description' => ':webkul tarafından geliştirilen açık kaynaklı bir proje olan :krayin tarafından desteklenmektedir.',\n            ],\n            'header' => [\n                'mega-search' => [\n                    'title' => 'Mega Arama',\n                    'tabs' => [\n                        'leads' => 'Müşteriler',\n                        'quotes' => 'Teklifler',\n                        'persons' => 'Kişiler',\n                        'products' => 'Ürünler',\n                    ],\n                    'explore-all-products' => 'Tüm Ürünleri Keşfet',\n                    'explore-all-leads' => 'Tüm Müşterileri Keşfet',\n                    'explore-all-contacts' => 'Tüm İletişimleri Keşfet',\n                    'explore-all-quotes' => 'Tüm Teklifleri Keşfet',\n                    'explore-all-matching-products' => '\":query\" (:count) ile eşleşen tüm ürünleri keşfet',\n                    'explore-all-matching-leads' => '\":query\" (:count) ile eşleşen tüm müşterileri keşfet',\n                    'explore-all-matching-contacts' => '\":query\" (:count) ile eşleşen tüm iletişimleri keşfet',\n                    'explore-all-matching-quotes' => '\":query\" (:count) ile eşleşen tüm teklifleri keşfet',\n                ],\n            ],\n        ],\n        'attributes' => [\n            'edit' => [\n                'delete' => 'Sil',\n            ],\n            'lookup' => [\n                'click-to-add' => 'Eklemek için tıklayın',\n                'search' => 'Arama...',\n                'no-result-found' => 'Sonuç bulunamadı',\n            ],\n        ],\n        'lookup' => [\n            'click-to-add' => 'Eklemek için Tıklayın',\n            'no-results' => 'Sonuç Bulunamadı',\n            'add-as-new' => 'Yeni Olarak Ekle',\n            'search' => 'Arama...',\n        ],\n        'flash-group' => [\n            'success' => 'Başarı',\n            'error' => 'Hata',\n            'warning' => 'Uyarı',\n            'info' => 'Bilgi',\n        ],\n        'tiny-mce' => [\n            'http-error' => 'HTTP Hatası',\n            'invalid-json' => 'Sunucudan geçersiz JSON yanıtı.',\n            'upload-failed' => 'Dosya yüklemesi başarısız oldu. Lütfen tekrar deneyin.',\n        ],\n    ],\n    'quotes' => [\n        'index' => [\n            'title' => 'Teklifler',\n            'create-btn' => 'Teklif Oluştur',\n            'create-success' => 'Teklif başarıyla oluşturuldu.',\n            'update-success' => 'Teklif başarıyla güncellendi.',\n            'delete-success' => 'Teklif başarıyla silindi.',\n            'delete-failed' => 'Teklif silinemedi.',\n            'datagrid' => [\n                'subject' => 'Konu',\n                'sales-person' => 'Satış Temsilcisi',\n                'expired-at' => 'Son Kullanma Tarihi',\n                'created-at' => 'Oluşturulma Tarihi',\n                'person' => 'Kişi',\n                'subtotal' => 'Ara Toplam',\n                'discount' => 'İndirim',\n                'tax' => 'Vergi',\n                'adjustment' => 'Düzenleme',\n                'grand-total' => 'Genel Toplam',\n                'edit' => 'Düzenle',\n                'delete' => 'Sil',\n                'print' => 'Yazdır',\n            ],\n            'pdf' => [\n                'adjustment' => 'Düzenleme',\n                'amount' => 'Tutar',\n                'billing-address' => 'Fatura Adresi',\n                'date' => 'Tarih',\n                'discount' => 'İndirim',\n                'expired-at' => 'Son Kullanma Tarihi',\n                'grand-total' => 'Genel Toplam',\n                'person' => 'Kişi',\n                'price' => 'Fiyat',\n                'product-name' => 'Ürün Adı',\n                'quantity' => 'Miktar',\n                'quote-id' => 'Teklif ID',\n                'sales-person' => 'Satış Temsilcisi',\n                'shipping-address' => 'Teslimat Adresi',\n                'sku' => 'SKU',\n                'sub-total' => 'Ara Toplam',\n                'subject' => 'Konu',\n                'tax' => 'Vergi',\n                'title' => 'Teklif',\n            ],\n        ],\n        'create' => [\n            'title' => 'Teklif Oluştur',\n            'save-btn' => 'Teklifi Kaydet',\n            'quote-info' => 'Teklif Bilgileri',\n            'quote-info-info' => 'Teklifin temel bilgilerini girin.',\n            'address-info' => 'Adres Bilgileri',\n            'address-info-info' => 'Teklif ile ilgili adres bilgileri.',\n            'quote-items' => 'Teklif Kalemleri',\n            'search-products' => 'Ürünleri Ara',\n            'link-to-lead' => 'Potansiyele Bağla',\n            'quote-item-info' => 'Bu teklif için ürün talebi ekleyin.',\n            'quote-name' => 'Teklif Adı',\n            'quantity' => 'Miktar',\n            'price' => 'Fiyat',\n            'discount' => 'İndirim',\n            'tax' => 'Vergi',\n            'total' => 'Toplam',\n            'amount' => 'Tutar',\n            'add-item' => '+ Kalem Ekle',\n            'sub-total' => 'Ara Toplam (:symbol)',\n            'total-discount' => 'İndirim (:symbol)',\n            'total-tax' => 'Vergi (:symbol)',\n            'total-adjustment' => 'Düzenleme (:symbol)',\n            'grand-total' => 'Genel Toplam (:symbol)',\n            'discount-amount' => 'İndirim Tutarı',\n            'tax-amount' => 'Vergi Tutarı',\n            'adjustment-amount' => 'Düzenleme Tutarı',\n            'product-name' => 'Ürün Adı',\n            'action' => 'Eylem',\n        ],\n        'edit' => [\n            'title' => 'Teklifi Düzenle',\n            'save-btn' => 'Teklifi Kaydet',\n            'quote-info' => 'Teklif Bilgileri',\n            'quote-info-info' => 'Teklifin temel bilgilerini girin.',\n            'address-info' => 'Adres Bilgileri',\n            'address-info-info' => 'Teklif ile ilgili adres bilgileri.',\n            'quote-items' => 'Teklif Kalemleri',\n            'link-to-lead' => 'Potansiyele Bağla',\n            'quote-item-info' => 'Bu teklif için ürün talebi ekleyin.',\n            'quote-name' => 'Teklif Adı',\n            'quantity' => 'Miktar',\n            'price' => 'Fiyat',\n            'search-products' => 'Ürünleri Ara',\n            'discount' => 'İndirim',\n            'tax' => 'Vergi',\n            'total' => 'Toplam',\n            'amount' => 'Tutar',\n            'add-item' => '+ Kalem Ekle',\n            'sub-total' => 'Ara Toplam (:symbol)',\n            'total-discount' => 'İndirim (:symbol)',\n            'total-tax' => 'Vergi (:symbol)',\n            'total-adjustment' => 'Düzenleme (:symbol)',\n            'grand-total' => 'Genel Toplam (:symbol)',\n            'discount-amount' => 'İndirim Tutarı',\n            'tax-amount' => 'Vergi Tutarı',\n            'adjustment-amount' => 'Düzenleme Tutarı',\n            'product-name' => 'Ürün Adı',\n            'action' => 'Eylem',\n        ],\n    ],\n    'contacts' => [\n        'persons' => [\n            'index' => [\n                'title' => 'Kişiler',\n                'create-btn' => 'Kişi Oluştur',\n                'create-success' => 'Kişi başarıyla oluşturuldu.',\n                'update-success' => 'Kişi başarıyla güncellendi.',\n                'all-delete-success' => 'Seçilen tüm kişiler başarıyla silindi.',\n                'partial-delete-warning' => 'Bazı kişiler başarıyla silindi. Diğerleri potansiyel müşterilerle bağlantılı olduğu için silinemedi.',\n                'none-delete-warning' => 'Seçilen kişilerin hiçbiri potansiyel müşterilerle bağlantılı olduğu için silinemedi.',\n                'no-selection' => 'Silinecek kişi seçilmedi.',\n                'delete-failed' => 'Seçilen kişiler silinemedi.',\n                'datagrid' => [\n                    'contact-numbers' => 'İletişim Numaraları',\n                    'delete' => 'Sil',\n                    'edit' => 'Düzenle',\n                    'emails' => 'E-postalar',\n                    'id' => 'ID',\n                    'view' => 'Görüntüle',\n                    'name' => 'Ad',\n                    'organization-name' => 'Kuruluş Adı',\n                ],\n            ],\n            'view' => [\n                'title' => ':name',\n                'about-person' => 'Kişi Hakkında',\n                'about-organization' => 'Kuruluş Hakkında',\n                'activities' => [\n                    'index' => [\n                        'all' => 'Hepsi',\n                        'calls' => 'Aramalar',\n                        'meetings' => 'Toplantılar',\n                        'lunches' => 'Öğle Yemekleri',\n                        'files' => 'Dosyalar',\n                        'quotes' => 'Teklifler',\n                        'notes' => 'Notlar',\n                        'emails' => 'E-postalar',\n                        'by-user' => ':user tarafından',\n                        'scheduled-on' => 'Planlandığı Tarih',\n                        'location' => 'Konum',\n                        'participants' => 'Katılımcılar',\n                        'mark-as-done' => 'Tamamlandı olarak işaretle',\n                        'delete' => 'Sil',\n                        'edit' => 'Düzenle',\n                    ],\n                    'actions' => [\n                        'mail' => [\n                            'btn' => 'E-posta',\n                            'title' => 'E-posta Oluştur',\n                            'to' => 'Kime',\n                            'cc' => 'CC',\n                            'bcc' => 'BCC',\n                            'subject' => 'Konu',\n                            'send-btn' => 'Gönder',\n                            'message' => 'Mesaj',\n                        ],\n                        'file' => [\n                            'btn' => 'Dosya',\n                            'title' => 'Dosya Ekle',\n                            'title-control' => 'Başlık',\n                            'name' => 'Dosya Adı',\n                            'description' => 'Açıklama',\n                            'file' => 'Dosya',\n                            'save-btn' => 'Dosyayı Kaydet',\n                        ],\n                        'note' => [\n                            'btn' => 'Not',\n                            'title' => 'Not Ekle',\n                            'comment' => 'Yorum',\n                            'save-btn' => 'Notu Kaydet',\n                        ],\n                        'activity' => [\n                            'btn' => 'Etkinlik',\n                            'title' => 'Etkinlik Ekle',\n                            'title-control' => 'Başlık',\n                            'description' => 'Açıklama',\n                            'schedule-from' => 'Başlangıç Tarihi',\n                            'schedule-to' => 'Bitiş Tarihi',\n                            'location' => 'Konum',\n                            'call' => 'Çağrı',\n                            'meeting' => 'Toplantı',\n                            'lunch' => 'Öğle Yemeği',\n                            'save-btn' => 'Etkinliği Kaydet',\n                        ],\n                    ],\n                ],\n                'tags' => [\n                    'create-success' => 'Etiket başarıyla oluşturuldu.',\n                    'destroy-success' => 'Etiket başarıyla silindi.',\n                ],\n            ],\n            'create' => [\n                'title' => 'Kişi Oluştur',\n                'save-btn' => 'Kişiyi Kaydet',\n            ],\n            'edit' => [\n                'title' => 'Kişiyi Düzenle',\n                'save-btn' => 'Kişiyi Kaydet',\n            ],\n        ],\n        'organizations' => [\n            'index' => [\n                'title' => 'Kuruluşlar',\n                'create-btn' => 'Kuruluş Oluştur',\n                'create-success' => 'Kuruluş başarıyla oluşturuldu.',\n                'update-success' => 'Kuruluş başarıyla güncellendi.',\n                'delete-success' => 'Kuruluş başarıyla silindi.',\n                'delete-failed' => 'Kuruluş silinemedi.',\n                'datagrid' => [\n                    'delete' => 'Sil',\n                    'edit' => 'Düzenle',\n                    'id' => 'ID',\n                    'name' => 'Ad',\n                    'persons-count' => 'Kişi Sayısı',\n                ],\n            ],\n            'create' => [\n                'title' => 'Kuruluş Oluştur',\n                'save-btn' => 'Kuruluşu Kaydet',\n            ],\n            'edit' => [\n                'title' => 'Kuruluşu Düzenle',\n                'save-btn' => 'Kuruluşu Kaydet',\n            ],\n        ],\n    ],\n    'products' => [\n        'index' => [\n            'title' => 'Ürünler',\n            'create-btn' => 'Ürün Oluştur',\n            'create-success' => 'Ürün başarıyla oluşturuldu.',\n            'update-success' => 'Ürün başarıyla güncellendi.',\n            'delete-success' => 'Ürün başarıyla silindi.',\n            'delete-failed' => 'Ürün silinemedi.',\n            'datagrid' => [\n                'allocated' => 'Tahsis Edilen',\n                'delete' => 'Sil',\n                'edit' => 'Düzenle',\n                'id' => 'ID',\n                'in-stock' => 'Stokta',\n                'name' => 'Ad',\n                'on-hand' => 'Elinde',\n                'tag-name' => 'Etiket Adı',\n                'price' => 'Fiyat',\n                'sku' => 'SKU',\n                'view' => 'Görüntüle',\n            ],\n        ],\n        'create' => [\n            'save-btn' => 'Ürünleri Kaydet',\n            'title' => 'Ürün Oluştur',\n            'general' => 'Genel',\n            'price' => 'Fiyat',\n        ],\n        'edit' => [\n            'title' => 'Ürünleri Düzenle',\n            'save-btn' => 'Ürünleri Kaydet',\n            'general' => 'Genel',\n            'price' => 'Fiyat',\n        ],\n        'view' => [\n            'sku' => 'SKU',\n            'all' => 'Hepsi',\n            'notes' => 'Notlar',\n            'files' => 'Dosyalar',\n            'inventories' => 'Envanter',\n            'change-logs' => 'Değişiklik Günlükleri',\n            'attributes' => [\n                'about-product' => 'Ürün Hakkında',\n            ],\n            'inventory' => [\n                'source' => 'Kaynak',\n                'in-stock' => 'Stokta',\n                'allocated' => 'Tahsis Edilen',\n                'on-hand' => 'Elinde',\n                'actions' => 'İşlemler',\n                'assign' => 'Ata',\n                'add-source' => 'Kaynak Ekle',\n                'location' => 'Konum',\n                'add-more' => 'Daha Fazla Ekle',\n                'save' => 'Kaydet',\n            ],\n        ],\n    ],\n    'settings' => [\n        'title' => 'Ayarlar',\n        'groups' => [\n            'index' => [\n                'create-btn' => 'Grup Oluştur',\n                'title' => 'Gruplar',\n                'create-success' => 'Grup başarıyla oluşturuldu.',\n                'update-success' => 'Grup başarıyla güncellendi.',\n                'destroy-success' => 'Grup başarıyla silindi.',\n                'delete-failed' => 'Grup silinemedi.',\n                'delete-failed-associated-users' => 'Grup silinemiyor, çünkü kullanıcılar tarafından kullanılıyor.',\n                'datagrid' => [\n                    'delete' => 'Sil',\n                    'description' => 'Açıklama',\n                    'edit' => 'Düzenle',\n                    'id' => 'ID',\n                    'name' => 'Ad',\n                ],\n                'edit' => [\n                    'title' => 'Grubu Düzenle',\n                ],\n                'create' => [\n                    'name' => 'Ad',\n                    'title' => 'Grup Oluştur',\n                    'description' => 'Açıklama',\n                    'save-btn' => 'Grubu Kaydet',\n                ],\n            ],\n        ],\n        'roles' => [\n            'index' => [\n                'being-used' => 'Rol silinemedi, çünkü bu admin kullanıcısında kullanılıyor.',\n                'create-btn' => 'Rol Oluştur',\n                'create-success' => 'Rol başarıyla oluşturuldu.',\n                'current-role-delete-error' => 'Mevcut kullanıcıya atanmış rol silinemedi.',\n                'delete-failed' => 'Rol silinemedi.',\n                'delete-success' => 'Rol başarıyla silindi.',\n                'last-delete-error' => 'En az bir rol gereklidir.',\n                'settings' => 'Ayarlar',\n                'title' => 'Roller',\n                'update-success' => 'Rol başarıyla güncellendi.',\n                'user-define-error' => 'Sistem rolü silinemedi.',\n                'datagrid' => [\n                    'all' => 'Hepsi',\n                    'custom' => 'Özel',\n                    'delete' => 'Sil',\n                    'description' => 'Açıklama',\n                    'edit' => 'Düzenle',\n                    'id' => 'ID',\n                    'name' => 'Ad',\n                    'permission-type' => 'İzin Türü',\n                ],\n            ],\n            'create' => [\n                'access-control' => 'Erişim Kontrolü',\n                'all' => 'Hepsi',\n                'back-btn' => 'Geri',\n                'custom' => 'Özel',\n                'description' => 'Açıklama',\n                'general' => 'Genel',\n                'name' => 'Ad',\n                'permissions' => 'İzinler',\n                'save-btn' => 'Rolü Kaydet',\n                'title' => 'Rol Oluştur',\n            ],\n            'edit' => [\n                'access-control' => 'Erişim Kontrolü',\n                'all' => 'Hepsi',\n                'back-btn' => 'Geri',\n                'custom' => 'Özel',\n                'description' => 'Açıklama',\n                'general' => 'Genel',\n                'name' => 'Ad',\n                'permissions' => 'İzinler',\n                'save-btn' => 'Rolü Kaydet',\n                'title' => 'Rol Düzenle',\n            ],\n        ],\n        'types' => [\n            'index' => [\n                'create-btn' => 'Tür Oluştur',\n                'create-success' => 'Tür başarıyla oluşturuldu.',\n                'delete-failed' => 'Tür silinemedi.',\n                'delete-success' => 'Tür başarıyla silindi.',\n                'title' => 'Türler',\n                'update-success' => 'Tür başarıyla güncellendi.',\n                'datagrid' => [\n                    'delete' => 'Sil',\n                    'description' => 'Açıklama',\n                    'edit' => 'Düzenle',\n                    'id' => 'ID',\n                    'name' => 'Ad',\n                ],\n                'create' => [\n                    'name' => 'Ad',\n                    'save-btn' => 'Türü Kaydet',\n                    'title' => 'Tür Oluştur',\n                ],\n                'edit' => [\n                    'title' => 'Tür Düzenle',\n                ],\n            ],\n        ],\n        'sources' => [\n            'index' => [\n                'title' => 'Kaynaklar',\n                'create-btn' => 'Kaynak Oluştur',\n                'create-success' => 'Kaynak başarıyla oluşturuldu.',\n                'delete-failed' => 'Kaynak silinemedi.',\n                'delete-success' => 'Kaynak başarıyla silindi.',\n                'update-success' => 'Kaynak başarıyla güncellendi.',\n                'delete-failed-associated-leads' => 'Kaynak silinemiyor çünkü mevcut adaylarla ilişkili. Lütfen bu adayları silmeden önce bağlantılarını kaldırın veya güncelleyin.',\n                'datagrid' => [\n                    'delete' => 'Sil',\n                    'edit' => 'Düzenle',\n                    'id' => 'ID',\n                    'name' => 'Ad',\n                ],\n                'create' => [\n                    'name' => 'Ad',\n                    'save-btn' => 'Kaynağı Kaydet',\n                    'title' => 'Kaynak Oluştur',\n                ],\n                'edit' => [\n                    'title' => 'Kaynağı Düzenle',\n                ],\n            ],\n        ],\n        'workflows' => [\n            'index' => [\n                'title' => 'İş Akışları',\n                'create-btn' => 'İş Akışı Oluştur',\n                'create-success' => 'İş akışı başarıyla oluşturuldu.',\n                'update-success' => 'İş akışı başarıyla güncellendi.',\n                'delete-success' => 'İş akışı başarıyla silindi.',\n                'delete-failed' => 'İş akışı silinemedi.',\n                'datagrid' => [\n                    'delete' => 'Sil',\n                    'description' => 'Açıklama',\n                    'edit' => 'Düzenle',\n                    'id' => 'ID',\n                    'name' => 'Ad',\n                ],\n            ],\n            'helpers' => [\n                'update-related-leads' => 'İlgili fırsatları güncelle',\n                'send-email-to-sales-owner' => 'Satış sahibiyle e-posta gönder',\n                'send-email-to-participants' => 'Katılımcılara e-posta gönder',\n                'add-webhook' => 'Webhook Ekle',\n                'update-lead' => 'Fırsatı Güncelle',\n                'update-person' => 'Kişiyi Güncelle',\n                'send-email-to-person' => 'Kişiye e-posta gönder',\n                'add-tag' => 'Etiket Ekle',\n                'add-note-as-activity' => 'Notu Aktivite Olarak Ekle',\n                'update-quote' => 'Teklifi Güncelle',\n            ],\n            'create' => [\n                'title' => 'İş Akışı Oluştur',\n                'event' => 'Olay',\n                'back-btn' => 'Geri',\n                'save-btn' => 'İş Akışını Kaydet',\n                'name' => 'Ad',\n                'basic-details' => 'Temel Bilgiler',\n                'description' => 'Açıklama',\n                'actions' => 'Eylemler',\n                'basic-details-info' => 'İş akışının temel bilgilerini girin.',\n                'event-info' => 'Bir olay tetikler, kontrolleri yapar, koşulları değerlendirir ve önceden tanımlanmış eylemleri gerçekleştirir.',\n                'conditions' => 'Koşullar',\n                'conditions-info' => 'Koşullar, belirli durumlarda tetiklenen kurallardır.',\n                'actions-info' => 'Bir eylem sadece iş yükünü azaltmakla kalmaz, aynı zamanda CRM otomasyonu için oldukça kolaylaştırır.',\n                'value' => 'Değer',\n                'condition-type' => 'Koşul Türü',\n                'all-condition-are-true' => 'Tüm koşullar doğru',\n                'any-condition-are-true' => 'Herhangi bir koşul doğru',\n                'add-condition' => 'Koşul Ekle',\n                'add-action' => 'Eylem Ekle',\n                'yes' => 'Evet',\n                'no' => 'Hayır',\n                'email' => 'E-posta',\n                'is-equal-to' => 'Eşittir',\n                'is-not-equal-to' => 'Eşit değildir',\n                'equals-or-greater-than' => 'Eşittir veya büyük',\n                'equals-or-less-than' => 'Eşittir veya küçük',\n                'greater-than' => 'Büyük',\n                'less-than' => 'Küçük',\n                'type' => 'Tür',\n                'contain' => 'İçerir',\n                'contains' => 'İçerir',\n                'does-not-contain' => 'İçermez',\n            ],\n            'edit' => [\n                'title' => 'İş Akışını Düzenle',\n                'event' => 'Olay',\n                'back-btn' => 'Geri',\n                'save-btn' => 'İş Akışını Kaydet',\n                'name' => 'Ad',\n                'basic-details' => 'Temel Bilgiler',\n                'description' => 'Açıklama',\n                'actions' => 'Eylemler',\n                'type' => 'Tür',\n                'basic-details-info' => 'İş akışının temel bilgilerini girin.',\n                'event-info' => 'Bir olay tetikler, kontrolleri yapar, koşulları değerlendirir ve önceden tanımlanmış eylemleri gerçekleştirir.',\n                'conditions' => 'Koşullar',\n                'conditions-info' => 'Koşullar, belirli durumlarda tetiklenen kurallardır.',\n                'actions-info' => 'Bir eylem sadece iş yükünü azaltmakla kalmaz, aynı zamanda CRM otomasyonu için oldukça kolaylaştırır.',\n                'value' => 'Değer',\n                'condition-type' => 'Koşul Türü',\n                'all-condition-are-true' => 'Tüm koşullar doğru',\n                'any-condition-are-true' => 'Herhangi bir koşul doğru',\n                'add-condition' => 'Koşul Ekle',\n                'add-action' => 'Eylem Ekle',\n                'yes' => 'Evet',\n                'no' => 'Hayır',\n                'email' => 'E-posta',\n                'is-equal-to' => 'Eşittir',\n                'is-not-equal-to' => 'Eşit değildir',\n                'equals-or-greater-than' => 'Eşittir veya büyük',\n                'equals-or-less-than' => 'Eşittir veya küçük',\n                'greater-than' => 'Büyük',\n                'less-than' => 'Küçük',\n                'contain' => 'İçerir',\n                'contains' => 'İçerir',\n                'does-not-contain' => 'İçermez',\n            ],\n        ],\n        'webforms' => [\n            'index' => [\n                'title' => 'Web Formları',\n                'create-btn' => 'Web Formu Oluştur',\n                'create-success' => 'Web formu başarıyla oluşturuldu.',\n                'update-success' => 'Web formu başarıyla güncellendi.',\n                'delete-success' => 'Web formu başarıyla silindi.',\n                'delete-failed' => 'Web formu silinemedi.',\n                'datagrid' => [\n                    'id' => 'ID',\n                    'title' => 'Başlık',\n                    'edit' => 'Düzenle',\n                    'delete' => 'Sil',\n                ],\n            ],\n            'create' => [\n                'title' => 'Web Formu Oluştur',\n                'add-attribute-btn' => 'Öznitelik Düğmesi Ekle',\n                'attribute-label-color' => 'Öznitelik Etiketi Rengi',\n                'attributes' => 'Öznitelikler',\n                'attributes-info' => 'Forma özel öznitelikler ekleyin.',\n                'background-color' => 'Arka Plan Rengi',\n                'create-lead' => 'Fırsat Oluştur',\n                'customize-webform' => 'Web Formunu Özelleştir',\n                'customize-webform-info' => 'Web formunuzu seçtiğiniz eleman renkleri ile özelleştirin.',\n                'description' => 'Açıklama',\n                'display-custom-message' => 'Özel mesaj göster',\n                'form-background-color' => 'Form Arka Plan Rengi',\n                'form-submit-btn-color' => 'Form Gönderim Düğmesi Rengi',\n                'form-submit-button-color' => 'Form Gönderim Düğmesi Rengi',\n                'form-title-color' => 'Form Başlık Rengi',\n                'general' => 'Genel',\n                'leads' => 'Fırsatlar',\n                'person' => 'Kişi',\n                'save-btn' => 'Web Formunu Kaydet',\n                'submit-button-label' => 'Gönderim Düğmesi Etiketi',\n                'submit-success-action' => 'Gönderim Başarı Eylemi',\n                'redirect-to-url' => 'URL\\'ye Yönlendir',\n                'choose-value' => 'Değer Seç',\n                'select-file' => 'Dosya Seç',\n                'select-image' => 'Görüntü Seç',\n                'enter-value' => 'Değer Gir',\n            ],\n            'edit' => [\n                'add-attribute-btn' => 'Öznitelik Düğmesi Ekle',\n                'attribute-label-color' => 'Öznitelik Etiketi Rengi',\n                'attributes' => 'Öznitelikler',\n                'attributes-info' => 'Forma özel öznitelikler ekleyin.',\n                'background-color' => 'Arka Plan Rengi',\n                'choose-value' => 'Değer Seç',\n                'code-snippet' => 'Kod Parçası',\n                'copied' => 'Kopyalandı',\n                'copy' => 'Kopyala',\n                'create-lead' => 'Fırsat Oluştur',\n                'customize-webform' => 'Web Formunu Özelleştir',\n                'customize-webform-info' => 'Web formunuzu seçtiğiniz eleman renkleri ile özelleştirin.',\n                'description' => 'Açıklama',\n                'display-custom-message' => 'Özel mesaj göster',\n                'embed' => 'Göm',\n                'enter-value' => 'Değer Gir',\n                'form-background-color' => 'Form Arka Plan Rengi',\n                'form-submit-btn-color' => 'Form Gönderim Düğmesi Rengi',\n                'form-submit-button-color' => 'Form Gönderim Düğmesi Rengi',\n                'form-title-color' => 'Form Başlık Rengi',\n                'general' => 'Genel',\n                'leads' => 'Fırsatlar',\n                'person' => 'Kişi',\n                'preview' => 'Önizleme',\n                'public-url' => 'Genel URL',\n                'redirect-to-url' => 'URL\\'ye Yönlendir',\n                'save-btn' => 'Web Formunu Kaydet',\n                'select-file' => 'Dosya Seç',\n                'select-image' => 'Görüntü Seç',\n                'submit-button-label' => 'Gönderim Düğmesi Etiketi',\n                'submit-success-action' => 'Gönderim Başarı Eylemi',\n                'title' => 'Web Formunu Düzenle',\n            ],\n        ],\n        'email-template' => [\n            'index' => [\n                'create-btn' => 'E-posta Şablonu Oluştur',\n                'title' => 'E-posta Şablonları',\n                'create-success' => 'E-posta şablonu başarıyla oluşturuldu.',\n                'update-success' => 'E-posta şablonu başarıyla güncellendi.',\n                'delete-success' => 'E-posta şablonu başarıyla silindi.',\n                'delete-failed' => 'E-posta şablonu silinemedi.',\n                'datagrid' => [\n                    'delete' => 'Sil',\n                    'edit' => 'Düzenle',\n                    'id' => 'ID',\n                    'name' => 'Ad',\n                    'subject' => 'Konu',\n                ],\n            ],\n            'create' => [\n                'title' => 'E-posta Şablonu Oluştur',\n                'save-btn' => 'E-posta Şablonunu Kaydet',\n                'email-template' => 'E-posta Şablonu',\n                'subject' => 'Konu',\n                'content' => 'İçerik',\n                'subject-placeholders' => 'Konu Yer Tutucuları',\n                'general' => 'Genel',\n                'name' => 'Ad',\n            ],\n            'edit' => [\n                'title' => 'E-posta Şablonunu Düzenle',\n                'save-btn' => 'E-posta Şablonunu Kaydet',\n                'email-template' => 'E-posta Şablonu',\n                'subject' => 'Konu',\n                'content' => 'İçerik',\n                'subject-placeholders' => 'Konu Yer Tutucuları',\n                'general' => 'Genel',\n                'name' => 'Ad',\n            ],\n        ],\n        'marketing' => [\n            'events' => [\n                'index' => [\n                    'create-btn' => 'Etkinlik Oluştur',\n                    'title' => 'Etkinlikler',\n                    'create-success' => 'Etkinlik başarıyla oluşturuldu.',\n                    'update-success' => 'Etkinlik başarıyla güncellendi.',\n                    'delete-success' => 'Etkinlik başarıyla silindi.',\n                    'delete-failed' => 'Etkinlik silinemedi.',\n                    'mass-delete-success' => 'Etkinlikler başarıyla silindi',\n                    'delete-failed-associated-campaigns' => 'Kampanya silinemiyor çünkü mevcut adaylarla ilişkili. Lütfen bu adayları silmeden önce bağlantılarını kaldırın veya güncelleyin.',\n                    'datagrid' => [\n                        'delete' => 'Sil',\n                        'edit' => 'Düzenle',\n                        'id' => 'ID',\n                        'name' => 'Ad',\n                        'description' => 'Açıklama',\n                        'date' => 'Tarih',\n                    ],\n                    'create' => [\n                        'title' => 'Etkinlik Oluştur',\n                        'name' => 'Ad',\n                        'date' => 'Tarih',\n                        'description' => 'Açıklama',\n                        'save-btn' => 'Etkinliği Kaydet',\n                    ],\n                    'edit' => [\n                        'title' => 'Etkinliği Düzenle',\n                    ],\n                ],\n            ],\n            'campaigns' => [\n                'index' => [\n                    'create-btn' => 'Kampanya Oluştur',\n                    'title' => 'Kampanyalar',\n                    'create-success' => 'Kampanya başarıyla oluşturuldu.',\n                    'update-success' => 'Kampanya başarıyla güncellendi.',\n                    'delete-success' => 'Kampanya başarıyla silindi.',\n                    'delete-failed' => 'Kampanya silinemedi.',\n                    'mass-delete-success' => 'Kampanyalar başarıyla silindi',\n\n                    'datagrid' => [\n                        'id' => 'ID',\n                        'name' => 'Ad',\n                        'subject' => 'Konu',\n                        'status' => 'Durum',\n                        'active' => 'Aktif',\n                        'inactive' => 'Pasif',\n                        'edit' => 'Düzenle',\n                        'delete' => 'Sil',\n                    ],\n                    'create' => [\n                        'title' => 'Kampanya Oluştur',\n                        'name' => 'Ad',\n                        'type' => 'Tür',\n                        'subject' => 'Konu',\n                        'event' => 'Etkinlik',\n                        'email-template' => 'E-posta Şablonu',\n                        'status' => 'Durum',\n                    ],\n                    'edit' => [\n                        'title' => 'Kampanyayı Düzenle',\n                    ],\n                ],\n            ],\n        ],\n        'tags' => [\n            'index' => [\n                'create-btn' => 'Etiket Oluştur',\n                'title' => 'Etiketler',\n                'create-success' => 'Etiket başarıyla oluşturuldu.',\n                'update-success' => 'Etiket başarıyla güncellendi.',\n                'delete-success' => 'Etiket başarıyla silindi.',\n                'delete-failed' => 'Etiket silinemedi.',\n                'datagrid' => [\n                    'delete' => 'Sil',\n                    'edit' => 'Düzenle',\n                    'id' => 'ID',\n                    'name' => 'Ad',\n                    'users' => 'Kullanıcılar',\n                    'created-at' => 'Oluşturulma Tarihi',\n                ],\n                'create' => [\n                    'name' => 'Ad',\n                    'save-btn' => 'Etiketi Kaydet',\n                    'title' => 'Etiket Oluştur',\n                    'color' => 'Renk',\n                ],\n                'edit' => [\n                    'title' => 'Etiketi Düzenle',\n                ],\n            ],\n        ],\n        'users' => [\n            'index' => [\n                'create-btn' => 'Kullanıcı Oluştur',\n                'create-success' => 'Kullanıcı başarıyla oluşturuldu.',\n                'delete-failed' => 'Kullanıcı silinemedi.',\n                'delete-success' => 'Kullanıcı başarıyla silindi.',\n                'last-delete-error' => 'En az bir kullanıcı gereklidir.',\n                'mass-delete-failed' => 'Kullanıcılar silinemedi.',\n                'mass-delete-success' => 'Kullanıcılar başarıyla silindi.',\n                'mass-update-failed' => 'Kullanıcılar güncellenemedi.',\n                'mass-update-success' => 'Kullanıcılar başarıyla güncellendi.',\n                'title' => 'Kullanıcılar',\n                'update-success' => 'Kullanıcı başarıyla güncellendi.',\n                'user-define-error' => 'Sistem kullanıcısı silinemedi.',\n                'active' => 'Aktif',\n                'inactive' => 'Pasif',\n                'datagrid' => [\n                    'active' => 'Aktif',\n                    'created-at' => 'Oluşturulma Tarihi',\n                    'delete' => 'Sil',\n                    'edit' => 'Düzenle',\n                    'email' => 'E-posta',\n                    'id' => 'ID',\n                    'inactive' => 'Pasif',\n                    'name' => 'Ad',\n                    'status' => 'Durum',\n                    'update-status' => 'Durumu Güncelle',\n                    'users' => 'Kullanıcılar',\n                ],\n                'create' => [\n                    'confirm-password' => 'Şifreyi Onayla',\n                    'email' => 'E-posta',\n                    'general' => 'Genel',\n                    'global' => 'Küresel',\n                    'group' => 'Grup',\n                    'individual' => 'Bireysel',\n                    'name' => 'Ad',\n                    'password' => 'Şifre',\n                    'permission' => 'İzin',\n                    'role' => 'Rol',\n                    'save-btn' => 'Kullanıcıyı Kaydet',\n                    'status' => 'Durum',\n                    'title' => 'Kullanıcı Oluştur',\n                    'view-permission' => 'Görüntüleme İzni',\n                    'select-at-lest-one-group' => 'Select at least one group',\n                ],\n                'edit' => [\n                    'title' => 'Kullanıcıyı Düzenle',\n                ],\n            ],\n        ],\n        'pipelines' => [\n            'index' => [\n                'title' => 'Pipelines',\n                'create-btn' => 'Pipeline Oluştur',\n                'create-success' => 'Pipeline başarıyla oluşturuldu.',\n                'update-success' => 'Pipeline başarıyla güncellendi.',\n                'default-required' => 'En az bir varsayılan boru hattı gereklidir.',\n                'delete-success' => 'Pipeline başarıyla silindi.',\n                'delete-failed' => 'Pipeline silinemedi.',\n                'default-delete-error' => 'Varsayılan pipeline silinemez.',\n                'datagrid' => [\n                    'delete' => 'Sil',\n                    'edit' => 'Düzenle',\n                    'id' => 'ID',\n                    'is-default' => 'Varsayılan mı',\n                    'name' => 'Ad',\n                    'no' => 'Hayır',\n                    'rotten-days' => 'Çürük Günler',\n                    'yes' => 'Evet',\n                ],\n            ],\n            'create' => [\n                'title' => 'Pipeline Oluştur',\n                'save-btn' => 'Pipeline Kaydet',\n                'name' => 'Ad',\n                'rotten-days' => 'Çürük Günler',\n                'mark-as-default' => 'Varsayılan Olarak İşaretle',\n                'general' => 'Genel',\n                'probability' => 'Olasılık (%)',\n                'new-stage' => 'Yeni',\n                'won-stage' => 'Kazandı',\n                'lost-stage' => 'Kaybetti',\n                'stage-btn' => 'Aşama Ekle',\n                'stages' => 'Aşamalar',\n                'duplicate-name' => '\"Ad\" alanı tekrar edemez',\n                'delete-stage' => 'Aşama Sil',\n                'add-new-stages' => 'Yeni Aşamalar Ekle',\n                'add-stage-info' => 'Pipeline için yeni aşama ekleyin',\n                'newly-added' => 'Yeni Eklenen',\n                'stage-delete-success' => 'Aşama Başarıyla Silindi',\n            ],\n            'edit' => [\n                'title' => 'Pipeline\\'ı Düzenle',\n                'save-btn' => 'Pipeline Kaydet',\n                'name' => 'Ad',\n                'rotten-days' => 'Çürük Günler',\n                'mark-as-default' => 'Varsayılan Olarak İşaretle',\n                'general' => 'Genel',\n                'probability' => 'Olasılık (%)',\n                'new-stage' => 'Yeni',\n                'won-stage' => 'Kazandı',\n                'lost-stage' => 'Kaybetti',\n                'stage-btn' => 'Aşama Ekle',\n                'stages' => 'Aşamalar',\n                'duplicate-name' => '\"Ad\" alanı tekrar edemez',\n                'delete-stage' => 'Aşama Sil',\n                'add-new-stages' => 'Yeni Aşamalar Ekle',\n                'add-stage-info' => 'Pipeline için yeni aşama ekleyin',\n                'stage-delete-success' => 'Aşama Başarıyla Silindi',\n            ],\n        ],\n        'webhooks' => [\n            'index' => [\n                'title' => 'Webhooks',\n                'create-btn' => 'Webhook Oluştur',\n                'create-success' => 'Webhook başarıyla oluşturuldu.',\n                'update-success' => 'Webhook başarıyla güncellendi.',\n                'delete-success' => 'Webhook başarıyla silindi.',\n                'delete-failed' => 'Webhook silinemedi.',\n                'datagrid' => [\n                    'id' => 'ID',\n                    'delete' => 'Sil',\n                    'edit' => 'Düzenle',\n                    'name' => 'Ad',\n                    'entity-type' => 'Varlık Türü',\n                    'end-point' => 'Son Nokta',\n                ],\n            ],\n            'create' => [\n                'title' => 'Webhook Oluştur',\n                'save-btn' => 'Webhook Kaydet',\n                'info' => 'Webhook detaylarını girin',\n                'url-and-parameters' => 'URL ve Parametreler',\n                'method' => 'Yöntem',\n                'post' => 'Post',\n                'put' => 'Put',\n                'url-endpoint' => 'URL Son Noktası',\n                'parameters' => 'Parametreler',\n                'add-new-parameter' => 'Yeni Parametre Ekle',\n                'url-preview' => 'URL Önizleme:',\n                'headers' => 'Başlıklar',\n                'add-new-header' => 'Yeni Başlık Ekle',\n                'body' => 'Gövde',\n                'default' => 'Varsayılan',\n                'x-www-form-urlencoded' => 'x-www-form-urlencoded',\n                'key-and-value' => 'Anahtar ve Değer',\n                'add-new-payload' => 'Yeni yük ekle',\n                'raw' => 'Ham',\n                'general' => 'Genel',\n                'name' => 'Ad',\n                'entity-type' => 'Varlık Türü',\n                'insert-placeholder' => 'Yer Tutucu Ekle',\n                'description' => 'Açıklama',\n                'json' => 'Json',\n                'text' => 'Metin',\n            ],\n            'edit' => [\n                'title' => 'Webhook\\'u Düzenle',\n                'edit-btn' => 'Webhook Kaydet',\n                'save-btn' => 'Webhook Kaydet',\n                'info' => 'Webhook detaylarını girin',\n                'url-and-parameters' => 'URL ve Parametreler',\n                'method' => 'Yöntem',\n                'post' => 'Post',\n                'put' => 'Put',\n                'url-endpoint' => 'URL Son Noktası',\n                'parameters' => 'Parametreler',\n                'add-new-parameter' => 'Yeni Parametre Ekle',\n                'url-preview' => 'URL Önizleme:',\n                'headers' => 'Başlıklar',\n                'add-new-header' => 'Yeni Başlık Ekle',\n                'body' => 'Gövde',\n                'default' => 'Varsayılan',\n                'x-www-form-urlencoded' => 'x-www-form-urlencoded',\n                'key-and-value' => 'Anahtar ve Değer',\n                'add-new-payload' => 'Yeni yük ekle',\n                'raw' => 'Ham',\n                'general' => 'Genel',\n                'name' => 'Ad',\n                'entity-type' => 'Varlık Türü',\n                'insert-placeholder' => 'Yer Tutucu Ekle',\n                'description' => 'Açıklama',\n                'json' => 'Json',\n                'text' => 'Metin',\n            ],\n        ],\n        'warehouses' => [\n            'index' => [\n                'title' => 'Depolar',\n                'create-btn' => 'Depo Oluştur',\n                'create-success' => 'Depo başarıyla oluşturuldu.',\n                'name-exists' => 'Depo adı zaten mevcut.',\n                'update-success' => 'Depo başarıyla güncellendi.',\n                'delete-success' => 'Depo başarıyla silindi.',\n                'delete-failed' => 'Depo silinemedi.',\n                'datagrid' => [\n                    'id' => 'ID',\n                    'name' => 'Ad',\n                    'contact-name' => 'İletişim Adı',\n                    'delete' => 'Sil',\n                    'edit' => 'Düzenle',\n                    'view' => 'Görüntüle',\n                    'created-at' => 'Oluşturulma Tarihi',\n                    'products' => 'Ürünler',\n                    'contact-emails' => 'İletişim E-postaları',\n                    'contact-numbers' => 'İletişim Numaraları',\n                ],\n            ],\n            'create' => [\n                'title' => 'Depo Oluştur',\n                'save-btn' => 'Depoyu Kaydet',\n                'contact-info' => 'İletişim Bilgileri',\n            ],\n            'edit' => [\n                'title' => 'Depoyu Düzenle',\n                'save-btn' => 'Depoyu Kaydet',\n                'contact-info' => 'İletişim Bilgileri',\n            ],\n            'view' => [\n                'all' => 'Tümü',\n                'notes' => 'Notlar',\n                'files' => 'Dosyalar',\n                'location' => 'Konum',\n                'change-logs' => 'Değişiklik Kayıtları',\n                'locations' => [\n                    'action' => 'Eylem',\n                    'add-location' => 'Konum Ekle',\n                    'create-success' => 'Konum başarıyla oluşturuldu.',\n                    'delete' => 'Sil',\n                    'delete-failed' => 'Konum silinemedi.',\n                    'delete-success' => 'Konum başarıyla silindi.',\n                    'name' => 'Ad',\n                    'save-btn' => 'Kaydet',\n                ],\n                'general-information' => [\n                    'title' => 'Genel Bilgiler',\n                ],\n                'contact-information' => [\n                    'title' => 'İletişim Bilgileri',\n                ],\n            ],\n        ],\n        'attributes' => [\n            'index' => [\n                'title' => 'Öznitelikler',\n                'create-btn' => 'Öznitelik Oluştur',\n                'create-success' => 'Öznitelik başarıyla oluşturuldu.',\n                'update-success' => 'Öznitelik başarıyla güncellendi.',\n                'delete-success' => 'Öznitelik başarıyla silindi.',\n                'delete-failed' => 'Öznitelik silinemedi.',\n                'user-define-error' => 'Sistem özniteliği silinemez.',\n                'mass-delete-failed' => 'Sistem öznitelikleri silinemez.',\n                'datagrid' => [\n                    'yes' => 'Evet',\n                    'no' => 'Hayır',\n                    'id' => 'ID',\n                    'code' => 'Kod',\n                    'name' => 'Ad',\n                    'entity-type' => 'Varlık Türü',\n                    'type' => 'Tür',\n                    'is-default' => 'Varsayılan mı',\n                    'edit' => 'Düzenle',\n                    'delete' => 'Sil',\n                    'entity-types' => [\n                        'leads' => 'Potansiyeller',\n                        'organizations' => 'Organizasyonlar',\n                        'persons' => 'Kişiler',\n                        'products' => 'Ürünler',\n                        'quotes' => 'Teklifler',\n                        'warehouses' => 'Depolar',\n                    ],\n                    'types' => [\n                        'text' => 'Metin',\n                        'textarea' => 'Metin alanı',\n                        'price' => 'Fiyat',\n                        'boolean' => 'Mantıksal',\n                        'select' => 'Seçim',\n                        'multiselect' => 'Çoklu seçim',\n                        'checkbox' => 'Onay kutusu',\n                        'email' => 'E-posta',\n                        'address' => 'Adres',\n                        'phone' => 'Telefon',\n                        'lookup' => 'Arama',\n                        'datetime' => 'Tarih ve saat',\n                        'date' => 'Tarih',\n                        'image' => 'Görsel',\n                        'file' => 'Dosya',\n                    ],\n                ],\n            ],\n            'create' => [\n                'title' => 'Öznitelik Oluştur',\n                'save-btn' => 'Özniteliği Kaydet',\n                'code' => 'Kod',\n                'name' => 'Ad',\n                'entity-type' => 'Varlık Türü',\n                'type' => 'Tür',\n                'validations' => 'Doğrulamalar',\n                'is-required' => 'Gerekli mi',\n                'input-validation' => 'Girdi Doğrulaması',\n                'is-unique' => 'Benzersiz mi',\n                'labels' => 'Etiketler',\n                'general' => 'Genel',\n                'numeric' => 'Sayısal',\n                'decimal' => 'Ondalık',\n                'url' => 'URL',\n                'options' => 'Seçenekler',\n                'option-type' => 'Seçenek Türü',\n                'lookup-type' => 'Arama Türü',\n                'add-option' => 'Seçenek Ekle',\n                'save-option' => 'Seçeneği Kaydet',\n                'option-name' => 'Seçenek Adı',\n                'add-attribute-options' => 'Öznitelik Seçenekleri Ekle',\n                'text' => 'Metin',\n                'textarea' => 'Metin Alanı',\n                'price' => 'Fiyat',\n                'boolean' => 'Boolean',\n                'select' => 'Seç',\n                'multiselect' => 'Çoklu Seçim',\n                'email' => 'E-posta',\n                'address' => 'Adres',\n                'phone' => 'Telefon',\n                'datetime' => 'Tarih Saat',\n                'date' => 'Tarih',\n                'image' => 'Resim',\n                'file' => 'Dosya',\n                'lookup' => 'Arama',\n                'entity_type' => 'Varlık türü',\n                'checkbox' => 'Onay Kutusu',\n                'is_required' => 'Gerekli mi',\n                'is_unique' => 'Benzersiz mi',\n                'actions' => 'İşlemler',\n            ],\n            'edit' => [\n                'actions' => 'İşlemler',\n                'add-attribute-options' => 'Öznitelik Seçenekleri Ekle',\n                'add-option' => 'Seçenek Ekle',\n                'address' => 'Adres',\n                'boolean' => 'Boolean',\n                'checkbox' => 'Onay Kutusu',\n                'code' => 'Kod',\n                'date' => 'Tarih',\n                'datetime' => 'Tarih Saat',\n                'decimal' => 'Ondalık',\n                'email' => 'E-posta',\n                'entity-type' => 'Varlık Türü',\n                'entity_type' => 'Varlık türü',\n                'file' => 'Dosya',\n                'general' => 'Genel',\n                'image' => 'Resim',\n                'input-validation' => 'Girdi Doğrulaması',\n                'is-required' => 'Gerekli mi',\n                'is-unique' => 'Benzersiz mi',\n                'is_required' => 'Gerekli mi',\n                'is_unique' => 'Benzersiz mi',\n                'labels' => 'Etiketler',\n                'lookup' => 'Arama',\n                'lookup-type' => 'Arama Türü',\n                'multiselect' => 'Çoklu Seçim',\n                'name' => 'Ad',\n                'numeric' => 'Sayısal',\n                'option-deleted' => 'Attribute Option is deleted successfully',\n                'option-name' => 'Seçenek Adı',\n                'option-type' => 'Seçenek Türü',\n                'options' => 'Seçenekler',\n                'phone' => 'Telefon',\n                'price' => 'Fiyat',\n                'save-btn' => 'Özniteliği Kaydet',\n                'save-option' => 'Seçeneği Kaydet',\n                'select' => 'Seç',\n                'text' => 'Metin',\n                'textarea' => 'Metin Alanı',\n                'title' => 'Özniteliği Düzenle',\n                'type' => 'Tür',\n                'url' => 'URL',\n                'validations' => 'Doğrulamalar',\n            ],\n        ],\n        'data-transfer' => [\n            'imports' => [\n                'create' => [\n                    'action' => 'Eylem',\n                    'allowed-errors' => 'İzin Verilen Hatalar',\n                    'back-btn' => 'Geri',\n                    'create-update' => 'Oluştur/Güncelle',\n                    'delete' => 'Sil',\n                    'download-sample' => 'Örneği İndir',\n                    'field-separator' => 'Alan Ayırıcı',\n                    'file' => 'Dosya',\n                    'general' => 'Genel',\n                    'images-directory' => 'Resim Dizini Yolu',\n                    'process-in-queue' => 'Kuyrukta İşle',\n                    'results' => 'Sonuçlar',\n                    'save-btn' => 'İthalatı Kaydet',\n                    'settings' => 'Ayarlar',\n                    'skip-errors' => 'Hataları Atla',\n                    'stop-on-errors' => 'Hatalarda Durdur',\n                    'title' => 'İthalat Oluştur',\n                    'type' => 'Tür',\n                    'validation-strategy' => 'Doğrulama Stratejisi',\n                ],\n                'edit' => [\n                    'action' => 'Eylem',\n                    'allowed-errors' => 'İzin Verilen Hatalar',\n                    'back-btn' => 'Geri',\n                    'create-update' => 'Oluştur/Güncelle',\n                    'delete' => 'Sil',\n                    'download-sample' => 'Örneği İndir',\n                    'field-separator' => 'Alan Ayırıcı',\n                    'file' => 'Dosya',\n                    'general' => 'Genel',\n                    'images-directory' => 'Resim Dizini Yolu',\n                    'process-in-queue' => 'Kuyrukta İşle',\n                    'results' => 'Sonuçlar',\n                    'save-btn' => 'İthalatı Kaydet',\n                    'settings' => 'Ayarlar',\n                    'skip-errors' => 'Hataları Atla',\n                    'stop-on-errors' => 'Hatalarda Durdur',\n                    'title' => 'İthalatı Düzenle',\n                    'type' => 'Tür',\n                    'validation-strategy' => 'Doğrulama Stratejisi',\n                ],\n                'index' => [\n                    'button-title' => 'İthalat Oluştur',\n                    'title' => 'İthalatlar',\n                    'datagrid' => [\n                        'actions' => 'Eylemler',\n                        'completed-at' => 'Tamamlandığı Zaman',\n                        'created' => 'Oluşturuldu',\n                        'delete' => 'Sil',\n                        'deleted' => 'Silindi',\n                        'edit' => 'Düzenle',\n                        'error-file' => 'Hata Dosyası',\n                        'id' => 'Kimlik',\n                        'started-at' => 'Başlama Zamanı',\n                        'state' => 'Durum',\n                        'summary' => 'Özet',\n                        'type' => 'Tür',\n                        'updated' => 'Güncellendi',\n                        'uploaded-file' => 'Yüklenen Dosya',\n                    ],\n                ],\n                'import' => [\n                    'back-btn' => 'Geri',\n                    'completed-batches' => 'Tamamlanan Toplam Gruplar:',\n                    'download-error-report' => 'Tam Raporu İndir',\n                    'edit-btn' => 'Düzenle',\n                    'imported-info' => 'Tebrikler! İthalatınız başarılı oldu.',\n                    'importing-info' => 'İthalat İşlemde',\n                    'indexing-info' => 'Kaynaklar İndeksleniyor (Fiyat, Stok ve Elastic Search) İlerliyor',\n                    'linking-info' => 'Kaynaklar Bağlanıyor',\n                    'progress' => 'İlerleme:',\n                    'title' => 'İthalat',\n                    'total-batches' => 'Toplam Gruplar:',\n                    'total-created' => 'Oluşturulan Toplam Kayıtlar:',\n                    'total-deleted' => 'Silinen Toplam Kayıtlar:',\n                    'total-errors' => 'Toplam Hatalar:',\n                    'total-invalid-rows' => 'Geçersiz Satırların Toplamı:',\n                    'total-rows-processed' => 'İşlenen Toplam Satırlar:',\n                    'total-updated' => 'Güncellenen Toplam Kayıtlar:',\n                    'validate' => 'Doğrula',\n                    'validate-info' => 'İthalatınızı kontrol etmek için Verileri Doğrula\\'ya tıklayın.',\n                    'validating-info' => 'Veriler okunmaya ve doğrulanmaya başlandı',\n                    'validation-failed-info' => 'İthalatınız geçersiz. Lütfen aşağıdaki hataları düzeltin ve tekrar deneyin.',\n                    'validation-success-info' => 'İthalatınız geçerli. İthalat işlemini başlatmak için İthalat\\'a tıklayın.',\n                ],\n                'create-success' => 'İthalat başarıyla oluşturuldu.',\n                'delete-failed' => 'İthalatı silme beklenmedik bir şekilde başarısız oldu.',\n                'delete-success' => 'İthalat başarıyla silindi.',\n                'not-valid' => 'İthalat geçersiz',\n                'nothing-to-import' => 'İthal edilecek kaynak yok.',\n                'setup-queue-error' => 'İthalat işlemini başlatmak için kuyruk sürücünüzü \"veritabanı\" veya \"redis\" olarak değiştirin.',\n                'update-success' => 'İthalat başarıyla güncellendi.',\n            ],\n        ],\n    ],\n    'activities' => [\n        'index' => [\n            'title' => 'Etkinlikler',\n            'datagrid' => [\n                'comment' => 'Yorum',\n                'created_at' => 'Oluşturulma Tarihi',\n                'created_by' => 'Oluşturan',\n                'edit' => 'Düzenle',\n                'id' => 'ID',\n                'done' => 'Tamamlandı mı',\n                'not-done' => 'Tamamlanmadı',\n                'lead' => 'Müşteri',\n                'mass-delete' => 'Toplu Sil',\n                'mass-update' => 'Toplu Güncelle',\n                'schedule-from' => 'Başlangıç Tarihi',\n                'schedule-to' => 'Bitiş Tarihi',\n                'schedule_from' => 'Başlangıç Tarihi',\n                'schedule_to' => 'Bitiş Tarihi',\n                'title' => 'Başlık',\n                'is_done' => 'Tamamlandı mı',\n                'type' => 'Tür',\n                'update' => 'Güncelle',\n                'call' => 'Arama',\n                'meeting' => 'Toplantı',\n                'lunch' => 'Öğle Yemeği',\n            ],\n        ],\n        'edit' => [\n            'title' => 'Etkinliği Düzenle',\n            'back-btn' => 'Geri',\n            'save-btn' => 'Etkinliği Kaydet',\n            'type' => 'Etkinlik Türü',\n            'call' => 'Arama',\n            'meeting' => 'Toplantı',\n            'lunch' => 'Öğle Yemeği',\n            'schedule_to' => 'Bitiş Tarihi',\n            'schedule_from' => 'Başlangıç Tarihi',\n            'location' => 'Konum',\n            'comment' => 'Yorum',\n            'lead' => 'Müşteri',\n            'participants' => 'Katılımcılar',\n            'general' => 'Genel',\n            'persons' => 'Kişiler',\n            'no-result-found' => 'Kayıt bulunamadı.',\n            'users' => 'Kullanıcılar',\n        ],\n        'updated' => 'Güncellendi :attribute',\n        'created' => 'Oluşturuldu',\n        'duration-overlapping' => 'Katılımcıların bu saatte başka bir toplantısı var. Devam etmek istiyor musunuz?',\n        'create-success' => 'Etkinlik başarıyla oluşturuldu.',\n        'update-success' => 'Etkinlik başarıyla güncellendi.',\n        'overlapping-error' => 'Katılımcıların bu saatte başka bir toplantısı var.',\n        'destroy-success' => 'Etkinlik başarıyla silindi.',\n        'delete-failed' => 'Etkinlik silinemiyor.',\n        'mass-update-success' => 'Etkinlikler başarıyla güncellendi.',\n        'mass-destroy-success' => 'Etkinlikler başarıyla silindi.',\n        'mass-delete-failed' => 'Etkinlikler silinemiyor.',\n    ],\n    'mail' => [\n        'index' => [\n            'compose' => 'Oluştur',\n            'draft' => 'Taslak',\n            'inbox' => 'Gelen Kutusu',\n            'outbox' => 'Giden Kutusu',\n            'sent' => 'Gönderildi',\n            'trash' => 'Çöp',\n            'compose-mail-btn' => 'Mail Oluştur',\n            'btn' => 'Mail',\n            'mail' => [\n                'title' => 'Mail Oluştur',\n                'to' => 'Kime',\n                'enter-emails' => 'E-posta eklemek için enter tuşuna basın',\n                'cc' => 'CC',\n                'bcc' => 'BCC',\n                'subject' => 'Konu',\n                'send-btn' => 'Gönder',\n                'message' => 'Mesaj',\n                'draft' => 'Taslak',\n            ],\n            'datagrid' => [\n                'id' => 'ID',\n                'from' => 'Gönderen',\n                'to' => 'Alıcı',\n                'subject' => 'Konu',\n                'tags' => 'Etiketler',\n                'content' => 'Eklentiler',\n                'attachments' => 'Attachments',\n                'date' => 'Tarih',\n                'move-to-inbox' => 'Gelen Kutusuna Taşı',\n                'move-to-trash' => 'Çöp kutusuna taşındı',\n                'edit' => 'Düzenle',\n                'view' => 'Görüntüle',\n                'delete' => 'Sil',\n            ],\n        ],\n\n        'create-success' => 'E-posta başarıyla gönderildi.',\n        'update-success' => 'E-posta başarıyla güncellendi.',\n        'mass-update-success' => 'E-postalar başarıyla güncellendi.',\n        'delete-success' => 'E-posta başarıyla silindi.',\n        'delete-failed' => 'E-posta silinemedi.',\n        'invalid-route' => 'Geçersiz rota için mail.',\n        'unauthorized' => 'Bu işlem yetkilendirilmemiştir.',\n\n        'view' => [\n            'title' => 'Mails',\n            'subject' => ':subject',\n            'link-mail' => 'Maili Bağla',\n            'to' => 'Kime',\n            'cc' => 'CC',\n            'bcc' => 'BCC',\n            'reply' => 'Yanıtla',\n            'reply-all' => 'Hepsine Yanıtla',\n            'forward' => 'Yönlendir',\n            'delete' => 'Sil',\n            'enter-mails' => 'E-posta ID girin',\n            'rotten-days' => ':days gün boyunca geçersiz',\n            'search-an-existing-lead' => 'Mevcut bir müşteri arayın',\n            'search-an-existing-contact' => 'Mevcut bir kişi arayın',\n            'message' => 'Mesaj',\n            'add-attachments' => 'Ek Ekle',\n            'discard' => 'İptal Et',\n            'send' => 'Gönder',\n            'no-result-found' => 'Sonuç bulunamadı',\n            'add-new-contact' => 'Yeni İletişim Ekle',\n            'description' => 'Açıklama',\n            'search' => 'Ara...',\n            'add-new-lead' => 'Yeni Müşteri Ekle',\n            'create-new-contact' => 'Yeni İletişim Oluştur',\n            'save-contact' => 'İletişimi Kaydet',\n            'create-lead' => 'Müşteri Oluştur',\n            'linked-contact' => 'Bağlı Kişi',\n            'link-to-contact' => 'Kişiye Bağla',\n            'link-to-lead' => 'Müşteriye Bağla',\n            'linked-lead' => 'Bağlı Müşteri',\n            'lead-details' => 'Müşteri Detayları',\n            'contact-person' => 'İletişim Kişisi',\n            'product' => 'Ürün',\n            'tags' => [\n                'create-success' => 'Etiket başarıyla oluşturuldu.',\n                'destroy-success' => 'Etiket başarıyla silindi.',\n            ],\n        ],\n    ],\n    'common' => [\n        'custom-attributes' => [\n            'add-more' => 'Daha Fazla Ekle',\n            'address' => 'Adres',\n            'city' => 'Şehir',\n            'contact' => 'İletişim Numaraları',\n            'country' => 'Ülke',\n            'email' => 'E-posta',\n            'home' => 'Ev',\n            'postcode' => 'Posta Kodu',\n            'save' => 'Kaydet',\n            'select' => 'Seç',\n            'select-country' => 'Ülke Seç',\n            'select-state' => 'Eyalet Seç',\n            'state' => 'Eyalet',\n            'update-contact-title' => 'İletişim Numaralarını Güncelle',\n            'update-emails-title' => 'İletişim E-postalarını Güncelle',\n            'work' => 'İş',\n        ],\n    ],\n    'leads' => [\n        'create-success' => 'Lead başarıyla oluşturuldu.',\n        'update-success' => 'Lead başarıyla güncellendi.',\n        'update-failed' => 'Potansiyel müşteriler silinemez.',\n        'destroy-success' => 'Lead başarıyla silindi.',\n        'destroy-failed' => 'Lead silinemedi.',\n        'file' => [\n            'data-not-found' => 'Veri bulunamadı.',\n            'empty-content' => 'PDF içeriği boş veya çıkarılamadı.',\n            'failed-extract' => 'Dosyadan metin çıkarılamadı.',\n            'insufficient-info' => 'Yetersiz veri nedeniyle, şu anda isteğinizi işleyemiyoruz.',\n            'invalid-base64' => 'Geçersiz base64 formatı.',\n            'invalid-format' => 'Geçersiz JSON formatı.',\n            'invalid-response' => 'Geçersiz AI yanıt formatı.',\n            'missing-api-key' => 'API anahtarı veya model yapılandırması eksik.',\n            'not-found' => 'Dosya bulunamadı.',\n            'recursive-call' => 'Özyinelemeli çağrı tespit edildi.',\n            'text-generation-failed' => 'Metin çıkarma başarısız oldu. Dosya boş veya okunamaz olabilir.',\n        ],\n        'index' => [\n            'title' => 'Leads',\n            'create-btn' => 'Lead Oluştur',\n            'datagrid' => [\n                'id' => 'ID',\n                'sales-person' => 'Satış Temsilcisi',\n                'subject' => 'Konu',\n                'source' => 'Kaynak',\n                'lead-value' => 'Lead Değeri',\n                'lead-type' => 'Potansiyel Müşteri Türü',\n                'tag-name' => 'Etiket Adı',\n                'contact-person' => 'İletişim Kişisi',\n                'stage' => 'Aşama',\n                'rotten-lead' => 'Çürümüş Lead',\n                'date-to' => 'Bitiş Tarihi',\n                'created-at' => 'Oluşturulma Tarihi',\n                'no' => 'Hayır',\n                'yes' => 'Evet',\n                'delete' => 'Sil',\n                'mass-delete' => 'Toplu Sil',\n                'mass-update' => 'Toplu Güncelle',\n            ],\n            'kanban' => [\n                'rotten-days' => 'Bu müşteri adayı :days gündür çürük',\n                'empty-list' => 'Müşteri Adayı Listeniz Boş',\n                'empty-list-description' => 'Hedeflerinizi düzenlemek için bir müşteri adayı oluşturun.',\n                'create-lead-btn' => 'Müşteri Adayı Oluştur',\n                'columns' => [\n                    'contact-person' => 'İletişim Kişisi',\n                    'id' => 'ID',\n                    'lead-type' => 'Lead Türü',\n                    'lead-value' => 'Lead Değeri',\n                    'sales-person' => 'Satış Temsilcisi',\n                    'source' => 'Kaynak',\n                    'title' => 'Başlık',\n                    'tags' => 'Etiketler',\n                    'expected-close-date' => 'Beklenen Kapanış Tarihi',\n                    'created-at' => 'Oluşturulma Tarihi',\n                ],\n                'toolbar' => [\n                    'search' => [\n                        'title' => 'Başlığa göre ara',\n                    ],\n                    'filters' => [\n                        'apply-filters' => 'Filtreleri Uygula',\n                        'clear-all' => 'Tümünü Temizle',\n                        'filter' => 'Filtre',\n                        'filters' => 'Filtreler',\n                        'from' => 'Kimden',\n                        'select' => 'Seç',\n                        'to' => 'Kime',\n                    ],\n                ],\n            ],\n            'view-switcher' => [\n                'all-pipelines' => 'Tüm Boru Hatları',\n                'create-new-pipeline' => 'Yeni Boru Hattı Oluştur',\n            ],\n            'upload' => [\n                'create-lead' => 'AI Kullanarak Lead Oluştur',\n                'file' => 'Dosya yükleme',\n                'file-info' => 'Yalnızca pdf, bmp, jpg, jpeg, png formatındaki dosyalar kabul edilir.',\n                'file-required' => 'Devam etmek için lütfen en az bir geçerli dosya seçin.',\n                'save-btn' => 'Kaydet',\n                'upload-file' => 'Dosya yükle',\n            ],\n        ],\n        'create' => [\n            'title' => 'Lead Oluştur',\n            'save-btn' => 'Kaydet',\n            'details' => 'Detaylar',\n            'details-info' => 'Lead\\'in Temel Bilgilerini Girin',\n            'contact-person' => 'İletişim Kişisi',\n            'contact-info' => 'İletişim Kişisi Hakkında Bilgiler',\n            'products' => 'Ürünler',\n            'products-info' => 'Ürünler Hakkında Bilgiler',\n        ],\n        'edit' => [\n            'title' => 'Lead\\'i Düzenle',\n            'save-btn' => 'Kaydet',\n            'details' => 'Detaylar',\n            'details-info' => 'Lead\\'in Temel Bilgilerini Girin',\n            'contact-person' => 'İletişim Kişisi',\n            'contact-info' => 'İletişim Kişisi Hakkında Bilgiler',\n            'products' => 'Ürünler',\n            'products-info' => 'Ürünler Hakkında Bilgiler',\n        ],\n        'common' => [\n            'contact' => [\n                'name' => 'Ad',\n                'email' => 'E-posta',\n                'contact-number' => 'İletişim Numarası',\n                'organization' => 'Kuruluş',\n            ],\n            'products' => [\n                'product-name' => 'Ürün Adı',\n                'quantity' => 'Miktar',\n                'price' => 'Fiyat',\n                'amount' => 'Tutar',\n                'action' => 'Eylem',\n                'add-more' => 'Daha Fazla Ekle',\n                'total' => 'Toplam',\n            ],\n        ],\n        'view' => [\n            'title' => 'Lead: :title',\n            'rotten-days' => ':days Gün',\n            'tabs' => [\n                'description' => 'Açıklama',\n                'products' => 'Ürünler',\n                'quotes' => 'Teklifler',\n            ],\n            'attributes' => [\n                'title' => 'Lead Hakkında',\n            ],\n            'quotes' => [\n                'subject' => 'Konu',\n                'expired-at' => 'Son Tarih',\n                'sub-total' => 'Ara Toplam',\n                'discount' => 'İndirim',\n                'tax' => 'Vergi',\n                'adjustment' => 'Düzeltme',\n                'grand-total' => 'Genel Toplam',\n                'delete' => 'Sil',\n                'edit' => 'Düzenle',\n                'download' => 'İndir',\n                'destroy-success' => 'Teklif başarıyla silindi.',\n                'empty-title' => 'Teklif Bulunamadı',\n                'empty-info' => 'Bu Lead için Teklif Bulunamadı',\n                'add-btn' => 'Teklif Ekle',\n            ],\n            'products' => [\n                'product-name' => 'Ürün Adı',\n                'quantity' => 'Miktar',\n                'price' => 'Fiyat',\n                'amount' => 'Tutar',\n                'action' => 'Eylem',\n                'add-more' => 'Daha Fazla Ekle',\n                'total' => 'Toplam',\n                'empty-title' => 'Ürün Bulunamadı',\n                'empty-info' => 'Bu Lead için Ürün Bulunamadı',\n                'add-product' => 'Ürün Ekle',\n            ],\n            'persons' => [\n                'title' => 'Kişiler Hakkında',\n                'job-title' => ':job_title @ :organization',\n            ],\n            'stages' => [\n                'won' => 'Kazandı',\n                'lost' => 'Kayıp',\n                'need-more-info' => 'Daha Fazla Bilgi Gerekiyor',\n                'closed-at' => 'Kapanış Tarihi',\n                'won-value' => 'Kazanan Değer',\n                'lost-reason' => 'Kayıp Nedeni',\n                'save-btn' => 'Kaydet',\n            ],\n            'tags' => [\n                'create-success' => 'Etiket başarıyla oluşturuldu.',\n                'destroy-success' => 'Etiket başarıyla silindi.',\n            ],\n        ],\n    ],\n    'configuration' => [\n        'index' => [\n            'back' => 'Geri',\n            'delete' => 'Sil',\n            'save-btn' => 'Yapılandırmayı Kaydet',\n            'save-success' => 'Yapılandırma Başarıyla Kaydedildi.',\n            'search' => 'Ara',\n            'select-country' => 'Ülke Seç',\n            'select-state' => 'Eyalet Seç',\n            'title' => 'Yapılandırma',\n            'general' => [\n                'title' => 'Genel',\n                'info' => 'Genel Yapılandırma',\n                'general' => [\n                    'title' => 'Genel',\n                    'info' => 'Genel ayarlarınızı burada güncelleyin.',\n                    'locale-settings' => [\n                        'title' => 'Yerel Ayarlar',\n                        'title-info' => 'Kullanıcı arayüzünde kullanılan dili tanımlar, örneğin Arapça (ar), İngilizce (en), İspanyolca (es), Farsça (fa) ve Türkçe (tr).',\n                    ],\n                    'admin-logo' => [\n                        'logo-image' => 'Logo Resmi',\n                        'title' => 'Yönetici Logosu',\n                        'title-info' => 'Yönetici paneliniz için logo resmini yapılandırın.',\n                    ],\n                ],\n                'settings' => [\n                    'title' => 'Ayarlar',\n                    'info' => 'Ayarlarınızı burada güncelleyin.',\n                    'footer' => [\n                        'info' => 'Powered by bölümünü burada yapılandırabiliriz.',\n                        'powered-by' => 'Powered by metin düzenleyici',\n                        'title' => 'Powered by Bölüm Yapılandırmaları',\n                    ],\n                    'menu' => [\n                        'activities' => 'Aktiviteler',\n                        'configuration' => 'Yapılandırma',\n                        'contacts' => 'İletişim',\n                        'dashboard' => 'Gösterge Paneli',\n                        'draft' => 'Taslak',\n                        'inbox' => 'Gelen Kutusu',\n                        'info' => 'Menü öğelerinin adlarını burada yapılandırabiliriz.',\n                        'leads' => 'Leadler',\n                        'mail' => 'Mail',\n                        'organizations' => 'Organizasyonlar',\n                        'outbox' => 'Gönderilenler',\n                        'persons' => 'Kişiler',\n                        'products' => 'Ürünler',\n                        'quotes' => 'Teklifler',\n                        'sent' => 'Gönderildi',\n                        'settings' => 'Ayarlar',\n                        'title' => 'Menü Öğesi Yapılandırmaları',\n                        'trash' => 'Çöp Kutusu',\n                    ],\n                    'menu-color' => [\n                        'brand-color' => 'Brand Color',\n                        'info' => 'Menü öğelerinin renklerini burada değiştirebiliriz.',\n                        'title' => 'Menü Öğesi Renk Yapılandırmaları',\n                    ],\n                ],\n            ],\n            'email' => [\n                'title' => 'Email Settings',\n                'info' => 'Email configuration for the application.',\n                'imap' => [\n                    'title' => 'IMAP Settings',\n                    'info' => 'IMAP email configuration for receiving emails.',\n                    'account' => [\n                        'title' => 'IMAP Account',\n                        'title-info' => 'Configure your IMAP account settings here.',\n                        'host' => 'Host',\n                        'port' => 'Port',\n                        'encryption' => 'Encryption Type',\n                        'validate-cert' => 'Validate SSL Certificate',\n                        'username' => 'IMAP Username',\n                        'password' => 'IMAP Password',\n                    ],\n                ],\n            ],\n            'magic-ai' => [\n                'title' => 'Sihirli AI',\n                'info' => 'Uygulama için Sihirli AI yapılandırması.',\n                'settings' => [\n                    'api-key' => 'API Anahtarı',\n                    'api-key-info' => 'Her model için bir OpenRouter API anahtarı kullanmayı unutmayın. Bu, güvenliği ve performansı artırmak için basit bir adımdır.',\n                    'enable' => 'Etkinleştir',\n                    'info' => 'OpenRouter API Anahtarınız ile Magic AI deneyiminizi geliştirin. Şimdi entegre edin ve size özel, sorunsuz bir AI macerası yaşayın! Ayarları kolayca özelleştirin ve AI yolculuğunuzun kontrolünü elinize alın.',\n                    'other' => 'Diğer Model',\n                    'other-model' => 'Diğer modeller için OpenRouter\\'dan Model ID kullanın.',\n                    'doc-generation' => 'DOC Oluşturma',\n                    'doc-generation-info' => 'DOC dosyalarından verileri otomatik olarak çıkartıp metin formatına dönüştürmek için DOC Oluşturma özelliğini etkinleştirin. Bu özelliği etkinleştirerek iş akışınızı kolaylaştırın ve verimliliğinizi artırın.',\n                    'title' => 'Genel Ayarlar',\n                    'models' => [\n                        'deepseek-r1' => 'Deepseek R1 Distill-llama-8b',\n                        'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001',\n                        'gpt-4o' => 'GPT-4.0',\n                        'gpt-4o-mini' => 'GPT-4.0 mini',\n                        'grok-2-1212' => 'Grok 2.12',\n                        'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct',\n                        'title' => 'Modeller',\n                    ],\n                ],\n            ],\n        ],\n    ],\n    'dashboard' => [\n        'index' => [\n            'title' => 'Gösterge Paneli',\n            'start-date' => 'Start Date',\n            'end-date' => 'End Date',\n            'revenue' => [\n                'lost-revenue' => 'Kayıp Gelir',\n                'won-revenue' => 'Kazançlı Gelir',\n            ],\n            'over-all' => [\n                'average-lead-value' => 'Ortalama Lead Değeri',\n                'total-leads' => 'Toplam Lead',\n                'average-leads-per-day' => 'Günlük Ortalama Lead',\n                'total-quotations' => 'Toplam Teklif',\n                'total-persons' => 'Toplam Kişi',\n                'total-organizations' => 'Toplam Organizasyon',\n            ],\n            'total-leads' => [\n                'title' => 'Leadler',\n                'total' => 'Toplam Lead',\n                'won' => 'Kazanan Leadler',\n                'lost' => 'Kayıp Leadler',\n            ],\n            'revenue-by-sources' => [\n                'title' => 'Kaynaklara Göre Gelir',\n                'empty-title' => 'Veri Bulunamadı',\n                'empty-info' => 'Seçilen aralık için veri bulunamadı',\n            ],\n            'revenue-by-types' => [\n                'title' => 'Türlere Göre Gelir',\n                'empty-title' => 'Veri Bulunamadı',\n                'empty-info' => 'Seçilen aralık için veri bulunamadı',\n            ],\n            'top-selling-products' => [\n                'title' => 'En Çok Satılan Ürünler',\n                'empty-title' => 'Ürün Bulunamadı',\n                'empty-info' => 'Seçilen aralık için ürün bulunamadı',\n            ],\n            'top-persons' => [\n                'title' => 'En İyi Kişiler',\n                'empty-title' => 'Kişi Bulunamadı',\n                'empty-info' => 'Seçilen aralık için kişi bulunamadı',\n            ],\n            'open-leads-by-states' => [\n                'title' => 'Aşamalara Göre Açık Leadler',\n                'empty-title' => 'Veri Bulunamadı',\n                'empty-info' => 'Seçilen aralık için veri bulunamadı',\n            ],\n        ],\n    ],\n    'layouts' => [\n        'app-version' => 'Sürüm: :version',\n        'dashboard' => 'Gösterge Paneli',\n        'leads' => 'Leadler',\n        'quotes' => 'Teklifler',\n        'quote' => 'Teklif',\n        'mail' => [\n            'title' => 'Mail',\n            'compose' => 'Yeni Mesaj',\n            'inbox' => 'Gelen Kutusu',\n            'draft' => 'Taslak',\n            'outbox' => 'Gönderilenler',\n            'sent' => 'Gönderildi',\n            'trash' => 'Çöp Kutusu',\n            'setting' => 'Ayar',\n        ],\n        'activities' => 'Aktiviteler',\n        'contacts' => 'İletişim',\n        'persons' => 'Kişiler',\n        'person' => 'Kişi',\n        'organizations' => 'Organizasyonlar',\n        'organization' => 'Organizasyon',\n        'products' => 'Ürünler',\n        'product' => 'Ürün',\n        'settings' => 'Ayarlar',\n        'user' => 'Kullanıcı',\n        'user-info' => 'CRM’de tüm kullanıcılarınızı ve yetkilerini yönetin, ne yapmalarına izin verildiğini belirleyin.',\n        'groups' => 'Gruplar',\n        'groups-info' => 'CRM’den grupları ekleyin, düzenleyin veya silin',\n        'roles' => 'Roller',\n        'role' => 'Rol',\n        'roles-info' => 'CRM’den rolleri ekleyin, düzenleyin veya silin',\n        'users' => 'Kullanıcılar',\n        'users-info' => 'CRM’den kullanıcıları ekleyin, düzenleyin veya silin',\n        'lead' => 'Lead',\n        'lead-info' => 'CRM’de tüm lead ayarlarınızı yönetin',\n        'pipelines' => 'Pipeline’lar',\n        'pipelines-info' => 'CRM’den pipeline’ları ekleyin, düzenleyin veya silin',\n        'sources' => 'Kaynaklar',\n        'sources-info' => 'CRM’den kaynakları ekleyin, düzenleyin veya silin',\n        'types' => 'Türler',\n        'types-info' => 'CRM’den türleri ekleyin, düzenleyin veya silin',\n        'automation' => 'Otomasyon',\n        'automation-info' => 'CRM’de tüm otomasyon ayarlarınızı yönetin',\n        'attributes' => 'Nitelikler',\n        'attribute' => 'Nitelik',\n        'attributes-info' => 'CRM’den nitelikleri ekleyin, düzenleyin veya silin',\n        'email-templates' => 'E-posta Şablonları',\n        'email' => 'E-posta',\n        'email-templates-info' => 'CRM’den e-posta şablonları ekleyin, düzenleyin veya silin',\n        'events' => 'Etkinlikler',\n        'events-info' => 'CRM üzerinden etkinlikleri ekleyin, düzenleyin veya silin',\n        'campaigns' => 'Kampanyalar',\n        'campaigns-info' => 'CRM üzerinden kampanyaları ekleyin, düzenleyin veya silin',\n        'workflows' => 'İş Akışları',\n        'workflows-info' => 'CRM’den iş akışlarını ekleyin, düzenleyin veya silin',\n        'webhooks' => 'Webhooklar',\n        'webhooks-info' => 'CRM’den webhookları ekleyin, düzenleyin veya silin',\n        'other-settings' => 'Diğer Ayarlar',\n        'other-settings-info' => 'CRM’de tüm ekstra ayarlarınızı yönetin',\n        'tags' => 'Etiketler',\n        'tags-info' => 'CRM’den etiketleri ekleyin, düzenleyin veya silin',\n        'my-account' => 'Hesabım',\n        'sign-out' => 'Çıkış Yap',\n        'back' => 'Geri',\n        'name' => 'Ad',\n        'configuration' => 'Yapılandırma',\n        'howdy' => 'Merhaba!',\n        'warehouses' => 'Depolar',\n        'warehouse' => 'Depo',\n        'warehouses-info' => 'CRM’den depoları ekleyin, düzenleyin veya silin',\n        'data_transfer' => 'Veri Transferi',\n        'data_transfer_info' => 'CRM’de kişiler, ürünler ve potansiyel müşterilere ilişkin veri transferi ayarlarını yönetin',\n        'inventory' => 'Envanter',\n        'inventory-info' => 'CRM’deki tüm envanter ayarlarını yönetin',\n    ],\n    'user' => [\n        'account' => [\n            'name' => 'İsim',\n            'email' => 'E-posta',\n            'password' => 'Şifre',\n            'my_account' => 'Hesabım',\n            'update_details' => 'Bilgileri Güncelle',\n            'current_password' => 'Mevcut şifre',\n            'confirm_password' => 'Şifreyi onayla',\n            'password-match' => 'Mevcut şifre eşleşmiyor.',\n            'account-save' => 'Hesap değişiklikleri başarıyla kaydedildi.',\n            'permission-denied' => 'İzin Reddedildi',\n            'remove-image' => 'Görseli Kaldır',\n            'upload_image_pix' => 'Profil Görseli Yükle (100px x 100px)',\n            'upload_image_format' => 'PNG veya JPG Formatında',\n            'image_upload_message' => 'Sadece görseller (.jpeg, .jpg, .png, ..) izinlidir.',\n        ],\n    ],\n    'emails' => [\n        'common' => [\n            'dear' => 'Sevgili :name',\n            'cheers' => 'Saygılar,</br>:app_name Ekibi',\n            'user' => [\n                'dear' => 'Sevgili :username',\n                'create-subject' => 'Bir üye olarak eklendiniz.',\n                'create-body' => 'Tebrikler! Artık ekibimizin bir üyesisiniz.',\n                'forget-password' => [\n                    'subject' => 'Müşteri Şifre Sıfırlama',\n                    'dear' => 'Sevgili :username',\n                    'reset-password' => 'Şifreyi Sıfırla',\n                    'info' => 'Bu e-postayı almanız, hesabınız için bir şifre sıfırlama talebi aldığımız anlamına gelir',\n                    'final-summary' => 'Eğer şifre sıfırlama talebinde bulunmadıysanız, herhangi bir ek işlem yapmanıza gerek yoktur',\n                    'thanks' => 'Teşekkürler!',\n                ],\n            ],\n        ],\n    ],\n    'validations' => [\n        'message' => [\n            'decimal' => ':attribute ondalıklı bir sayı olmalıdır.',\n        ],\n    ],\n    'errors' => [\n        'dashboard' => 'Kontrol Paneli',\n        'go-back' => 'Geri Dön',\n        'support' => 'Sorun devam ederse, yardım için bize <a href=\":link\" class=\":class\">:email</a> adresinden ulaşın.',\n        '404' => [\n            'description' => 'Oops! Aradığınız sayfa tatilde. Aradığınız şeyi bulamadık gibi görünüyor.',\n            'title' => '404 Sayfa Bulunamadı',\n        ],\n        '401' => [\n            'description' => 'Oops! Bu sayfaya erişim izniniz yok gibi görünüyor. Gerekli yetkilere sahip değilsiniz.',\n            'title' => '401 Yetkisiz',\n        ],\n        '403' => [\n            'description' => 'Oops! Bu sayfa erişime kapalı. Bu içeriği görüntülemek için gerekli izinlere sahip değilsiniz gibi görünüyor.',\n            'title' => '403 Yasak',\n        ],\n        '500' => [\n            'description' => 'Oops! Bir şeyler ters gitti. Aradığınız sayfa yüklenirken sorun yaşıyoruz gibi görünüyor.',\n            'title' => '500 Sunucu Hatası',\n        ],\n        '503' => [\n            'description' => 'Oops! Görünüşe göre geçici bir bakım nedeniyle kapalıyız. Lütfen kısa süre sonra tekrar kontrol edin.',\n            'title' => '503 Hizmet Kullanılamıyor',\n        ],\n    ],\n    'export' => [\n        'csv' => 'CSV',\n        'download' => 'İndir',\n        'export' => 'Dışa Aktar',\n        'no-records' => 'Dışa aktarılacak kayıt bulunamadı.',\n        'xls' => 'XLS',\n        'xlsx' => 'XLSX',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/lang/vi/app.php",
    "content": "<?php\n\nreturn [\n    'acl' => [\n        'leads' => 'Những Khách hàng tiềm năng',\n        'lead' => 'Khách hàng tiềm năng',\n        'quotes' => 'Báo giá',\n        'mail' => 'Thư',\n        'inbox' => 'Hộp thư đến',\n        'draft' => 'Thư nháp',\n        'outbox' => 'Hộp thư đi',\n        'sent' => 'Đã gửi',\n        'trash' => 'Thùng rác',\n        'activities' => 'Hoạt động',\n        'webhook' => 'Webhook',\n        'contacts' => 'Danh bạ',\n        'persons' => 'Cá nhân',\n        'organizations' => 'Tổ chức',\n        'products' => 'Sản phẩm',\n        'settings' => 'Cài đặt',\n        'groups' => 'Nhóm',\n        'roles' => 'Vai trò',\n        'users' => 'Người dùng',\n        'user' => 'Người dùng',\n        'automation' => 'Tự động hóa',\n        'attributes' => 'Thuộc tính',\n        'pipelines' => 'Quy trình',\n        'sources' => 'Nguồn',\n        'types' => 'Loại',\n        'email-templates' => 'Mẫu email',\n        'workflows' => 'Quy trình làm việc',\n        'other-settings' => 'Cài đặt khác',\n        'tags' => 'Thẻ',\n        'configuration' => 'Cấu hình',\n        'create' => 'Tạo mới',\n        'edit' => 'Chỉnh sửa',\n        'view' => 'Xem',\n        'print' => 'In',\n        'delete' => 'Xóa',\n        'export' => 'Xuất khẩu',\n        'mass-delete' => 'Xóa hàng loạt',\n        'data-transfer' => 'Data Transfer',\n        'imports' => 'Imports',\n        'import' => 'Import',\n        'event' => 'Sự kiện',\n        'campaigns' => 'Chiến dịch',\n        'warehouses' => 'Kho',\n        'inventory' => 'Hàng tồn kho',\n    ],\n    'users' => [\n        'activate-warning' => 'Tài khoản của bạn chưa được kích hoạt. Vui lòng liên hệ quản trị viên.',\n        'login-error' => 'Thông tin đăng nhập không khớp với hồ sơ của chúng tôi.',\n        'not-permission' => 'Bạn không có quyền truy cập vào bảng quản trị.',\n        'login' => [\n            'email' => 'Địa chỉ Email',\n            'forget-password-link' => 'Quên Mật khẩu?',\n            'password' => 'Mật khẩu',\n            'submit-btn' => 'Đăng Nhập',\n            'title' => 'Đăng Nhập',\n        ],\n        'forget-password' => [\n            'create' => [\n                'email' => 'Email Đã Đăng Ký',\n                'email-not-exist' => 'Email Không Tồn Tại',\n                'page-title' => 'Quên Mật khẩu',\n                'reset-link-sent' => 'Liên kết đặt lại mật khẩu đã được gửi',\n                'sign-in-link' => 'Quay lại Đăng Nhập?',\n                'submit-btn' => 'Đặt Lại',\n                'title' => 'Khôi Phục Mật khẩu',\n            ],\n        ],\n        'reset-password' => [\n            'back-link-title' => 'Quay lại Đăng Nhập?',\n            'confirm-password' => 'Xác Nhận Mật Khẩu',\n            'email' => 'Email Đã Đăng Ký',\n            'password' => 'Mật Khẩu',\n            'submit-btn' => 'Đặt Lại Mật Khẩu',\n            'title' => 'Đặt Lại Mật Khẩu',\n        ],\n    ],\n    'account' => [\n        'edit' => [\n            'back-btn' => 'Quay Lại',\n            'change-password' => 'Đổi Mật Khẩu',\n            'confirm-password' => 'Xác Nhận Mật Khẩu',\n            'current-password' => 'Mật Khẩu Hiện Tại',\n            'email' => 'Email',\n            'general' => 'Chung',\n            'invalid-password' => 'Mật khẩu hiện tại bạn nhập không đúng.',\n            'name' => 'Tên',\n            'password' => 'Mật Khẩu',\n            'profile-image' => 'Ảnh Hồ Sơ',\n            'save-btn' => 'Lưu Tài Khoản',\n            'title' => 'Tài Khoản Của Tôi',\n            'update-success' => 'Tài khoản đã được cập nhật thành công',\n            'upload-image-info' => 'Tải lên Ảnh Hồ Sơ (110px X 110px) ở định dạng PNG hoặc JPG',\n        ],\n    ],\n    'components' => [\n        'activities' => [\n            'actions' => [\n                'mail' => [\n                    'btn' => 'Thư',\n                    'title' => 'Soạn thư',\n                    'to' => 'Tới',\n                    'enter-emails' => 'Nhấn enter để thêm email',\n                    'cc' => 'CC',\n                    'bcc' => 'BCC',\n                    'subject' => 'Chủ đề',\n                    'send-btn' => 'Gửi',\n                    'message' => 'Tin nhắn',\n                ],\n                'file' => [\n                    'btn' => 'Tệp',\n                    'title' => 'Thêm tệp',\n                    'title-control' => 'Tiêu đề',\n                    'name' => 'Tên',\n                    'description' => 'Mô tả',\n                    'file' => 'Tệp',\n                    'save-btn' => 'Lưu tệp',\n                ],\n                'note' => [\n                    'btn' => 'Ghi chú',\n                    'title' => 'Thêm ghi chú',\n                    'comment' => 'Bình luận',\n                    'save-btn' => 'Lưu ghi chú',\n                ],\n                'activity' => [\n                    'btn' => 'Hoạt động',\n                    'title' => 'Thêm hoạt động',\n                    'title-control' => 'Tiêu đề',\n                    'description' => 'Mô tả',\n                    'schedule-from' => 'Lịch từ',\n                    'schedule-to' => 'Lịch đến',\n                    'location' => 'Địa điểm',\n                    'call' => 'Cuộc gọi',\n                    'meeting' => 'Cuộc họp',\n                    'lunch' => 'Bữa trưa',\n                    'save-btn' => 'Lưu hoạt động',\n                    'participants' => [\n                        'title' => 'Người tham gia',\n                        'placeholder' => 'Nhập để tìm kiếm người tham gia',\n                        'users' => 'Người dùng',\n                        'persons' => 'Người',\n                        'no-results' => 'Không có kết quả...',\n                    ],\n                ],\n            ],\n            'index' => [\n                'all' => 'Tất cả',\n                'bcc' => 'Bcc',\n                'by-user' => 'Bởi :user',\n                'calls' => 'Cuộc gọi',\n                'cc' => 'Cc',\n                'change-log' => 'Nhật ký thay đổi',\n                'delete' => 'Xóa',\n                'edit' => 'Chỉnh sửa',\n                'emails' => 'Email',\n                'empty' => 'Trống',\n                'files' => 'Tệp tin',\n                'from' => 'Từ',\n                'location' => 'Địa điểm',\n                'lunches' => 'Bữa trưa',\n                'mark-as-done' => 'Đánh dấu hoàn thành',\n                'meetings' => 'Cuộc họp',\n                'notes' => 'Ghi chú',\n                'participants' => 'Người tham gia',\n                'planned' => 'Đã lên kế hoạch',\n                'quotes' => 'Báo giá',\n                'scheduled-on' => 'Lên lịch vào',\n                'system' => 'Hệ thống',\n                'to' => 'Đến',\n                'unlink' => 'Gỡ liên kết',\n                'view' => 'Xem',\n                'empty-placeholders' => [\n                    'all' => [\n                        'title' => 'Không tìm thấy hoạt động nào',\n                        'description' => 'Không có hoạt động nào được tìm thấy. Bạn có thể thêm hoạt động bằng cách nhấn nút Hoạt động ở bảng bên trái.',\n                    ],\n                    'planned' => [\n                        'title' => 'Không tìm thấy hoạt động đã lên kế hoạch',\n                        'description' => 'Không có hoạt động đã lên kế hoạch nào được tìm thấy. Thêm hoạt động bằng cách nhấn nút Hoạt động ở bảng bên trái.',\n                    ],\n                    'notes' => [\n                        'title' => 'Không tìm thấy ghi chú',\n                        'description' => 'Không có ghi chú nào được tìm thấy. Thêm ghi chú bằng cách nhấn nút Ghi chú ở bảng bên trái.',\n                    ],\n                    'calls' => [\n                        'title' => 'Không tìm thấy cuộc gọi',\n                        'description' => 'Không có cuộc gọi nào được tìm thấy. Thêm cuộc gọi bằng cách nhấn nút Hoạt động và chọn loại Cuộc gọi.',\n                    ],\n                    'meetings' => [\n                        'title' => 'Không tìm thấy cuộc họp',\n                        'description' => 'Không có cuộc họp nào được tìm thấy. Thêm cuộc họp bằng cách nhấn nút Hoạt động và chọn loại Cuộc họp.',\n                    ],\n                    'lunches' => [\n                        'title' => 'Không tìm thấy buổi ăn trưa',\n                        'description' => 'Không có buổi ăn trưa nào được tìm thấy. Thêm ăn trưa bằng cách nhấn nút Hoạt động và chọn loại Ăn trưa.',\n                    ],\n                    'files' => [\n                        'title' => 'Không tìm thấy tệp',\n                        'description' => 'Không có tệp nào được tìm thấy. Thêm tệp bằng cách nhấn nút Tệp ở bảng bên trái.',\n                    ],\n                    'emails' => [\n                        'title' => 'Không tìm thấy email',\n                        'description' => 'Không có email nào được tìm thấy. Thêm email bằng cách nhấn nút Thư ở bảng bên trái.',\n                    ],\n                    'system' => [\n                        'title' => 'Không tìm thấy nhật ký thay đổi',\n                        'description' => 'Không có nhật ký thay đổi nào được tìm thấy.',\n                    ],\n                ],\n            ],\n        ],\n        'media' => [\n            'images' => [\n                'add-image-btn' => 'Thêm hình ảnh',\n                'ai-add-image-btn' => 'Magic AI',\n                'allowed-types' => 'png, jpeg, jpg',\n                'not-allowed-error' => 'Chỉ chấp nhận tệp hình ảnh (.jpeg, .jpg, .png, ..).',\n                'placeholders' => [\n                    'front' => 'Mặt trước',\n                    'next' => 'Kế tiếp',\n                    'size' => 'Kích thước',\n                    'use-cases' => 'Trường hợp sử dụng',\n                    'zoom' => 'Thu phóng',\n                ],\n            ],\n            'videos' => [\n                'add-video-btn' => 'Thêm video',\n                'allowed-types' => 'mp4, webm, mkv',\n                'not-allowed-error' => 'Chỉ chấp nhận tệp video (.mp4, .mov, .ogg ..).',\n            ],\n        ],\n        'datagrid' => [\n            'index' => [\n                'no-records-selected' => 'Chưa có bản ghi nào được chọn.',\n                'must-select-a-mass-action-option' => 'Bạn phải chọn một tùy chọn hành động hàng loạt.',\n                'must-select-a-mass-action' => 'Bạn phải chọn một hành động hàng loạt.',\n            ],\n            'toolbar' => [\n                'length-of' => ':length của',\n                'of' => 'của',\n                'per-page' => 'Mỗi Trang',\n                'results' => ':total Kết quả',\n                'delete' => 'Xóa',\n                'selected' => ':total Mục đã chọn',\n                'mass-actions' => [\n                    'submit' => 'Gửi',\n                    'select-option' => 'Chọn Tùy chọn',\n                    'select-action' => 'Chọn Hành động',\n                ],\n                'filter' => [\n                    'apply-filters-btn' => 'Áp dụng Bộ lọc',\n                    'back-btn' => 'Quay lại',\n                    'create-new-filter' => 'Tạo Bộ lọc Mới',\n                    'custom-filters' => 'Bộ lọc Tùy chỉnh',\n                    'delete-error' => 'Đã xảy ra lỗi khi xóa bộ lọc, vui lòng thử lại.',\n                    'delete-success' => 'Bộ lọc đã được xóa thành công.',\n                    'empty-description' => 'Không có bộ lọc nào được chọn để lưu. Vui lòng chọn bộ lọc để lưu.',\n                    'empty-title' => 'Thêm Bộ lọc để Lưu',\n                    'name' => 'Tên',\n                    'quick-filters' => 'Bộ lọc Nhanh',\n                    'save-btn' => 'Lưu',\n                    'save-filter' => 'Lưu Bộ lọc',\n                    'saved-success' => 'Bộ lọc đã được lưu thành công.',\n                    'selected-filters' => 'Bộ lọc đã chọn',\n                    'title' => 'Bộ lọc',\n                    'update' => 'Cập nhật',\n                    'update-filter' => 'Cập nhật Bộ lọc',\n                    'updated-success' => 'Bộ lọc đã được cập nhật thành công.',\n                ],\n                'search' => [\n                    'title' => 'Tìm kiếm',\n                ],\n            ],\n            'filters' => [\n                'select' => 'Chọn',\n                'title' => 'Bộ lọc',\n                'dropdown' => [\n                    'searchable' => [\n                        'at-least-two-chars' => 'Nhập ít nhất 2 ký tự...',\n                        'no-results' => 'Không tìm thấy kết quả...',\n                    ],\n                ],\n                'custom-filters' => [\n                    'clear-all' => 'Xóa tất cả',\n                    'title' => 'Bộ lọc Tùy chỉnh',\n                ],\n                'boolean-options' => [\n                    'false' => 'Sai',\n                    'true' => 'Đúng',\n                ],\n                'date-options' => [\n                    'last-month' => 'Tháng trước',\n                    'last-six-months' => '6 Tháng trước',\n                    'last-three-months' => '3 Tháng trước',\n                    'this-month' => 'Tháng này',\n                    'this-week' => 'Tuần này',\n                    'this-year' => 'Năm nay',\n                    'today' => 'Hôm nay',\n                    'yesterday' => 'Hôm qua',\n                ],\n            ],\n            'table' => [\n                'actions' => 'Hành động',\n                'no-records-available' => 'Không có Bản ghi nào.',\n            ],\n        ],\n        'modal' => [\n            'confirm' => [\n                'agree-btn' => 'Đồng ý',\n                'disagree-btn' => 'Không đồng ý',\n                'message' => 'Bạn có chắc chắn muốn thực hiện hành động này không?',\n                'title' => 'Bạn có chắc chắn?',\n            ],\n        ],\n        'tags' => [\n            'index' => [\n                'title' => 'Thẻ',\n                'added-tags' => 'Thẻ đã thêm',\n                'save-btn' => 'Lưu Thẻ',\n                'placeholder' => 'Nhập để tìm thẻ',\n                'add-tag' => 'Thêm \":term\"...',\n                'aquarelle-red' => 'Đỏ Aquarelle',\n                'crushed-cashew' => 'Hạt điều nghiền',\n                'beeswax' => 'Sáp ong',\n                'lemon-chiffon' => 'Vàng Chanh',\n                'snow-flurry' => 'Tuyết Bay',\n                'honeydew' => 'Mật Ong',\n            ],\n        ],\n        'layouts' => [\n            'powered-by' => [\n                'description' => 'Được hỗ trợ bởi :krayin, một dự án mã nguồn mở được phát triển bởi :webkul.',\n            ],\n            'header' => [\n                'mega-search' => [\n                    'title' => 'Tìm kiếm Mega',\n                    'tabs' => [\n                        'leads' => 'Khách hàng tiềm năng',\n                        'quotes' => 'Báo giá',\n                        'persons' => 'Người',\n                        'products' => 'Sản phẩm',\n                    ],\n                    'explore-all-products' => 'Khám phá tất cả Sản phẩm',\n                    'explore-all-leads' => 'Khám phá tất cả Khách hàng tiềm năng',\n                    'explore-all-contacts' => 'Khám phá tất cả Liên hệ',\n                    'explore-all-quotes' => 'Khám phá tất cả Báo giá',\n                    'explore-all-matching-products' => 'Khám phá tất cả sản phẩm khớp với \":query\" (:count)',\n                    'explore-all-matching-leads' => 'Khám phá tất cả khách hàng tiềm năng khớp với \":query\" (:count)',\n                    'explore-all-matching-contacts' => 'Khám phá tất cả liên hệ khớp với \":query\" (:count)',\n                    'explore-all-matching-quotes' => 'Khám phá tất cả báo giá khớp với \":query\" (:count)',\n                ],\n            ],\n        ],\n        'attributes' => [\n            'edit' => [\n                'delete' => 'Xóa',\n            ],\n            'lookup' => [\n                'click-to-add' => 'Nhấn để thêm',\n                'search' => 'Tìm kiếm...',\n                'no-result-found' => 'Không tìm thấy kết quả',\n            ],\n        ],\n        'lookup' => [\n            'click-to-add' => 'Nhấn để Thêm',\n            'no-results' => 'Không tìm thấy kết quả',\n            'add-as-new' => 'Thêm như mới',\n            'search' => 'Tìm kiếm...',\n        ],\n        'flash-group' => [\n            'success' => 'Thành công',\n            'error' => 'Lỗi',\n            'warning' => 'Cảnh báo',\n            'info' => 'Thông tin',\n        ],\n        'tiny-mce' => [\n            'http-error' => 'Lỗi HTTP',\n            'invalid-json' => 'Phản hồi JSON không hợp lệ từ máy chủ.',\n            'upload-failed' => 'Tải tệp lên không thành công. Vui lòng thử lại.',\n        ],\n    ],\n    'quotes' => [\n        'index' => [\n            'title' => 'Báo giá',\n            'create-btn' => 'Tạo Báo giá',\n            'create-success' => 'Báo giá đã được tạo thành công.',\n            'update-success' => 'Báo giá đã được cập nhật thành công.',\n            'delete-success' => 'Báo giá đã được xóa thành công.',\n            'delete-failed' => 'Không thể xóa báo giá.',\n            'datagrid' => [\n                'subject' => 'Chủ đề',\n                'sales-person' => 'Nhân viên bán hàng',\n                'expired-at' => 'Hết hạn vào',\n                'created-at' => 'Tạo vào',\n                'person' => 'Người',\n                'subtotal' => 'Tổng phụ',\n                'discount' => 'Giảm giá',\n                'tax' => 'Thuế',\n                'adjustment' => 'Điều chỉnh',\n                'grand-total' => 'Tổng cộng',\n                'edit' => 'Chỉnh sửa',\n                'delete' => 'Xóa',\n                'print' => 'In',\n            ],\n            'pdf' => [\n                'adjustment' => 'Điều chỉnh',\n                'amount' => 'Số tiền',\n                'billing-address' => 'Địa chỉ thanh toán',\n                'date' => 'Ngày',\n                'discount' => 'Giảm giá',\n                'expired-at' => 'Hết hạn vào',\n                'grand-total' => 'Tổng cộng',\n                'person' => 'Người',\n                'price' => 'Giá',\n                'product-name' => 'Tên sản phẩm',\n                'quantity' => 'Số lượng',\n                'quote-id' => 'ID Báo giá',\n                'sales-person' => 'Nhân viên bán hàng',\n                'shipping-address' => 'Địa chỉ giao hàng',\n                'sku' => 'Mã sản phẩm (SKU)',\n                'sub-total' => 'Tổng phụ',\n                'subject' => 'Chủ đề',\n                'tax' => 'Thuế',\n                'title' => 'Báo giá',\n            ],\n        ],\n        'create' => [\n            'title' => 'Tạo Báo giá',\n            'save-btn' => 'Lưu Báo giá',\n            'quote-info' => 'Thông tin Báo giá',\n            'quote-info-info' => 'Nhập thông tin cơ bản của báo giá.',\n            'address-info' => 'Thông tin Địa chỉ',\n            'address-info-info' => 'Thông tin về địa chỉ liên quan đến báo giá.',\n            'quote-items' => 'Mục Báo giá',\n            'search-products' => 'Tìm kiếm Sản phẩm',\n            'link-to-lead' => 'Liên kết tới lead',\n            'quote-item-info' => 'Thêm Yêu cầu Sản phẩm cho báo giá này.',\n            'quote-name' => 'Tên Báo giá',\n            'quantity' => 'Số lượng',\n            'price' => 'Giá',\n            'discount' => 'Giảm giá',\n            'tax' => 'Thuế',\n            'total' => 'Tổng cộng',\n            'amount' => 'Số tiền',\n            'add-item' => '+ Thêm Mục',\n            'sub-total' => 'Tổng phụ (:symbol)',\n            'total-discount' => 'Giảm giá (:symbol)',\n            'total-tax' => 'Thuế (:symbol)',\n            'total-adjustment' => 'Điều chỉnh (:symbol)',\n            'grand-total' => 'Tổng cộng (:symbol)',\n            'discount-amount' => 'Số tiền giảm giá',\n            'tax-amount' => 'Số tiền thuế',\n            'adjustment-amount' => 'Số tiền điều chỉnh',\n            'product-name' => 'Tên Sản phẩm',\n            'action' => 'Hành động',\n        ],\n        'edit' => [\n            'title' => 'Chỉnh sửa Báo giá',\n            'save-btn' => 'Lưu Báo giá',\n            'quote-info' => 'Thông tin Báo giá',\n            'quote-info-info' => 'Nhập thông tin cơ bản của báo giá.',\n            'address-info' => 'Thông tin Địa chỉ',\n            'address-info-info' => 'Thông tin về địa chỉ liên quan đến báo giá.',\n            'quote-items' => 'Mục Báo giá',\n            'link-to-lead' => 'Liên kết tới lead',\n            'quote-item-info' => 'Thêm Yêu cầu Sản phẩm cho báo giá này.',\n            'quote-name' => 'Tên Báo giá',\n            'quantity' => 'Số lượng',\n            'price' => 'Giá',\n            'search-products' => 'Tìm kiếm Sản phẩm',\n            'discount' => 'Giảm giá',\n            'tax' => 'Thuế',\n            'total' => 'Tổng cộng',\n            'amount' => 'Số tiền',\n            'add-item' => '+ Thêm Mục',\n            'sub-total' => 'Tổng phụ (:symbol)',\n            'total-discount' => 'Giảm giá (:symbol)',\n            'total-tax' => 'Thuế (:symbol)',\n            'total-adjustment' => 'Điều chỉnh (:symbol)',\n            'grand-total' => 'Tổng cộng (:symbol)',\n            'discount-amount' => 'Số tiền giảm giá',\n            'tax-amount' => 'Số tiền thuế',\n            'adjustment-amount' => 'Số tiền điều chỉnh',\n            'product-name' => 'Tên Sản phẩm',\n            'action' => 'Hành động',\n        ],\n    ],\n    'contacts' => [\n        'persons' => [\n            'index' => [\n                'title' => 'Người',\n                'create-btn' => 'Tạo Người',\n                'create-success' => 'Người đã được tạo thành công.',\n                'update-success' => 'Người đã được cập nhật thành công.',\n                'all-delete-success' => 'Tất cả người được chọn đã được xóa thành công.',\n                'partial-delete-warning' => 'Một số người đã được xóa thành công. Những người khác không thể xóa vì có liên kết với khách hàng tiềm năng.',\n                'none-delete-warning' => 'Không thể xóa bất kỳ người nào được chọn vì họ có liên kết với khách hàng tiềm năng.',\n                'no-selection' => 'Chưa chọn người nào để xóa.',\n                'delete-failed' => 'Xóa người được chọn không thành công.',\n                'datagrid' => [\n                    'contact-numbers' => 'Số Liên hệ',\n                    'delete' => 'Xóa',\n                    'edit' => 'Chỉnh sửa',\n                    'emails' => 'Email',\n                    'id' => 'ID',\n                    'view' => 'Xem',\n                    'name' => 'Tên',\n                    'organization-name' => 'Tên Tổ chức',\n                ],\n            ],\n            'view' => [\n                'title' => ':name',\n                'about-person' => 'Thông tin về Người',\n                'about-organization' => 'Thông tin về Tổ chức',\n                'activities' => [\n                    'index' => [\n                        'all' => 'Tất cả',\n                        'calls' => 'Cuộc gọi',\n                        'meetings' => 'Cuộc họp',\n                        'lunches' => 'Bữa trưa',\n                        'files' => 'Tệp',\n                        'quotes' => 'Báo giá',\n                        'notes' => 'Ghi chú',\n                        'emails' => 'Email',\n                        'by-user' => 'Bởi :user',\n                        'scheduled-on' => 'Đã lên lịch vào',\n                        'location' => 'Vị trí',\n                        'participants' => 'Người tham gia',\n                        'mark-as-done' => 'Đánh dấu là Đã hoàn thành',\n                        'delete' => 'Xóa',\n                        'edit' => 'Chỉnh sửa',\n                    ],\n                    'actions' => [\n                        'mail' => [\n                            'btn' => 'Mail',\n                            'title' => 'Soạn Mail',\n                            'to' => 'Đến',\n                            'cc' => 'CC',\n                            'bcc' => 'BCC',\n                            'subject' => 'Chủ đề',\n                            'send-btn' => 'Gửi',\n                            'message' => 'Tin nhắn',\n                        ],\n                        'file' => [\n                            'btn' => 'Tệp',\n                            'title' => 'Thêm Tệp',\n                            'title-control' => 'Tiêu đề',\n                            'name' => 'Tên Tệp',\n                            'description' => 'Mô tả',\n                            'file' => 'Tệp',\n                            'save-btn' => 'Lưu Tệp',\n                        ],\n                        'note' => [\n                            'btn' => 'Ghi chú',\n                            'title' => 'Thêm Ghi chú',\n                            'comment' => 'Bình luận',\n                            'save-btn' => 'Lưu Ghi chú',\n                        ],\n                        'activity' => [\n                            'btn' => 'Hoạt động',\n                            'title' => 'Thêm Hoạt động',\n                            'title-control' => 'Tiêu đề',\n                            'description' => 'Mô tả',\n                            'schedule-from' => 'Lên lịch từ',\n                            'schedule-to' => 'Lên lịch đến',\n                            'location' => 'Vị trí',\n                            'call' => 'Cuộc gọi',\n                            'meeting' => 'Cuộc họp',\n                            'lunch' => 'Bữa trưa',\n                            'save-btn' => 'Lưu Hoạt động',\n                        ],\n                    ],\n                ],\n                'tags' => [\n                    'create-success' => 'Thẻ được tạo thành công.',\n                    'destroy-success' => 'Thẻ đã được xóa thành công.',\n                ],\n            ],\n            'create' => [\n                'title' => 'Tạo Người',\n                'save-btn' => 'Lưu Người',\n            ],\n            'edit' => [\n                'title' => 'Chỉnh sửa Người',\n                'save-btn' => 'Lưu Người',\n            ],\n        ],\n        'organizations' => [\n            'index' => [\n                'title' => 'Tổ chức',\n                'create-btn' => 'Tạo Tổ chức',\n                'create-success' => 'Tổ chức đã được tạo thành công.',\n                'update-success' => 'Tổ chức đã được cập nhật thành công.',\n                'delete-success' => 'Tổ chức đã được xóa thành công.',\n                'delete-failed' => 'Không thể xóa tổ chức.',\n                'datagrid' => [\n                    'delete' => 'Xóa',\n                    'edit' => 'Chỉnh sửa',\n                    'id' => 'ID',\n                    'name' => 'Tên',\n                    'persons-count' => 'Số người',\n                ],\n            ],\n            'create' => [\n                'title' => 'Tạo Tổ chức',\n                'save-btn' => 'Lưu Tổ chức',\n            ],\n            'edit' => [\n                'title' => 'Chỉnh sửa Tổ chức',\n                'save-btn' => 'Lưu Tổ chức',\n            ],\n        ],\n    ],\n    'products' => [\n        'index' => [\n            'title' => 'Sản phẩm',\n            'create-btn' => 'Tạo Sản phẩm',\n            'create-success' => 'Sản phẩm đã được tạo thành công.',\n            'update-success' => 'Sản phẩm đã được cập nhật thành công.',\n            'delete-success' => 'Sản phẩm đã được xóa thành công.',\n            'delete-failed' => 'Không thể xóa sản phẩm.',\n            'datagrid' => [\n                'allocated' => 'Đã phân bổ',\n                'delete' => 'Xóa',\n                'edit' => 'Chỉnh sửa',\n                'id' => 'ID',\n                'in-stock' => 'Có sẵn',\n                'name' => 'Tên',\n                'on-hand' => 'Sẵn có',\n                'tag-name' => 'Tên thẻ',\n                'price' => 'Giá',\n                'sku' => 'SKU',\n                'view' => 'Xem',\n            ],\n        ],\n        'create' => [\n            'save-btn' => 'Lưu Sản phẩm',\n            'title' => 'Tạo Sản phẩm',\n            'general' => 'Thông tin chung',\n            'price' => 'Giá',\n        ],\n        'edit' => [\n            'title' => 'Chỉnh sửa Sản phẩm',\n            'save-btn' => 'Lưu Sản phẩm',\n            'general' => 'Thông tin chung',\n            'price' => 'Giá',\n        ],\n        'view' => [\n            'sku' => 'SKU',\n            'all' => 'Tất cả',\n            'notes' => 'Ghi chú',\n            'files' => 'Tệp',\n            'inventories' => 'Tồn kho',\n            'change-logs' => 'Nhật ký thay đổi',\n            'attributes' => [\n                'about-product' => 'Thông tin về sản phẩm',\n            ],\n            'inventory' => [\n                'source' => 'Nguồn',\n                'in-stock' => 'Có sẵn',\n                'allocated' => 'Đã phân bổ',\n                'on-hand' => 'Sẵn có',\n                'actions' => 'Hành động',\n                'assign' => 'Phân bổ',\n                'add-source' => 'Thêm nguồn',\n                'location' => 'Vị trí',\n                'add-more' => 'Thêm nữa',\n                'save' => 'Lưu',\n            ],\n        ],\n    ],\n    'settings' => [\n        'title' => 'Cài đặt',\n        'groups' => [\n            'index' => [\n                'create-btn' => 'Tạo Nhóm',\n                'title' => 'Nhóm',\n                'create-success' => 'Tạo nhóm thành công.',\n                'update-success' => 'Cập nhật nhóm thành công.',\n                'destroy-success' => 'Xóa nhóm thành công.',\n                'delete-failed' => 'Không thể xóa nhóm.',\n                'delete-failed-associated-users' => 'Không thể xóa nhóm vì đang được sử dụng bởi người dùng.',\n                'datagrid' => [\n                    'delete' => 'Xóa',\n                    'description' => 'Mô tả',\n                    'edit' => 'Chỉnh sửa',\n                    'id' => 'ID',\n                    'name' => 'Tên',\n                ],\n                'edit' => [\n                    'title' => 'Chỉnh sửa Nhóm',\n                ],\n                'create' => [\n                    'name' => 'Tên',\n                    'title' => 'Tạo Nhóm',\n                    'description' => 'Mô tả',\n                    'save-btn' => 'Lưu Nhóm',\n                ],\n            ],\n        ],\n        'roles' => [\n            'index' => [\n                'being-used' => 'Vai trò không thể xóa, vì đang được sử dụng trong người dùng quản trị.',\n                'create-btn' => 'Tạo Vai trò',\n                'create-success' => 'Vai trò đã được tạo thành công.',\n                'current-role-delete-error' => 'Không thể xóa vai trò đã gán cho người dùng hiện tại.',\n                'delete-failed' => 'Không thể xóa vai trò.',\n                'delete-success' => 'Vai trò đã được xóa thành công.',\n                'last-delete-error' => 'Cần ít nhất một vai trò.',\n                'settings' => 'Cài đặt',\n                'title' => 'Vai trò',\n                'update-success' => 'Vai trò đã được cập nhật thành công.',\n                'user-define-error' => 'Không thể xóa vai trò hệ thống.',\n                'datagrid' => [\n                    'all' => 'Tất cả',\n                    'custom' => 'Tùy chỉnh',\n                    'delete' => 'Xóa',\n                    'description' => 'Mô tả',\n                    'edit' => 'Chỉnh sửa',\n                    'id' => 'ID',\n                    'name' => 'Tên',\n                    'permission-type' => 'Loại quyền',\n                ],\n            ],\n            'create' => [\n                'access-control' => 'Kiểm soát truy cập',\n                'all' => 'Tất cả',\n                'back-btn' => 'Quay lại',\n                'custom' => 'Tùy chỉnh',\n                'description' => 'Mô tả',\n                'general' => 'Thông tin chung',\n                'name' => 'Tên',\n                'permissions' => 'Quyền',\n                'save-btn' => 'Lưu Vai trò',\n                'title' => 'Tạo Vai trò',\n            ],\n            'edit' => [\n                'access-control' => 'Kiểm soát truy cập',\n                'all' => 'Tất cả',\n                'back-btn' => 'Quay lại',\n                'custom' => 'Tùy chỉnh',\n                'description' => 'Mô tả',\n                'general' => 'Thông tin chung',\n                'name' => 'Tên',\n                'permissions' => 'Quyền',\n                'save-btn' => 'Lưu Vai trò',\n                'title' => 'Chỉnh sửa Vai trò',\n            ],\n        ],\n        'types' => [\n            'index' => [\n                'create-btn' => 'Tạo Loại',\n                'create-success' => 'Loại đã được tạo thành công.',\n                'delete-failed' => 'Không thể xóa loại.',\n                'delete-success' => 'Loại đã được xóa thành công.',\n                'title' => 'Các Loại',\n                'update-success' => 'Loại đã được cập nhật thành công.',\n                'datagrid' => [\n                    'delete' => 'Xóa',\n                    'description' => 'Mô tả',\n                    'edit' => 'Chỉnh sửa',\n                    'id' => 'ID',\n                    'name' => 'Tên',\n                ],\n                'create' => [\n                    'name' => 'Tên',\n                    'save-btn' => 'Lưu Loại',\n                    'title' => 'Tạo Loại',\n                ],\n                'edit' => [\n                    'title' => 'Chỉnh sửa Loại',\n                ],\n            ],\n        ],\n        'sources' => [\n            'index' => [\n                'title' => 'Nguồn',\n                'create-btn' => 'Tạo Nguồn',\n                'create-success' => 'Tạo nguồn thành công.',\n                'delete-failed' => 'Không thể xóa nguồn.',\n                'delete-success' => 'Xóa nguồn thành công.',\n                'update-success' => 'Cập nhật nguồn thành công.',\n                'delete-failed-associated-leads' => 'Không thể xóa nguồn vì nó đang được liên kết với các khách hàng tiềm năng. Vui lòng hủy liên kết hoặc cập nhật các khách hàng đó trước khi xóa.',\n                'datagrid' => [\n                    'delete' => 'Xóa',\n                    'edit' => 'Chỉnh sửa',\n                    'id' => 'ID',\n                    'name' => 'Tên',\n                ],\n                'create' => [\n                    'name' => 'Tên',\n                    'save-btn' => 'Lưu Nguồn',\n                    'title' => 'Tạo Nguồn',\n                ],\n                'edit' => [\n                    'title' => 'Chỉnh sửa Nguồn',\n                ],\n            ],\n        ],\n        'workflows' => [\n            'index' => [\n                'title' => 'Quy trình',\n                'create-btn' => 'Tạo Quy trình',\n                'create-success' => 'Quy trình đã được tạo thành công.',\n                'update-success' => 'Quy trình đã được cập nhật thành công.',\n                'delete-success' => 'Quy trình đã được xóa thành công.',\n                'delete-failed' => 'Không thể xóa quy trình.',\n                'datagrid' => [\n                    'delete' => 'Xóa',\n                    'description' => 'Mô tả',\n                    'edit' => 'Chỉnh sửa',\n                    'id' => 'ID',\n                    'name' => 'Tên',\n                ],\n            ],\n            'helpers' => [\n                'update-related-leads' => 'Cập nhật các đầu mối liên quan',\n                'send-email-to-sales-owner' => 'Gửi email đến người sở hữu bán hàng',\n                'send-email-to-participants' => 'Gửi email đến các tham gia',\n                'add-webhook' => 'Thêm Webhook',\n                'update-lead' => 'Cập nhật đầu mối',\n                'update-person' => 'Cập nhật người',\n                'send-email-to-person' => 'Gửi email đến người',\n                'add-tag' => 'Thêm Thẻ',\n                'add-note-as-activity' => 'Thêm Ghi chú như Hoạt động',\n                'update-quote' => 'Cập nhật báo giá',\n            ],\n            'create' => [\n                'title' => 'Tạo Quy trình',\n                'event' => 'Sự kiện',\n                'back-btn' => 'Quay lại',\n                'save-btn' => 'Lưu Quy trình',\n                'name' => 'Tên',\n                'basic-details' => 'Thông tin cơ bản',\n                'description' => 'Mô tả',\n                'actions' => 'Hành động',\n                'basic-details-info' => 'Nhập thông tin cơ bản của quy trình.',\n                'event-info' => 'Một sự kiện kích hoạt, kiểm tra, điều kiện và thực hiện các hành động đã được định nghĩa.',\n                'conditions' => 'Điều kiện',\n                'conditions-info' => 'Điều kiện là các quy tắc kiểm tra kịch bản, được kích hoạt trong các dịp cụ thể.',\n                'actions-info' => 'Một hành động không chỉ giảm khối lượng công việc mà còn làm cho tự động hóa CRM dễ dàng hơn.',\n                'value' => 'Giá trị',\n                'condition-type' => 'Loại điều kiện',\n                'all-condition-are-true' => 'Tất cả điều kiện đều đúng',\n                'any-condition-are-true' => 'Bất kỳ điều kiện nào cũng đúng',\n                'add-condition' => 'Thêm Điều kiện',\n                'add-action' => 'Thêm Hành động',\n                'yes' => 'Có',\n                'no' => 'Không',\n                'email' => 'Email',\n                'is-equal-to' => 'Bằng với',\n                'is-not-equal-to' => 'Không bằng với',\n                'equals-or-greater-than' => 'Bằng hoặc lớn hơn',\n                'equals-or-less-than' => 'Bằng hoặc nhỏ hơn',\n                'greater-than' => 'Lớn hơn',\n                'less-than' => 'Nhỏ hơn',\n                'type' => 'Loại',\n                'contain' => 'Chứa',\n                'contains' => 'Chứa',\n                'does-not-contain' => 'Không chứa',\n            ],\n            'edit' => [\n                'title' => 'Chỉnh sửa Quy trình',\n                'event' => 'Sự kiện',\n                'back-btn' => 'Quay lại',\n                'save-btn' => 'Lưu Quy trình',\n                'name' => 'Tên',\n                'basic-details' => 'Thông tin cơ bản',\n                'description' => 'Mô tả',\n                'actions' => 'Hành động',\n                'type' => 'Loại',\n                'basic-details-info' => 'Nhập thông tin cơ bản của quy trình.',\n                'event-info' => 'Một sự kiện kích hoạt, kiểm tra, điều kiện và thực hiện các hành động đã được định nghĩa.',\n                'conditions' => 'Điều kiện',\n                'conditions-info' => 'Điều kiện là các quy tắc kiểm tra kịch bản, được kích hoạt trong các dịp cụ thể.',\n                'actions-info' => 'Một hành động không chỉ giảm khối lượng công việc mà còn làm cho tự động hóa CRM dễ dàng hơn.',\n                'value' => 'Giá trị',\n                'condition-type' => 'Loại điều kiện',\n                'all-condition-are-true' => 'Tất cả điều kiện đều đúng',\n                'any-condition-are-true' => 'Bất kỳ điều kiện nào cũng đúng',\n                'add-condition' => 'Thêm Điều kiện',\n                'add-action' => 'Thêm Hành động',\n                'yes' => 'Có',\n                'no' => 'Không',\n                'email' => 'Email',\n                'is-equal-to' => 'Bằng với',\n                'is-not-equal-to' => 'Không bằng với',\n                'equals-or-greater-than' => 'Bằng hoặc lớn hơn',\n                'equals-or-less-than' => 'Bằng hoặc nhỏ hơn',\n                'greater-than' => 'Lớn hơn',\n                'less-than' => 'Nhỏ hơn',\n                'contain' => 'Chứa',\n                'contains' => 'Chứa',\n                'does-not-contain' => 'Không chứa',\n            ],\n        ],\n        'webforms' => [\n            'index' => [\n                'title' => 'Biểu mẫu Web',\n                'create-btn' => 'Tạo Biểu mẫu Web',\n                'create-success' => 'Biểu mẫu Web đã được tạo thành công.',\n                'update-success' => 'Biểu mẫu Web đã được cập nhật thành công.',\n                'delete-success' => 'Biểu mẫu Web đã được xóa thành công.',\n                'delete-failed' => 'Biểu mẫu Web không thể bị xóa.',\n                'datagrid' => [\n                    'id' => 'ID',\n                    'title' => 'Tiêu đề',\n                    'edit' => 'Chỉnh sửa',\n                    'delete' => 'Xóa',\n                ],\n            ],\n            'create' => [\n                'title' => 'Tạo Biểu mẫu Web',\n                'add-attribute-btn' => 'Thêm Nút Thuộc Tính',\n                'attribute-label-color' => 'Màu Nhãn Thuộc Tính',\n                'attributes' => 'Thuộc Tính',\n                'attributes-info' => 'Thêm các thuộc tính tùy chỉnh vào biểu mẫu.',\n                'background-color' => 'Màu Nền',\n                'create-lead' => 'Tạo Dẫn Dắt',\n                'customize-webform' => 'Tùy Chỉnh Biểu Mẫu Web',\n                'customize-webform-info' => 'Tùy chỉnh biểu mẫu web của bạn với màu sắc của các phần tử theo lựa chọn của bạn.',\n                'description' => 'Mô tả',\n                'display-custom-message' => 'Hiển thị thông điệp tùy chỉnh',\n                'form-background-color' => 'Màu Nền Biểu Mẫu',\n                'form-submit-btn-color' => 'Màu Nút Gửi Biểu Mẫu',\n                'form-submit-button-color' => 'Màu Nút Gửi Biểu Mẫu',\n                'form-title-color' => 'Màu Tiêu Đề Biểu Mẫu',\n                'general' => 'Chung',\n                'leads' => 'Dẫn Dắt',\n                'person' => 'Người',\n                'save-btn' => 'Lưu Biểu Mẫu Web',\n                'submit-button-label' => 'Nhãn Nút Gửi',\n                'submit-success-action' => 'Hành Động Thành Công Khi Gửi',\n                'redirect-to-url' => 'Chuyển Hướng Đến URL',\n                'choose-value' => 'Chọn Giá Trị',\n                'select-file' => 'Chọn Tập Tin',\n                'select-image' => 'Chọn Hình Ảnh',\n                'enter-value' => 'Nhập Giá Trị',\n            ],\n            'edit' => [\n                'add-attribute-btn' => 'Thêm Nút Thuộc Tính',\n                'attribute-label-color' => 'Màu Nhãn Thuộc Tính',\n                'attributes' => 'Thuộc Tính',\n                'attributes-info' => 'Thêm các thuộc tính tùy chỉnh vào biểu mẫu.',\n                'background-color' => 'Màu Nền',\n                'choose-value' => 'Chọn Giá Trị',\n                'code-snippet' => 'Mã Snippet',\n                'copied' => 'Đã Sao Chép',\n                'copy' => 'Sao Chép',\n                'create-lead' => 'Tạo Dẫn Dắt',\n                'customize-webform' => 'Tùy Chỉnh Biểu Mẫu Web',\n                'customize-webform-info' => 'Tùy chỉnh biểu mẫu web của bạn với màu sắc của các phần tử theo lựa chọn của bạn.',\n                'description' => 'Mô tả',\n                'display-custom-message' => 'Hiển thị thông điệp tùy chỉnh',\n                'embed' => 'Nhúng',\n                'enter-value' => 'Nhập Giá Trị',\n                'form-background-color' => 'Màu Nền Biểu Mẫu',\n                'form-submit-btn-color' => 'Màu Nút Gửi Biểu Mẫu',\n                'form-submit-button-color' => 'Màu Nút Gửi Biểu Mẫu',\n                'form-title-color' => 'Màu Tiêu Đề Biểu Mẫu',\n                'general' => 'Chung',\n                'leads' => 'Dẫn Dắt',\n                'person' => 'Người',\n                'preview' => 'Xem Trước',\n                'public-url' => 'URL Công Khai',\n                'redirect-to-url' => 'Chuyển Hướng Đến URL',\n                'save-btn' => 'Lưu Biểu Mẫu Web',\n                'select-file' => 'Chọn Tập Tin',\n                'select-image' => 'Chọn Hình Ảnh',\n                'submit-button-label' => 'Nhãn Nút Gửi',\n                'submit-success-action' => 'Hành Động Thành Công Khi Gửi',\n                'title' => 'Chỉnh Sửa Biểu Mẫu Web',\n            ],\n        ],\n        'email-template' => [\n            'index' => [\n                'create-btn' => 'Tạo Mẫu Email',\n                'title' => 'Mẫu Email',\n                'create-success' => 'Mẫu Email đã được tạo thành công.',\n                'update-success' => 'Mẫu Email đã được cập nhật thành công.',\n                'delete-success' => 'Mẫu Email đã được xóa thành công.',\n                'delete-failed' => 'Mẫu Email không thể bị xóa.',\n                'datagrid' => [\n                    'delete' => 'Xóa',\n                    'edit' => 'Chỉnh sửa',\n                    'id' => 'ID',\n                    'name' => 'Tên',\n                    'subject' => 'Chủ đề',\n                ],\n            ],\n            'create' => [\n                'title' => 'Tạo Mẫu Email',\n                'save-btn' => 'Lưu Mẫu Email',\n                'email-template' => 'Mẫu Email',\n                'subject' => 'Chủ đề',\n                'content' => 'Nội dung',\n                'subject-placeholders' => 'Biến thể Chủ đề',\n                'general' => 'Chung',\n                'name' => 'Tên',\n            ],\n            'edit' => [\n                'title' => 'Chỉnh Sửa Mẫu Email',\n                'save-btn' => 'Lưu Mẫu Email',\n                'email-template' => 'Mẫu Email',\n                'subject' => 'Chủ đề',\n                'content' => 'Nội dung',\n                'subject-placeholders' => 'Biến thể Chủ đề',\n                'general' => 'Chung',\n                'name' => 'Tên',\n            ],\n        ],\n        'marketing' => [\n            'events' => [\n                'index' => [\n                    'create-btn' => 'Tạo Sự kiện',\n                    'title' => 'Sự kiện',\n                    'create-success' => 'Sự kiện đã được tạo thành công.',\n                    'update-success' => 'Sự kiện đã được cập nhật thành công.',\n                    'delete-success' => 'Sự kiện đã được xóa thành công.',\n                    'delete-failed' => 'Không thể xóa sự kiện.',\n                    'mass-delete-success' => 'Các sự kiện đã được xóa thành công',\n                    'delete-failed-associated-campaigns' => 'Không thể xóa sự kiện vì nó đang được liên kết với các chiến dịch. Vui lòng hủy liên kết hoặc cập nhật các chiến dịch đó trước khi xóa.',\n                    'datagrid' => [\n                        'delete' => 'Xóa',\n                        'edit' => 'Chỉnh sửa',\n                        'id' => 'ID',\n                        'name' => 'Tên',\n                        'description' => 'Mô tả',\n                        'date' => 'Ngày',\n                    ],\n                    'create' => [\n                        'title' => 'Tạo Sự kiện',\n                        'name' => 'Tên',\n                        'date' => 'Ngày',\n                        'description' => 'Mô tả',\n                        'save-btn' => 'Lưu Sự kiện',\n                    ],\n                    'edit' => [\n                        'title' => 'Chỉnh sửa Sự kiện',\n                    ],\n                ],\n            ],\n            'campaigns' => [\n                'index' => [\n                    'create-btn' => 'Tạo Chiến dịch',\n                    'title' => 'Chiến dịch',\n                    'create-success' => 'Chiến dịch đã được tạo thành công.',\n                    'update-success' => 'Chiến dịch đã được cập nhật thành công.',\n                    'delete-success' => 'Chiến dịch đã được xóa thành công.',\n                    'delete-failed' => 'Không thể xóa chiến dịch.',\n                    'mass-delete-success' => 'Các chiến dịch đã được xóa thành công',\n                    'datagrid' => [\n                        'id' => 'ID',\n                        'name' => 'Tên',\n                        'subject' => 'Chủ đề',\n                        'status' => 'Trạng thái',\n                        'active' => 'Kích hoạt',\n                        'inactive' => 'Không kích hoạt',\n                        'edit' => 'Chỉnh sửa',\n                        'delete' => 'Xóa',\n                    ],\n                    'create' => [\n                        'title' => 'Tạo Chiến dịch',\n                        'name' => 'Tên',\n                        'type' => 'Loại',\n                        'subject' => 'Chủ đề',\n                        'event' => 'Sự kiện',\n                        'email-template' => 'Mẫu Email',\n                        'status' => 'Trạng thái',\n                    ],\n                    'edit' => [\n                        'title' => 'Chỉnh sửa Chiến dịch',\n                    ],\n                ],\n            ],\n        ],\n        'tags' => [\n            'index' => [\n                'create-btn' => 'Tạo Thẻ',\n                'title' => 'Thẻ',\n                'create-success' => 'Thẻ đã được tạo thành công.',\n                'update-success' => 'Thẻ đã được cập nhật thành công.',\n                'delete-success' => 'Thẻ đã được xóa thành công.',\n                'delete-failed' => 'Thẻ không thể bị xóa.',\n                'datagrid' => [\n                    'delete' => 'Xóa',\n                    'edit' => 'Chỉnh sửa',\n                    'id' => 'ID',\n                    'name' => 'Tên',\n                    'users' => 'Người dùng',\n                    'created-at' => 'Ngày tạo',\n                ],\n                'create' => [\n                    'name' => 'Tên',\n                    'save-btn' => 'Lưu Thẻ',\n                    'title' => 'Tạo Thẻ',\n                    'color' => 'Màu sắc',\n                ],\n                'edit' => [\n                    'title' => 'Chỉnh Sửa Thẻ',\n                ],\n            ],\n        ],\n        'users' => [\n            'index' => [\n                'create-btn' => 'Tạo Người Dùng',\n                'create-success' => 'Người dùng đã được tạo thành công.',\n                'delete-failed' => 'Người dùng không thể bị xóa.',\n                'delete-success' => 'Người dùng đã được xóa thành công.',\n                'last-delete-error' => 'Cần ít nhất một người dùng.',\n                'mass-delete-failed' => 'Người dùng không thể bị xóa.',\n                'mass-delete-success' => 'Người dùng đã được xóa thành công.',\n                'mass-update-failed' => 'Người dùng không thể được cập nhật.',\n                'mass-update-success' => 'Người dùng đã được cập nhật thành công.',\n                'title' => 'Người Dùng',\n                'update-success' => 'Người dùng đã được cập nhật thành công.',\n                'user-define-error' => 'Không thể xóa người dùng hệ thống.',\n                'active' => 'Kích hoạt',\n                'inactive' => 'Không kích hoạt',\n                'datagrid' => [\n                    'active' => 'Kích hoạt',\n                    'created-at' => 'Ngày tạo',\n                    'delete' => 'Xóa',\n                    'edit' => 'Chỉnh sửa',\n                    'email' => 'Email',\n                    'id' => 'ID',\n                    'inactive' => 'Không kích hoạt',\n                    'name' => 'Tên',\n                    'status' => 'Trạng thái',\n                    'update-status' => 'Cập nhật Trạng thái',\n                    'users' => 'Người dùng',\n                ],\n                'create' => [\n                    'confirm-password' => 'Xác nhận Mật khẩu',\n                    'email' => 'Email',\n                    'general' => 'Chung',\n                    'global' => 'Toàn cầu',\n                    'group' => 'Nhóm',\n                    'individual' => 'Cá nhân',\n                    'name' => 'Tên',\n                    'password' => 'Mật khẩu',\n                    'permission' => 'Quyền hạn',\n                    'role' => 'Vai trò',\n                    'save-btn' => 'Lưu Người Dùng',\n                    'status' => 'Trạng thái',\n                    'title' => 'Tạo Người Dùng',\n                    'view-permission' => 'Xem Quyền Hạn',\n                    'select-at-lest-one-group' => 'Select at least one group',\n                ],\n                'edit' => [\n                    'title' => 'Chỉnh Sửa Người Dùng',\n                ],\n            ],\n        ],\n        'pipelines' => [\n            'index' => [\n                'title' => 'Quy Trình',\n                'create-btn' => 'Tạo Quy Trình',\n                'create-success' => 'Quy trình đã được tạo thành công.',\n                'update-success' => 'Quy trình đã được cập nhật thành công.',\n                'default-required' => 'Cần ít nhất một pipeline mặc định.',\n                'delete-success' => 'Quy trình đã được xóa thành công.',\n                'delete-failed' => 'Quy trình không thể bị xóa.',\n                'default-delete-error' => 'Quy trình mặc định không thể bị xóa.',\n                'datagrid' => [\n                    'delete' => 'Xóa',\n                    'edit' => 'Chỉnh sửa',\n                    'id' => 'ID',\n                    'is-default' => 'Có phải là mặc định',\n                    'name' => 'Tên',\n                    'no' => 'Không',\n                    'rotten-days' => 'Ngày Hỏng',\n                    'yes' => 'Có',\n                ],\n            ],\n            'create' => [\n                'title' => 'Tạo Quy Trình',\n                'save-btn' => 'Lưu Quy Trình',\n                'name' => 'Tên',\n                'rotten-days' => 'Ngày Hỏng',\n                'mark-as-default' => 'Đánh dấu là Mặc định',\n                'general' => 'Chung',\n                'probability' => 'Xác Suất (%)',\n                'new-stage' => 'Mới',\n                'won-stage' => 'Thắng',\n                'lost-stage' => 'Thua',\n                'stage-btn' => 'Thêm Giai Đoạn',\n                'stages' => 'Các Giai Đoạn',\n                'duplicate-name' => 'Trường \"Tên\" không được trùng lặp',\n                'delete-stage' => 'Xóa Giai Đoạn',\n                'add-new-stages' => 'Thêm Giai Đoạn Mới',\n                'add-stage-info' => 'Thêm giai đoạn mới cho Quy trình của bạn',\n                'newly-added' => 'Mới Thêm',\n                'stage-delete-success' => 'Giai Đoạn đã được xóa thành công',\n            ],\n            'edit' => [\n                'title' => 'Chỉnh Sửa Quy Trình',\n                'save-btn' => 'Lưu Quy Trình',\n                'name' => 'Tên',\n                'rotten-days' => 'Ngày Hỏng',\n                'mark-as-default' => 'Đánh dấu là Mặc định',\n                'general' => 'Chung',\n                'probability' => 'Xác Suất (%)',\n                'new-stage' => 'Mới',\n                'won-stage' => 'Thắng',\n                'lost-stage' => 'Thua',\n                'stage-btn' => 'Thêm Giai Đoạn',\n                'stages' => 'Các Giai Đoạn',\n                'duplicate-name' => 'Trường \"Tên\" không được trùng lặp',\n                'delete-stage' => 'Xóa Giai Đoạn',\n                'add-new-stages' => 'Thêm Giai Đoạn Mới',\n                'add-stage-info' => 'Thêm giai đoạn mới cho Quy trình của bạn',\n                'stage-delete-success' => 'Giai Đoạn đã được xóa thành công',\n            ],\n        ],\n        'webhooks' => [\n            'index' => [\n                'title' => 'Webhooks',\n                'create-btn' => 'Tạo Webhook',\n                'create-success' => 'Webhook đã được tạo thành công.',\n                'update-success' => 'Webhook đã được cập nhật thành công.',\n                'delete-success' => 'Webhook đã được xóa thành công.',\n                'delete-failed' => 'Webhook không thể bị xóa.',\n                'datagrid' => [\n                    'id' => 'ID',\n                    'delete' => 'Xóa',\n                    'edit' => 'Chỉnh sửa',\n                    'name' => 'Tên',\n                    'entity-type' => 'Loại Đối Tượng',\n                    'end-point' => 'Điểm Kết Thúc',\n                ],\n            ],\n            'create' => [\n                'title' => 'Tạo Webhook',\n                'save-btn' => 'Lưu Webhook',\n                'info' => 'Nhập thông tin chi tiết của webhooks',\n                'url-and-parameters' => 'URL Và Tham Số',\n                'method' => 'Phương Thức',\n                'post' => 'Post',\n                'put' => 'Put',\n                'url-endpoint' => 'Điểm Kết Thúc URL',\n                'parameters' => 'Tham Số',\n                'add-new-parameter' => 'Thêm Tham Số Mới',\n                'url-preview' => 'Xem Trước URL:',\n                'headers' => 'Tiêu Đề',\n                'add-new-header' => 'Thêm Tiêu Đề Mới',\n                'body' => 'Nội Dung',\n                'default' => 'Mặc định',\n                'x-www-form-urlencoded' => 'x-www-form-urlencoded',\n                'key-and-value' => 'Khóa và Giá trị',\n                'add-new-payload' => 'Thêm payload mới',\n                'raw' => 'Thô',\n                'general' => 'Chung',\n                'name' => 'Tên',\n                'entity-type' => 'Loại Đối Tượng',\n                'insert-placeholder' => 'Chèn Placeholder',\n                'description' => 'Mô Tả',\n                'json' => 'Json',\n                'text' => 'Văn bản',\n            ],\n            'edit' => [\n                'title' => 'Chỉnh Sửa Webhook',\n                'edit-btn' => 'Lưu Webhook',\n                'save-btn' => 'Lưu Webhook',\n                'info' => 'Nhập thông tin chi tiết của webhooks',\n                'url-and-parameters' => 'URL Và Tham Số',\n                'method' => 'Phương Thức',\n                'post' => 'Post',\n                'put' => 'Put',\n                'url-endpoint' => 'Điểm Kết Thúc URL',\n                'parameters' => 'Tham Số',\n                'add-new-parameter' => 'Thêm Tham Số Mới',\n                'url-preview' => 'Xem Trước URL:',\n                'headers' => 'Tiêu Đề',\n                'add-new-header' => 'Thêm Tiêu Đề Mới',\n                'body' => 'Nội Dung',\n                'default' => 'Mặc định',\n                'x-www-form-urlencoded' => 'x-www-form-urlencoded',\n                'key-and-value' => 'Khóa và Giá trị',\n                'add-new-payload' => 'Thêm payload mới',\n                'raw' => 'Thô',\n                'general' => 'Chung',\n                'name' => 'Tên',\n                'entity-type' => 'Loại Đối Tượng',\n                'insert-placeholder' => 'Chèn Placeholder',\n                'description' => 'Mô Tả',\n                'json' => 'Json',\n                'text' => 'Văn bản',\n            ],\n        ],\n        'warehouses' => [\n            'index' => [\n                'title' => 'Kho Hàng',\n                'create-btn' => 'Tạo Kho Hàng',\n                'create-success' => 'Kho hàng đã được tạo thành công.',\n                'name-exists' => 'Tên kho hàng đã tồn tại.',\n                'update-success' => 'Kho hàng đã được cập nhật thành công.',\n                'delete-success' => 'Kho hàng đã được xóa thành công.',\n                'delete-failed' => 'Kho hàng không thể bị xóa.',\n                'datagrid' => [\n                    'id' => 'ID',\n                    'name' => 'Tên',\n                    'contact-name' => 'Tên Liên Hệ',\n                    'delete' => 'Xóa',\n                    'edit' => 'Chỉnh sửa',\n                    'view' => 'Xem',\n                    'created-at' => 'Ngày Tạo',\n                    'products' => 'Sản Phẩm',\n                    'contact-emails' => 'Email Liên Hệ',\n                    'contact-numbers' => 'Số Điện Thoại Liên Hệ',\n                ],\n            ],\n            'create' => [\n                'title' => 'Tạo Kho Hàng',\n                'save-btn' => 'Lưu Kho Hàng',\n                'contact-info' => 'Thông Tin Liên Hệ',\n            ],\n            'edit' => [\n                'title' => 'Chỉnh Sửa Kho Hàng',\n                'save-btn' => 'Lưu Kho Hàng',\n                'contact-info' => 'Thông Tin Liên Hệ',\n            ],\n            'view' => [\n                'all' => 'Tất Cả',\n                'notes' => 'Ghi Chú',\n                'files' => 'Tệp',\n                'location' => 'Vị Trí',\n                'change-logs' => 'Nhật Ký Thay Đổi',\n                'locations' => [\n                    'action' => 'Hành Động',\n                    'add-location' => 'Thêm Vị Trí',\n                    'create-success' => 'Vị trí đã được tạo thành công.',\n                    'delete' => 'Xóa',\n                    'delete-failed' => 'Vị trí không thể bị xóa.',\n                    'delete-success' => 'Vị trí đã được xóa thành công.',\n                    'name' => 'Tên',\n                    'save-btn' => 'Lưu',\n                ],\n                'general-information' => [\n                    'title' => 'Thông Tin Chung',\n                ],\n                'contact-information' => [\n                    'title' => 'Thông Tin Liên Hệ',\n                ],\n            ],\n        ],\n        'attributes' => [\n            'index' => [\n                'title' => 'Thuộc Tính',\n                'create-btn' => 'Tạo Thuộc Tính',\n                'create-success' => 'Thuộc tính đã được tạo thành công.',\n                'update-success' => 'Thuộc tính đã được cập nhật thành công.',\n                'delete-success' => 'Thuộc tính đã được xóa thành công.',\n                'delete-failed' => 'Không thể xóa thuộc tính.',\n                'user-define-error' => 'Không thể xóa thuộc tính hệ thống.',\n                'mass-delete-failed' => 'Các thuộc tính hệ thống không thể bị xóa.',\n                'datagrid' => [\n                    'yes' => 'Có',\n                    'no' => 'Không',\n                    'id' => 'ID',\n                    'code' => 'Mã',\n                    'name' => 'Tên',\n                    'entity-type' => 'Loại Thực Thể',\n                    'type' => 'Loại',\n                    'is-default' => 'Mặc Định',\n                    'edit' => 'Chỉnh sửa',\n                    'delete' => 'Xóa',\n                    'entity-types' => [\n                        'leads' => 'Khách hàng tiềm năng',\n                        'organizations' => 'Tổ chức',\n                        'persons' => 'Người',\n                        'products' => 'Sản phẩm',\n                        'quotes' => 'Báo giá',\n                        'warehouses' => 'Kho hàng',\n                    ],\n                    'types' => [\n                        'text' => 'Văn bản',\n                        'textarea' => 'Vùng văn bản',\n                        'price' => 'Giá',\n                        'boolean' => 'Boolean',\n                        'select' => 'Chọn',\n                        'multiselect' => 'Chọn nhiều',\n                        'checkbox' => 'Hộp kiểm',\n                        'email' => 'Email',\n                        'address' => 'Địa chỉ',\n                        'phone' => 'Điện thoại',\n                        'lookup' => 'Tìm kiếm',\n                        'datetime' => 'Ngày giờ',\n                        'date' => 'Ngày',\n                        'image' => 'Hình ảnh',\n                        'file' => 'Tệp tin',\n                    ],\n                ],\n            ],\n            'create' => [\n                'title' => 'Tạo Thuộc Tính',\n                'save-btn' => 'Lưu Thuộc Tính',\n                'code' => 'Mã',\n                'name' => 'Tên',\n                'entity-type' => 'Loại Thực Thể',\n                'type' => 'Loại',\n                'validations' => 'Xác Thực',\n                'is-required' => 'Bắt Buộc',\n                'input-validation' => 'Xác Thực Đầu Vào',\n                'is-unique' => 'Là Độc Nhất',\n                'labels' => 'Nhãn',\n                'general' => 'Chung',\n                'numeric' => 'Số',\n                'decimal' => 'Thập Phân',\n                'url' => 'Url',\n                'options' => 'Tùy Chọn',\n                'option-type' => 'Loại Tùy Chọn',\n                'lookup-type' => 'Loại Tra Cứu',\n                'add-option' => 'Thêm Tùy Chọn',\n                'save-option' => 'Lưu Tùy Chọn',\n                'option-name' => 'Tên Tùy Chọn',\n                'add-attribute-options' => 'Thêm Tùy Chọn Thuộc Tính',\n                'text' => 'Văn Bản',\n                'textarea' => 'Khung Văn Bản',\n                'price' => 'Giá',\n                'boolean' => 'Boolean',\n                'select' => 'Chọn',\n                'multiselect' => 'Chọn Nhiều',\n                'email' => 'Email',\n                'address' => 'Địa Chỉ',\n                'phone' => 'Điện Thoại',\n                'datetime' => 'Ngày Giờ',\n                'date' => 'Ngày',\n                'image' => 'Hình Ảnh',\n                'file' => 'Tệp',\n                'lookup' => 'Tra Cứu',\n                'entity_type' => 'Loại thực thể',\n                'checkbox' => 'Hộp Kiểm',\n                'is_required' => 'Bắt Buộc',\n                'is_unique' => 'Là Độc Nhất',\n                'actions' => 'Hành Động',\n            ],\n            'edit' => [\n                'actions' => 'Hành Động',\n                'add-attribute-options' => 'Thêm Tùy Chọn Thuộc Tính',\n                'add-option' => 'Thêm Tùy Chọn',\n                'address' => 'Địa Chỉ',\n                'boolean' => 'Boolean',\n                'checkbox' => 'Hộp Kiểm',\n                'code' => 'Mã',\n                'date' => 'Ngày',\n                'datetime' => 'Ngày Giờ',\n                'decimal' => 'Thập Phân',\n                'email' => 'Email',\n                'entity-type' => 'Loại Thực Thể',\n                'entity_type' => 'Loại thực thể',\n                'file' => 'Tệp',\n                'general' => 'Chung',\n                'image' => 'Hình Ảnh',\n                'input-validation' => 'Xác Thực Đầu Vào',\n                'is-required' => 'Bắt Buộc',\n                'is-unique' => 'Là Độc Nhất',\n                'is_required' => 'Bắt Buộc',\n                'is_unique' => 'Là Độc Nhất',\n                'labels' => 'Nhãn',\n                'lookup' => 'Tra Cứu',\n                'lookup-type' => 'Loại Tra Cứu',\n                'multiselect' => 'Chọn Nhiều',\n                'name' => 'Tên',\n                'numeric' => 'Số',\n                'option-deleted' => 'Attribute Option is deleted successfully',\n                'option-name' => 'Tên Tùy Chọn',\n                'option-type' => 'Loại Tùy Chọn',\n                'options' => 'Tùy Chọn',\n                'phone' => 'Điện Thoại',\n                'price' => 'Giá',\n                'save-btn' => 'Lưu Thuộc Tính',\n                'save-option' => 'Lưu Tùy Chọn',\n                'select' => 'Chọn',\n                'text' => 'Văn Bản',\n                'textarea' => 'Khung Văn Bản',\n                'title' => 'Chỉnh Sửa Thuộc Tính',\n                'type' => 'Loại',\n                'url' => 'Url',\n                'validations' => 'Xác Thực',\n            ],\n        ],\n        'data-transfer' => [\n            'imports' => [\n                'create' => [\n                    'action' => 'Action',\n                    'allowed-errors' => 'Allowed Errors',\n                    'back-btn' => 'Back',\n                    'create-update' => 'Create/Update',\n                    'delete' => 'Delete',\n                    'download-sample' => 'Download Sample',\n                    'field-separator' => 'Field Separator',\n                    'file' => 'File',\n                    'general' => 'General',\n                    'images-directory' => 'Images Directory Path',\n                    'process-in-queue' => 'Process In Queue',\n                    'results' => 'Results',\n                    'save-btn' => 'Save Import',\n                    'settings' => 'Settings',\n                    'skip-errors' => 'Skip Errors',\n                    'stop-on-errors' => 'Stop on Errors',\n                    'title' => 'Create Import',\n                    'type' => 'Type',\n                    'validation-strategy' => 'Validation Strategy',\n                ],\n                'edit' => [\n                    'action' => 'Action',\n                    'allowed-errors' => 'Allowed Errors',\n                    'back-btn' => 'Back',\n                    'create-update' => 'Create/Update',\n                    'delete' => 'Delete',\n                    'download-sample' => 'Download Sample',\n                    'field-separator' => 'Field Separator',\n                    'file' => 'File',\n                    'general' => 'General',\n                    'images-directory' => 'Images Directory Path',\n                    'process-in-queue' => 'Process In Queue',\n                    'results' => 'Results',\n                    'save-btn' => 'Save Import',\n                    'settings' => 'Settings',\n                    'skip-errors' => 'Skip Errors',\n                    'stop-on-errors' => 'Stop on Errors',\n                    'title' => 'Edit Import',\n                    'type' => 'Type',\n                    'validation-strategy' => 'Validation Strategy',\n                ],\n                'index' => [\n                    'button-title' => 'Create Import',\n                    'title' => 'Imports',\n                    'datagrid' => [\n                        'actions' => 'Actions',\n                        'completed-at' => 'Completed At',\n                        'created' => 'Created',\n                        'delete' => 'Delete',\n                        'deleted' => 'Deleted',\n                        'edit' => 'Edit',\n                        'error-file' => 'Error File',\n                        'id' => 'ID',\n                        'started-at' => 'Started At',\n                        'state' => 'State',\n                        'summary' => 'Summary',\n                        'type' => 'Type',\n                        'updated' => 'Updated',\n                        'uploaded-file' => 'Uploaded File',\n                    ],\n                ],\n                'import' => [\n                    'back-btn' => 'Back',\n                    'completed-batches' => 'Total Batches Completed:',\n                    'download-error-report' => 'Download Full Report',\n                    'edit-btn' => 'Edit',\n                    'imported-info' => 'Congratulations! Your import was successful.',\n                    'importing-info' => 'Import In Process',\n                    'indexing-info' => 'Resources Indexing (Price, Inventory and Elastic Search) In Progress',\n                    'linking-info' => 'Resources Linking In Progress',\n                    'progress' => 'Progress:',\n                    'title' => 'Import',\n                    'total-batches' => 'Total Batches:',\n                    'total-created' => 'Total Records Created:',\n                    'total-deleted' => 'Total Records Deleted:',\n                    'total-errors' => 'Total Errors:',\n                    'total-invalid-rows' => 'Total Invalid Rows:',\n                    'total-rows-processed' => 'Total Rows Processed:',\n                    'total-updated' => 'Total Records Updated:',\n                    'validate' => 'Validate',\n                    'validate-info' => 'Click on Validate Data to check your import.',\n                    'validating-info' => 'The data started reading and Validating',\n                    'validation-failed-info' => 'Your import is invalid. Please fix the following errors and try again.',\n                    'validation-success-info' => 'Your import is valid. Click on Import to start the import process.',\n                ],\n                'create-success' => 'Import created successfully.',\n                'delete-failed' => 'Import deletion failed unexpectedly.',\n                'delete-success' => 'Import deleted successfully.',\n                'not-valid' => 'Import is invalid',\n                'nothing-to-import' => 'There are no resources to import.',\n                'setup-queue-error' => 'Please change your queue driver to \"database\" or \"redis\" to start the import process.',\n                'update-success' => 'Import updated successfully.',\n            ],\n        ],\n    ],\n    'activities' => [\n        'index' => [\n            'title' => 'Hoạt Động',\n            'datagrid' => [\n                'comment' => 'Ghi Chú',\n                'created_at' => 'Thời Gian Tạo',\n                'created_by' => 'Người Tạo',\n                'edit' => 'Chỉnh Sửa',\n                'id' => 'ID',\n                'done' => 'Đã Hoàn Thành',\n                'not-done' => 'Chưa Hoàn Thành',\n                'lead' => 'Người Dẫn Dắt',\n                'mass-delete' => 'Xóa Hàng Loạt',\n                'mass-update' => 'Cập Nhật Hàng Loạt',\n                'schedule-from' => 'Lịch Từ',\n                'schedule-to' => 'Lịch Đến',\n                'schedule_from' => 'Lịch Từ',\n                'schedule_to' => 'Lịch Đến',\n                'title' => 'Tiêu Đề',\n                'is_done' => 'Đã Hoàn Thành',\n                'type' => 'Loại',\n                'update' => 'Cập Nhật',\n                'call' => 'Cuộc Gọi',\n                'meeting' => 'Cuộc Họp',\n                'lunch' => 'Bữa Trưa',\n            ],\n        ],\n        'edit' => [\n            'title' => 'Chỉnh Sửa Hoạt Động',\n            'back-btn' => 'Quay Lại',\n            'save-btn' => 'Lưu Hoạt Động',\n            'type' => 'Loại Hoạt Động',\n            'call' => 'Cuộc Gọi',\n            'meeting' => 'Cuộc Họp',\n            'lunch' => 'Bữa Trưa',\n            'schedule_to' => 'Lịch Đến',\n            'schedule_from' => 'Lịch Từ',\n            'location' => 'Địa Điểm',\n            'comment' => 'Ghi Chú',\n            'lead' => 'Người Dẫn Dắt',\n            'participants' => 'Người Tham Gia',\n            'general' => 'Chung',\n            'persons' => 'Người',\n            'no-result-found' => 'Không tìm thấy bản ghi.',\n            'users' => 'Người Dùng',\n        ],\n        'updated' => 'Đã cập nhật :attribute',\n        'created' => 'Đã tạo',\n        'duration-overlapping' => 'Người tham gia có một cuộc họp khác vào thời điểm này. Bạn có muốn tiếp tục không?',\n        'create-success' => 'Hoạt động được tạo thành công.',\n        'update-success' => 'Hoạt động được cập nhật thành công.',\n        'overlapping-error' => 'Người tham gia có một cuộc họp khác vào thời điểm này.',\n        'destroy-success' => 'Hoạt động đã được xóa thành công.',\n        'delete-failed' => 'Không thể xóa hoạt động.',\n        'mass-update-success' => 'Hoạt động được cập nhật thành công.',\n        'mass-destroy-success' => 'Hoạt động đã được xóa thành công.',\n        'mass-delete-failed' => 'Không thể xóa hoạt động.',\n    ],\n    'mail' => [\n        'index' => [\n            'compose' => 'Soạn Thư',\n            'draft' => 'Thư Nháp',\n            'inbox' => 'Hộp Thư Đến',\n            'outbox' => 'Hộp Thư Đi',\n            'sent' => 'Đã Gửi',\n            'trash' => 'Thùng Rác',\n            'compose-mail-btn' => 'Soạn Thư',\n            'btn' => 'Thư',\n            'mail' => [\n                'title' => 'Soạn Thư',\n                'to' => 'Đến',\n                'enter-emails' => 'Nhấn enter để thêm email',\n                'cc' => 'CC',\n                'bcc' => 'BCC',\n                'subject' => 'Chủ Đề',\n                'send-btn' => 'Gửi',\n                'message' => 'Tin Nhắn',\n                'draft' => 'Thư Nháp',\n            ],\n            'datagrid' => [\n                'id' => 'ID',\n                'from' => 'Từ',\n                'to' => 'Đến',\n                'subject' => 'Chủ đề',\n                'tags' => 'Thẻ',\n                'content' => 'Nội dung',\n                'attachments' => 'Tệp đính kèm',\n                'date' => 'Ngày',\n                'move-to-inbox' => 'Di chuyển vào hộp thư đến',\n                'move-to-trash' => 'Đã chuyển vào thùng rác',\n                'edit' => 'Chỉnh sửa',\n                'view' => 'Xem',\n                'delete' => 'Xóa',\n            ],\n        ],\n\n        'create-success' => 'Email đã được gửi thành công.',\n        'update-success' => 'Email đã được cập nhật thành công.',\n        'mass-update-success' => 'Các email đã được cập nhật thành công.',\n        'delete-success' => 'Email đã được xóa thành công.',\n        'delete-failed' => 'Email không thể bị xóa.',\n        'invalid-route' => 'Đường dẫn không hợp lệ cho email.',\n        'unauthorized' => 'Hành động này không được phép.',\n\n        'view' => [\n            'title' => 'Thư',\n            'subject' => ':subject',\n            'link-mail' => 'Liên Kết Thư',\n            'to' => 'Đến',\n            'cc' => 'CC',\n            'bcc' => 'BCC',\n            'reply' => 'Trả Lời',\n            'reply-all' => 'Trả Lời Tất Cả',\n            'forward' => 'Chuyển Tiếp',\n            'delete' => 'Xóa',\n            'enter-mails' => 'Nhập ID email',\n            'rotten-days' => 'Người dẫn dắt đã hỏng trong :days ngày',\n            'search-an-existing-lead' => 'Tìm kiếm người dẫn dắt hiện có',\n            'search-an-existing-contact' => 'Tìm kiếm liên hệ hiện có',\n            'message' => 'Tin Nhắn',\n            'add-attachments' => 'Thêm Tệp Đính Kèm',\n            'discard' => 'Bỏ Qua',\n            'send' => 'Gửi',\n            'no-result-found' => 'Không tìm thấy kết quả',\n            'add-new-contact' => 'Thêm Liên Hệ Mới',\n            'description' => 'Mô Tả',\n            'search' => 'Tìm kiếm...',\n            'add-new-lead' => 'Thêm Người Dẫn Dắt Mới',\n            'create-new-contact' => 'Tạo Liên Hệ Mới',\n            'save-contact' => 'Lưu Liên Hệ',\n            'create-lead' => 'Tạo Người Dẫn Dắt',\n            'linked-contact' => 'Liên Hệ Đã Liên Kết',\n            'link-to-contact' => 'Liên Kết Với Liên Hệ',\n            'link-to-lead' => 'Liên Kết Với Người Dẫn Dắt',\n            'linked-lead' => 'Người Dẫn Dắt Đã Liên Kết',\n            'lead-details' => 'Chi Tiết Người Dẫn Dắt',\n            'contact-person' => 'Người Liên Hệ',\n            'product' => 'Sản Phẩm',\n            'tags' => [\n                'create-success' => 'Thẻ đã được tạo thành công.',\n                'destroy-success' => 'Thẻ đã được xóa thành công.',\n            ],\n        ],\n    ],\n    'common' => [\n        'custom-attributes' => [\n            'add-more' => 'Thêm Nữa',\n            'address' => 'Địa Chỉ',\n            'city' => 'Thành Phố',\n            'contact' => 'Số Liên Lạc',\n            'country' => 'Quốc Gia',\n            'email' => 'Email',\n            'home' => 'Nhà',\n            'postcode' => 'Mã Bưu Chính',\n            'save' => 'Lưu',\n            'select' => 'Chọn',\n            'select-country' => 'Chọn Quốc Gia',\n            'select-state' => 'Chọn Bang',\n            'state' => 'Bang',\n            'update-contact-title' => 'Cập Nhật Số Liên Lạc',\n            'update-emails-title' => 'Cập Nhật Email Liên Hệ',\n            'work' => 'Công Việc',\n        ],\n    ],\n    'leads' => [\n        'create-success' => 'Tạo khách hàng tiềm năng thành công.',\n        'update-success' => 'Cập nhật khách hàng tiềm năng thành công.',\n        'update-failed' => 'Leads can not be deleted.',\n        'destroy-success' => 'Xóa khách hàng tiềm năng thành công.',\n        'destroy-failed' => 'Không thể xóa khách hàng tiềm năng.',\n        'file' => [\n            'data-not-found' => 'Không tìm thấy dữ liệu.',\n            'empty-content' => 'Nội dung PDF trống hoặc không thể trích xuất.',\n            'failed-extract' => 'Không thể trích xuất văn bản từ tệp.',\n            'insufficient-info' => 'Do dữ liệu không đủ, chúng tôi không thể xử lý yêu cầu của bạn vào lúc này.',\n            'invalid-base64' => 'Định dạng base64 không hợp lệ.',\n            'invalid-format' => 'Định dạng JSON không hợp lệ.',\n            'invalid-response' => 'Định dạng phản hồi AI không hợp lệ.',\n            'missing-api-key' => 'Thiếu khóa API hoặc cấu hình mô hình.',\n            'not-found' => 'Không tìm thấy tệp.',\n            'recursive-call' => 'Phát hiện cuộc gọi đệ quy.',\n            'text-generation-failed' => 'Trích xuất văn bản thất bại. Tệp có thể trống hoặc không đọc được.',\n        ],\n        'index' => [\n            'title' => 'Khách Hàng Tiềm Năng',\n            'create-btn' => 'Tạo Khách Hàng Tiềm Năng',\n            'datagrid' => [\n                'id' => 'ID',\n                'sales-person' => 'Nhân Viên Kinh Doanh',\n                'subject' => 'Chủ Đề',\n                'source' => 'Nguồn',\n                'lead-value' => 'Giá Trị Khách Hàng',\n                'lead-type' => 'Loại Khách Hàng',\n                'tag-name' => 'Tên Thẻ',\n                'contact-person' => 'Người Liên Hệ',\n                'stage' => 'Giai Đoạn',\n                'rotten-lead' => 'Khách Hàng Tiềm Năng Hết Hạn',\n                'date-to' => 'Ngày Đến',\n                'created-at' => 'Tạo Vào Lúc',\n                'no' => 'Không',\n                'yes' => 'Có',\n                'delete' => 'Xóa',\n                'mass-delete' => 'Xóa Hàng Loạt',\n                'mass-update' => 'Cập Nhật Hàng Loạt',\n            ],\n            'kanban' => [\n                'rotten-days' => 'Khách hàng tiềm năng đã hết hạn trong :days ngày',\n                'empty-list' => 'Danh sách khách hàng tiềm năng của bạn trống',\n                'empty-list-description' => 'Tạo một khách hàng tiềm năng để tổ chức các mục tiêu của bạn.',\n                'create-lead-btn' => 'Tạo Khách Hàng Tiềm Năng',\n                'columns' => [\n                    'contact-person' => 'Người Liên Hệ',\n                    'id' => 'ID',\n                    'lead-type' => 'Loại Khách Hàng',\n                    'lead-value' => 'Giá Trị Khách Hàng',\n                    'sales-person' => 'Nhân Viên Kinh Doanh',\n                    'source' => 'Nguồn',\n                    'title' => 'Tiêu Đề',\n                    'tags' => 'Thẻ',\n                    'expected-close-date' => 'Ngày Dự Kiến Đóng',\n                    'created-at' => 'Tạo Vào Lúc',\n                ],\n                'toolbar' => [\n                    'search' => [\n                        'title' => 'Tìm kiếm theo tiêu đề',\n                    ],\n                    'filters' => [\n                        'apply-filters' => 'Áp Dụng Bộ Lọc',\n                        'clear-all' => 'Xóa Tất Cả',\n                        'filter' => 'Bộ Lọc',\n                        'filters' => 'Bộ Lọc',\n                        'from' => 'Từ',\n                        'select' => 'Chọn',\n                        'to' => 'Đến',\n                    ],\n                ],\n            ],\n            'view-switcher' => [\n                'all-pipelines' => 'Tất Cả Các Quy Trình',\n                'create-new-pipeline' => 'Tạo Quy Trình Mới',\n            ],\n            'upload' => [\n                'create-lead' => 'Tạo Khách Hàng Tiềm Năng Bằng AI',\n                'file' => 'Tải tệp lên',\n                'file-info' => 'Chỉ chấp nhận các tệp định dạng pdf, bmp, jpg, jpeg, png.',\n                'file-required' => 'Vui lòng chọn ít nhất một tệp hợp lệ để tiếp tục.',\n                'save-btn' => 'Lưu',\n                'upload-file' => 'Tải lên tệp',\n            ],\n        ],\n        'create' => [\n            'title' => 'Tạo Khách Hàng Tiềm Năng',\n            'save-btn' => 'Lưu',\n            'details' => 'Chi Tiết',\n            'details-info' => 'Nhập Thông Tin Cơ Bản Của Khách Hàng Tiềm Năng',\n            'contact-person' => 'Người Liên Hệ',\n            'contact-info' => 'Thông Tin Về Người Liên Hệ',\n            'products' => 'Sản Phẩm',\n            'products-info' => 'Thông Tin Về Sản Phẩm',\n        ],\n        'edit' => [\n            'title' => 'Chỉnh Sửa Khách Hàng Tiềm Năng',\n            'save-btn' => 'Lưu',\n            'details' => 'Chi Tiết',\n            'details-info' => 'Nhập Thông Tin Cơ Bản Của Khách Hàng Tiềm Năng',\n            'contact-person' => 'Người Liên Hệ',\n            'contact-info' => 'Thông Tin Về Người Liên Hệ',\n            'products' => 'Sản Phẩm',\n            'products-info' => 'Thông Tin Về Sản Phẩm',\n        ],\n        'common' => [\n            'contact' => [\n                'name' => 'Tên',\n                'email' => 'Email',\n                'contact-number' => 'Số Liên Lạc',\n                'organization' => 'Tổ Chức',\n            ],\n            'products' => [\n                'product-name' => 'Tên Sản Phẩm',\n                'quantity' => 'Số Lượng',\n                'price' => 'Giá',\n                'amount' => 'Tổng Tiền',\n                'action' => 'Hành Động',\n                'add-more' => 'Thêm Nữa',\n                'total' => 'Tổng Cộng',\n            ],\n        ],\n        'view' => [\n            'title' => 'Khách Hàng Tiềm Năng: :title',\n            'rotten-days' => ':days Ngày',\n            'tabs' => [\n                'description' => 'Mô Tả',\n                'products' => 'Sản Phẩm',\n                'quotes' => 'Báo Giá',\n            ],\n            'attributes' => [\n                'title' => 'Về Khách Hàng Tiềm Năng',\n            ],\n            'quotes' => [\n                'subject' => 'Chủ Đề',\n                'expired-at' => 'Hết Hạn Vào',\n                'sub-total' => 'Tạm Tính',\n                'discount' => 'Giảm Giá',\n                'tax' => 'Thuế',\n                'adjustment' => 'Điều Chỉnh',\n                'grand-total' => 'Tổng Cộng',\n                'delete' => 'Xóa',\n                'edit' => 'Chỉnh Sửa',\n                'download' => 'Tải Xuống',\n                'destroy-success' => 'Xóa báo giá thành công.',\n                'empty-title' => 'Không Có Báo Giá',\n                'empty-info' => 'Không Có Báo Giá Cho Khách Hàng Tiềm Năng Này',\n                'add-btn' => 'Thêm Báo Giá',\n            ],\n            'products' => [\n                'product-name' => 'Tên Sản Phẩm',\n                'quantity' => 'Số Lượng',\n                'price' => 'Giá',\n                'amount' => 'Tổng Tiền',\n                'action' => 'Hành Động',\n                'add-more' => 'Thêm Nữa',\n                'total' => 'Tổng Cộng',\n                'empty-title' => 'Không Có Sản Phẩm',\n                'empty-info' => 'Không Có Sản Phẩm Cho Khách Hàng Tiềm Năng Này',\n                'add-product' => 'Thêm Sản Phẩm',\n            ],\n            'persons' => [\n                'title' => 'Về Người Liên Hệ',\n                'job-title' => ':job_title tại :organization',\n            ],\n            'stages' => [\n                'won' => 'Thắng',\n                'lost' => 'Thua',\n                'need-more-info' => 'Cần Thêm Thông Tin',\n                'closed-at' => 'Đóng Vào',\n                'won-value' => 'Giá Trị Thắng',\n                'lost-reason' => 'Lý Do Thua',\n                'save-btn' => 'Lưu',\n            ],\n            'tags' => [\n                'create-success' => 'Tạo thẻ thành công.',\n                'destroy-success' => 'Xóa thẻ thành công.',\n            ],\n        ],\n    ],\n    'configuration' => [\n        'index' => [\n            'back' => 'Quay lại',\n            'delete' => 'Xóa',\n            'save-btn' => 'Lưu Cấu hình',\n            'save-success' => 'Cấu hình đã được lưu thành công.',\n            'search' => 'Tìm kiếm',\n            'select-country' => 'Chọn Quốc gia',\n            'select-state' => 'Chọn Bang',\n            'title' => 'Cấu hình',\n            'general' => [\n                'title' => 'Chung',\n                'info' => 'Cấu hình chung',\n                'general' => [\n                    'title' => 'Chung',\n                    'info' => 'Cập nhật cài đặt chung của bạn tại đây.',\n                    'locale-settings' => [\n                        'title' => 'Cài đặt ngôn ngữ',\n                        'title-info' => 'Định nghĩa ngôn ngữ được sử dụng trong giao diện người dùng, như tiếng Ả Rập (ar), tiếng Anh (en), tiếng Tây Ban Nha (es), tiếng Ba Tư (fa) và tiếng Thổ Nhĩ Kỳ (tr).',\n                    ],\n                    'admin-logo' => [\n                        'logo-image' => 'Hình ảnh Logo',\n                        'title' => 'Logo Quản trị',\n                        'title-info' => 'Cấu hình hình ảnh logo cho bảng điều khiển quản trị của bạn.',\n                    ],\n                ],\n                'settings' => [\n                    'title' => 'Settings',\n                    'info' => 'Update your settings here.',\n                    'footer' => [\n                        'info' => 'We can configure the powered by section here.',\n                        'powered-by' => 'Powered by text editor',\n                        'title' => 'Powered by Section Configurations',\n                    ],\n                    'menu' => [\n                        'activities' => 'Activities',\n                        'configuration' => 'Configuration',\n                        'contacts' => 'Contacts',\n                        'dashboard' => 'Dashboard',\n                        'draft' => 'Draft',\n                        'inbox' => 'Inbox',\n                        'info' => 'We can configure the menu items name here.',\n                        'leads' => 'Leads',\n                        'mail' => 'Mail',\n                        'organizations' => 'Organizations',\n                        'outbox' => 'Outbox',\n                        'persons' => 'Persons',\n                        'products' => 'Products',\n                        'quotes' => 'Quotes',\n                        'sent' => 'Sent',\n                        'settings' => 'Settings',\n                        'title' => 'Menu Item Configurations',\n                        'trash' => 'Trash',\n                    ],\n                    'menu-color' => [\n                        'brand-color' => 'Brand Color',\n                        'info' => 'We can change the menu items colors here.',\n                        'title' => 'Menu Item Color Configurations',\n                    ],\n                ],\n            ],\n            'email' => [\n                'title' => 'Cài đặt Email',\n                'info' => 'Cấu hình email cho ứng dụng.',\n                'imap' => [\n                    'title' => 'Cài đặt IMAP',\n                    'info' => 'Cấu hình email IMAP để nhận email.',\n                    'account' => [\n                        'title' => 'Tài khoản IMAP',\n                        'title-info' => 'Cấu hình cài đặt tài khoản IMAP của bạn tại đây.',\n                        'host' => 'Máy chủ',\n                        'port' => 'Cổng',\n                        'encryption' => 'Loại mã hóa',\n                        'validate-cert' => 'Xác thực chứng chỉ SSL',\n                        'username' => 'Tên người dùng IMAP',\n                        'password' => 'Mật khẩu IMAP',\n                    ],\n                ],\n            ],\n            'magic-ai' => [\n                'title' => 'Magic AI',\n                'info' => 'Cấu hình Magic AI cho ứng dụng.',\n                'settings' => [\n                    'api-key' => 'Khóa API',\n                    'api-key-info' => 'Nhớ sử dụng khóa API OpenRouter cho mỗi mô hình. Đây là một bước đơn giản để tăng cường bảo mật và hiệu suất.',\n                    'enable' => 'Kích hoạt',\n                    'info' => 'Nâng cao trải nghiệm Magic AI của bạn với Khóa API OpenRouter. Tích hợp ngay bây giờ để có một cuộc phiêu lưu AI liền mạch và cá nhân hóa chỉ dành cho bạn! Dễ dàng tùy chỉnh cài đặt và kiểm soát hành trình AI của bạn.',\n                    'other' => 'Mô hình khác',\n                    'other-model' => 'Đối với các mô hình khác, sử dụng ID Mô hình từ OpenRouter.',\n                    'doc-generation' => 'Tạo DOC',\n                    'doc-generation-info' => 'Bật tính năng Tạo DOC để tự động trích xuất dữ liệu từ các tệp DOC và chuyển đổi chúng sang định dạng văn bản. Nâng cao năng suất và hiệu quả công việc bằng cách bật tính năng này để đơn giản hóa quy trình làm việc của bạn.',\n                    'title' => 'General Settings',\n                    'models' => [\n                        'deepseek-r1' => 'Deepseek R1 Distill-llama-8b',\n                        'gemini-2-0-flash-001' => 'Gemini 2.0 flash-001',\n                        'gpt-4o' => 'GPT-4.0',\n                        'gpt-4o-mini' => 'GPT-4.0 mini',\n                        'grok-2-1212' => 'Grok 2.12',\n                        'llama-3-2-3b-instruct' => 'Llama 3.2 3b Instruct',\n                        'title' => 'Mô hình',\n                    ],\n                ],\n            ],\n        ],\n    ],\n    'dashboard' => [\n        'index' => [\n            'title' => 'Bảng Điều Khiển',\n            'start-date' => 'Start Date',\n            'end-date' => 'End Date',\n            'revenue' => [\n                'lost-revenue' => 'Doanh Thu Bị Mất',\n                'won-revenue' => 'Doanh Thu Đã Đạt',\n            ],\n            'over-all' => [\n                'average-lead-value' => 'Giá Trị Lead Trung Bình',\n                'total-leads' => 'Tổng Số Lead',\n                'average-leads-per-day' => 'Số Lead Trung Bình Mỗi Ngày',\n                'total-quotations' => 'Tổng Số Báo Giá',\n                'total-persons' => 'Tổng Số Người Liên Hệ',\n                'total-organizations' => 'Tổng Số Tổ Chức',\n            ],\n            'total-leads' => [\n                'title' => 'Leads',\n                'total' => 'Tổng Số Lead',\n                'won' => 'Lead Đã Đạt',\n                'lost' => 'Lead Bị Mất',\n            ],\n            'revenue-by-sources' => [\n                'title' => 'Doanh Thu Theo Nguồn',\n                'empty-title' => 'Không Có Dữ Liệu',\n                'empty-info' => 'Không có dữ liệu cho khoảng thời gian được chọn',\n            ],\n            'revenue-by-types' => [\n                'title' => 'Doanh Thu Theo Loại',\n                'empty-title' => 'Không Có Dữ Liệu',\n                'empty-info' => 'Không có dữ liệu cho khoảng thời gian được chọn',\n            ],\n            'top-selling-products' => [\n                'title' => 'Sản Phẩm Bán Chạy Nhất',\n                'empty-title' => 'Không Tìm Thấy Sản Phẩm',\n                'empty-info' => 'Không có sản phẩm nào cho khoảng thời gian được chọn',\n            ],\n            'top-persons' => [\n                'title' => 'Người Liên Hệ Hàng Đầu',\n                'empty-title' => 'Không Tìm Thấy Người Liên Hệ',\n                'empty-info' => 'Không có người liên hệ nào cho khoảng thời gian được chọn',\n            ],\n            'open-leads-by-states' => [\n                'title' => 'Khách hàng tiềm năng mở theo giai đoạn',\n                'empty-title' => 'Không Có Dữ Liệu',\n                'empty-info' => 'Không có dữ liệu cho khoảng thời gian được chọn',\n            ],\n        ],\n    ],\n    'layouts' => [\n        'app-version' => 'Phiên Bản : :version',\n        'dashboard' => 'Bảng Điều Khiển',\n        'leads' => 'Leads',\n        'quotes' => 'Báo Giá',\n        'quote' => 'Báo Giá',\n        'mail' => [\n            'title' => 'Thư',\n            'compose' => 'Soạn Thư',\n            'inbox' => 'Hộp Thư Đến',\n            'draft' => 'Thư Nháp',\n            'outbox' => 'Hộp Thư Đi',\n            'sent' => 'Đã Gửi',\n            'trash' => 'Thùng Rác',\n            'setting' => 'Cài Đặt',\n        ],\n        'activities' => 'Hoạt Động',\n        'contacts' => 'Liên Hệ',\n        'persons' => 'Người Liên Hệ',\n        'person' => 'Người Liên Hệ',\n        'organizations' => 'Tổ Chức',\n        'organization' => 'Tổ Chức',\n        'products' => 'Sản Phẩm',\n        'product' => 'Sản Phẩm',\n        'settings' => 'Cài Đặt',\n        'user' => 'Người Dùng',\n        'user-info' => 'Quản lý tất cả người dùng và quyền hạn của họ trong CRM, những gì họ được phép làm.',\n        'groups' => 'Nhóm',\n        'groups-info' => 'Thêm, chỉnh sửa hoặc xóa nhóm khỏi CRM',\n        'roles' => 'Vai Trò',\n        'role' => 'Vai Trò',\n        'roles-info' => 'Thêm, chỉnh sửa hoặc xóa vai trò khỏi CRM',\n        'users' => 'Người Dùng',\n        'users-info' => 'Thêm, chỉnh sửa hoặc xóa người dùng khỏi CRM',\n        'lead' => 'Lead',\n        'lead-info' => 'Quản lý tất cả các cài đặt liên quan đến leads trong CRM',\n        'pipelines' => 'Pipelines',\n        'pipelines-info' => 'Thêm, chỉnh sửa hoặc xóa pipelines khỏi CRM',\n        'sources' => 'Nguồn',\n        'sources-info' => 'Thêm, chỉnh sửa hoặc xóa nguồn khỏi CRM',\n        'types' => 'Loại',\n        'types-info' => 'Thêm, chỉnh sửa hoặc xóa loại khỏi CRM',\n        'automation' => 'Tự Động Hóa',\n        'automation-info' => 'Quản lý tất cả các cài đặt liên quan đến tự động hóa trong CRM',\n        'attributes' => 'Thuộc Tính',\n        'attribute' => 'Thuộc Tính',\n        'attributes-info' => 'Thêm, chỉnh sửa hoặc xóa thuộc tính khỏi CRM',\n        'email-templates' => 'Mẫu Email',\n        'email' => 'Email',\n        'email-templates-info' => 'Thêm, chỉnh sửa hoặc xóa mẫu email khỏi CRM',\n        'events' => 'Sự kiện',\n        'events-info' => 'Thêm, chỉnh sửa hoặc xóa sự kiện từ CRM',\n        'campaigns' => 'Chiến dịch',\n        'campaigns-info' => 'Thêm, chỉnh sửa hoặc xóa chiến dịch từ CRM',\n        'workflows' => 'Quy Trình',\n        'workflows-info' => 'Thêm, chỉnh sửa hoặc xóa quy trình khỏi CRM',\n        'webhooks' => 'Webhook',\n        'webhooks-info' => 'Thêm, chỉnh sửa hoặc xóa webhook từ CRM',\n        'other-settings' => 'Cài Đặt Khác',\n        'other-settings-info' => 'Quản lý tất cả các cài đặt khác trong CRM',\n        'tags' => 'Thẻ',\n        'tags-info' => 'Thêm, chỉnh sửa hoặc xóa thẻ khỏi CRM',\n        'my-account' => 'Tài Khoản Của Tôi',\n        'sign-out' => 'Đăng Xuất',\n        'back' => 'Quay lại',\n        'name' => 'Tên',\n        'configuration' => 'Cấu hình',\n        'howdy' => 'Xin chào!',\n        'warehouses' => 'Kho hàng',\n        'warehouse' => 'Kho hàng',\n        'warehouses-info' => 'Thêm, chỉnh sửa hoặc xóa kho hàng từ CRM',\n        'inventory' => 'Hàng tồn kho',\n        'inventory-info' => 'Quản lý tất cả các cài đặt liên quan đến hàng tồn kho trong CRM',\n        'data_transfer' => 'Data Transfer',\n        'data_transfer_info' => 'Manage persons, products and leads data transfer related settings in the CRM',\n    ],\n    'user' => [\n        'account' => [\n            'name' => 'Tên',\n            'email' => 'Email',\n            'password' => 'Mật Khẩu',\n            'my_account' => 'Tài Khoản Của Tôi',\n            'update_details' => 'Cập Nhật Thông Tin',\n            'current_password' => 'Mật Khẩu Hiện Tại',\n            'confirm_password' => 'Xác Nhận Mật Khẩu',\n            'password-match' => 'Mật khẩu hiện tại không khớp.',\n            'account-save' => 'Thay đổi tài khoản đã được lưu thành công.',\n            'permission-denied' => 'Từ Chối Quyền Truy Cập',\n            'remove-image' => 'Xóa Hình Ảnh',\n            'upload_image_pix' => 'Tải Lên Ảnh Hồ Sơ (100px x 100px)',\n            'upload_image_format' => 'Định Dạng PNG hoặc JPG',\n            'image_upload_message' => 'Chỉ chấp nhận hình ảnh (.jpeg, .jpg, .png, ..).',\n        ],\n    ],\n    'emails' => [\n        'common' => [\n            'dear' => 'Kính gửi :name',\n            'cheers' => 'Trân trọng,</br>Đội ngũ :app_name',\n            'user' => [\n                'dear' => 'Kính gửi :username',\n                'create-subject' => 'Bạn đã được thêm làm thành viên.',\n                'create-body' => 'Chúc mừng! Bạn đã trở thành thành viên của đội ngũ chúng tôi.',\n                'forget-password' => [\n                    'subject' => 'Khách hàng yêu cầu đặt lại mật khẩu',\n                    'dear' => 'Kính gửi :username',\n                    'reset-password' => 'Đặt Lại Mật Khẩu',\n                    'info' => 'Bạn nhận được email này vì chúng tôi đã nhận được yêu cầu đặt lại mật khẩu cho tài khoản của bạn.',\n                    'final-summary' => 'Nếu bạn không yêu cầu đặt lại mật khẩu, không cần thực hiện thêm hành động nào.',\n                    'thanks' => 'Cảm ơn!',\n                ],\n            ],\n        ],\n    ],\n    'validations' => [\n        'message' => [\n            'decimal' => 'The :attribute must be a decimal.',\n        ],\n    ],\n    'errors' => [\n        'dashboard' => 'Bảng điều khiển',\n        'go-back' => 'Quay lại',\n        'support' => 'Nếu sự cố vẫn tiếp diễn, vui lòng liên hệ với chúng tôi tại <a href=\":link\" class=\":class\">:email</a> để được hỗ trợ.',\n        '404' => [\n            'description' => 'Rất tiếc! Trang bạn đang tìm kiếm hiện không có ở đây. Có vẻ như chúng tôi không thể tìm thấy những gì bạn đang tìm kiếm.',\n            'title' => '404 Không Tìm Thấy Trang',\n        ],\n        '401' => [\n            'description' => 'Rất tiếc! Có vẻ như bạn không được phép truy cập vào trang này. Có vẻ bạn đang thiếu thông tin xác thực cần thiết.',\n            'title' => '401 Không Được Phép',\n        ],\n        '403' => [\n            'description' => 'Rất tiếc! Trang này bị hạn chế. Có vẻ bạn không có quyền truy cập vào nội dung này.',\n            'title' => '403 Cấm Truy Cập',\n        ],\n        '500' => [\n            'description' => 'Rất tiếc! Đã xảy ra sự cố. Có vẻ như chúng tôi đang gặp khó khăn trong việc tải trang mà bạn đang tìm kiếm.',\n            'title' => '500 Lỗi Máy Chủ Nội Bộ',\n        ],\n        '503' => [\n            'description' => 'Rất tiếc! Có vẻ chúng tôi đang tạm ngừng để bảo trì. Vui lòng quay lại sau.',\n            'title' => '503 Dịch Vụ Không Khả Dụng',\n        ],\n    ],\n    'export' => [\n        'csv' => 'CSV',\n        'download' => 'Tải Xuống',\n        'export' => 'Xuất',\n        'no-records' => 'Không có bản ghi nào được tìm thấy.',\n        'xls' => 'XLS',\n        'xlsx' => 'XLSX',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/activities/datagrid/is-done.blade.php",
    "content": "<label for=\"is_done_{{ $row->id }}\">\n    <input\n        name=\"is_done\"\n        type=\"checkbox\"\n        id=\"is_done_{{ $row->id }}\"\n        value=\"1\"\n        {{ $row->is_done ? 'checked' : '' }}\n        onchange=\"updateStatus(event, '{{ route('admin.activities.update', $row->id) }}')\"\n\n        class=\"peer hidden\"\n    >\n    <span class='icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl peer-checked:text-brandColor'></span>\n</label>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/activities/edit.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.activities.edit.title')\n    </x-slot>\n\n    {!! view_render_event('admin.activities.edit.form.before') !!}\n\n    <x-admin::form\n        :action=\"route('admin.activities.update', $activity->id)\"\n        method=\"PUT\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    <!-- Breadcrumbs -->\n                    <x-admin::breadcrumbs\n                        name=\"activities.edit\"\n                        :entity=\"$activity\"\n                    />\n\n                    <!-- Page Title -->\n                    <div class=\"text-xl font-bold dark:text-gray-300\">\n                        @lang('admin::app.activities.edit.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <!-- Create button for person -->\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.activities.edit.save_button.before') !!}\n\n                        <!-- Save Button -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.activities.edit.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.activities.edit.save_button.after') !!}\n                    </div>\n                </div>\n            </div>\n\n            <!-- Form Content -->\n            <div class=\"flex gap-2.5 max-xl:flex-wrap-reverse\">\n                <!-- Left sub-component -->\n                <div class=\"box-shadow flex-1 gap-2 rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900 max-xl:flex-auto\">\n                    {!! view_render_event('admin.activities.edit.form_controls.before') !!}\n\n                    <!-- Schedule Date -->\n                    <x-admin::form.control-group>\n                        <div class=\"flex gap-2 max-sm:flex-wrap\">\n                            <div class=\"w-full\">\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.activities.edit.schedule_from')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::flat-picker.datetime class=\"!w-full\" ::allow-input=\"true\">\n                                    <input\n                                        name=\"schedule_from\"\n                                        value=\"{{ old('schedule_from') ?? $activity->schedule_from }}\"\n                                        class=\"flex w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                        placeholder=\"@lang('admin::app.activities.edit.schedule_from')\"\n                                    />\n                                </x-admin::flat-picker.datetime>\n                            </div>\n\n                            <div class=\"w-full\">\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.activities.edit.schedule_to')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::flat-picker.datetime class=\"!w-full\" ::allow-input=\"true\">\n                                    <input\n                                        name=\"schedule_to\"\n                                        value=\"{{ old('schedule_to') ?? $activity->schedule_to }}\"\n                                        class=\"flex w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                        placeholder=\"@lang('admin::app.activities.edit.schedule_to')\"\n                                    />\n                                </x-admin::flat-picker.datetime>\n                            </div>\n                        </div>\n                    </x-admin::form.control-group>\n\n                    <!-- Comment -->\n                    <x-admin::form.control-group>\n                        <x-admin::form.control-group.label>\n                            @lang('admin::app.activities.edit.comment')\n                        </x-admin::form.control-group.label>\n\n                        <x-admin::form.control-group.control\n                            type=\"textarea\"\n                            name=\"comment\"\n                            id=\"comment\"\n                            :value=\"old('comment') ?? $activity->comment\"\n                            :label=\"trans('admin::app.activities.edit.comment')\"\n                            :placeholder=\"trans('admin::app.activities.edit.comment')\"\n                        />\n\n                        <x-admin::form.control-group.error control-name=\"comment\" />\n                    </x-admin::form.control-group>\n\n                    <!-- Participants -->\n                    <x-admin::form.control-group>\n                        <x-admin::form.control-group.label>\n                            @lang('admin::app.activities.edit.participants')\n                        </x-admin::form.control-group.label>\n\n                        <!-- Participants Multi lookup Vue Component -->\n                        <v-multi-lookup-component>\n                            <div\n                                class=\"relative rounded border border-gray-200 px-2 py-1 hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                role=\"button\"\n                            >\n                                <ul class=\"flex flex-wrap items-center gap-1\">\n                                    <li>\n                                        <input\n                                            type=\"text\"\n                                            class=\"w-full px-1 py-1 dark:bg-gray-900 dark:text-gray-300\"\n                                            placeholder=\"@lang('admin::app.activities.edit.participants')\"\n                                        />\n                                    </li>\n                                </ul>\n\n                                <span class=\"icon-down-arrow absolute top-1.5 text-2xl ltr:right-1.5 rtl:left-1.5\"></span>\n                            </div>\n                        </v-multi-lookup-component>\n                    </x-admin::form.control-group>\n\n                    <!-- Lead -->\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.label>\n                            @lang('admin::app.activities.edit.lead')\n                        </x-admin::form.control-group.label>\n\n                        <x-admin::attributes.edit.lookup/>\n\n                        <!-- Lead Lookup Vue Component -->\n                        <v-lookup-component\n                            :attribute=\"{'code': 'lead_id', 'name': 'Lead', 'lookup_type': 'leads'}\"\n                            :value='@json($lookUpEntityData)'\n                        >\n                            <x-admin::form.control-group.control\n                                type=\"text\"\n                                placeholder=\"@lang('admin::app.common.start-typing')\"\n                            />\n                        </v-lookup-component>\n                    </x-admin::form.control-group>\n\n                    {!! view_render_event('admin.activities.edit.form_controls.after') !!}\n                </div>\n\n                <!-- Right sub-component -->\n                <div class=\"w-[360px] max-w-full gap-2 max-xl:w-full\">\n                    {!! view_render_event('admin.activities.edit.accordion.general.before') !!}\n\n                    <x-admin::accordion>\n                        <x-slot:header>\n                            <div class=\"flex items-center justify-between\">\n                                <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.activities.edit.general')\n                                </p>\n                            </div>\n                        </x-slot>\n\n                        <x-slot:content>\n                            <!-- Title -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.activities.edit.title')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"title\"\n                                    id=\"title\"\n                                    rules=\"required\"\n                                    :value=\"old('title') ?? $activity->title\"\n                                    :label=\"trans('admin::app.activities.edit.title')\"\n                                    :placeholder=\"trans('admin::app.activities.edit.title')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"title\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Edit Type -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.activities.edit.type')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    name=\"type\"\n                                    id=\"type\"\n                                    :value=\"old('type') ?? $activity->type\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.activities.edit.type')\"\n                                    :placeholder=\"trans('admin::app.activities.edit.type')\"\n                                >\n                                    <option value=\"call\">\n                                        @lang('admin::app.activities.edit.call')\n                                    </option>\n\n                                    <option value=\"meeting\">\n                                        @lang('admin::app.activities.edit.meeting')\n                                    </option>\n\n                                    <option value=\"lunch\">\n                                        @lang('admin::app.activities.edit.lunch')\n                                    </option>\n                                </x-admin::form.control-group.control>\n\n                                <x-admin::form.control-group.error control-name=\"type\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Location -->\n                            <x-admin::form.control-group class=\"!mb-0\">\n                                <x-admin::form.control-group.label>\n                                    @lang('admin::app.activities.edit.location')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"location\"\n                                    id=\"location\"\n                                    :value=\"old('location') ?? $activity->location\"\n                                    :label=\"trans('admin::app.activities.edit.location')\"\n                                    :placeholder=\"trans('admin::app.activities.edit.location')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"location\" />\n                            </x-admin::form.control-group>\n                        </x-slot>\n                    </x-admin::accordion>\n\n                    {!! view_render_event('admin.activities.edit.accordion.general.after') !!}\n                </div>\n            </div>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.activities.edit.form.after') !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-multi-lookup-component-template\"\n        >\n            <!-- Search Button -->\n            <div class=\"relative\">\n                <div class=\"relative rounded border border-gray-200 px-2 py-1 hover:border-gray-400 focus:border-gray-400 dark:border-gray-800\" role=\"button\">\n                    <ul class=\"flex flex-wrap items-center gap-1\">\n                        <!-- Added Participants -->\n                        <template v-for=\"userType in ['users', 'persons']\">\n                            <template v-if=\"! addedParticipants[userType].length\">\n                                <input\n                                    type=\"hidden\"\n                                    :name=\"`participants[${userType}][]`\"\n                                    value=\"\"\n                                />\n                            </template>\n\n                            <li\n                                class=\"flex items-center gap-1 rounded-md bg-slate-100 pl-2 dark:bg-slate-950 dark:text-gray-300\"\n                                v-for=\"(user, index) in addedParticipants[userType]\"\n                            >\n                                <!-- Person and User Hidden Input Field -->\n                                <input\n                                    type=\"hidden\"\n                                    :name=\"`participants[${userType}][]`\"\n                                    :value=\"user.id\"\n                                />\n\n                                @{{ user.name }}\n\n                                <span\n                                    class=\"icon-cross-large cursor-pointer p-0.5 text-xl\"\n                                    @click=\"remove(userType, user)\"\n                                ></span>\n                            </li>\n                        </template>\n\n                        <!-- Search Input Box -->\n                        <li>\n                            <input\n                                type=\"text\"\n                                class=\"w-full px-1 py-1 dark:bg-gray-900 dark:text-gray-300\"\n                                placeholder=\"@lang('admin::app.activities.edit.participants')\"\n                                v-model.lazy=\"searchTerm\"\n                                v-debounce=\"500\"\n                            />\n                        </li>\n                    </ul>\n\n                    <!-- Search and Spinner Icon -->\n                    <div>\n                        <template v-if=\"! isSearching.users && ! isSearching.persons\">\n                            <span\n                                class=\"absolute top-1.5 text-2xl ltr:right-1.5 rtl:left-1.5\"\n                                :class=\"[searchTerm.length >= 2 ? 'icon-up-arrow' : 'icon-down-arrow']\"\n                            ></span>\n                        </template>\n\n                        <template v-else>\n                            <x-admin::spinner class=\"absolute top-2 ltr:right-2 rtl:left-2\" />\n                        </template>\n                    </div>\n                </div>\n\n                <!-- Search Dropdown -->\n                <div\n                    class=\"absolute z-10 w-full rounded bg-white shadow-[0px_10px_20px_0px_#0000001F] dark:bg-gray-900\"\n                    v-if=\"searchTerm.length >= 2\"\n                >\n                    <ul class=\"flex flex-col gap-1 p-2\">\n                        <!-- Users and Person Searched Participants -->\n                        <li\n                            class=\"flex flex-col gap-2\"\n                            v-for=\"userType in ['users', 'persons']\"\n                        >\n                            <h3 class=\"text-sm font-bold text-gray-600 dark:text-gray-400\">\n                                <template v-if=\"userType === 'users'\">\n                                    @lang('admin::app.activities.edit.users')\n                                </template>\n\n                                <template v-else>\n                                    @lang('admin::app.activities.edit.persons')\n                                </template>\n                            </h3>\n\n                            <ul>\n                                <li\n                                    class=\"rounded-sm px-5 py-2 text-sm text-gray-800 dark:text-gray-300\"\n                                    v-if=\"! searchedParticipants[userType].length && ! isSearching[userType]\"\n                                >\n                                    <p class=\"text-sm text-gray-500 dark:text-gray-400\">\n                                        @lang('admin::app.activities.edit.no-result-found')\n                                    </p>\n                                </li>\n\n                                <li\n                                    class=\"cursor-pointer rounded-sm px-3 py-2 text-sm text-gray-800 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950\"\n                                    v-for=\"user in searchedParticipants[userType]\"\n                                    @click=\"add(userType, user)\"\n                                >\n                                    @{{ user.name }}\n                                </li>\n                            </ul>\n                        </li>\n                    </ul>\n                </div>\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-multi-lookup-component', {\n                template: '#v-multi-lookup-component-template',\n\n                data() {\n                    return {\n                        isSearching: {\n                            users: false,\n\n                            persons: false,\n                        },\n\n                        searchTerm: '',\n\n                        addedParticipants: {\n                            users: [],\n\n                            persons: [],\n                        },\n\n                        searchedParticipants: {\n                            users: [],\n\n                            persons: [],\n                        },\n\n                        searchEnpoints: {\n                            users: \"{{ route('admin.settings.users.search') }}\",\n\n                            persons: \"{{ route('admin.contacts.persons.search') }}\",\n                        },\n                    };\n                },\n\n                watch: {\n                    searchTerm(newVal, oldVal) {\n                        this.search('users');\n\n                        this.search('persons');\n                    },\n                },\n\n                created() {\n                    @json($activity->participants).forEach(participant => {\n                        if (participant.user) {\n                            this.addedParticipants.users.push(participant.user);\n                        } else if (participant.person) {\n                            this.addedParticipants.persons.push(participant.person);\n                        }\n                    });\n                },\n\n                methods: {\n                    search(userType) {\n                        if (this.searchTerm.length <= 1) {\n                            this.searchedParticipants[userType] = [];\n\n                            this.isSearching[userType] = false;\n\n                            return;\n                        }\n\n                        this.isSearching[userType] = true;\n\n                        this.$axios.get(this.searchEnpoints[userType], {\n                                params: {\n                                    search: 'name:' + this.searchTerm,\n                                    searchFields: 'name:like',\n                                }\n                            })\n                            .then ((response) => {\n                                this.addedParticipants[userType].forEach(addedParticipant =>\n                                    response.data.data = response.data.data.filter(participant => participant.id !== addedParticipant.id)\n                                );\n\n                                this.searchedParticipants[userType] = response.data.data;\n\n                                this.isSearching[userType] = false;\n                            })\n                            .catch (function (error) {\n                                this.isSearching[userType] = false;\n                            });\n                    },\n\n                    add(userType, participant) {\n                        this.addedParticipants[userType].push(participant);\n\n                        this.searchTerm = '';\n\n                        this.searchedParticipants = {\n                            users: [],\n\n                            persons: [],\n                        };\n                    },\n\n                    remove(userType, participant) {\n                        this.addedParticipants[userType] = this.addedParticipants[userType].filter(addedParticipant =>\n                            addedParticipant.id !== participant.id\n                        );\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/activities/index.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.activities.index.title')\n    </x-slot>\n\n    {!! view_render_event('admin.activities.index.activities.before') !!}\n\n    <!-- Activities Datagrid -->\n    <v-activities>\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    <x-admin::breadcrumbs name=\"activities\" />\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.activities.index.title')\n                    </div>\n                </div>\n\n                <div class=\"flex gap-2\">\n                    <i class=\"icon-list cursor-pointer rounded p-2 text-2xl\"></i>\n\n                    <i class=\"icon-calendar cursor-pointe rounded p-2 text-2xl\"></i>\n                </div>\n            </div>\n\n            <!-- DataGrid Shimmer -->\n            @if (\n                request()->get('view-type') == 'table'\n                || ! request()->has('view-type')\n            )\n                <x-admin::shimmer.datagrid :is-multi-row=\"true\"/>\n            @endif\n        </div>\n    </v-activities>\n\n    {!! view_render_event('admin.activities.index.activities.after') !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-activities-template\"\n        >\n            <div class=\"flex flex-col gap-4\">\n                <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                    <div class=\"flex flex-col gap-2\">\n                        <x-admin::breadcrumbs name=\"activities\" />\n\n                        <div class=\"text-xl font-bold dark:text-white\">\n                            @lang('admin::app.activities.index.title')\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.activities.index.toggle_view.before') !!}\n\n                    <div class=\"flex\">\n                        <i\n                            class=\"icon-list cursor-pointer rounded-md p-2 text-2xl\"\n                            :class=\"{'bg-gray-200 dark:bg-gray-800 text-gray-800 dark:text-white': viewType == 'table'}\"\n                            @click=\"toggleView('table')\"\n                        ></i>\n\n                        <i\n                            class=\"icon-calendar cursor-pointer rounded-md p-2 text-2xl\"\n                            :class=\"{'bg-gray-200 dark:bg-gray-800 text-gray-800 dark:text-white': viewType == 'calendar'}\"\n                            @click=\"toggleView('calendar')\"\n                        ></i>\n                    </div>\n\n                    {!! view_render_event('admin.activities.index.toggle_view.after') !!}\n                </div>\n\n                <!-- DataGrid Shimmer -->\n                <div>\n                    <template v-if=\"viewType == 'table'\">\n                        {!! view_render_event('admin.activities.index.datagrid.before') !!}\n\n                        <x-admin::datagrid\n                            src=\"{{ route('admin.activities.get') }}\"\n                            :isMultiRow=\"true\"\n                            ref=\"datagrid\"\n                        >\n                            <template #header=\"{\n                                isLoading,\n                                available,\n                                applied,\n                                selectAll,\n                                sort,\n                                performAction\n                            }\">\n                                <template v-if=\"isLoading\">\n                                    <x-admin::shimmer.datagrid.table.head :isMultiRow=\"true\" />\n                                </template>\n\n                                <template v-else>\n                                    <div class=\"row grid grid-cols-[.3fr_.1fr_.3fr_.5fr] grid-rows-1 items-center gap-x-2.5 border-b px-4 py-2.5 dark:border-gray-800 max-lg:hidden\">\n                                        <div\n                                            class=\"flex select-none items-center gap-2.5\"\n                                            v-for=\"(columnGroup, index) in [['id', 'title', 'created_by_id'], ['is_done'], ['comment', 'lead_title', 'type'], ['schedule_from', 'schedule_to', 'created_at']]\"\n                                        >\n                                            <label\n                                                class=\"flex w-max cursor-pointer select-none items-center gap-1\"\n                                                for=\"mass_action_select_all_records\"\n                                                v-if=\"! index\"\n                                            >\n                                                <input\n                                                    type=\"checkbox\"\n                                                    name=\"mass_action_select_all_records\"\n                                                    id=\"mass_action_select_all_records\"\n                                                    class=\"peer hidden\"\n                                                    :checked=\"['all', 'partial'].includes(applied.massActions.meta.mode)\"\n                                                    @change=\"selectAll\"\n                                                >\n\n                                                <span\n                                                    class=\"icon-checkbox-outline cursor-pointer rounded-md text-2xl text-gray-600 dark:text-gray-300\"\n                                                    :class=\"[\n                                                        applied.massActions.meta.mode === 'all' ? 'peer-checked:icon-checkbox-select peer-checked:text-brandColor' : (\n                                                            applied.massActions.meta.mode === 'partial' ? 'peer-checked:icon-checkbox-multiple peer-checked:text-brandColor' : ''\n                                                        ),\n                                                    ]\"\n                                                >\n                                                </span>\n                                            </label>\n\n                                            <p class=\"text-gray-600 dark:text-gray-300\">\n                                                <span class=\"[&>*]:after:content-['_/_']\">\n                                                    <template v-for=\"column in columnGroup\">\n                                                        <span\n                                                            class=\"after:content-['/'] last:after:content-['']\"\n                                                            :class=\"{\n                                                                'font-medium text-gray-800 dark:text-white': applied.sort.column == column,\n                                                                'cursor-pointer hover:text-gray-800 dark:hover:text-white': available.columns.find(columnTemp => columnTemp.index === column)?.sortable,\n                                                            }\"\n                                                            @click=\"\n                                                                available.columns.find(columnTemp => columnTemp.index === column)?.sortable ? sort(available.columns.find(columnTemp => columnTemp.index === column)): {}\n                                                            \"\n                                                        >\n                                                            @{{ available.columns.find(columnTemp => columnTemp.index === column)?.label }}\n                                                        </span>\n                                                    </template>\n                                                </span>\n\n                                                <i\n                                                    class=\"align-text-bottom text-base text-gray-800 dark:text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                    :class=\"[applied.sort.order === 'asc' ? 'icon-stats-down': 'icon-stats-up']\"\n                                                    v-if=\"columnGroup.includes(applied.sort.column)\"\n                                                ></i>\n                                            </p>\n                                        </div>\n                                    </div>\n\n                                    <!-- Mobile Sort/Filter Header -->\n                                    <div class=\"hidden border-b bg-gray-50 px-4 py-3 text-black dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 max-lg:block\">\n                                        <div class=\"flex items-center justify-between\">\n                                            <!-- Mass Actions for Mobile -->\n                                            <div v-if=\"available.massActions.length\">\n                                                <label\n                                                    class=\"flex w-max cursor-pointer select-none items-center gap-1\"\n                                                    for=\"mass_action_select_all_records\"\n                                                >\n                                                    <input\n                                                        type=\"checkbox\"\n                                                        name=\"mass_action_select_all_records\"\n                                                        id=\"mass_action_select_all_records\"\n                                                        class=\"peer hidden\"\n                                                        :checked=\"['all', 'partial'].includes(applied.massActions.meta.mode)\"\n                                                        @change=\"selectAll\"\n                                                    >\n\n                                                    <span\n                                                        class=\"icon-checkbox-outline cursor-pointer rounded-md text-2xl text-gray-600 dark:text-gray-300\"\n                                                        :class=\"[\n                                                            applied.massActions.meta.mode === 'all' ? 'peer-checked:icon-checkbox-select peer-checked:text-brandColor' : (\n                                                                applied.massActions.meta.mode === 'partial' ? 'peer-checked:icon-checkbox-multiple peer-checked:text-brandColor' : ''\n                                                            ),\n                                                        ]\"\n                                                    >\n                                                    </span>\n                                                </label>\n                                            </div>\n\n                                            <!-- Mobile Sort Dropdown -->\n                                            <div v-if=\"available.columns.some(column => column.sortable)\">\n                                                <x-admin::dropdown position=\"bottom-{{ in_array(app()->getLocale(), ['fa', 'ar']) ? 'left' : 'right' }}\">\n                                                    <x-slot:toggle>\n                                                        <div class=\"flex items-center gap-1\">\n                                                            <button\n                                                                type=\"button\"\n                                                                class=\"inline-flex w-full max-w-max cursor-pointer appearance-none items-center justify-between gap-x-2 rounded-md border bg-white px-2.5 py-1.5 text-center leading-6 text-gray-600 transition-all marker:shadow hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                                            >\n                                                                <span>\n                                                                    Sort\n                                                                </span>\n\n                                                                <span class=\"icon-down-arrow text-2xl\"></span>\n                                                            </button>\n                                                        </div>\n                                                    </x-slot>\n\n                                                    <x-slot:menu>\n                                                        <x-admin::dropdown.menu.item\n                                                            v-for=\"column in available.columns.filter(column => column.sortable && column.visibility)\"\n                                                            @click=\"sort(column)\"\n                                                        >\n                                                            <div class=\"flex items-center gap-2\">\n                                                                <span v-html=\"column.label\"></span>\n                                                                <i\n                                                                    class=\"align-text-bottom text-base text-gray-600 dark:text-gray-300\"\n                                                                    :class=\"[applied.sort.order === 'asc' ? 'icon-stats-down': 'icon-stats-up']\"\n                                                                    v-if=\"column.index == applied.sort.column\"\n                                                                ></i>\n                                                            </div>\n                                                        </x-admin::dropdown.menu.item>\n                                                    </x-slot>\n                                                </x-admin::dropdown>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </template>\n                            </template>\n\n                            <template #body=\"{\n                                isLoading,\n                                available,\n                                applied,\n                                selectAll,\n                                sort,\n                                performAction\n                            }\">\n                                <template v-if=\"isLoading\">\n                                    <x-admin::shimmer.datagrid.table.body :isMultiRow=\"true\" />\n                                </template>\n\n                                <template v-else>\n                                    <div\n                                        class=\"row grid grid-cols-[.3fr_.1fr_.3fr_.5fr] grid-rows-1 gap-x-2.5 border-b px-4 py-2.5 transition-all hover:bg-gray-50 dark:border-gray-800 dark:hover:bg-gray-950 max-lg:hidden\"\n                                        v-for=\"record in available.records\"\n                                    >\n                                        <!-- Mass Actions, Title and Created By -->\n                                        <div class=\"flex gap-2.5\">\n                                            <input\n                                                type=\"checkbox\"\n                                                :name=\"`mass_action_select_record_${record.id}`\"\n                                                :id=\"`mass_action_select_record_${record.id}`\"\n                                                :value=\"record.id\"\n                                                class=\"peer hidden\"\n                                                v-model=\"applied.massActions.indices\"\n                                            >\n\n                                            <label\n                                                class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-600 peer-checked:text-brandColor dark:text-gray-300\"\n                                                :for=\"`mass_action_select_record_${record.id}`\"\n                                            ></label>\n\n                                            <div class=\"flex flex-col gap-1.5\">\n                                                <p class=\"text-gray-600 dark:text-gray-300\">\n                                                    @{{ record.id }}\n                                                </p>\n\n                                                <p class=\"text-gray-600 dark:text-gray-300\">\n                                                    @{{ record.title }}\n                                                </p>\n\n                                                <p\n                                                    class=\"text-gray-600 dark:text-gray-300\"\n                                                    v-html=\"record.created_by_id\"\n                                                >\n                                                </p>\n                                            </div>\n                                        </div>\n\n                                        <!-- Is Done -->\n                                        <div class=\"flex gap-1.5\">\n                                            <div class=\"flex flex-col gap-1.5\">\n                                                <p\n                                                    class=\"text-gray-600 dark:text-gray-300\"\n                                                    v-html=\"record.is_done\"\n                                                >\n                                                </p>\n                                            </div>\n                                        </div>\n\n                                        <!-- Comment, Lead Title and Type -->\n                                        <div class=\"flex gap-1.5\">\n                                            <div class=\"flex flex-col gap-1.5\">\n                                                <p class=\"text-gray-600 dark:text-gray-300\">\n                                                    {{-- @{{ record.comment }} --}}\n                                                    @{{ record.comment.length > 180 ? record.comment.slice(0, 180) + '...' : record.comment }}\n                                                </p>\n\n                                                <p v-html=\"record.lead_title\"></p>\n\n                                                <p class=\"text-gray-600 dark:text-gray-300\">\n                                                    @{{ record.type ?? 'N/A'}}\n                                                </p>\n                                            </div>\n                                        </div>\n\n                                        <div class=\"flex items-start justify-between gap-x-4\">\n                                            <div class=\"flex flex-col gap-1.5\">\n                                                <p class=\"text-gray-600 dark:text-gray-300\">\n                                                    @{{ record.schedule_from ?? 'N/A' }}\n                                                </p>\n\n                                                <p class=\"text-gray-600 dark:text-gray-300\">\n                                                    @{{ record.schedule_to }}\n                                                </p>\n\n                                                <p class=\"text-gray-600 dark:text-gray-300\">\n                                                    @{{ record.created_at }}\n                                                </p>\n                                            </div>\n\n                                            <div class=\"flex items-center gap-1.5\">\n                                                <p\n                                                    class=\"place-self-end\"\n                                                    v-if=\"available.actions.length\"\n                                                >\n                                                    <span\n                                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                                        :class=\"action.icon\"\n                                                        v-text=\"! action.icon ? action.title : ''\"\n                                                        v-for=\"action in record.actions\"\n                                                        @click=\"performAction(action)\"\n                                                    ></span>\n                                                </p>\n                                            </div>\n                                        </div>\n                                    </div>\n\n                                    <!-- Mobile Card View -->\n                                    <div\n                                        class=\"hidden border-b px-4 py-4 text-black dark:border-gray-800 dark:text-gray-300 max-lg:block\"\n                                        v-for=\"record in available.records\"\n                                    >\n                                        <div class=\"mb-2 flex items-center justify-between\">\n                                            <!-- Mass Actions for Mobile Cards -->\n                                            <div class=\"flex w-full items-center justify-between gap-2\">\n                                                <p v-if=\"available.massActions.length\">\n                                                    <label :for=\"`mass_action_select_record_${record[available.meta.primary_column]}`\">\n                                                        <input\n                                                            type=\"checkbox\"\n                                                            :name=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                            :value=\"record[available.meta.primary_column]\"\n                                                            :id=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                            class=\"peer hidden\"\n                                                            v-model=\"applied.massActions.indices\"\n                                                        >\n\n                                                        <span class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-500 peer-checked:text-brandColor\">\n                                                        </span>\n                                                    </label>\n                                                </p>\n\n                                                <!-- Actions for Mobile -->\n                                                <div\n                                                    class=\"flex w-full items-center justify-end\"\n                                                    v-if=\"available.actions.length\"\n                                                >\n                                                    <span\n                                                        class=\"dark:hover:bg-gray-80 cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200\"\n                                                        :class=\"action.icon\"\n                                                        v-text=\"! action.icon ? action.title : ''\"\n                                                        v-for=\"action in record.actions\"\n                                                        @click=\"performAction(action)\"\n                                                    >\n                                                    </span>\n                                                </div>\n                                            </div>\n                                        </div>\n\n                                        <!-- Card Content -->\n                                        <div class=\"grid gap-2\">\n                                            <template v-for=\"column in available.columns\">\n                                                <div class=\"flex flex-wrap items-baseline gap-x-2\">\n                                                    <span class=\"text-slate-600 dark:text-gray-300\" v-html=\"column.label + ':'\"></span>\n                                                    <span class=\"break-words font-medium text-slate-900 dark:text-white\" v-html=\"record[column.index]\"></span>\n                                                </div>\n                                            </template>\n                                        </div>\n                                    </div>\n                                </template>\n                            </template>\n                        </x-admin::datagrid>\n\n                        {!! view_render_event('admin.activities.index.datagrid.after') !!}\n                    </template>\n\n                    <template v-else>\n                        {!! view_render_event('admin.activities.index.vue_calender.before') !!}\n\n                        <v-calendar></v-calendar>\n\n                        {!! view_render_event('admin.activities.index.vue_calender.after') !!}\n                    </template>\n                </div>\n            </div>\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-calendar-template\"\n        >\n            <v-vue-cal\n                hide-view-selector\n                :watchRealTime=\"true\"\n                :twelveHour=\"true\"\n                :disable-views=\"['years', 'year', 'month', 'day']\"\n                style=\"height: calc(100vh - 240px);\"\n                :class=\"{'vuecal--dark': theme === 'dark'}\"\n                :events=\"events\"\n                :time-format=\"'h:mm a'\"\n                :events-on-month-view=\"'stack'\"\n                :events-count-on-year-view=\"3\"\n                :overlapping-events-stacked=\"true\"\n                :min-event-width=\"60\"\n                :cell-click-hold=\"false\"\n                :sticky-events=\"true\"\n                :events-overlap=\"true\"\n                :detailed-time=\"true\"\n                @ready=\"getActivities\"\n                @view-change=\"getActivities\"\n                @event-click=\"goToActivity\"\n                locale=\"{{ app()->getLocale() }}\"\n            >\n                <template #event=\"{ event }\">\n                    <div\n                        class=\"vuecal__event-content\"\n                        v-tooltip=\"{\n                            content: `\n                                <div class='mb-1 font-semibold text-white'>${event.title}</div>\n                                <div class='mb-1 text-xs text-gray-300'>${formatTime(event.start)} - ${formatTime(event.end)}</div>\n                                ${event.description ? `<div class='text-xs text-gray-200'>${event.description}</div>` : ''\n                            }`,\n                            html: true,\n                            placement: 'top',\n                            trigger: 'hover',\n                            delay: { show: 200, hide: 100 }\n                        }\"\n                    >\n                        <div class=\"vuecal__event-title font-medium\">\n                            @{{ event.title }}\n                        </div>\n\n                        <div class=\"vuecal__event-time text-sm\">\n                            @{{ formatTime(event.start) }} - @{{ formatTime(event.end) }}\n                        </div>\n                    </div>\n                </template>\n            </v-vue-cal>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-activities', {\n                template: '#v-activities-template',\n\n                data() {\n                    return {\n                        viewType: \"{{ request('view-type') }}\" || 'table',\n                    };\n                },\n\n                methods: {\n                    /**\n                     * Toggle view type.\n                     *\n                     * @param {String} type\n                     * @return {void}\n                     */\n                    toggleView(type) {\n                        this.viewType = type;\n\n                        let currentUrl = new URL(window.location);\n\n                        currentUrl.searchParams.set('view-type', type);\n\n                        window.history.pushState({}, '', currentUrl);\n                    },\n                },\n            });\n        </script>\n\n        <script type=\"module\">\n            app.component('v-calendar', {\n                template: '#v-calendar-template',\n\n                data() {\n                    return {\n                        events: [],\n                        theme: document.documentElement.classList.contains('dark') ? 'dark' : 'light',\n                    };\n                },\n\n                mounted() {\n                    /**\n                     * Listen for the theme change event.\n                     *\n                     * @return {void}\n                     */\n                    this.$emitter.on('change-theme', (theme) => this.theme = theme);\n                },\n\n                methods: {\n                    /**\n                     * Get the activities for the calendar.\n                     *\n                     * @param {Object} {startDate}\n                     * @param {Object} {endDate}\n                     * @return {void}\n                     */\n                    getActivities({startDate, endDate}) {\n                        this.$root.pageLoaded = false;\n\n                        this.$axios.get(\"{{ route('admin.activities.get', ['view_type' => 'calendar']) }}\" + `&startDate=${new Date(startDate).toLocaleDateString(\"en-US\")}&endDate=${new Date(endDate).toLocaleDateString(\"en-US\")}`)\n                            .then(response => {\n                                this.events = this.processEvents(response.data.activities);\n                            })\n                            .catch(error => {});\n                    },\n\n                    /**\n                     * Process events to improve their display\n                     *\n                     * @param {Array} events\n                     * @return {Array}\n                     */\n                    processEvents(events) {\n                        return events.map(event => {\n                            if (\n                                ! event.background\n                                || event.background === \"#fff\"\n                                || event.background === \"#ffffff\"\n                            ) {\n                                const hash = this.hashString(event.id || event.title || '');\n\n                                const colors = [\n                                    '#4F46E5', '#0891B2', '#10B981', '#F59E0B', '#EC4899',\n                                    '#8B5CF6', '#06B6D4', '#22C55E', '#F97316', '#D946EF'\n                                ];\n\n                                event.background = colors[Math.abs(hash) % colors.length];\n\n                                event.textColor = '#ffffff';\n                            }\n\n                            return event;\n                        });\n                    },\n\n                    /**\n                     * Simple string hash function for consistent color generation\n                     *\n                     * @param {string} str\n                     * @return {number}\n                     */\n                    hashString(str) {\n                        let hash = 0;\n\n                        for (let i = 0; i < str.length; i++) {\n                            hash = ((hash << 5) - hash) + str.charCodeAt(i);\n                            hash |= 0;\n                        }\n\n                        return hash;\n                    },\n\n                    /**\n                     * Format time for display in event template\n                     *\n                     * @param {Date} date\n                     * @return {string}\n                     */\n                    formatTime(date) {\n                        if (! date) {\n                            return '';\n                        }\n\n                        const dateObj = new Date(date);\n\n                        let hours = dateObj.getHours();\n\n                        const minutes = dateObj.getMinutes().toString().padStart(2, '0');\n\n                        const ampm = hours >= 12 ? 'PM' : 'AM';\n\n                        hours = hours % 12;\n\n                        hours = hours ? hours : 12;\n\n                        return `${hours}:${minutes} ${ampm}`;\n                    },\n\n                    /**\n                     * Redirect to the activity edit page.\n                     *\n                     * @param {Object} event\n                     * @return {void}\n                     */\n                    goToActivity(event) {\n                        if (event.id) {\n                            window.location.href = `{{ route('admin.activities.edit', ':id') }}`.replace(':id', event.id);\n                        }\n                    },\n                },\n            });\n        </script>\n\n        <script>\n            /**\n             * Update status for `is_done`.\n             *\n             * @param {Event} {target}\n             * @return {void}\n             */\n            const updateStatus = ({ target }, url) => {\n                axios\n                    .post(url, {\n                        _method: 'put',\n                        is_done: target.checked,\n                    })\n                    .then(response => {\n                        window.emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                    })\n                    .catch(error => {});\n            };\n        </script>\n    @endPushOnce\n\n    @pushOnce('styles')\n        <style>\n            /* Base Event Styling */\n            .vuecal__event {\n                background-color: #0e90d9 !important;\n                color: #fff !important;\n                cursor: pointer;\n                height: auto !important;\n                border-radius: 4px;\n                padding: 4px 6px;\n                font-size: 14px;\n                box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n                transition: all 0.2s ease;\n                overflow: hidden;\n            }\n\n            .vuecal__event:hover {\n                box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);\n                transform: translateY(-1px);\n            }\n\n            .vuecal__event.done {\n                background-color: #53c41a !important;\n            }\n\n            /* Event Title & Time */\n            .vuecal__event-title {\n                font-weight: 500;\n                overflow: hidden;\n                text-overflow: ellipsis;\n                white-space: nowrap;\n            }\n\n            .vuecal__event-time {\n                font-size: 12px;\n                opacity: 0.8;\n            }\n\n            /* More Events Indicator */\n            .vuecal__cell-more-events {\n                font-size: 12px;\n                color: #666;\n                padding: 2px 5px;\n                text-align: center;\n                cursor: pointer;\n                border-radius: 3px;\n                background-color: rgba(0, 0, 0, 0.04);\n            }\n\n            /* Events Count Badge */\n            .vuecal__cell-events-count {\n                background-color: rgba(66, 92, 240, 0.85);\n                border-radius: 10px;\n                padding: 0 4px;\n                font-size: 11px;\n            }\n\n            /* Week View Stacking */\n            .vuecal--week-view .vuecal__event-container {\n                padding: 1px;\n            }\n\n            .vuecal__event-container--overlapped .vuecal__event {\n                margin-top: 2px;\n                min-height: 28px;\n            }\n\n            /* Dark Mode Styles */\n            .vuecal--dark {\n                background-color: #1F2937 !important;\n                color: #FFFFFF !important;\n                border-color: #374151 !important;\n            }\n\n            .vuecal--dark .vuecal__header,\n            .vuecal--dark .vuecal__header-weekdays,\n            .vuecal--dark .vuecal__header-months {\n                background-color: #374151 !important;\n                color: #FFFFFF !important;\n            }\n\n            .vuecal--dark .vuecal__day,\n            .vuecal--dark .vuecal__month-view,\n            .vuecal--dark .vuecal__week-view,\n            .vuecal--dark .vuecal__day--weekend,\n            .vuecal--dark .vuecal__day--selected {\n                background-color: #1F2937 !important;\n                color: #FFFFFF !important;\n                border-color: #374151 !important;\n            }\n\n            .vuecal--dark .vuecal__event {\n                background-color: #374151 !important;\n                color: #FFFFFF !important;\n                box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);\n            }\n\n            .vuecal--dark .vuecal__cell-more-events {\n                color: #ddd;\n                background-color: rgba(255, 255, 255, 0.1);\n            }\n        </style>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/accordion/index.blade.php",
    "content": "@props([\n    'isActive' => true,\n])\n\n<div {{ $attributes->merge(['class' => 'box-shadow rounded-lg border border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900']) }}>\n    <v-accordion\n        is-active=\"{{ $isActive }}\"\n        {{ $attributes }}\n    >\n        <x-admin::shimmer.accordion class=\"h-[271px] w-[360px]\" />\n\n        @isset($header)\n            <template v-slot:header=\"{ toggle, isOpen }\">\n                <div {{ $header->attributes->merge(['class' => 'flex items-center justify-between p-1.5']) }}>\n                    {{ $header }}\n\n                    <span\n                        :class=\"`cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950 ${isOpen ? 'icon-up-arrow' : 'icon-down-arrow'}`\"\n                        @click=\"toggle\"\n                    ></span>\n                </div>\n            </template>\n        @endisset\n\n        @isset($content)\n            <template v-slot:content=\"{ isOpen }\">\n                <div\n                    {{ $content->attributes->merge(['class' => 'px-4 pb-4']) }}\n                    v-show=\"isOpen\"\n                >\n                    {{ $content }}\n                </div>\n            </template>\n        @endisset\n    </v-accordion>\n</div>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-accordion-template\"\n    >\n        <div>\n            <slot\n                name=\"header\"\n                :toggle=\"toggle\"\n                :isOpen=\"isOpen\"\n            >\n                Default Header\n            </slot>\n\n            <slot\n                name=\"content\"\n                :isOpen=\"isOpen\"\n            >\n                Default Content\n            </slot>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-accordion', {\n            template: '#v-accordion-template',\n\n            props: [\n                'isActive',\n            ],\n\n            data() {\n                return {\n                    isOpen: this.isActive,\n                };\n            },\n\n            methods: {\n                toggle() {\n                    this.isOpen = ! this.isOpen;\n\n                    this.$emit('toggle', { isActive: this.isOpen });\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity/participants.blade.php",
    "content": "{!! view_render_event('admin.components.activities.actions.activity.participants.before') !!}\n\n<!-- Participants Vue Component -->\n<v-activity-participants></v-activity-participants>\n\n{!! view_render_event('admin.components.activities.actions.activity.participants.after') !!}\n\n@pushOnce('scripts')\n    <script type=\"text/x-template\" id=\"v-activity-participants-template\">\n        <!-- Search Button -->\n        <div class=\"relative\">\n            <div \n                class=\"relative rounded border border-gray-200 px-2 py-1 hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:hover:border-gray-400\" \n                role=\"button\"\n            >\n                <ul class=\"flex flex-wrap items-center gap-1\">\n                    <template v-for=\"userType in ['users', 'persons']\">\n                        {!! view_render_event('admin.components.activities.actions.activity.participants.user_type.before') !!}\n\n                        <li\n                            class=\"flex items-center gap-1 rounded-md bg-slate-100 pl-2 dark:bg-gray-950 dark:text-gray-300\"\n                            v-for=\"(user, index) in addedParticipants[userType]\"\n                        >\n                            {!! view_render_event('admin.components.activities.actions.activity.participants.user_type.user.before') !!}\n\n                            <!-- User Id -->\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                ::name=\"'participants.' + userType + '[' + index + ']'\"\n                                ::value=\"user.id\"\n                            />\n\n                            @{{ user.name }}\n\n                            <span\n                                class=\"icon-cross-large cursor-pointer p-0.5 text-xl\"\n                                @click=\"remove(userType, user)\"\n                            ></span>\n\n                            {!! view_render_event('admin.components.activities.actions.activity.participants.user_type.user.after') !!}\n                        </li>\n\n                        {!! view_render_event('admin.components.activities.actions.activity.participants.user_type.after') !!}\n                    </template>\n\n                    <li>\n                        {!! view_render_event('admin.components.activities.actions.activity.participants.search_term.before') !!}\n\n                        <input\n                            type=\"text\"\n                            class=\"w-full px-1 py-1 dark:bg-gray-900 dark:text-gray-300\"\n                            placeholder=\"@lang('admin::app.components.activities.actions.activity.participants.placeholder')\"\n                            v-model.lazy=\"searchTerm\"\n                            v-debounce=\"500\"\n                        />\n\n                        {!! view_render_event('admin.components.activities.actions.activity.participants.search_term.after') !!}\n                    </li>\n                </ul>\n\n                <div>\n                    <template v-if=\"! isSearching.users && ! isSearching.persons\">\n                        <span\n                            class=\"absolute right-1.5 top-1.5 text-2xl\"\n                            :class=\"[searchTerm.length >= 2 ? 'icon-up-arrow' : 'icon-down-arrow']\"\n                        ></span>\n                    </template>\n\n                    <template v-else>\n                        <x-admin::spinner class=\"absolute right-2 top-2\" />\n                    </template>\n                </div>\n            </div>\n\n            {!! view_render_event('admin.components.activities.actions.activity.participants.dropdown.before') !!}\n\n            <!-- Search Dropdown -->\n            <div\n                class=\"absolute z-10 w-full rounded bg-white shadow-[0px_10px_20px_0px_#0000001F] dark:bg-gray-900\"\n                v-if=\"searchTerm.length >= 2\"\n            >\n                <ul class=\"flex flex-col gap-1 p-2\">\n                    <!-- Users -->\n                    <li\n                        class=\"flex flex-col gap-2\"\n                        v-for=\"userType in ['users', 'persons']\"\n                    >\n                        {!! view_render_event('admin.components.activities.actions.activity.participants.dropdown.user_type.before') !!}\n\n                        <h3 class=\"text-sm font-bold text-gray-600 dark:text-gray-300\">\n                            <template v-if=\"userType === 'users'\">\n                                @lang('admin::app.components.activities.actions.activity.participants.users')\n                            </template>\n\n                            <template v-else>\n                                @lang('admin::app.components.activities.actions.activity.participants.persons')\n                            </template>\n                        </h3>\n\n                        {!! view_render_event('admin.components.activities.actions.activity.participants.dropdown.user_type.after') !!}\n\n                        {!! view_render_event('admin.components.activities.actions.activity.participants.dropdown.no_results.before') !!}\n\n                        <ul>\n                            <li\n                                class=\"rounded-sm px-5 py-2 text-sm text-gray-800 dark:text-white\"\n                                v-if=\"! searchedParticipants[userType].length && ! isSearching[userType]\"\n                            >\n                                <p class=\"text-sm text-gray-500 dark:text-gray-400\">\n                                    @lang('admin::app.components.activities.actions.activity.participants.no-results')\n                                </p>\n                            </li>\n\n                            <li\n                                class=\"cursor-pointer rounded-sm px-3 py-2 text-sm text-gray-800 hover:bg-gray-100 dark:text-white dark:hover:bg-gray-950\"\n                                v-for=\"user in searchedParticipants[userType]\"\n                                @click=\"add(userType, user)\"\n                            >\n                                @{{ user.name }}\n                            </li>\n                        </ul>\n\n                        {!! view_render_event('admin.components.activities.actions.activity.participants.dropdown.no_results.after') !!}\n                    </li>\n                </ul>\n            </div>\n\n            {!! view_render_event('admin.components.activities.actions.activity.participants.dropdown.after') !!}\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-activity-participants', {\n            template: '#v-activity-participants-template',\n\n            props: {\n                participants: {\n                    type: Object,\n                    default: () => ({\n                        users: [],\n\n                        persons: [],\n                    })\n                }\n            },\n\n            data: function () {\n                return {\n                    isSearching: {\n                        users: false,\n                        \n                        persons: false,\n                    },\n\n                    searchTerm: '',\n\n                    addedParticipants: {\n                        users: [],\n                        \n                        persons: [],\n                    },\n\n                    searchedParticipants: {\n                        users: [],\n                        \n                        persons: [],\n                    },\n\n                    searchEnpoints: {\n                        users: \"{{ route('admin.settings.users.search') }}\",\n                        \n                        persons: \"{{ route('admin.contacts.persons.search') }}\",\n                    },\n                }\n            },\n\n            watch: {\n                searchTerm(newVal, oldVal) {\n                    this.search('users');\n                    \n                    this.search('persons');\n                },\n            },\n\n            mounted() {\n                this.addedParticipants = this.participants;\n            },\n\n            methods: {\n                search(userType) {\n                    if (this.searchTerm.length <= 1) {\n                        this.searchedParticipants[userType] = [];\n\n                        this.isSearching[userType] = false;\n\n                        return;\n                    }\n\n                    this.isSearching[userType] = true;\n\n                    let self = this;\n                    \n                    this.$axios.get(this.searchEnpoints[userType], {\n                            params: {\n                                search: 'name:' + this.searchTerm,\n                                searchFields: 'name:like',\n                            }\n                        })\n                        .then (function(response) {\n                            self.addedParticipants[userType].forEach(function(addedParticipant) {\n                                response.data.data = response.data.data.filter(function(participant) {\n                                    return participant.id !== addedParticipant.id;\n                                });\n                            });\n\n                            self.searchedParticipants[userType] = response.data.data;\n\n                            self.isSearching[userType] = false;\n                        })\n                        .catch (function (error) {\n                            self.isSearching[userType] = false;\n                        });\n                },\n\n                add(userType, participant) {\n                    this.addedParticipants[userType].push(participant);\n\n                    this.searchTerm = '';\n\n                    this.searchedParticipants = {\n                        users: [],\n                        \n                        persons: [],\n                    };\n                },\n\n                remove(userType, participant) {\n                    this.addedParticipants[userType] = this.addedParticipants[userType].filter(function(addedParticipant) {\n                        return addedParticipant.id !== participant.id;\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/activities/actions/activity.blade.php",
    "content": "@props([\n    'entity' => null,\n    'entityControlName' => null,\n])\n\n<!-- Activity Button -->\n<div>\n    {!! view_render_event('admin.components.activities.actions.activity.create_btn.before') !!}\n\n    <button\n        class=\"flex h-[74px] w-[84px] flex-col items-center justify-center gap-1 rounded-lg border border-transparent bg-blue-200 font-medium text-blue-800 transition-all hover:border-blue-400\"\n        @click=\"$refs.actionComponent.openModal('mail')\"\n    >\n        <span class=\"icon-activity text-2xl dark:!text-blue-800\"></span>\n\n        @lang('admin::app.components.activities.actions.activity.btn')\n    </button>\n\n    {!! view_render_event('admin.components.activities.actions.activity.create_btn.after') !!}\n\n    {!! view_render_event('admin.components.activities.actions.activity.before') !!}\n\n    <!-- Note Action Vue Component -->\n    <v-activity\n        ref=\"actionComponent\"\n        :entity=\"{{ json_encode($entity) }}\"\n        entity-control-name=\"{{ $entityControlName }}\"\n    ></v-activity>\n\n    {!! view_render_event('admin.components.activities.actions.activity.after') !!}\n</div>\n\n\n@pushOnce('scripts')\n    <script type=\"text/x-template\" id=\"v-activity-template\">\n        <Teleport to=\"body\">\n            {!! view_render_event('admin.components.activities.actions.activity.form_controls.before') !!}\n\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modalForm\"\n            >\n                <form @submit=\"handleSubmit($event, save)\">\n                    {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.before') !!}\n\n                    <x-admin::modal\n                        ref=\"activityModal\"\n                        position=\"bottom-right\"\n                    >\n                        <x-slot:header>\n                            {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.header.dropdown.before') !!}\n\n                            <x-admin::dropdown>\n                                <x-slot:toggle>\n                                    <h3 class=\"flex cursor-pointer items-center gap-1 text-base font-semibold dark:text-white\">\n                                        @lang('admin::app.components.activities.actions.activity.title') - @{{ selectedType.label }}\n\n                                        <span class=\"icon-down-arrow text-2xl\"></span>\n                                    </h3>\n                                </x-slot>\n\n                                <x-slot:menu>\n                                    {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.header.dropdown.menu_item.before') !!}\n\n                                    <x-admin::dropdown.menu.item\n                                        ::class=\"{ 'bg-gray-100 dark:bg-gray-950': selectedType.value === type.value }\"\n                                        v-for=\"type in availableTypes\"\n                                        @click=\"selectedType = type\"\n                                    >\n                                        @{{ type.label }}\n                                    </x-admin::dropdown.menu.item>\n\n                                    {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.header.dropdown.menu_item.after') !!}\n                                </x-slot>\n                            </x-admin::dropdown>\n\n                            {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.header.dropdown.after') !!}\n                        </x-slot>\n\n                        <x-slot:content>\n                            {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.content.controls.before') !!}\n\n                            <!-- Activity Type -->\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"type\"\n                                v-model=\"selectedType.value\"\n                            />\n\n                            <!-- Id -->\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                ::name=\"entityControlName\"\n                                ::value=\"entity.id\"\n                            />\n\n                            <!-- Title -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.components.activities.actions.activity.title-control')\n                                </x-admin::form.control-group.label>\n                                \n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"title\"\n                                    rules=\"required|max:80\"\n                                    :label=\"trans('admin::app.components.activities.actions.activity.title-control')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"title\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Description -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label>\n                                    @lang('admin::app.components.activities.actions.activity.description')\n                                </x-admin::form.control-group.label>\n                                \n                                <x-admin::form.control-group.control\n                                    type=\"textarea\"\n                                    name=\"comment\"\n                                    rules=\"max:500\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"comment\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Participants -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label>\n                                    @lang('admin::app.components.activities.actions.activity.participants.title')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::activities.actions.activity.participants />\n                            </x-admin::form.control-group>\n\n                            <!-- Schedule Date -->\n                            <div class=\"flex gap-4\">\n                                <!-- Started From -->\n                                <x-admin::form.control-group class=\"w-full\">\n                                    <x-admin::form.control-group.label class=\"required\">\n                                        @lang('admin::app.components.activities.actions.activity.schedule-from')\n                                    </x-admin::form.control-group.label>\n                                    \n                                    <x-admin::form.control-group.control\n                                        type=\"datetime\"\n                                        name=\"schedule_from\"\n                                        rules=\"required\"\n                                        :label=\"trans('admin::app.components.activities.actions.activity.schedule-from')\"\n                                    />\n\n                                    <x-admin::form.control-group.error control-name=\"schedule_from\" />\n                                </x-admin::form.control-group>\n                                \n                                <!-- Started To -->\n                                <x-admin::form.control-group class=\"w-full\">\n                                    <x-admin::form.control-group.label class=\"required\">\n                                        @lang('admin::app.components.activities.actions.activity.schedule-to')\n                                    </x-admin::form.control-group.label>\n                                    \n                                    <x-admin::form.control-group.control\n                                        type=\"datetime\"\n                                        name=\"schedule_to\"\n                                        rules=\"required\"\n                                        :label=\"trans('admin::app.components.activities.actions.activity.schedule-to')\"\n                                    />\n\n                                    <x-admin::form.control-group.error control-name=\"schedule_to\" />\n                                </x-admin::form.control-group>\n                            </div>\n\n                            <!-- Location -->\n                            <x-admin::form.control-group class=\"!mb-0\">\n                                <x-admin::form.control-group.label>\n                                    @lang('admin::app.components.activities.actions.activity.location')\n                                </x-admin::form.control-group.label>\n                                \n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"location\"\n                                />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.content.controls.after') !!}\n                        </x-slot>\n\n                        <x-slot:footer>\n                            {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.footer.save_button.before') !!}\n\n                            <x-admin::button\n                                class=\"primary-button\"\n                                :title=\"trans('admin::app.components.activities.actions.activity.save-btn')\"\n                                ::loading=\"isStoring\"\n                                ::disabled=\"isStoring\"\n                            />\n\n                            {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.footer.save_button.after') !!}\n                        </x-slot>\n                    </x-admin::modal>\n\n                    {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.after') !!}\n                </form>\n            </x-admin::form>\n\n            {!! view_render_event('admin.components.activities.actions.activity.form_controls.after') !!}\n        </Teleport>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-activity', {\n            template: '#v-activity-template',\n\n            props: {\n                entity: {\n                    type: Object,\n                    required: true,\n                    default: () => {}\n                },\n\n                entityControlName: {\n                    type: String,\n                    required: true,\n                    default: ''\n                }\n            },\n\n            data: function () {\n                return {\n                    isStoring: false,\n                    \n                    selectedType: {\n                        label: \"{{ trans('admin::app.components.activities.actions.activity.call') }}\",\n                        value: 'call'\n                    },\n\n                    availableTypes: [\n                        {\n                            label: \"{{ trans('admin::app.components.activities.actions.activity.call') }}\",\n                            value: 'call'\n                        }, {\n                            label: \"{{ trans('admin::app.components.activities.actions.activity.meeting') }}\",\n                            value: 'meeting'\n                        }, {\n                            label: \"{{ trans('admin::app.components.activities.actions.activity.lunch') }}\",\n                            value: 'lunch'\n                        },\n                    ]\n                }\n            },\n\n            methods: {\n                openModal(type) {\n                    this.$refs.activityModal.open();\n                },\n\n                save(params) {\n                    this.isStoring = true;\n\n                    this.$axios.post(\"{{ route('admin.activities.store') }}\", params)\n                        .then (response => {\n                            this.isStoring = false;\n\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                            this.$emitter.emit('on-activity-added', response.data.data);\n\n                            this.$refs.activityModal.close();\n                        })\n                        .catch (error => {\n                            this.isStoring = false;\n\n                            if (error.response.status == 422) {\n                                setErrors(error.response.data.errors);\n                            } else {\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n\n                                this.$refs.activityModal.close();\n                            }\n                        });\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/activities/actions/file.blade.php",
    "content": "@props([\n    'entity' => null,\n    'entityControlName' => null,\n])\n\n<!-- File Button -->\n<div>\n    {!! view_render_event('admin.components.activities.actions.file.create_btn.before') !!}\n\n    <button\n        class=\"flex h-[74px] w-[84px] flex-col items-center justify-center gap-1 rounded-lg border border-transparent bg-cyan-200 font-medium text-cyan-900 transition-all hover:border-cyan-400\"\n        @click=\"$refs.fileActionComponent.openModal('mail')\"\n    >\n        <span class=\"icon-file text-2xl dark:!text-cyan-900\"></span>\n\n        @lang('admin::app.components.activities.actions.file.btn')\n    </button>\n\n    {!! view_render_event('admin.components.activities.actions.file.create_btn.after') !!}\n\n    {!! view_render_event('admin.components.activities.actions.file.before') !!}\n\n    <!-- File Action Vue Component -->\n    <v-file-activity\n        ref=\"fileActionComponent\"\n        :entity=\"{{ json_encode($entity) }}\"\n        entity-control-name=\"{{ $entityControlName }}\"\n    ></v-file-activity>\n\n    {!! view_render_event('admin.components.activities.actions.file.after') !!}\n</div>\n\n@pushOnce('scripts')\n    <script type=\"text/x-template\" id=\"v-file-activity-template\">\n        <Teleport to=\"body\">\n            {!! view_render_event('admin.components.activities.actions.file.form_controls.before') !!}\n\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modalForm\"\n            >\n                <form @submit=\"handleSubmit($event, save)\">\n                    {!! view_render_event('admin.components.activities.actions.file.form_controls.modal.before') !!}\n\n                    <x-admin::modal\n                        ref=\"fileActivityModal\"\n                        position=\"bottom-right\"\n                    >\n                        <x-slot:header>\n                            {!! view_render_event('admin.components.activities.actions.file.form_controls.modal.header.title.before') !!}\n\n                            <h3 class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.components.activities.actions.file.title')\n                            </h3>\n\n                            {!! view_render_event('admin.components.activities.actions.file.form_controls.modal.header.title.after') !!}\n                        </x-slot>\n\n                        <x-slot:content>\n                            {!! view_render_event('admin.components.activities.actions.file.form_controls.modal.content.controls.before') !!}\n\n                            <!-- Activity Type -->\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"type\"\n                                value=\"file\"\n                            />\n                            \n                            <!-- Id -->\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                ::name=\"entityControlName\"\n                                ::value=\"entity.id\"\n                            />\n\n                            <!-- Title -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label>\n                                    @lang('admin::app.components.activities.actions.file.title-control')\n                                </x-admin::form.control-group.label>\n                                \n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"title\"\n                                />\n                            </x-admin::form.control-group>\n\n                            <!-- Description -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label>\n                                    @lang('admin::app.components.activities.actions.file.description')\n                                </x-admin::form.control-group.label>\n                                \n                                <x-admin::form.control-group.control\n                                    type=\"textarea\"\n                                    name=\"comment\"\n                                />\n                            </x-admin::form.control-group>\n                            \n                            <!-- File Name -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label>\n                                    @lang('admin::app.components.activities.actions.file.name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"name\"\n                                />\n                            </x-admin::form.control-group>\n\n                            <!-- File -->\n                            <x-admin::form.control-group class=\"!mb-0\">\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.components.activities.actions.file.file')\n                                </x-admin::form.control-group.label>\n                                \n                                <x-admin::form.control-group.control\n                                    type=\"file\"\n                                    id=\"file\"\n                                    name=\"file\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.components.activities.actions.file.file')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"file\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.components.activities.actions.file.form_controls.modal.content.controls.after') !!}\n                        </x-slot>\n\n                        <x-slot:footer>\n                            {!! view_render_event('admin.components.activities.actions.file.form_controls.modal.footer.save_buton.before') !!}\n\n                            <x-admin::button\n                                class=\"primary-button\"\n                                :title=\"trans('admin::app.components.activities.actions.file.save-btn')\"\n                                ::loading=\"isStoring\"\n                                ::disabled=\"isStoring\"\n                            />\n\n                            {!! view_render_event('admin.components.activities.actions.file.form_controls.modal.footer.save_buton.after') !!}\n                        </x-slot>\n                    </x-admin::modal>\n\n                    {!! view_render_event('admin.components.activities.actions.file.form_controls.modal.after') !!}\n                </form>\n            </x-admin::form>\n\n            {!! view_render_event('admin.components.activities.actions.file.form_controls.after') !!}\n        </Teleport>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-file-activity', {\n            template: '#v-file-activity-template',\n\n            props: {\n                entity: {\n                    type: Object,\n                    required: true,\n                    default: () => {}\n                },\n\n                entityControlName: {\n                    type: String,\n                    required: true,\n                    default: ''\n                }\n            },\n\n            data: function () {\n                return {\n                    isStoring: false,\n                }\n            },\n\n            methods: {\n                openModal(type) {\n                    this.$refs.fileActivityModal.open();\n                },\n\n                save(params, { setErrors }) {\n                    this.isStoring = true;\n\n                    this.$axios.post(\"{{ route('admin.activities.store') }}\", params, {\n                            headers: {\n                                'Content-Type': 'multipart/form-data',\n                            }\n                        })\n                        .then (response => {\n                            this.isStoring = false;\n\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                            this.$emitter.emit('on-activity-added', response.data.data);\n\n                            this.$refs.fileActivityModal.close();\n                        })\n                        .catch (error => {\n                            this.isStoring = false;\n\n                            if (error.response.status == 422) {\n                                setErrors(error.response.data.errors);\n                            } else {\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n\n                                this.$refs.fileActivityModal.close();\n                            }\n                        });\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/activities/actions/mail.blade.php",
    "content": "@props([\n    'entity' => null,\n    'entityControlName' => null,\n])\n\n<!-- Mail Button -->\n<div>\n    {!! view_render_event('admin.components.activities.actions.mail.create_btn.before') !!}\n\n    <button\n        class=\"flex h-[74px] w-[84px] flex-col items-center justify-center gap-1 rounded-lg border border-transparent bg-green-200 font-medium text-green-900 transition-all hover:border-green-400\"\n        @click=\"$refs.mailActionComponent.openModal('mail')\"\n    >\n        <span class=\"icon-mail text-2xl dark:!text-green-900\"></span>\n\n        @lang('admin::app.components.activities.actions.mail.btn')\n    </button>\n\n    {!! view_render_event('admin.components.activities.actions.mail.create_btn.after') !!}\n\n    {!! view_render_event('admin.components.activities.actions.mail.before') !!}\n\n    <!-- Mail Activity Action Vue Component -->\n    <v-mail-activity\n        ref=\"mailActionComponent\"\n        :entity=\"{{ json_encode($entity) }}\"\n        entity-control-name=\"{{ $entityControlName }}\"\n    ></v-mail-activity>\n\n    {!! view_render_event('admin.components.activities.actions.mail.after') !!}\n</div>\n\n@pushOnce('scripts')\n    <script type=\"text/x-template\" id=\"v-mail-activity-template\">\n        <Teleport to=\"body\">\n            {!! view_render_event('admin.components.activities.actions.mail.form_controls.before') !!}\n\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                enctype=\"multipart/form-data\"\n                as=\"div\"\n            >\n                <form\n                    @submit=\"handleSubmit($event, save)\"\n                    ref=\"mailActionForm\"\n                >\n                    {!! view_render_event('admin.components.activities.actions.mail.form_controls.modal.before') !!}\n\n                    <x-admin::modal\n                        ref=\"mailActivityModal\"\n                        position=\"bottom-right\"\n                    >\n                        <x-slot:header>\n                            {!! view_render_event('admin.components.activities.actions.mail.form_controls.modal.header.before') !!}\n\n                            <h3 class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.components.activities.actions.mail.title')\n                            </h3>\n\n                            {!! view_render_event('admin.components.activities.actions.mail.form_controls.modal.header.before') !!}\n                        </x-slot>\n\n                        <x-slot:content>\n                            {!! view_render_event('admin.components.activities.actions.mail.form_controls.modal.content.controls.before') !!}\n\n                            <!-- Activity Type -->\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"type\"\n                                value=\"email\"\n                            />\n                            \n                            <!-- Id -->\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                ::name=\"entityControlName\"\n                                ::value=\"entity.id\"\n                            />\n                            \n                            <!-- To -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.components.activities.actions.mail.to')\n                                </x-admin::form.control-group.label>\n\n                                <div class=\"relative\">\n                                    <x-admin::form.control-group.control\n                                        type=\"tags\"\n                                        name=\"reply_to\"\n                                        rules=\"required\"\n                                        input-rules=\"email\"\n                                        :label=\"trans('admin::app.components.activities.actions.mail.to')\"\n                                        :placeholder=\"trans('admin::app.components.activities.actions.mail.enter-emails')\"\n                                    />\n\n                                    <div class=\"absolute top-[9px] flex items-center gap-2 ltr:right-2 rtl:left-2\">\n                                        <span\n                                            class=\"cursor-pointer font-medium hover:underline dark:text-white\"\n                                            @click=\"showCC = ! showCC\"\n                                        >\n                                            @lang('admin::app.components.activities.actions.mail.cc')\n                                        </span>\n\n                                        <span\n                                            class=\"cursor-pointer font-medium hover:underline dark:text-white\"\n                                            @click=\"showBCC = ! showBCC\"\n                                        >\n                                            @lang('admin::app.components.activities.actions.mail.bcc')\n                                        </span>\n                                    </div>\n                                </div>\n\n                                <x-admin::form.control-group.error control-name=\"reply_to\" />\n                            </x-admin::form.control-group>\n\n                            <template v-if=\"showCC\">\n                                <!-- Cc -->\n                                <x-admin::form.control-group>\n                                    <x-admin::form.control-group.label>\n                                        @lang('admin::app.components.activities.actions.mail.cc')\n                                    </x-admin::form.control-group.label>\n\n                                    <x-admin::form.control-group.control\n                                        type=\"tags\"\n                                        name=\"cc\"\n                                        input-rules=\"email\"\n                                        :label=\"trans('admin::app.components.activities.actions.mail.cc')\"\n                                        :placeholder=\"trans('admin::app.components.activities.actions.mail.enter-emails')\"\n                                    />\n\n                                    <x-admin::form.control-group.error control-name=\"cc\" />\n                                </x-admin::form.control-group>\n                            </template>\n\n                            <template v-if=\"showBCC\">\n                                <!-- Cc -->\n                                <x-admin::form.control-group>\n                                    <x-admin::form.control-group.label>\n                                        @lang('admin::app.components.activities.actions.mail.bcc')\n                                    </x-admin::form.control-group.label>\n\n                                    <x-admin::form.control-group.control\n                                        type=\"tags\"\n                                        name=\"bcc\"\n                                        input-rules=\"email\"\n                                        :label=\"trans('admin::app.components.activities.actions.mail.bcc')\"\n                                        :placeholder=\"trans('admin::app.components.activities.actions.mail.enter-emails')\"\n                                    />\n\n                                    <x-admin::form.control-group.error control-name=\"bcc\" />\n                                </x-admin::form.control-group>\n                            </template>\n\n                            <!-- Subject -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.components.activities.actions.mail.subject')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"subject\"\n                                    name=\"subject\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.components.activities.actions.mail.subject')\"\n                                    :placeholder=\"trans('admin::app.components.activities.actions.mail.subject')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"subject\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Content -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.control\n                                    type=\"textarea\"\n                                    name=\"reply\"\n                                    id=\"reply\"\n                                    rules=\"required\"\n                                    {{-- tinymce=\"true\" --}}\n                                    :label=\"trans('admin::app.components.activities.actions.mail.message')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"reply\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Attachments -->\n                            <x-admin::form.control-group class=\"!mb-0\">\n                                <x-admin::attachments\n                                    allow-multiple=\"true\"\n                                    hide-button=\"true\"\n                                />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.components.activities.actions.mail.form_controls.modal.content.controls.after') !!}\n                        </x-slot>\n\n                        <x-slot:footer>\n                            {!! view_render_event('admin.components.activities.actions.mail.form_controls.modal.footer.save_button.before') !!}\n\n                            <div class=\"flex w-full items-center justify-between\">\n                                <label\n                                    class=\"icon-attachment cursor-pointer p-1 text-2xl hover:rounded-md hover:bg-gray-100 dark:hover:bg-gray-950\"\n                                    for=\"file-upload\"\n                                ></label>\n\n                                <x-admin::button\n                                    class=\"primary-button\"\n                                    :title=\"trans('admin::app.components.activities.actions.mail.send-btn')\"\n                                    ::loading=\"isStoring\"\n                                    ::disabled=\"isStoring\"\n                                />\n                            </div>\n\n                            {!! view_render_event('admin.components.activities.actions.mail.form_controls.modal.footer.save_button.after') !!}\n                        </x-slot>\n                    </x-admin::modal>\n\n                    {!! view_render_event('admin.components.activities.actions.mail.form_controls.modal.after') !!}\n                </form>\n            </x-admin::form>\n\n            {!! view_render_event('admin.components.activities.actions.mail.form_controls.after') !!}\n        </Teleport>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-mail-activity', {\n            template: '#v-mail-activity-template',\n\n            props: {\n                entity: {\n                    type: Object,\n                    required: true,\n                    default: () => {}\n                },\n\n                entityControlName: {\n                    type: String,\n                    required: true,\n                    default: ''\n                }\n            },\n\n            data() {\n                return {\n                    showCC: false,\n\n                    showBCC: false,\n\n                    isStoring: false,\n                }\n            },\n\n            methods: {\n                openModal(type) {\n                    this.$refs.mailActivityModal.open();\n                },\n\n                save(params, { resetForm, setErrors  }) {\n                    this.isStoring = true;\n\n                    let formData = new FormData(this.$refs.mailActionForm);\n\n                    this.$axios.post(\"{{ route('admin.leads.emails.store', 'replaceLeadId') }}\".replace('replaceLeadId', this.entity.id), formData, {\n                            headers: {\n                                'Content-Type': 'multipart/form-data'\n                            }\n                        })\n                        .then (response => {\n                            this.isStoring = false;\n\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                            this.$emitter.emit('on-activity-added', response.data.data);\n\n                            this.$refs.mailActivityModal.close();\n                        })\n                        .catch (error => {\n                            this.isStoring = false;\n\n                            if (error.response.status == 422) {\n                                setErrors(error.response.data.errors);\n                            } else {\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n\n                                this.$refs.mailActivityModal.close();\n                            }\n                        });\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/activities/actions/note.blade.php",
    "content": "@props([\n    'entity' => null,\n    'entityControlName' => null,\n])\n\n<!-- Note Button -->\n<div>\n    {!! view_render_event('admin.components.activities.actions.note.create_btn.before') !!}\n\n    <button\n        class=\"flex h-[74px] w-[84px] flex-col items-center justify-center gap-1 rounded-lg border border-transparent bg-orange-200 font-medium text-orange-800 transition-all hover:border-orange-400\"\n        @click=\"$refs.noteActionComponent.openModal('mail')\"\n    >\n        <span class=\"icon-note text-2xl dark:!text-orange-800\"></span>\n\n        @lang('admin::app.components.activities.actions.note.btn')\n    </button>\n\n    {!! view_render_event('admin.components.activities.actions.note.create_btn.after') !!}\n\n    {!! view_render_event('admin.components.activities.actions.note.before') !!}\n\n    <!-- Note Action Vue Component -->\n    <v-note-activity\n        ref=\"noteActionComponent\"\n        :entity=\"{{ json_encode($entity) }}\"\n        entity-control-name=\"{{ $entityControlName }}\"\n    ></v-note-activity>\n\n    {!! view_render_event('admin.components.activities.actions.note.after') !!}\n</div>\n\n@pushOnce('scripts')\n    <script type=\"text/x-template\" id=\"v-note-activity-template\">\n        <Teleport to=\"body\">\n            {!! view_render_event('admin.components.activities.actions.note.form_controls.before') !!}\n\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modalForm\"\n            >\n                <form @submit=\"handleSubmit($event, save)\">\n                    {!! view_render_event('admin.components.activities.actions.note.form_controls.modal.before') !!}\n\n                    <x-admin::modal \n                        ref=\"noteActivityModal\"\n                        position=\"bottom-right\"\n                    >\n                        <x-slot:header>\n                            {!! view_render_event('admin.components.activities.actions.note.form_controls.modal.header.title.before') !!}\n\n                            <h3 class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.components.activities.actions.note.title')\n                            </h3>\n\n                            {!! view_render_event('admin.components.activities.actions.note.form_controls.modal.header.title.after') !!}\n                        </x-slot>\n\n                        <x-slot:content>\n                            {!! view_render_event('admin.components.activities.actions.note.form_controls.modal.header.content.controls.before') !!}\n\n                            <!-- Activity Type -->\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"type\"\n                                value=\"note\"\n                            />\n                            \n                            <!-- Id -->\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                ::name=\"entityControlName\"\n                                ::value=\"entity.id\"\n                            />\n\n                            <!-- Comment -->\n                            <x-admin::form.control-group class=\"!mb-0\">\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.components.activities.actions.note.comment')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"textarea\"\n                                    name=\"comment\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.components.activities.actions.note.comment')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"comment\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.components.activities.actions.note.form_controls.modal.header.content.controls.after') !!}\n                        </x-slot>\n\n                        <x-slot:footer>\n                            {!! view_render_event('admin.components.activities.actions.note.form_controls.modal.header.footer.save_button.before') !!}\n\n                            <x-admin::button\n                                class=\"primary-button\"\n                                :title=\"trans('admin::app.components.activities.actions.note.save-btn')\"\n                                ::loading=\"isStoring\"\n                                ::disabled=\"isStoring\"\n                            />\n\n                            {!! view_render_event('admin.components.activities.actions.note.form_controls.modal.header.footer.save_button.after') !!}\n                        </x-slot>\n                    </x-admin::modal>\n\n                    {!! view_render_event('admin.components.activities.actions.note.form_controls.modal.after') !!}\n                </form>\n            </x-admin::form>\n\n            {!! view_render_event('admin.components.activities.actions.note.form_controls.after') !!}\n        </Teleport>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-note-activity', {\n            template: '#v-note-activity-template',\n\n            props: {\n                entity: {\n                    type: Object,\n                    required: true,\n                    default: () => {}\n                },\n\n                entityControlName: {\n                    type: String,\n                    required: true,\n                    default: ''\n                }\n            },\n\n            data: function () {\n                return {\n                    isStoring: false,\n                }\n            },\n\n            methods: {\n                openModal(type) {\n                    this.$refs.noteActivityModal.open();\n                },\n\n                save(params) {\n                    this.isStoring = true;\n\n                    this.$axios.post(\"{{ route('admin.activities.store') }}\", params)\n                        .then (response => {\n                            this.isStoring = false;\n\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                            this.$emitter.emit('on-activity-added', response.data.data);\n\n                            this.$refs.noteActivityModal.close();\n                        })\n                        .catch (error => {\n                            this.isStoring = false;\n\n                            if (error.response.status == 422) {\n                                setErrors(error.response.data.errors);\n                            } else {\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n\n                                this.$refs.noteActivityModal.close();\n                            }\n                        });\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/activities/index.blade.php",
    "content": "@props([\n    'endpoint',\n    'emailDetachEndpoint' => null,\n    'activeType' => 'all',\n    'types' => null,\n    'extraTypes' => null,\n])\n\n{!! view_render_event('admin.components.activities.before') !!}\n\n<!-- Lead Activities Vue Component -->\n<v-activities\n    endpoint=\"{{ $endpoint }}\"\n    email-detach-endpoint=\"{{ $emailDetachEndpoint }}\"\n    active-type=\"{{ $activeType }}\"\n    @if($types):types='@json($types)'@endif\n    @if($extraTypes):extra-types='@json($extraTypes)'@endif\n    ref=\"activities\"\n>\n    <!-- Shimmer -->\n    <x-admin::shimmer.activities />\n\n    @foreach ($extraTypes ?? [] as $type)\n        <template v-slot:{{ $type['name'] }}>\n            {{ ${$type['name']} ?? '' }}\n        </template>\n    @endforeach\n</v-activities>\n\n{!! view_render_event('admin.components.activities.after') !!}\n\n@pushOnce('scripts')\n    <script type=\"text/x-template\" id=\"v-activities-template\">\n        <template v-if=\"isLoading\">\n            <!-- Shimmer -->\n            <x-admin::shimmer.activities />\n        </template>\n\n        <template v-else>\n            {!! view_render_event('admin.components.activities.content.before') !!}\n\n            <div class=\"rounded-md border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                <div class=\"flex flex-wrap gap-2 border-b border-gray-200 dark:border-gray-800\">\n                    {!! view_render_event('admin.components.activities.content.types.before') !!}\n\n                    <div\n                        v-for=\"type in types\"\n                        class=\"cursor-pointer px-3 py-2.5 text-sm font-medium dark:text-white\"\n                        :class=\"{'border-brandColor border-b-2 !text-brandColor transition': selectedType == type.name }\"\n                        @click=\"selectedType = type.name\"\n                    >\n                        @{{ type.label }}\n                    </div>\n\n                    {!! view_render_event('admin.components.activities.content.types.after') !!}\n                </div>\n\n                <!-- Show Default Activities if selectedType not in extraTypes -->\n                <template v-if=\"! extraTypes.find(type => type.name == selectedType)\">\n                    <div class=\"animate-[on-fade_0.5s_ease-in-out] p-4\">\n                        {!! view_render_event('admin.components.activities.content.activity.list.before') !!}\n\n                        <!-- Activity List -->\n                        <div class=\"flex flex-col gap-4\">\n                            {!! view_render_event('admin.components.activities.content.activity.item.before') !!}\n\n                            <!-- Activity Item -->\n                            <div\n                                class=\"flex gap-2\"\n                                v-for=\"(activity, index) in filteredActivities\"\n                            >\n                                {!! view_render_event('admin.components.activities.content.activity.item.icon.before') !!}\n\n                                <!-- Activity Icon -->\n                                <div\n                                    class=\"mt-2 flex h-9 min-h-9 w-9 min-w-9 items-center justify-center rounded-full text-xl\"\n                                    :class=\"typeClasses[activity.type] ?? typeClasses['default']\"\n                                >\n                                </div>\n\n                                {!! view_render_event('admin.components.activities.content.activity.item.icon.after') !!}\n\n                                {!! view_render_event('admin.components.activities.content.activity.item.details.before') !!}\n\n                                <!-- Activity Details -->\n                                <div\n                                    class=\"flex w-full justify-between gap-4 rounded-md p-4\"\n                                    :class=\"{'bg-gray-100 dark:bg-gray-950': index % 2 != 0 }\"\n                                >\n                                    <div class=\"flex flex-col gap-2\">\n                                        {!! view_render_event('admin.components.activities.content.activity.item.title.before') !!}\n\n                                        <!-- Activity Title -->\n                                        <div\n                                            class=\"flex flex-col gap-1\"\n                                            v-if=\"activity.title\"\n                                        >\n                                            <p class=\"flex flex-wrap items-center gap-1 font-medium dark:text-white\">\n                                                @{{ activity.title }}\n\n                                                <template v-if=\"activity.type == 'system' && activity.additional\">\n                                                    <p class=\"flex items-center gap-1\">\n                                                        <span>:</span>\n\n                                                        <span class=\"break-words\">\n                                                            @{{ (activity.additional.old.label ? String(activity.additional.old.label).replaceAll('<br>', ' ') : \"@lang('admin::app.components.activities.index.empty')\") }}\n                                                        </span>\n\n                                                        <span class=\"icon-stats-up rotate-90 text-xl\"></span>\n\n                                                        <span class=\"break-words\">\n                                                            @{{ (activity.additional.new.label ? String(activity.additional.new.label).replaceAll('<br>', ' ') : \"@lang('admin::app.components.activities.index.empty')\") }}\n                                                        </span>\n                                                    </p>\n                                                </template>\n                                            </p>\n\n                                            <template v-if=\"activity.type == 'email'\">\n                                                <p class=\"dark:text-white\">\n                                                    @lang('admin::app.components.activities.index.from'):\n\n                                                    @{{ activity.additional.from }}\n                                                </p>\n\n                                                <p class=\"dark:text-white\">\n                                                    @lang('admin::app.components.activities.index.to'):\n\n                                                    @{{ activity.additional.to.join(', ') }}\n                                                </p>\n\n                                                <p\n                                                    v-if=\"activity.additional.cc\"\n                                                    class=\"dark:text-white\"\n                                                >\n                                                    @lang('admin::app.components.activities.index.cc'):\n\n                                                    @{{ activity.additional.cc.join(', ') }}\n                                                </p>\n\n                                                <p\n                                                    v-if=\"activity.additional.bcc\"\n                                                    class=\"dark:text-white\"\n                                                >\n                                                    @lang('admin::app.components.activities.index.bcc'):\n\n                                                    @{{ activity.additional.bcc.join(', ') }}\n                                                </p>\n                                            </template>\n\n                                            <template v-else>\n                                                <!-- Activity Schedule -->\n                                                <p\n                                                    v-if=\"activity.schedule_from && activity.schedule_from\"\n                                                    class=\"dark:text-white\"\n                                                >\n                                                    @lang('admin::app.components.activities.index.scheduled-on'):\n\n                                                    @{{ $admin.formatDate(activity.schedule_from, 'd MMM yyyy, h:mm A', timezone) + ' - ' + $admin.formatDate(activity.schedule_to, 'd MMM yyyy, h:mm A', timezone) }}\n                                                </p>\n\n                                                <!-- Activity Participants -->\n                                                <p\n                                                    v-if=\"activity.participants?.length\"\n                                                    class=\"dark:text-white\"\n                                                >\n                                                    @lang('admin::app.components.activities.index.participants'):\n\n                                                    <span class=\"after:content-[',_'] last:after:content-['']\" v-for=\"(participant, index) in activity.participants\">\n                                                        @{{ participant.user?.name ?? participant.person.name }}\n                                                    </span>\n                                                </p>\n\n                                                <!-- Activity Location -->\n                                                <p\n                                                    v-if=\"activity.location\"\n                                                    class=\"dark:text-white\"\n                                                >\n                                                    @lang('admin::app.components.activities.index.location'):\n\n                                                    @{{ activity.location }}\n                                                </p>\n                                            </template>\n                                        </div>\n\n                                        {!! view_render_event('admin.components.activities.content.activity.item.title.after') !!}\n\n                                        {!! view_render_event('admin.components.activities.content.activity.item.description.before') !!}\n\n                                        <!-- Activity Description -->\n                                        <p\n                                            class=\"dark:text-white\"\n                                            v-if=\"activity.comment\"\n                                            v-safe-html=\"activity.comment\"\n                                        ></p>\n\n                                        {!! view_render_event('admin.components.activities.content.activity.item.description.after') !!}\n\n                                        {!! view_render_event('admin.components.activities.content.activity.item.attachments.before') !!}\n\n                                        <!-- Attachments -->\n                                        <div\n                                            class=\"flex flex-wrap gap-2\"\n                                            v-if=\"activity.files.length\"\n                                        >\n                                            <a\n                                                :href=\"\n                                                    activity.type == 'email'\n                                                    ? `{{ route('admin.mail.attachment_download', 'replaceID') }}`.replace('replaceID', file.id)\n                                                    : `{{ route('admin.activities.file_download', 'replaceID') }}`.replace('replaceID', file.id)\n                                                \"\n                                                class=\"flex cursor-pointer items-center gap-1 rounded-md p-1.5\"\n                                                target=\"_blank\"\n                                                v-for=\"(file, index) in activity.files\"\n                                            >\n                                                <span class=\"icon-attached-file text-xl\"></span>\n\n                                                <span class=\"font-medium text-brandColor\">\n                                                    @{{ file.name }}\n                                                </span>\n                                            </a>\n                                        </div>\n\n                                        {!! view_render_event('admin.components.activities.content.activity.item.attachments.after') !!}\n\n                                        {!! view_render_event('admin.components.activities.content.activity.item.time_and_user.before') !!}\n\n                                        <!-- Activity Time and User -->\n                                        <div class=\"text-gray-500 dark:text-gray-300\">\n                                            @{{ $admin.formatDate(activity.created_at, 'd MMM yyyy, h:mm A', timezone) }},\n\n                                            @{{ \"@lang('admin::app.components.activities.index.by-user', ['user' => 'replace'])\".replace('replace', activity.user?.name ?? '@lang('admin::app.components.activities.index.system')') }}\n                                        </div>\n\n                                        {!! view_render_event('admin.components.activities.content.activity.item.time_and_user.after') !!}\n                                    </div>\n\n                                    {!! view_render_event('admin.components.activities.content.activity.item.more_actions.before') !!}\n\n                                    <!-- Activity More Options -->\n                                    <template v-if=\"activity.type != 'system'\">\n                                        {!! view_render_event('admin.components.activities.content.activity.item.more_actions.dropdown.after') !!}\n\n                                        <x-admin::dropdown position=\"bottom-{{ in_array(app()->getLocale(), ['fa', 'ar']) ? 'left' : 'right' }}\">\n                                            <x-slot:toggle>\n                                                {!! view_render_event('admin.components.activities.content.activity.item.more_actions.dropdown.toggle.before') !!}\n\n                                                <template v-if=\"! isUpdating[activity.id]\">\n                                                    <button\n                                                        class=\"icon-more flex h-7 w-7 cursor-pointer items-center justify-center rounded-md text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800\"\n                                                    ></button>\n                                                </template>\n\n                                                <template v-else>\n                                                    <x-admin::spinner />\n                                                </template>\n\n                                                {!! view_render_event('admin.components.activities.content.activity.item.more_actions.dropdown.toggle.after') !!}\n                                            </x-slot>\n\n                                            <x-slot:menu class=\"!min-w-40\">\n                                                {!! view_render_event('admin.components.activities.content.activity.item.more_actions.dropdown.menu_item.before') !!}\n\n                                                <template v-if=\"activity.type != 'email'\">\n                                                    @if (bouncer()->hasPermission('activities.edit'))\n                                                        <x-admin::dropdown.menu.item\n                                                            v-if=\"! activity.is_done && ['call', 'meeting', 'lunch'].includes(activity.type)\"\n                                                            @click=\"markAsDone(activity)\"\n                                                        >\n                                                            <div class=\"flex items-center gap-2\">\n                                                                <span class=\"icon-tick text-2xl\"></span>\n\n                                                                @lang('admin::app.components.activities.index.mark-as-done')\n                                                            </div>\n                                                        </x-admin::dropdown.menu.item>\n\n                                                        <x-admin::dropdown.menu.item v-if=\"['call', 'meeting', 'lunch'].includes(activity.type)\">\n                                                            <a\n                                                                class=\"flex items-center gap-2\"\n                                                                :href=\"'{{ route('admin.activities.edit', 'replaceId') }}'.replace('replaceId', activity.id)\"\n                                                                target=\"_blank\"\n                                                            >\n                                                                <span class=\"icon-edit text-2xl\"></span>\n\n                                                                @lang('admin::app.components.activities.index.edit')\n                                                            </a>\n                                                        </x-admin::dropdown.menu.item>\n                                                    @endif\n\n                                                    @if (bouncer()->hasPermission('activities.delete'))\n                                                        <x-admin::dropdown.menu.item @click=\"remove(activity)\">\n                                                            <div class=\"flex items-center gap-2\">\n                                                                <span class=\"icon-delete text-2xl\"></span>\n\n                                                                @lang('admin::app.components.activities.index.delete')\n                                                            </div>\n                                                        </x-admin::dropdown.menu.item>\n                                                    @endif\n                                                </template>\n\n                                                <template v-else>\n                                                    @if (bouncer()->hasPermission('mail.view'))\n                                                        <x-admin::dropdown.menu.item>\n                                                            <a\n                                                                :href=\"'{{ route('admin.mail.view', ['route' => 'replaceFolder', 'id' => 'replaceMailId']) }}'.replace('replaceFolder', activity.additional.folders[0]).replace('replaceMailId', activity.id)\"\n                                                                class=\"flex items-center gap-2\"\n                                                                target=\"_blank\"\n                                                            >\n                                                                <span class=\"icon-eye text-2xl\"></span>\n\n                                                                @lang('admin::app.components.activities.index.view')\n                                                            </a>\n                                                        </x-admin::dropdown.menu.item>\n                                                    @endif\n\n                                                    <x-admin::dropdown.menu.item @click=\"unlinkEmail(activity)\">\n                                                        <div class=\"flex items-center gap-2\">\n                                                            <span class=\"icon-attachment text-2xl\"></span>\n\n                                                            @lang('admin::app.components.activities.index.unlink')\n                                                        </div>\n                                                    </x-admin::dropdown.menu.item>\n                                                </template>\n\n                                                {!! view_render_event('admin.components.activities.content.activity.item.more_actions.dropdown.menu_item.after') !!}\n                                            </x-slot>\n                                        </x-admin::dropdown>\n\n                                        {!! view_render_event('admin.components.activities.content.activity.item.more_actions.dropdown.after') !!}\n                                    </template>\n\n                                    {!! view_render_event('admin.components.activities.content.activity.item.more_actions.after') !!}\n                                </div>\n\n                                {!! view_render_event('admin.components.activities.content.activity.item.details.after') !!}\n                            </div>\n\n                            {!! view_render_event('admin.components.activities.content.activity.item.after') !!}\n\n                            <!-- Empty Placeholder -->\n                            <div\n                                class=\"grid justify-center justify-items-center gap-3.5 py-12\"\n                                v-if=\"! filteredActivities.length\"\n                            >\n                                <img\n                                    class=\"dark:mix-blend-exclusion dark:invert\"\n                                    :src=\"typeIllustrations[selectedType]?.image ?? typeIllustrations['all'].image\"\n                                >\n\n                                <div class=\"flex flex-col items-center gap-2\">\n                                    <p class=\"text-xl font-semibold dark:text-white\">\n                                        @{{ typeIllustrations[selectedType]?.title ?? typeIllustrations['all'].title }}\n                                    </p>\n\n                                    <p class=\"text-gray-400 dark:text-gray-400\">\n                                        @{{ typeIllustrations[selectedType]?.description ?? typeIllustrations['all'].description }}\n                                    </p>\n                                </div>\n                            </div>\n                        </div>\n\n                        {!! view_render_event('admin.components.activities.content.activity.list.after') !!}\n                    </div>\n                </template>\n\n                <template v-else>\n                    <template v-for=\"type in extraTypes\">\n                        {!! view_render_event('admin.components.activities.content.activity.extra_types.before') !!}\n\n                        <div v-show=\"selectedType == type.name\">\n                            <slot :name=\"type.name\"></slot>\n                        </div>\n\n                        {!! view_render_event('admin.components.activities.content.activity.extra_types.after') !!}\n                    </template>\n                </template>\n            </div>\n\n            {!! view_render_event('admin.components.activities.content.after') !!}\n        </template>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-activities', {\n            template: '#v-activities-template',\n\n            props: {\n                endpoint: {\n                    type: String,\n                    default: '',\n                },\n\n                emailDetachEndpoint: {\n                    type: String,\n                    default: '',\n                },\n\n                activeType: {\n                    type: String,\n                    default: 'all',\n                },\n\n                types: {\n                    type: Array,\n                    default: [\n                        {\n                            name: 'all',\n                            label: \"{{ trans('admin::app.components.activities.index.all') }}\",\n                        }, {\n                            name: 'planned',\n                            label: \"{{ trans('admin::app.components.activities.index.planned') }}\",\n                        }, {\n                            name: 'note',\n                            label: \"{{ trans('admin::app.components.activities.index.notes') }}\",\n                        }, {\n                            name: 'call',\n                            label: \"{{ trans('admin::app.components.activities.index.calls') }}\",\n                        }, {\n                            name: 'meeting',\n                            label: \"{{ trans('admin::app.components.activities.index.meetings') }}\",\n                        }, {\n                            name: 'lunch',\n                            label: \"{{ trans('admin::app.components.activities.index.lunches') }}\",\n                        }, {\n                            name: 'file',\n                            label: \"{{ trans('admin::app.components.activities.index.files') }}\",\n                        }, {\n                            name: 'email',\n                            label: \"{{ trans('admin::app.components.activities.index.emails') }}\",\n                        }, {\n                            name: 'system',\n                            label: \"{{ trans('admin::app.components.activities.index.change-log') }}\",\n                        }\n                    ],\n                },\n\n                extraTypes: {\n                    type: Array,\n                    default: [],\n                },\n            },\n\n            data() {\n                return {\n                    isLoading: false,\n\n                    isUpdating: {},\n\n                    activities: [],\n\n                    selectedType: this.activeType,\n\n                    typeClasses: {\n                        email: 'icon-mail bg-green-200 text-green-900 dark:!text-green-900',\n                        note: 'icon-note bg-orange-200 text-orange-800 dark:!text-orange-800',\n                        call: 'icon-call bg-cyan-200 text-cyan-800 dark:!text-cyan-800',\n                        meeting: 'icon-activity bg-blue-200 text-blue-800 dark:!text-blue-800',\n                        lunch: 'icon-activity bg-blue-200 text-blue-800 dark:!text-blue-800',\n                        file: 'icon-file bg-green-200 text-green-900 dark:!text-green-900',\n                        system: 'icon-system-generate bg-yellow-200 text-yellow-900 dark:!text-yellow-900',\n                        default: 'icon-activity bg-blue-200 text-blue-800 dark:!text-blue-800',\n                    },\n\n                    typeIllustrations: {\n                        all: {\n                            image: \"{{ vite()->asset('images/empty-placeholders/activities.svg') }}\",\n                            title: \"{{ trans('admin::app.components.activities.index.empty-placeholders.all.title') }}\",\n                            description: \"{{ trans('admin::app.components.activities.index.empty-placeholders.all.description') }}\",\n                        },\n\n                        planned: {\n                            image: \"{{ vite()->asset('images/empty-placeholders/plans.svg') }}\",\n                            title: \"{{ trans('admin::app.components.activities.index.empty-placeholders.planned.title') }}\",\n                            description: \"{{ trans('admin::app.components.activities.index.empty-placeholders.planned.description') }}\",\n                        },\n\n                        note: {\n                            image: \"{{ vite()->asset('images/empty-placeholders/notes.svg') }}\",\n                            title: \"{{ trans('admin::app.components.activities.index.empty-placeholders.notes.title') }}\",\n                            description: \"{{ trans('admin::app.components.activities.index.empty-placeholders.notes.description') }}\",\n                        },\n\n                        call: {\n                            image: \"{{ vite()->asset('images/empty-placeholders/calls.svg') }}\",\n                            title: \"{{ trans('admin::app.components.activities.index.empty-placeholders.calls.title') }}\",\n                            description: \"{{ trans('admin::app.components.activities.index.empty-placeholders.calls.description') }}\",\n                        },\n\n                        meeting: {\n                            image: \"{{ vite()->asset('images/empty-placeholders/meetings.svg') }}\",\n                            title: \"{{ trans('admin::app.components.activities.index.empty-placeholders.meetings.title') }}\",\n                            description: \"{{ trans('admin::app.components.activities.index.empty-placeholders.meetings.description') }}\",\n                        },\n\n                        lunch: {\n                            image: \"{{ vite()->asset('images/empty-placeholders/lunches.svg') }}\",\n                            title: \"{{ trans('admin::app.components.activities.index.empty-placeholders.lunches.title') }}\",\n                            description: \"{{ trans('admin::app.components.activities.index.empty-placeholders.lunches.description') }}\",\n                        },\n\n                        file: {\n                            image: \"{{ vite()->asset('images/empty-placeholders/files.svg') }}\",\n                            title: \"{{ trans('admin::app.components.activities.index.empty-placeholders.files.title') }}\",\n                            description: \"{{ trans('admin::app.components.activities.index.empty-placeholders.files.description') }}\",\n                        },\n\n                        email: {\n                            image: \"{{ vite()->asset('images/empty-placeholders/emails.svg') }}\",\n                            title: \"{{ trans('admin::app.components.activities.index.empty-placeholders.emails.title') }}\",\n                            description: \"{{ trans('admin::app.components.activities.index.empty-placeholders.emails.description') }}\",\n                        },\n\n                        system: {\n                            image: \"{{ vite()->asset('images/empty-placeholders/activities.svg') }}\",\n                            title: \"{{ trans('admin::app.components.activities.index.empty-placeholders.system.title') }}\",\n                            description: \"{{ trans('admin::app.components.activities.index.empty-placeholders.system.description') }}\",\n                        }\n                    },\n\n                    timezone: \"{{ config('app.timezone') }}\",\n                }\n            },\n\n            computed: {\n                filteredActivities() {\n                    if (this.selectedType == 'all') {\n                        return this.activities;\n                    } else if (this.selectedType == 'planned') {\n                        return this.activities.filter(activity => ! activity.is_done);\n                    }\n\n                    return this.activities.filter(activity => activity.type == this.selectedType);\n                }\n            },\n\n            mounted() {\n                this.get();\n\n                if (this.extraTypes?.length) {\n                    this.extraTypes.forEach(type => {\n                        this.types.push(type);\n                    });\n                }\n\n                this.$emitter.on('on-activity-added', (activity) => this.activities.unshift(activity));\n            },\n\n            methods: {\n                get() {\n                    this.isLoading = true;\n\n                    this.$axios.get(this.endpoint)\n                        .then(response => {\n                            this.activities = response.data.data;\n\n                            this.isLoading = false;\n                        })\n                        .catch(error => {\n                            console.error(error);\n                        });\n                },\n\n                markAsDone(activity) {\n                    this.$emitter.emit('open-confirm-modal', {\n                        agree: () => {\n                            this.isUpdating[activity.id] = true;\n\n                            this.$axios.put(\"{{ route('admin.activities.update', 'replaceId') }}\".replace('replaceId', activity.id), {\n                                    'is_done': 1\n                                })\n                                .then((response) => {\n                                    this.isUpdating[activity.id] = false;\n\n                                    activity.is_done = 1;\n\n                                    this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                                })\n                                .catch((error) => {\n                                    this.isUpdating[activity.id] = false;\n\n                                    this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                                });\n                        },\n                    });\n                },\n\n                remove(activity) {\n                    this.$emitter.emit('open-confirm-modal', {\n                        agree: () => {\n                            this.isUpdating[activity.id] = true;\n\n                            this.$axios.delete(\"{{ route('admin.activities.delete', 'replaceId') }}\".replace('replaceId', activity.id))\n                                .then((response) => {\n                                    this.isUpdating[activity.id] = false;\n\n                                    this.activities.splice(this.activities.indexOf(activity), 1);\n\n                                    this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                                })\n                                .catch((error) => {\n                                    this.isUpdating[activity.id] = false;\n\n                                    this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                                });\n                        },\n                    });\n                },\n\n                unlinkEmail(activity) {\n                    this.$emitter.emit('open-confirm-modal', {\n                        agree: () => {\n                            let emailId = activity.parent_id ?? activity.id;\n\n                            this.$axios.delete(this.emailDetachEndpoint, {\n                                    data: {\n                                        email_id: emailId,\n                                    }\n                                })\n                                .then((response) => {\n                                    let relatedActivities = this.activities.filter(activity => activity.parent_id == emailId || activity.id == emailId);\n\n                                    relatedActivities.forEach(activity => {\n                                        const index = this.activities.findIndex(a => a === activity);\n\n                                        if (index !== -1) {\n                                            this.activities.splice(index, 1);\n                                        }\n                                    });\n\n                                    this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                                })\n                                .catch((error) => {\n                                    this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                                });\n                        }\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attachments/index.blade.php",
    "content": "@props([\n    'name' => 'attachments',\n    'validations' => null,\n    'uploadedAttachments' => [],\n    'allowMultiple' => false,\n    'hideButton' => false,\n])\n\n<v-attachments\n    name=\"{{ $name }}\"\n    validations=\"{{ $validations }}\"\n    :uploaded-attachments='{{ json_encode($uploadedAttachments) }}'\n    :allow-multiple=\"{{ $allowMultiple }}\"\n    :hide-button=\"{{ $hideButton }}\"\n>\n</v-attachments>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-attachments-template\"\n    >\n        <!-- File Attachment Input -->\n        <div\n            class=\"relative items-center\"\n            v-show=\"! hideButton\"\n        >\n            <input\n                type=\"file\"\n                class=\"hidden\"\n                id=\"file-upload\"\n                accept=\"attachment/*\"\n                :multiple=\"allowMultiple\"\n                :ref=\"$.uid + '_attachmentInput'\"\n                @change=\"add\"\n            />\n\n            <label\n                class=\"flex cursor-pointer items-center gap-1\"\n                for=\"file-upload\"\n            >\n                <i class=\"icon-attachment text-xl font-medium\"></i>\n\n                <span class=\"font-semibold\">\n                    @lang('Add Attachments')\n                </span>\n            </label>\n        </div>\n\n        <!-- Uploaded attachments -->\n        <div\n            v-if=\"attachments?.length\"\n            class=\"flex flex-wrap gap-2\"\n        >\n            <template v-for=\"(attachment, index) in attachments\">\n                <v-attachment-item\n                    :name=\"name\"\n                    :index=\"index\"\n                    :attachment=\"attachment\"\n                    @onRemove=\"remove($event)\"\n                >\n                </v-attachment-item>\n            </template>\n        </div>\n    </script>\n\n    <script type=\"text/x-template\" id=\"v-attachment-item-template\">\n        <div class=\"flex items-center gap-2 rounded-md bg-gray-100 px-2.5 py-1 dark:bg-gray-950\">\n            <span class=\"max-w-xs truncate dark:text-white\">\n                @{{ attachment.name }}\n            </span>\n\n            <x-admin::form.control-group.control\n                type=\"file\"\n                ::name=\"name + '[]'\"\n                class=\"hidden\" \n                ::ref=\"$.uid + '_attachmentInput_' + index\"\n            />\n\n            <i \n                class=\"icon-cross-large cursor-pointer rounded-md p-0.5 text-xl hover:bg-gray-200 dark:hover:bg-gray-800\"\n                @click=\"remove\"\n            ></i>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-attachments', {\n            template: '#v-attachments-template',\n\n            props: {\n                name: {\n                    type: String, \n                    default: 'attachments',\n                },\n\n                validations: {\n                    type: String,\n                    default: '',\n                },\n\n                uploadedAttachments: {\n                    type: Array,\n                    default: () => []\n                },\n\n                allowMultiple: {\n                    type: Boolean,\n                    default: false,\n                },\n\n                hideButton: {\n                    type: Boolean,\n                    default: false,\n                },\n\n                errors: {\n                    type: Object,\n                    default: () => {}\n                }\n            },\n\n            data() {\n                return {\n                    attachments: [],\n                }\n            },\n\n            mounted() {\n                this.attachments = this.uploadedAttachments;\n            },\n\n            methods: {\n                add() {\n                    let attachmentInput = this.$refs[this.$.uid + '_attachmentInput'];\n\n                    if (attachmentInput.files == undefined) {\n                        return;\n                    }\n\n                    attachmentInput.files.forEach((file, index) => {\n                        this.attachments.push({\n                            id: 'attachment_' + this.attachments.length,\n                            name: file.name,\n                            file: file\n                        });\n                    });\n                },\n\n                remove(attachment) {\n                    let index = this.attachments.indexOf(attachment);\n\n                    this.attachments.splice(index, 1);\n                },\n            }\n        });\n\n        app.component('v-attachment-item', {\n            template: '#v-attachment-item-template',\n\n            props: ['index', 'attachment', 'name'],\n\n            mounted() {\n                if (this.attachment.file instanceof File) {\n                    this.setFile(this.attachment.file);\n                }\n            },\n\n            methods: {\n                remove() {\n                    this.$emit('onRemove', this.attachment)\n                },\n\n                setFile(file) {\n                    const dataTransfer = new DataTransfer();\n\n                    dataTransfer.items.add(file);\n\n                    this.$refs[this.$.uid + '_attachmentInput_' + this.index].files = dataTransfer.files;\n                },\n            }\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/address.blade.php",
    "content": "@if (isset($attribute))\n    <v-address-component\n        :attribute='@json($attribute)'\n        :validations=\"'{{ $validations }}'\"\n        :data='@json(old($attribute->code) ?: $value)'\n    >\n        <!-- Addresses Shimmer -->    \n        <x-admin::shimmer.common.address />\n    </v-address-component>\n@endif\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-address-component-template\"\n    >\n        <div class=\"flex gap-4 max-md:flex-wrap\">\n            <div class=\"w-full\">\n                <!-- Address (Textarea field) -->\n                <x-admin::form.control-group>\n                    <x-admin::form.control-group.control\n                        type=\"textarea\"\n                        ::name=\"attribute['code'] + '[address]'\"\n                        rows=\"10\"\n                        ::value=\"data ? data['address'] : ''\"\n                        :label=\"trans('admin::app.common.custom-attributes.address')\"\n                        ::rules=\"attribute.is_required ? 'required|' + validations : validations\"\n                    />\n\n                    <x-admin::form.control-group.error ::name=\"attribute['code'] + '[address]'\" />\n\n                    <x-admin::form.control-group.error ::name=\"attribute['code'] + '.address'\" />\n                </x-admin::form.control-group>\n            </div>\n\n            <div class=\"grid w-full\">\n                <!-- Country Field -->\n                <x-admin::form.control-group>\n                    <x-admin::form.control-group.control\n                        type=\"select\"\n                        ::name=\"attribute['code'] + '[country]'\"\n                        ::rules=\"attribute.is_required ? 'required|' + validations : validations\"\n                        :label=\"trans('admin::app.common.custom-attributes.country')\"\n                        v-model=\"country\"\n                    >\n                        <option value=\"\">@lang('admin::app.common.custom-attributes.select-country')</option>\n                        \n                        @foreach (core()->countries() as $country)\n                            <option value=\"{{ $country->code }}\">{{ $country->name }}</option>\n                        @endforeach\n                    </x-admin::form.control-group.control>\n\n                    <x-admin::form.control-group.error ::name=\"attribute['code'] + '[country]'\" />\n\n                    <x-admin::form.control-group.error ::name=\"attribute['code'] + '.country'\" />\n                </x-admin::form.control-group>\n\n                <!-- State Field -->\n                <template v-if=\"haveStates()\">\n                    <x-admin::form.control-group>\n                        <x-admin::form.control-group.control\n                            type=\"select\"\n                            ::name=\"attribute['code'] + '[state]'\"\n                            v-model=\"state\"\n                            :label=\"trans('admin::app.common.custom-attributes.state')\"\n                            ::rules=\"attribute.is_required ? 'required|' + validations : validations\"\n                        >\n                            <option value=\"\">@lang('admin::app.common.custom-attributes.select-state')</option>\n                            \n                            <option \n                                v-for='(state, index) in countryStates[country]' \n                                :value=\"state.code\"\n                            >\n                                @{{ state.name }}\n                            </option>\n                        </x-admin::form.control-group.control>\n\n                        <x-admin::form.control-group.error ::name=\"attribute['code'] + '[state]'\" />\n\n                        <x-admin::form.control-group.error ::name=\"attribute['code'] + '.state'\" />\n                    </x-admin::form.control-group>\n                </template>\n\n                <template v-else>\n                    <x-admin::form.control-group>\n                        <x-admin::form.control-group.control\n                            type=\"text\"\n                            ::name=\"attribute['code'] + '[state]'\"\n                            :placeholder=\"trans('admin::app.common.custom-attributes.state')\"\n                            :label=\"trans('admin::app.common.custom-attributes.state')\"\n                            ::rules=\"attribute.is_required ? 'required|' + validations : validations\"\n                            v-model=\"state\"\n                        >\n                        </x-admin::form.control-group.control>\n                        \n                        <x-admin::form.control-group.error ::name=\"attribute['code'] + '[state]'\" />\n\n                        <x-admin::form.control-group.error ::name=\"attribute['code'] + '.state'\" />\n                    </x-admin::form.control-group>\n                </template>\n\n                <!-- City Field -->\n                <x-admin::form.control-group>\n                    <x-admin::form.control-group.control\n                        type=\"text\"\n                        ::name=\"attribute['code'] + '[city]'\"\n                        ::value=\"data && data['city'] ? data['city'] : ''\"\n                        :placeholder=\"trans('admin::app.common.custom-attributes.city')\"\n                        :label=\"trans('admin::app.common.custom-attributes.city')\"\n                        ::rules=\"attribute.is_required ? 'required|' + validations : validations\"\n                    />\n\n                    <x-admin::form.control-group.error ::name=\"attribute['code'] + '[city]'\"/>\n\n                    <x-admin::form.control-group.error ::name=\"attribute['code'] + '.city'\" />\n                </x-admin::form.control-group>\n\n                <!-- Postcode Field -->\n                <x-admin::form.control-group>\n                    <x-admin::form.control-group.control\n                        type=\"text\"\n                        ::name=\"attribute['code'] + '[postcode]'\"\n                        ::value=\"data &&  data['postcode'] ? data['postcode'] : ''\"\n                        :placeholder=\"trans('admin::app.common.custom-attributes.postcode')\"\n                        :label=\"trans('admin::app.common.custom-attributes.postcode')\"\n                        ::rules=\"attribute.is_required ? 'required|postcode' : 'postcode'\"\n                    />\n\n                    <x-admin::form.control-group.error ::name=\"attribute['code'] + '[postcode]'\" />\n\n                    <x-admin::form.control-group.error ::name=\"attribute['code'] + '.postcode'\" />\n                </x-admin::form.control-group>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-address-component', {\n            template: '#v-address-component-template',\n\n            props: ['attribute', 'data', 'validations'],\n\n            data() {\n                return {\n                    country: this.data?.country || '',\n\n                    state: this.data?.state || '',\n\n                    countryStates: @json(core()->groupedStatesByCountries()),\n                };\n            },\n            \n            methods: {\n                haveStates() {\n                    /*\n                    * The double negation operator is used to convert the value to a boolean.\n                    * It ensures that the final result is a boolean value,\n                    * true if the array has a length greater than 0, and otherwise false.\n                    */\n                    return !!this.countryStates[this.country]?.length;\n                },\n            }\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/boolean.blade.php",
    "content": "<?php $selectedOption = old($attribute->code) ?: $value ?>\n\n<input \n    type=\"hidden\"\n    name=\"{{ $attribute->code }}\"\n    value=\"0\"\n>\n\n<label class=\"relative inline-flex cursor-pointer items-center\">\n    <input  \n        type=\"checkbox\"\n        name=\"{{ $attribute->code }}\"\n        value=\"1\"\n        id=\"{{ $attribute->code }}\"\n        class=\"peer sr-only\"\n        {{ $selectedOption ? 'checked' : '' }}\n    >\n\n    <div class=\"peer h-5 w-9 cursor-pointer rounded-full bg-gray-200 after:absolute after:top-0.5 after:h-4 after:w-4 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[''] peer-checked:bg-brandColor peer-checked:after:border-white peer-focus:outline-none peer-focus:ring-blue-300 dark:bg-gray-800 dark:after:border-white dark:after:bg-white dark:peer-checked:bg-gray-950 after:ltr:left-0.5 peer-checked:after:ltr:translate-x-full after:rtl:right-0.5 peer-checked:after:rtl:-translate-x-full\"></div>\n</label>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/checkbox.blade.php",
    "content": "@php\n    $options = $attribute->lookup_type\n        ? app('Webkul\\Attribute\\Repositories\\AttributeRepository')->getLookUpOptions($attribute->lookup_type)\n        : $attribute->options()->orderBy('sort_order')->get();\n\n    $selectedOption = old($attribute->code, $value);\n\n    $selectedOption = is_array($selectedOption) ? $selectedOption : explode(',', $selectedOption);\n@endphp\n\n<input type=\"hidden\" name=\"{{ $attribute->code }}\" />\n\n@foreach ($options as $option)\n    <x-admin::form.control-group class=\"!mb-2 flex items-center gap-2.5\">\n        <x-admin::form.control-group.control\n            type=\"checkbox\"\n            :id=\"$option->id\"\n            name=\"{{ $attribute->code }}[]\"\n            :value=\"$option->id\"\n            :for=\"$option->id\"\n            :label=\"$option->name\"\n            :checked=\"in_array($option->id, $selectedOption)\"\n        />\n\n        <label\n            class=\"cursor-pointer text-xs font-medium text-gray-600 dark:text-gray-300\"\n            for=\"{{ $option->id }}\"\n        >\n            {{ $option->name }}\n        </label>\n    </x-admin::form.control-group>\n@endforeach\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/date.blade.php",
    "content": "@php\n    if (! empty($value)) {\n        if ($value instanceof \\Carbon\\Carbon) {\n            $value = $value->format('Y-m-d');\n        } elseif (is_string($value)) {\n            $value = \\Carbon\\Carbon::parse($value)->format('Y-m-d');\n        }\n    }\n    $value = old($attribute->code, $value);\n@endphp\n\n<x-admin::form.control-group.control\n    type=\"date\"\n    :id=\"$attribute->code\"\n    :name=\"$attribute->code\"\n    :value=\"$value\"\n    :rules=\"$validations.'|regex:^\\d{4}-\\d{2}-\\d{2}$'\"\n    :label=\"$attribute->name\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/datetime.blade.php",
    "content": "<x-admin::form.control-group.control\n    type=\"datetime\"\n    :id=\"$attribute->code\"\n    :name=\"$attribute->code\"\n    :value=\"old($attribute->code) ?? $value\"\n    :rules=\"$validations.'|regex:^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$'\"\n    :label=\"$attribute->name\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/email.blade.php",
    "content": "@if (isset($attribute))\n    <v-email-component\n        :attribute=\"{{ json_encode($attribute) }}\"\n        :validations=\"'{{ $validations }}'\"\n        :value=\"{{ json_encode(old($attribute->code) ?? $value) }}\"\n    >\n        <div class=\"mb-2 flex items-center\">\n            <input\n                type=\"text\"\n                class=\"w-full rounded rounded-r-none border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n            >\n\n            <div class=\"relative\">\n                <select class=\"custom-select w-full rounded rounded-l-none border bg-white px-2.5 py-2 text-sm font-normal text-gray-800 hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 ltr:mr-6 ltr:pr-8 rtl:ml-6 rtl:pl-8\">\n                    <option value=\"work\" selected>@lang('admin::app.common.custom-attributes.work')</option>\n                    <option value=\"home\">@lang('admin::app.common.custom-attributes.home')</option>\n                </select>\n            </div>\n        </div>\n\n        <span class=\"flex cursor-pointer items-center gap-2 text-brandColor\">\n            <i class=\"icon-add text-md !text-brandColor\"></i>\n\n            @lang(\"admin::app.common.custom-attributes.add-more\")\n        </span>\n    </v-email-component>\n@endif\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-email-component-template\"\n    >\n        <template v-for=\"(email, index) in emails\">\n            <div class=\"mb-2 flex items-center\">\n                <x-admin::form.control-group.control\n                    type=\"text\"\n                    ::id=\"attribute.code\"\n                    ::name=\"`${attribute['code']}[${index}][value]`\"\n                    class=\"rounded-r-none\"\n                    ::rules=\"getValidation\"\n                    ::label=\"attribute.name\"\n                    v-model=\"email['value']\"\n                    ::disabled=\"isDisabled\"\n                />\n\n                <div class=\"relative\">\n                    <x-admin::form.control-group.control\n                        type=\"select\"\n                        ::id=\"attribute.code\"\n                        ::name=\"`${attribute['code']}[${index}][label]`\"\n                        class=\"rounded-l-none ltr:mr-6 ltr:pr-8 rtl:ml-6 rtl:pl-8\"\n                        rules=\"required\"\n                        ::label=\"attribute.name\"\n                        v-model=\"email['label']\"\n                        ::disabled=\"isDisabled\"\n                    >\n                        <option value=\"work\">@lang('admin::app.common.custom-attributes.work')</option>\n                        <option value=\"home\">@lang('admin::app.common.custom-attributes.home')</option>\n                    </x-admin::form.control-group.control>\n                </div>\n\n                <i\n                    v-if=\"emails.length > 1\"\n                    class=\"icon-delete ml-1 cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                    @click=\"remove(email)\"\n                ></i>\n            </div>\n\n            <x-admin::form.control-group.error ::name=\"`${attribute['code']}[${index}][value]`\"/>\n\n            <x-admin::form.control-group.error ::name=\"`${attribute['code']}[${index}].value`\"/>\n        </template>\n\n        <span\n            class=\"flex w-fit cursor-pointer items-center gap-2 text-brandColor\"\n            @click=\"add\"\n            v-if=\"! isDisabled\"\n        >\n            <i class=\"icon-add text-md !text-brandColor\"></i>\n\n            @lang(\"admin::app.common.custom-attributes.add-more\")\n        </span>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-email-component', {\n            template: '#v-email-component-template',\n\n            props: ['validations', 'isDisabled', 'attribute', 'value'],\n\n            data() {\n                return {\n                    emails: this.value || [{'value': '', 'label': 'work'}],\n                };\n            },\n\n            watch: {\n                value(newValue, oldValue) {\n                    if (\n                        JSON.stringify(newValue)\n                        !== JSON.stringify(oldValue)\n                    ) {\n                        this.emails = newValue || [{'value': '', 'label': 'work'}];\n                    }\n                },\n            },\n\n            computed: {\n                getValidation() {\n                    return {\n                        email: true,\n                        unique_email: this.emails ?? [],\n                        ...(this.validations === 'required' ? { required: true } : {}),\n                    };\n                },\n            },\n\n            created() {\n                this.extendValidations();\n            },\n\n            methods: {\n                add() {\n                    this.emails.push({\n                        'value': '',\n                        'label': 'work'\n                    });\n                },\n\n                remove(email) {\n                    this.emails = this.emails.filter(item => item !== email);\n                },\n\n                extendValidations() {\n                    defineRule('unique_email', async (value, emails) => {\n                        if (! value || ! value.length) {\n                            return true;\n                        }\n\n                        const foundEmails = emails.filter(email => email.value === value).length;\n\n                        if (foundEmails > 1) {\n                            return 'This email is already in use.';\n                        }\n\n                        /**\n                         * Check if the email is unique. This support is only for person emails only.\n                         */\n                        if (this.attribute.code === 'person[emails]') {\n                            try {\n                                const { data } = await this.$axios.get('{{ route('admin.settings.attributes.check_unique_validation') }}', {\n                                    params: {\n                                        entity_id: this.attribute.id,\n                                        entity_type: 'persons',\n                                        attribute_code: 'emails',\n                                        attribute_value: value\n                                    }\n                                });\n\n                                if (! data.validated) {\n                                    return 'This email is already in use.';\n                                }\n\n                                return true;\n                            } catch (error) {\n                                console.error('Error checking email: ', error);\n\n                                return 'Error validating email. Please try again.';\n                            }\n                        } else {\n                            return true;\n                        }\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/file.blade.php",
    "content": "<div class=\"flex items-center gap-2\">\n    @if ($value)\n        <a \n            href=\"{{ route('admin.settings.attributes.download', ['path' => $value]) }}\"\n            target=\"_blank\"\n        >\n            <div class=\"w-full max-w-max cursor-pointer rounded-md p-1.5 text-gray-600 hover:bg-gray-200 active:border-gray-300 dark:text-gray-300 dark:hover:bg-gray-800\">\n                <i class=\"icon-download text-2xl\"></i>\n            </div>\n        </a>\n    @endif\n\n    <x-admin::form.control-group.control\n        type=\"file\"\n        :id=\"$attribute->code\"\n        :name=\"$attribute->code\"\n        :rules=\"$validations\"\n        :label=\"$attribute->name\"\n    />\n</div>\n\n@if ($value)\n    <div class=\"flex cursor-pointer items-center gap-2.5\">\n        <x-admin::form.control-group.control\n            type=\"checkbox\"\n            name=\"{{ $attribute->code }}[delete]\"\n            id=\"{{ $attribute->code }}[delete]\"\n            for=\"{{ $attribute->code }}[delete]\"\n            value=\"1\"\n        />\n\n        <label\n            class=\"cursor-pointer !text-gray-600 dark:!text-gray-300\"\n            for=\"{{ $attribute->code }}[delete]\"\n        >\n            @lang('admin::app.components.attributes.edit.delete')\n        </label>\n    </div>\n@endif"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/image.blade.php",
    "content": "<div class=\"flex items-center gap-2\">\n    @if ($value)\n        <a \n            href=\"{{ route('admin.settings.attributes.download', ['path' => $value]) }}\"\n            target=\"_blank\"\n        >\n            <img\n                src=\"{{ Storage::url($value) }}\"\n                alt=\"{{ $attribute->code }}\"\n                class=\"top-15 rounded-3 border-3 relative h-[33px] w-[33px] border-gray-500\"\n            />\n        </a>\n    @endif\n\n    <x-admin::form.control-group.control\n        type=\"file\"\n        :id=\"$attribute->code\"\n        :name=\"$attribute->code\"\n        class=\"!w-full\"\n        :rules=\"$validations\"\n        :label=\"$attribute->name\"\n    />\n</div>\n\n@if ($value)\n    <div class=\"flex cursor-pointer items-center gap-2.5\">\n        <x-admin::form.control-group.control\n            type=\"checkbox\"\n            name=\"{{ $attribute->code }}[delete]\"\n            id=\"{{ $attribute->code }}[delete]\"\n            for=\"{{ $attribute->code }}[delete]\"\n            value=\"1\"\n        />\n\n        <label\n            class=\"cursor-pointer !text-gray-600 dark:!text-gray-300\"\n            for=\"{{ $attribute->code }}[delete]\"\n        >\n            @lang('admin::app.components.attributes.edit.delete')\n        </label>\n    </div>\n@endif"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/index.blade.php",
    "content": "@props([\n    'attribute' => '',\n    'value' => '',\n    'validations' => '',\n])\n\n@switch($attribute->type)\n    @case('text')\n        <x-admin::attributes.edit.text\n            :attribute=\"$attribute\"\n            :value=\"$value\"\n            :validations=\"$validations\"\n        />\n\n        @break\n\n    @case('email')\n        <x-admin::attributes.edit.email\n            :attribute=\"$attribute\"\n            :value=\"$value\"\n            :validations=\"$validations\"\n        />\n\n        @break\n\n    @case('phone')\n        <x-admin::attributes.edit.phone\n            :attribute=\"$attribute\"\n            :value=\"$value\"\n            :validations=\"$validations\"\n        />\n\n        @break\n\n    @case('lookup')\n        <x-admin::attributes.edit.lookup\n            :attribute=\"$attribute\"\n            :value=\"$value\"\n            :validations=\"$validations\"\n            can-add-new=\"true\"\n        />\n\n        @break\n\n    @case('select')\n        <x-admin::attributes.edit.select\n            :attribute=\"$attribute\"\n            :value=\"$value\"\n            :validations=\"$validations\"\n        />\n\n        @break\n    \n    @case('multiselect')\n        <x-admin::attributes.edit.multiselect\n            :attribute=\"$attribute\"\n            :value=\"$value\"\n            :validations=\"$validations\"\n        />\n        \n        @break\n\n    @case('price')\n        <x-admin::attributes.edit.price\n            :attribute=\"$attribute\"\n            :value=\"$value\"\n            :validations=\"$validations\"\n        />\n\n        @break\n\n    @case('image')\n        <x-admin::attributes.edit.image\n            :attribute=\"$attribute\"\n            :value=\"$value\"\n            :validations=\"$validations\"\n        />\n\n        @break\n\n    @case('file')\n        <x-admin::attributes.edit.file\n            :attribute=\"$attribute\"\n            :value=\"$value\"\n            :validations=\"$validations\"\n        />\n\n        @break\n\n    @case('textarea')\n        <x-admin::attributes.edit.textarea\n            :attribute=\"$attribute\"\n            :value=\"$value\"\n            :validations=\"$validations\"\n        />\n\n        @break\n\n    @case('address')\n        <x-admin::attributes.edit.address\n            :attribute=\"$attribute\"\n            :value=\"$value\"\n            :validations=\"$validations\"\n        />\n\n        @break\n\n    @case('date')\n        <x-admin::attributes.edit.date\n            :attribute=\"$attribute\"\n            :value=\"$value\"\n            :validations=\"$validations\"\n        />\n\n        @break\n\n    @case('datetime')\n        <x-admin::attributes.edit.datetime\n            :attribute=\"$attribute\"\n            :value=\"$value\"\n            :validations=\"$validations\"\n        />\n\n        @break\n\n    @case('boolean')\n        <x-admin::attributes.edit.boolean\n            :attribute=\"$attribute\"\n            :value=\"$value\"\n            :validations=\"$validations\"\n        />\n\n        @break\n\n    @case('checkbox')\n        <x-admin::attributes.edit.checkbox\n            :attribute=\"$attribute\"\n            :value=\"$value\"\n            :validations=\"$validations\"\n        />\n\n        @break\n@endswitch"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/lookup.blade.php",
    "content": "@if (isset($attribute))\n    @php\n        $lookUpEntityData = app('Webkul\\Attribute\\Repositories\\AttributeRepository')->getLookUpEntity($attribute->lookup_type, old($attribute->code) ?: $value);\n    @endphp\n\n    <v-lookup-component\n        :attribute=\"{{ json_encode($attribute) }}\"\n        :validations=\"'{{ $validations }}'\"\n        :value=\"{{ json_encode($lookUpEntityData)}}\"\n        can-add-new=\"{{ $canAddNew ?? false }}\"\n        @lookup-added=\"handleLookupAdded\"\n        @lookup-removed=\"handleLookupRemoved\"\n    >\n        <div class=\"relative inline-block w-full\">\n            <!-- Input Container -->\n            <div class=\"relative flex items-center justify-between rounded border border-gray-200 p-2 hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:text-gray-300\">\n                @lang('admin::app.components.attributes.lookup.click-to-add')\n\n                <!-- Icons Container -->\n                <div class=\"flex items-center gap-2\">\n                    <!-- Arrow Icon -->\n                    <i class=\"icon-down-arrow text-2xl text-gray-600\"></i>\n                </div>\n            </div>\n        </div>\n    </v-lookup-component>\n@endif\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-lookup-component-template\"\n    >\n        <div\n            class=\"relative\"\n            ref=\"lookup\"\n        >\n            <div\n                class=\"relative inline-block w-full\"\n                @click=\"toggle\"\n            >\n                <!-- Input Container -->\n                <div\n                    class=\"relative flex items-center justify-between rounded border border-gray-200 p-2 hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:text-gray-300\"\n                    :class=\"{\n                        'bg-gray-50': isDisabled,\n                    }\"\n                >\n                    <!-- Selected Item or Placeholder Text -->\n                    <span\n                        class=\"overflow-hidden text-ellipsis\"\n                        :title=\"selectedItem?.name\"\n                    >\n                        @{{ selectedItem?.name !== \"\" ? selectedItem?.name : \"@lang('admin::app.components.attributes.lookup.click-to-add')\" }}\n                    </span>\n\n                    <!-- Icons Container -->\n                    <div class=\"flex items-center gap-2\">\n                        <!-- Close Icon -->\n                        <i\n                            v-if=\"\n                                ! isDisabled\n                                && (\n                                    selectedItem?.name\n                                    && ! isSearching\n                                )\"\n                            class=\"icon-cross-large cursor-pointer text-2xl text-gray-600\"\n                            @click=\"remove\"\n                        ></i>\n\n                        <!-- Arrow Icon -->\n                        <i\n                            class=\"text-2xl text-gray-600\"\n                            :class=\"showPopup ? 'icon-up-arrow' : 'icon-down-arrow'\"\n                        ></i>\n                    </div>\n                </div>\n            </div>\n\n            <!-- Hidden Input Entity Value -->\n            <x-admin::form.control-group.control\n                type=\"hidden\"\n                ::name=\"attribute['code']\"\n                v-model=\"selectedItem.id\"\n                ::rules=\"validations\"\n                ::label=\"attribute['name']\"\n            />\n\n            <!-- Popup Box -->\n            <div\n                v-if=\"showPopup\"\n                class=\"absolute top-full z-10 mt-1 flex w-full origin-top transform flex-col gap-2 rounded-lg border border-gray-200 bg-white p-2 shadow-lg transition-transform dark:border-gray-900 dark:bg-gray-800\"\n            >\n                <!-- Search Bar -->\n                <div class=\"relative flex items-center\">\n                    <!-- Input Box -->\n                    <input\n                        type=\"text\"\n                        v-model.lazy=\"searchTerm\"\n                        v-debounce=\"500\"\n                        class=\"w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                        placeholder=\"@lang('admin::app.components.attributes.lookup.search')\"\n                        ref=\"searchInput\"\n                        @keyup=\"search\"\n                    />\n\n                    <!-- Search Icon (absolute positioned) -->\n                    <span class=\"absolute flex items-center ltr:right-2 rtl:left-2\">\n                        <!-- Loader (optional, based on condition) -->\n                        <div\n                            class=\"relative\"\n                            v-if=\"isSearching\"\n                        >\n                            <x-admin::spinner />\n                        </div>\n                    </span>\n                </div>\n\n                <!-- Results List -->\n                <ul class=\"max-h-40 divide-y divide-gray-100 overflow-y-auto\">\n                    <li\n                        v-for=\"item in filteredResults\"\n                        :key=\"item.id\"\n                        class=\"flex cursor-pointer gap-2 p-2 transition-colors hover:bg-blue-100 dark:text-gray-300 dark:hover:bg-gray-900\"\n                        @click=\"handleResult(item)\"\n                    >\n                        <!-- Entity Name -->\n                        <span>@{{ item.name }}</span>\n                    </li>\n\n                    <template v-if=\"filteredResults.length === 0\">\n                        <li class=\"px-4 py-2 text-center text-gray-500\">\n                            @lang('admin::app.components.attributes.lookup.no-result-found')\n                        </li>\n\n                        <li\n                            v-if=\"searchTerm.length > 2 && canAddNew\"\n                            @click=\"handleResult({ id: '', name: searchTerm })\"\n                            class=\"cursor-pointer border-t border-gray-800 px-4 py-2 text-gray-500 hover:bg-brandColor hover:text-white dark:border-gray-300 dark:text-gray-400 dark:hover:bg-gray-900 dark:hover:text-white\"\n                        >\n                            <i class=\"icon-add text-md\"></i>\n\n                            @lang('admin::app.components.lookup.add-as-new')\n                        </li>\n                    </template>\n                </ul>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-lookup-component', {\n            template: '#v-lookup-component-template',\n\n            props: ['validations', 'isDisabled', 'attribute', 'value', 'canAddNew'],\n\n            emits: ['lookup-added', 'lookup-removed'],\n\n            data() {\n                return {\n                    showPopup: false,\n\n                    searchTerm: '',\n\n                    searchedResults: [],\n\n                    selectedItem: {\n                        id: '',\n                        name: ''\n                    },\n\n                    searchRoute: `{{ route('admin.settings.attributes.lookup') }}/${this.attribute.lookup_type}`,\n\n                    lookupEntityRoute: `{{ route('admin.settings.attributes.lookup_entity') }}/${this.attribute.lookup_type}`,\n\n                    isSearching: false,\n                };\n            },\n\n            mounted() {\n                if (this.value) {\n                    this.getLookUpEntity();\n                }\n\n                window.addEventListener('click', this.handleFocusOut);\n            },\n\n            watch: {\n                searchTerm(newVal, oldVal) {\n                    this.search();\n                },\n            },\n\n            computed: {\n                /**\n                 * Filter the searchedResults based on the search query.\n                 *\n                 * @return {Array}\n                 */\n                filteredResults() {\n                    return this.searchedResults.filter(item =>\n                        item.name.toLowerCase().includes(this.searchTerm.toLowerCase())\n                    );\n                }\n            },\n\n            methods: {\n                toggle() {\n                    if (this.isDisabled) {\n                        this.showPopup = false;\n\n                        return;\n                    }\n\n                    this.showPopup = ! this.showPopup;\n\n                    if (this.showPopup) {\n                        this.$nextTick(() => this.$refs.searchInput.focus());\n                    }\n                },\n\n                search() {\n                    if (this.searchTerm.length <= 2) {\n                        this.searchedResults = [];\n\n                        this.isSearching = false;\n\n                        return;\n                    }\n\n                    this.isSearching = true;\n\n                    this.$axios.get(this.searchRoute, {\n                            params: { query: this.searchTerm }\n                        })\n                        .then (response => {\n                            this.searchedResults = response.data;\n                        })\n                        .catch (error => {})\n                        .finally(() => this.isSearching = false);\n                },\n\n                getLookUpEntity() {\n                    this.$axios.get(this.lookupEntityRoute, {\n                            params: { query: this.value?.id ?? \"\"}\n                        })\n                        .then (response => {\n                            this.selectedItem = Object.keys(response.data).length\n                                ? response.data\n                                : {\n                                    id: '',\n                                    name: ''\n                                };\n                        })\n                        .catch (error => {});\n                },\n\n                handleResult(result) {\n                    this.showPopup = false;\n\n                    this.selectedItem = result;\n\n                    this.searchTerm = '';\n\n                    this.$emit('lookup-added', this.selectedItem);\n                },\n\n                handleFocusOut(e) {\n                    const lookup = this.$refs.lookup;\n\n                    if (\n                        lookup &&\n                        ! lookup.contains(event.target)\n                    ) {\n                        this.showPopup = false;\n                    }\n                },\n\n                remove() {\n                    this.selectedItem = {\n                        id: '',\n                        name: ''\n                    };\n\n                    this.$emit('lookup-removed', this.selectedItem);\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/multiselect.blade.php",
    "content": "@php\n    $options = $attribute->lookup_type\n        ? app('Webkul\\Attribute\\Repositories\\AttributeRepository')->getLookUpOptions($attribute->lookup_type)\n        : $attribute->options()->orderBy('sort_order')->get();\n\n    $selectedOption = old($attribute->code) ?: $value;\n@endphp\n\n<v-field\n    type=\"select\"\n    id=\"{{ $attribute->code }}\"\n    name=\"{{ $attribute->code }}[]\"\n    rules=\"{{ $validations }}\"\n    label=\"{{ $attribute->name }}\"\n    placeholder=\"{{ $attribute->name }}\"\n    multiple\n>\n    <select\n        name=\"{{ $attribute->code }}[]\"\n        class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n        multiple\n    >\n        @foreach ($options as $option)\n            <option\n                value=\"{{ $option->id }}\"\n                {{ in_array($option->id, is_array($selectedOption) ? $selectedOption : explode(',', $selectedOption)) ? 'selected' : ''}}\n            >\n                {{ $option->name }}\n            </option>\n        @endforeach\n    </select>\n</v-field>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/phone.blade.php",
    "content": "@if (isset($attribute))\n    <v-phone-component\n        :attribute=\"{{ json_encode($attribute) }}\"\n        :validations=\"'{{ $validations }}'\"\n        :value=\"{{ json_encode(old($attribute->code) ?? $value) }}\"\n    >\n        <div class=\"mb-2 flex items-center\">\n            <input\n                type=\"text\"\n                class=\"w-full rounded rounded-r-none border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n            >\n\n            <div class=\"relative\">\n                <select class=\"custom-select w-full rounded rounded-l-none border bg-white px-2.5 py-2 text-sm font-normal text-gray-800 hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 ltr:mr-6 ltr:pr-8 rtl:ml-6 rtl:pl-8\">\n                    <option value=\"work\" selected>@lang('admin::app.common.custom-attributes.work')</option>\n                    <option value=\"home\">@lang('admin::app.common.custom-attributes.home')</option>\n                </select>\n            </div>\n        </div>\n\n        <span class=\"flex cursor-pointer items-center gap-2 text-brandColor\">\n            <i class=\"icon-add text-md !text-brandColor\"></i>\n\n            @lang(\"admin::app.common.custom-attributes.add-more\")\n        </span>\n    </v-phone-component>\n@endif\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-phone-component-template\"\n    >\n        <template v-for=\"(contactNumber, index) in contactNumbers\">\n            <div class=\"mb-2 flex items-center\">\n                <x-admin::form.control-group.control\n                    type=\"text\"\n                    ::id=\"attribute.code\"\n                    ::name=\"`${attribute['code']}[${index}][value]`\"\n                    class=\"rounded-r-none\"\n                    ::rules=\"getValidation\"\n                    ::label=\"attribute.name\"\n                    v-model=\"contactNumber['value']\"\n                    ::disabled=\"isDisabled\"\n                />\n\n                <div class=\"relative\">\n                    <x-admin::form.control-group.control\n                        type=\"select\"\n                        ::id=\"attribute.code\"\n                        ::name=\"`${attribute['code']}[${index}][label]`\"\n                        class=\"rounded-l-none ltr:mr-6 ltr:pr-8 rtl:ml-6 rtl:pl-8\"\n                        rules=\"required\"\n                        ::label=\"attribute.name\"\n                        v-model=\"contactNumber['label']\"\n                        ::disabled=\"isDisabled\"\n                    >\n                        <option value=\"work\">@lang('admin::app.common.custom-attributes.work')</option>\n                        <option value=\"home\">@lang('admin::app.common.custom-attributes.home')</option>\n                    </x-admin::form.control-group.control>\n                </div>\n\n                <i\n                    v-if=\"contactNumbers.length > 1\"\n                    class=\"icon-delete ml-1 cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                    @click=\"remove(contactNumber)\"\n                ></i>\n            </div>\n\n            <x-admin::form.control-group.error ::name=\"`${attribute['code']}[${index}][value]`\"/>\n\n            <x-admin::form.control-group.error ::name=\"`${attribute['code']}[${index}].value`\"/>\n        </template>\n\n        <span\n            class=\"flex w-fit cursor-pointer items-center gap-2 text-brandColor\"\n            @click=\"add\"\n            v-if=\"! isDisabled\"\n        >\n            <i class=\"icon-add text-md !text-brandColor\"></i>\n\n            @lang(\"admin::app.common.custom-attributes.add-more\")\n        </span>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-phone-component', {\n            template: '#v-phone-component-template',\n\n            props: ['validations', 'isDisabled', 'attribute', 'value'],\n\n            data() {\n                return {\n                    contactNumbers: this.value || [{'value': '', 'label': 'work'}],\n                };\n            },\n\n            watch: {\n                value(newValue, oldValue) {\n                    if (JSON.stringify(newValue) !== JSON.stringify(oldValue)) {\n                        this.contactNumbers = newValue || [{'value': '', 'label': 'work'}];\n                    }\n                },\n            },\n\n            computed: {\n                getValidation() {\n                    return {\n                        phone: true,\n                        unique_contact_number: this.contactNumbers ?? [],\n                        ...(this.validations === 'required' ? { required: true } : {}),\n                    };\n                },\n            },\n\n            created() {\n                this.extendValidations();\n\n                if (! this.contactNumbers || ! this.contactNumbers.length) {\n                    this.contactNumbers = [{\n                        'value': '',\n                        'label': 'work'\n                    }];\n                }\n            },\n\n            methods: {\n                add() {\n                    this.contactNumbers.push({\n                        'value': '',\n                        'label': 'work'\n                    });\n                },\n\n                remove(contactNumber) {\n                    this.contactNumbers = this.contactNumbers.filter(number => number !== contactNumber);\n                },\n\n                extendValidations() {\n                    defineRule('unique_contact_number', async (value, contactNumbers) => {\n                        if (\n                            ! value\n                            || ! value.length\n                        ) {\n                            return true;\n                        }\n\n                        const phoneOccurrences = contactNumbers.filter(contactNumber => contactNumber.value === value).length;\n\n                        if (phoneOccurrences > 1) {\n                            return 'This phone number is already in use.';\n                        }\n\n                        /**\n                         * Check if the phone number is unique. This support is only for person phone numbers only.\n                         */\n                         if (this.attribute.code === 'person[contact_numbers]') {\n                            try {\n                                const { data } = await this.$axios.get('{{ route('admin.settings.attributes.check_unique_validation') }}', {\n                                    params: {\n                                        entity_id: this.attribute.id,\n                                        entity_type: 'persons',\n                                        attribute_code: 'contact_numbers',\n                                        attribute_value: value\n                                    }\n                                });\n\n                                if (! data.validated) {\n                                    return 'This phone number is already in use.';\n                                }\n\n                                return true;\n                            } catch (error) {\n                                console.error('Error checking email: ', error);\n\n                                return 'Error validating email. Please try again.';\n                            }\n                        } else {\n                            return true;\n                        }\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/price.blade.php",
    "content": "@if (isset($attribute))\n    <v-price-component\n        :attribute=\"{{ json_encode($attribute) }}\"\n        :validations=\"'{{ $validations }}'\"\n        :value=\"{{ json_encode(old($attribute->code) ?? $value) }}\"\n    >\n    </v-price-component>\n@endif\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-price-component-template\"\n    >\n        <x-admin::form.control-group.control\n            type=\"text\"\n            ::id=\"attribute.code\"\n            ::value=\"value\"\n            ::name=\"attribute.code\"\n            ::rules=\"validations\"\n            ::label=\"attribute.name\"\n        />\n    </script>\n\n    <script type=\"module\">\n        app.component('v-price-component', {\n            template: '#v-price-component-template',\n\n            props: ['validations', 'attribute', 'value'],\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/select.blade.php",
    "content": "@php\n    $options = $attribute->lookup_type\n        ? app('Webkul\\Attribute\\Repositories\\AttributeRepository')->getLookUpOptions($attribute->lookup_type)\n        : $attribute->options()->orderBy('sort_order')->get();\n@endphp\n\n<x-admin::form.control-group.control\n    type=\"select\"\n    id=\"{{ $attribute->code }}\"\n    name=\"{{ $attribute->code }}\"\n    rules=\"{{ $validations }}\"\n    :label=\"$attribute->name\"\n    :placeholder=\"$attribute->name\"\n    :value=\"old($attribute->code) ?? $value\"\n>\n    @foreach ($options as $option)\n        <option value=\"{{ $option->id }}\">\n            {{ $option->name }}\n        </option>\n    @endforeach\n</x-admin::form.control-group.control>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/text.blade.php",
    "content": "<x-admin::form.control-group.control\n    type=\"text\"\n    :id=\"$attribute->code\"\n    :name=\"$attribute->code\"\n    :value=\"old($attribute->code) ?? $value\"\n    :rules=\"$validations\"\n    :label=\"$attribute->name\"\n/>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/edit/textarea.blade.php",
    "content": "<x-admin::form.control-group.control\n    type=\"textarea\"\n    :id=\"$attribute->code\"\n    :name=\"$attribute->code\"\n    :value=\"old($attribute->code) ?? $value\"\n    :rules=\"$validations\"\n    :label=\"$attribute->name\"\n/>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/index.blade.php",
    "content": "@foreach ($customAttributes as $attribute)\n    @php\n        $validations = [];\n\n        if ($attribute->is_required) {\n            $validations[] = 'required';\n        }\n\n        if ($attribute->type == 'price') {\n            $validations[] = 'decimal';\n        }\n\n        $validations[] = $attribute->validation;\n\n        $validations = implode('|', array_filter($validations));\n    @endphp\n\n    <x-admin::form.control-group class=\"mb-2.5 w-full\">\n        <x-admin::form.control-group.label\n            for=\"{{ $attribute->code }}\"\n            :class=\"$attribute->is_required ? 'required' : ''\"\n        >\n            {{ $attribute->name }}\n\n            @if ($attribute->type == 'price')\n                <span class=\"currency-code\">({{ core()->currencySymbol(config('app.currency')) }})</span>\n            @endif\n        </x-admin::form.control-group.label>\n\n        @if (isset($attribute))\n            <x-admin::attributes.edit.index\n                :attribute=\"$attribute\"\n                :validations=\"$validations\"\n                :value=\"isset($entity) ? $entity[$attribute->code] : null\"\n            />\n        @endif\n\n        <x-admin::form.control-group.error :control-name=\"$attribute->code\" />\n    </x-admin::form.control-group>\n@endforeach"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view/address.blade.php",
    "content": "<x-admin::form.control-group.controls.inline.address\n    ::name=\"'{{ $attribute->code }}'\"\n    :value=\"$value\"\n    rules=\"required\"\n    position=\"left\"\n    :label=\"$attribute->name\"\n    ::errors=\"errors\"\n    :placeholder=\"$attribute->name\"\n    :url=\"$url\"\n    :allow-edit=\"$allowEdit\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view/boolean.blade.php",
    "content": "<x-admin::form.control-group.controls.inline.boolean\n    ::name=\"'{{ $attribute->code }}'\"\n    :value=\"json_encode($value)\"\n    rules=\"required\"\n    position=\"left\"\n    :label=\"$attribute->name\"\n    ::errors=\"errors\"\n    :placeholder=\"$attribute->name\"\n    :url=\"$url\"\n    :allow-edit=\"$allowEdit\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view/checkbox.blade.php",
    "content": "@php\n    $options = $attribute->lookup_type\n        ? app('Webkul\\Attribute\\Repositories\\AttributeRepository')->getLookUpOptions($attribute->lookup_type)\n        : $attribute->options()->orderBy('sort_order')->get();\n\n    $selectedOption = old($attribute->code) ?: $value;\n@endphp\n\n<x-admin::form.control-group.controls.inline.multiselect\n    ::name=\"'{{ $attribute->code }}'\"\n    ::value=\"'{{ $selectedOption }}'\"\n    :data=\"$options\"\n    rules=\"required\"\n    position=\"left\"\n    :label=\"$attribute->name\"\n    ::errors=\"errors\"\n    :placeholder=\"$attribute->name\"\n    :url=\"$url\"\n    :allow-edit=\"$allowEdit\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view/date.blade.php",
    "content": "@php\n    if (! empty($value)) {\n        if ($value instanceof \\Carbon\\Carbon) {\n            $value = $value->format('Y-m-d');\n        } elseif (is_string($value)) {\n            $value = \\Carbon\\Carbon::parse($value)->format('Y-m-d');\n        }\n    }\n@endphp\n\n<x-admin::form.control-group.controls.inline.date\n    ::name=\"'{{ $attribute->code }}'\"\n    ::value=\"'{{ $value }}'\"\n    rules=\"required\"\n    position=\"left\"\n    :label=\"$attribute->name\"\n    ::errors=\"errors\"\n    :placeholder=\"$attribute->name\"\n    :url=\"$url\"\n    :allow-edit=\"$allowEdit\"\n/>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view/datetime.blade.php",
    "content": "<x-admin::form.control-group.controls.inline.datetime\n    ::name=\"'{{ $attribute->code }}'\"\n    ::value=\"'{{ $value }}'\"\n    rules=\"required\"\n    position=\"left\"\n    :label=\"$attribute->name\"\n    ::errors=\"errors\"\n    :placeholder=\"$attribute->name\"\n    :url=\"$url\"\n    :allow-edit=\"$allowEdit\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view/email.blade.php",
    "content": "<x-admin::form.control-group.controls.inline.email\n    ::name=\"'{{ $attribute->code }}'\"\n    :value=\"$value\"\n    rules=\"required|decimal:4\"\n    position=\"left\"\n    :label=\"$attribute->name\"\n    ::errors=\"errors\"\n    :placeholder=\"$attribute->name\"\n    :url=\"$url\"\n    :allow-edit=\"$allowEdit\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view/file.blade.php",
    "content": "<x-admin::form.control-group.controls.inline.file\n    ::name=\"'{{ $attribute->code }}'\"\n    ::value=\"'{{ $value ? route('admin.settings.attributes.download', ['path' => $value]) : '' }}'\"\n    rules=\"required|mimes:jpeg,jpg,png,gif\"\n    position=\"left\"\n    :label=\"$attribute->name\"\n    ::errors=\"errors\"\n    :placeholder=\"$attribute->name\"\n    :url=\"$url\"\n    :allow-edit=\"$allowEdit\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view/image.blade.php",
    "content": "<x-admin::form.control-group.controls.inline.image\n    ::name=\"'{{ $attribute->code }}'\"\n    ::value=\"'{{ route('admin.settings.attributes.download', ['path' => $value]) }}'\"\n    rules=\"required|mimes:jpeg,jpg,png,gif\"\n    position=\"left\"\n    :label=\"$attribute->name\"\n    ::errors=\"errors\"\n    :placeholder=\"$attribute->name\"\n    :url=\"$url\"\n    :allow-edit=\"$allowEdit\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view/lookup.blade.php",
    "content": "@php\n    $lookUpEntity = app('Webkul\\Attribute\\Repositories\\AttributeRepository')->getLookUpEntity($attribute->lookup_type, $value);\n@endphp\n\n<x-admin::form.control-group.controls.inline.lookup \n    ::name=\"'{{ $attribute->code }}'\"\n    ::value=\"'{{ $lookUpEntity?->name }}'\"\n    :attribute=\"$attribute\"\n    position=\"left\"\n    :label=\"$attribute->name\"\n    ::errors=\"errors\"\n    :placeholder=\"$attribute->name\"\n    :url=\"$url\"\n    :allow-edit=\"$allowEdit\"\n    :value-label=\"$lookUpEntity?->name ?? '--'\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view/multiselect.blade.php",
    "content": "@php\n    $options = $attribute->lookup_type\n        ? app('Webkul\\Attribute\\Repositories\\AttributeRepository')->getLookUpOptions($attribute->lookup_type)\n        : $attribute->options()->orderBy('sort_order')->get();\n\n    $selectedOption = old($attribute->code) ?: $value;\n@endphp\n\n<x-admin::form.control-group.controls.inline.multiselect\n    ::name=\"'{{ $attribute->code }}'\"\n    ::value=\"'{{ $selectedOption }}'\"\n    :data=\"$options\"\n    rules=\"required\"\n    position=\"left\"\n    :label=\"$attribute->name\"\n    ::errors=\"errors\"\n    :placeholder=\"$attribute->name\"\n    :url=\"$url\"\n    :allow-edit=\"$allowEdit\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view/phone.blade.php",
    "content": "<x-admin::form.control-group.controls.inline.phone\n    ::name=\"'{{ $attribute->code }}'\"\n    :value=\"$value\"\n    rules=\"required|decimal:4\"\n    position=\"left\"\n    :label=\"$attribute->name\"\n    ::errors=\"errors\"\n    :placeholder=\"$attribute->name\"\n    :url=\"$url\"\n    :allow-edit=\"$allowEdit\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view/price.blade.php",
    "content": "<x-admin::form.control-group.controls.inline.text\n    type=\"inline\"\n    ::name=\"'{{ $attribute->code }}'\"\n    ::value=\"'{{ $value }}'\"\n    position=\"left\"\n    rules=\"required\"\n    :label=\"$attribute->name\"\n    :placeholder=\"$attribute->name\"\n    ::errors=\"errors\"\n    :url=\"$url\"\n    :allow-edit=\"$allowEdit\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view/select.blade.php",
    "content": "@php\n    $options = $attribute->lookup_type\n        ? app('Webkul\\Attribute\\Repositories\\AttributeRepository')->getLookUpOptions($attribute->lookup_type)\n        : $attribute->options()->orderBy('sort_order')->get();\n@endphp\n\n<x-admin::form.control-group.controls.inline.select\n    ::name=\"'{{ $attribute->code }}'\"\n    :value=\"$value\"\n    :options=\"$options\"\n    rules=\"required\"\n    position=\"left\"\n    :label=\"$attribute->name\"\n    ::errors=\"errors\"\n    :placeholder=\"$attribute->name\"\n    :url=\"$url\"\n    :allow-edit=\"$allowEdit\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view/text.blade.php",
    "content": "<x-admin::form.control-group.controls.inline.text\n    type=\"inline\"\n    ::name=\"'{{ $attribute->code }}'\"\n    :value=\"$value ?? ''\"\n    :value-label=\"$value == '' ? '--' : $value\"\n    position=\"left\"\n    rules=\"required|{{ $attribute->validation }}\"\n    :label=\"$attribute->name\"\n    :placeholder=\"$attribute->name\"\n    ::errors=\"errors\"\n    :url=\"$url\"\n    :allow-edit=\"$allowEdit\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view/textarea.blade.php",
    "content": "<x-admin::form.control-group.controls.inline.text\n    type=\"inline\"\n    ::name=\"'{{ $attribute->code }}'\"\n    :value=\"$value\"\n    position=\"left\"\n    rules=\"required\"\n    :label=\"$attribute->name\"\n    :placeholder=\"$attribute->name\"\n    ::errors=\"errors\"\n    :url=\"$url\"\n    :allow-edit=\"$allowEdit\"\n/>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/attributes/view.blade.php",
    "content": "@props([\n    'customAttributes' => [],\n    'entity' => null,\n    'allowEdit' => false,\n    'url' => null,\n])\n\n<div class=\"flex flex-col gap-1\">\n    @foreach ($customAttributes as $attribute)\n        @if (view()->exists($typeView = 'admin::components.attributes.view.' . $attribute->type))\n            <div class=\"grid grid-cols-[1fr_2fr] items-center gap-1\">\n                <div class=\"label dark:text-white\">{{ $attribute->name }}</div>\n\n                <div class=\"font-medium dark:text-white\">\n                    @include ($typeView, [\n                        'attribute' => $attribute,\n                        'value' => isset($entity) ? $entity[$attribute->code] : null,\n                        'allowEdit' => $allowEdit,\n                        'url' => $url,\n                    ])\n                </div>\n            </div>\n        @endif\n    @endforeach\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/avatar/index.blade.php",
    "content": "<v-avatar {{ $attributes }}>\n    <div class=\"shimmer h-9 w-9 rounded-full\"></div>\n</v-avatar>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-avatar-template\"\n    >\n        <div\n            class=\"flex h-9 min-w-9 items-center justify-center rounded-full text-xs font-medium\"\n            :class=\"colorClasses()\"\n        >\n            @{{ name.split(' ').slice(0, 2).map(word => word[0].toUpperCase()).join('') }}\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-avatar', {\n            template: '#v-avatar-template',\n\n            props: {\n                name: {\n                    type: String,\n                    default: '',\n                },\n            },\n\n            data() {\n                return {\n                    colors: {\n                        background: [\n                            'bg-yellow-200',\n                            'bg-red-200',\n                            'bg-lime-200',\n                            'bg-blue-200',\n                            'bg-orange-200',\n                            'bg-green-200',\n                            'bg-pink-200',\n                            'bg-yellow-400'\n                        ],\n\n                        text: [\n                            'text-yellow-900',\n                            'text-red-900',\n                            'text-lime-900',\n                            'text-blue-900',\n                            'text-orange-900',\n                            'text-green-900',\n                            'text-pink-900',\n                            'text-yellow-900',\n                        ],\n                    },\n                }\n            },\n\n            methods: {\n                colorClasses() {\n                    let index = Math.floor(Math.random() * this.colors.background.length);\n\n                    return [\n                        this.colors.background[index],\n                        this.colors.text[index],\n                    ];\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/breadcrumbs/index.blade.php",
    "content": "@props([\n    'name' => '',\n    'entity' => null,\n    'route' => null,\n])\n\n<div class=\"flex justify-start max-lg:hidden\">\n    <div class=\"flex items-center gap-x-3.5\">        \n        @if($route)\n            {{ Breadcrumbs::view('admin::partials.breadcrumbs', $name, $route, $entity) }}\n        @else\n            {{ Breadcrumbs::view('admin::partials.breadcrumbs', $name, $entity) }}\n        @endif\n    </div>\n</div>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/button/index.blade.php",
    "content": "<v-button {{ $attributes }}></v-button>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-button-template\"\n    >\n        <button\n            v-if=\"! loading\"\n            :class=\"[buttonClass, '']\"\n        >\n            @{{ title }}\n        </button>\n\n        <button\n            v-else\n            :class=\"[buttonClass, '']\"\n        >\n            <!-- Spinner -->\n            <x-admin::spinner class=\"absolute\" />\n\n            <span class=\"relative h-full w-full opacity-0\">\n                @{{ title }}\n            </span>\n        </button>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-button', {\n            template: '#v-button-template',\n\n            props: {\n                loading: Boolean,\n                buttonType: String,\n                title: String,\n                buttonClass: String,\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/charts/bar.blade.php",
    "content": "<v-charts-bar {{ $attributes }}></v-charts-bar>\n\n@pushOnce('scripts')\n    <!-- SEO Vue Component Template -->\n    <script\n        type=\"text/x-template\"\n        id=\"v-charts-bar-template\"\n    >\n        <canvas\n            :id=\"$.uid + '_chart'\"\n            class=\"flex w-full max-w-full items-end\"\n            :style=\"'aspect-ratio:' + aspectRatio + '/1'\"\n            style=\"\"\n        ></canvas>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-charts-bar', {\n            template: '#v-charts-bar-template',\n\n            props: {\n                labels: {\n                    type: Array,\n                    default: [],\n                },\n\n                datasets: {\n                    type: Array,\n                    default: [],\n                },\n\n                aspectRatio: {\n                    type: Number,\n                    default: 3.23,\n                },\n            },\n\n            data() {\n                return {\n                    chart: undefined,\n                }\n            },\n\n            mounted() {\n                this.prepare();\n            },\n\n            methods: {\n                prepare() {\n                    const barCount = this.datasets.length;\n                    \n                    this.datasets.forEach((dataset) => {\n                        dataset.barThickness = Math.max(4, 36 / barCount);\n                    });\n        \n                    if (this.chart) {\n                        this.chart.destroy();\n                    }\n\n                    this.chart = new Chart(document.getElementById(this.$.uid + '_chart'), {\n                        type: 'bar',\n                        \n                        data: {\n                            labels: this.labels,\n\n                            datasets: this.datasets,\n                        },\n\n                        options: {\n                            aspectRatio: this.aspectRatio,\n                            \n                            plugins: {\n                                legend: {\n                                    display: false\n                                },\n                            },\n                            \n                            scales: {\n                                x: {\n                                    beginAtZero: true,\n\n                                    border: {\n                                        dash: [8, 4],\n                                    }\n                                },\n\n                                y: {\n                                    beginAtZero: true,\n                                    border: {\n                                        dash: [8, 4],\n                                    }\n                                }\n                            }\n                        }\n                    });\n                }\n            }\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/charts/doughnut.blade.php",
    "content": "<v-charts-doughnut {{ $attributes }}></v-charts-doughnut>\n\n@pushOnce('scripts')\n    <!-- SEO Vue Component Template -->\n    <script\n        type=\"text/x-template\"\n        id=\"v-charts-doughnut-template\"\n    >\n        <canvas\n            :id=\"$.uid + '_chart'\"\n            class=\"flex w-full max-w-full items-end\"\n        ></canvas>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-charts-doughnut', {\n            template: '#v-charts-doughnut-template',\n\n            props: {\n                labels: {\n                    type: Array, \n                    default: [],\n                },\n\n                datasets: {\n                    type: Array, \n                    default: true,\n                },\n            },\n\n            data() {\n                return {\n                    chart: undefined,\n                }\n            },\n\n            mounted() {\n                this.prepare();\n            },\n\n            methods: {\n                prepare() {\n                    if (this.chart) {\n                        this.chart.destroy();\n                    }\n\n                    this.chart = new Chart(document.getElementById(this.$.uid + '_chart'), {\n                        type: 'doughnut',\n                        \n                        data: {\n                            labels: this.labels,\n\n                            datasets: this.datasets,\n                        },\n                \n                        options: {\n                            plugins: {\n                                legend: {\n                                    display: false\n                                },\n                            },\n                        }\n                    });\n                }\n            }\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/charts/line.blade.php",
    "content": "<v-charts-line {{ $attributes }}></v-charts-line>\n\n@pushOnce('scripts')\n    <!-- SEO Vue Component Template -->\n    <script\n        type=\"text/x-template\"\n        id=\"v-charts-line-template\"\n    >\n        <canvas\n            :id=\"$.uid + '_chart'\"\n            class=\"flex w-full items-end\"\n            :style=\"'aspect-ratio:' + aspectRatio + '/1'\"\n        ></canvas>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-charts-line', {\n            template: '#v-charts-line-template',\n\n            props: {\n                labels: {\n                    type: Array, \n                    default: [],\n                },\n\n                datasets: {\n                    type: Array, \n                    default: true,\n                },\n\n                aspectRatio: {\n                    type: Number, \n                    default: 3.23,\n                },\n            },\n\n            data() {\n                return {\n                    chart: undefined,\n                }\n            },\n\n            mounted() {\n                this.prepare();\n            },\n\n            methods: {\n                prepare() {\n                    if (this.chart) {\n                        this.chart.destroy();\n                    }\n\n                    this.chart = new Chart(document.getElementById(this.$.uid + '_chart'), {\n                        type: 'line',\n                        \n                        data: {\n                            labels: this.labels,\n\n                            datasets: this.datasets,\n                        },\n                \n                        options: {\n                            aspectRatio: this.aspectRatio,\n                            \n                            plugins: {\n                                legend: {\n                                    display: false\n                                },\n\n                                {{-- tooltip: {\n                                    enabled: false,\n                                } --}}\n                            },\n                            \n                            scales: {\n                                x: {\n                                    beginAtZero: true,\n\n                                    border: {\n                                        dash: [8, 4],\n                                    }\n                                },\n\n                                y: {\n                                    beginAtZero: true,\n                                    border: {\n                                        dash: [8, 4],\n                                    }\n                                }\n                            }\n                        }\n                    });\n                }\n            }\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/datagrid/export/index.blade.php",
    "content": "<v-datagrid-export {{ $attributes }}>\n    <div class=\"transparent-button hover:bg-gray-200 dark:text-white dark:hover:bg-gray-800\">\n        <span class=\"icon-export text-xl text-gray-600\"></span>\n\n        @lang('admin::app.export.export')\n    </div>\n</v-datagrid-export>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-datagrid-export-template\"\n    >\n        <div>\n            <x-admin::modal ref=\"exportModal\">\n                <x-slot:toggle>\n                    <button class=\"transparent-button hover:bg-gray-200 dark:text-white dark:hover:bg-gray-800\">\n                        <span class=\"icon-export text-xl text-gray-600\"></span>\n\n                        @lang('admin::app.export.export')\n                    </button>\n                </x-slot>\n\n                <x-slot:header>\n                    <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                        @lang('admin::app.export.download')\n                    </p>\n                </x-slot>\n\n                <x-slot:content>\n                    <x-admin::form action=\"\">\n                        <x-admin::form.control-group class=\"!mb-0\">\n                            <x-admin::form.control-group.control\n                                type=\"select\"\n                                name=\"format\"\n                                v-model=\"format\"\n                            >\n                                <option value=\"csv\">\n                                    @lang('admin::app.export.csv')\n                                </option>\n\n                                <option value=\"xls\">\n                                    @lang('admin::app.export.xls')\n                                </option>\n\n                                <option value=\"xlsx\">\n                                    @lang('admin::app.export.xlsx')\n                                </option>\n                            </x-admin::form.control-group.control>\n                        </x-admin::form.control-group>\n                    </x-admin::form>\n                </x-slot>\n\n                <x-slot:footer>\n                    <button\n                        type=\"button\"\n                        class=\"primary-button\"\n                        @click=\"download\"\n                    >\n                        @lang('admin::app.export.export')\n                    </button>\n                </x-slot>\n            </x-admin::modal>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-datagrid-export', {\n            template: '#v-datagrid-export-template',\n\n            props: ['src'],\n\n            data() {\n                return {\n                    format: 'xls',\n\n                    available: null,\n\n                    applied: null,\n                };\n            },\n\n            mounted() {\n                this.registerEvents();\n            },\n\n            methods: {\n                /**\n                 * Registers events to update properties and trigger the download process.\n                 *\n                 * @returns {void}\n                 */\n                registerEvents() {\n                    this.$emitter.on('change-datagrid', this.updateProperties);\n                },\n\n                /**\n                 * Updates the available and applied properties with new values.\n                 *\n                 * @param {object} data - Object containing available and applied properties.\n                 * @returns {void}\n                 */\n                updateProperties({ available, applied }) {\n                    this.available = available;\n\n                    this.applied = applied;\n                },\n\n                /**\n                 * Initiates the download process for exporting data.\n                 *\n                 * @returns {void}\n                 */\n                download() {\n                    if (! this.available?.records?.length) {\n                        this.$emitter.emit('add-flash', { type: 'warning', message: '@lang('admin::app.export.no-records')' });\n\n                        this.$refs.exportModal.toggle();\n                    } else {\n                        let params = {\n                            export: 1,\n\n                            format: this.format,\n\n                            sort: {},\n\n                            filters: {},\n                        };\n\n                        if (\n                            this.applied.sort.column &&\n                            this.applied.sort.order\n                        ) {\n                            params.sort = this.applied.sort;\n                        }\n\n                        this.applied.filters.columns.forEach(column => {\n                            params.filters[column.index] = column.value;\n                        });\n\n                        this.$axios\n                            .get(this.src, {\n                                params,\n                                responseType: 'blob',\n                            })\n                            .then((response) => {\n                                const url = window.URL.createObjectURL(new Blob([response.data]));\n\n                                /**\n                                 * Link generation.\n                                 */\n                                const link = document.createElement('a');\n                                link.href = url;\n                                link.setAttribute('download', `${(Math.random() + 1).toString(36).substring(7)}.${this.format}`);\n\n                                /**\n                                 * Adding a link to a document, clicking on the link, and then removing the link.\n                                 */\n                                document.body.appendChild(link);\n                                link.click();\n                                document.body.removeChild(link);\n\n                                this.$refs.exportModal.toggle();\n                            });\n                    }\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/datagrid/export/temp.blade.php",
    "content": "<table>\n    <thead>\n        <tr>\n            @foreach ($columns as $column)\n                <th>{{ $column->getLabel() }}</th>\n            @endforeach\n        </tr>\n    </thead>\n\n    <tbody>\n        @foreach ($records as $record)\n            <tr>\n                @foreach($columns as $column)\n                    @if ($closure = $column->getClosure())\n                        <td>{!! $closure($record) !!}</td>\n                    @else\n                        <td>{{ $record->{$column->getIndex()} }}</td>\n                    @endif\n                @endforeach\n            </tr>\n        @endforeach\n    </tbody>\n</table>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/datagrid/index.blade.php",
    "content": "@props([\n    'isMultiRow' => false,\n    'toolbarLeftBefore' => null,\n    'toolbarLeftAfter' => null,\n    'toolbarRightBefore' => null,\n    'toolbarRightAfter' => null,\n])\n\n<v-datagrid {{ $attributes }}>\n    {{ $slot }}\n</v-datagrid>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-datagrid-template\"\n    >\n        <div>\n            <!-- Toolbar -->\n            <x-admin::datagrid.toolbar>\n                <x-slot:toolbar-left-before>\n                    {{ $toolbarLeftBefore }}\n                </x-slot>\n                \n                <x-slot:toolbar-left-after>\n                    {{ $toolbarLeftAfter }}\n                </x-slot>\n                \n                <x-slot:toolbar-right-before>\n                    {{ $toolbarRightBefore }}\n                </x-slot>\n                \n                <x-slot:toolbar-right-after>\n                    {{ $toolbarRightAfter }}\n                </x-slot>\n            </x-admin::datagrid.toolbar>\n\n            <div class=\"flex\">\n                <x-admin::datagrid.table :isMultiRow=\"$isMultiRow\">\n                    <template #header=\"{\n                        isLoading,\n                        available,\n                        applied,\n                        selectAll,\n                        sort,\n                        performAction\n                    }\">\n                        <slot\n                            name=\"header\"\n                            :is-loading=\"isLoading\"\n                            :available=\"available\"\n                            :applied=\"applied\"\n                            :select-all=\"selectAll\"\n                            :sort=\"sort\"\n                            :perform-action=\"performAction\"\n                        >\n                        </slot>\n                    </template>\n\n                    <template #body=\"{\n                        isLoading,\n                        available,\n                        applied,\n                        selectAll,\n                        sort,\n                        performAction\n                    }\">\n                        <slot\n                            name=\"body\"\n                            :is-loading=\"isLoading\"\n                            :available=\"available\"\n                            :applied=\"applied\"\n                            :select-all=\"selectAll\"\n                            :sort=\"sort\"\n                            :perform-action=\"performAction\"\n                        >\n                        </slot>\n                    </template>\n                </x-admin::datagrid.table>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-datagrid', {\n            template: '#v-datagrid-template',\n\n            props: ['src'],\n\n            data() {\n                return {\n                    isLoading: false,\n\n                    available: {\n                        id: null,\n\n                        columns: [],\n\n                        actions: [],\n\n                        massActions: [],\n\n                        records: [],\n\n                        meta: {},\n                    },\n\n                    applied: {\n                        massActions: {\n                            meta: {\n                                mode: 'none',\n\n                                action: null,\n                            },\n\n                            indices: [],\n\n                            value: null,\n                        },\n\n                        pagination: {\n                            page: 1,\n\n                            perPage: 10,\n                        },\n\n                        sort: {\n                            column: null,\n\n                            order: null,\n                        },\n\n                        filters: {\n                            columns: [\n                                {\n                                    index: 'all',\n                                    value: [],\n                                },\n                            ],\n                        },\n\n                        savedFilterId: null,\n                    },\n                };\n            },\n\n            watch: {\n                'available.records': function (newRecords, oldRecords) {\n                    this.setCurrentSelectionMode();\n\n                    this.updateDatagrids();\n\n                    this.updateExportComponent();\n                },\n\n                'applied.savedFilterId': function (newSavedFilterId, oldSavedFilterId) {\n                    this.updateDatagrids();\n                },\n\n                'applied.massActions.indices': function (newIndices, oldIndices) {\n                    this.setCurrentSelectionMode();\n                },\n            },\n\n            mounted() {\n                this.boot();\n            },\n\n            methods: {\n                /**\n                 * Initialization: This function checks for any previously saved filters in local storage and applies them as needed.\n                 *\n                 * @returns {void}\n                 */\n                boot() {\n                    let datagrids = this.getDatagrids();\n\n                    const urlParams = new URLSearchParams(window.location.search);\n\n                    if (urlParams.has('search')) {\n                        let searchAppliedColumn = this.applied.filters.columns.find(column => column.index === 'all');\n\n                        searchAppliedColumn.value = [urlParams.get('search')];\n                    }\n\n                    if (datagrids?.length) {\n                        const currentDatagrid = datagrids.find(({ src }) => src === this.src);\n\n                        if (currentDatagrid) {\n                            this.applied.pagination = currentDatagrid.applied.pagination;\n\n                            this.applied.sort = currentDatagrid.applied.sort;\n\n                            this.applied.filters = currentDatagrid.applied.filters;\n\n                            this.applied.savedFilterId = currentDatagrid.applied.savedFilterId;\n\n                            if (urlParams.has('search')) {\n                                let searchAppliedColumn = this.applied.filters.columns.find(column => column.index === 'all');\n\n                                searchAppliedColumn.value = [urlParams.get('search')];\n                            }\n\n                            this.get();\n\n                            return;\n                        }\n                    }\n\n                    this.get();\n                },\n\n                /**\n                 * Get. This will prepare params from the `applied` props and fetch the data from the backend.\n                 *\n                 * @returns {void}\n                 */\n                get(extraParams = {}) {\n                    let params = {\n                        pagination: {\n                            page: this.applied.pagination.page,\n                            per_page: this.applied.pagination.perPage,\n                        },\n\n                        sort: {},\n\n                        filters: {},\n                    };\n\n                    if (\n                        this.applied.sort.column &&\n                        this.applied.sort.order\n                    ) {\n                        params.sort = this.applied.sort;\n                    }\n\n                    this.applied.filters.columns.forEach(column => {\n                        params.filters[column.index] = column.value;\n                    });\n\n                    const urlParams = new URLSearchParams(window.location.search);\n\n                    urlParams.forEach((param, key) => params[key] = param);\n\n                    this.isLoading = true;\n\n                    this.$axios\n                        .get(this.src, {\n                            params: { ...params, ...extraParams }\n                        })\n                        .then((response) => {\n                            /**\n                             * Precisely taking all the keys to the data prop to avoid adding any extra keys from the response.\n                             */\n                            const {\n                                id,\n                                columns,\n                                actions,\n                                mass_actions,\n                                records,\n                                meta\n                            } = response.data;\n\n                            this.available.id = id;\n\n                            this.available.columns = columns;\n\n                            this.available.actions = actions;\n\n                            this.available.massActions = mass_actions;\n\n                            this.available.records = records;\n\n                            this.available.meta = meta;\n\n                            this.isLoading = false;\n                        });\n                },\n\n                /**\n                 * Change Page. When the child component has handled all the cases, it will send the\n                 * valid new page; otherwise, it will block. Here, we are certain that we have\n                 * a new page, so the parent will simply call the AJAX based on the new page.\n                 *\n                 * @param {integer} newPage\n                 * @returns {void}\n                 */\n                changePage(newPage) {\n                    this.applied.pagination.page = newPage;\n\n                    this.get();\n                },\n\n                /**\n                 * Change per page option.\n                 *\n                 * @param {integer} option\n                 * @returns {void}\n                 */\n                changePerPageOption(option) {\n                    this.applied.pagination.perPage = option;\n\n                    /**\n                     * When the total records are less than the number of data per page, we need to reset the page.\n                     */\n                    if (this.available.meta.last_page >= this.applied.pagination.page) {\n                        this.applied.pagination.page = 1;\n                    }\n\n                    this.get();\n                },\n\n                /**\n                 * Sort results.\n                 *\n                 * @param {object} column\n                 * @returns {void}\n                 */\n                sort(column) {\n                    if (column.sortable) {\n                        this.applied.sort = {\n                            column: column.index,\n                            order: this.applied.sort.order === 'asc' ? 'desc' : 'asc',\n                        };\n\n                        /**\n                         * When the sorting changes, we need to reset the page.\n                         */\n                        this.applied.pagination.page = 1;\n\n                        this.get();\n                    }\n                },\n\n                /**\n                 * Search results.\n                 *\n                 * @param {object} filters\n                 * @returns {void}\n                 */\n                search(filters) {\n                    this.applied.filters.columns = [\n                        ...(this.applied.filters.columns.filter((column) => column.index !== 'all')),\n                        ...filters.columns,\n                    ];\n\n                    /**\n                     * We need to reset the page on filtering.\n                     */\n                    this.applied.pagination.page = 1;\n\n                    this.get();\n                },\n\n                /**\n                 * Filter results.\n                 *\n                 * @param {object} filters\n                 * @returns {void}\n                 */\n                 filter(filters) {\n                    this.applied.filters.columns = [\n                        ...(this.applied.filters.columns.filter((column) => column.index === 'all')),\n                        ...filters.columns,\n                    ];\n\n                    /**\n                     * This will check for empty column values and reset the saved filter ID to ensure the saved filter is not highlighted.\n                     */\n                    const isEmptyColumnValue = this.applied.filters.columns\n                        .filter((column) => column.index !== 'all')\n                        .every((column) => column.value.length === 0);\n\n                    if (isEmptyColumnValue) {\n                        this.applied.savedFilterId = null;\n                    }\n\n                    /**\n                     * We need to reset the page on filtering.\n                     */\n                    this.applied.pagination.page = 1;\n\n                    this.get();\n                },\n\n                /**\n                 * Filter results by the saved filter.\n                 *\n                 * @param {Object} filter\n                 * @returns {void}\n                 */\n                 applySavedFilter(filter) {\n                    if (! filter) {\n                        this.applied.savedFilterId = null;\n\n                        return;\n                    }\n\n                    this.applied = filter.applied;\n\n                    this.applied.savedFilterId = filter.id;\n\n                    this.get();\n                },\n\n                /**\n                 * This will analyze the current selection mode based on the mass action indices.\n                 *\n                 * @returns {void}\n                 */\n                setCurrentSelectionMode() {\n                    this.applied.massActions.meta.mode = 'none';\n\n                    if (! this.available.records.length) {\n                        return;\n                    }\n\n                    let selectionCount = 0;\n\n                    this.available.records.forEach(record => {\n                        const id = record[this.available.meta.primary_column];\n\n                        if (this.applied.massActions.indices.includes(id)) {\n                            this.applied.massActions.meta.mode = 'partial';\n\n                            ++selectionCount;\n                        }\n                    });\n\n                    if (this.available.records.length === selectionCount) {\n                        this.applied.massActions.meta.mode = 'all';\n                    }\n                },\n\n                /**\n                 * This will select all records and update the mass action indices.\n                 *\n                 * @returns {void}\n                 */\n                selectAll() {\n                    if (['all', 'partial'].includes(this.applied.massActions.meta.mode)) {\n                        this.available.records.forEach(record => {\n                            const id = record[this.available.meta.primary_column];\n\n                            this.applied.massActions.indices = this.applied.massActions.indices.filter(selectedId => selectedId !== id);\n                        });\n\n                        this.applied.massActions.meta.mode = 'none';\n                    } else {\n                        this.available.records.forEach(record => {\n                            const id = record[this.available.meta.primary_column];\n\n                            let found = this.applied.massActions.indices.find(selectedId => selectedId === id);\n\n                            if (! found) {\n                                this.applied.massActions.indices = [\n                                    ...this.applied.massActions.indices,\n                                    id,\n                                ];\n                            }\n                        });\n\n                        this.applied.massActions.meta.mode = 'all';\n                    }\n                },\n\n                /**\n                 * Updates the export component properties whenever new results appear in the datagrid.\n                 *\n                 * @returns {void}\n                 */\n                 updateExportComponent() {\n                    /**\n                     * This event should be fired whenever new results appear. This allows the export feature to\n                     * listen to it and update its properties accordingly.\n                     */\n                     this.$emitter.emit('change-datagrid', {\n                        available: this.available,\n                        applied: this.applied\n                    });\n                },\n\n                //=======================================================================================\n                // Support for previous applied values in datagrids. All code is based on local storage.\n                //=======================================================================================\n\n                /**\n                 * Updates the datagrids stored in local storage with the latest data.\n                 *\n                 * @returns {void}\n                 */\n                updateDatagrids() {\n                    let datagrids = this.getDatagrids();\n\n                    if (datagrids?.length) {\n                        const currentDatagrid = datagrids.find(({ src }) => src === this.src);\n\n                        if (currentDatagrid) {\n                            datagrids = datagrids.map(datagrid => {\n                                if (datagrid.src === this.src) {\n                                    return {\n                                        ...datagrid,\n                                        requestCount: ++datagrid.requestCount,\n                                        available: this.available,\n                                        applied: this.applied,\n                                    };\n                                }\n\n                                return datagrid;\n                            });\n                        } else {\n                            datagrids.push(this.getDatagridInitialProperties());\n                        }\n                    } else {\n                        datagrids = [this.getDatagridInitialProperties()];\n                    }\n\n                    this.setDatagrids(datagrids);\n                },\n\n                /**\n                 * Returns the initial properties for a datagrid.\n                 *\n                 * @returns {object} Initial properties for a datagrid.\n                 */\n                getDatagridInitialProperties() {\n                    return {\n                        src: this.src,\n                        requestCount: 0,\n                        available: this.available,\n                        applied: this.applied,\n                    };\n                },\n\n                /**\n                 * Returns the storage key for datagrids in local storage.\n                 *\n                 * @returns {string} Storage key for datagrids.\n                 */\n                getDatagridsStorageKey() {\n                    return 'datagrids';\n                },\n\n                /**\n                 * Retrieves the datagrids stored in local storage.\n                 *\n                 * @returns {Array} Datagrids stored in local storage.\n                 */\n                getDatagrids() {\n                    let datagrids = localStorage.getItem(\n                        this.getDatagridsStorageKey()\n                    );\n\n                    return JSON.parse(datagrids) ?? [];\n                },\n\n                /**\n                 * Sets the datagrids in local storage.\n                 *\n                 * @param {Array} datagrids - Datagrids to be stored in local storage.\n                 * @returns {void}\n                 */\n                setDatagrids(datagrids) {\n                    localStorage.setItem(\n                        this.getDatagridsStorageKey(),\n                        JSON.stringify(datagrids)\n                    );\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/datagrid/table.blade.php",
    "content": "@props(['isMultiRow' => false])\n\n<v-datagrid-table\n    :is-loading=\"isLoading\"\n    :available=\"available\"\n    :applied=\"applied\"\n    @selectAll=\"selectAll\"\n    @sort=\"sort\"\n    @actionSuccess=\"get\"\n>\n    {{ $slot }}\n</v-datagrid-table>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-datagrid-table-template\"\n    >\n        <div class=\"w-full\">\n            <!-- Table view for larger screens, Card view for mobile -->\n            <div class=\"table-responsive box-shadow rounded-t-0 grid w-full overflow-hidden border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                <!-- Table Header - Always visible on all screens -->\n                <slot\n                    name=\"header\"\n                    :is-loading=\"isLoading\"\n                    :available=\"available\"\n                    :applied=\"applied\"\n                    :select-all=\"selectAll\"\n                    :sort=\"sort\"\n                    :perform-action=\"performAction\"\n                >\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.datagrid.table.head :isMultiRow=\"$isMultiRow\" />\n                    </template>\n\n                    <template v-else>\n                        <div\n                            class=\"row grid min-h-[47px] items-center gap-2.5 border-b bg-gray-50 px-4 py-2.5 text-black dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 max-lg:hidden\"\n                            :style=\"`grid-template-columns: repeat(${gridsCount}, minmax(0, 1fr))`\"\n                        >\n                            <!-- Mass Actions -->\n                            <p v-if=\"available.massActions.length\">\n                                <label for=\"mass_action_select_all_records\">\n                                    <input\n                                        type=\"checkbox\"\n                                        name=\"mass_action_select_all_records\"\n                                        id=\"mass_action_select_all_records\"\n                                        class=\"peer hidden\"\n                                        :checked=\"['all', 'partial'].includes(applied.massActions.meta.mode)\"\n                                        @change=\"selectAll\"\n                                    >\n\n                                    <span\n                                        class=\"icon-checkbox-outline cursor-pointer rounded-md text-2xl text-gray-500 peer-checked:text-brandColor\"\n                                        :class=\"[\n                                            applied.massActions.meta.mode === 'all' ? 'peer-checked:icon-checkbox-select peer-checked:text-brandColor ' : (\n                                                applied.massActions.meta.mode === 'partial' ? 'peer-checked:icon-checkbox-multiple peer-checked:brandColor' : ''\n                                            ),\n                                        ]\"\n                                    >\n                                    </span>\n                                </label>\n                            </p>\n\n                            <!-- Columns -->\n                            <template v-for=\"column in available.columns\">\n                                <div\n                                    class=\"flex items-center gap-1.5 break-words\"\n                                    :class=\"{'cursor-pointer select-none hover:text-gray-800 dark:hover:text-white': column.sortable}\"\n                                    @click=\"sort(column)\"\n                                    v-if=\"column.visibility\"\n                                > \n                                    <p v-html=\"column.label\"></p>\n\n                                    <i\n                                        class=\"align-text-bottom text-base text-gray-600 dark:text-gray-300\"\n                                        :class=\"[applied.sort.order === 'asc' ? 'icon-stats-down': 'icon-stats-up']\"\n                                        v-if=\"column.index == applied.sort.column\"\n                                    ></i>\n                                </div>\n                            </template>\n\n                            <!-- Actions -->\n                            <p\n                                class=\"text-end\"\n                                v-if=\"available.actions.length\"\n                            >\n                                @lang('admin::app.components.datagrid.table.actions')\n                            </p>\n                        </div>\n                        \n                        <!-- Mobile Sort/Filter Header -->\n                        <div class=\"hidden border-b bg-gray-50 px-4 py-3 text-black dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 max-lg:block\">\n                            <div class=\"flex items-center justify-between\">\n                                <!-- Mass Actions for Mobile -->\n                                <div v-if=\"available.massActions.length\">\n                                    <label for=\"mass_action_select_all_records\">\n                                        <input\n                                            type=\"checkbox\"\n                                            name=\"mass_action_select_all_records\"\n                                            id=\"mass_action_select_all_records\"\n                                            class=\"peer hidden\"\n                                            :checked=\"['all', 'partial'].includes(applied.massActions.meta.mode)\"\n                                            @change=\"selectAll\"\n                                        >\n    \n                                        <span\n                                            class=\"icon-checkbox-outline cursor-pointer rounded-md text-2xl text-gray-500 peer-checked:text-brandColor\"\n                                            :class=\"[\n                                                applied.massActions.meta.mode === 'all' ? 'peer-checked:icon-checkbox-select peer-checked:text-brandColor ' : (\n                                                    applied.massActions.meta.mode === 'partial' ? 'peer-checked:icon-checkbox-multiple peer-checked:brandColor' : ''\n                                                ),\n                                            ]\"\n                                        >\n                                        </span>\n                                    </label>\n                                </div>\n                                \n                                <!-- Mobile Sort Dropdown -->\n                                <div class=\"flex w-full justify-end\" v-if=\"available.columns.some(column => column.sortable)\">\n                                    <x-admin::dropdown position=\"bottom-{{ in_array(app()->getLocale(), ['fa', 'ar']) ? 'left' : 'right' }}\">\n                                        <x-slot:toggle>\n                                            <div class=\"flex items-center gap-1\">\n                                                <button\n                                                    type=\"button\"\n                                                    class=\"inline-flex w-full max-w-max cursor-pointer appearance-none items-center justify-between gap-x-2 rounded-md border bg-white px-2.5 py-1.5 text-center leading-6 text-gray-600 transition-all marker:shadow hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                                >\n                                                    <span>\n                                                        Sort\n                                                    </span>\n                    \n                                                    <span class=\"icon-down-arrow text-2xl\"></span>\n                                                </button>\n                                            </div>\n                                        </x-slot>\n                \n                                        <x-slot:menu>\n                                            <x-admin::dropdown.menu.item\n                                                v-for=\"column in available.columns.filter(column => column.sortable && column.visibility)\"\n                                                @click=\"sort(column)\"\n                                            >\n                                                <div class=\"flex items-center gap-2\">\n                                                    <span v-html=\"column.label\"></span>\n                                                    <i\n                                                        class=\"align-text-bottom text-base text-gray-600 dark:text-gray-300\"\n                                                        :class=\"[applied.sort.order === 'asc' ? 'icon-stats-down': 'icon-stats-up']\"\n                                                        v-if=\"column.index == applied.sort.column\"\n                                                    ></i>\n                                                </div>\n                                            </x-admin::dropdown.menu.item>\n                                        </x-slot>\n                                    </x-admin::dropdown>\n                                </div>\n                            </div>\n                        </div>\n                    </template>\n                </slot>\n\n                <slot\n                    name=\"body\"\n                    :is-loading=\"isLoading\"\n                    :available=\"available\"\n                    :applied=\"applied\"\n                    :select-all=\"selectAll\"\n                    :sort=\"sort\"\n                    :perform-action=\"performAction\"\n                >\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.datagrid.table.body :isMultiRow=\"$isMultiRow\" />\n                    </template>\n\n                    <template v-else>\n                        <template v-if=\"available.records.length\">\n                            <!-- Desktop View -->\n                            <div\n                                class=\"row grid items-center gap-2.5 border-b px-4 py-4 text-black transition-all hover:bg-gray-50 dark:border-gray-800 dark:text-gray-300 dark:hover:bg-gray-950 max-lg:hidden\"\n                                v-for=\"record in available.records\"\n                                :style=\"`grid-template-columns: repeat(${gridsCount}, minmax(0, 1fr))`\"\n                            >\n                                <!-- Mass Actions -->\n                                <p v-if=\"available.massActions.length\">\n                                    <label :for=\"`mass_action_select_record_${record[available.meta.primary_column]}`\">\n                                        <input\n                                            type=\"checkbox\"\n                                            :name=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                            :value=\"record[available.meta.primary_column]\"\n                                            :id=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                            class=\"peer hidden\"\n                                            v-model=\"applied.massActions.indices\"\n                                        >\n\n                                        <span class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-500 peer-checked:text-brandColor\">\n                                        </span>\n                                    </label>\n                                </p>\n\n                                <!-- Columns -->\n                                <template v-for=\"column in available.columns\">\n                                    <p\n                                        class=\"break-words\"\n                                        v-html=\"record[column.index]\"\n                                        v-if=\"column.visibility\"\n                                    >\n                                    </p>\n                                </template>\n\n                                <!-- Actions -->\n                                <p\n                                    class=\"flex h-full items-center place-self-end\"\n                                    v-if=\"available.actions.length\"\n                                >\n                                    <span\n                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                        :class=\"action.icon\"\n                                        v-text=\"! action.icon ? action.title : ''\"\n                                        v-for=\"action in record.actions\"\n                                        @click=\"performAction(action)\"\n                                    >\n                                    </span>\n                                </p>\n                            </div>\n                            \n                            <!-- Mobile Card View -->\n                            <div\n                                class=\"hidden border-b px-4 py-4 text-black dark:border-gray-800 dark:text-gray-300 max-lg:block\"\n                                v-for=\"record in available.records\"\n                            >\n                                <div class=\"mb-2 flex items-center justify-between\">\n                                    <!-- Mass Actions for Mobile Cards -->\n                                    <div class=\"flex w-full items-center justify-between gap-2\">\n                                        <p v-if=\"available.massActions.length\">\n                                            <label :for=\"`mass_action_select_record_${record[available.meta.primary_column]}`\">\n                                                <input\n                                                    type=\"checkbox\"\n                                                    :name=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                    :value=\"record[available.meta.primary_column]\"\n                                                    :id=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                    class=\"peer hidden\"\n                                                    v-model=\"applied.massActions.indices\"\n                                                >\n        \n                                                <span class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-500 peer-checked:text-brandColor\">\n                                                </span>\n                                            </label>\n                                        </p>\n\n                                        <!-- Actions for Mobile -->\n                                        <div\n                                            class=\"flex w-full items-center justify-end\"\n                                            v-if=\"available.actions.length\"\n                                        >\n                                            <span\n                                                class=\"dark:hover:bg-gray-80 cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200\"\n                                                :class=\"action.icon\"\n                                                v-text=\"! action.icon ? action.title : ''\"\n                                                v-for=\"action in record.actions\"\n                                                @click=\"performAction(action)\"\n                                            >\n                                            </span>\n                                        </div>\n                                    </div>\n                                </div>\n\n                                <!-- Card Content -->\n                                <div class=\"grid gap-2\">\n                                    <template v-for=\"column in available.columns\">\n                                        <div class=\"flex flex-wrap items-baseline gap-x-2\">\n                                            <span class=\"text-slate-600 dark:text-gray-300\" v-html=\"column.label + ':'\"></span>\n                                            <span class=\"break-words font-medium text-slate-900 dark:text-white\" v-html=\"record[column.index]\"></span>\n                                        </div>\n                                    </template>\n                                </div>\n                            </div>\n                        </template>\n\n                        <template v-else>\n                            <div class=\"row grid border-b px-4 py-4 text-center text-gray-600 dark:border-gray-800 dark:text-gray-300\">\n                                <p>\n                                    @lang('admin::app.components.datagrid.table.no-records-available')\n                                </p>\n                            </div>\n                        </template>\n                    </template>\n                </slot>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-datagrid-table', {\n            template: '#v-datagrid-table-template',\n\n            props: ['isLoading', 'available', 'applied'],\n            \n            computed: {\n                gridsCount() {\n                    let count = this.available.columns.filter((column) => column.visibility).length;\n\n                    if (this.available.actions.length) {\n                        ++count;\n                    }\n\n                    if (this.available.massActions.length) {\n                        ++count;\n                    }\n\n                    return count;\n                },\n            },\n\n            methods: {\n                /**\n                 * Select all records in the datagrid.\n                 *\n                 * @returns {void}\n                 */\n                selectAll() {\n                    this.$emit('selectAll');\n                },\n\n                /**\n                 * Perform a sorting operation on the specified column.\n                 *\n                 * @param {object} column\n                 * @returns {void}\n                 */\n                sort(column) {\n                    this.$emit('sort', column);\n                },\n\n                /**\n                 * Perform the specified action.\n                 *\n                 * @param {object} action\n                 * @returns {void}\n                 */\n                performAction(action) {\n                    const method = action.method.toLowerCase();\n\n                    switch (method) {\n                        case 'get':\n                            window.location.href = action.url;\n\n                            break;\n\n                        case 'post':\n                        case 'put':\n                        case 'patch':\n                        case 'delete':\n                            this.$emitter.emit('open-confirm-modal', {\n                                agree: () => {\n                                    this.$axios[method](action.url)\n                                        .then(response => {\n                                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                                            this.$emit('actionSuccess', response.data);\n                                        })\n                                        .catch((error) => {\n                                            this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n\n                                            this.$emit('actionError', error.response.data);\n                                        });\n                                }\n                            });\n\n                            break;\n\n                        default:\n                            console.error('Method not supported.');\n\n                            break;\n                    }\n                },\n            },\n        });\n    </script>\n@endpushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/filter.blade.php",
    "content": "<v-datagrid-filter\n    :src=\"src\"\n    :is-loading=\"isLoading\"\n    :available=\"available\"\n    :applied=\"applied\"\n    @applyFilters=\"filter\"\n    @applySavedFilter=\"applySavedFilter\"\n>\n    {{ $slot }}\n</v-datagrid-filter>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-datagrid-filter-template\"\n    >\n        <slot\n            name=\"filter\"\n            :available=\"available\"\n            :applied=\"applied\"\n            :filters=\"filters\"\n            :apply-filters=\"applyFilters\"\n            :apply-column-values=\"applyColumnValues\"\n            :find-applied-column=\"findAppliedColumn\"\n            :has-any-applied-column-values=\"hasAnyAppliedColumnValues\"\n            :get-applied-column-values=\"getAppliedColumnValues\"\n            :remove-applied-column-value=\"removeAppliedColumnValue\"\n            :remove-applied-column-all-values=\"removeAppliedColumnAllValues\"\n        >\n            <template v-if=\"isLoading\">\n                <x-admin::shimmer.datagrid.toolbar.filter />\n            </template>\n\n            <template v-else>\n                <x-admin::drawer\n                    width=\"350px\"\n                    ref=\"filterDrawer\"\n                >\n                    <x-slot:toggle>\n                        <div class=\"relative flex cursor-pointer items-center rounded-md bg-sky-100 px-4 py-[9px] font-semibold text-sky-600 dark:bg-brandColor dark:text-white\">\n                            @lang('admin::app.components.datagrid.toolbar.filter.title')\n\n                            <span\n                                class=\"absolute right-2 top-2 h-1.5 w-1.5 rounded-full bg-sky-600 dark:bg-white\"\n                                v-if=\"hasAnyAppliedColumn()\"\n                            >\n                            </span>\n                        </div>\n                    </x-slot>\n\n                    <x-slot:header class=\"p-3.5\">\n                        <!-- Apply Filter Title -->\n                        <div\n                            v-if=\"! isShowSavedFilters\"\n                            class=\"flex items-center justify-between\"\n                        >\n                            <p class=\"text-xl font-semibold text-gray-800 dark:text-white\">\n                                @lang('admin::app.components.datagrid.filters.title')\n                            </p>\n\n                            <div\n                                v-if=\"hasAnyAppliedColumn() || isFilterDirty\"\n                                class=\"cursor-pointer text-xs font-medium leading-8 text-brandColor hover:underline ltr:ml-11 ltr:mr-11 rtl:mr-11\"\n                                @click=\"removeAllAppliedFilters()\"\n                            >\n                                @lang('admin::app.components.datagrid.filters.custom-filters.clear-all')\n                            </div>\n                        </div>\n\n                        <!-- Save Filter Title -->\n                        <div v-else class=\"flex items-center gap-x-1\">\n                            <i\n                                class=\"icon-left-arrow rtl:icon-right-arrow mt-0.5 cursor-pointer text-[26px] !font-bold hover:rounded-md hover:bg-gray-100 dark:hover:bg-gray-950\"\n                                @click=\"backToFilters\"\n                            >\n                            </i>\n\n                            <p class=\"text-xl font-semibold text-gray-800 dark:text-white\">\n                                @{{ applied.savedFilterId ? '@lang('admin::app.components.datagrid.toolbar.filter.update-filter')' : '@lang('admin::app.components.datagrid.toolbar.filter.save-filter')' }}\n                            </p>\n                        </div>\n                    </x-slot>\n\n                    <x-slot:content class=\"!p-0\">\n                        <template v-if=\"! isShowSavedFilters\">\n                            <!-- Quick Filters Accordion -->\n                            <x-admin::accordion\n                                class=\"select-none rounded-none !border-none !shadow-none\"\n                                v-if=\"savedFilters.available.length > 0\"\n                            >\n                                <x-slot:header class=\"px-4\">\n                                    <p class=\"w-full text-base font-semibold text-gray-800 dark:text-white\">\n                                        @lang('admin::app.components.datagrid.toolbar.filter.quick-filters')\n                                    </p>\n                                </x-slot>\n\n                                <x-slot:content class=\"border-b !p-0 dark:border-gray-800\">\n                                    <div class=\"grid !p-0\">\n                                        <!-- Listing of Quick Filters (Saved Filters) -->\n                                        <div v-for=\"(filter,index) in savedFilters.available\">\n                                            <div\n                                                class=\"flex cursor-pointer items-center justify-between px-4 py-1.5 text-gray-700 hover:bg-gray-50 dark:text-white dark:hover:bg-gray-950\"\n                                                :class=\"{ 'bg-gray-50 dark:bg-gray-950 font-semibold': applied.savedFilterId == filter.id }\"\n                                                @click=\"applySavedFilter(filter)\"\n                                            >\n                                                <span class=\"text-xs font-medium text-gray-800 dark:text-white\">@{{ filter.name }}</span>\n\n                                                <span\n                                                    class=\"icon-cross-large rounded p-1.5 text-lg hover:bg-gray-200 dark:hover:bg-gray-800\"\n                                                    @click.stop=\"deleteSavedFilter(filter)\"\n                                                >\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </x-slot>\n                            </x-admin::accordion>\n\n                            <!-- Filters Accordion -->\n                            <x-admin::accordion class=\"select-none !rounded-none !border-none !shadow-none\">\n                                <x-slot:header class=\"px-4\">\n                                    <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                        @lang('admin::app.components.datagrid.toolbar.filter.custom-filters')\n                                    </p>\n                                </x-slot>\n\n                                <x-slot:content class=\"\">\n                                    <!-- All Filters -->\n                                    <div v-for=\"column in available.columns\">\n                                        <div v-if=\"column.filterable\">\n                                            <!-- Boolean -->\n                                            <div v-if=\"column.type === 'boolean'\">\n                                                <!-- Dropdown -->\n                                                <template v-if=\"column.filterable_type === 'dropdown'\">\n                                                    <div class=\"flex items-center justify-between\">\n                                                        <p\n                                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                                            v-text=\"column.label\"\n                                                        >\n                                                        </p>\n\n                                                        <div\n                                                            class=\"flex items-center gap-x-1.5\"\n                                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                                        >\n                                                            <p\n                                                                class=\"cursor-pointer text-xs font-medium leading-6 text-brandColor\"\n                                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                                            >\n                                                                @lang('admin::app.components.datagrid.filters.custom-filters.clear-all')\n                                                            </p>\n                                                        </div>\n                                                    </div>\n\n                                                    <div class=\"mb-2 mt-1.5\">\n                                                        <x-admin::dropdown>\n                                                            <x-slot:toggle>\n                                                                <button\n                                                                    type=\"button\"\n                                                                    class=\"inline-flex w-full cursor-pointer appearance-none items-center justify-between gap-x-2 rounded-md border bg-white px-2.5 py-1.5 text-center leading-6 text-gray-600 transition-all marker:shadow hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                                                >\n                                                                    <!-- If Allow Multiple Values -->\n                                                                    <span\n                                                                        class=\"text-sm text-gray-400 dark:text-gray-400\"\n                                                                        v-text=\"'@lang('admin::app.components.datagrid.filters.select')'\"\n                                                                        v-if=\"column.allow_multiple_values\"\n                                                                    >\n                                                                    </span>\n\n                                                                    <!-- If Allow Single Value -->\n                                                                    <span\n                                                                        class=\"text-sm text-gray-400 dark:text-gray-400\"\n                                                                        v-text=\"column.filterable_options.find((option => option.value === getAppliedColumnValues(column.index)))?.label ?? '@lang('admin::app.components.datagrid.filters.select')'\"\n                                                                        v-else\n                                                                    >\n                                                                    </span>\n\n                                                                    <span class=\"icon-down-arrow text-2xl\"></span>\n                                                                </button>\n                                                            </x-slot>\n\n                                                            <x-slot:menu>\n                                                                <x-admin::dropdown.menu.item\n                                                                    v-for=\"option in column.filterable_options\"\n                                                                    v-text=\"option.label\"\n                                                                    @click=\"addFilter(option.value, column)\"\n                                                                >\n                                                                </x-admin::dropdown.menu.item>\n                                                            </x-slot>\n                                                        </x-admin::dropdown>\n                                                    </div>\n\n                                                    <div class=\"mb-4 flex flex-wrap gap-2\">\n                                                        <!-- If Allow Multiple Values -->\n                                                        <template v-if=\"column.allow_multiple_values\">\n                                                            <p\n                                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                                v-for=\"appliedColumnValue in getAppliedColumnValues(column.index)\"\n                                                            >\n                                                                <!-- Retrieving the label from the options based on the applied column value. -->\n                                                                <span v-text=\"column.filterable_options.find((option => option.value == appliedColumnValue)).label\"></span>\n\n                                                                <span\n                                                                    class=\"icon-cross-large-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                                    @click=\"removeAppliedColumnValue(column.index, appliedColumnValue)\"\n                                                                >\n                                                                </span>\n                                                            </p>\n                                                        </template>\n                                                    </div>\n                                                </template>\n\n                                                <!-- Basic (If Needed) -->\n                                                <template v-else></template>\n                                            </div>\n\n                                            <!-- Date -->\n                                            <div v-else-if=\"column.type === 'date'\">\n                                                <!-- Range -->\n                                                <template v-if=\"column.filterable_type === 'date_range'\">\n                                                    <div class=\"flex items-center justify-between\">\n                                                        <p\n                                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                                            v-text=\"column.label\"\n                                                        >\n                                                        </p>\n\n                                                        <div\n                                                            class=\"flex items-center gap-x-1.5\"\n                                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                                        >\n                                                            <p\n                                                                class=\"cursor-pointer text-xs font-medium leading-6 text-brandColor\"\n                                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                                            >\n                                                                @lang('admin::app.components.datagrid.filters.custom-filters.clear-all')\n                                                            </p>\n                                                        </div>\n                                                    </div>\n\n                                                    <div class=\"mt-1.5 grid grid-cols-2 gap-1.5\">\n                                                        <p\n                                                            class=\"cursor-pointer rounded-md border px-3 py-2 text-center text-sm font-medium leading-6 text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:text-gray-300 dark:hover:border-gray-400\"\n                                                            v-for=\"option in column.filterable_options\"\n                                                            v-text=\"option.label\"\n                                                            @click=\"addFilter(\n                                                                $event,\n                                                                column,\n                                                                { quickFilter: { isActive: true, selectedFilter: option } }\n                                                            )\"\n                                                        >\n                                                        </p>\n\n                                                        <x-admin::flat-picker.date ::allow-input=\"false\">\n                                                            <input\n                                                                type=\"date\"\n                                                                :name=\"`${column.index}[from]`\"\n                                                                value=\"\"\n                                                                class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 ltr:pr-8 rtl:pl-8\"\n                                                                :placeholder=\"column.label\"\n                                                                :ref=\"`${column.index}[from]`\"\n                                                                @change=\"addFilter(\n                                                                    $event,\n                                                                    column,\n                                                                    { range: { name: 'from' }, quickFilter: { isActive: false } }\n                                                                )\"\n                                                            />\n                                                        </x-admin::flat-picker.date>\n\n                                                        <x-admin::flat-picker.date ::allow-input=\"false\">\n                                                            <input\n                                                                type=\"date\"\n                                                                :name=\"`${column.index}[to]`\"\n                                                                value=\"\"\n                                                                class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 ltr:pr-8 rtl:pl-8\"\n                                                                :placeholder=\"column.label\"\n                                                                :ref=\"`${column.index}[from]`\"\n                                                                @change=\"addFilter(\n                                                                    $event,\n                                                                    column,\n                                                                    { range: { name: 'to' }, quickFilter: { isActive: false } }\n                                                                )\"\n                                                            />\n                                                        </x-admin::flat-picker.date>\n\n                                                        <div class=\"mb-4 flex flex-wrap gap-2\">\n                                                            <p\n                                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                                v-if=\"findAppliedColumn(column.index)\"\n                                                            >\n                                                                <span>\n                                                                    @{{ getFormattedDates(findAppliedColumn(column.index)) }}\n                                                                </span>\n\n                                                                <span\n                                                                    class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                                    @click=\"removeAppliedColumnValue(column.index)\"\n                                                                >\n                                                                </span>\n                                                            </p>\n                                                        </div>\n                                                    </div>\n                                                </template>\n\n                                                <!-- Basic -->\n                                                <template v-else>\n                                                    <div class=\"flex items-center justify-between\">\n                                                        <p\n                                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                                            v-text=\"column.label\"\n                                                        >\n                                                        </p>\n\n                                                        <div\n                                                            class=\"flex items-center gap-x-1.5\"\n                                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                                        >\n                                                            <p\n                                                                class=\"cursor-pointer text-xs font-medium leading-6 text-brandColor\"\n                                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                                            >\n                                                                @lang('admin::app.components.datagrid.filters.custom-filters.clear-all')\n                                                            </p>\n                                                        </div>\n                                                    </div>\n\n                                                    <div class=\"mt-1.5 grid gap-1.5\">\n                                                        <x-admin::flat-picker.date ::allow-input=\"false\">\n                                                            <input\n                                                                type=\"date\"\n                                                                :name=\"column.index\"\n                                                                value=\"\"\n                                                                class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                                                :placeholder=\"column.label\"\n                                                                :ref=\"column.index\"\n                                                                @change=\"addFilter($event, column)\"\n                                                            />\n                                                        </x-admin::flat-picker.date>\n\n                                                        <div class=\"mb-4 flex flex-wrap gap-2\">\n                                                            <p\n                                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                                v-if=\"findAppliedColumn(column.index)\"\n                                                            >\n                                                                <span>\n                                                                    @{{ getFormattedDates(findAppliedColumn(column.index)) }}\n                                                                </span>\n\n                                                                <span\n                                                                    class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                                    @click=\"removeAppliedColumnValue(column.index)\"\n                                                                >\n                                                                </span>\n                                                            </p>\n                                                        </div>\n                                                    </div>\n                                                </template>\n                                            </div>\n\n                                            <!-- Date Time -->\n                                            <div v-else-if=\"column.type === 'datetime'\">\n                                                <!-- Range -->\n                                                <template v-if=\"column.filterable_type === 'datetime_range'\">\n                                                    <div class=\"flex items-center justify-between\">\n                                                        <p\n                                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                                            v-text=\"column.label\"\n                                                        >\n                                                        </p>\n\n                                                        <div\n                                                            class=\"flex items-center gap-x-1.5\"\n                                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                                        >\n                                                            <p\n                                                                class=\"cursor-pointer text-xs font-medium leading-6 text-brandColor\"\n                                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                                            >\n                                                                @lang('admin::app.components.datagrid.filters.custom-filters.clear-all')\n                                                            </p>\n                                                        </div>\n                                                    </div>\n\n                                                    <div class=\"my-4 grid grid-cols-2 gap-1.5\">\n                                                        <p\n                                                            class=\"cursor-pointer rounded-md border px-3 py-2 text-center text-sm font-medium leading-6 text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:text-gray-300 dark:hover:border-gray-400\"\n                                                            v-for=\"option in column.filterable_options\"\n                                                            v-text=\"option.label\"\n                                                            @click=\"addFilter(\n                                                                $event,\n                                                                column,\n                                                                { quickFilter: { isActive: true, selectedFilter: option } }\n                                                            )\"\n                                                        >\n                                                        </p>\n\n                                                        <x-admin::flat-picker.datetime ::allow-input=\"false\">\n                                                            <input\n                                                                type=\"datetime-local\"\n                                                                :name=\"`${column.index}[from]`\"\n                                                                value=\"\"\n                                                                class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                                                :placeholder=\"column.label\"\n                                                                :ref=\"`${column.index}[from]`\"\n                                                                @change=\"addFilter(\n                                                                    $event,\n                                                                    column,\n                                                                    { range: { name: 'from' }, quickFilter: { isActive: false } }\n                                                                )\"\n                                                            />\n                                                        </x-admin::flat-picker.datetime>\n\n                                                        <x-admin::flat-picker.datetime ::allow-input=\"false\">\n                                                            <input\n                                                                type=\"datetime-local\"\n                                                                :name=\"`${column.index}[to]`\"\n                                                                value=\"\"\n                                                                class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                                                :placeholder=\"column.label\"\n                                                                :ref=\"`${column.index}[from]`\"\n                                                                @change=\"addFilter(\n                                                                    $event,\n                                                                    column,\n                                                                    { range: { name: 'to' }, quickFilter: { isActive: false } }\n                                                                )\"\n                                                            />\n                                                        </x-admin::flat-picker.datetime>\n\n                                                        <div class=\"mb-4 flex flex-wrap gap-2\">\n                                                            <p\n                                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                                v-if=\"findAppliedColumn(column.index)\"\n                                                            >\n                                                                <span>\n                                                                    @{{ getFormattedDates(findAppliedColumn(column.index)) }}\n                                                                </span>\n\n                                                                <span\n                                                                    class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                                    @click=\"removeAppliedColumnValue(column.index)\"\n                                                                >\n                                                                </span>\n                                                            </p>\n                                                        </div>\n                                                    </div>\n                                                </template>\n\n                                                <!-- Basic -->\n                                                <template v-else>\n                                                    <div class=\"flex items-center justify-between\">\n                                                        <p\n                                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                                            v-text=\"column.label\"\n                                                        >\n                                                        </p>\n\n                                                        <div\n                                                            class=\"flex items-center gap-x-1.5\"\n                                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                                        >\n                                                            <p\n                                                                class=\"cursor-pointer text-xs font-medium leading-6 text-brandColor\"\n                                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                                            >\n                                                                @lang('admin::app.components.datagrid.filters.custom-filters.clear-all')\n                                                            </p>\n                                                        </div>\n                                                    </div>\n\n                                                    <div class=\"my-4 grid\">\n                                                        <x-admin::flat-picker.datetime ::allow-input=\"false\">\n                                                            <input\n                                                                type=\"datetime-local\"\n                                                                :name=\"column.index\"\n                                                                value=\"\"\n                                                                class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                                                :placeholder=\"column.label\"\n                                                                :ref=\"column.index\"\n                                                                @change=\"addFilter($event, column)\"\n                                                            />\n                                                        </x-admin::flat-picker.datetime>\n\n                                                        <div class=\"mb-4 flex flex-wrap gap-2\">\n                                                            <p\n                                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                                v-if=\"findAppliedColumn(column.index)\"\n                                                            >\n                                                                <span>\n                                                                    @{{ getFormattedDates(findAppliedColumn(column.index)) }}\n                                                                </span>\n\n                                                                <span\n                                                                    class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                                    @click=\"removeAppliedColumnValue(column.index)\"\n                                                                >\n                                                                </span>\n                                                            </p>\n                                                        </div>\n                                                    </div>\n                                                </template>\n                                            </div>\n\n                                            <!-- Rest -->\n                                            <div v-else>\n                                                <!-- Dropdown -->\n                                                <template v-if=\"column.filterable_type === 'dropdown'\">\n                                                    <div class=\"flex items-center justify-between\">\n                                                        <p\n                                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                                            v-text=\"column.label\"\n                                                        >\n                                                        </p>\n\n                                                        <div\n                                                            class=\"flex items-center gap-x-1.5\"\n                                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                                        >\n                                                            <p\n                                                                class=\"cursor-pointer text-xs font-medium leading-6 text-brandColor\"\n                                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                                            >\n                                                                @lang('admin::app.components.datagrid.filters.custom-filters.clear-all')\n                                                            </p>\n                                                        </div>\n                                                    </div>\n\n                                                    <div class=\"mb-2 mt-1.5\">\n                                                        <x-admin::dropdown>\n                                                            <x-slot:toggle>\n                                                                <button\n                                                                    type=\"button\"\n                                                                    class=\"inline-flex w-full cursor-pointer appearance-none items-center justify-between gap-x-2 rounded-md border bg-white px-2.5 py-1.5 text-center leading-6 text-gray-600 transition-all marker:shadow hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                                                >\n                                                                    <!-- If Allow Multiple Values -->\n                                                                    <span\n                                                                        class=\"text-sm text-gray-400 dark:text-gray-400\"\n                                                                        v-text=\"'@lang('admin::app.components.datagrid.filters.select')'\"\n                                                                        v-if=\"column.allow_multiple_values\"\n                                                                    >\n                                                                    </span>\n\n                                                                    <!-- If Allow Single Value -->\n                                                                    <span\n                                                                        class=\"text-sm text-gray-400 dark:text-gray-400\"\n                                                                        v-text=\"column.filterable_options.find((option => option.value === getAppliedColumnValues(column.index)))?.label ?? '@lang('admin::app.components.datagrid.filters.select')'\"\n                                                                        v-else\n                                                                    >\n                                                                    </span>\n\n                                                                    <span class=\"icon-down-arrow text-2xl\"></span>\n                                                                </button>\n                                                            </x-slot>\n\n                                                            <x-slot:menu>\n                                                                <x-admin::dropdown.menu.item\n                                                                    v-for=\"option in column.filterable_options\"\n                                                                    v-text=\"option.label\"\n                                                                    @click=\"addFilter(option.value, column)\"\n                                                                >\n                                                                </x-admin::dropdown.menu.item>\n                                                            </x-slot>\n                                                        </x-admin::dropdown>\n                                                    </div>\n\n                                                    <div class=\"mb-4 flex flex-wrap gap-2\">\n                                                        <!-- If Allow Multiple Values -->\n                                                        <template v-if=\"column.allow_multiple_values\">\n                                                            <p\n                                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                                v-for=\"appliedColumnValue in getAppliedColumnValues(column.index)\"\n                                                            >\n                                                                <!-- Retrieving the label from the options based on the applied column value. -->\n                                                                <span v-text=\"column.filterable_options.find((option => option.value == appliedColumnValue)).label\"></span>\n\n                                                                <span\n                                                                    class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                                    @click=\"removeAppliedColumnValue(column.index, appliedColumnValue)\"\n                                                                >\n                                                                </span>\n                                                            </p>\n                                                        </template>\n                                                    </div>\n                                                </template>\n\n                                                <template v-else-if=\"column.filterable_type === 'searchable_dropdown'\">\n                                                    <div class=\"flex items-center justify-between\">\n                                                        <p\n                                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                                            v-text=\"column.label\"\n                                                        >\n                                                        </p>\n                                    \n                                                        <div\n                                                            class=\"flex items-center gap-x-1.5\"\n                                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                                        >\n                                                            <p\n                                                                class=\"cursor-pointer text-xs font-medium leading-6 text-blue-600\"\n                                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                                            >\n                                                                @lang('admin::app.components.datagrid.filters.custom-filters.clear-all')\n                                                            </p>\n                                                        </div>\n                                                    </div>\n                                    \n                                                    <div class=\"mb-2 mt-1.5\">\n                                                        <v-datagrid-searchable-dropdown\n                                                            :datagrid-id=\"available.id\"\n                                                            :column=\"column\"\n                                                            @select-option=\"addFilter($event.target.value, column)\"\n                                                        >\n                                                        </v-datagrid-searchable-dropdown>\n                                                    </div>\n                                    \n                                                    <div class=\"mb-4 flex flex-wrap gap-2\">\n                                                        <p\n                                                            class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                            v-for=\"appliedColumnValue in getAppliedColumnValues(column.index)\"\n                                                        >\n                                                            <span v-text=\"appliedColumnValue\"></span>\n                                    \n                                                            <span\n                                                                class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                                @click=\"removeAppliedColumnValue(column.index, appliedColumnValue)\"\n                                                            >\n                                                            </span>\n                                                        </p>\n                                                    </div>\n                                                </template>\n\n                                                <!-- Basic -->\n                                                <template v-else>\n                                                    <div class=\"flex items-center justify-between\">\n                                                        <p\n                                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                                            v-text=\"column.label\"\n                                                        >\n                                                        </p>\n\n                                                        <div\n                                                            class=\"flex items-center gap-x-1.5\"\n                                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                                        >\n                                                            <p\n                                                                class=\"cursor-pointer text-xs font-medium leading-6 text-brandColor\"\n                                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                                            >\n                                                                @lang('admin::app.components.datagrid.filters.custom-filters.clear-all')\n                                                            </p>\n                                                        </div>\n                                                    </div>\n\n                                                    <div class=\"mb-2 mt-1.5 grid gap-1.5\">\n                                                        <input\n                                                            type=\"text\"\n                                                            class=\"block w-full rounded-md border bg-white px-2 py-1.5 text-sm leading-6 text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                                            :name=\"column.index\"\n                                                            :placeholder=\"column.label\"\n                                                            @change=\"addFilter($event, column)\"\n                                                        />\n                                                    </div>\n\n                                                    <div class=\"mb-4 flex flex-wrap gap-2\">\n                                                        <!-- If Allow Multiple Values -->\n                                                        <template v-if=\"column.allow_multiple_values\">\n                                                            <p\n                                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                                v-for=\"appliedColumnValue in getAppliedColumnValues(column.index)\"\n                                                            >\n                                                                <span v-text=\"appliedColumnValue\"></span>\n\n                                                                <span\n                                                                    class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                                    @click=\"removeAppliedColumnValue(column.index, appliedColumnValue)\"\n                                                                >\n                                                                </span>\n                                                            </p>\n                                                        </template>\n\n                                                        <!-- If Allow Single Value -->\n                                                        <template v-else>\n                                                            <p\n                                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                                v-if=\"getAppliedColumnValues(column.index) !== ''\"\n                                                            >\n                                                                <span v-text=\"getAppliedColumnValues(column.index)\"></span>\n\n                                                                <span\n                                                                    class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                                    @click=\"removeAppliedColumnValue(column.index, getAppliedColumnValues(column.index))\"\n                                                                >\n                                                                </span>\n                                                            </p>\n                                                        </template>\n                                                    </div>\n                                                </template>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </x-slot>\n                            </x-admin::accordion>\n                        </template>\n\n                        <!-- Save Filter Section -->\n                        <template v-else>\n                            <div class=\"flex items-center justify-between px-4 py-4\">\n                                <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                    @{{ applied.savedFilterId ? '@lang('admin::app.components.datagrid.toolbar.filter.update-filter')' : '@lang('admin::app.components.datagrid.toolbar.filter.create-new-filter')' }}\n                                </p>\n                            </div>\n\n                            <div v-if=\"hasAnyColumn\">\n                                <!-- Save Filter Form -->\n                                <x-admin::form\n                                    v-slot=\"{ meta, errors, handleSubmit }\"\n                                    as=\"div\"\n                                >\n                                    <form @submit=\"handleSubmit($event, createOrUpdateFilter)\">\n                                        <div class=\"flex flex-col gap-4\">\n                                            <!-- Save Filter Name Input Field -->\n                                            <div class=\"flex flex-col gap-2 border-b px-4 dark:border-gray-800\">\n                                                <x-admin::form.control-group>\n                                                    <x-admin::form.control-group.label class=\"required\">\n                                                        @lang('admin::app.components.datagrid.toolbar.filter.name')\n                                                    </x-admin::form.control-group.label>\n\n                                                    <x-admin::form.control-group.control\n                                                        type=\"hidden\"\n                                                        name=\"id\"\n                                                        ::value=\"applied.savedFilterId\"\n                                                    />\n\n                                                    <x-admin::form.control-group.control\n                                                        type=\"text\"\n                                                        name=\"name\"\n                                                        id=\"name\"\n                                                        ::value=\"getAppliedSavedFilter?.name\"\n                                                        rules=\"required\"\n                                                        :label=\"trans('admin::app.components.datagrid.toolbar.filter.name')\"\n                                                        :placeholder=\"trans('admin::app.components.datagrid.toolbar.filter.name')\"\n                                                    />\n\n                                                    <x-admin::form.control-group.error control-name=\"name\" />\n\n                                                    <button\n                                                        type=\"submit\"\n                                                        class=\"hidden\"\n                                                        :disabled=\"savedFilters.params.filters.columns.every(column => column.value.length === 0)\"\n                                                        id=\"save-filter\"\n                                                    ></button>\n                                                </x-admin::form.control-group>\n                                            </div>\n\n                                            <div class=\"flex flex-col gap-4 px-4\">\n                                                <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                                    @lang('admin::app.components.datagrid.toolbar.filter.selected-filters')\n                                                </p>\n\n                                                <div v-if=\"! savedFilters.params.filters.columns.every(column => column.value.length === 0)\">\n                                                    <!-- Applied filters label and value listing for saving custom filter. -->\n                                                    <div v-for=\"column in savedFilters.params.filters.columns\">\n                                                        <div\n                                                            class=\"flex flex-col gap-2\"\n                                                            v-if=\"hasAnyValue(column)\"\n                                                        >\n                                                            <p class=\"text-xs font-medium text-gray-800 dark:text-white\">\n                                                                @{{ column.label }}\n                                                            </p>\n\n                                                            <div class=\"mb-4 flex flex-wrap gap-2\">\n                                                                <!-- Date & Date Time Case -->\n                                                                <template v-if=\"column.type === 'date' || column.type === 'datetime'\">\n                                                                    <p class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\">\n                                                                        <span>\n                                                                            @{{ getFormattedDates(column) }}\n                                                                        </span>\n\n                                                                        <span\n                                                                            class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                                            @click=\"removeSavedFilterColumnValue(column, appliedColumnValue)\"\n                                                                        >\n                                                                        </span>\n                                                                    </p>\n                                                                </template>\n\n                                                                <!-- Rest Case -->\n                                                                <template v-else>\n                                                                    <!-- If Allow Multiple Values -->\n                                                                    <template v-if=\"column.allow_multiple_values\">\n                                                                        <p\n                                                                            v-for=\"appliedColumnValue in column.value\"\n                                                                            class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                                        >\n                                                                            <span>\n                                                                                @{{ appliedColumnValue }}\n                                                                            </span>\n\n                                                                            <span\n                                                                                class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                                                @click=\"removeSavedFilterColumnValue(column, appliedColumnValue)\"\n                                                                            >\n                                                                            </span>\n                                                                        </p>\n                                                                    </template>\n\n                                                                    <!-- If Allow Single Value -->\n                                                                    <template v-else>\n                                                                        <p class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\">\n                                                                            <span>\n                                                                                @{{ column.value }}\n                                                                            </span>\n\n                                                                            <span\n                                                                                class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                                                @click=\"removeSavedFilterColumnValue(column, column.value)\"\n                                                                            >\n                                                                            </span>\n                                                                        </p>\n                                                                    </template>\n                                                                </template>\n                                                            </div>\n                                                        </div>\n                                                    </div>\n                                                </div>\n\n                                                <!-- Save Filter Empty Value Placeholder -->\n                                                <div v-else>\n                                                    <div class=\"mb-4 flex content-end items-center justify-end\">\n                                                        <div class=\"grid\">\n                                                            <div class=\"flex items-center gap-5 py-2.5\">\n                                                                <img\n                                                                    src=\"{{ vite()->asset('images/empty-placeholders/products.svg') }}\"\n                                                                    class=\"h-20 w-20 dark:border-gray-800 dark:mix-blend-exclusion dark:invert\"\n                                                                >\n\n                                                                <div class=\"flex flex-col gap-1.5\">\n                                                                    <p class=\"text-base font-semibold text-gray-400\">\n                                                                        @lang('admin::app.components.datagrid.toolbar.filter.empty-title')\n                                                                    </p>\n\n                                                                    <p class=\"text-gray-400\">\n                                                                        @lang('admin::app.components.datagrid.toolbar.filter.empty-description')\n                                                                    </p>\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                    </div>\n                                                </div>\n                                            </div>\n                                        </div>\n                                    </form>\n                                </x-admin::form>\n                            </div>\n                        </template>\n                    </x-slot>\n\n                    <x-slot:footer class=\"!pb-3\">\n                        <!-- Buttons Panel -->\n                        <div\n                            class=\"flex justify-end gap-2 px-2 pt-3\"\n                            v-if=\"! isShowSavedFilters\"\n                        >\n                            <!-- Save Filter Button -->\n                            <button\n                                type=\"button\"\n                                v-if=\"hasAnyColumn\"\n                                @click=\"isShowSavedFilters = ! isShowSavedFilters\"\n                                class=\"text-gray-900 dark:text-white\"\n                                :disabled=\"isFilterDirty || ! filters.columns.length > 0\"\n                            >\n                                @{{ applied.savedFilterId ? '@lang('admin::app.components.datagrid.toolbar.filter.update-filter')' : '@lang('admin::app.components.datagrid.toolbar.filter.save-filter')' }}\n                            </button>\n                            \n                            <!-- Apply Filter Button -->\n                            <button\n                                type=\"button\"\n                                class=\"primary-button\"\n                                @click=\"applyFilters\"\n                                :disabled=\"! isFilterDirty\"\n                            >\n                                @lang('admin::app.components.datagrid.toolbar.filter.apply-filters-btn')\n                            </button>\n                        </div>\n\n                        <!-- Save Filter Form Submit Button -->\n                        <div\n                            v-else\n                            class=\"flex justify-end gap-1 px-2 pt-3\"\n                        >\n                            <button\n                                type=\"button\"\n                                class=\"primary-button\"\n                                aria-label=\"@lang('admin::app.components.datagrid.toolbar.filter.save-btn')\"\n                                :disabled=\"savedFilters.params.filters.columns.every(column => column.value.length === 0)\"\n                                @click=\"handleSaveFilterForm\"\n                            >\n                                @{{ applied.savedFilterId ? '@lang('admin::app.components.datagrid.toolbar.filter.update-filter')' : '@lang('admin::app.components.datagrid.toolbar.filter.save-filter')' }}\n                            </button>\n                        </div>\n                    </x-slot>\n                </x-admin::drawer>\n            </template>\n        </slot>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-datagrid-filter', {\n            template: '#v-datagrid-filter-template',\n\n            props: ['isLoading', 'available', 'applied', 'src'],\n\n            emits: ['applyFilters', 'applySavedFilter'],\n\n            data() {\n                return {\n                    savedFilters: {\n                        available: [],\n\n                        applied: null,\n\n                        params: {\n                            filters: {\n                                columns: [],\n                            },\n                        },\n                    },\n\n                    filters: {\n                        columns: [],\n                    },\n\n                    isShowSavedFilters: false,\n\n                    isFilterDirty: false,\n                };\n            },\n\n            mounted() {\n                this.filters.columns = this.getAppliedColumns();\n\n                this.savedFilters.params.filters.columns = JSON.parse(JSON.stringify(this.filters.columns));\n\n                this.getSavedFilters();\n            },\n\n            computed: {\n                getAppliedSavedFilter() {\n                    return this.savedFilters.available.find((filter) => filter.id == this.applied.savedFilterId);\n                },\n            },\n\n            methods: {\n                /**\n                 * Has any column.\n                 *\n                 * @returns {boolean}\n                 */\n                hasAnyColumn() {\n                    return filters.columns.length;\n                },\n\n                /**\n                 * Get applied columns.\n                 *\n                 * @returns {object}\n                 */\n                getAppliedColumns() {\n                    return this.applied.filters.columns.filter((column) => column.index !== 'all');\n                },\n\n                /**\n                 * Has any applied column.\n                 *\n                 * @returns {boolean}\n                 */\n                hasAnyAppliedColumn() {\n                    return this.getAppliedColumns().length > 0;\n                },\n\n                /**\n                 * Go back to filters.\n                 *\n                 * @returns {void}\n                 */\n                backToFilters() {\n                    this.savedFilters.params.filters.columns = JSON.parse(JSON.stringify(this.filters.columns));\n\n                    this.isShowSavedFilters = ! this.isShowSavedFilters;\n                },\n\n                /**\n                 * Applies the saved filter.\n                 *\n                 * @param {Object} filter - The filter to be applied.\n                 */\n                applySavedFilter(filter) {\n                    this.$emit('applySavedFilter', filter);\n                },\n\n                /**\n                 * Remove all applied filters.\n                 *\n                 * @returns {void}\n                 */\n                removeAllAppliedFilters() {\n                    this.filters = {\n                        columns: [],\n                    };\n\n                    this.isFilterDirty = true;\n                },\n\n                /**\n                 * Remove filter option from save filters screen.\n                 *\n                 * @returns {void}\n                 */\n                removeSavedFilterColumnValue(column, value) {\n                    if (column.allow_multiple_values) {\n                        column.value = column.value.filter((columnValue) => columnValue !== value);\n                    } else {\n                        column.value = '';\n                    }\n                },\n\n                handleSaveFilterForm() {\n                    const saveFilterForm = document.getElementById('save-filter');\n\n                    if (saveFilterForm) {\n                        saveFilterForm.click();\n                    }\n                },\n\n                /**\n                 * Save filters to the database.\n                 *\n                 * @returns {void}\n                 */\n                createOrUpdateFilter(params, { setErrors }) {\n                    let applied = JSON.parse(JSON.stringify(this.applied));\n\n                    applied.filters.columns = this.savedFilters.params.filters.columns.filter((column) => this.hasAnyValue(column));\n\n                    if (params.id) {\n                        params._method = 'PUT';\n                    }\n\n                    this.$axios.post(params.id ? \"{{ route('admin.datagrid.saved_filters.update', ':id') }}\".replace(':id', params.id) : \"{{ route('admin.datagrid.saved_filters.store') }}\", {\n                        src: this.src,\n                        applied,\n                        ...params,\n                    })\n                        .then(response => {\n                            if (! params.id) {\n                                this.savedFilters.available.push(response.data.data);\n                            } else {\n                                this.savedFilters.available = this.savedFilters.available.map((filter) => {\n                                    if (filter.id == response.data.data.id) {\n                                        return response.data.data;\n                                    }\n\n                                    return filter;\n                                });\n                            }\n\n                            this.savedFilters.name = '';\n\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                            this.isShowSavedFilters = false;\n                        })\n                        .catch(error => {\n                            if (error.response.status == 422) {\n                                setErrors(error.response.data.errors);\n                            } else {\n                                this.$emitter.emit('add-flash', { type: 'error',  message: response.data.message });\n                            }\n                        });\n                },\n\n                /**\n                 * Retrieves the saved filters.\n                 *\n                 * @returns {void}\n                 */\n                getSavedFilters() {\n                    this.$axios\n                        .get(`{{ route('admin.datagrid.saved_filters.index') }}`, {\n                            params: { src: this.src }\n                        })\n                        .then(response => {\n                            this.savedFilters.available = response.data.data ?? [];\n                        })\n                        .catch(error => {});\n                },\n\n                /**\n                 * Delete the saved filter.\n                 *\n                 * @returns {void}\n                 */\n                deleteSavedFilter(filter) {\n                    this.$emitter.emit('open-confirm-modal', {\n                        agree: () => {\n                            this.$axios.delete(\"{{ route('admin.datagrid.saved_filters.destroy', ':id') }}\".replace(':id', filter.id))\n                                .then(response => {\n                                    this.applySavedFilter(null);\n\n                                    this.savedFilters.available = this.savedFilters.available.filter((savedFilter) => savedFilter.id !== filter.id);\n\n                                    this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                                })\n                                .catch(error => {\n                                    this.$emitter.emit('add-flash', { type: 'error', message: response.data.message });\n                                });\n                        }\n                    });\n                },\n\n                /**\n                 * Apply all added filters.\n                 *\n                 * @returns {void}\n                 */\n                applyFilters() {\n                    this.$emit('applyFilters', this.filters);\n\n                    this.$refs.filterDrawer.close();\n                },\n\n                /**\n                 * Add filter.\n                 *\n                 * @param {Event} $event\n                 * @param {object} column\n                 * @param {object} additional\n                 * @returns {void}\n                 */\n                addFilter($event, column = null, additional = {}) {\n                    let quickFilter = additional?.quickFilter;\n\n                    if (quickFilter?.isActive) {\n                        let options = quickFilter.selectedFilter;\n\n                        switch (column.type) {\n                            case 'date':\n                            case 'datetime':\n                                this.applyColumnValues(column, options.name);\n\n                                break;\n\n                            default:\n                                break;\n                        }\n                    } else {\n                        /**\n                         * Here, either a real event will come or a string value. If a string value is present, then\n                         * we create a similar event-like structure to avoid any breakage and make it easy to use.\n                         */\n                        if ($event?.target?.value === undefined) {\n                            $event = {\n                                target: {\n                                    value: $event,\n                                }\n                            };\n                        }\n\n                        this.applyColumnValues(column, $event.target.value, additional);\n\n                        if (column) {\n                            $event.target.value = '';\n                        }\n                    }\n                },\n\n                /**\n                 * Apply column values.\n                 *\n                 * @param {object} column\n                 * @param {string} requestedValue\n                 * @param {object} additional\n                 * @returns {void}\n                 */\n                applyColumnValues(column, requestedValue, additional = {}) {\n                    let appliedColumn = this.findAppliedColumn(column?.index);\n\n                    if (\n                        requestedValue === undefined ||\n                        requestedValue === '' ||\n                        (appliedColumn?.allow_multiple_values && appliedColumn?.value.includes(requestedValue)) ||\n                        (! appliedColumn?.allow_multiple_values && appliedColumn?.value === requestedValue)\n                    ) {\n                        return;\n                    }\n\n                    switch (column.type) {\n                        case 'date':\n                        case 'datetime':\n                            let { range } = additional;\n\n                            if (appliedColumn) {\n                                if (range) {\n                                    let appliedRanges = ['', ''];\n\n                                    if (typeof appliedColumn.value !== 'string') {\n                                        appliedRanges = appliedColumn.value[0];\n                                    }\n\n                                    if (range.name == 'from') {\n                                        appliedRanges[0] = requestedValue;\n                                    }\n\n                                    if (range.name == 'to') {\n                                        appliedRanges[1] = requestedValue;\n                                    }\n\n                                    appliedColumn.value = [appliedRanges];\n                                } else {\n                                    appliedColumn.value = requestedValue;\n                                }\n                            } else {\n                                if (range) {\n                                    let appliedRanges = ['', ''];\n\n                                    if (range.name == 'from') {\n                                        appliedRanges[0] = requestedValue;\n                                    }\n\n                                    if (range.name == 'to') {\n                                        appliedRanges[1] = requestedValue;\n                                    }\n\n                                    this.filters.columns.push({\n                                        index: column.index,\n                                        label: column.label,\n                                        type: column.type,\n                                        value: [appliedRanges]\n                                    });\n                                } else {\n                                    this.filters.columns.push({\n                                        index: column.index,\n                                        label: column.label,\n                                        type: column.type,\n                                        value: requestedValue\n                                    });\n                                }\n                            }\n\n                            break;\n\n                        default:\n                            if (appliedColumn) {\n                                if (appliedColumn.allow_multiple_values) {\n                                    appliedColumn.value.push(requestedValue);\n                                } else {\n                                    appliedColumn.value = requestedValue;\n                                }\n                            } else {\n                                this.filters.columns.push({\n                                    index: column.index,\n                                    label: column.label,\n                                    type: column.type,\n                                    value: column.allow_multiple_values ? [requestedValue] : requestedValue,\n                                    allow_multiple_values: column.allow_multiple_values,\n                                });\n                            }\n\n                            break;\n                    }\n\n                    this.isFilterDirty = true;\n                },\n\n                /**\n                 * Get formatted dates.\n                 *\n                 * @param {object} appliedColumn\n                 * @returns {string}\n                 */\n                getFormattedDates(appliedColumn)\n                {\n                    if (! appliedColumn) {\n                        return '';\n                    }\n\n                    if (typeof appliedColumn.value === 'string') {\n                        const availableColumn = this.available.columns.find(column => column.index === appliedColumn.index);\n\n                        if (availableColumn.filterable_type === 'date_range' || availableColumn.filterable_type === 'datetime_range') {\n                            const option = availableColumn.filterable_options.find(option => option.name === appliedColumn.value);\n\n                            return option.label;\n                        }\n\n                        return appliedColumn.value;\n                    }\n\n                    if (! appliedColumn.value.length) {\n                        return '';\n                    }\n\n                    return appliedColumn.value[0].join(' to ');\n                },\n\n                /**\n                 * Check if any values are applied for the specified column.\n                 *\n                 * @param {object} column\n                 * @returns {boolean}\n                 */\n                hasAnyValue(column) {\n                    if (column.allow_multiple_values) {\n                        return column.value.length > 0;\n                    }\n\n                    return column.value !== '';\n                },\n\n                /**\n                 * Find applied column.\n                 *\n                 * @param {string} columnIndex\n                 * @returns {object}\n                 */\n                findAppliedColumn(columnIndex) {\n                    return this.filters.columns.find(column => column.index === columnIndex);\n                },\n\n                /**\n                 * Check if any values are applied for the specified column.\n                 *\n                 * @param {string} columnIndex\n                 * @returns {boolean}\n                 */\n                hasAnyAppliedColumnValues(columnIndex) {\n                    let appliedColumn = this.findAppliedColumn(columnIndex);\n\n                    if (! appliedColumn) {\n                        return false;\n                    }\n\n                    return this.hasAnyValue(appliedColumn);\n                },\n\n                /**\n                 * Get applied values for the specified column.\n                 *\n                 * @param {string} columnIndex\n                 * @returns {Array}\n                 */\n                getAppliedColumnValues(columnIndex) {\n                    const appliedColumn = this.findAppliedColumn(columnIndex);\n\n                    if (appliedColumn?.allow_multiple_values) {\n                        return appliedColumn?.value ?? [];\n                    }\n\n                    return appliedColumn?.value ?? '';\n                },\n\n                /**\n                 * Remove a specific value from the applied values of the specified column.\n                 *\n                 * @param {string} columnIndex\n                 * @param {any} appliedColumnValue\n                 * @returns {void}\n                 */\n                removeAppliedColumnValue(columnIndex, appliedColumnValue) {\n                    let appliedColumn = this.findAppliedColumn(columnIndex);\n\n                    if (appliedColumn?.type === 'date' || appliedColumn?.type === 'datetime') {\n                        appliedColumn.value = [];\n                    } else {\n                        if (appliedColumn.allow_multiple_values) {\n                            appliedColumn.value = appliedColumn?.value.filter(value => value !== appliedColumnValue);\n                        } else {\n                            appliedColumn.value = '';\n                        }\n                    }\n\n                    /**\n                     * Clean up is done here. If there are no applied values present, there is no point in including the applied column as well.\n                     */\n                    if (! appliedColumn.value.length) {\n                        this.filters.columns = this.filters.columns.filter(column => column.index !== columnIndex);\n                    }\n\n                    this.isFilterDirty = true;\n                },\n\n                /**\n                 * Remove all values from the applied values of the specified column.\n                 *\n                 * @param {string} columnIndex\n                 * @returns {void}\n                 */\n                removeAppliedColumnAllValues(columnIndex) {\n                    this.filters.columns = this.filters.columns.filter(column => column.index !== columnIndex);\n\n                    this.isFilterDirty = true;\n                },\n            },\n        });\n    </script>\n\n    <script \n        type=\"text/x-template\"\n        id=\"v-datagrid-searchable-dropdown-template\"\n    >\n        <x-admin::dropdown ::close-on-click=\"false\">\n            <!-- Dropdown Toggler -->\n            <x-slot:toggle>\n                <button\n                    type=\"button\"\n                    class=\"inline-flex h-[38px] w-full cursor-pointer appearance-none items-center justify-between gap-x-2 rounded-md border bg-white px-2.5 py-1.5 text-center leading-6 text-gray-600 transition-all marker:shadow hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                >\n                    <span\n                        class=\"text-sm text-gray-400 dark:text-gray-400\" \n                        v-text=\"'@lang('admin::app.components.datagrid.filters.select')'\"\n                    >\n                    </span>\n\n                    <span class=\"icon-down-arrow text-2xl\"></span>\n                </button>\n            </x-slot>\n\n            <!-- Dropdown Content -->\n            <x-slot:menu class=\"mt-1 rounded-md border border-gray-200 dark:border-gray-800\">\n                <div class=\"relative\">\n                    <div class=\"relative rounded\">\n                        <ul class=\"list-reset\">\n                            <li class=\"p-2\">\n                                <input\n                                    class=\"block w-full rounded-md border bg-white px-2 py-1.5 text-sm leading-6 text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                    @keyup=\"lookUp($event)\"\n                                >\n                            </li>\n\n                            <ul class=\"p-2\">\n                                <li v-if=\"!isMinimumCharacters\">\n                                    <p\n                                        class=\"block p-2 text-gray-600 dark:text-gray-300\"\n                                        v-text=\"'@lang('admin::app.components.datagrid.filters.dropdown.searchable.at-least-two-chars')'\"\n                                    >\n                                    </p>\n                                </li>\n\n                                <li v-else-if=\"!searchedOptions.length\">\n                                    <p\n                                        class=\"block p-2 text-gray-600 dark:text-gray-300\"\n                                        v-text=\"'@lang('admin::app.components.datagrid.filters.dropdown.searchable.no-results')'\"\n                                    >\n                                    </p>\n                                </li>\n\n                                <li\n                                    v-for=\"option in searchedOptions\"\n                                    v-else\n                                >\n                                    <p\n                                        class=\"cursor-pointer p-2 text-sm text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950\"\n                                        v-text=\"option.label\"\n                                        @click=\"selectOption(option)\"\n                                    >\n                                    </p>\n                                </li>\n                            </ul>\n                        </ul>\n                    </div>\n                </div>\n            </x-slot>\n        </x-admin::dropdown>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-datagrid-searchable-dropdown', {\n            template: '#v-datagrid-searchable-dropdown-template',\n\n            props: ['datagridId', 'column'],\n\n            data() {\n                return {\n                    isMinimumCharacters: false,\n\n                    searchedOptions: [],\n                };\n            },\n\n            methods: {\n                lookUp($event) {\n                    let params = {\n                        datagrid_id: this.datagridId,\n                        column: this.column.index,\n                        search: $event.target.value,\n                    };\n\n                    if (! (params['search'].length > 1)) {\n                        this.searchedOptions = [];\n\n                        this.isMinimumCharacters = false;\n\n                        return;\n                    }\n\n                    this.$axios\n                        .get(`{{ route('admin.datagrid.look_up') }}`, {\n                            params\n                        })\n                        .then(({\n                            data\n                        }) => {\n                            this.isMinimumCharacters = true;\n\n                            this.searchedOptions = data;\n                        });\n                },\n\n                selectOption(option) {\n                    this.searchedOptions = [];\n\n                    this.$emit('select-option', {\n                        target: {\n                            value: option.value\n                        }\n                    });\n                },\n            }\n        });\n    </script>\n@endpushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/mass-action.blade.php",
    "content": "<v-datagrid-mass-action\n    :available=\"available\"\n    :applied=\"applied\"\n>\n    {{ $slot }}\n</v-datagrid-mass-action>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-datagrid-mass-action-template\"\n    >\n        <slot\n            name=\"mass-action\"\n            :available=\"available\"\n            :applied=\"applied\"\n            :mass-actions=\"massActions\"\n            :validate-mass-action=\"validateMassAction\"\n            :perform-mass-action=\"performMassAction\"\n        >\n            <div class=\"flex max-w-max items-center justify-center gap-2 rounded-lg bg-white p-2 px-4 shadow-[0px_10px_20px_0px_rgba(0,0,0,0.12)] dark:border-gray-800 dark:bg-gray-700 dark:text-gray-300\">\n                <div>\n                    <p class=\"text-sm font-light text-gray-800 dark:text-white\">\n                        @{{ \"@lang('admin::app.components.datagrid.toolbar.selected')\".replace(':total', applied.massActions.indices.length) }}\n                    </p>\n                </div>\n\n                <template v-if=\"available.massActions.some(action => action.icon !== 'icon-delete' && action.options.length)\">\n                    <template v-for=\"massAction in available.massActions.filter(action => action.icon !== 'icon-delete')\">\n                        <x-admin::dropdown class=\"rounded-lg dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\">\n                            <x-slot:toggle>\n                                <button\n                                    type=\"button\"\n                                    class=\"inline-flex w-full max-w-max cursor-pointer appearance-none items-center justify-between gap-x-2 rounded-md border bg-white px-2.5 py-1.5 text-center leading-6 text-gray-600 transition-all marker:shadow hover:border-gray-400 focus:border-gray-400 focus:ring-black dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                    @click=\"showPopup = ! showPopup\"\n                                >\n                                    <span class=\"text-sm font-normal\">\n                                        @{{ massAction.title }}\n                                    </span>\n        \n                                    <span\n                                        class=\"text-2xl\"\n                                        :class=\"showPopup ? 'icon-up-arrow' : 'icon-down-arrow'\"\n                                    ></span>\n                                </button>\n                            </x-slot>\n        \n                            <x-slot:menu class=\"!bottom-12 !top-auto !p-0 shadow-[0_5px_20px_rgba(0,0,0,0.15)] dark:border-gray-800\">\n                                <li v-for=\"option in massAction?.options\">\n                                    <a\n                                        class=\"whitespace-no-wrap block rounded-t px-4 py-2 text-sm text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950\"\n                                        href=\"javascript:void(0);\"\n                                        @click=\"performMassAction(massAction, option)\"\n                                    >\n                                        @{{ option.label }}\n                                    </a>\n                                </li>\n                            </x-slot>\n                        </x-admin::dropdown>    \n                    </template>\n                </template>\n                \n                <button\n                    type=\"button\"\n                    class=\"primary-button border-red-500 !bg-red-500\"\n                    @click=\"performMassAction(available.massActions.find(action => action.icon === 'icon-delete'))\"\n                >\n                    @{{ available.massActions.find(action => action.icon === 'icon-delete')?.title }}\n                </button>\n\n                <i \n                    class=\"icon-cross-large cursor-pointer rounded-md p-1 text-2xl text-gray-600 transition-all hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950\"\n                    @click=\"massActions.indices = []\"\n                ></i>\n            </div>\n        </slot>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-datagrid-mass-action', {\n            template: '#v-datagrid-mass-action-template',\n\n            props: ['available', 'applied'],\n\n            data() {\n                return {\n                    showPopup: false,\n\n                    massActions: {\n                        meta: {\n                            mode: 'none',\n\n                            action: null,\n                        },\n\n                        indices: [],\n\n                        value: null,\n                    },\n                };\n            },\n\n            mounted() {\n                this.massActions = this.applied.massActions;\n            },\n\n            methods: {\n                /**\n                 * Validate mass action.\n                 *\n                 * @param {object} filters\n                 * @returns {void}\n                 */\n                validateMassAction() {\n                    if (! this.massActions.indices.length) {\n                        this.$emitter.emit('add-flash', { type: 'warning', message: \"@lang('admin::app.components.datagrid.index.no-records-selected')\" });\n\n                        return false;\n                    }\n\n                    if (! this.massActions.meta.action) {\n                        this.$emitter.emit('add-flash', { type: 'warning', message: \"@lang('admin::app.components.datagrid.index.must-select-a-mass-action')\" });\n\n                        return false;\n                    }\n\n                    if (\n                        this.massActions.meta.action?.options?.length &&\n                        this.massActions.value === null\n                    ) {\n                        this.$emitter.emit('add-flash', { type: 'warning', message: \"@lang('admin::app.components.datagrid.index.must-select-a-mass-action-option')\" });\n\n                        return false;\n                    }\n\n                    return true;\n                },\n\n                /**\n                 * Perform mass action.\n                 *\n                 * @param {object} currentAction\n                 * @param {object} currentOption\n                 * @returns {void}\n                 */\n                performMassAction(currentAction, currentOption = null) {\n                    this.massActions.meta.action = currentAction;\n\n                    if (currentOption) {\n                        this.massActions.value = currentOption.value;\n                    }\n\n                    if (! this.validateMassAction()) {\n                        return;\n                    }\n\n                    const { action } = this.massActions.meta;\n\n                    const method = action.method.toLowerCase();\n\n                    this.$emitter.emit('open-confirm-modal', {\n                        agree: () => {\n                            switch (method) {\n                                case 'post':\n                                case 'put':\n                                case 'patch':\n                                    this.$axios[method](action.url, {\n                                            indices: this.massActions.indices,\n                                            value: this.massActions.value,\n                                        })\n                                        .then((response) => {\n                                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                                            this.$parent.$parent.get();\n                                        })\n                                        .catch((error) => {\n                                            this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n\n                                            this.$parent.$parent.get();\n                                        });\n\n                                    break;\n\n                                case 'delete':\n                                    this.$axios[method](action.url, {\n                                            indices: this.massActions.indices\n                                        })\n                                        .then(response => {\n                                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                                            /**\n                                             * Need to check reason why this.$emit('massActionSuccess') not emitting.\n                                             */\n                                            this.$parent.$parent.get();\n                                        })\n                                        .catch((error) => {\n                                            this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n\n                                            /**\n                                             * Need to check reason why this.$emit('massActionSuccess') not emitting.\n                                             */\n                                            this.$parent.$parent.get();\n                                        });\n\n                                    break;\n\n                                default:\n                                    console.error('Method not supported.');\n\n                                    break;\n                            }\n\n                            this.massActions.indices  = [];\n                        },\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/pagination.blade.php",
    "content": "<v-datagrid-pagination\n    :is-loading=\"isLoading\"\n    :available=\"available\"\n    :applied=\"applied\"\n    @changePage=\"changePage\"\n    @changePerPageOption=\"changePerPageOption\"\n>\n    {{ $slot }}\n</v-datagrid-pagination>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-datagrid-pagination-template\"\n    >\n        <slot\n            name=\"pagination\"\n            :available=\"available\"\n            :applied=\"applied\"\n            :change-page=\"changePage\"\n            :change-per-page-option=\"changePerPageOption\"\n        >\n            <template v-if=\"isLoading\">\n                <x-admin::shimmer.datagrid.toolbar.pagination />\n            </template>\n\n            <template v-else>\n                <div class=\"flex items-center gap-x-2\">\n                    <p class=\"whitespace-nowrap text-gray-600 dark:text-gray-300 max-sm:hidden\">\n                        @lang('admin::app.components.datagrid.toolbar.per-page')\n                    </p>\n\n                    <x-admin::dropdown>\n                        <x-slot:toggle>\n                            <div class=\"flex items-center gap-1\">\n                                <button\n                                    type=\"button\"\n                                    class=\"inline-flex w-full max-w-max cursor-pointer appearance-none items-center justify-between gap-x-2 rounded-md border bg-white px-2.5 py-1.5 text-center leading-6 text-gray-600 transition-all marker:shadow hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                >\n                                    <span>\n                                        @{{ applied.pagination.perPage }}\n                                    </span>\n    \n                                    <span class=\"icon-down-arrow text-2xl\"></span>\n                                </button>\n                            </div>\n                        </x-slot>\n\n                        <x-slot:menu>\n                            <x-admin::dropdown.menu.item\n                                v-for=\"perPageOption in available.meta.per_page_options\"\n                                @click=\"changePerPageOption(perPageOption)\"\n                            >\n                                @{{ perPageOption }}\n                            </x-admin::dropdown.menu.item>\n                        </x-slot>\n                    </x-admin::dropdown>\n                   \n                    <div class=\"whitespace-nowrap text-gray-600 dark:text-gray-300\">\n                        <span>\n                            @{{ available.meta.from ?? 0 }} - @{{ available.meta.to ?? 0 }}\n                        </span>\n\n                        <span>\n                            @lang('admin::app.components.datagrid.toolbar.of')\n                        </span>\n\n                        <span>\n                            @{{ available.meta.total }}\n                        </span>\n                       \n                    </div>\n\n                    <div class=\"flex items-center gap-1\">\n                        <div\n                            class=\"inline-flex w-full max-w-max cursor-pointer appearance-none items-center justify-between gap-x-1 rounded-md border border-transparent p-1.5 text-center text-gray-600 transition-all marker:shadow hover:bg-gray-200 active:border-gray-300 dark:text-gray-300 dark:hover:bg-gray-800\"\n                            @click=\"changePage('previous')\"\n                        >\n                            <span class=\"icon-left-arrow rtl:icon-right-arrow text-2xl\"></span>\n                        </div>\n\n                        <div\n                            class=\"inline-flex w-full max-w-max cursor-pointer appearance-none items-center justify-between gap-x-1 rounded-md border border-transparent p-1.5 text-center text-gray-600 transition-all marker:shadow hover:bg-gray-200 active:border-gray-300 dark:text-gray-300 dark:hover:bg-gray-800\"\n                            @click=\"changePage('next')\"\n                        >\n                            <span class=\"icon-right-arrow rtl:icon-left-arrow text-2xl\"></span>\n                        </div>\n                    </div>\n                </div>\n            </template>\n        </slot>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-datagrid-pagination', {\n            template: '#v-datagrid-pagination-template',\n\n            props: ['isLoading', 'available', 'applied'],\n\n            emits: ['changePage', 'changePerPageOption'],\n\n            methods: {\n                /**\n                 * Change Page.\n                 *\n                 * The reason for choosing the numeric approach over the URL approach is to prevent any conflicts with our existing\n                 * URLs. If we were to use the URL approach, it would introduce additional arguments in the `get` method, necessitating\n                 * the addition of a `url` prop. Instead, by using the numeric approach, we can let Axios handle all the query parameters\n                 * using the `applied` prop. This allows for a cleaner and more straightforward implementation.\n                 *\n                 * @param {string|integer} directionOrPageNumber\n                 * @returns {void}\n                 */\n                changePage(directionOrPageNumber) {\n                    let newPage;\n\n                    if (typeof directionOrPageNumber === 'string') {\n                        if (directionOrPageNumber === 'previous') {\n                            newPage = this.available.meta.current_page - 1;\n                        } else if (directionOrPageNumber === 'next') {\n                            newPage = this.available.meta.current_page + 1;\n                        } else {\n                            console.warn('Invalid Direction Provided : ' + directionOrPageNumber);\n\n                            return;\n                        }\n                    }  else if (typeof directionOrPageNumber === 'number') {\n                        newPage = directionOrPageNumber;\n                    } else {\n                        console.warn('Invalid Input Provided: ' + directionOrPageNumber);\n\n                        return;\n                    }\n\n                    /**\n                     * Check if the `newPage` is within the valid range.\n                     */\n                    if (newPage >= 1 && newPage <= this.available.meta.last_page) {\n                        this.$emit('changePage', newPage);\n                    } else {\n                        console.warn('Invalid Page Provided: ' + newPage);\n                    }\n                },\n\n                /**\n                 * Change per page option.\n                 *\n                 * @param {integer} option\n                 * @returns {void}\n                 */\n                changePerPageOption(option) {\n                    this.$emit('changePerPageOption', option);\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar/search.blade.php",
    "content": "<v-datagrid-search\n    :is-loading=\"isLoading\"\n    :available=\"available\"\n    :applied=\"applied\"\n    :src=\"src\"\n    @search=\"search\"\n    @filter=\"filter\"\n    @applySavedFilter=\"applySavedFilter\"\n>\n    {{ $slot }}\n</v-datagrid-search>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-datagrid-search-template\"\n    >\n        <slot\n            name=\"search\"\n            :available=\"available\"\n            :applied=\"applied\"\n            :search=\"search\"\n            :get-searched-values=\"getSearchedValues\"\n        >\n            <template v-if=\"isLoading\">\n                <x-admin::shimmer.datagrid.toolbar.search />\n            </template>\n\n            <template v-else>\n                <div class=\"flex w-full items-center gap-x-1.5\">\n                    <!-- Search Panel -->\n                    <div class=\"flex max-w-[445px] items-center max-sm:w-full max-sm:max-w-full\">\n                        <div class=\"relative w-full\">\n                            <div class=\"icon-search absolute top-1.5 flex items-center text-2xl ltr:left-3 rtl:right-3\"></div>\n\n                            <input\n                                type=\"text\"\n                                name=\"search\"\n                                :value=\"getSearchedValues('all')\"\n                                class=\"block w-full rounded-lg border bg-white py-1.5 leading-6 text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400 ltr:pl-10 ltr:pr-3 rtl:pl-3 rtl:pr-10\"\n                                placeholder=\"@lang('admin::app.components.datagrid.toolbar.search.title')\"\n                                autocomplete=\"off\"\n                                @keyup.enter=\"search\"\n                            >\n                        </div>\n                    </div>\n\n                    <!-- Filter Panel -->\n                    <x-admin::datagrid.toolbar.filter>\n                        <template #filter=\"{\n                            available,\n                            applied,\n                            filters,\n                            applyFilter,\n                            applyColumnValues,\n                            findAppliedColumn,\n                            hasAnyAppliedColumnValues,\n                            getAppliedColumnValues,\n                            removeAppliedColumnValue,\n                            removeAppliedColumnAllValues\n                        }\">\n                            <slot\n                                name=\"filter\"\n                                :available=\"available\"\n                                :applied=\"applied\"\n                                :filters=\"filters\"\n                                :apply-filter=\"applyFilter\"\n                                :apply-column-values=\"applyColumnValues\"\n                                :find-applied-column=\"findAppliedColumn\"\n                                :has-any-applied-column-values=\"hasAnyAppliedColumnValues\"\n                                :get-applied-column-values=\"getAppliedColumnValues\"\n                                :remove-applied-column-value=\"removeAppliedColumnValue\"\n                                :remove-applied-column-all-values=\"removeAppliedColumnAllValues\"\n                            >\n                            </slot>\n                        </template>\n                    </x-admin::datagrid.toolbar.filter>\n                </div>\n            </template>\n        </slot>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-datagrid-search', {\n            template: '#v-datagrid-search-template',\n\n            props: ['isLoading', 'available', 'applied', 'src'],\n\n            emits: ['search', 'filter', 'applySavedFilter'],\n\n            data() {\n                return {\n                    filters: {\n                        columns: [],\n                    },\n                };\n            },\n\n            mounted() {\n                this.filters.columns = this.applied.filters.columns.filter((column) => column.index === 'all');\n            },\n\n            methods: {\n                /**\n                 * Perform a search operation based on the input value.\n                 *\n                 * @param {Event} $event\n                 * @returns {void}\n                 */\n                search($event) {\n                    let requestedValue = $event.target.value;\n\n                    let appliedColumn = this.filters.columns.find(column => column.index === 'all');\n\n                    if (! requestedValue) {\n                        appliedColumn.value = [];\n\n                        this.$emit('search', this.filters);\n\n                        return;\n                    }\n\n                    if (appliedColumn) {\n                        appliedColumn.value = [requestedValue];\n                    } else {\n                        this.filters.columns.push({\n                            index: 'all',\n                            value: [requestedValue]\n                        });\n                    }\n\n                    this.$emit('search', this.filters);\n                },\n\n                filter(filter) {\n                    this.$emit('filter', filter);\n                },\n\n                applySavedFilter(filter) {\n                    this.$emit('applySavedFilter', filter);\n                },\n\n                /**\n                 * Get the searched values for a specific column.\n                 *\n                 * @param {string} columnIndex\n                 * @returns {Array}\n                 */\n                getSearchedValues(columnIndex) {\n                    let appliedColumn = this.filters.columns.find(column => column.index === 'all');\n\n                    return appliedColumn?.value ?? [];\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/datagrid/toolbar.blade.php",
    "content": "<template v-if=\"isLoading\">\n    <x-admin::shimmer.datagrid.toolbar />\n</template>\n\n<template v-else>\n    <div class=\"flex items-center justify-between gap-4 rounded-t-lg border border-b-0 border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 max-md:flex-wrap\">\n        <!-- Left Toolbar -->\n        <div class=\"toolbarLeft flex gap-x-1\">\n            {{ $toolbarLeftBefore }}\n            \n            <!-- Mass Actions Panel -->\n            <transition-group\n                tag='div'\n                name=\"flash-group\"\n                enter-from-class=\"ltr:translate-y-full rtl:-translate-y-full\"\n                enter-active-class=\"transform transition duration-300 ease-[cubic-bezier(.4,0,.2,1)]\"\n                enter-to-class=\"ltr:translate-y-0 rtl:-translate-y-0\"\n                leave-from-class=\"ltr:translate-y-0 rtl:-translate-y-0\"\n                leave-active-class=\"transform transition duration-300 ease-[cubic-bezier(.4,0,.2,1)]\"\n                leave-to-class=\"ltr:translate-y-full rtl:-translate-y-full\"\n                class='fixed bottom-10 left-1/2 z-[10003] grid -translate-x-1/2 justify-items-end gap-2.5'\n            >\n                <div v-if=\"applied.massActions.indices.length\">\n                    <x-admin::datagrid.toolbar.mass-action>\n                        <template #mass-action=\"{\n                            available,\n                            applied,\n                            massActions,\n                            validateMassAction,\n                            performMassAction\n                        }\">\n                            <slot\n                                name=\"mass-action\"\n                                :available=\"available\"\n                                :applied=\"applied\"\n                                :mass-actions=\"massActions\"\n                                :validate-mass-action=\"validateMassAction\"\n                                :perform-mass-action=\"performMassAction\"\n                            >\n                            </slot>\n                        </template>\n                    </x-admin::datagrid.toolbar.mass-action>\n                </div>\n            </transition-group>\n\n            <!-- Search Panel -->\n            <x-admin::datagrid.toolbar.search>\n                <template #search=\"{\n                    available,\n                    applied,\n                    search,\n                    getSearchedValues,\n                }\">\n                    <slot\n                        name=\"search\"\n                        :available=\"available\"\n                        :applied=\"applied\"\n                        :search=\"search\"\n                        :get-searched-values=\"getSearchedValues\"\n                    >\n                    </slot>\n                </template>\n            </x-admin::datagrid.toolbar.search>\n\n            {{ $toolbarLeftAfter }}\n        </div>\n\n        <!-- Right Toolbar -->\n        <div class=\"toolbarRight flex gap-x-4\">\n            {{ $toolbarRightBefore }}\n            \n            <!-- Pagination Panel -->\n            <x-admin::datagrid.toolbar.pagination>\n                <template #pagination=\"{\n                    available,\n                    applied,\n                    changePage,\n                    changePerPageOption\n                }\">\n                    <slot\n                        name=\"pagination\"\n                        :available=\"available\"\n                        :applied=\"applied\"\n                        :change-page=\"changePage\"\n                        :change-per-page-option=\"changePerPageOption\"\n                    >\n                    </slot>\n                </template>\n            </x-admin::datagrid.toolbar.pagination>\n\n            {{ $toolbarRightAfter }}\n        </div>\n    </div>\n</template>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/drawer/index.blade.php",
    "content": "@props([\n    'isActive' => false,\n    'position' => 'right',\n    'width' => '500px',\n])\n\n<v-drawer\n    {{ $attributes }}\n    is-active=\"{{ $isActive }}\"\n    position=\"{{ $position }}\"\n    width=\"{{ $width }}\"\n>\n    @isset($toggle)\n        <template v-slot:toggle>\n            {{ $toggle }}\n        </template>\n    @endisset\n\n    @isset($header)\n        <template v-slot:header=\"{ close }\">\n            <div {{ $header->attributes->merge(['class' => 'flex justify-between items-center gap-y-2.5 border-b p-3 dark:border-gray-800 max-sm:px-4']) }}>\n                {{ $header }}\n\n                <div class=\"w-full flex-1 ltr:right-3 ltr:text-right rtl:left-3 rtl:text-left\">\n                    <span\n                        class=\"icon-cross-large cursor-pointer text-3xl hover:rounded-md hover:bg-gray-100 dark:hover:bg-gray-950\"\n                        @click=\"close\"\n                    >\n                    </span>\n                </div>\n            </div>\n        </template>\n    @endisset\n\n    @isset($content)\n        <template v-slot:content>\n            <div {{ $content->attributes->merge(['class' => 'flex-1 overflow-auto p-3 max-sm:px-4']) }}>\n                {{ $content }}\n            </div>\n        </template>\n    @endisset\n\n    @isset($footer)\n        <template v-slot:footer>\n            <div {{ $footer->attributes->merge(['class' => 'pb-8']) }}>\n                {{ $footer }}\n            </div>\n        </template>\n    @endisset\n</v-drawer>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-drawer-template\"\n    >\n        <div>\n            <!-- Toggler -->\n            <div @click=\"open\">\n                <slot name=\"toggle\">\n                </slot>\n            </div>\n\n            <!-- Overlay -->\n            <transition\n                tag=\"div\"\n                name=\"drawer-overlay\"\n                enter-class=\"ease-out duration-300\"\n                enter-from-class=\"opacity-0\"\n                enter-to-class=\"opacity-100\"\n                leave-class=\"ease-in duration-200\"\n                leave-from-class=\"opacity-100\"\n                leave-to-class=\"opacity-0\"\n            >\n                <div\n                    class=\"fixed inset-0 z-[10002] bg-gray-500 bg-opacity-50 transition-opacity\"\n                    v-show=\"isOpen\"\n                ></div>\n            </transition>\n\n            <!-- Content -->\n            <transition\n                tag=\"div\"\n                name=\"drawer\"\n                :enter-from-class=\"enterFromLeaveToClasses\"\n                enter-active-class=\"transform transition duration-200 ease-in-out\"\n                enter-to-class=\"translate-x-0\"\n                leave-from-class=\"translate-x-0\"\n                leave-active-class=\"transform transition duration-200 ease-in-out\"\n                :leave-to-class=\"enterFromLeaveToClasses\"\n            >\n                <div\n                    class=\"fixed z-[10003] m-3 rounded-lg bg-white dark:bg-gray-900 max-sm:!w-[calc(100%-24px)]\"\n                    :class=\"{\n                        'inset-x-0 top-0': position == 'top',\n                        'inset-x-0 bottom-0': position == 'bottom',\n                        'inset-y-0 ltr:right-0 rtl:left-0': position == 'right',\n                        'inset-y-0 ltr:left-0 rtl:right-0': position == 'left'\n                    }\"\n                    :style=\"'width:' + width\"\n                    v-if=\"isOpen\"\n                >\n                    <div class=\"pointer-events-auto h-full w-full overflow-auto rounded-lg bg-white dark:bg-gray-900\">\n                        <div class=\"flex h-full w-full flex-col\">\n                            <div class=\"min-h-0 min-w-0 flex-1 overflow-auto\">\n                                <div class=\"flex h-full flex-col\">\n                                    <!-- Header Slot-->\n                                    <slot\n                                        name=\"header\"\n                                        :close=\"close\"\n                                    >\n                                    </slot>\n\n                                    <!-- Content Slot -->\n                                    <slot name=\"content\"></slot>\n\n                                    <!-- Footer Slot -->\n                                    <slot name=\"footer\"></slot>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </transition>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-drawer', {\n            template: '#v-drawer-template',\n\n            props: [\n                'isActive',\n                'position',\n                'width'\n            ],\n\n            emits: [\n                'toggle',\n                'open',\n                'close',\n            ],\n\n            data() {\n                return {\n                    isOpen: this.isActive,\n                };\n            },\n\n            watch: {\n                isActive: function(newVal, oldVal) {\n                    this.isOpen = newVal;\n                }\n            },\n\n            computed: {\n                enterFromLeaveToClasses() {\n                    if (this.position == 'top') {\n                        return '-translate-y-full';\n                    } else if (this.position == 'bottom') {\n                        return 'translate-y-full';\n                    } else if (this.position == 'left') {\n                        return 'ltr:-translate-x-full rtl:translate-x-full';\n                    } else if (this.position == 'right') {\n                        return 'ltr:translate-x-full rtl:-translate-x-full';\n                    }\n                }\n            },\n\n            methods: {\n                toggle() {\n                    this.isOpen = ! this.isOpen;\n\n                    if (this.isOpen) {\n                        document.body.style.overflow = 'hidden';\n                    } else {\n                        document.body.style.overflow ='auto';\n                    }\n\n                    this.$emit('toggle', { isActive: this.isOpen });\n                },\n\n                open() {\n                    this.isOpen = true;\n\n                    document.body.style.overflow = 'hidden';\n\n                    this.$emit('open', { isActive: this.isOpen });\n                },\n\n                close() {\n                    this.isOpen = false;\n\n                    document.body.style.overflow = 'auto';\n\n                    this.$emit('close', { isActive: this.isOpen });\n                }\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/dropdown/index.blade.php",
    "content": "@props(['position' => 'bottom-left'])\n\n<v-dropdown position=\"{{ $position }}\" {{ $attributes->merge(['class' => 'relative']) }}>\n    @isset($toggle)\n        {{ $toggle }}\n\n        <template v-slot:toggle>\n            {{ $toggle }}\n        </template>\n    @endisset\n\n    @isset($content)\n        <template #content=\"{ isActive, positionStyles }\">\n            <div\n                {{ $content->attributes->merge(['class' => 'absolute z-10 w-max rounded bg-white py-5 shadow-[0px_10px_20px_0px_#0000001F] dark:bg-gray-900 border border-gray-300 dark:border-gray-800']) }}\n                :style=\"positionStyles\"\n                v-show=\"isActive\"\n            >\n                {{ $content }}\n            </div>\n        </template>\n    @endisset\n\n    @isset($menu)\n        <template #menu=\"{ isActive, positionStyles }\">\n            <ul\n                {{ $menu->attributes->merge(['class' => 'absolute z-10 w-max rounded bg-white py-4 shadow-[0px_10px_20px_0px_#0000001F] dark:bg-gray-900']) }}\n                :style=\"positionStyles\"\n                v-show=\"isActive\"\n            >\n                {{ $menu }}\n            </ul>\n        </template>\n    @endisset\n</v-dropdown>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-dropdown-template\"\n    >\n        <div>\n            <div\n                class=\"flex select-none items-center\"\n                ref=\"toggleBlock\"\n                @click=\"toggle()\"\n            >\n                <slot name=\"toggle\"></slot>\n            </div>\n\n            <transition\n                tag=\"div\"\n                name=\"dropdown\"\n                enter-active-class=\"transition duration-100 ease-out\"\n                enter-from-class=\"scale-95 transform opacity-0\"\n                enter-to-class=\"scale-100 transform opacity-100\"\n                leave-active-class=\"transition duration-75 ease-in\"\n                leave-from-class=\"scale-100 transform opacity-100\"\n                leave-to-class=\"scale-95 transform opacity-0\"\n            >\n                <div>\n                    <slot\n                        name=\"content\"\n                        :position-styles=\"positionStyles\"\n                        :is-active=\"isActive\"\n                    ></slot>\n\n                    <slot\n                        name=\"menu\"\n                        :position-styles=\"positionStyles\"\n                        :is-active=\"isActive\"\n                    ></slot>\n                </div>\n            </transition>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-dropdown', {\n            template: '#v-dropdown-template',\n\n            props: {\n                position: String,\n\n                closeOnClick: {\n                    type: Boolean,\n                    required: false,\n                    default: true\n                },\n            },\n\n            data() {\n                return {\n                    toggleBlockWidth: 0,\n\n                    toggleBlockHeight: 0,\n\n                    isActive: false,\n                };\n            },\n\n            created() {\n                window.addEventListener('click', this.handleFocusOut);\n            },\n\n            mounted() {\n                this.toggleBlockWidth = this.$refs.toggleBlock.clientWidth;\n\n                this.toggleBlockHeight = this.$refs.toggleBlock.clientHeight;\n            },\n\n            beforeDestroy() {\n                window.removeEventListener('click', this.handleFocusOut);\n            },\n\n            computed: {\n                positionStyles() {\n                    switch (this.position) {\n                        case 'bottom-left':\n                            return [\n                                `min-width: ${this.toggleBlockWidth}px`,\n                                `top: ${this.toggleBlockHeight}px`,\n                                'left: 0',\n                            ];\n\n                        case 'bottom-right':\n                            return [\n                                `min-width: ${this.toggleBlockWidth}px`,\n                                `top: ${this.toggleBlockHeight}px`,\n                                'right: 0',\n                            ];\n\n                        case 'top-left':\n                            return [\n                                `min-width: ${this.toggleBlockWidth}px`,\n                                `bottom: ${this.toggleBlockHeight*2}px`,\n                                'left: 0',\n                            ];\n\n                        case 'top-right':\n                            return [\n                                `min-width: ${this.toggleBlockWidth}px`,\n                                `bottom: ${this.toggleBlockHeight*2}px`,\n                                'right: 0',\n                            ];\n\n                        default:\n                            return [\n                                `min-width: ${this.toggleBlockWidth}px`,\n                                `top: ${this.toggleBlockHeight}px`,\n                                'left: 0',\n                            ];\n                    }\n                },\n            },\n\n            methods: {\n                toggle() {\n                    this.isActive = ! this.isActive;\n                },\n\n                handleFocusOut(e) {\n                    if (! this.$el.contains(e.target) || (this.closeOnClick && this.$el.children[1].contains(e.target))) {\n                        this.isActive = false;\n                    }\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/dropdown/menu/item.blade.php",
    "content": "<li {{ $attributes->merge(['class' => 'cursor-pointer px-5 py-2 text-sm text-gray-800 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950 ']) }}>\n    {{ $slot }}\n</li>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/example.blade.php",
    "content": "\n@php\n    $bgColors = ['bg-orange-100', 'bg-red-100', 'bg-green-100', 'bg-blue-100', 'bg-purple-100'];\n    $textColors = ['text-orange-800', 'text-red-800', 'text-green-800', 'text-blue-800', 'text-purple-800'];\n@endphp\n@foreach ($bgColors as $bgColor)\n    <div class=\"{{ $bgColor }}\"></div>\n@endforeach\n\n@foreach ($textColors as $textColor)\n    <div class=\"{{ $textColor }}\"></div>\n@endforeach"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/flash-group/index.blade.php",
    "content": "<v-flash-group ref='flashes'></v-flash-group>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-flash-group-template\"\n    >\n        <transition-group\n            tag='div'\n            name=\"flash-group\"\n            enter-from-class=\"ltr:translate-y-full rtl:-translate-y-full\"\n            enter-active-class=\"transform transition duration-300 ease-[cubic-bezier(.4,0,.2,1)]\"\n            enter-to-class=\"ltr:translate-y-0 rtl:-translate-y-0\"\n            leave-from-class=\"ltr:translate-y-0 rtl:-translate-y-0\"\n            leave-active-class=\"transform transition duration-300 ease-[cubic-bezier(.4,0,.2,1)]\"\n            leave-to-class=\"ltr:translate-y-full rtl:-translate-y-full\"\n            class='fixed bottom-5 left-1/2 z-[10003] grid -translate-x-1/2 justify-items-end gap-2.5'\n        >\n            <x-admin::flash-group.item />\n        </transition-group>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-flash-group', {\n            template: '#v-flash-group-template',\n\n            data() {\n                return {\n                    uid: 0,\n\n                    flashes: []\n                }\n            },\n\n            created() {\n                @foreach (['success', 'warning', 'error', 'info'] as $key)\n                    @if (session()->has($key))\n                        this.flashes.push({'type': '{{ $key }}', 'message': \"{{ session($key) }}\", 'uid':  this.uid++});\n                    @endif\n                @endforeach\n\n                this.registerGlobalEvents();\n            },\n\n            methods: {\n                add(flash) {\n                    flash.uid = this.uid++;\n\n                    this.flashes.push(flash);\n                },\n\n                remove(flash) {\n                    let index = this.flashes.indexOf(flash);\n\n                    this.flashes.splice(index, 1);\n                },\n\n                registerGlobalEvents() {\n                    this.$emitter.on('add-flash', this.add);\n                },\n            }\n        });\n    </script>\n@endpushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/flash-group/item.blade.php",
    "content": "<v-flash-item\n    v-for='flash in flashes'\n    :key='flash.uid'\n    :flash=\"flash\"\n    @onRemove=\"remove($event)\"\n>\n</v-flash-item>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-flash-item-template\"\n    >\n        <div\n            class=\"flex w-max items-start justify-between gap-2 rounded-lg bg-white p-3 shadow-[0px_10px_20px_0px_rgba(0,0,0,0.12)] dark:bg-gray-950\"\n            :style=\"typeStyles[flash.type]['container']\"\n            @mouseenter=\"pauseTimer\"\n            @mouseleave=\"resumeTimer\"\n        >\n            <!-- Icon -->\n            <span\n                class=\"icon-toast-done rounded-full bg-white text-2xl dark:bg-gray-900\"\n                :class=\"iconClasses[flash.type]\"\n                :style=\"typeStyles[flash.type]['icon']\"\n            ></span>\n\n            <div class=\"flex flex-col gap-1.5\">\n                <!-- Heading -->\n                <p class=\"text-base font-semibold dark:text-white\">\n                    @{{ typeHeadings[flash.type] }}\n                </p>\n\n                <!-- Message -->\n                <p\n                    class=\"flex items-center break-all text-sm dark:text-white\"\n                    :style=\"typeStyles[flash.type]['message']\"\n                >\n\n                    @{{ flash.message }}\n                </p>\n            </div>\n\n            <button\n                class=\"relative ml-4 inline-flex rounded-full bg-white p-1.5 text-gray-400 dark:bg-gray-950\"\n                @click=\"remove\"\n            >\n                <span class=\"icon-cross-large text-2xl text-slate-800\"></span>\n\n                <svg class=\"absolute inset-0 h-full w-full -rotate-90\" viewBox=\"0 0 24 24\">\n                    <circle\n                        class=\"text-gray-200\"\n                        stroke-width=\"1.5\"\n                        stroke=\"#D0D4DA\"\n                        fill=\"transparent\"\n                        r=\"10\"\n                        cx=\"12\"\n                        cy=\"12\"\n                    />\n                    \n                    <circle\n                        class=\"text-blue-600 transition-all duration-100 ease-out\"\n                        stroke-width=\"1.5\"\n                        :stroke-dasharray=\"circumference\"\n                        :stroke-dashoffset=\"strokeDashoffset\"\n                        stroke-linecap=\"round\"\n                        :stroke=\"typeStyles[flash.type]['stroke']\"\n                        fill=\"transparent\"\n                        r=\"10\"\n                        cx=\"12\"\n                        cy=\"12\"\n                    />\n                </svg>\n            </button>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-flash-item', {\n            template: '#v-flash-item-template',\n\n            props: ['flash'],\n\n            data() {\n                return {\n                    iconClasses: {\n                        success: 'icon-success',\n\n                        error: 'icon-error',\n\n                        warning: 'icon-warning',\n\n                        info: 'icon-info',\n                    },\n\n                    typeHeadings: {\n                        success: \"@lang('admin::app.components.flash-group.success')\",\n\n                        error: \"@lang('admin::app.components.flash-group.error')\",\n\n                        warning: \"@lang('admin::app.components.flash-group.warning')\",\n\n                        info: \"@lang('admin::app.components.flash-group.info')\",\n                    },\n\n                    typeStyles: {\n                        success: {\n                            container: 'border-left: 8px solid #16A34A',\n\n                            icon: 'color: #16A34A',\n\n                            stroke: '#16A34A',\n                        },\n\n                        error: {\n                            container: 'border-left: 8px solid #FF4D50',\n\n                            icon: 'color: #FF4D50',\n\n                            stroke: '#FF4D50',\n                        },\n\n                        warning: {\n                            container: 'border-left: 8px solid #FBAD15',\n\n                            icon: 'color: #FBAD15',\n\n                            stroke: '#FBAD15',\n                        },\n\n                        info: {\n                            container: 'border-left: 8px solid #0E90D9',\n\n                            icon: 'color: #0E90D9',\n\n                            stroke: '#0E90D9',\n                        },\n                    },\n\n                    duration: 5000,\n\n                    progress: 0,\n                    \n                    circumference: 2 * Math.PI * 10,\n\n                    timer: null,\n\n                    isPaused: false,\n                    \n                    remainingTime: 5000,\n                };\n            },\n\n            computed: {\n                strokeDashoffset() {\n                    return this.circumference - (this.progress / 100) * this.circumference;\n                }\n            },\n\n            created() {\n                this.startTimer();\n            },\n\n            beforeUnmount() {\n                this.stopTimer();\n            },\n\n            methods: {\n                remove() {\n                    this.$emit('onRemove', this.flash)\n                },\n\n                startTimer() {\n                    const interval = 100;\n                    \n                    const step = (100 / (this.duration / interval));\n\n                    this.timer = setInterval(() => {\n                        if (! this.isPaused) {\n                            this.progress += step;\n\n                            this.remainingTime -= interval;\n\n                            if (this.progress >= 100) {\n                                this.stopTimer();\n                                this.remove();\n                            }\n                        }\n                    }, interval);\n                },\n\n                stopTimer() {\n                    clearInterval(this.timer);\n                },\n\n                pauseTimer() {\n                    this.isPaused = true;\n                },\n\n                resumeTimer() {\n                    this.isPaused = false;\n                },\n            }\n        });\n    </script>\n@endpushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/flat-picker/date.blade.php",
    "content": "<v-date-picker {{ $attributes }}>\n    {{ $slot }}\n</v-date-picker>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-date-picker-template\"\n    >\n        <span class=\"relative inline-block w-full\">\n            <slot></slot>\n\n            <i class=\"icon-calendar pointer-events-none absolute top-1/2 -translate-y-1/2 text-2xl text-gray-400 ltr:right-2 rtl:left-2\"></i>\n        </span>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-date-picker', {\n            template: '#v-date-picker-template',\n\n            props: {\n                name: String,\n\n                value: String,\n\n                allowInput: {\n                    type: Boolean,\n                    default: true,\n                },\n\n                disable: Array,\n\n                minDate: String,\n\n                maxDate: String,\n            },\n\n            data: function() {\n                return {\n                    datepicker: null\n                };\n            },\n\n            mounted: function() {\n                let options = this.setOptions();\n\n                this.activate(options);\n            },\n\n            methods: {\n                setOptions: function() {\n                    let self = this;\n\n                    return {\n                        allowInput: this.allowInput ?? true,\n                        disable: this.disable ?? [],\n                        minDate: this.minDate ?? '',\n                        maxDate: this.maxDate ?? '',\n                        altFormat: \"Y-m-d\",\n                        dateFormat: \"Y-m-d\",\n                        weekNumbers: true,\n\n                        onChange: function(selectedDates, dateStr, instance) {\n                            self.$emit(\"onChange\", dateStr);\n                        }\n                    };\n                },\n\n                activate: function(options) {\n                    let element = this.$el.getElementsByTagName(\"input\")[0];\n\n                    this.datepicker = new Flatpickr(element, options);\n                },\n\n                clear: function() {\n                    this.datepicker.clear();\n                }\n            }\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/flat-picker/datetime.blade.php",
    "content": "<v-datetime-picker {{ $attributes }}>\n    {{ $slot }}\n</v-datetime-picker>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-datetime-picker-template\"\n    >\n        <span class=\"relative inline-block w-full\">\n            <slot></slot>\n\n            <i class=\"icon-calendar pointer-events-none absolute top-1/2 -translate-y-1/2 text-2xl text-gray-400 ltr:right-2 rtl:left-2\"></i>\n        </span>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-datetime-picker', {\n            template: '#v-datetime-picker-template',\n\n            props: {\n                name: String,\n\n                value: String,\n\n                allowInput: {\n                    type: Boolean,\n                    default: true,\n                },\n\n                disable: Array,\n\n                minDate: String,\n\n                maxDate: String,\n            },\n\n            data: function() {\n                return {\n                    datepicker: null\n                };\n            },\n\n            mounted: function() {\n                let options = this.setOptions();\n\n                this.activate(options);\n            },\n\n            methods: {\n                setOptions: function() {\n                    let self = this;\n\n                    return {\n                        allowInput: this.allowInput ?? true,\n                        disable: this.disable ?? [],\n                        minDate: this.minDate ?? '',\n                        maxDate: this.maxDate ?? '',\n                        altFormat: \"Y-m-d H:i:S\",\n                        dateFormat: \"Y-m-d H:i:S\",\n                        enableTime: true,\n                        time_24hr: true,\n                        weekNumbers: true,\n\n                        onChange: function(selectedDates, dateStr, instance) {\n                            self.$emit(\"onChange\", dateStr);\n                        }\n                    };\n                },\n\n                activate: function(options) {\n                    let element = this.$el.getElementsByTagName(\"input\")[0];\n\n                    this.datepicker = new Flatpickr(element, options);\n                },\n\n                clear: function() {\n                    this.datepicker.clear();\n                }\n            }\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/control.blade.php",
    "content": "@props([\n    'type' => 'text',\n    'name' => '',\n])\n\n@switch($type)\n    @case('hidden')\n    @case('text')\n    @case('email')\n    @case('password')\n    @case('number')\n        <v-field\n            v-slot=\"{ field, errors }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}\n            name=\"{{ $name }}\"\n        >\n            <input\n                type=\"{{ $type }}\"\n                name=\"{{ $name }}\"\n                v-bind=\"field\"\n                :class=\"[errors.length ? 'border !border-red-600 hover:border-red-600' : '']\"\n                {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }}\n            />\n        </v-field>\n\n        @break\n\n    @case('price')\n        <v-field\n            v-slot=\"{ field, errors }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}\n            name=\"{{ $name }}\"\n        >\n            <div\n                class=\"flex w-full items-center overflow-hidden rounded-md border text-sm text-gray-600 transition-all focus-within:border-gray-400 hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                :class=\"[errors.length ? 'border !border-red-600 hover:border-red-600' : '']\"\n            >\n                @if (isset($currency))\n                    <span {{ $currency->attributes->merge(['class' => 'py-2.5 text-gray-500 ltr:pl-4 rtl:pr-4']) }}>\n                        {{ $currency }}\n                    </span>\n                @else\n                    <span class=\"py-2.5 text-gray-500 ltr:pl-4 rtl:pr-4\">\n                        {{ config('app.currency') }}\n                    </span>\n                @endif\n\n                <input\n                    type=\"text\"\n                    name=\"{{ $name }}\"\n                    v-bind=\"field\"\n                    {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full p-2.5 text-sm text-gray-600 dark:bg-gray-900 dark:text-gray-300']) }}\n                />\n            </div>\n        </v-field>\n\n        @break\n\n    @case('file')\n        <v-field\n            v-slot=\"{ field, errors, handleChange, handleBlur }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}\n            name=\"{{ $name }}\"\n        >\n            <input\n                type=\"{{ $type }}\"\n                v-bind=\"{ name: field.name }\"\n                :class=\"[errors.length ? 'border !border-red-600 hover:border-red-600' : '']\"\n                {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full dark:file:bg-gray-800 dark:file:dark:text-white rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }}\n                @change=\"handleChange\"\n                @blur=\"handleBlur\"\n            />\n        </v-field>\n\n        @break\n\n    @case('color')\n        <v-field\n            name=\"{{ $name }}\"\n            v-slot=\"{ field, errors }\"\n            {{ $attributes->except('class') }}\n        >\n            <input\n                type=\"{{ $type }}\"\n                :class=\"[errors.length ? 'border border-red-500' : '']\"\n                v-bind=\"field\"\n                {{ $attributes->except(['value'])->merge(['class' => 'w-full appearance-none rounded-md border text-sm text-gray-600 transition-all hover:border-gray-400 dark:text-gray-300 dark:hover:border-gray-400']) }}\n            >\n        </v-field>\n        @break\n\n    @case('textarea')\n        <v-field\n            v-slot=\"{ field, errors }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}\n            name=\"{{ $name }}\"\n        >\n            @php\n                $defaultAttributes = [\n                    'class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400'\n                ];\n\n                if ($attributes->get('tinymce', false) || $attributes->get(':tinymce', false)) {\n                    $defaultAttributes['id'] = $attributes->get(':id', 'id');\n                }\n            @endphp\n\n            <textarea\n                type=\"{{ $type }}\"\n                name=\"{{ $name }}\"\n                v-bind=\"field\"\n                :class=\"[errors.length ? 'border !border-red-600 hover:border-red-600' : '']\"\n                {{\n                    $attributes\n                        ->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])\n                        ->merge($defaultAttributes)\n                }}\n            >\n            </textarea>\n\n            @if ($attributes->get('tinymce', false) || $attributes->get(':tinymce', false))\n                <x-admin::tinymce\n                    :selector=\"'textarea#' . ($attributes->get('id') ?? $attributes->get(':id'))\"\n                    ::field=\"field\"\n                />\n            @endif\n        </v-field>\n\n        @break\n\n    @case('date')\n        <v-field\n            v-slot=\"{ field, errors }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\\d{4}-\\d{2}-\\d{2}$']) }}\n            name=\"{{ $name }}\"\n        >\n            <x-admin::flat-picker.date>\n                <input\n                    name=\"{{ $name }}\"\n                    v-bind=\"field\"\n                    :class=\"[errors.length ? 'border !border-red-600 hover:border-red-600' : '']\"\n                    {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }}\n                    autocomplete=\"off\"\n                />\n            </x-admin::flat-picker.date>\n        </v-field>\n\n        @break\n\n    @case('datetime')\n        <v-field\n            v-slot=\"{ field, errors }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$']) }}\n            name=\"{{ $name }}\"\n        >\n            <x-admin::flat-picker.datetime>\n                <input\n                    name=\"{{ $name }}\"\n                    v-bind=\"field\"\n                    :class=\"[errors.length ? 'border !border-red-600 hover:border-red-600' : '']\"\n                    {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }}\n                    autocomplete=\"off\"\n                >\n            </x-admin::flat-picker.datetime>\n        </v-field>\n        @break\n\n    @case('select')\n        <v-field\n            v-slot=\"{ field, errors }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}\n            name=\"{{ $name }}\"\n        >\n            <select\n                name=\"{{ $name }}\"\n                v-bind=\"field\"\n                :class=\"[errors.length ? 'border border-red-500' : '']\"\n                {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'custom-select w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400']) }}\n            >\n                {{ $slot }}\n            </select>\n        </v-field>\n\n        @break\n\n    @case('multiselect')\n        <v-field\n            as=\"select\"\n            v-slot=\"{ value }\"\n            :class=\"[errors && errors['{{ $name }}'] ? 'border !border-red-600 hover:border-red-600' : '']\"\n            {{ $attributes->except([])->merge(['class' => 'flex w-full flex-col rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400']) }}\n            name=\"{{ $name }}\"\n            multiple\n        >\n            {{ $slot }}\n        </v-field>\n\n        @break\n\n    @case('checkbox')\n        <v-field\n            v-slot=\"{ field }\"\n            type=\"checkbox\"\n            class=\"hidden\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label', 'key', ':key']) }}\n            name=\"{{ $name }}\"\n        >\n            <input\n                type=\"checkbox\"\n                name=\"{{ $name }}\"\n                v-bind=\"field\"\n                class=\"peer sr-only\"\n                {{ $attributes->except(['rules', 'label', ':label', 'key', ':key']) }}\n            />\n\n            <v-checked-handler\n                :field=\"field\"\n                checked=\"{{ $attributes->get('checked') }}\"\n            >\n            </v-checked-handler>\n        </v-field>\n\n        <label\n             {{\n                $attributes\n                    ->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label', 'key', ':key'])\n                    ->merge(['class' => 'text-gray-500 icon-checkbox-outline peer-checked:icon-checkbox-select text-2xl peer-checked:text-brandColor'])\n                    ->merge(['class' => $attributes->get('disabled') ? 'cursor-not-allowed opacity-70' : 'cursor-pointer'])\n            }}\n        >\n        </label>\n\n        @break\n\n    @case('radio')\n        <v-field\n            type=\"radio\"\n            class=\"hidden\"\n            v-slot=\"{ field }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label', 'key', ':key']) }}\n            name=\"{{ $name }}\"\n        >\n            <input\n                type=\"radio\"\n                name=\"{{ $name }}\"\n                v-bind=\"field\"\n                {{ $attributes->except(['rules', 'label', ':label', 'key', ':key'])->merge(['class' => 'peer sr-only']) }}\n            />\n\n            <v-checked-handler\n                class=\"hidden\"\n                :field=\"field\"\n                checked=\"{{ $attributes->get('checked') }}\"\n            >\n            </v-checked-handler>\n        </v-field>\n\n        <label\n            {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label', 'key', ':key'])->merge(['class' => 'icon-radio-normal peer-checked:icon-radio-selected cursor-pointer text-2xl peer-checked:text-brandColor']) }}\n        >\n        </label>\n\n        @break\n\n    @case('switch')\n        <label class=\"relative inline-flex cursor-pointer items-center\">\n            <v-field\n                type=\"checkbox\"\n                class=\"hidden\"\n                v-slot=\"{ field }\"\n                {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label', 'key', ':key']) }}\n                name=\"{{ $name }}\"\n            >\n                <input\n                    type=\"checkbox\"\n                    name=\"{{ $name }}\"\n                    id=\"{{ $name }}\"\n                    class=\"peer sr-only\"\n                    v-bind=\"field\"\n                    {{ $attributes->except(['v-model', 'rules', ':rules', 'label', ':label', 'key', ':key']) }}\n                />\n\n                <v-checked-handler\n                    class=\"hidden\"\n                    :field=\"field\"\n                    checked=\"{{ $attributes->get('checked') }}\"\n                >\n                </v-checked-handler>\n            </v-field>\n\n            <label\n                class=\"peer h-5 w-9 cursor-pointer rounded-full bg-gray-200 after:absolute after:top-0.5 after:h-4 after:w-4 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[''] peer-checked:bg-brandColor peer-checked:after:border-white peer-focus:outline-none peer-focus:ring-blue-300 dark:bg-gray-800 dark:after:border-white dark:after:bg-white dark:peer-checked:bg-gray-950 after:ltr:left-0.5 peer-checked:after:ltr:translate-x-full after:rtl:right-0.5 peer-checked:after:rtl:-translate-x-full\"\n                for=\"{{ $name }}\"\n            ></label>\n        </label>\n\n        @break\n\n    @case('image')\n        <x-admin::media.images\n            name=\"{{ $name }}\"\n            ::class=\"[errors && errors['{{ $name }}'] ? 'border !border-red-600 hover:border-red-600' : '']\"\n            {{ $attributes }}\n        />\n\n        @break\n\n    @case('inline')\n        <x-admin::form.control-group.controls.inline.text {{ $attributes }} />\n\n        @break\n\n    @case('custom')\n        <v-field {{ $attributes }}>\n            {{ $slot }}\n        </v-field>\n\n        @break\n\n    @case('tags')\n        <x-admin::form.control-group.controls.tags\n            :name=\"$name\"\n            :data=\"$attributes->get(':data') ?? $attributes->get('data')\"\n            {{ $attributes}}\n        />\n        @break\n@endswitch\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-checked-handler-template\"\n    >\n    </script>\n\n    <script type=\"module\">\n        app.component('v-checked-handler', {\n            template: '#v-checked-handler-template',\n\n            props: ['field', 'checked'],\n\n            mounted() {\n                if (this.checked == '') {\n                    return;\n                }\n\n                this.field.checked = true;\n\n                this.field.onChange();\n            },\n        });\n    </script>\n@endpushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/address.blade.php",
    "content": "@props([\n    'allowEdit' => true,\n])\n\n<v-inline-address-edit\n    {{ $attributes->except('value') }}\n    :value='@json($attributes->get('value'))'\n    :allow-edit=\"{{ $allowEdit ? 'true' : 'false' }}\"\n>\n    <div class=\"group w-full max-w-full hover:rounded-sm\">\n        <div class=\"rounded-xs flex h-[34px] items-center ltr:pl-2.5 ltr:text-left rtl:pr-2.5 rtl:text-right\">\n            <div class=\"shimmer h-5 w-48 rounded border border-transparent\"></div>\n        </div>\n    </div>\n</v-inline-address-edit>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-inline-address-edit-template\"\n    >\n        <div class=\"group w-full max-w-full hover:rounded-sm\">\n            <!-- Non-editing view -->\n            <div\n                class=\"flex h-[34px] items-center rounded border border-transparent transition-all\"\n                :class=\"allowEdit ? 'hover:bg-gray-100 dark:hover:bg-gray-800' : ''\"\n            >\n                <div \n                    class=\"group relative !w-full pl-2.5\"\n                    :style=\"{ 'text-align': position }\"\n                >\n                    <span class=\"cursor-pointer truncate rounded\">\n                        @{{ valueLabel ? valueLabel : `${inputValue?.address} ${inputValue?.city} ${inputValue?.state} ${inputValue?.postcode} ${inputValue?.country}`.length > 20 ? `${inputValue?.address} ${inputValue?.city} ${inputValue?.state} ${inputValue?.postcode} ${inputValue?.country}`.substring(0, 20) + '...' : `${inputValue?.address} ${inputValue?.city} ${inputValue?.state} ${inputValue?.postcode} ${inputValue?.country}` }}\n                    </span>\n\n                    <div class=\"absolute bottom-0 mb-5 hidden flex-col group-hover:flex\">\n                        <span class=\"whitespace-no-wrap relative z-10 rounded-md bg-black px-4 py-2 text-xs leading-none text-white shadow-lg dark:bg-white dark:text-gray-900\">\n                            @{{ inputValue?.address }}<br>\n                            @{{ `${inputValue?.city}, ${inputValue?.state}, ${inputValue?.postcode}` }}<br>\n                            @{{ `${inputValue?.country}` }}<br>\n                        </span>\n\n                        <div class=\"-mt-2 ml-4 h-3 w-3 rotate-45 bg-black dark:bg-white\"></div>\n                    </div>\n                </div>\n\n                <template v-if=\"allowEdit\">\n                    <i\n                        @click=\"toggle\"\n                        class=\"icon-edit cursor-pointer rounded p-0.5 text-2xl opacity-0 hover:bg-gray-200 group-hover:opacity-100 dark:hover:bg-gray-950 ltr:mr-1 rtl:ml-1\"\n                    ></i>\n                </template>\n            </div>\n\n            <Teleport to=\"body\">\n                <x-admin::form\n                    v-slot=\"{ meta, errors, handleSubmit }\"\n                    as=\"div\"\n                    ref=\"modalForm\"\n                >\n                    <form @submit=\"handleSubmit($event, updateOrCreate)\">\n                        <!-- Editing view -->\n                        <x-admin::modal ref=\"emailModal\">\n                            <!-- Modal Header -->\n                            <x-slot:header>\n                                <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                                    Update Address\n                                </p>\n                            </x-slot>\n\n                            <!-- Modal Content -->\n                            <x-slot:content>\n                                <div class=\"flex gap-4\">\n                                    <div class=\"w-full\">\n                                        <!-- Address (Textarea field) -->\n                                        <x-admin::form.control-group>\n                                            <x-admin::form.control-group.control\n                                                type=\"textarea\"\n                                                ::name=\"`${name}.address`\"\n                                                rows=\"10\"\n                                                ::value=\"inputValue?.address\"\n                                            />\n\n                                            <x-admin::form.control-group.error ::name=\"name\" />\n                                        </x-admin::form.control-group>\n                                    </div>\n\n                                    <div class=\"grid w-full\">\n                                        <!-- Country Field -->\n                                        <x-admin::form.control-group>\n                                            <x-admin::form.control-group.control\n                                                type=\"select\"\n                                                ::name=\"`${name}.country`\"\n                                                v-model=\"inputValue.country\"\n                                            >\n                                                <option value=\"\">@lang('admin::app.common.custom-attributes.select-country')</option>\n                                                \n                                                @foreach (core()->countries() as $country)\n                                                    <option value=\"{{ $country->code }}\">{{ $country->name }}</option>\n                                                @endforeach\n                                            </x-admin::form.control-group.control>\n                        \n                                            <x-admin::form.control-group.error name=\"country\" />\n                        \n                                        </x-admin::form.control-group>\n                        \n                                        <!-- State Field -->\n                                        <template v-if=\"haveStates()\">\n                                            <x-admin::form.control-group>\n                                                <x-admin::form.control-group.control\n                                                    type=\"select\"\n                                                    ::name=\"`${name}.state`\"\n                                                    v-model=\"inputValue.state\"\n                                                >\n                                                    <option value=\"\">@lang('admin::app.common.custom-attributes.select-state')</option>\n                                                    \n                                                    <option v-for='(state, index) in countryStates[inputValue?.country]' :value=\"state.code\">\n                                                        @{{ state.name }}\n                                                    </option>\n                                                </x-admin::form.control-group.control>\n                        \n                                                <x-admin::form.control-group.error name=\"country\" />\n                                            </x-admin::form.control-group>\n                                        </template>\n                        \n                                        <template v-else>\n                                            <x-admin::form.control-group>\n                                                <x-admin::form.control-group.control\n                                                    type=\"text\"\n                                                    ::name=\"`${name}.state`\"\n                                                    v-model=\"inputValue.state\"\n                                                />\n                                                \n                                                <x-admin::form.control-group.error name=\"state\" />\n                                            </x-admin::form.control-group>\n                                        </template>\n                        \n                                        <!-- City Field -->\n                                        <x-admin::form.control-group>\n                                            <x-admin::form.control-group.control\n                                                type=\"text\"\n                                                ::name=\"`${name}.city`\"\n                                                ::value=\"inputValue?.city\"\n                                            />\n                        \n                                            <x-admin::form.control-group.error name=\"city\" />\n                                        </x-admin::form.control-group>\n                        \n                                        <!-- Postcode Field -->\n                                        <x-admin::form.control-group>\n                                            <x-admin::form.control-group.control\n                                                type=\"text\"\n                                                ::name=\"`${name}.postcode`\"\n                                                ::value=\"inputValue?.postcode\"\n                                                :placeholder=\"trans('admin::app.common.custom-attributes.postcode')\"\n                                            />\n                        \n                                            <x-admin::form.control-group.error name=\"postcode\" />\n                                        </x-admin::form.control-group>\n                                    </div>\n                                </div>\n                            </x-slot>\n\n                            <!-- Modal Footer -->\n                            <x-slot:footer>\n                                <!-- Save Button -->\n                                <x-admin::button\n                                    button-type=\"submit\"\n                                    class=\"primary-button justify-center\"\n                                    :title=\"trans('Save')\"\n                                    ::loading=\"isProcessing\"\n                                    ::disabled=\"isProcessing\"\n                                />\n                            </x-slot>\n                        </x-admin::modal>\n                    </form>\n                </x-admin::form>\n            </Teleport>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-inline-address-edit', {\n            template: '#v-inline-address-edit-template',\n\n            emits: ['on-change', 'on-cancelled'],\n\n            props: {\n                name: {\n                    type: String,\n                    required: true,\n                },\n\n                value: {\n                    required: true,\n                },\n\n                rules: {\n                    type: String,\n                    default: '',\n                },\n\n                label: {\n                    type: String,\n                    default: '',\n                },\n\n                placeholder: {\n                    type: String,\n                    default: '',\n                },\n\n                position: {\n                    type: String,\n                    default: 'right',\n                },\n\n                allowEdit: {\n                    type: Boolean,\n                    default: true,\n                },\n\n                errors: {\n                    type: Object,\n                    default: {},\n                },\n\n                url: {\n                    type: String,\n                    default: '',\n                },\n\n                valueLabel: {\n                    type: String,\n                    default: '',\n                },\n            },\n\n            data() {\n                return {\n                    inputValue: this.value,\n\n                    isEditing: false,\n\n                    emails: JSON.parse(JSON.stringify(this.value || [{'value': '', 'label': 'work'}])),\n\n                    isProcessing: false,\n\n                    countryStates: @json(core()->groupedStatesByCountries()),\n                };\n            },\n\n            watch: {\n                /**\n                 * Watch the value prop.\n                 * \n                 * @param {String} newValue \n                 */\n                value(newValue, oldValue) {\n                    if (JSON.stringify(newValue) !== JSON.stringify(oldValue)) {\n                        this.emails = newValue || [{'value': '', 'label': 'work'}];\n                    }\n                },\n            },\n\n            created() {\n                this.extendValidations();\n\n                if (! this.emails || ! this.emails.length) {\n                    this.emails = [{\n                        'value': '',\n                        'label': 'work'\n                    }];\n                }\n            },\n\n            computed: {\n                /**\n                 * Get the validation rules.\n                 * \n                 * @return {Object}\n                 */\n                getValidation() {\n                    return {\n                        email: true,\n                        unique_contact_email: this.emails ?? [],\n                        required: true,\n                    };\n                },\n            },\n\n            methods: {\n                /**\n                 * Toggle the input.\n                 * \n                 * @return {void}\n                 */\n                toggle() {\n                    this.isEditing = true;\n\n                    this.$refs.emailModal.toggle();\n                },\n\n                add() {\n                    this.emails.push({\n                        'value': '',\n                        'label': 'work'\n                    });\n                },\n\n                remove(email) {\n                    this.emails = this.emails.filter(email => email !== email);\n                },\n\n                extendValidations() {\n                    defineRule('unique_contact_email', (value, emails) => {\n                        if (\n                            ! value\n                            || ! value.length\n                        ) {\n                            return true;\n                        }\n\n                        const emailOccurrences = emails.filter(email => email.value === value).length;\n\n                        if (emailOccurrences > 1) {\n                            return 'This email email is already used';\n                        }\n\n                        return true;\n                    });\n                },\n\n                updateOrCreate(params) {\n                    this.inputValue = params[this.name];\n\n                    if (this.url) {\n                        this.$axios.put(this.url, {\n                                [this.name]: this.inputValue,\n                            })\n                            .then((response) => {\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch((error) => {\n                                this.inputValue = this.value;\n\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                            });                        \n                    }\n\n                    this.$emit('on-change', {\n                        name: this.name,\n                        value: this.inputValue,\n                    });\n\n                    this.$refs.emailModal.toggle();\n                },\n\n                haveStates() {\n                    /*\n                    * The double negation operator is used to convert the value to a boolean.\n                    * It ensures that the final result is a boolean value,\n                    * true if the array has a length greater than 0, and otherwise false.\n                    */\n                    return !!this.countryStates[this.inputValue.country]?.length;\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/boolean.blade.php",
    "content": "@props([\n    'allowEdit' => true,\n])\n\n<v-inline-boolean-edit\n    {{ $attributes->except('options') }}\n    :allow-edit=\"{{ $allowEdit ? 'true' : 'false' }}\"\n>\n    <div class=\"group w-full max-w-full hover:rounded-sm\">\n        <div class=\"rounded-xs flex h-[34px] items-center pl-2.5 text-left\">\n            <div class=\"shimmer h-5 w-48 rounded border border-transparent\"></div>\n        </div>\n    </div>\n</v-inline-boolean-edit>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-inline-boolean-edit-template\"\n    >\n        <div class=\"group w-full max-w-full hover:rounded-sm\">\n            <!-- Non-editing view -->\n            <div\n                v-if=\"! isEditing\"\n                class=\"flex h-[34px] items-center rounded border border-transparent transition-all\"\n                :class=\"allowEdit ? 'hover:bg-gray-100 dark:hover:bg-gray-800' : ''\"\n            >\n                <x-admin::form.control-group.control\n                    type=\"hidden\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    v-model=\"inputValue\"\n                />\n\n                <div\n                    class=\"group relative h-[18px] !w-full pl-2.5\"\n                    :style=\"{ 'text-align': position }\"\n                >\n                    <span class=\"cursor-pointer truncate rounded\">\n                        @{{ valueLabel ? valueLabel : options[inputValue].name }}\n                    </span>\n                </div>\n\n                <template v-if=\"allowEdit\">\n                    <i\n                        @click=\"toggle\"\n                        class=\"icon-edit cursor-pointer rounded p-0.5 text-2xl opacity-0 hover:bg-gray-200 group-hover:opacity-100 dark:hover:bg-gray-950 ltr:mr-1 rtl:ml-1\"\n                    ></i>\n                </template>\n            </div>\n        \n            <!-- Editing view -->\n            <div\n                class=\"relative flex w-full flex-col\"\n                v-else\n            >\n                <x-admin::form.control-group.control\n                    type=\"select\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    class=\"text-normal py-1 ltr:pr-16 rtl:pl-16\"\n                    ::rules=\"rules\"\n                    ::label=\"label\"\n                    ::placeholder=\"placeholder\"\n                    ::style=\"inputPositionStyle\"\n                    v-model=\"inputValue\"\n                >\n                    <option\n                        v-for=\"(option, index) in options\"\n                        :key=\"option.id\"\n                        :value=\"option.id\"\n                    >\n                        @{{ option.name }}\n                    </option>\n                </x-admin::form.control-group.control>\n                    \n                <!-- Action Buttons -->\n                <div class=\"absolute top-1/2 flex -translate-y-1/2 transform gap-0.5 ltr:right-2 rtl:left-2\">\n                    <button\n                        type=\"button\"\n                        class=\"flex items-center justify-center bg-green-100 p-1 hover:bg-green-200 ltr:rounded-l-md rtl:rounded-r-md\"\n                        @click=\"save\"\n                    >\n                        <i class=\"icon-tick text-md cursor-pointer font-bold text-green-600 dark:!text-green-600\" />\n                    </button>\n                \n                    <button\n                        type=\"button\"\n                        class=\"flex items-center justify-center bg-red-100 p-1 hover:bg-red-200 ltr:rounded-r-md rtl:rounded-l-md\"\n                        @click=\"cancel\"\n                    >\n                        <i class=\"icon-cross-large text-md cursor-pointer font-bold text-red-600 dark:!text-red-600\" />\n                    </button>\n                </div>\n\n                <x-admin::form.control-group.error ::name=\"name\"/>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-inline-boolean-edit', {\n            template: '#v-inline-boolean-edit-template',\n\n            emits: ['on-change', 'on-cancelled'],\n\n            props: {\n                name: {\n                    type: String,\n                    required: true,\n                },\n\n                value: {\n                    required: true,\n                },\n\n                rules: {\n                    type: String,\n                    default: '',\n                },\n\n                label: {\n                    type: String,\n                    default: '',\n                },\n\n                placeholder: {\n                    type: String,\n                    default: '',\n                },\n\n                position: {\n                    type: String,\n                    default: 'right',\n                },\n\n                allowEdit: {\n                    type: Boolean,\n                    default: true,\n                },\n\n                errors: {\n                    type: Object,\n                    default: {},\n                },\n\n                url: {\n                    type: String,\n                    default: '',\n                },\n\n                valueLabel: {\n                    type: String,\n                    default: '',\n                },\n            },\n\n            data() {\n                return {\n                    inputValue: this.value,\n\n                    isEditing: false,\n\n                    isRTL: document.documentElement.dir === 'rtl',\n\n                    options: [\n                        {\n                            id: 0,\n                            name: 'No',\n                        },\n                        {\n                            id: 1,\n                            name: 'Yes',\n                        },\n                    ]\n                };\n            },\n\n            watch: {\n                /**\n                 * Watch the value prop.\n                 * \n                 * @param {String} newValue \n                 */\n                value(newValue) {\n                    this.inputValue = newValue;\n                },\n            },\n\n            methods: {\n                /**\n                 * Toggle the input.\n                 * \n                 * @return {void}\n                 */\n                toggle() {\n                    this.isEditing = true;\n                },\n\n                /**\n                 * Save the input value.\n                 * \n                 * @return {void}\n                 */\n                save() {\n                    if (this.errors[this.name]) {\n                        return;\n                    }\n\n                    this.isEditing = false;\n\n                    if (this.url) {\n                        this.$axios.put(this.url, {\n                                [this.name]: this.inputValue,\n                            })\n                            .then((response) => {\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch((error) => {\n                                this.inputValue = this.value;\n\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                            });                        \n                    }\n\n                    this.$emit('on-change', {\n                        name: this.name,\n                        value: this.inputValue,\n                    });\n                },\n\n                /**\n                 * Cancel the input value.\n                 * \n                 * @return {void}\n                 */\n                cancel() {\n                    this.inputValue = this.value;\n\n                    this.isEditing = false;\n\n                    this.$emit('on-cancelled', {\n                        name: this.name,\n                        value: this.inputValue,\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/date.blade.php",
    "content": "@props([\n    'allowEdit' => true,\n])\n\n<v-inline-date-edit \n    {{ $attributes }}\n    :allow-edit=\"{{ $allowEdit ? 'true' : 'false' }}\"\n>\n    <div class=\"group w-full max-w-full hover:rounded-sm\">\n        <div class=\"rounded-xs flex h-[34px] items-center pl-2.5 text-left\">\n            <div class=\"shimmer h-5 w-48 rounded border border-transparent\"></div>\n        </div>\n    </div>\n</v-inline-date-edit>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-inline-date-edit-template\"\n    >\n        <div class=\"group w-full max-w-full hover:rounded-sm\">\n            <!-- Non-editing view -->\n            <div\n                v-if=\"! isEditing\"\n                class=\"flex h-[34px] items-center rounded border border-transparent transition-all\"\n                :class=\"allowEdit ? 'hover:bg-gray-100 dark:hover:bg-gray-800' : ''\"\n            >\n                <x-admin::form.control-group.control\n                    type=\"hidden\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    v-model=\"inputValue\"\n                />\n\n                <div \n                    class=\"group relative !w-full pl-2.5\"\n                    :style=\"{ 'text-align': position }\"\n                >\n                    <span class=\"cursor-pointer truncate rounded\">\n                        @{{ valueLabel ? valueLabel : inputValue.length > 20 ? inputValue.substring(0, 20) + '...' : inputValue }}\n                    </span> \n\n                    <!-- Tooltip -->\n                    <div\n                        class=\"absolute bottom-0 mb-5 hidden flex-col group-hover:flex\"\n                        v-if=\"inputValue.length > 20\"\n                    >\n                        <span class=\"whitespace-no-wrap relative z-10 rounded-md bg-black px-4 py-2 text-xs leading-none text-white shadow-lg dark:bg-white dark:text-gray-900\">\n                            @{{ inputValue }}\n                        </span>\n\n                        <div class=\"-mt-2 ml-4 h-3 w-3 rotate-45 bg-black dark:bg-white\"></div>\n                    </div>\n                </div>\n                \n                <template v-if=\"allowEdit\">\n                    <i\n                        @click=\"toggle\"\n                        class=\"icon-edit cursor-pointer rounded p-0.5 text-2xl opacity-0 hover:bg-gray-200 group-hover:opacity-100 dark:hover:bg-gray-950 ltr:mr-1 rtl:ml-1\"\n                    ></i>\n                </template>\n            </div>\n        \n            <!-- Editing view -->\n            <div\n                class=\"relative flex w-full flex-col ltr:[&>span>i]:right-14 rtl:[&>span>i]:left-14\"\n                v-else\n            >\n                <x-admin::form.control-group.control\n                    type=\"date\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    class=\"text-normal py-1 ltr:pr-20 rtl:pl-20\"\n                    ::rules=\"rules\"\n                    ::label=\"label\"\n                    ::placeholder=\"placeholder\"\n                    ::style=\"inputPositionStyle\"\n                    v-model=\"inputValue\"\n                    ref=\"input\"\n                    readonly\n                />\n                    \n                <!-- Action Buttons -->\n                <div class=\"absolute top-1/2 flex -translate-y-1/2 transform gap-0.5 ltr:right-2 rtl:left-2\">\n                    <button\n                        type=\"button\"\n                        class=\"flex items-center justify-center bg-green-100 p-1 hover:bg-green-200 ltr:rounded-l-md rtl:rounded-r-md\"\n                        @click=\"save\"\n                    >\n                        <i class=\"icon-tick text-md cursor-pointer font-bold text-green-600 dark:!text-green-600\" />\n                    </button>\n                \n                    <button\n                        type=\"button\"\n                        class=\"flex items-center justify-center bg-red-100 p-1 hover:bg-red-200 ltr:rounded-r-md rtl:rounded-l-md\"\n                        @click=\"cancel\"\n                    >\n                        <i class=\"icon-cross-large text-md cursor-pointer font-bold text-red-600 dark:!text-red-600\" />\n                    </button>\n                </div>\n\n                <x-admin::form.control-group.error ::name=\"name\"/>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-inline-date-edit', {\n            template: '#v-inline-date-edit-template',\n\n            emits: ['on-change', 'on-cancelled'],\n\n            props: {\n                name: {\n                    type: String,\n                    required: true,\n                },\n\n                value: {\n                    required: true,\n                },\n\n                rules: {\n                    type: String,\n                    default: '',\n                },\n\n                label: {\n                    type: String,\n                    default: '',\n                },\n\n                placeholder: {\n                    type: String,\n                    default: '',\n                },\n\n                position: {\n                    type: String,\n                    default: 'right',\n                },\n\n                allowEdit: {\n                    type: Boolean,\n                    default: true,\n                },\n\n                errors: {\n                    type: Object,\n                    default: {},\n                },\n\n                url: {\n                    type: String,\n                    default: '',\n                },\n\n                valueLabel: {\n                    type: String,\n                    default: '',\n                },\n            },\n\n            data() {\n                return {\n                    inputValue: this.value,\n\n                    isEditing: false,\n\n                    isRTL: document.documentElement.dir === 'rtl',\n                };\n            },\n\n            watch: {\n                /**\n                 * Watch the value prop.\n                 * \n                 * @param {String} newValue \n                 */\n                value(newValue) {\n                    this.inputValue = newValue;\n                },\n            },\n\n            methods: {\n                /**\n                 * Toggle the input.\n                 * \n                 * @return {void}\n                 */\n                toggle() {\n                    this.isEditing = true;\n                },\n\n                /**\n                 * Save the input value.\n                 * \n                 * @return {void}\n                 */\n                save() {\n                    if (this.errors[this.name]) {\n                        return;\n                    }\n\n                    this.isEditing = false;\n\n                    if (this.url) {\n                        this.$axios.put(this.url, {\n                                [this.name]: this.inputValue,\n                            })\n                            .then((response) => {\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch((error) => {\n                                this.inputValue = this.value;\n\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                            });                        \n                    }\n\n                    this.$emit('on-change', {\n                        name: this.name,\n                        value: this.inputValue,\n                    });\n                },\n\n                /**\n                 * Cancel the input value.\n                 * \n                 * @return {void}\n                 */\n                cancel() {\n                    this.inputValue = this.value;\n\n                    this.isEditing = false;\n\n                    this.$emit('on-cancelled', {\n                        name: this.name,\n                        value: this.inputValue,\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/datetime.blade.php",
    "content": "@props([\n    'allowEdit' => true,\n])\n\n<v-inline-datetime-edit \n    {{ $attributes }}\n    :allow-edit=\"{{ $allowEdit ? 'true' : 'false' }}\"\n>\n    <div class=\"group w-full max-w-full hover:rounded-sm\">\n        <div class=\"rounded-xs flex h-[34px] items-center ltr:pl-2.5 ltr:text-left rtl:pr-2.5 rtl:text-right\">\n            <div class=\"shimmer h-5 w-48 rounded border border-transparent\"></div>\n        </div>\n    </div>\n</v-inline-datetime-edit>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-inline-datetime-edit-template\"\n    >\n        <div class=\"group w-full max-w-full hover:rounded-sm\">\n            <!-- Non-editing view -->\n            <div\n                v-if=\"! isEditing\"\n                class=\"flex h-[34px] items-center rounded border border-transparent transition-all\"\n                :class=\"allowEdit ? 'hover:bg-gray-100 dark:hover:bg-gray-800' : ''\"\n            >\n                <x-admin::form.control-group.control\n                    type=\"hidden\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    v-model=\"inputValue\"\n                />\n\n                <div\n                    class=\"group relative !w-full pl-2.5\"\n                    :style=\"{ 'text-align': position }\"\n                >\n                    <span class=\"cursor-pointer truncate rounded\">\n                        @{{ valueLabel ? valueLabel : inputValue.length > 20 ? inputValue.substring(0, 20) + '...' : inputValue }}\n                    </span>\n\n                    <!-- Tooltip -->\n                    <div\n                        class=\"absolute bottom-0 mb-5 hidden flex-col group-hover:flex\"\n                        v-if=\"inputValue.length > 20\"\n                    >\n                        <span class=\"whitespace-no-wrap relative z-10 rounded-md bg-black px-4 py-2 text-xs leading-none text-white shadow-lg dark:bg-white dark:text-gray-900\">\n                            @{{ inputValue }}\n                        </span>\n\n                        <div class=\"-mt-2 ml-4 h-3 w-3 rotate-45 bg-black dark:bg-white\"></div>\n                    </div>\n                </div>\n\n                <template v-if=\"allowEdit\">\n                    <i\n                        @click=\"toggle\"\n                        class=\"icon-edit cursor-pointer rounded text-2xl opacity-0 hover:bg-gray-200 group-hover:opacity-100 dark:hover:bg-gray-950\"\n                    ></i>\n                </template>\n            </div>\n        \n            <!-- Editing view -->\n            <div\n                class=\"relative flex w-full flex-col ltr:[&>span>i]:right-14 rtl:[&>span>i]:left-14\"\n                v-else\n            >\n                <x-admin::form.control-group.control\n                    type=\"datetime\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    class=\"text-normal py-1 ltr:pr-16 rtl:pl-16\"\n                    ::rules=\"rules\"\n                    ::label=\"label\"\n                    ::placeholder=\"placeholder\"\n                    ::style=\"inputPositionStyle\"\n                    v-model=\"inputValue\"\n                    ref=\"input\"\n                    readonly\n                />\n                    \n                <!-- Action Buttons -->\n                <div class=\"absolute top-1/2 flex -translate-y-1/2 transform gap-0.5 bg-white ltr:right-2 rtl:left-2\">\n                    <button\n                        type=\"button\"\n                        class=\"flex items-center justify-center bg-green-100 p-1 hover:bg-green-200 ltr:rounded-l-md rtl:rounded-r-md\"\n                        @click=\"save\"\n                    >\n                        <i class=\"icon-tick text-md cursor-pointer font-bold text-green-600\" />\n                    </button>\n                \n                    <button\n                        type=\"button\"\n                        class=\"flex items-center justify-center bg-red-100 p-1 hover:bg-red-200 ltr:rounded-r-md rtl:rounded-l-md\"\n                        @click=\"cancel\"\n                    >\n                        <i class=\"icon-cross-large text-md cursor-pointer font-bold text-red-600\" />\n                    </button>\n                </div>\n\n                <x-admin::form.control-group.error ::name=\"name\"/>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-inline-datetime-edit', {\n            template: '#v-inline-datetime-edit-template',\n\n            emits: ['on-change', 'on-cancelled'],\n\n            props: {\n                name: {\n                    type: String,\n                    required: true,\n                },\n\n                value: {\n                    required: true,\n                },\n\n                rules: {\n                    type: String,\n                    default: '',\n                },\n\n                label: {\n                    type: String,\n                    default: '',\n                },\n\n                placeholder: {\n                    type: String,\n                    default: '',\n                },\n\n                position: {\n                    type: String,\n                    default: 'right',\n                },\n\n                allowEdit: {\n                    type: Boolean,\n                    default: true,\n                },\n\n                errors: {\n                    type: Object,\n                    default: {},\n                },\n\n                url: {\n                    type: String,\n                    default: '',\n                },\n\n                valueLabel: {\n                    type: String,\n                    default: '',\n                },\n            },\n\n            data() {\n                return {\n                    inputValue: this.value,\n\n                    isEditing: false,\n\n                    isRTL: document.documentElement.dir === 'rtl',\n                };\n            },\n\n            watch: {\n                /**\n                 * Watch the value prop.\n                 * \n                 * @param {String} newValue \n                 */\n                value(newValue) {\n                    this.inputValue = newValue;\n                },\n            },\n\n            methods: {\n                /**\n                 * Toggle the input.\n                 * \n                 * @return {void}\n                 */\n                toggle() {\n                    this.isEditing = true;\n                },\n\n                /**\n                 * Save the input value.\n                 * \n                 * @return {void}\n                 */\n                save() {\n                    if (this.errors[this.name]) {\n                        return;\n                    }\n\n                    this.isEditing = false;\n\n                    if (this.url) {\n                        this.$axios.put(this.url, {\n                                [this.name]: this.inputValue,\n                            })\n                            .then((response) => {\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch((error) => {\n                                this.inputValue = this.value;\n\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                            });                        \n                    }\n\n                    this.$emit('on-change', {\n                        name: this.name,\n                        value: this.inputValue,\n                    });\n                },\n\n                /**\n                 * Cancel the input value.\n                 * \n                 * @return {void}\n                 */\n                cancel() {\n                    this.inputValue = this.value;\n\n                    this.isEditing = false;\n\n                    this.$emit('on-cancelled', {\n                        name: this.name,\n                        value: this.inputValue,\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/email.blade.php",
    "content": "@props([\n    'allowEdit' => true,\n])\n\n<v-inline-email-edit\n    {{ $attributes->except('value') }}\n    :value={{ json_encode($attributes->get('value')) }}\n    :allow-edit=\"{{ $allowEdit ? 'true' : 'false' }}\"\n>\n    <div class=\"group w-full max-w-full hover:rounded-sm\">\n        <div class=\"rounded-xs flex h-[34px] items-center ltr:pl-2.5 ltr:text-left rtl:pr-2.5 rtl:text-right\">\n            <div class=\"shimmer h-5 w-48 rounded border border-transparent\"></div>\n        </div>\n    </div>\n</v-inline-email-edit>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-inline-email-edit-template\"\n    >\n        <div class=\"group w-full max-w-full hover:rounded-sm\">\n            <!-- Non-editing view -->\n            <div\n                class=\"flex h-[34px] items-center rounded border border-transparent transition-all\"\n                :class=\"allowEdit ? 'hover:bg-gray-100 dark:hover:bg-gray-800' : ''\"\n            >\n                <div \n                    class=\"group relative !w-full pl-2.5\"\n                    :style=\"{ 'text-align': position }\"\n                >\n                    <span class=\"cursor-pointer truncate rounded\">\n                        @{{ valueLabel ? valueLabel : inputValue?.map(item => `${item.value}(${item.label})`).join(', ').length > 20 ? inputValue?.map(item => `${item.value}(${item.label})`).join(', ').substring(0, 20) + '...' : inputValue?.map(item => `${item.value}(${item.label})`).join(', ') }}\n                    </span>\n\n                    <!-- Tooltip -->\n                    <div\n                        class=\"absolute bottom-0 mb-5 hidden flex-col group-hover:flex\"\n                        v-if=\"inputValue?.map(item => `${item.value}(${item.label})`).join(', ').length > 20\"\n                    >\n                        <span class=\"whitespace-no-wrap relative z-10 rounded-md bg-black px-4 py-2 text-xs leading-none text-white shadow-lg dark:bg-white dark:text-gray-900\">\n                            @{{ inputValue?.map(item => `${item.value}(${item.label})`).join(', \\n') }}\n                        </span>\n\n                        <div class=\"-mt-2 ml-4 h-3 w-3 rotate-45 bg-black dark:bg-white\"></div>\n                    </div>\n                </div>\n\n                <template v-if=\"allowEdit\">\n                    <i\n                        @click=\"toggle\"\n                        class=\"icon-edit cursor-pointer rounded p-0.5 text-2xl opacity-0 hover:bg-gray-200 group-hover:opacity-100 dark:hover:bg-gray-950 ltr:mr-1 rtl:ml-1\"\n                    ></i>\n                </template>\n            </div>\n\n            <Teleport to=\"body\">\n                <x-admin::form\n                    v-slot=\"{ meta, errors, handleSubmit }\"\n                    as=\"div\"\n                    ref=\"modalForm\"\n                >\n                    <form @submit=\"handleSubmit($event, updateOrCreate)\">\n                        <!-- Editing view -->\n                        <x-admin::modal ref=\"emailModal\">\n                            <!-- Modal Header -->\n                            <x-slot:header>\n                                <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                                    @lang(\"admin::app.common.custom-attributes.update-emails-title\")\n                                </p>\n                            </x-slot>\n\n                            <!-- Modal Content -->\n                            <x-slot:content>\n                                <template v-for=\"(email, index) in emails\">\n                                    <div class=\"mb-2 flex items-center\">\n                                        <x-admin::form.control-group.control\n                                            type=\"text\"\n                                            ::id=\"`${name}[${index}].value`\"\n                                            ::name=\"`${name}[${index}].value`\"\n                                            class=\"!rounded-r-none\"\n                                            ::rules=\"getValidation\"\n                                            v-model=\"email.value\"\n                                            :label=\"trans('admin::app.common.custom-attributes.email')\"\n                                        />\n\n                                        <div class=\"relative\">\n                                            <x-admin::form.control-group.control\n                                                type=\"select\"\n                                                ::id=\"`${name}[${index}].label`\"\n                                                ::name=\"`${name}[${index}].label`\"\n                                                class=\"!w-24 !rounded-l-none\"\n                                                ::value=\"email.label\"\n                                            >\n                                                <option value=\"work\">@lang('admin::app.common.custom-attributes.work')</option>\n                                                <option value=\"home\">@lang('admin::app.common.custom-attributes.home')</option>\n                                            </x-admin::form.control-group.control>\n                                        </div>\n\n                                        <i\n                                            v-if=\"emails.length > 1\"\n                                            class=\"icon-delete ml-1 cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                                            @click=\"remove(email)\"\n                                        ></i>\n                                    </div>\n                        \n                                    <x-admin::form.control-group.error ::name=\"`${name}[${index}].value`\"/>\n                                </template>\n                        \n                                <button\n                                    type=\"button\"\n                                    class=\"flex max-w-max items-center gap-2 text-brandColor\"\n                                    @click=\"add\"\n                                >\n                                    <i class=\"icon-add text-md !text-brandColor\"></i>\n\n                                    @lang(\"admin::app.common.custom-attributes.add-more\")\n                                </button>\n                            </x-slot>\n\n                            <!-- Modal Footer -->\n                            <x-slot:footer>\n                                <!-- Save Button -->\n                                <x-admin::button\n                                    button-type=\"submit\"\n                                    class=\"primary-button justify-center\"\n                                    :title=\"trans('admin::app.common.custom-attributes.save')\"\n                                    ::loading=\"isProcessing\"\n                                    ::disabled=\"isProcessing\"\n                                />\n                            </x-slot>\n                        </x-admin::modal>\n                    </form>\n                </x-admin::form>\n            </Teleport>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-inline-email-edit', {\n            template: '#v-inline-email-edit-template',\n\n            emits: ['on-save'],\n\n            props: {\n                name: {\n                    type: String,\n                    required: true,\n                },\n\n                value: {\n                    required: true,\n                },\n\n                rules: {\n                    type: String,\n                    default: '',\n                },\n\n                label: {\n                    type: String,\n                    default: '',\n                },\n\n                placeholder: {\n                    type: String,\n                    default: '',\n                },\n\n                position: {\n                    type: String,\n                    default: 'right',\n                },\n\n                allowEdit: {\n                    type: Boolean,\n                    default: true,\n                },\n\n                errors: {\n                    type: Object,\n                    default: {},\n                },\n\n                url: {\n                    type: String,\n                    default: '',\n                },\n\n                valueLabel: {\n                    type: String,\n                    default: '',\n                },\n            },\n\n            data() {\n                return {\n                    inputValue: this.value,\n\n                    isEditing: false,\n\n                    emails: JSON.parse(JSON.stringify(this.value || [{'value': '', 'label': 'work'}])),\n\n                    isProcessing: false,\n                };\n            },\n\n            watch: {\n                /**\n                 * Watch the value prop.\n                 * \n                 * @param {String} newValue \n                 */\n                value(newValue, oldValue) {\n                    if (JSON.stringify(newValue) !== JSON.stringify(oldValue)) {\n                        this.emails = newValue || [{'value': '', 'label': 'work'}];\n                    }\n                },\n            },\n\n            created() {\n                this.extendValidations();\n\n                if (! this.emails || ! this.emails.length) {\n                    this.emails = [{\n                        'value': '',\n                        'label': 'work'\n                    }];\n                }\n            },\n\n            computed: {\n                /**\n                 * Get the validation rules.\n                 * \n                 * @return {Object}\n                 */\n                getValidation() {\n                    return {\n                        email: true,\n                        unique_contact_email: this.emails ?? [],\n                        required: true,\n                    };\n                },\n            },\n\n            methods: {\n                /**\n                 * Toggle the input.\n                 * \n                 * @return {void}\n                 */\n                toggle() {\n                    this.isEditing = true;\n\n                    this.$refs.emailModal.toggle();\n                },\n\n                add() {\n                    this.emails.push({\n                        'value': '',\n                        'label': 'work'\n                    });\n                },\n\n                remove(contactEmail) {\n                    this.emails = this.emails.filter(email => email !== contactEmail);\n                },\n\n                extendValidations() {\n                    defineRule('unique_contact_email', (value, emails) => {\n                        if (\n                            ! value\n                            || ! value.length\n                        ) {\n                            return true;\n                        }\n\n                        const emailOccurrences = emails.filter(email => email.value === value).length;\n\n                        if (emailOccurrences > 1) {\n                            return 'This email is already used';\n                        }\n\n                        return true;\n                    });\n                },\n\n                updateOrCreate(params) {\n                    this.inputValue = params.contact_emails ?? params.emails;\n\n                    if (this.url) {\n                        this.isProcessing = true;\n\n                        this.$axios.put(this.url, {\n                                [this.name]: this.inputValue,\n                            })\n                            .then((response) => {\n                                this.emails = response.data.data.emails || this.emails;\n\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch((error) => {\n                                this.inputValue = this.value;\n\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                            })\n                            .finally(() => {\n                                this.isProcessing = false;\n                            });\n                    }\n\n                    this.$emit('on-save', params);\n\n                    this.$refs.emailModal.toggle();\n                }\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/file.blade.php",
    "content": "@props([\n    'allowEdit' => true,\n])\n\n<v-inline-file-edit\n    {{ $attributes }}\n    :allow-edit=\"{{ $allowEdit ? 'true' : 'false' }}\"\n>\n    <div class=\"group w-full max-w-full hover:rounded-sm\">\n        <div class=\"rounded-xs flex h-[34px] items-center pl-2.5 text-left\">\n            <div class=\"shimmer h-5 w-48 rounded border border-transparent\"></div>\n        </div>\n    </div>\n</v-inline-file-edit>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-inline-file-edit-template\"\n    >\n        <div class=\"group w-full max-w-full hover:rounded-sm\">\n            <!-- Non-editing view -->\n            <div\n                v-if=\"! isEditing\"\n                class=\"flex h-[34px] items-center justify-between rounded border border-transparent transition-all\"\n                :class=\"allowEdit ? 'hover:bg-gray-100 dark:hover:bg-gray-800' : ''\"\n            >\n                <x-admin::form.control-group.control\n                    type=\"hidden\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    v-model=\"inputValue\"\n                />\n\n                <a \n                    :href=\"inputValue\" \n                    v-if=\"inputValue\"\n                    target=\"_blank\"\n                >\n                    <span class=\"icon-download pl-[2px] text-2xl font-normal\"></span>\n                </a>\n\n                <span\n                    v-else\n                    class=\"icon-download cursor-pointer pl-[2px] text-2xl font-normal\"\n                >\n                </span>\n\n                <template v-if=\"allowEdit\">\n                    <i\n                        @click=\"toggle\"\n                        class=\"icon-edit cursor-pointer rounded text-2xl opacity-0 hover:bg-gray-200 group-hover:opacity-100 dark:hover:bg-gray-950\"\n                    ></i>\n                </template>\n            </div>\n        \n            <!-- Editing view -->\n            <div\n                class=\"relative flex w-full flex-col\"\n                v-else\n            >\n                <input\n                    type=\"file\"\n                    :name=\"name\"\n                    :id=\"name\"\n                    :class=\"[errors.length ? 'border !border-red-600 hover:border-red-600' : '']\"\n                    class=\"w-full rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:file:bg-gray-800 dark:file:dark:text-white dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                    @change=\"handleChange\"\n                    ref=\"input\"\n                />\n                    \n                <!-- Action Buttons -->\n                <div class=\"absolute top-1/2 flex -translate-y-1/2 transform gap-0.5 ltr:right-2 rtl:left-2\">\n                    <button\n                        type=\"button\"\n                        class=\"flex items-center justify-center bg-green-100 p-1 hover:bg-green-200 ltr:rounded-l-md rtl:rounded-r-md\"\n                        @click=\"save\"\n                    >\n                        <i class=\"icon-tick text-md cursor-pointer font-bold text-green-600 dark:!text-green-600\" />\n                    </button>\n                \n                    <button\n                        type=\"button\"\n                        class=\"flex items-center justify-center bg-red-100 p-1 hover:bg-red-200 ltr:rounded-r-md rtl:rounded-l-md\"\n                        @click=\"cancel\"\n                    >\n                        <i class=\"icon-cross-large text-md cursor-pointer font-bold text-red-600 dark:!text-red-600\" />\n                    </button>\n                </div>\n\n                <x-admin::form.control-group.error ::name=\"name\"/>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-inline-file-edit', {\n            template: '#v-inline-file-edit-template',\n\n            emits: ['on-change', 'on-cancelled'],\n\n            props: {\n                name: {\n                    type: String,\n                    required: true,\n                },\n\n                value: {\n                    required: true,\n                },\n\n                rules: {\n                    type: String,\n                    default: '',\n                },\n\n                label: {\n                    type: String,\n                    default: '',\n                },\n\n                placeholder: {\n                    type: String,\n                    default: '',\n                },\n\n                position: {\n                    type: String,\n                    default: 'right',\n                },\n\n                allowEdit: {\n                    type: Boolean,\n                    default: true,\n                },\n\n                errors: {\n                    type: Object,\n                    default: {},\n                },\n\n                url: {\n                    type: String,\n                    default: '',\n                },\n            },\n\n            data() {\n                return {\n                    inputValue: this.value,\n\n                    isEditing: false,\n\n                    file: null,\n\n                    isRTL: document.documentElement.dir === 'rtl',\n                };\n            },\n\n            watch: {\n                /**\n                 * Watch the value prop.\n                 * \n                 * @param {String} newValue \n                 */\n                value(newValue) {\n                    this.inputValue = newValue;\n                },\n            },\n\n            methods: {\n                /**\n                 * Toggle the input.\n                 * \n                 * @return {void}\n                 */\n                toggle() {\n                    this.isEditing = true;\n                },\n\n                /**\n                 * Save the input value.\n                 * \n                 * @return {void}\n                 */\n                save() {\n                    if (this.errors[this.name]) {\n                        return;\n                    }\n\n                    this.isEditing = false;\n\n                    let formData = new FormData();\n\n                    formData.append(this.name, this.file);\n\n                    formData.append('_method', 'PUT');\n\n                    if (this.url) {\n                        this.$axios.post(this.url, formData, {\n                            headers: {\n                                'Content-Type': 'multipart/form-data'\n                            }\n                        })\n                        .then((response) => {\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                        })\n                        .catch((error) => {\n                            this.inputValue = this.value;\n\n                            this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                        });\n                    }\n\n                    this.$emit('on-change', {\n                        name: this.name,\n                        value: this.inputValue,\n                    });\n                },\n\n                /**\n                 * Cancel the input value.\n                 * \n                 * @return {void}\n                 */\n                cancel() {\n                    this.inputValue = this.value;\n\n                    this.isEditing = false;\n\n                    this.$emit('on-cancelled', {\n                        name: this.name,\n                        value: this.inputValue,\n                    });\n                },\n\n                handleChange(event) {\n                    this.file = event.target.files[0];\n\n                    this.inputValue = URL.createObjectURL(this.file);\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/image.blade.php",
    "content": "@props([\n    'allowEdit' => true,\n])\n\n<v-inline-image-edit \n    {{ $attributes }}\n    :allow-edit=\"{{ $allowEdit ? 'true' : 'false' }}\"\n >\n    <div class=\"group w-full max-w-full hover:rounded-sm\">\n        <div class=\"rounded-xs flex h-[34px] items-center pl-2.5 text-left\">\n            <div class=\"shimmer h-5 w-48 rounded border border-transparent\"></div>\n        </div>\n    </div>\n</v-inline-image-edit>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-inline-image-edit-template\"\n    >\n        <div class=\"group w-full max-w-full hover:rounded-sm\">\n            <!-- Non-editing view -->\n            <div\n                v-if=\"! isEditing\"\n                class=\"flex h-[34px] items-center rounded border border-transparent transition-all\"\n                :class=\"allowEdit ? 'hover:bg-gray-100 dark:hover:bg-gray-800' : ''\"\n            >\n                <x-admin::form.control-group.control\n                    type=\"hidden\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    v-model=\"inputValue\"\n                />\n\n                <div \n                    class=\"group relative !w-full pl-2.5\"\n                    :style=\"{ 'text-align': position }\"\n                >\n                    <img\n                        :src=\"inputValue\"\n                        class=\"h-5 w-5\"\n                        :alt=\"name\"\n                    />\n                </div>\n\n                <template v-if=\"allowEdit\">\n                    <i\n                        @click=\"toggle\"\n                        class=\"icon-edit cursor-pointer rounded text-2xl opacity-0 hover:bg-gray-200 group-hover:opacity-100 dark:hover:bg-gray-950\"\n                    ></i>\n                </template>\n            </div>\n        \n            <!-- Editing view -->\n            <div\n                class=\"relative w-full\"\n                v-else\n            >\n                <input\n                    type=\"file\"\n                    :name=\"name\"\n                    :id=\"name\"\n                    :class=\"[errors.length ? 'border !border-red-600 hover:border-red-600' : '']\"\n                    class=\"!h-[34px] w-full cursor-pointer rounded-md border !py-0 px-3 text-sm text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-white dark:file:bg-gray-800 dark:file:dark:text-white dark:hover:border-gray-400 dark:focus:border-gray-400 ltr:pr-20 rtl:pl-20\"\n                    @change=\"handleChange\"\n                    ref=\"input\"\n                />\n                    \n                <!-- Action Buttons -->\n                <div class=\"absolute top-1/2 flex -translate-y-1/2 transform gap-0.5 ltr:right-2 rtl:left-2\">\n                    <button\n                        type=\"button\"\n                        class=\"flex items-center justify-center bg-green-100 p-1 hover:bg-green-200 ltr:rounded-l-md rtl:rounded-r-md\"\n                        @click=\"save\"\n                    >\n                        <i class=\"icon-tick text-md cursor-pointer font-bold text-green-600 dark:!text-green-600\" />\n                    </button>\n                \n                    <button\n                        type=\"button\"\n                        class=\"flex items-center justify-center bg-red-100 p-1 hover:bg-red-200 ltr:rounded-r-md rtl:rounded-l-md\"\n                        @click=\"cancel\"\n                    >\n                        <i class=\"icon-cross-large text-md cursor-pointer font-bold text-red-600 dark:!text-red-600\" />\n                    </button>\n                </div>\n\n                <x-admin::form.control-group.error ::name=\"name\"/>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-inline-image-edit', {\n            template: '#v-inline-image-edit-template',\n\n            emits: ['on-change', 'on-cancelled'],\n\n            props: {\n                name: {\n                    type: String,\n                    required: true,\n                },\n\n                value: {\n                    required: true,\n                },\n\n                rules: {\n                    type: String,\n                    default: '',\n                },\n\n                label: {\n                    type: String,\n                    default: '',\n                },\n\n                placeholder: {\n                    type: String,\n                    default: '',\n                },\n\n                position: {\n                    type: String,\n                    default: 'right',\n                },\n\n                allowEdit: {\n                    type: Boolean,\n                    default: true,\n                },\n\n                errors: {\n                    type: Object,\n                    default: {},\n                },\n\n                url: {\n                    type: String,\n                    default: '',\n                },\n            },\n\n            data() {\n                return {\n                    inputValue: this.value,\n\n                    isEditing: false,\n\n                    file: null,\n\n                    isRTL: document.documentElement.dir === 'rtl',\n                };\n            },\n\n            watch: {\n                /**\n                 * Watch the value prop.\n                 * \n                 * @param {String} newValue \n                 */\n                value(newValue) {\n                    this.inputValue = newValue;\n                },\n            },\n\n            methods: {\n                /**\n                 * Toggle the input.\n                 * \n                 * @return {void}\n                 */\n                toggle() {\n                    this.isEditing = true;\n                },\n\n                /**\n                 * Save the input value.\n                 * \n                 * @return {void}\n                 */\n                save() {\n                    if (this.errors[this.name]) {\n                        return;\n                    }\n\n                    this.isEditing = false;\n\n                    let formData = new FormData();\n\n                    formData.append(this.name, this.file);\n\n                    formData.append('_method', 'PUT');\n\n                    if (this.url) {\n                        this.$axios.post(this.url, formData, {\n                            headers: {\n                                'Content-Type': 'multipart/form-data'\n                            }\n                        })\n                        .then((response) => {\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                        })\n                        .catch((error) => {\n                            this.inputValue = this.value;\n\n                            this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                        });\n                    }\n\n                    this.$emit('on-change', {\n                        name: this.name,\n                        value: this.inputValue,\n                    });\n                },\n\n                /**\n                 * Cancel the input value.\n                 * \n                 * @return {void}\n                 */\n                cancel() {\n                    this.inputValue = this.value;\n\n                    this.isEditing = false;\n\n                    this.$emit('on-cancelled', {\n                        name: this.name,\n                        value: this.inputValue,\n                    });\n                },\n\n                handleChange(event) {\n                    this.file = event.target.files[0];\n\n                    this.inputValue = URL.createObjectURL(this.file);\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/lookup.blade.php",
    "content": "@props([\n    'allowEdit' => true,\n    'attribute' => [],\n])\n\n<v-inline-look-edit\n    {{ $attributes }}\n    :attribute=\"{{ json_encode($attribute) }}\"\n    :allow-edit=\"{{ $allowEdit ? 'true' : 'false' }}\"\n>\n    <div class=\"group w-full max-w-full hover:rounded-sm\">\n        <div class=\"rounded-xs flex h-[34px] items-center pl-2.5 text-left\">\n            <div class=\"shimmer h-5 w-48 rounded border border-transparent\"></div>\n        </div>\n    </div>\n</v-inline-look-edit>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-inline-look-edit-template\"\n    >\n        <div class=\"group w-full max-w-full hover:rounded-sm\">\n            <!-- Non-editing view -->\n            <div\n                v-if=\"! isEditing\"\n                class=\"flex h-[34px] items-center rounded border border-transparent transition-all\"\n                :class=\"allowEdit ? 'hover:bg-gray-100 dark:hover:bg-gray-800' : ''\"\n            >\n                <x-admin::form.control-group.control\n                    type=\"hidden\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    v-model=\"inputValue\"\n                />\n\n                <div\n                    class=\"group relative h-[18px] !w-full pl-2.5\"\n                    :style=\"{ 'text-align': position }\"\n                >\n                    <span class=\"cursor-pointer truncate rounded\">\n                        <template v-if=\"isDirty\">\n                            @{{ inputValue.length > 20 ? inputValue.substring(0, 20) + '...' : inputValue }}\n                        </template>\n\n                        <template v-else>\n                            @{{ valueLabel ? valueLabel : inputValue.length > 20 ? inputValue.substring(0, 20) + '...' : inputValue }}\n                        </template>\n                    </span>\n\n                    <!-- Tooltip -->\n                    <div\n                        class=\"absolute bottom-0 mb-5 hidden flex-col group-hover:flex\"\n                        v-if=\"inputValue.length > 20\"\n                    >\n                        <span class=\"whitespace-no-wrap relative z-10 rounded-md bg-black px-4 py-2 text-xs leading-none text-white shadow-lg dark:bg-white dark:text-gray-900\">\n                            @{{ inputValue }}\n                        </span>\n\n                        <div class=\"-mt-2 ml-4 h-3 w-3 rotate-45 bg-black dark:bg-white\"></div>\n                    </div>\n                </div>\n\n                <template v-if=\"allowEdit\">\n                    <i\n                        @click=\"toggle\"\n                        class=\"icon-edit cursor-pointer rounded p-0.5 text-2xl opacity-0 hover:bg-gray-200 group-hover:opacity-100 dark:hover:bg-gray-950 ltr:mr-1 rtl:ml-1\"\n                    ></i>\n                </template>\n            </div>\n\n            <!-- Editing view -->\n            <div\n                class=\"relative flex w-full flex-col\"\n                ref=\"dropdownContainer\"\n                v-else\n            >\n                <x-admin::form.control-group.control\n                    type=\"text\"\n                    ::name=\"name\"\n                    class=\"!h-[34px] w-full cursor-pointer !py-0 text-gray-800 dark:text-white ltr:pr-20 rtl:pl-20\"\n                    ::placeholder=\"placeholder\"\n                    v-model=\"selectedItem.name\"\n                    @click=\"toggleEditor\"\n                    readonly\n                />\n\n                <span class=\"pointer-events-none absolute inset-y-0 flex items-center ltr:right-0 ltr:pr-14 rtl:left-0 rtl:pl-14\">\n                    <div class=\"flex items-center justify-center space-x-1\">\n                        <div\n                            class=\"relative\"\n                            v-if=\"isSearching\"\n                        >\n                            <x-admin::spinner />\n                        </div>\n\n                        <i\n                            class=\"text-2xl\"\n                            :class=\"showPopup ? 'icon-up-arrow': 'icon-down-arrow'\"\n                        ></i>\n                    </div>\n                </span>\n\n                <!-- Popup Box -->\n                <div\n                    v-if=\"showPopup\"\n                    class=\"absolute z-10 mt-1 w-full origin-top transform rounded-lg border border-gray-200 bg-white p-2 shadow-lg transition-transform dark:border-gray-800 dark:bg-gray-800\"\n                    :class=\"dropdownPosition === 'bottom' ? 'top-full mt-1' : 'bottom-full mb-1'\"\n                >\n                    <!-- Search Bar -->\n                    <input\n                        type=\"text\"\n                        v-model.lazy=\"searchTerm\"\n                        v-debounce=\"200\"\n                        class=\"!mb-2 w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                        placeholder=\"@lang('admin::app.components.lookup.search')\"\n                        ref=\"searchInput\"\n                    />\n\n                    <!-- Results List -->\n                    <ul class=\"max-h-40 divide-y divide-gray-100 overflow-y-auto\">\n                        <li\n                            v-for=\"item in filteredResults\"\n                            :key=\"item.id\"\n                            class=\"cursor-pointer px-4 py-2 text-gray-800 transition-colors hover:bg-blue-100 dark:text-white dark:hover:bg-gray-950\"\n                            @click=\"selectItem(item)\"\n                        >\n                            @{{ item.name }}\n                        </li>\n\n                        <li v-if=\"filteredResults.length === 0\" class=\"px-4 py-2 text-center text-gray-500 dark:text-gray-300\">\n                            @lang('admin::app.components.lookup.no-results')\n                        </li>\n                    </ul>\n                </div>\n\n                <!-- Action Buttons -->\n                <div class=\"absolute top-1/2 flex -translate-y-1/2 transform gap-0.5 bg-white dark:bg-gray-900 ltr:right-2 rtl:left-2\">\n                    <button\n                        type=\"button\"\n                        class=\"flex items-center justify-center bg-green-100 p-1 hover:bg-green-200 ltr:rounded-l-md rtl:rounded-r-md\"\n                        @click=\"save\"\n                    >\n                        <i class=\"icon-tick text-md cursor-pointer font-bold text-green-600 dark:!text-green-600\" />\n                    </button>\n\n                    <button\n                        type=\"button\"\n                        class=\"item-center flex justify-center bg-red-100 p-1 hover:bg-red-200 ltr:rounded-r-md rtl:rounded-l-md\"\n                        @click=\"cancel\"\n                    >\n                        <i class=\"icon-cross-large text-md cursor-pointer font-bold text-red-600 dark:!text-red-600\" />\n                    </button>\n                </div>\n\n                <x-admin::form.control-group.error ::name=\"name\"/>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-inline-look-edit', {\n            template: '#v-inline-look-edit-template',\n\n            emits: ['on-change', 'on-cancelled'],\n\n            props: {\n                name: {\n                    type: String,\n                    required: true,\n                },\n\n                value: {\n                    required: true,\n                },\n\n                position: {\n                    type: String,\n                    default: 'right',\n                },\n\n                errors: {\n                    type: Object,\n                    default: {},\n                },\n\n                attribute: {\n                    type: Object,\n                    default: () => ({}),\n                },\n\n                allowEdit: {\n                    type: Boolean,\n                    default: true,\n                },\n\n                placeholder: {\n                    type: String,\n                    default: 'Search...',\n                },\n\n                url: {\n                    type: String,\n                    default: '',\n                },\n\n                valueLabel: {\n                    type: String,\n                    default: '',\n                },\n            },\n\n            data() {\n                return {\n                    inputValue: this.value ?? '',\n\n                    isEditing: false,\n\n                    isDirty: false,\n\n                    showPopup: false,\n\n                    searchTerm: '',\n\n                    selectedItem: {},\n\n                    searchedResults: [],\n\n                    isSearching: false,\n\n                    cancelToken: null,\n\n                    isDropdownOpen: false,\n\n                    dropdownPosition: \"bottom\",\n\n                    isRTL: document.documentElement.dir === 'rtl',\n                };\n            },\n\n            watch: {\n                /**\n                 * Watch the value prop.\n                 *\n                 * @param {String} newValue\n                 */\n                value(newValue) {\n                    this.inputValue = newValue;\n                },\n\n                searchTerm(newVal, oldVal) {\n                    this.search();\n                },\n            },\n\n            mounted() {\n                window.addEventListener(\"resize\", this.setDropdownPosition);\n\n                this.$emitter.on('show-pop', this.handleShowPop);\n            },\n\n            computed: {\n                src() {\n                    return `{{ route('admin.settings.attributes.lookup') }}/${this.attribute.lookup_type}`;\n                },\n\n                /**\n                 * Filter the searchedResults based on the search query.\n                 *\n                 * @return {Array}\n                 */\n                filteredResults() {\n                    return this.searchedResults.filter(item =>\n                        item.name.toLowerCase().includes(this.searchTerm.toLowerCase())\n                    );\n                },\n            },\n\n            methods: {\n                /**\n                 * Toggle the input.\n                 *\n                 * @return {void}\n                 */\n                toggle() {\n                    this.isEditing = true;\n\n                    this.searchTerm = '';\n\n                    this.selectedItem.name = this.inputValue;\n\n                    this.isDropdownOpen = ! this.isDropdownOpen;\n\n                    if (this.isDropdownOpen) {\n                        this.setDropdownPosition();\n                    }\n                },\n\n                toggleEditor() {\n                    this.$emitter.emit('show-pop', this.$.uid);\n                },\n\n                handleShowPop(uid) {\n                    this.showPopup = (uid === this.$.uid);\n\n                    if (this.showPopup) {\n                        this.$nextTick(() => this.$refs.searchInput?.focus());\n                    } else {\n                        this.isEditing = false;\n                    }\n                },\n\n                /**\n                 * Save the input value.\n                 *\n                 * @return {void}\n                 */\n                save() {\n                    if (this.errors[this.name]) {\n                        return;\n                    }\n\n                    this.isEditing = false;\n\n                    if (this.selectedItem.id === undefined) {\n                        return;\n                    }\n\n                    this.isDirty = true;\n\n                    this.inputValue = this.selectedItem.name;\n\n                    if (this.url) {\n                        this.$axios.put(this.url, {\n                                [this.name]: this.selectedItem.id,\n                            })\n                            .then((response) => {\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch((error) => {\n                                this.isDirty = false;\n\n                                this.inputValue = this.value;\n\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                            });\n                    }\n\n                    this.$emit('on-change', {\n                        name: this.name,\n                        value: this.selectedItem.id,\n                    });\n                },\n\n                /**\n                 * Select an item from the list.\n                 *\n                 * @param {Object} item\n                 *\n                 * @return {void}\n                 */\n                selectItem(item) {\n                    this.showPopup = false;\n\n                    this.searchTerm = '';\n\n                    this.selectedItem = item;\n                },\n\n                /**\n                 * Cancel the input value.\n                 *\n                 * @return {void}\n                 */\n                cancel() {\n                    if (this.selectItem) {\n                        this.inputValue = this.selectedItem.name;\n                    }\n\n                    this.isEditing = false;\n\n                    this.$emit('on-cancelled', this.inputValue);\n                },\n\n                /**\n                 * Initialize the items.\n                 *\n                 * @return {void}\n                 */\n                search() {\n                    if (this.searchTerm.length <= 2) {\n                        this.searchedResults = [];\n\n                        this.isSearching = false;\n\n                        return;\n                    }\n\n                    this.isSearching = true;\n\n                    if (this.cancelToken) {\n                        this.cancelToken.cancel();\n                    }\n\n                    this.cancelToken = this.$axios.CancelToken.source();\n\n                    this.$axios.get(this.src, {\n                            params: {\n                                ...this.params,\n                                query: this.searchTerm\n                            },\n                            cancelToken: this.cancelToken.token,\n                        })\n                        .then(response => {\n                            this.searchedResults = response.data;\n                        })\n                        .catch(error => {\n                            if (! this.$axios.isCancel(error)) {\n                                console.error(\"Search request failed:\", error);\n                            }\n\n                            this.isSearching = false;\n                        })\n                        .finally(() => this.isSearching = false);\n                },\n\n                setDropdownPosition() {\n                    this.$nextTick(() => {\n                        const dropdownContainer = this.$refs.dropdownContainer;\n\n                        if (! dropdownContainer) {\n                            return;\n                        }\n\n                        const dropdownRect = dropdownContainer.getBoundingClientRect();\n                        const viewportHeight = window.innerHeight;\n\n                        if (dropdownRect.bottom + 250 > viewportHeight) {\n                            this.dropdownPosition = \"top\";\n                        } else {\n                            this.dropdownPosition = \"bottom\";\n                        }\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/multiselect.blade.php",
    "content": "@props([\n    'allowEdit' => true,\n    'data' => [],\n])\n\n<v-inline-multi-select-edit\n    {{ $attributes->except('data') }}\n    :data=\"{{ json_encode($data) }}\"\n    :allow-edit=\"{{ $allowEdit ? 'true' : 'false' }}\"\n>\n    <div class=\"group w-full max-w-full hover:rounded-sm\">\n        <div class=\"rounded-xs flex h-[34px] items-center pl-2.5 text-left\">\n            <div class=\"shimmer h-5 w-48 rounded border border-transparent\"></div>\n        </div>\n    </div>\n</v-inline-multi-select-edit>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-inline-multi-select-edit-template\"\n    >\n        <div class=\"group w-full max-w-full hover:rounded-sm\">\n            <!-- Non-editing view -->\n            <div\n                v-if=\"! isEditing\"\n                class=\"flex h-[34px] items-center rounded border border-transparent transition-all\"\n                :class=\"allowEdit ? 'hover:bg-gray-100 dark:hover:bg-gray-800' : ''\"\n            >\n                <x-admin::form.control-group.control\n                    type=\"hidden\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    v-model=\"inputValue\"\n                />\n\n                <div\n                    class=\"group relative h-[18px] !w-full pl-2.5\"\n                    :style=\"{ 'text-align': position }\"\n                >\n                    <span class=\"cursor-pointer truncate rounded\">\n                        @{{ valueLabel ? valueLabel : selectedValue?.length > 20 ? selectedValue.substring(0, 20) + '...' : selectedValue }}\n                    </span>\n                    \n                    <!-- Tooltip -->\n                    <div\n                        class=\"absolute bottom-0 mb-5 hidden flex-col group-hover:flex\"\n                        v-if=\"selectedValue?.length > 20\"\n                    >\n                        <span class=\"whitespace-no-wrap relative z-10 rounded-md bg-black px-4 py-2 text-xs leading-none text-white shadow-lg dark:bg-white dark:text-gray-900\">\n                            @{{ selectedValue }}\n                        </span>\n\n                        <div class=\"-mt-2 ml-4 h-3 w-3 rotate-45 bg-black dark:bg-white\"></div>\n                    </div>\n                </div>\n\n                <template v-if=\"allowEdit\">\n                    <i\n                        @click=\"toggle\"\n                        class=\"icon-edit phttp://192.168.15.43/test/-0.5 cursor-pointer rounded text-2xl opacity-0 hover:bg-gray-200 group-hover:opacity-100 dark:hover:bg-gray-950 ltr:mr-1 rtl:ml-1\"\n                    ></i>\n                </template>\n            </div>\n\n            <x-admin::form.control-group.error ::name=\"name\"/>\n        </div>\n\n        <!-- Editing view -->\n        <div\n            class=\"relative flex w-full flex-col\"\n            ref=\"dropdownContainer\"\n            v-if=\"isEditing\"\n        >\n            <div class=\"flex min-h-[38px] w-full items-center rounded border border-gray-200 px-2.5 py-1.5 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400 ltr:pr-16 rtl:pl-16\">\n                <ul class=\"flex flex-wrap items-center gap-1\">\n                    <li\n                        v-for=\"option in tempOptions\"\n                        :key=\"option.id\"\n                        class=\"flex items-center gap-1 rounded-md bg-slate-100 pl-2 dark:bg-gray-800 dark:text-white\"\n                    >\n                        <input\n                            type=\"hidden\"\n                            :name=\"name\"\n                            :value=\"option\"\n                        />\n                \n                        <div\n                            class=\"relative h-[18px] pl-2.5\"\n                            :style=\"{ 'text-align': position }\"\n                        >\n                            <!-- Wrap the text and tooltip in a group class for hover tracking -->\n                            <div class=\"group\">\n                                <!-- Truncated text -->\n                                <p class=\"max-w-[110px] cursor-pointer truncate\">@{{ option.name }}</p>\n                \n                                <!-- Tooltip that shows on hover over the truncated text -->\n                                <div\n                                    class=\"absolute bottom-0 mb-5 hidden flex-col group-hover:flex\"\n                                    v-if=\"option.name?.length > 20\"\n                                >\n                                    <span\n                                        class=\"whitespace-no-wrap relative z-20 rounded-md bg-black px-4 py-2 text-xs leading-none text-white shadow-lg dark:bg-white dark:text-gray-900\"\n                                    >\n                                        @{{ option.name }}\n                                    </span>\n                \n                                    <div class=\"-mt-2 ml-4 h-3 w-3 rotate-45 bg-black dark:bg-white\"></div>\n                                </div>\n                            </div>\n                        </div>\n                \n                        <!-- Cross icon for removing option -->\n                        <span\n                            class=\"icon-cross-large cursor-pointer p-0.5 text-xl\"\n                            @click=\"removeOption(option)\"\n                        ></span>\n                    </li>\n                </ul>\n            </div>\n\n            <!-- Dropdown (position dynamic based on space) -->\n            <div\n                class=\"absolute z-10 w-full origin-top transform rounded-lg border bg-white shadow-lg dark:border-gray-800 dark:bg-gray-800\"\n                :class=\"dropdownPosition === 'bottom' ? 'top-full mt-1' : 'bottom-full mb-1'\"\n                v-if=\"options.length > 0\"\n            >\n                <!-- Results List -->\n                <ul class=\"max-h-40 divide-gray-100 overflow-y-auto p-0.5\">\n                    <li \n                        v-for=\"option in options\" \n                        :key=\"option.id\"\n                        class=\"cursor-pointer rounded px-4 py-2 text-gray-800 transition-colors hover:bg-blue-100 dark:text-white dark:hover:bg-gray-950 ltr:pr-16 rtl:pl-16\"\n                        @click=\"addOption(option)\"\n                    >\n                        @{{ option.name }}\n                    </li>\n                </ul>\n            </div>\n                \n            <!-- Action Buttons -->\n            <div class=\"absolute top-1/2 flex -translate-y-1/2 transform gap-0.5 ltr:right-2 rtl:left-2\">\n                <button\n                    type=\"button\"\n                    class=\"flex items-center justify-center bg-green-100 p-1 hover:bg-green-200 ltr:rounded-l-md rtl:rounded-r-md\"\n                    @click=\"save\"\n                >\n                    <i class=\"icon-tick text-md cursor-pointer font-bold text-green-600 dark:!text-green-600\" />\n                </button>\n            \n                <button\n                    type=\"button\"\n                    class=\"flex items-center justify-center bg-red-100 p-1 hover:bg-red-200 ltr:rounded-r-md rtl:rounded-l-md\"\n                    @click=\"cancel\"\n                >\n                    <i class=\"icon-cross-large text-md cursor-pointer font-bold text-red-600 dark:!text-red-600\" />\n                </button>\n            </div>\n        </div>\n\n    </script>\n\n    <script type=\"module\">\n        app.component('v-inline-multi-select-edit', {\n            template: '#v-inline-multi-select-edit-template',\n\n            emits: ['options-updated'],\n\n            props: {\n                name: {\n                    type: String,\n                    required: true,\n                },\n\n                value: {\n                    required: true,\n                },\n\n                rules: {\n                    type: String,\n                    default: '',\n                },\n\n                label: {\n                    type: String,\n                    default: '',\n                },\n\n                placeholder: {\n                    type: String,\n                    default: '',\n                },\n\n                position: {\n                    type: String,\n                    default: 'right',\n                },\n\n                allowEdit: {\n                    type: Boolean,\n                    default: true,\n                },\n\n                errors: {\n                    type: Object,\n                    default: {},\n                },\n\n                data: {\n                    type: Array,\n                    required: true,\n                },\n\n                url: {\n                    type: String,\n                    default: '',\n                },\n\n                valueLabel: {\n                    type: String,\n                    default: '',\n                },\n            },\n\n            data() {\n                return {\n                    inputValue: this.value,\n\n                    isEditing: false,\n\n                    options: this.data ?? [],\n\n                    tempOptions: [],\n\n                    isRTL: document.documentElement.dir === 'rtl',\n\n                    isDropdownOpen: false,\n\n                    dropdownPosition: \"bottom\",\n                };\n            },\n\n            mounted() {\n                this.tempOptions = this.options.filter((data) => this.value.includes(data.id));\n\n                this.options = this.options.filter((data) => !this.value.includes(data.id));\n\n                window.addEventListener(\"resize\", this.setDropdownPosition);\n            },\n\n            computed: {\n                /**\n                 * Get the selected value.\n                 * \n                 * @return {Object}\n                 */\n                selectedValue() {                    \n                    if (this.tempOptions.length === 0) {\n                        return null;\n                    }\n\n                    return this.tempOptions.map((data) => data.name).join(', ');\n                },\n            },\n\n            methods: {\n                /**\n                 * Toggle the input.\n                 * \n                 * @return {void}\n                 */\n                toggle() {\n                    this.isEditing = true;\n\n                    this.isDropdownOpen = ! this.isDropdownOpen;\n\n                    if (this.isDropdownOpen) {\n                        this.setDropdownPosition();\n                    }\n                },\n\n                /**\n                 * Save the input value.\n                 * \n                 * @return {void}\n                 */\n                save() {\n                    if (this.errors[this.name]) {\n                        return;\n                    }\n\n                    this.isEditing = false;\n\n                    if (this.url) {\n                        this.$axios.put(this.url, {\n                                [this.name]: this.tempOptions.map((data) => data.id),\n                            })\n                            .then((response) => {\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch((error) => {\n                                this.inputValue = this.value;\n\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                            });                        \n                    }\n\n                    this.$emit('options-updated', {\n                        name: this.name,\n                        value: this.tempOptions.map((data) => data.id),\n                    });\n                },\n\n                /**\n                 * Cancel the input value.\n                 * \n                 * @return {void}\n                 */\n                cancel() {\n                    this.isEditing = false;\n\n                    this.$emit('options-updated', {\n                        name: this.name,\n                        value: this.tempOptions.map((data) => data.id),\n                    });\n                },\n\n                addOption(option) {\n                    if (!this.tempOptions.some((data) => data.id === option.id)) {\n                        this.tempOptions.push(option);\n\n                        this.options = this.options.filter((data) => data.id !== option.id);\n\n                        this.input = '';\n                    }\n                },\n\n                removeOption(option) {\n                    if (!this.options.some((data) => data.id === option.id)) {\n                        this.options.push(option);\n\n                        this.tempOptions = this.tempOptions.filter((data) => data.id !== option.id);\n                    }\n                },\n\n                setDropdownPosition() {\n                    this.$nextTick(() => {\n                        const dropdownContainer = this.$refs.dropdownContainer;\n\n                        if (! dropdownContainer) {\n                            return;     \n                        }\n\n                        const dropdownRect = dropdownContainer.getBoundingClientRect();\n                        const viewportHeight = window.innerHeight;\n\n                        if (dropdownRect.bottom + 250 > viewportHeight) {\n                            this.dropdownPosition = \"top\";\n                        } else {\n                            this.dropdownPosition = \"bottom\";\n                        }\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/phone.blade.php",
    "content": "@props([\n    'allowEdit' => true,\n])\n\n<v-inline-phone-edit\n    {{ $attributes->except('value') }}\n    :value={{ json_encode($attributes->get('value')) }}\n    :allow-edit=\"{{ $allowEdit ? 'true' : 'false' }}\"\n>\n    <div class=\"group w-full max-w-full hover:rounded-sm\">\n        <div class=\"rounded-xs flex h-[34px] items-center pl-2.5 text-left\">\n            <div class=\"shimmer h-5 w-48 rounded border border-transparent\"></div>\n        </div>\n    </div>\n</v-inline-phone-edit>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-inline-phone-edit-template\"\n    >\n        <div class=\"group w-full max-w-full hover:rounded-sm\">\n            <!-- Non-editing view -->\n            <div\n                class=\"flex h-[34px] items-center rounded border border-transparent transition-all\"\n                :class=\"allowEdit ? 'hover:bg-gray-100 dark:hover:bg-gray-800' : ''\"\n            >\n                <div \n                    class=\"group relative !w-full pl-2.5\"\n                    :style=\"{ 'text-align': position }\"\n                >\n                    <span class=\"cursor-pointer truncate rounded\">\n                        @{{ valueLabel ? valueLabel : inputValue.map(item => `${item.value}(${item.label})`).join(', ').length > 20 ? inputValue.map(item => `${item.value}(${item.label})`).join(', ').substring(0, 20) + '...' : inputValue.map(item => `${item.value}(${item.label})`).join(', ') }}\n                    </span>\n\n                    <div\n                        class=\"absolute bottom-0 mb-5 hidden flex-col group-hover:flex\"\n                        v-if=\"inputValue.map(item => `${item.value}(${item.label})`).join(', ').length > 20\"\n                    >\n                        <span class=\"whitespace-no-wrap relative z-10 rounded-md bg-black px-4 py-2 text-xs leading-none text-white shadow-lg dark:bg-white dark:text-gray-900\">\n                            @{{ inputValue.map(item => `${item.value}(${item.label})`).join(', \\n') }}\n                        </span>\n\n                        <div class=\"-mt-2 ml-4 h-3 w-3 rotate-45 bg-black dark:bg-white\"></div>\n                    </div>\n                </div>\n\n                <template v-if=\"allowEdit\">\n                    <i\n                        @click=\"toggle\"\n                        class=\"icon-edit cursor-pointer rounded p-0.5 text-2xl opacity-0 hover:bg-gray-200 group-hover:opacity-100 dark:hover:bg-gray-950 ltr:mr-1 rtl:ml-1\"\n                    ></i>\n                </template>\n            </div>\n\n            <Teleport to=\"body\">\n                <x-admin::form\n                    v-slot=\"{ meta, errors, handleSubmit }\"\n                    as=\"div\"\n                    ref=\"modalForm\"\n                >\n                    <form @submit=\"handleSubmit($event, updateOrCreate)\">\n                        <!-- Editing view -->\n                        <x-admin::modal ref=\"phoneNumberModal\">\n                            <!-- Modal Header -->\n                            <x-slot:header>\n                                <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                                    @lang(\"admin::app.common.custom-attributes.update-contact-title\")\n                                </p>\n                            </x-slot>\n\n                            <!-- Modal Content -->\n                            <x-slot:content>\n                                <template v-for=\"(contactNumber, index) in contactNumbers\">\n                                    <div class=\"mb-2 flex items-center\">\n                                        <x-admin::form.control-group.control\n                                            type=\"text\"\n                                            ::id=\"`${name}[${index}].value`\"\n                                            ::name=\"`${name}[${index}].value`\"\n                                            class=\"!rounded-r-none\"\n                                            ::rules=\"getValidation\"\n                                            :label=\"trans('admin::app.common.custom-attributes.contact')\"\n                                            v-model=\"contactNumber.value\"\n                                        />\n\n                                        <div class=\"relative\">\n                                            <x-admin::form.control-group.control\n                                                type=\"select\"\n                                                ::id=\"`${name}[${index}].label`\"\n                                                ::name=\"`${name}[${index}].label`\"\n                                                class=\"!w-24 !rounded-l-none\"\n                                                ::value=\"contactNumber.label\"\n                                            >\n                                                <option value=\"work\">@lang('admin::app.common.custom-attributes.work')</option>\n                                                <option value=\"home\">@lang('admin::app.common.custom-attributes.home')</option>\n                                            </x-admin::form.control-group.control>\n                                        </div>\n\n                                        <i\n                                            v-if=\"contactNumbers.length > 1\"\n                                            class=\"icon-delete ml-1 cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                                            @click=\"remove(contactNumber)\"\n                                        ></i>\n                                    </div>\n                        \n                                    <x-admin::form.control-group.error ::name=\"`${name}[${index}].value`\"/>\n                                </template>\n                        \n                                <button\n                                    type=\"button\"\n                                    class=\"flex max-w-max items-center gap-2 text-brandColor\"\n                                    @click=\"add\"\n                                >\n                                    <i class=\"icon-add text-md !text-brandColor\"></i>\n\n                                    @lang(\"admin::app.common.custom-attributes.add-more\")\n                                </button>\n                            </x-slot>\n\n                            <!-- Modal Footer -->\n                            <x-slot:footer>\n                                <!-- Save Button -->\n                                <x-admin::button\n                                    button-type=\"submit\"\n                                    class=\"primary-button justify-center\"\n                                    :title=\"trans('admin::app.common.custom-attributes.save')\"\n                                    ::loading=\"isProcessing\"\n                                    ::disabled=\"isProcessing\"\n                                />\n                            </x-slot>\n                        </x-admin::modal>\n                    </form>\n                </x-admin::form>\n            </Teleport>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-inline-phone-edit', {\n            template: '#v-inline-phone-edit-template',\n\n            emits: ['on-save'],\n\n            props: {\n                name: {\n                    type: String,\n                    required: true,\n                },\n\n                value: {\n                    required: true,\n                },\n\n                rules: {\n                    type: String,\n                    default: '',\n                },\n\n                label: {\n                    type: String,\n                    default: '',\n                },\n\n                placeholder: {\n                    type: String,\n                    default: '',\n                },\n\n                position: {\n                    type: String,\n                    default: 'right',\n                },\n\n                allowEdit: {\n                    type: Boolean,\n                    default: true,\n                },\n\n                errors: {\n                    type: Object,\n                    default: {},\n                },\n\n                url: {\n                    type: String,\n                    default: '',\n                },\n\n                valueLabel: {\n                    type: String,\n                    default: '',\n                },\n            },\n\n            data() {\n                return {\n                    inputValue: this.value,\n\n                    isEditing: false,\n\n                    contactNumbers: JSON.parse(JSON.stringify(this.value || [{'value': '', 'label': 'work'}])),\n\n                    isProcessing: false,\n\n                    isRTL: document.documentElement.dir === 'rtl',\n                };\n            },\n\n            watch: {\n                /**\n                 * Watch the value prop.\n                 * \n                 * @param {String} newValue \n                 */\n                value(newValue, oldValue) {\n                    if (JSON.stringify(newValue) !== JSON.stringify(oldValue)) {\n                        this.contactNumbers = newValue || [{'value': '', 'label': 'work'}];\n                    }\n                },\n            },\n\n            created() {\n                this.extendValidations();\n\n                if (! this.contactNumbers || ! this.contactNumbers.length) {\n                    this.contactNumbers = [{\n                        'value': '',\n                        'label': 'work'\n                    }];\n                }\n            },\n\n            computed: {\n                /**\n                 * Get the validation rules.\n                 * \n                 * @return {Object}\n                 */\n                getValidation() {\n                    return {\n                        phone: true,\n                        unique_contact_number: this.contactNumbers ?? [],\n                        required: true,\n                    };\n                },\n            },\n\n            methods: {\n                /**\n                 * Toggle the input.\n                 * \n                 * @return {void}\n                 */\n                toggle() {\n                    this.isEditing = true;\n\n                    this.$refs.phoneNumberModal.toggle();\n                },\n\n                add() {\n                    this.contactNumbers.push({\n                        'value': '',\n                        'label': 'work'\n                    });\n                },\n\n                remove(contactNumber) {\n                    this.contactNumbers = this.contactNumbers.filter(number => number !== contactNumber);\n                },\n\n                extendValidations() {\n                    defineRule('unique_contact_number', (value, contactNumbers) => {\n                        if (\n                            ! value\n                            || ! value.length\n                        ) {\n                            return true;\n                        }\n\n                        const phoneOccurrences = contactNumbers.filter(contactNumber => contactNumber.value === value).length;\n\n                        if (phoneOccurrences > 1) {\n                            return 'This phone number is already used';\n                        }\n\n                        return true;\n                    });\n                },\n\n                updateOrCreate(params) {\n                    this.inputValue = params.contact_numbers || this.inputValue;\n\n                    if (this.url) {\n                        this.isProcessing = true;\n\n                        this.$axios.put(this.url, {\n                                [this.name]: this.inputValue,\n                            })\n                            .then((response) => {\n                                this.contactNumbers = response.data.data.contact_numbers || this.contactNumbers;\n\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch((error) => {\n                                this.inputValue = this.value;\n\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                            })\n                            .finally(() => {\n                                this.isProcessing = false;\n                            });\n                    }\n\n                    this.$emit('on-save', params);\n\n                    this.$refs.phoneNumberModal.toggle();\n                }\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/select.blade.php",
    "content": "@props([\n    'allowEdit' => true,\n    'options' => [],\n])\n\n<v-inline-select-edit\n    {{ $attributes->except('options') }}\n    :options=\"{{ json_encode($options) }}\"\n    :allow-edit=\"{{ $allowEdit ? 'true' : 'false' }}\"\n>\n    <div class=\"group w-full max-w-full hover:rounded-sm\">\n        <div class=\"rounded-xs flex h-[34px] items-center pl-2.5 text-left\">\n            <div class=\"shimmer h-5 w-48 rounded border border-transparent\"></div>\n        </div>\n    </div>\n</v-inline-select-edit>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-inline-select-edit-template\"\n    >\n        <div class=\"group w-full max-w-full hover:rounded-sm\">\n            <!-- Non-editing view -->\n            <div\n                v-if=\"! isEditing\"\n                class=\"flex h-[34px] items-center rounded border border-transparent transition-all\"\n                :class=\"allowEdit ? 'hover:bg-gray-100 dark:hover:bg-gray-800' : ''\"\n            >\n                <x-admin::form.control-group.control\n                    type=\"hidden\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    v-model=\"inputValue\"\n                />\n\n                <div\n                    class=\"group relative !w-full pl-2.5\"\n                    :style=\"{ 'text-align': position }\"\n                >\n                    <span class=\"cursor-pointer truncate rounded\">\n                        @{{ valueLabel ? valueLabel : selectedValue?.name.length > 20 ? selectedValue?.name.substring(0, 20) + '...' : selectedValue?.name }}\n                    </span>\n                    \n                    <!-- Tooltip -->\n                    <div\n                        class=\"absolute bottom-0 mb-5 hidden flex-col group-hover:flex\"\n                        v-if=\"selectedValue?.name.length > 20\"\n                    >\n                        <span class=\"whitespace-no-wrap relative z-10 rounded-md bg-black px-4 py-2 text-xs leading-none text-white shadow-lg dark:bg-white dark:text-gray-900\">\n                            @{{ selectedValue?.name }}\n                        </span>\n\n                        <div class=\"-mt-2 ml-4 h-3 w-3 rotate-45 bg-black dark:bg-white\"></div>\n                    </div>\n                </div>\n\n                <template v-if=\"allowEdit\">\n                    <i\n                        @click=\"toggle\"\n                        class=\"icon-edit cursor-pointer rounded p-0.5 text-2xl opacity-0 hover:bg-gray-200 group-hover:opacity-100 dark:hover:bg-gray-950 ltr:mr-1 rtl:ml-1\"\n                    ></i>\n                </template>\n            </div>\n        \n            <!-- Editing view -->\n            <div\n                class=\"relative w-full\"\n                v-else\n            >\n                <x-admin::form.control-group.control\n                    type=\"select\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    ::rules=\"rules\"\n                    ::label=\"label\"\n                    class=\"!h-[34px] !py-0 ltr:pr-20 rtl:pl-20\"\n                    ::placeholder=\"placeholder\"\n                    v-model=\"inputValue\"\n                >\n                    <option\n                        v-for=\"(option, index) in options\"\n                        :key=\"option.id\"\n                        :value=\"option.id\"\n                    >\n                        @{{ option.name }}\n                    </option>\n                </x-admin::form.control-group.control>\n                    \n                <!-- Action Buttons -->\n                <div class=\"absolute top-1/2 flex -translate-y-1/2 transform items-center gap-0.5 ltr:right-2 rtl:left-2\">\n                    <i class=\"icon-down-arrow text-2xl\" />\n\n                    <button\n                        type=\"button\"\n                        class=\"flex items-center justify-center bg-green-100 p-1 hover:bg-green-200 ltr:rounded-l-md rtl:rounded-r-md\"\n                        @click=\"save\"\n                    >\n                        <i class=\"icon-tick text-md cursor-pointer font-bold text-green-600 dark:!text-green-600\" />\n                    </button>\n                \n                    <button\n                        type=\"button\"\n                        class=\"flex items-center justify-center bg-red-100 p-1 hover:bg-red-200 ltr:rounded-r-md rtl:rounded-l-md\"\n                        @click=\"cancel\"\n                    >\n                        <i class=\"icon-cross-large text-md cursor-pointer font-bold text-red-600 dark:!text-red-600\" />\n                    </button>\n                </div>\n            </div>\n\n            <x-admin::form.control-group.error ::name=\"name\"/>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-inline-select-edit', {\n            template: '#v-inline-select-edit-template',\n\n            emits: ['on-change', 'on-cancelled'],\n\n            props: {\n                name: {\n                    type: String,\n                    required: true,\n                },\n\n                value: {\n                    required: true,\n                },\n\n                rules: {\n                    type: String,\n                    default: '',\n                },\n\n                label: {\n                    type: String,\n                    default: '',\n                },\n\n                placeholder: {\n                    type: String,\n                    default: '',\n                },\n\n                position: {\n                    type: String,\n                    default: 'right',\n                },\n\n                allowEdit: {\n                    type: Boolean,\n                    default: true,\n                },\n\n                errors: {\n                    type: Object,\n                    default: {},\n                },\n\n                options: {\n                    type: Array,\n                    required: true,\n                },\n\n                url: {\n                    type: String,\n                    default: '',\n                },\n\n                valueLabel: {\n                    type: String,\n                    default: '',\n                },\n            },\n\n            data() {\n                return {\n                    inputValue: this.value,\n\n                    isEditing: false,\n\n                    isRTL: document.documentElement.dir === 'rtl',\n                };\n            },\n\n            watch: {\n                /**\n                 * Watch the value prop.\n                 * \n                 * @param {String} newValue \n                 */\n                value(newValue) {\n                    this.inputValue = newValue;\n                },\n            },\n\n            computed: {\n                /**\n                 * Get the selected value.\n                 * \n                 * @return {Object}\n                 */\n                selectedValue() {\n                    return this.options.find((option, index) => option.id == this.inputValue);\n                },\n            },\n\n            methods: {\n                /**\n                 * Toggle the input.\n                 * \n                 * @return {void}\n                 */\n                toggle() {\n                    this.isEditing = true;\n                },\n\n                /**\n                 * Save the input value.\n                 * \n                 * @return {void}\n                 */\n                save() {\n                    if (this.errors[this.name]) {\n                        return;\n                    }\n\n                    this.isEditing = false;\n\n                    if (this.url) {\n                        this.$axios.put(this.url, {\n                                [this.name]: this.inputValue,\n                            })\n                            .then((response) => {\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch((error) => {\n                                this.inputValue = this.value;\n\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                            });                        \n                    }\n\n                    this.$emit('on-change', {\n                        name: this.name,\n                        value: this.inputValue,\n                    });\n                },\n\n                /**\n                 * Cancel the input value.\n                 * \n                 * @return {void}\n                 */\n                cancel() {\n                    this.inputValue = this.value;\n\n                    this.isEditing = false;\n\n                    this.$emit('on-cancelled', {\n                        name: this.name,\n                        value: this.inputValue,\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/inline/text.blade.php",
    "content": "@props([\n    'allowEdit' => true,\n])\n\n<v-inline-text-edit\n    {{ $attributes }}\n    :allow-edit=\"{{ $allowEdit ? 'true' : 'false' }}\"\n>\n    <div class=\"group w-full max-w-full hover:rounded-sm\">\n        <div class=\"rounded-xs flex h-[34px] items-center pl-2.5 text-left\">\n            <div class=\"shimmer h-5 w-48 rounded border border-transparent\"></div>\n        </div>\n    </div>\n</v-inline-text-edit>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-inline-text-edit-template\"\n    >\n        <div class=\"group w-full max-w-full hover:rounded-sm\">\n            <!-- Non-editing view -->\n            <div\n                v-if=\"! isEditing\"\n                class=\"flex h-[34px] items-center rounded border border-transparent transition-all\"\n                :class=\"allowEdit ? 'hover:bg-gray-100 dark:hover:bg-gray-800' : ''\"\n            >\n                <x-admin::form.control-group.control\n                    type=\"hidden\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    v-model=\"inputValue\"\n                />\n\n                <div\n                    class=\"group relative h-[18px] !w-full pl-2.5\"\n                    :style=\"{ 'text-align': position }\"\n                >\n                    <span class=\"cursor-pointer truncate rounded\">\n                        <template v-if=\"isDirty\">\n                            @{{\n                                inputValue.length > 20\n                                    ? inputValue.substring(0, 20) + '...'\n                                    : inputValue\n                            }}\n                        </template>\n\n                        <template v-else>\n                            @{{\n                                (valueLabel || inputValue || '').length > 20\n                                    ? (valueLabel || inputValue).substring(0, 20) + '...'\n                                    : (valueLabel || inputValue)\n                            }}\n                        </template>\n                    </span>\n\n                    <!-- Tooltip -->\n                    <div\n                        class=\"absolute bottom-0 mb-5 hidden flex-col group-hover:flex\"\n                        v-if=\"inputValue?.length > 20\"\n                    >\n                        <span class=\"whitespace-no-wrap relative z-10 rounded-md bg-black px-4 py-2 text-xs leading-none text-white shadow-lg dark:bg-white dark:text-gray-900\">\n                            @{{ inputValue }}\n                        </span>\n\n                        <div class=\"-mt-2 ml-4 h-3 w-3 rotate-45 bg-black dark:bg-white\"></div>\n                    </div>\n                </div>\n\n                <template v-if=\"allowEdit\">\n                    <i\n                        @click=\"toggle\"\n                        class=\"icon-edit cursor-pointer rounded p-0.5 text-2xl opacity-0 hover:bg-gray-200 group-hover:opacity-100 dark:hover:bg-gray-950 ltr:mr-1 rtl:ml-1\"\n                    ></i>\n                </template>\n            </div>\n\n            <!-- Editing view -->\n            <div\n                class=\"relative w-full\"\n                v-else\n            >\n                <x-admin::form.control-group.control\n                    type=\"text\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    class=\"!h-[34px] !py-0 ltr:pr-16 rtl:pl-16\"\n                    ::rules=\"rules\"\n                    ::label=\"label\"\n                    ::placeholder=\"placeholder\"\n                    v-model=\"inputValue\"\n                    ref=\"input\"\n                />\n\n                <!-- Action Buttons -->\n                <div class=\"absolute top-[6px] flex gap-0.5 ltr:right-2 rtl:left-2\">\n                    <button\n                        type=\"button\"\n                        class=\"flex items-center justify-center bg-green-100 p-1 hover:bg-green-200 ltr:rounded-l-md rtl:rounded-r-md\"\n                        @click=\"save\"\n                    >\n                        <i class=\"icon-tick text-md cursor-pointer font-bold text-green-600 dark:!text-green-600\" />\n                    </button>\n\n                    <button\n                        type=\"button\"\n                        class=\"flex items-center justify-center bg-red-100 p-1 hover:bg-red-200 ltr:rounded-r-md rtl:rounded-l-md\"\n                        @click=\"cancel\"\n                    >\n                        <i class=\"icon-cross-large text-md cursor-pointer font-bold text-red-600 dark:!text-red-600\" />\n                    </button>\n                </div>\n\n                <x-admin::form.control-group.error ::name=\"name\"/>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-inline-text-edit', {\n            template: '#v-inline-text-edit-template',\n\n            emits: ['on-change', 'on-cancelled'],\n\n            props: {\n                name: {\n                    type: String,\n                    required: true,\n                },\n\n                value: {\n                    required: true,\n                },\n\n                rules: {\n                    type: String,\n                    default: '',\n                },\n\n                label: {\n                    type: String,\n                    default: '',\n                },\n\n                placeholder: {\n                    type: String,\n                    default: '',\n                },\n\n                position: {\n                    type: String,\n                    default: 'right',\n                },\n\n                allowEdit: {\n                    type: Boolean,\n                    default: true,\n                },\n\n                errors: {\n                    type: Object,\n                    default: {},\n                },\n\n                url: {\n                    type: String,\n                    default: '',\n                },\n\n                params: {\n                    type: Object,\n                    default: () => ({}),\n                },\n\n                valueLabel: {\n                    type: String,\n                    default: '',\n                },\n            },\n\n            data() {\n                return {\n                    inputValue: this.value,\n\n                    isEditing: false,\n\n                    isDirty: false,\n\n                    isRTL: document.documentElement.dir === 'rtl',\n                };\n            },\n\n            watch: {\n                /**\n                 * Watch the value prop.\n                 *\n                 * @param {String} newValue\n                 */\n                value(newValue) {\n                    this.inputValue = newValue;\n                },\n            },\n\n            methods: {\n                /**\n                 * Toggle the input.\n                 *\n                 * @return {void}\n                 */\n                toggle() {\n                    this.isEditing = true;\n\n                    this.$nextTick(() => this.$refs.input.focus());\n                },\n\n                /**\n                 * Save the input value.\n                 *\n                 * @return {void}\n                 */\n                save() {\n                    if (this.errors[this.name]) {\n                        return;\n                    }\n\n                    this.isEditing = false;\n\n                    if (this.url) {\n                        let formData = new FormData();\n\n                        formData.append(this.name, this.inputValue);\n\n                        formData.append('_method', 'PUT');\n\n                        this.isDirty = true;\n\n                        this.$axios.post(this.url, {\n                            ...this.params,\n                            ...Object.fromEntries(formData),\n                        })\n                            .then((response) => {\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch((error) => {\n                                this.isDirty = false;\n\n                                this.inputValue = this.value;\n\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                            });\n                    }\n\n                    this.$emit('on-change', {\n                        name: this.name,\n                        value: this.inputValue,\n                    });\n                },\n\n                /**\n                 * Cancel the input value.\n                 *\n                 * @return {void}\n                 */\n                cancel() {\n                    this.inputValue = this.value;\n\n                    this.isEditing = false;\n\n                    this.$emit('on-cancelled', {\n                        name: this.name,\n                        value: this.inputValue,\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/controls/tags.blade.php",
    "content": "<v-control-tags\n    :errors=\"errors\"\n    {{ $attributes }}\n    v-bind=\"$attrs\"\n></v-control-tags>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-control-tags-template\"\n    >\n        <div \n            class=\"flex min-h-[38px] w-full items-center rounded border border-gray-200 px-2.5 py-1.5 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 dark:border-gray-800 dark:text-white dark:hover:border-gray-400\"\n            :class=\"[errors[`temp-${name}`] ? 'border !border-red-600 hover:border-red-600' : '']\"\n        >\n            <ul\n                class=\"flex flex-wrap items-center gap-1\"\n                v-bind=\"$attrs\"\n            >\n                <li\n                    v-for=\"(tag, index) in tags\"\n                    :key=\"index\"\n                    class=\"flex items-center gap-1 rounded-md bg-gray-100 dark:bg-gray-950 ltr:pl-2 rtl:pr-2\"\n                >\n                    <x-admin::form.control-group.control\n                        type=\"hidden\"\n                        ::name=\"name + '[' + index + ']'\"\n                        ::value=\"tag\"\n                    />\n\n                    @{{ tag }}\n\n                    <span\n                        class=\"icon-cross-large cursor-pointer p-0.5 text-xl\"\n                        @click=\"removeTag(tag)\"\n                    ></span>\n                </li>\n\n                <li :class=\"['w-full', tags.length && 'mt-1.5']\">\n                    <v-field\n                        v-slot=\"{ field, errors }\"\n                        :name=\"'temp-' + name\"\n                        v-model=\"input\"\n                        :rules=\"tags.length ? inputRules : [inputRules, rules].filter(Boolean).join('|')\"\n                        :label=\"label\"\n                    >\n                        <input\n                            type=\"text\"\n                            :name=\"'temp-' + name\"\n                            v-bind=\"field\"\n                            class=\"w-full dark:!bg-gray-900\"\n                            :placeholder=\"placeholder\"\n                            :label=\"label\"\n                            @keydown.enter.prevent=\"addTag\"\n                            autocomplete=\"new-email\"\n                            @blur=\"addTag\"\n                        />\n                    </v-field>\n\n                    <template v-if=\"! tags.length && input != ''\">\n                        <v-field\n                            v-slot=\"{ field, errors }\"\n                            :name=\"name + '[' + 0 +']'\"\n                            :value=\"input\"\n                            :rules=\"inputRules\"\n                            :label=\"label\"\n                        >\n                            <input\n                                type=\"hidden\"\n                                :name=\"name + '[0]'\"\n                                v-bind=\"field\"\n                            />\n                        </v-field>\n                    </template>\n                </li>\n            </ul>\n        </div>\n\n        <v-error-message\n            :name=\"'temp-' + name\"\n            v-slot=\"{ message }\"\n        >\n            <p\n                class=\"mt-1 text-xs italic text-red-600\"\n                v-text=\"message\"\n            >\n            </p>\n        </v-error-message>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-control-tags', {\n            template: '#v-control-tags-template',\n\n            props: {\n                name: {\n                    type: String,\n                    required: true,\n                },\n\n                label: {\n                    type: String,\n                    default: '',\n                },\n\n                placeholder: {\n                    type: String,\n                    default: '',\n                },\n\n                rules: {\n                    type: String,\n                    default: '',\n                },\n\n                inputRules: {\n                    type: String,\n                    default: '',\n                },\n\n                data: {\n                    type: Array,\n                    default: () => [],\n                },\n\n                errors: {\n                    type: Object,\n                    default: () => {},\n                },\n\n                allowDuplicates: {\n                    type: Boolean,\n                    default: true,\n                },\n            },\n\n            data() {\n                return {\n                    tags: this.data ? this.data : [],\n\n                    input: '',\n                }\n            },\n\n            methods: {\n                addTag() {\n                    if (this.errors['temp-' + this.name]) {\n                        return;\n                    }\n\n                    const tag = this.input.trim();\n\n                    if (! tag) {\n                        return;\n                    }\n\n                    if (\n                        ! this.allowDuplicates\n                        && this.tags.includes(tag)\n                    ) {\n                        this.input = '';\n\n                        return;\n                    }\n\n                    this.tags.push(tag);\n\n                    this.$emit('tags-updated', this.tags);\n\n                    this.input = '';\n                },\n\n                removeTag: function(tag) {\n                    this.tags = this.tags.filter(function (tempTag) {\n                        return tempTag != tag;\n                    });\n\n                    this.$emit('tags-updated', this.tags);\n                },\n            }\n        });\n    </script>\n@endpushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/error.blade.php",
    "content": "@props([\n    'name' => null,\n    'controlName' => '',\n])\n\n<v-error-message\n    {{ $attributes }}\n    name=\"{{ $name ?? $controlName }}\"\n    v-slot=\"{ message }\"\n>\n    <p\n        {{ $attributes->merge(['class' => 'mt-1 text-xs italic text-red-600']) }}\n        v-text=\"message\"\n    >\n    </p>\n</v-error-message>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/index.blade.php",
    "content": "<div {{ $attributes->merge(['class' => 'mb-4']) }}>\n    {{ $slot }}\n</div>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/control-group/label.blade.php",
    "content": "<label {{ $attributes->merge(['class' => 'mb-1.5 flex items-center gap-1 text-sm font-normal text-gray-800 dark:text-white']) }}>\n    {{ $slot }}\n</label>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/form/index.blade.php",
    "content": "<!--\n    If a component has the `as` attribute, it indicates that it uses\n    the ajaxified form or some customized slot form.\n-->\n@if ($attributes->has('as'))\n    <v-form {{ $attributes }}>\n        {{ $slot }}\n    </v-form>\n\n<!--\n    Otherwise, a traditional form will be provided with a minimal\n    set of configurations.\n-->\n@else\n    @props([\n        'method' => 'POST',\n    ])\n\n    @php\n        $method = strtoupper($method);\n    @endphp\n\n    <v-form\n        method=\"{{ $method === 'GET' ? 'GET' : 'POST' }}\"\n        :initial-errors=\"{{ json_encode($errors->getMessages()) }}\"\n        v-slot=\"{ meta, errors, setValues }\"\n        @invalid-submit=\"onInvalidSubmit\"\n        {{ $attributes }}\n    >\n        @unless(in_array($method, ['HEAD', 'GET', 'OPTIONS']))\n            @csrf\n        @endunless\n\n        @if (! in_array($method, ['GET', 'POST']))\n            @method($method)\n        @endif\n\n        {{ $slot }}\n    </v-form>\n@endif"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/layouts/anonymous.blade.php",
    "content": "<!DOCTYPE html>\n\n<html\n    lang=\"{{ app()->getLocale() }}\"\n    dir=\"{{ in_array(app()->getLocale(), ['fa', 'ar']) ? 'rtl' : 'ltr' }}\"\n>\n\n<head>\n    <title>{{ $title ?? '' }}</title>\n\n    <meta charset=\"UTF-8\">\n\n    <meta\n        http-equiv=\"X-UA-Compatible\"\n        content=\"IE=edge\"\n    >\n    <meta\n        http-equiv=\"content-language\"\n        content=\"{{ app()->getLocale() }}\"\n    >\n\n    <meta\n        name=\"viewport\"\n        content=\"width=device-width, initial-scale=1\"\n    >\n    <meta\n        name=\"base-url\"\n        content=\"{{ url()->to('/') }}\"\n    >\n    <meta\n        name=\"currency-code\"\n        {{-- content=\"{{ core()->getCurrentCurrencyCode() }}\" --}}\n    >\n\n    @stack('meta')\n\n    {{\n        vite()->set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'])\n    }}\n\n    <link\n        href=\"https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700;800&display=swap\"\n        rel=\"stylesheet\"\n    />\n\n    <link\n        href=\"https://fonts.googleapis.com/css2?family=DM+Serif+Display&display=swap\"\n        rel=\"stylesheet\"\n    />\n\n    @if ($favicon = core()->getConfigData('general.design.admin_logo.favicon'))\n        <link\n            type=\"image/x-icon\"\n            href=\"{{ Storage::url($favicon) }}\"\n            rel=\"shortcut icon\"\n            sizes=\"16x16\"\n        >\n    @else\n        <link\n            type=\"image/x-icon\"\n            href=\"{{ vite()->asset('images/favicon.ico') }}\"\n            rel=\"shortcut icon\"\n            sizes=\"16x16\"\n        />\n    @endif\n\n    @php\n        $brandColor = core()->getConfigData('general.settings.menu_color.brand_color') ?? '#0E90D9';\n    @endphp\n\n    @stack('styles')\n\n    <style>\n        :root {\n            --brand-color: {{ $brandColor }};\n        }\n\n        {!! core()->getConfigData('general.content.custom_scripts.custom_css') !!}\n    </style>\n\n    {!! view_render_event('admin.layout.head') !!}\n</head>\n\n<body>\n    {!! view_render_event('admin.layout.body.before') !!}\n\n    <div id=\"app\">\n        <!-- Flash Message Blade Component -->\n        <x-admin::flash-group />\n\n        {!! view_render_event('admin.layout.content.before') !!}\n\n        <!-- Page Content Blade Component -->\n        {{ $slot }}\n\n        {!! view_render_event('admin.layout.content.after') !!}\n    </div>\n\n    {!! view_render_event('admin.layout.body.after') !!}\n\n    @stack('scripts')\n\n    {!! view_render_event('admin.layout.vue-app-mount.before') !!}\n\n    <script>\n        /**\n         * Load event, the purpose of using the event is to mount the application\n         * after all of our `Vue` components which is present in blade file have\n         * been registered in the app. No matter what `app.mount()` should be\n         * called in the last.\n         */\n        window.addEventListener(\"load\", function(event) {\n            app.mount(\"#app\");\n        });\n    </script>\n\n    {!! view_render_event('admin.layout.vue-app-mount.after') !!}\n\n    <script type=\"text/javascript\">\n        {!! core()->getConfigData('general.content.custom_scripts.custom_javascript') !!}\n    </script>\n</body>\n\n</html>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/layouts/header/desktop/mega-search.blade.php",
    "content": "<v-mega-search>\n    <div class=\"relative flex w-[550px] max-w-[550px] items-center max-lg:w-[400px] ltr:ml-2.5 rtl:mr-2.5\">\n        <i class=\"icon-search absolute top-2 flex items-center text-2xl ltr:left-3 rtl:right-3\"></i>\n\n        <input\n            type=\"text\"\n            class=\"block w-full rounded-3xl border bg-white px-10 py-1.5 leading-6 text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n            placeholder=\"@lang('admin::app.components.layouts.header.mega-search.title')\"\n        >\n    </div>\n</v-mega-search>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-mega-search-template\"\n    >\n        <div class=\"relative flex w-[550px] max-w-[550px] items-center max-lg:w-[400px] ltr:ml-2.5 rtl:mr-2.5\">\n            <i class=\"icon-search absolute top-2 flex items-center text-2xl ltr:left-3 rtl:right-3\"></i>\n\n            <input\n                type=\"text\"\n                class=\"peer block w-full rounded-3xl border bg-white px-10 py-1.5 leading-6 text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                :class=\"{'border-gray-400': isDropdownOpen}\"\n                placeholder=\"@lang('admin::app.components.layouts.header.mega-search.title')\"\n                v-model.lazy=\"searchTerm\"\n                @click=\"searchTerm.length >= 2 ? isDropdownOpen = true : {}\"\n                v-debounce=\"500\"\n            >\n\n            <div\n                class=\"absolute top-10 z-10 w-full rounded-lg border bg-white shadow-[0px_0px_0px_0px_rgba(0,0,0,0.10),0px_1px_3px_0px_rgba(0,0,0,0.10),0px_5px_5px_0px_rgba(0,0,0,0.09),0px_12px_7px_0px_rgba(0,0,0,0.05),0px_22px_9px_0px_rgba(0,0,0,0.01),0px_34px_9px_0px_rgba(0,0,0,0.00)] dark:border-gray-800 dark:bg-gray-900\"\n                v-if=\"isDropdownOpen\"\n            >\n                <!-- Search Tabs -->\n                <div class=\"flex overflow-x-auto border-b text-sm text-gray-600 dark:border-gray-800 dark:text-gray-300\">\n                    <div\n                        class=\"cursor-pointer p-4 hover:bg-gray-100 dark:hover:bg-gray-950\"\n                        :class=\"{ 'border-b-2 border-brandColor': activeTab == tab.key }\"\n                        v-for=\"tab in tabs\"\n                        @click=\"activeTab = tab.key; search();\"\n                    >\n                        @{{ tab.title }}\n                    </div>\n                </div>\n\n                <!-- Searched Results -->\n                <template v-if=\"activeTab == 'products'\">\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.header.mega-search.products />\n                    </template>\n\n                    <template v-else>\n                        <div class=\"grid max-h-[400px] overflow-y-auto\">\n                            <template v-for=\"product in searchedResults.products\">\n                                <a\n                                    :href=\"'{{ route('admin.products.view', ':id') }}'.replace(':id', product.id)\"\n                                    class=\"flex cursor-pointer justify-between gap-2.5 border-b border-slate-300 p-4 last:border-b-0 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-gray-950\"\n                                >\n                                    <!-- Left Information -->\n                                    <div class=\"flex gap-2.5\">\n                                        <!-- Details -->\n                                        <div class=\"grid place-content-start gap-1.5\">\n                                            <p class=\"text-base font-semibold text-gray-600 dark:text-gray-300\">\n                                                @{{ product.name }}\n                                            </p>\n\n                                            <p class=\"text-gray-500\">\n                                                @{{ \"@lang(':sku')\".replace(':sku', product.sku) }}\n                                            </p>\n                                        </div>\n                                    </div>\n\n                                    <!-- Right Information -->\n                                    <div class=\"grid place-content-center gap-1 text-right\">\n                                        <!-- Formatted Price -->\n                                        <p class=\"font-semibold text-gray-600 dark:text-gray-300\">\n                                            @{{ $admin.formatPrice(product.price) }}\n                                        </p>\n                                    </div>\n                                </a>\n                            </template>\n\n                        </div>\n\n                        <div class=\"flex border-t p-3 dark:border-gray-800\">\n                            <template v-if=\"searchedResults.products.length\">\n                                <a\n                                    :href=\"'{{ route('admin.products.index') }}?search=:query'.replace(':query', searchTerm)\"\n                                    class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                >\n\n                                    @{{ `@lang('admin::app.components.layouts.header.mega-search.explore-all-matching-products')`.replace(':query', searchTerm).replace(':count', searchedResults.products.length) }}\n                                </a>\n                            </template>\n\n                            <template v-else>\n                                <a\n                                    href=\"{{ route('admin.products.index') }}\"\n                                    class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                >\n                                    @lang('admin::app.components.layouts.header.mega-search.explore-all-products')\n                                </a>\n                            </template>\n                        </div>\n                    </template>\n                </template>\n\n                <template v-if=\"activeTab == 'leads'\">\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.header.mega-search.leads />\n                    </template>\n\n                    <template v-else>\n                        <div class=\"grid max-h-[400px] overflow-y-auto\">\n                            <template v-for=\"lead in searchedResults.leads\">\n                                <a\n                                    :href=\"'{{ route('admin.leads.view', ':id') }}'.replace(':id', lead.id)\"\n                                    class=\"flex cursor-pointer justify-between gap-2.5 border-b border-slate-300 p-4 last:border-b-0 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-gray-950\"\n                                >\n                                    <!-- Left Information -->\n                                    <div class=\"flex gap-2.5\">\n                                        <!-- Details -->\n                                        <div class=\"grid place-content-start gap-1.5\">\n                                            <p class=\"text-base font-semibold text-gray-600 dark:text-gray-300\">\n                                                @{{ lead.title }}\n                                            </p>\n\n                                            <p class=\"text-gray-500\">\n                                                @{{ lead.description }}\n                                            </p>\n                                        </div>\n                                    </div>\n\n                                    <!-- Right Information -->\n                                    <div class=\"grid place-content-center gap-1 text-right\">\n                                        <!-- Formatted Price -->\n                                        <p class=\"font-semibold text-gray-600 dark:text-gray-300\">\n                                            @{{ $admin.formatPrice(lead.lead_value) }}\n                                        </p>\n                                    </div>\n                                </a>\n                            </template>\n                        </div>\n\n                        <div class=\"flex border-t p-3 dark:border-gray-800\">\n                            <template v-if=\"searchedResults.leads.length\">\n                                <a\n                                    :href=\"'{{ route('admin.leads.index') }}?search=:query'.replace(':query', searchTerm)\"\n                                    class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                >\n                                    @{{ `@lang('admin::app.components.layouts.header.mega-search.explore-all-matching-leads')`.replace(':query', searchTerm).replace(':count', searchedResults.leads.length) }}\n                                </a>\n                            </template>\n\n                            <template v-else>\n                                <a\n                                    href=\"{{ route('admin.leads.index') }}\"\n                                    class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                >\n                                    @lang('admin::app.components.layouts.header.mega-search.explore-all-leads')\n                                </a>\n                            </template>\n                        </div>\n                    </template>\n                </template>\n\n                <template v-if=\"activeTab == 'persons'\">\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.header.mega-search.persons />\n                    </template>\n\n                    <template v-else>\n                        <div class=\"grid max-h-[400px] overflow-y-auto\">\n                            <template v-for=\"person in searchedResults.persons\">\n                                <a\n                                    :href=\"'{{ route('admin.contacts.persons.view', ':id') }}'.replace(':id', person.id)\"\n                                    class=\"flex cursor-pointer justify-between gap-2.5 border-b border-slate-300 p-4 last:border-b-0 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-gray-950\"\n                                >\n                                    <!-- Left Information -->\n                                    <div class=\"flex gap-2.5\">\n                                        <!-- Details -->\n                                        <div class=\"grid place-content-start gap-1.5\">\n                                            <p class=\"text-base font-semibold text-gray-600 dark:text-gray-300\">\n                                                @{{ person.name }}\n                                            </p>\n\n                                            <p class=\"text-gray-500\">\n                                                @{{ person.emails.map((item) => `${item.value}(${item.label})`).join(', ') }}\n                                            </p>\n                                        </div>\n                                    </div>\n                                </a>\n                            </template>\n                        </div>\n\n                        <div class=\"flex border-t p-3 dark:border-gray-800\">\n                            <template v-if=\"searchedResults.persons.length\">\n                                <a\n                                    :href=\"'{{ route('admin.contacts.persons.index') }}?search=:query'.replace(':query', searchTerm)\"\n                                    class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                >\n                                    @{{ `@lang('admin::app.components.layouts.header.mega-search.explore-all-matching-contacts')`.replace(':query', searchTerm).replace(':count', searchedResults.persons.length) }}\n                                </a>\n                            </template>\n\n                            <template v-else>\n                                <a\n                                    href=\"{{ route('admin.contacts.persons.index') }}\"\n                                    class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                >\n                                    @lang('admin::app.components.layouts.header.mega-search.explore-all-contacts')\n                                </a>\n                            </template>\n                        </div>\n                    </template>\n                </template>\n\n                <template v-if=\"activeTab == 'quotes'\">\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.header.mega-search.quotes />\n                    </template>\n\n                    <template v-else>\n                        <div class=\"grid max-h-[400px] overflow-y-auto\">\n                            <template v-for=\"quote in searchedResults.quotes\">\n                                <a\n                                    :href=\"'{{ route('admin.quotes.edit', ':id') }}'.replace(':id', quote.id)\"\n                                    class=\"flex cursor-pointer justify-between gap-2.5 border-b border-slate-300 p-4 last:border-b-0 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-gray-950\"\n                                >\n                                    <!-- Left Information -->\n                                    <div class=\"flex gap-2.5\">\n                                        <!-- Details -->\n                                        <div class=\"grid place-content-start gap-1.5\">\n                                            <p class=\"text-base font-semibold text-gray-600 dark:text-gray-300\">\n                                                @{{ quote.subject }}\n                                            </p>\n\n                                            <p class=\"text-gray-500\">\n                                                @{{ quote.description }}\n                                            </p>\n                                        </div>\n                                    </div>\n                                </a>\n                            </template>\n                        </div>\n\n                        <div class=\"flex border-t p-3 dark:border-gray-800\">\n                            <template v-if=\"searchedResults.quotes.length\">\n                                <a\n                                    :href=\"'{{ route('admin.quotes.index') }}?search=:query'.replace(':query', searchTerm)\"\n                                    class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                >\n                                    @{{ `@lang('admin::app.components.layouts.header.mega-search.explore-all-matching-quotes')`.replace(':query', searchTerm).replace(':count', searchedResults.quotes.length) }}\n                                </a>\n                            </template>\n\n                            <template v-else>\n                                <a\n                                    href=\"{{ route('admin.quotes.index') }}\"\n                                    class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                >\n                                    @lang('admin::app.components.layouts.header.mega-search.explore-all-quotes')\n                                </a>\n                            </template>\n                        </div>\n                    </template>\n                </template>\n\n                <template v-if=\"activeTab == 'settings'\">\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.header.mega-search.settings />\n                    </template>\n\n                    <template v-else>\n                        <div class=\"grid max-h-[400px] overflow-y-auto\">\n                            <template v-for=\"setting in searchedResults.settings\">\n                                <a\n                                    :href=\"setting.url\"\n                                    class=\"flex cursor-pointer justify-between gap-2.5 border-b border-slate-300 p-4 last:border-b-0 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-gray-950\"\n                                >\n                                    <!-- Left Information -->\n                                    <div class=\"flex gap-2.5\">\n                                        <!-- Details -->\n                                        <div class=\"grid place-content-start gap-1.5\">\n                                            <p class=\"text-base font-semibold text-gray-600 dark:text-gray-300\">\n                                                @{{ setting.name }}\n                                            </p>\n                                        </div>\n                                    </div>\n                                </a>\n                            </template>\n                        </div>\n\n                        <template v-if=\"! searchedResults.settings.length\">\n                            <div class=\"flex border-t p-3 dark:border-gray-800\">\n                                <a\n                                    href=\"{{ route('admin.settings.index') }}\"\n                                    class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                >\n                                    @lang('admin::app.components.layouts.header.mega-search.explore-all-settings')\n                                </a>\n                            </div>\n                        </template>\n                    </template>\n                </template>\n\n                <template v-if=\"activeTab == 'configurations'\">\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.header.mega-search.configurations />\n                    </template>\n\n                    <template v-else>\n                        <div class=\"grid max-h-[400px] overflow-y-auto\">\n                            <template v-for=\"configuration in searchedResults.configurations\">\n                                <a\n                                    :href=\"configuration.url\"\n                                    class=\"flex cursor-pointer justify-between gap-2.5 border-b border-slate-300 p-4 last:border-b-0 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-gray-950\"\n                                >\n                                    <!-- Left Information -->\n                                    <div class=\"flex gap-2.5\">\n                                        <!-- Details -->\n                                        <div class=\"grid place-content-start gap-1.5\">\n                                            <p class=\"text-base font-semibold text-gray-600 dark:text-gray-300\">\n                                                @{{ configuration.title }}\n                                            </p>\n                                        </div>\n                                    </div>\n                                </a>\n                            </template>\n                        </div>\n\n                        <template v-if=\"! searchedResults.configurations.length\">\n                            <div class=\"flex border-t p-3 dark:border-gray-800\">\n                                <a\n                                    href=\"{{ route('admin.configuration.index') }}\"\n                                    class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                >\n                                    @lang('admin::app.components.layouts.header.mega-search.explore-all-configurations')\n                                </a>\n                            </div>\n                        </template>\n                    </template>\n                </template>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-mega-search', {\n            template: '#v-mega-search-template',\n\n            data() {\n                return  {\n                    activeTab: 'leads',\n\n                    isDropdownOpen: false,\n\n                    tabs: {\n                        leads: {\n                            key: 'leads',\n                            title: \"@lang('admin::app.components.layouts.header.mega-search.tabs.leads')\",\n                            is_active: true,\n                            endpoint: \"{{ route('admin.leads.search') }}\",\n                            query_params: [\n                                {\n                                    search: 'title',\n                                    searchFields: 'title:like',\n                                },\n                                {\n                                    search: 'user.name',\n                                    searchFields: 'user.name:like',\n                                },\n                                {\n                                    search: 'person.name',\n                                    searchFields: 'person.name:like',\n                                },\n                            ],\n                        },\n\n                        quotes: {\n                            key: 'quotes',\n                            title: \"@lang('admin::app.components.layouts.header.mega-search.tabs.quotes')\",\n                            is_active: false,\n                            endpoint: \"{{ route('admin.quotes.search') }}\",\n                            query_params: [\n                                {\n                                    search: 'subject',\n                                    searchFields: 'subject:like',\n                                },\n                                {\n                                    search: 'description',\n                                    searchFields: 'description:like',\n                                },\n                                {\n                                    search: 'user.name',\n                                    searchFields: 'user.name:like',\n                                },\n                                {\n                                    search: 'person.name',\n                                    searchFields: 'person.name:like',\n                                },\n                            ],\n                        },\n\n                        products: {\n                            key: 'products',\n                            title: \"@lang('admin::app.components.layouts.header.mega-search.tabs.products')\",\n                            is_active: false,\n                            endpoint: \"{{ route('admin.products.search') }}\",\n                            query_params: [\n                                {\n                                    search: 'name',\n                                    searchFields: 'name:like',\n                                },\n                                {\n                                    search: 'sku',\n                                    searchFields: 'sku:like',\n                                },\n                                {\n                                    search: 'description',\n                                    searchFields: 'description:like',\n                                },\n                            ],\n                        },\n\n                        persons: {\n                            key: 'persons',\n                            title: \"@lang('admin::app.components.layouts.header.mega-search.tabs.persons')\",\n                            is_active: false,\n                            endpoint: \"{{ route('admin.contacts.persons.search') }}\",\n                            query_params: [\n                                {\n                                    search: 'name',\n                                    searchFields: 'name:like',\n                                },\n                                {\n                                    search: 'job_title',\n                                    searchFields: 'job_title:like',\n                                },\n                                {\n                                    search: 'user.name',\n                                    searchFields: 'user.name:like',\n                                },\n                                {\n                                    search: 'organization.name',\n                                    searchFields: 'organization.name:like',\n                                },\n                            ],\n                        },\n\n                        settings: {\n                            key: 'settings',\n                            title: \"@lang('Settings')\",\n                            is_active: false,\n                            endpoint: \"{{ route('admin.settings.search') }}\",\n                            query: '',\n                        },\n\n                        configurations: {\n                            key: 'configurations',\n                            title: \"@lang('Configurations')\",\n                            is_active: false,\n                            endpoint: \"{{ route('admin.configuration.search') }}\",\n                            query: '',\n                        },\n                    },\n\n                    isLoading: false,\n\n                    searchTerm: '',\n\n                    searchedResults: {\n                        leads: [],\n                        quotes: [],\n                        products: [],\n                        persons: [],\n                        settings: [],\n                        configurations: [],\n                    },\n\n                    params: {\n                        search: '',\n                        searchFields: '',\n                    },\n                };\n            },\n\n            watch: {\n                searchTerm: 'updateSearchParams',\n\n                activeTab: 'updateSearchParams',\n            },\n\n            created() {\n                window.addEventListener('click', this.handleFocusOut);\n            },\n\n            beforeDestroy() {\n                window.removeEventListener('click', this.handleFocusOut);\n            },\n\n            methods: {\n                search(endpoint = null) {\n                    if (! endpoint) {\n                        return;\n                    }\n\n                    if (this.searchTerm.length <= 1) {\n                        this.searchedResults[this.activeTab] = [];\n\n                        this.isDropdownOpen = false;\n\n                        return;\n                    }\n\n                    this.isDropdownOpen = true;\n\n                    this.$axios.get(endpoint, {\n                            params: {\n                                ...this.params,\n                            },\n                        })\n                        .then((response) => {\n                            this.searchedResults[this.activeTab] = response.data.data;\n                        })\n                        .catch((error) => {})\n                        .finally(() => this.isLoading = false);\n                },\n\n                handleFocusOut(e) {\n                    if (! this.$el.contains(e.target)) {\n                        this.isDropdownOpen = false;\n                    }\n                },\n\n                updateSearchParams() {\n                    const newTerm = this.searchTerm;\n\n                    this.params = {\n                        search: '',\n                        searchFields: '',\n                    };\n\n                    const tab = this.tabs[this.activeTab];\n\n                    if (\n                        tab.key === 'settings'\n                        || tab.key === 'configurations'\n                    ) {\n                        this.params = null;\n\n                        this.search(`${tab.endpoint}?query=${newTerm}`);\n\n                        return;\n                    }\n\n                    this.params.search += tab.query_params.map((param) => `${param.search}:${newTerm};`).join('');\n\n                    this.params.searchFields += tab.query_params.map((param) => `${param.searchFields};`).join('');\n\n                    this.search(tab.endpoint);\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/layouts/header/index.blade.php",
    "content": "<header class=\"sticky top-0 z-[10001] flex items-center justify-between gap-1 border-b border-gray-200 bg-white px-4 py-2.5 transition-all dark:border-gray-800 dark:bg-gray-900\">  \n    <!-- logo -->\n    <div class=\"flex items-center gap-1.5\">\n        <!-- Sidebar Menu -->\n        <x-admin::layouts.sidebar.mobile />\n        \n        <a href=\"{{ route('admin.dashboard.index') }}\">\n            @if ($logo = core()->getConfigData('general.general.admin_logo.logo_image'))\n                <img\n                    class=\"h-10\"\n                    src=\"{{ Storage::url($logo) }}\"\n                    alt=\"{{ config('app.name') }}\"\n                />\n            @else\n                <img\n                    class=\"h-10 max-sm:hidden\"\n                    src=\"{{ request()->cookie('dark_mode') ? vite()->asset('images/dark-logo.svg') : vite()->asset('images/logo.svg') }}\"\n                    id=\"logo-image\"\n                    alt=\"{{ config('app.name') }}\"\n                />\n\n                <img\n                    class=\"h-10 sm:hidden\"\n                    src=\"{{ request()->cookie('dark_mode') ? vite()->asset('images/mobile-dark-logo.svg') : vite()->asset('images/mobile-light-logo.svg') }}\"\n                    id=\"logo-image\"\n                    alt=\"{{ config('app.name') }}\"\n                />\n            @endif\n        </a>\n    </div>\n\n    <div class=\"flex items-center gap-1.5 max-md:hidden\">\n        <!-- Mega Search Bar -->\n        @include('admin::components.layouts.header.desktop.mega-search')\n\n        <!-- Quick Creation Bar -->\n        @include('admin::components.layouts.header.quick-creation')\n    </div>\n\n    <div class=\"flex items-center gap-2.5\">\n        <div class=\"md:hidden\">\n            <!-- Mega Search Bar -->\n            @include('admin::components.layouts.header.mobile.mega-search')\n        </div>\n        \n        <!-- Dark mode -->\n        <v-dark>\n            <div class=\"flex\">\n                <span\n                    class=\"{{ request()->cookie('dark_mode') ? 'icon-light' : 'icon-dark' }} p-1.5 rounded-md text-2xl cursor-pointer transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                ></span>\n            </div>\n        </v-dark>\n\n        <div class=\"md:hidden\">\n            <!-- Quick Creation Bar -->\n            @include('admin::components.layouts.header.quick-creation')\n        </div>\n        \n        <!-- Admin profile -->\n        <x-admin::dropdown position=\"bottom-{{ in_array(app()->getLocale(), ['fa', 'ar']) ? 'left' : 'right' }}\">\n            <x-slot:toggle>\n                @php($user = auth()->guard('user')->user())\n\n                @if ($user->image)\n                    <button class=\"flex h-9 w-9 cursor-pointer overflow-hidden rounded-full hover:opacity-80 focus:opacity-80\">\n                        <img\n                            src=\"{{ $user->image_url }}\"\n                            class=\"h-full w-full object-cover\"\n                        />\n                    </button>\n                @else\n                    <button class=\"flex h-9 w-9 cursor-pointer items-center justify-center rounded-full bg-pink-400 font-semibold leading-6 text-white\">\n                        {{ substr($user->name, 0, 1) }}\n                    </button>\n                @endif\n            </x-slot>\n\n            <!-- Admin Dropdown -->\n            <x-slot:content class=\"mt-2 border-t-0 !p-0\">\n                <div class=\"flex items-center gap-1.5 border border-x-0 border-b-gray-300 px-5 py-2.5 dark:border-gray-800\">\n                    <img\n                        src=\"{{ url('cache/logo.png') }}\"\n                        width=\"24\"\n                        height=\"24\"\n                    />\n\n                    <!-- Version -->\n                    <p class=\"text-gray-400\">\n                        @lang('admin::app.layouts.app-version', ['version' => core()->version()])\n                    </p>\n                </div>\n\n                <div class=\"grid gap-1 pb-2.5\">\n                    <a\n                        class=\"cursor-pointer px-5 py-2 text-base text-gray-800 hover:bg-gray-100 dark:text-white dark:hover:bg-gray-950\"\n                        href=\"{{ route('admin.user.account.edit') }}\"\n                    >\n                        @lang('admin::app.layouts.my-account')\n                    </a>\n\n                    <!--Admin logout-->\n                    <x-admin::form\n                        method=\"DELETE\"\n                        action=\"{{ route('admin.session.destroy') }}\"\n                        id=\"adminLogout\"\n                    >\n                    </x-admin::form>\n\n                    <a\n                        class=\"cursor-pointer px-5 py-2 text-base text-gray-800 hover:bg-gray-100 dark:text-white dark:hover:bg-gray-950\"\n                        href=\"{{ route('admin.session.destroy') }}\"\n                        onclick=\"event.preventDefault(); document.getElementById('adminLogout').submit();\"\n                    >\n                        @lang('admin::app.layouts.sign-out')\n                    </a>\n                </div>\n            </x-slot>\n        </x-admin::dropdown>\n    </div>\n</header>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-dark-template\"\n    >\n        <div class=\"flex\">\n            <span\n                class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                :class=\"[isDarkMode ? 'icon-light' : 'icon-dark']\"\n                @click=\"toggle\"\n            ></span>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-dark', {\n            template: '#v-dark-template',\n\n            data() {\n                return {\n                    isDarkMode: {{ request()->cookie('dark_mode') ?? 0 }},\n\n                    logo: \"{{ vite()->asset('images/logo.svg') }}\",\n\n                    dark_logo: \"{{ vite()->asset('images/dark-logo.svg') }}\",\n                };\n            },\n\n            methods: {\n                toggle() {\n                    this.isDarkMode = parseInt(this.isDarkModeCookie()) ? 0 : 1;\n\n                    var expiryDate = new Date();\n\n                    expiryDate.setMonth(expiryDate.getMonth() + 1);\n\n                    document.cookie = 'dark_mode=' + this.isDarkMode + '; path=/; expires=' + expiryDate.toGMTString();\n\n                    document.documentElement.classList.toggle('dark', this.isDarkMode === 1);\n\n                    if (this.isDarkMode) {\n                        this.$emitter.emit('change-theme', 'dark');\n\n                        document.getElementById('logo-image').src = this.dark_logo;\n                    } else {\n                        this.$emitter.emit('change-theme', 'light');\n\n                        document.getElementById('logo-image').src = this.logo;\n                    }\n                },\n\n                isDarkModeCookie() {\n                    const cookies = document.cookie.split(';');\n\n                    for (const cookie of cookies) {\n                        const [name, value] = cookie.trim().split('=');\n\n                        if (name === 'dark_mode') {\n                            return value;\n                        }\n                    }\n\n                    return 0;\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/layouts/header/mobile/mega-search.blade.php",
    "content": "<v-mobile-mega-search>\n    <i class=\"icon-search flex items-center text-2xl\"></i>\n</v-mobile-mega-search>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-mobile-mega-search-template\"\n    >\n        <div>\n            <i\n                class=\"icon-search flex items-center text-2xl\"\n                @click=\"toggleSearchInput\"\n                v-show=\"!isSearchVisible\"\n            ></i>\n\n            <div\n                v-show=\"isSearchVisible\"\n                class=\"absolute left-1/2 top-3 z-[10002] flex w-full max-w-full -translate-x-1/2 items-center px-2\"\n            >\n                <i class=\"icon-search absolute top-2 flex items-center text-2xl ltr:left-4 rtl:right-4\"></i>\n\n                <input\n                    type=\"text\"\n                    class=\"peer block w-full rounded-3xl border bg-white px-10 py-1.5 leading-6 text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                    :class=\"{'border-gray-400': isDropdownOpen}\"\n                    placeholder=\"@lang('admin::app.components.layouts.header.mega-search.title')\"\n                    v-model.lazy=\"searchTerm\"\n                    @click=\"searchTerm.length >= 2 ? isDropdownOpen = true : {}\"\n                    v-debounce=\"500\"\n                    ref=\"searchInput\"\n                >\n\n                <i class=\"icon-cross-large absolute top-2 flex items-center text-2xl ltr:right-4 rtl:left-4\"></i>\n\n                <div\n                    class=\"absolute left-[6px] right-[6px] top-10 z-10 max-h-[80vh] overflow-y-auto rounded-lg border bg-white shadow-[0px_0px_0px_0px_rgba(0,0,0,0.10),0px_1px_3px_0px_rgba(0,0,0,0.10),0px_5px_5px_0px_rgba(0,0,0,0.09),0px_12px_7px_0px_rgba(0,0,0,0.05),0px_22px_9px_0px_rgba(0,0,0,0.01),0px_34px_9px_0px_rgba(0,0,0,0.00)] dark:border-gray-800 dark:bg-gray-900\"\n                    v-if=\"isDropdownOpen\"\n                >\n                    <!-- Search Tabs -->\n                    <div class=\"flex overflow-x-auto border-b text-sm text-gray-600 dark:border-gray-800 dark:text-gray-300 sm:text-base\">\n                        <div\n                            class=\"flex-shrink-0 cursor-pointer whitespace-nowrap px-3 py-2 hover:bg-gray-100 dark:hover:bg-gray-950 sm:px-4 sm:py-3\"\n                            :class=\"{ 'border-b-2 border-brandColor': activeTab == tab.key }\"\n                            v-for=\"tab in tabs\"\n                            @click=\"activeTab = tab.key; search();\"\n                        >\n                            @{{ tab.title }}\n                        </div>\n                    </div>\n\n                    <!-- Searched Results -->\n                    <template v-if=\"activeTab == 'products'\">\n                        <template v-if=\"isLoading\">\n                            <x-admin::shimmer.header.mega-search.products />\n                        </template>\n\n                        <template v-else>\n                            <div class=\"grid max-h-[400px] divide-y divide-slate-200 overflow-y-auto dark:divide-gray-800\">\n                                <template v-for=\"product in searchedResults.products\">\n                                    <a\n                                        :href=\"'{{ route('admin.products.view', ':id') }}'.replace(':id', product.id)\"\n                                        class=\"flex flex-col justify-between gap-2.5 p-4 hover:bg-gray-100 dark:hover:bg-gray-950 sm:flex-row\"\n                                    >\n                                        <!-- Left Information -->\n                                        <div class=\"flex flex-col gap-2.5 sm:flex-row sm:items-center\">\n                                            <!-- Details -->\n                                            <div class=\"grid place-content-start gap-1.5\">\n                                                <p class=\"text-sm font-semibold text-gray-600 dark:text-gray-300 sm:text-base\">\n                                                    @{{ product.name }}\n                                                </p>\n\n                                                <p class=\"text-sm text-gray-500\">\n                                                    @{{ \"@lang(':sku')\".replace(':sku', product.sku) }}\n                                                </p>\n                                            </div>\n                                        </div>\n\n                                        <!-- Right Information -->\n                                        <div class=\"mt-2 text-right sm:mt-0 sm:text-right\">\n                                            <p class=\"text-gray-600 dark:text-gray-300 sm:text-base\">\n                                                @{{ $admin.formatPrice(product.price) }}\n                                            </p>\n                                        </div>\n                                    </a>\n                                </template>\n                            </div>\n\n                            <div class=\"flex border-t p-3 dark:border-gray-800\">\n                                <template v-if=\"searchedResults.products.length\">\n                                    <a\n                                        :href=\"'{{ route('admin.products.index') }}?search=:query'.replace(':query', searchTerm)\"\n                                        class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                    >\n\n                                        @{{ `@lang('admin::app.components.layouts.header.mega-search.explore-all-matching-products')`.replace(':query', searchTerm).replace(':count', searchedResults.products.length) }}\n                                    </a>\n                                </template>\n\n                                <template v-else>\n                                    <a\n                                        href=\"{{ route('admin.products.index') }}\"\n                                        class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                    >\n                                        @lang('admin::app.components.layouts.header.mega-search.explore-all-products')\n                                    </a>\n                                </template>\n                            </div>\n                        </template>\n                    </template>\n\n                    <template v-if=\"activeTab == 'leads'\">\n                        <template v-if=\"isLoading\">\n                            <x-admin::shimmer.header.mega-search.leads />\n                        </template>\n\n                        <template v-else>\n                            <div class=\"grid max-h-[400px] overflow-y-auto\">\n                                <template v-for=\"lead in searchedResults.leads\">\n                                    <a\n                                        :href=\"'{{ route('admin.leads.view', ':id') }}'.replace(':id', lead.id)\"\n                                        class=\"flex cursor-pointer justify-between gap-2.5 border-b border-slate-300 p-4 last:border-b-0 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-gray-950\"\n                                    >\n                                        <!-- Left Information -->\n                                        <div class=\"flex gap-2.5\">\n                                            <!-- Details -->\n                                            <div class=\"grid place-content-start gap-1.5\">\n                                                <p class=\"text-gray-600 dark:text-gray-300\">\n                                                    @{{ lead.title }}\n                                                </p>\n\n                                                <p class=\"text-gray-500\">\n                                                    @{{ lead.description }}\n                                                </p>\n                                            </div>\n                                        </div>\n\n                                        <!-- Right Information -->\n                                        <div class=\"grid place-content-center gap-1 text-right\">\n                                            <!-- Formatted Price -->\n                                            <p class=\"font-semibold text-gray-600 dark:text-gray-300\">\n                                                @{{ $admin.formatPrice(lead.lead_value) }}\n                                            </p>\n                                        </div>\n                                    </a>\n                                </template>\n                            </div>\n\n                            <div class=\"flex border-t p-3 dark:border-gray-800\">\n                                <template v-if=\"searchedResults.leads.length\">\n                                    <a\n                                        :href=\"'{{ route('admin.leads.index') }}?search=:query'.replace(':query', searchTerm)\"\n                                        class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                    >\n                                        @{{ `@lang('admin::app.components.layouts.header.mega-search.explore-all-matching-leads')`.replace(':query', searchTerm).replace(':count', searchedResults.leads.length) }}\n                                    </a>\n                                </template>\n\n                                <template v-else>\n                                    <a\n                                        href=\"{{ route('admin.leads.index') }}\"\n                                        class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                    >\n                                        @lang('admin::app.components.layouts.header.mega-search.explore-all-leads')\n                                    </a>\n                                </template>\n                            </div>\n                        </template>\n                    </template>\n\n                    <template v-if=\"activeTab == 'persons'\">\n                        <template v-if=\"isLoading\">\n                            <x-admin::shimmer.header.mega-search.persons />\n                        </template>\n\n                        <template v-else>\n                            <div class=\"grid max-h-[400px] overflow-y-auto\">\n                                <template v-for=\"person in searchedResults.persons\">\n                                    <a\n                                        :href=\"'{{ route('admin.contacts.persons.view', ':id') }}'.replace(':id', person.id)\"\n                                        class=\"flex cursor-pointer justify-between gap-2.5 border-b border-slate-300 p-4 last:border-b-0 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-gray-950\"\n                                    >\n                                        <!-- Left Information -->\n                                        <div class=\"flex gap-2.5\">\n                                            <!-- Details -->\n                                            <div class=\"grid place-content-start gap-1.5\">\n                                                <p class=\"text-gray-600 dark:text-gray-300\">\n                                                    @{{ person.name }}\n                                                </p>\n\n                                                <p class=\"text-gray-500\">\n                                                    @{{ person.emails.map((item) => `${item.value}(${item.label})`).join(', ') }}\n                                                </p>\n                                            </div>\n                                        </div>\n                                    </a>\n                                </template>\n                            </div>\n\n                            <div class=\"flex border-t p-3 dark:border-gray-800\">\n                                <template v-if=\"searchedResults.persons.length\">\n                                    <a\n                                        :href=\"'{{ route('admin.contacts.persons.index') }}?search=:query'.replace(':query', searchTerm)\"\n                                        class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                    >\n                                        @{{ `@lang('admin::app.components.layouts.header.mega-search.explore-all-matching-contacts')`.replace(':query', searchTerm).replace(':count', searchedResults.persons.length) }}\n                                    </a>\n                                </template>\n\n                                <template v-else>\n                                    <a\n                                        href=\"{{ route('admin.contacts.persons.index') }}\"\n                                        class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                    >\n                                        @lang('admin::app.components.layouts.header.mega-search.explore-all-contacts')\n                                    </a>\n                                </template>\n                            </div>\n                        </template>\n                    </template>\n\n                    <template v-if=\"activeTab == 'quotes'\">\n                        <template v-if=\"isLoading\">\n                            <x-admin::shimmer.header.mega-search.quotes />\n                        </template>\n\n                        <template v-else>\n                            <div class=\"grid max-h-[400px] overflow-y-auto\">\n                                <template v-for=\"quote in searchedResults.quotes\">\n                                    <a\n                                        :href=\"'{{ route('admin.quotes.edit', ':id') }}'.replace(':id', quote.id)\"\n                                        class=\"flex cursor-pointer justify-between gap-2.5 border-b border-slate-300 p-4 last:border-b-0 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-gray-950\"\n                                    >\n                                        <!-- Left Information -->\n                                        <div class=\"flex gap-2.5\">\n                                            <!-- Details -->\n                                            <div class=\"grid place-content-start gap-1.5\">\n                                                <p class=\"text-base font-semibold text-gray-600 dark:text-gray-300\">\n                                                    @{{ quote.subject }}\n                                                </p>\n\n                                                <p class=\"text-gray-500\">\n                                                    @{{ quote.description }}\n                                                </p>\n                                            </div>\n                                        </div>\n                                    </a>\n                                </template>\n                            </div>\n\n                            <div class=\"flex border-t p-3 dark:border-gray-800\">\n                                <template v-if=\"searchedResults.quotes.length\">\n                                    <a\n                                        :href=\"'{{ route('admin.quotes.index') }}?search=:query'.replace(':query', searchTerm)\"\n                                        class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                    >\n                                        @{{ `@lang('admin::app.components.layouts.header.mega-search.explore-all-matching-quotes')`.replace(':query', searchTerm).replace(':count', searchedResults.quotes.length) }}\n                                    </a>\n                                </template>\n\n                                <template v-else>\n                                    <a\n                                        href=\"{{ route('admin.quotes.index') }}\"\n                                        class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                    >\n                                        @lang('admin::app.components.layouts.header.mega-search.explore-all-quotes')\n                                    </a>\n                                </template>\n                            </div>\n                        </template>\n                    </template>\n\n                    <template v-if=\"activeTab == 'settings'\">\n                        <template v-if=\"isLoading\">\n                            <x-admin::shimmer.header.mega-search.settings />\n                        </template>\n\n                        <template v-else>\n                            <div class=\"grid max-h-[400px] overflow-y-auto\">\n                                <template v-for=\"setting in searchedResults.settings\">\n                                    <a\n                                        :href=\"setting.url\"\n                                        class=\"flex cursor-pointer justify-between gap-2.5 border-b border-slate-300 p-4 last:border-b-0 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-gray-950\"\n                                    >\n                                        <!-- Left Information -->\n                                        <div class=\"flex gap-2.5\">\n                                            <!-- Details -->\n                                            <div class=\"grid place-content-start gap-1.5\">\n                                                <p class=\"text-gray-600 dark:text-gray-300\">\n                                                    @{{ setting.name }}\n                                                </p>\n                                            </div>\n                                        </div>\n                                    </a>\n                                </template>\n                            </div>\n\n                            <template v-if=\"! searchedResults.settings.length\">\n                                <div class=\"flex border-t p-3 dark:border-gray-800\">\n                                    <a\n                                        href=\"{{ route('admin.settings.index') }}\"\n                                        class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                    >\n                                        @lang('admin::app.components.layouts.header.mega-search.explore-all-settings')\n                                    </a>\n                                </div>\n                            </template>\n                        </template>\n                    </template>\n\n                    <template v-if=\"activeTab == 'configurations'\">\n                        <template v-if=\"isLoading\">\n                            <x-admin::shimmer.header.mega-search.configurations />\n                        </template>\n\n                        <template v-else>\n                            <div class=\"grid max-h-[400px] overflow-y-auto\">\n                                <template v-for=\"configuration in searchedResults.configurations\">\n                                    <a\n                                        :href=\"configuration.url\"\n                                        class=\"flex cursor-pointer justify-between gap-2.5 border-b border-slate-300 p-4 last:border-b-0 hover:bg-gray-100 dark:border-gray-800 dark:hover:bg-gray-950\"\n                                    >\n                                        <!-- Left Information -->\n                                        <div class=\"flex gap-2.5\">\n                                            <!-- Details -->\n                                            <div class=\"grid place-content-start gap-1.5\">\n                                                <p class=\"text-gray-600 dark:text-gray-300\">\n                                                    @{{ configuration.title }}\n                                                </p>\n                                            </div>\n                                        </div>\n                                    </a>\n                                </template>\n                            </div>\n\n                            <template v-if=\"! searchedResults.configurations.length\">\n                                <div class=\"flex border-t p-3 dark:border-gray-800\">\n                                    <a\n                                        href=\"{{ route('admin.configuration.index') }}\"\n                                        class=\"cursor-pointer text-xs font-semibold text-brandColor transition-all hover:underline\"\n                                    >\n                                        @lang('admin::app.components.layouts.header.mega-search.explore-all-configurations')\n                                    </a>\n                                </div>\n                            </template>\n                        </template>\n                    </template>\n                </div>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-mobile-mega-search', {\n            template: '#v-mobile-mega-search-template',\n\n            data() {\n                return  {\n                    activeTab: 'leads',\n\n                    isSearchVisible: false,\n\n                    isDropdownOpen: false,\n\n                    tabs: {\n                        leads: {\n                            key: 'leads',\n                            title: \"@lang('admin::app.components.layouts.header.mega-search.tabs.leads')\",\n                            is_active: true,\n                            endpoint: \"{{ route('admin.leads.search') }}\",\n                            query_params: [\n                                {\n                                    search: 'title',\n                                    searchFields: 'title:like',\n                                },\n                                {\n                                    search: 'user.name',\n                                    searchFields: 'user.name:like',\n                                },\n                                {\n                                    search: 'person.name',\n                                    searchFields: 'person.name:like',\n                                },\n                            ],\n                        },\n\n                        quotes: {\n                            key: 'quotes',\n                            title: \"@lang('admin::app.components.layouts.header.mega-search.tabs.quotes')\",\n                            is_active: false,\n                            endpoint: \"{{ route('admin.quotes.search') }}\",\n                            query_params: [\n                                {\n                                    search: 'subject',\n                                    searchFields: 'subject:like',\n                                },\n                                {\n                                    search: 'description',\n                                    searchFields: 'description:like',\n                                },\n                                {\n                                    search: 'user.name',\n                                    searchFields: 'user.name:like',\n                                },\n                                {\n                                    search: 'person.name',\n                                    searchFields: 'person.name:like',\n                                },\n                            ],\n                        },\n\n                        products: {\n                            key: 'products',\n                            title: \"@lang('admin::app.components.layouts.header.mega-search.tabs.products')\",\n                            is_active: false,\n                            endpoint: \"{{ route('admin.products.search') }}\",\n                            query_params: [\n                                {\n                                    search: 'name',\n                                    searchFields: 'name:like',\n                                },\n                                {\n                                    search: 'sku',\n                                    searchFields: 'sku:like',\n                                },\n                                {\n                                    search: 'description',\n                                    searchFields: 'description:like',\n                                },\n                            ],\n                        },\n\n                        persons: {\n                            key: 'persons',\n                            title: \"@lang('admin::app.components.layouts.header.mega-search.tabs.persons')\",\n                            is_active: false,\n                            endpoint: \"{{ route('admin.contacts.persons.search') }}\",\n                            query_params: [\n                                {\n                                    search: 'name',\n                                    searchFields: 'name:like',\n                                },\n                                {\n                                    search: 'job_title',\n                                    searchFields: 'job_title:like',\n                                },\n                                {\n                                    search: 'user.name',\n                                    searchFields: 'user.name:like',\n                                },\n                                {\n                                    search: 'organization.name',\n                                    searchFields: 'organization.name:like',\n                                },\n                            ],\n                        },\n\n                        settings: {\n                            key: 'settings',\n                            title: '@lang('Settings')',\n                            is_active: false,\n                            endpoint: '{{ route('admin.settings.search') }}',\n                            query: '',\n                        },\n\n                        configurations: {\n                            key: 'configurations',\n                            title: '@lang('Configurations')',\n                            is_active: false,\n                            endpoint: '{{ route('admin.configuration.search') }}',\n                            query: '',\n                        },\n                    },\n\n                    isLoading: false,\n\n                    searchTerm: '',\n\n                    searchedResults: {\n                        leads: [],\n                        quotes: [],\n                        products: [],\n                        persons: [],\n                        settings: [],\n                        configurations: [],\n                    },\n\n                    params: {\n                        search: '',\n                        searchFields: '',\n                    },\n                };\n            },\n\n            watch: {\n                searchTerm: 'updateSearchParams',\n\n                activeTab: 'updateSearchParams',\n            },\n\n            created() {\n                window.addEventListener('click', this.handleFocusOut);\n            },\n\n            beforeDestroy() {\n                window.removeEventListener('click', this.handleFocusOut);\n            },\n\n            methods: {\n                toggleSearchInput() {\n                    this.isSearchVisible = ! this.isSearchVisible;\n                    this.isDropdownOpen = false;\n\n                    if (this.isSearchVisible) {\n                        this.$nextTick(() => {\n                            if (this.$refs.searchInput) {\n                                this.$refs.searchInput.focus();\n                            }\n                        });\n                    } else {\n                        this.searchTerm = '';\n                    }\n                },\n\n                search(endpoint) {\n                    if (! endpoint) {\n                        return;\n                    }\n\n                    if (this.searchTerm.length <= 1) {\n                        this.searchedResults[this.activeTab] = [];\n\n                        this.isDropdownOpen = false;\n\n                        return;\n                    }\n\n                    this.isDropdownOpen = true;\n\n                    this.$axios.get(endpoint, {\n                            params: {\n                                ...this.params,\n                            },\n                        })\n                        .then((response) => {\n                            this.searchedResults[this.activeTab] = response.data.data;\n                        })\n                        .catch((error) => {})\n                        .finally(() => this.isLoading = false);\n                },\n\n                handleFocusOut(e) {\n                    if (! this.$el.contains(e.target) || e.target.classList.contains('icon-cross-large')) {\n                        this.isDropdownOpen = false;\n\n                        if (! this.isDropdownOpen) {\n                            this.isSearchVisible = false;\n                            this.searchTerm = '';\n                        }\n                    }\n                },\n\n                updateSearchParams() {\n                    const newTerm = this.searchTerm;\n\n                    this.params = {\n                        search: '',\n                        searchFields: '',\n                    };\n\n                    const tab = this.tabs[this.activeTab];\n\n                    if (\n                        tab.key === 'settings'\n                        || tab.key === 'configurations'\n                    ) {\n                        this.params = null;\n\n                        this.search(`${tab.endpoint}?query=${newTerm}`);\n\n                        return;\n                    }\n\n                    this.params.search += tab.query_params.map((param) => `${param.search}:${newTerm};`).join('');\n\n                    this.params.searchFields += tab.query_params.map((param) => `${param.searchFields};`).join('');\n\n                    this.search(tab.endpoint);\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/layouts/header/quick-creation.blade.php",
    "content": "<div>\n    @if (bouncer()->hasPermission('leads.create')\n        || bouncer()->hasPermission('quotes.create')\n        || bouncer()->hasPermission('mail.create')\n        || bouncer()->hasPermission('contacts.persons.create')\n        || bouncer()->hasPermission('contacts.organizations.create')\n        || bouncer()->hasPermission('products.create')\n        || bouncer()->hasPermission('settings.automation.attributes.create')\n        || bouncer()->hasPermission('settings.user.roles.create')\n        || bouncer()->hasPermission('settings.user.users.create')\n    )\n        <x-admin::dropdown position=\"bottom-right\">\n            <x-slot:toggle>\n                <!-- Toggle Button -->\n                <button class=\"flex h-9 w-9 cursor-pointer items-center justify-center rounded-full bg-brandColor text-white\">\n                    <i class=\"icon-add text-2xl\"></i>\n                </button>\n            </x-slot>\n\n            <!-- Dropdown Content -->\n            <x-slot:content class=\"mt-2 !p-0\">\n                <div class=\"relative px-2 py-4\">\n                    <div class=\"grid grid-cols-3 gap-2 text-center max-sm:grid-cols-2\">\n                        <!-- Link to create new Lead -->\n                        @if (bouncer()->hasPermission('leads.create'))\n                            <div class=\"rounded-lg bg-white p-2 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-950\">\n                                <a href=\"{{ route('admin.leads.create') }}\">\n                                    <div class=\"flex flex-col gap-1\">\n                                        <i class=\"icon-leads text-2xl text-gray-600\"></i>\n\n                                        <span class=\"font-medium dark:text-gray-300\">@lang('admin::app.layouts.lead')</span>\n                                    </div>\n                                </a>\n                            </div>\n                        @endif\n\n                        <!-- Link to create new Quotes -->\n                        @if (bouncer()->hasPermission('quotes.create'))\n                            <div class=\"rounded-lg bg-white p-2 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-950\">\n                                <a href=\"{{ route('admin.quotes.create') }}\">\n                                    <div class=\"flex flex-col gap-1\">\n                                        <i class=\"icon-quote text-2xl text-gray-600\"></i>\n\n                                        <span class=\"font-medium dark:text-gray-300\">@lang('admin::app.layouts.quote')</span>\n                                    </div>\n                                </a>\n                            </div>\n                        @endif\n\n                        <!-- Link to send new Mail-->\n                        @if (bouncer()->hasPermission('mail.create'))\n                            <div class=\"rounded-lg bg-white p-2 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-950\">\n                                <a href=\"{{ route('admin.mail.index', ['route' => 'inbox', 'openModal' => 'true']) }}\">\n                                    <div class=\"flex flex-col gap-1\">\n                                        <i class=\"icon-mail text-2xl text-gray-600\"></i>\n\n                                        <span class=\"font-medium dark:text-gray-300\">@lang('admin::app.layouts.email')</span>\n                                    </div>\n                                </a>\n                            </div>\n                        @endif\n\n                        <!-- Link to create new Person-->\n                        @if (bouncer()->hasPermission('contacts.persons.create'))\n                            <div class=\"rounded-lg bg-white p-2 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-950\">\n                                <a href=\"{{ route('admin.contacts.persons.create') }}\">\n                                    <div class=\"flex flex-col gap-1\">\n                                        <i class=\"icon-settings-user text-2xl text-gray-600\"></i>\n\n                                        <span class=\"font-medium dark:text-gray-300\">@lang('admin::app.layouts.person')</span>\n                                    </div>\n                                </a>\n                            </div>\n                        @endif\n\n                        <!-- Link to create new Organizations -->\n                        @if (bouncer()->hasPermission('contacts.organizations.create'))\n                            <div class=\"rounded-lg bg-white p-2 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-950\">\n                                <a href=\"{{ route('admin.contacts.organizations.create') }}\">\n                                    <div class=\"flex flex-col gap-1\">\n                                        <i class=\"icon-organization text-2xl text-gray-600\"></i>\n\n                                        <span class=\"font-medium dark:text-gray-300\">@lang('admin::app.layouts.organization')</span>\n                                    </div>\n                                </a>\n                            </div>\n                        @endif\n\n                        <!-- Link to create new Products -->\n                        @if (bouncer()->hasPermission('products.create'))\n                            <div class=\"rounded-lg bg-white p-2 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-950\">\n                                <a href=\"{{ route('admin.products.create') }}\">\n                                    <div class=\"flex flex-col gap-1\">\n                                        <i class=\"icon-product text-2xl text-gray-600\"></i>\n\n                                        <span class=\"font-medium dark:text-gray-300\">@lang('admin::app.layouts.product')</span>\n                                    </div>\n                                </a>\n                            </div>\n                        @endif\n\n                        <!-- Link to create new Attributes -->\n                        @if (bouncer()->hasPermission('settings.automation.attributes.create'))\n                            <div class=\"rounded-lg bg-white p-2 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-950\">\n                                <a href=\"{{ route('admin.settings.attributes.create') }}\">\n                                    <div class=\"flex flex-col gap-1\">\n                                        <i class=\"icon-attribute text-2xl text-gray-600\"></i>\n\n                                        <span class=\"font-medium dark:text-gray-300\">@lang('admin::app.layouts.attribute')</span>\n                                    </div>\n                                </a>\n                            </div>\n                        @endif\n\n                        <!-- Link to create new Role -->\n                        @if (bouncer()->hasPermission('settings.user.roles.create'))\n                            <div class=\"rounded-lg bg-white p-2 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-950\">\n                                <a href=\"{{ route('admin.settings.roles.create') }}\">\n                                    <div class=\"flex flex-col gap-1\">\n                                        <i class=\"icon-role text-2xl text-gray-600\"></i>\n\n                                        <span class=\"font-medium dark:text-gray-300\">@lang('admin::app.layouts.role')</span>\n                                    </div>\n                                </a>\n                            </div>\n                        @endif\n\n                        <!-- Link to create new User-->\n                        @if (bouncer()->hasPermission('settings.user.users.create'))\n                            <div class=\"rounded-lg bg-white p-2 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-950\">\n                                <a href=\"{{ route('admin.settings.users.index', ['action' => 'create']) }}\">\n                                    <div class=\"flex flex-col gap-1\">\n                                        <i class=\"icon-user text-2xl text-gray-600\"></i>\n\n                                        <span class=\"font-medium dark:text-gray-300\">@lang('admin::app.layouts.user')</span>\n                                    </div>\n                                </a>\n                            </div>\n                        @endif\n                    </div>\n                </div>\n            </x-slot>\n        </x-admin::dropdown>\n    @endif\n</div>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/layouts/index.blade.php",
    "content": "<!DOCTYPE html>\n\n<html\n    class=\"{{ request()->cookie('dark_mode') ? 'dark' : '' }}\"\n    lang=\"{{ app()->getLocale() }}\"\n    dir=\"{{ in_array(app()->getLocale(), ['fa', 'ar']) ? 'rtl' : 'ltr' }}\"\n>\n\n<head>\n\n    {!! view_render_event('admin.layout.head.before') !!}\n\n    <title>{{ $title }}</title>\n\n    <meta charset=\"UTF-8\">\n\n    <meta\n        http-equiv=\"X-UA-Compatible\"\n        content=\"IE=edge\"\n    >\n    <meta\n        http-equiv=\"content-language\"\n        content=\"{{ app()->getLocale() }}\"\n    >\n\n    <meta\n        name=\"viewport\"\n        content=\"width=device-width, initial-scale=1\"\n    >\n    <meta\n        name=\"base-url\"\n        content=\"{{ url()->to('/') }}\"\n    >\n    <meta\n        name=\"currency\"\n        content=\"{{\n            json_encode([\n                'code' => config('app.currency'),\n                'symbol' => core()->currencySymbol(config('app.currency'))])\n            }}\n        \"\n    >\n\n    @stack('meta')\n\n    {{\n        vite()->set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'])\n    }}\n\n    <link\n        href=\"https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap\"\n        rel=\"stylesheet\"\n    />\n\n    <link\n        rel=\"preload\"\n        as=\"image\"\n        href=\"{{ url('cache/logo/bagisto.png') }}\"\n    >\n\n    @if ($favicon = core()->getConfigData('general.design.admin_logo.favicon'))\n        <link\n            type=\"image/x-icon\"\n            href=\"{{ Storage::url($favicon) }}\"\n            rel=\"shortcut icon\"\n            sizes=\"16x16\"\n        >\n    @else\n        <link\n            type=\"image/x-icon\"\n            href=\"{{ vite()->asset('images/favicon.ico') }}\"\n            rel=\"shortcut icon\"\n            sizes=\"16x16\"\n        />\n    @endif\n\n    @php\n        $brandColor = core()->getConfigData('general.settings.menu_color.brand_color') ?? '#0E90D9';\n    @endphp\n\n    @stack('styles')\n\n    <style>\n        :root {\n            --brand-color: {{ $brandColor }};\n        }\n\n        {!! core()->getConfigData('general.content.custom_scripts.custom_css') !!}\n    </style>\n\n    {!! view_render_event('admin.layout.head.after') !!}\n</head>\n\n<body class=\"h-full font-inter dark:bg-gray-950\">\n    {!! view_render_event('admin.layout.body.before') !!}\n\n    <div\n        id=\"app\"\n        class=\"h-full\"\n    >\n        <!-- Flash Message Blade Component -->\n        <x-admin::flash-group />\n\n        <!-- Confirm Modal Blade Component -->\n        <x-admin::modal.confirm />\n\n        {!! view_render_event('admin.layout.content.before') !!}\n\n        <!-- Page Header Blade Component -->\n        <x-admin::layouts.header />\n\n        <div\n            class=\"group/container sidebar-collapsed flex gap-4\"\n            ref=\"appLayout\"\n        >\n            <!-- Page Sidebar Blade Component -->\n            <x-admin::layouts.sidebar.desktop />\n\n            <div class=\"flex min-h-[calc(100vh-62px)] max-w-full flex-1 flex-col bg-gray-100 pt-3 transition-all duration-300 dark:bg-gray-950\">\n                <!-- Page Content Blade Component -->\n                <div class=\"px-4 pb-6 ltr:lg:pl-[85px] rtl:lg:pr-[85px]\">\n                    {{ $slot }}\n                </div>\n\n                <!-- Powered By -->\n                <div class=\"mt-auto pt-6\">\n                    <div class=\"border-t bg-white py-5 text-center text-sm font-normal dark:border-gray-800 dark:bg-gray-900 dark:text-white max-md:py-3\">\n                        <p>{!! core()->getConfigData('general.settings.footer.label') !!}</p>\n                    </div>\n                </div>\n            </div>\n        </div>\n\n        {!! view_render_event('admin.layout.content.after') !!}\n    </div>\n\n    {!! view_render_event('admin.layout.body.after') !!}\n\n    @stack('scripts')\n\n    {!! view_render_event('admin.layout.vue-app-mount.before') !!}\n\n    <script>\n        /**\n         * Load event, the purpose of using the event is to mount the application\n         * after all of our `Vue` components which is present in blade file have\n         * been registered in the app. No matter what `app.mount()` should be\n         * called in the last.\n         */\n        window.addEventListener(\"load\", function(event) {\n            app.mount(\"#app\");\n        });\n    </script>\n\n    {!! view_render_event('admin.layout.vue-app-mount.after') !!}\n</body>\n\n</html>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/desktop/index.blade.php",
    "content": "<div\n    ref=\"sidebar\"\n    class=\"duration-80 fixed top-[60px] z-[10002] h-full w-[200px] border-gray-200 bg-white pt-4 transition-all group-[.sidebar-collapsed]/container:w-[70px] dark:border-gray-800 dark:bg-gray-900 max-lg:hidden ltr:border-r rtl:border-l\"\n    @mouseover=\"handleMouseOver\"\n    @mouseleave=\"handleMouseLeave\"\n>\n    <div class=\"journal-scroll h-[calc(100vh-100px)] overflow-hidden group-[.sidebar-collapsed]/container:overflow-visible\">\n        <nav class=\"sidebar-rounded grid w-full gap-2\">\n            <!-- Navigation Menu -->\n            @foreach (menu()->getItems('admin') as $menuItem)\n                <div class=\"px-4 group/item {{ $menuItem->isActive() ? 'active' : 'inactive' }}\">\n                    <a\n                        class=\"flex gap-2 p-1.5 items-center cursor-pointer hover:rounded-lg {{ $menuItem->isActive() == 'active' ? 'bg-brandColor rounded-lg' : ' hover:bg-gray-100 hover:dark:bg-gray-950' }} peer\"\n                        href=\"{{ ! in_array($menuItem->getKey(), ['settings', 'configuration']) && $menuItem->haveChildren() ? 'javascript:void(0)' : $menuItem->getUrl() }}\"\n                        @mouseleave=\"!isMenuActive ? hoveringMenu = '' : {}\"\n                        @mouseover=\"hoveringMenu='{{$menuItem->getKey()}}'\"\n                        @click=\"isMenuActive = !isMenuActive\"\n                    >\n                        <span class=\"{{ $menuItem->getIcon() }} text-2xl {{ $menuItem->isActive() ? 'text-white' : ''}}\"></span>\n\n                        <div class=\"flex-1 flex justify-between items-center text-gray-600 dark:text-gray-300 font-medium whitespace-nowrap group-[.sidebar-collapsed]/container:hidden {{ $menuItem->isActive() ? 'text-white' : ''}} group\">\n                            <p>{{ core()->getConfigData('general.settings.menu.'.$menuItem->getKey()) ?? $menuItem->getName() }}</p>\n                        \n                            @if ( ! in_array($menuItem->getKey(), ['settings', 'configuration']) && $menuItem->haveChildren())\n                                <i class=\"icon-right-arrow rtl:icon-left-arrow invisible text-2xl group-hover/item:visible {{ $menuItem->isActive() ? 'text-white' : ''}}\"></i>\n                            @endif\n                        </div>\n                    </a>\n\n                    <!-- Submenu -->\n                    @if (\n                        ! in_array($menuItem->getKey(), ['settings', 'configuration'])\n                        && $menuItem->haveChildren()\n                    )\n                        <div\n                            class=\"absolute top-0 hidden flex-col bg-gray-100 ltr:left-[200px] rtl:right-[199px]\"\n                            :class=\"[isMenuActive && (hoveringMenu == '{{$menuItem->getKey()}}') ? '!flex' : 'hidden']\"\n                        >\n                            <div class=\"sidebar-rounded fixed z-[1000] h-full min-w-[140px] max-w-max bg-white pt-4 after:-right-[30px] dark:border-gray-800 dark:bg-gray-900 max-lg:hidden ltr:border-r rtl:border-x\">\n                                <div class=\"journal-scroll h-[calc(100vh-100px)] overflow-hidden\">\n                                    <nav class=\"grid w-full gap-2\">\n                                        @foreach ($menuItem->getChildren() as $subMenuItem)\n                                            <div class=\"px-4 group/item {{ $menuItem->isActive() ? 'active' : 'inactive' }}\">\n                                                <a\n                                                    href=\"{{ $subMenuItem->getUrl() }}\"\n                                                    class=\"flex gap-2.5 p-2 items-center cursor-pointer hover:rounded-lg {{ $subMenuItem->isActive() == 'active' ? 'bg-brandColor rounded-lg' : ' hover:bg-gray-100 hover:dark:bg-gray-950' }} peer\"\n                                                >\n                                                    <p class=\"text-gray-600 dark:text-gray-300 font-medium whitespace-nowrap {{ $subMenuItem->isActive() ? 'text-white' : ''}}\">\n                                                        {{ core()->getConfigData('general.settings.menu.'.$subMenuItem->getKey()) ?? $subMenuItem->getName() }}\n                                                    </p>\n                                                </a>\n                                            </div>\n                                        @endforeach\n                                    </nav>\n                                </div>\n                            </div>\n                        </div>\n                    @endif\n                </div>\n            @endforeach\n        </nav>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/layouts/sidebar/mobile/index.blade.php",
    "content": "<v-sidebar-drawer>\n    <i class=\"icon-menu lg:hidden cursor-pointer rounded-md p-1.5 text-2xl hover:bg-gray-100 dark:hover:bg-gray-950 max-lg:block\"></i>\n</v-sidebar-drawer>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-sidebar-drawer-template\"\n    >\n        <x-admin::drawer\n            position=\"left\"\n            width=\"280px\"\n            class=\"lg:hidden [&>:nth-child(3)]:!m-0 [&>:nth-child(3)]:!rounded-l-none [&>:nth-child(3)]:max-sm:!w-[80%]\"\n        >\n            <x-slot:toggle>\n                <i class=\"icon-menu lg:hidden cursor-pointer rounded-md p-1.5 text-2xl hover:bg-gray-100 dark:hover:bg-gray-950 max-lg:block\"></i>\n            </x-slot>\n\n            <x-slot:header>\n                @if ($logo = core()->getConfigData('general.design.admin_logo.logo_image'))\n                    <img\n                        class=\"h-10\"\n                        src=\"{{ Storage::url($logo) }}\"\n                        alt=\"{{ config('app.name') }}\"\n                    />\n                @else\n                    <img\n                        class=\"h-10\"\n                        src=\"{{ request()->cookie('dark_mode') ? vite()->asset('images/dark-logo.svg') : vite()->asset('images/logo.svg') }}\"\n                        id=\"logo-image\"\n                        alt=\"{{ config('app.name') }}\"\n                    />\n                @endif\n            </x-slot>\n\n            <x-slot:content class=\"p-4\">\n                <div class=\"journal-scroll h-[calc(100vh-100px)] overflow-auto\">\n                    <nav class=\"grid w-full gap-2\">\n                        @foreach (menu()->getItems('admin') as $menuItem)\n                            @php\n                                $hasActiveChild = $menuItem->haveChildren() && collect($menuItem->getChildren())->contains(fn($child) => $child->isActive());\n\n                                $isMenuActive = $menuItem->isActive() == 'active' || $hasActiveChild;\n\n                                $menuKey = $menuItem->getKey();\n                            @endphp\n\n                            <div\n                                class=\"menu-item relative\"\n                                data-menu-key=\"{{ $menuKey }}\"\n                            >\n                                <a\n                                    href=\"{{ ! in_array($menuItem->getKey(), ['settings', 'configuration']) && $menuItem->haveChildren() ? 'javascript:void(0)' : $menuItem->getUrl() }}\"\n                                    class=\"menu-link flex items-center justify-between rounded-lg p-2 transition-colors duration-200\"\n                                    @if ($menuItem->haveChildren() && !in_array($menuKey, ['settings', 'configuration']))\n                                        @click.prevent=\"toggleMenu('{{ $menuKey }}')\"\n                                    @endif\n                                    :class=\"{ 'bg-brandColor text-white': activeMenu === '{{ $menuKey }}' || {{ $isMenuActive ? 'true' : 'false' }}, 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-950': !(activeMenu === '{{ $menuKey }}' || {{ $isMenuActive ? 'true' : 'false' }}) }\"\n                                >\n                                    <div class=\"flex items-center gap-3\">\n                                        <span class=\"{{ $menuItem->getIcon() }} text-2xl\"></span>\n\n                                        <p class=\"whitespace-nowrap font-semibold\">{{ $menuItem->getName() }}</p>\n                                    </div>\n\n                                    @if ($menuItem->haveChildren())\n                                        <span\n                                            class=\"transform text-lg transition-transform duration-300\"\n                                            :class=\"{ 'icon-arrow-up': activeMenu === '{{ $menuKey }}', 'icon-arrow-down': activeMenu !== '{{ $menuKey }}' }\"\n                                        ></span>\n                                    @endif\n                                </a>\n\n                                @if ($menuItem->haveChildren() && !in_array($menuKey, ['settings', 'configuration']))\n                                    <div\n                                        class=\"submenu ml-1 mt-1 overflow-hidden rounded-b-lg border-l-2 transition-all duration-300 dark:border-gray-700\"\n                                        :class=\"{ 'max-h-[500px] py-2 border-l-brandColor bg-gray-50 dark:bg-gray-900': activeMenu === '{{ $menuKey }}' || {{ $hasActiveChild ? 'true' : 'false' }}, 'max-h-0 py-0 border-transparent bg-transparent': activeMenu !== '{{ $menuKey }}' && !{{ $hasActiveChild ? 'true' : 'false' }} }\"\n                                    >\n                                        @foreach ($menuItem->getChildren() as $subMenuItem)\n                                            <a\n                                                href=\"{{ $subMenuItem->getUrl() }}\"\n                                                class=\"submenu-link block whitespace-nowrap p-2 pl-10 text-sm transition-colors duration-200\"\n                                                :class=\"{ 'text-brandColor font-medium bg-gray-100 dark:bg-gray-800': '{{ $subMenuItem->isActive() }}' === '1', 'text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800': '{{ $subMenuItem->isActive() }}' !== '1' }\">\n                                                {{ $subMenuItem->getName() }}\n                                            </a>\n                                        @endforeach\n                                    </div>\n                                @endif\n                            </div>\n                        @endforeach\n                    </nav>\n                </div>\n            </x-slot>\n        </x-admin::drawer>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-sidebar-drawer', {\n            template: '#v-sidebar-drawer-template',\n\n            data() {\n                return { activeMenu: null };\n            },\n\n            mounted() {\n                const activeElement = document.querySelector('.menu-item .menu-link.bg-brandColor');\n\n                if (activeElement) {\n                    this.activeMenu = activeElement.closest('.menu-item').getAttribute('data-menu-key');\n                }\n            },\n\n            methods: {\n                toggleMenu(menuKey) {\n                    this.activeMenu = this.activeMenu === menuKey ? null : menuKey;\n                }\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/layouts/tabs.blade.php",
    "content": "@php\n    $tabs = menu()->getCurrentActiveMenu('admin')?->getChildren();\n@endphp\n\n@if (\n    $tabs\n    && $tabs->isNotEmpty()\n)\n    <div class=\"tabs\">\n        <div class=\"mb-4 flex gap-4 border-b-2 pt-2 dark:border-gray-800 max-sm:hidden\">\n            @foreach ($tabs as $tab)\n                <a href=\"{{ $tab->getUrl() }}\">\n                    <div class=\"{{ $tab->isActive() ? \"-mb-px border-blue-600 border-b-2 transition\" : '' }} pb-3.5 px-2.5 text-base font-medium text-gray-600 dark:text-gray-300 cursor-pointer\">\n                        {{ $tab->getName() }}\n                    </div>\n                </a>\n            @endforeach\n        </div>\n    </div>\n@endif\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/lookup/index.blade.php",
    "content": "<v-lookup {{ $attributes }}></v-lookup>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-lookup-template\"\n    >\n        <div\n            class=\"relative\"\n            ref=\"lookup\"\n        >\n            <!-- Input Box (Button) -->\n            <div\n                class=\"relative inline-block w-full\"\n                @click=\"toggle\"\n            >\n                <!-- Input Container -->\n                <div class=\"relative flex cursor-pointer items-center justify-between rounded border border-gray-200 p-2 hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:text-gray-300\">\n                    <!-- Selected Item or Placeholder Text -->\n                    <span\n                        class=\"overflow-hidden text-ellipsis\"\n                        :title=\"selectedItem?.name\"\n                    >\n                        @{{ selectedItem?.name !== \"\" ? selectedItem?.name : \"@lang('admin::app.components.lookup.click-to-add')\" }}\n                    </span>\n\n                    <!-- Icons Container -->\n                    <div class=\"flex items-center gap-2\">\n                        <!-- Close Icon -->\n                        <i\n                            v-if=\"(selectedItem?.name) && ! isSearching\"\n                            class=\"icon-cross-large cursor-pointer text-xl text-gray-600\"\n                            @click=\"remove\"\n                        ></i>\n\n                        <!-- Arrow Icon -->\n                        <i\n                            class=\"text-2xl text-gray-600\"\n                            :class=\"showPopup ? 'icon-up-arrow' : 'icon-down-arrow'\"\n                        ></i>\n                    </div>\n                </div>\n            </div>\n\n            <!-- Hidden Input Box -->\n            <x-admin::form.control-group.control\n                type=\"hidden\"\n                ::name=\"name\"\n                ::rules=\"rules\"\n                ::label=\"label\"\n                v-model=\"selectedItem.id\"\n            />\n\n            <!-- Popup Box -->\n            <div\n                v-if=\"showPopup\"\n                class=\"absolute top-full z-10 mt-1 flex w-full origin-top transform flex-col gap-2 rounded-lg border border-gray-200 bg-white p-2 shadow-lg transition-transform dark:border-gray-900 dark:bg-gray-800\"\n            >\n                <!-- Search Bar -->\n                <div class=\"relative flex items-center\">\n                    <input\n                        type=\"text\"\n                        v-model.lazy=\"searchTerm\"\n                        v-debounce=\"500\"\n                        class=\"w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                        placeholder=\"@lang('admin::app.components.lookup.search')\"\n                        ref=\"searchInput\"\n                        @keyup=\"search\"\n                    />\n\n                    <!-- Search Icon (absolute positioned) -->\n                    <span class=\"absolute flex items-center ltr:right-2 rtl:left-2\">\n                        <!-- Loader (optional, based on condition) -->\n                        <div\n                            class=\"relative\"\n                            v-if=\"isSearching\"\n                        >\n                            <x-admin::spinner />\n                        </div>\n                    </span>\n                </div>\n\n                <!-- Results List -->\n                <ul class=\"max-h-40 divide-y divide-gray-100 overflow-y-auto\">\n                    <li\n                        v-for=\"item in filteredResults\"\n                        :key=\"item.id\"\n                        class=\"cursor-pointer px-4 py-2 text-gray-800 transition-colors hover:bg-blue-100 dark:text-white dark:hover:bg-gray-900\"\n                        @click=\"selectItem(item)\"\n                    >\n                        @{{ item.name }}\n                    </li>\n\n                    <template v-if=\"filteredResults.length === 0\">\n                        <li class=\"px-4 py-2 text-gray-500\">\n                            @lang('admin::app.components.lookup.no-results')\n                        </li>\n\n                        <li\n                            v-if=\"searchTerm.length > 2 && canAddNew\"\n                            @click=\"selectItem({ id: '', name: searchTerm })\"\n                            class=\"cursor-pointer border-t border-gray-800 px-4 py-2 text-gray-500 hover:bg-brandColor hover:text-white dark:border-gray-300 dark:text-gray-400 dark:hover:bg-gray-900 dark:hover:text-white\"\n                        >\n                            <i class=\"icon-add text-md\"></i>\n\n                            @lang('admin::app.components.lookup.add-as-new')\n                        </li>\n                    </template>\n                </ul>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-lookup', {\n            template: '#v-lookup-template',\n\n            props: {\n                src: {\n                    type: String,\n                    required: true,\n                },\n\n                params: {\n                    type: Object,\n                    default: () => ({}),\n                },\n\n                name: {\n                    type: String,\n                    required: true,\n                },\n\n                placeholder: {\n                    type: String,\n                    required: true,\n                },\n\n                value: {\n                    type: Object,\n                    default: () => ({}),\n                },\n\n                rules: {\n                    type: String,\n                    default: '',\n                },\n\n                label: {\n                    type: String,\n                    default: '',\n                },\n\n                canAddNew: {\n                    type: Boolean,\n                    default: false,\n                },\n\n                preload: {\n                    type: Boolean,\n                    default: false,\n                }\n            },\n\n            emits: ['on-selected'],\n\n            data() {\n                return {\n                    showPopup: false,\n\n                    searchTerm: '',\n\n                    selectedItem: {},\n\n                    searchedResults: [],\n\n                    isSearching: false,\n\n                    cancelToken: null,\n                };\n            },\n\n            mounted() {\n                if (this.value) {\n                    this.selectedItem = this.value;\n                }\n\n                this.search(this.preload);\n            },\n\n            created() {\n                window.addEventListener('click', this.handleFocusOut);\n            },\n\n            beforeDestroy() {\n                window.removeEventListener('click', this.handleFocusOut);\n            },\n\n            watch: {\n                searchTerm(newVal, oldVal) {\n                    this.search(this.preload);\n                },\n            },\n\n            computed: {\n                /**\n                 * Filter the searchedResults based on the search query.\n                 *\n                 * @return {Array}\n                 */\n                filteredResults() {\n                    return this.searchedResults.filter(item =>\n                        item.name.toLowerCase().includes(this.searchTerm.toLowerCase())\n                    );\n                }\n            },\n\n            methods: {\n                /**\n                 * Toggle the popup.\n                 *\n                 * @return {void}\n                 */\n                toggle() {\n                    this.showPopup = ! this.showPopup;\n\n                    if (this.showPopup) {\n                        this.$nextTick(() => this.$refs.searchInput.focus());\n                    }\n                },\n\n                /**\n                 * Select an item from the list.\n                 *\n                 * @param {Object} item\n                 *\n                 * @return {void}\n                 */\n                selectItem(item) {\n                    this.showPopup = false;\n\n                    this.searchTerm = '';\n\n                    this.selectedItem = item;\n\n                    this.$emit('on-selected', item);\n                },\n\n                /**\n                 * Initialize the items.\n                 *\n                 * @return {void}\n                 */\n                search(preload = false) {\n                    if (\n                        ! preload\n                        && this.searchTerm.length <= 2\n                    ) {\n                        this.searchedResults = [];\n\n                        this.isSearching = false;\n\n                        return;\n                    }\n\n                    this.isSearching = true;\n\n                    if (this.cancelToken) {\n                        this.cancelToken.cancel();\n                    }\n\n                    this.cancelToken = this.$axios.CancelToken.source();\n\n                    this.$axios.get(this.src, {\n                            params: {\n                                ...this.params,\n                                query: this.searchTerm\n                            },\n                            cancelToken: this.cancelToken.token,\n                        })\n                        .then(response => {\n                            this.searchedResults = response.data.data;\n                        })\n                        .catch(error => {\n                            if (! this.$axios.isCancel(error)) {\n                                console.error(\"Search request failed:\", error);\n                            }\n\n                            this.isSearching = false;\n                        })\n                        .finally(() => this.isSearching = false);\n                },\n\n                /**\n                 * Handle the focus out event.\n                 *\n                 * @param {Event} event\n                 *\n                 * @return {void}\n                 */\n                handleFocusOut(event) {\n                    const lookup = this.$refs.lookup;\n\n                    if (\n                        lookup &&\n                        ! lookup.contains(event.target)\n                    ) {\n                        this.showPopup = false;\n                    }\n                },\n\n                /**\n                 * Remove the selected item.\n                 *\n                 * @return {void}\n                 */\n                remove() {\n                    this.selectedItem = {\n                        id: '',\n                        name: '',\n                    };\n\n                    this.$emit('on-selected', {});\n                }\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/media/images.blade.php",
    "content": "@props([\n    'name' => 'images',\n    'allowMultiple' => false,\n    'showPlaceholders' => false,\n    'uploadedImages' => [],\n    'width' => '120px',\n    'height' => '120px'\n])\n\n<v-media-images\n    name=\"{{ $name }}\"\n    v-bind:allow-multiple=\"{{ $allowMultiple ? 'true' : 'false' }}\"\n    v-bind:show-placeholders=\"{{ $showPlaceholders ? 'true' : 'false' }}\"\n    :uploaded-images='{{ json_encode($uploadedImages) }}'\n    width=\"{{ $width }}\"\n    height=\"{{ $height }}\"\n    :errors=\"errors\"\n>\n    <x-admin::shimmer.image class=\"h-[120px] w-[120px] rounded\" />\n</v-media-images>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-media-images-template\"\n    >\n        <!-- Panel Content -->\n        <div class=\"grid\">\n            <div class=\"flex flex-wrap gap-1\">\n                <!-- Upload Image Button -->\n                <template v-if=\"allowMultiple || images.length == 0\">\n                    <!-- Upload Image Button -->\n                    <label\n                        class=\"grid h-[120px] max-h-[120px] min-h-[110px] w-full min-w-[110px] max-w-[120px] cursor-pointer items-center justify-items-center rounded border border-dashed border-gray-300 transition-all hover:border-gray-400 dark:border-gray-800 dark:mix-blend-exclusion dark:invert\"\n                        :class=\"[(errors?.['images.files[0]'] ?? false) ? 'border border-red-500' : 'border-gray-300']\"\n                        :style=\"{'max-width': this.width, 'max-height': this.height}\"\n                        :for=\"$.uid + '_imageInput'\"\n                    >\n                        <div class=\"flex flex-col items-center\">\n                            <span class=\"icon-image text-2xl\"></span>\n\n                            <p class=\"grid text-center text-sm font-semibold text-gray-600 dark:text-gray-300\">\n                                @lang('admin::app.components.media.images.add-image-btn')\n                                \n                                <span class=\"text-xs\">\n                                    @lang('admin::app.components.media.images.allowed-types')\n                                </span>\n                            </p>\n\n                            <input\n                                type=\"file\"\n                                class=\"hidden\"\n                                :id=\"$.uid + '_imageInput'\"\n                                accept=\"image/*\"\n                                :multiple=\"allowMultiple\"\n                                :ref=\"$.uid + '_imageInput'\"\n                                @change=\"add\"\n                            />\n                        </div>\n                    </label>\n                </template>\n\n                <!-- Uploaded Images -->\n                <draggable\n                    class=\"flex flex-wrap gap-1\"\n                    ghost-class=\"draggable-ghost\"\n                    v-bind=\"{animation: 200}\"\n                    :list=\"images\"\n                    item-key=\"id\"\n                >\n                    <template #item=\"{ element, index }\">\n                        <v-media-image-item\n                            :name=\"name\"\n                            :index=\"index\"\n                            :image=\"element\"\n                            :width=\"width\"\n                            :height=\"height\"\n                            @onRemove=\"remove($event)\"\n                        >\n                        </v-media-image-item>\n                    </template>\n                </draggable>\n\n                <!-- Placeholders -->\n                <template v-if=\"showPlaceholders && ! images.length\">\n                    <!-- Front Placeholder -->\n                    <div\n                        class=\"relative h-[120px] max-h-[120px] w-full min-w-[120px] max-w-[120px] rounded border border-dashed border-gray-300 dark:border-gray-800 dark:mix-blend-exclusion dark:invert\"\n                        v-for=\"placeholder in placeholders\"\n                    >\n                        <img :src=\"placeholder.image\">\n\n                        <p class=\"absolute bottom-4 w-full text-center text-xs font-semibold text-gray-400\">\n                            @{{ placeholder.label }}\n                        </p>\n                    </div>\n                </template>\n            </div>\n        </div>  \n    </script>\n\n    <script type=\"text/x-template\" id=\"v-media-image-item-template\">\n        <div class=\"group relative grid max-h-[120px] min-w-[120px] justify-items-center overflow-hidden rounded transition-all hover:border-gray-400\">\n            <!-- Image Preview -->\n            <img\n                :src=\"image.url\"\n                :style=\"{'width': this.width, 'height': this.height}\"\n            />\n\n            <div class=\"invisible absolute bottom-0 top-0 flex w-full flex-col justify-between bg-white p-3 opacity-80 transition-all group-hover:visible dark:bg-gray-900\">\n                <!-- Image Name -->\n                <p class=\"break-all text-xs font-semibold text-gray-600 dark:text-gray-300\"></p>\n\n                <!-- Actions -->\n                <div class=\"flex justify-between\">\n                    <span\n                        class=\"icon-delete cursor-pointer rounded-md p-1.5 text-2xl hover:bg-gray-200 dark:hover:bg-gray-800\"\n                        @click=\"remove\"\n                    ></span>\n\n                    <label\n                        class=\"icon-edit cursor-pointer rounded-md p-1.5 text-2xl hover:bg-gray-200 dark:hover:bg-gray-800\"\n                        :for=\"$.uid + '_imageInput_' + index\"\n                    ></label>\n\n                    <input\n                        type=\"hidden\"\n                        :name=\"name + '[' + image.id + ']'\"\n                        v-if=\"! image.is_new\"\n                    />\n\n                    <input\n                        type=\"file\"\n                        :name=\"name + '[]'\"\n                        class=\"hidden\"\n                        accept=\"image/*\"\n                        :id=\"$.uid + '_imageInput_' + index\"\n                        :ref=\"$.uid + '_imageInput_' + index\"\n                        @change=\"edit\"\n                    />\n                </div>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-media-images', {\n            template: '#v-media-images-template',\n\n            props: {\n                name: {\n                    type: String, \n                    default: 'images',\n                },\n\n                allowMultiple: {\n                    type: Boolean,\n                    default: false,\n                },\n\n                showPlaceholders: {\n                    type: Boolean,\n                    default: false,\n                },\n\n                uploadedImages: {\n                    type: Array,\n                    default: () => []\n                },\n\n                width: {\n                    type: String,\n                    default: '120px'\n                },\n\n                height: {\n                    type: String,\n                    default: '120px'\n                },\n\n                errors: {\n                    type: Object,\n                    default: () => {}\n                }\n            },\n\n            data() {\n                return {\n                    images: [],\n\n                    placeholders: [\n                        {\n                            label: \"@lang('admin::app.components.media.images.placeholders.front')\",\n                            image: \"{{ asset('images/product-placeholders/front.svg') }}\"\n                        }, {\n                            label: \"@lang('admin::app.components.media.images.placeholders.next')\",\n                            image: \"{{ asset('images/product-placeholders/next-1.svg') }}\"\n                        }, {\n                            label: \"@lang('admin::app.components.media.images.placeholders.next')\",\n                            image: \"{{ asset('images/product-placeholders/next-2.svg') }}\"\n                        }, {\n                            label: \"@lang('admin::app.components.media.images.placeholders.zoom')\",\n                            image: \"{{ asset('images/product-placeholders/zoom.svg') }}\"\n                        }, {\n                            label: \"@lang('admin::app.components.media.images.placeholders.use-cases')\",\n                            image: \"{{ asset('images/product-placeholders/use-cases.svg') }}\"\n                        }, {\n                            label: \"@lang('admin::app.components.media.images.placeholders.size')\",\n                            image: \"{{ asset('images/product-placeholders/size.svg') }}\"\n                        }\n                    ],\n\n                    isLoading: false,\n                }\n            },\n\n            mounted() {\n                this.images = this.uploadedImages;\n            },\n\n            methods: {\n                add() {\n                    let imageInput = this.$refs[this.$.uid + '_imageInput'];\n\n                    if (imageInput.files == undefined) {\n                        return;\n                    }\n\n                    const validFiles = Array.from(imageInput.files).every(file => file.type.includes('image/'));\n\n                    if (! validFiles) {\n                        this.$emitter.emit('add-flash', {\n                            type: 'warning',\n                            message: \"@lang('admin::app.components.media.images.not-allowed-error')\"\n                        });\n\n                        return;\n                    }\n\n                    imageInput.files.forEach((file, index) => {\n                        this.images.push({\n                            id: 'image_' + this.images.length,\n                            url: '',\n                            file: file\n                        });\n                    });\n                },\n\n                remove(image) {\n                    let index = this.images.indexOf(image);\n\n                    this.images.splice(index, 1);\n                },\n\n                getBase64ToFile(base64, filename) {\n                    var arr = base64.split(','),\n                        mime = arr[0].match(/:(.*?);/)[1],\n                        bstr = atob(arr[arr.length - 1]), \n                        n = bstr.length, \n                        u8arr = new Uint8Array(n);\n\n                    while (n--) {\n                        u8arr[n] = bstr.charCodeAt(n);\n                    }\n\n                    return new File([u8arr], filename, {type:mime});\n                },\n            }\n        });\n\n        app.component('v-media-image-item', {\n            template: '#v-media-image-item-template',\n\n            props: ['index', 'image', 'name', 'width', 'height'],\n\n            mounted() {\n                if (this.image.file instanceof File) {\n                    this.setFile(this.image.file);\n\n                    this.readFile(this.image.file);\n                }\n            },\n\n            methods: {\n                edit() {\n                    let imageInput = this.$refs[this.$.uid + '_imageInput_' + this.index];\n\n                    if (imageInput.files == undefined) {\n                        return;\n                    }\n\n                    const validFiles = Array.from(imageInput.files).every(file => file.type.includes('image/'));\n\n                    if (! validFiles) {\n                        this.$emitter.emit('add-flash', {\n                            type: 'warning',\n                            message: \"@lang('admin::app.components.media.images.not-allowed-error')\"\n                        });\n\n                        return;\n                    }\n\n                    this.setFile(imageInput.files[0]);\n\n                    this.readFile(imageInput.files[0]);\n                },\n\n                remove() {\n                    this.$emit('onRemove', this.image)\n                },\n\n                setFile(file) {\n                    this.image.is_new = 1;\n\n                    const dataTransfer = new DataTransfer();\n\n                    dataTransfer.items.add(file);\n\n                    this.$refs[this.$.uid + '_imageInput_' + this.index].files = dataTransfer.files;\n                },\n\n                readFile(file) {\n                    let reader = new FileReader();\n\n                    reader.onload = (e) => {\n                        this.image.url = e.target.result;\n                    }\n\n                    reader.readAsDataURL(file);\n                },\n            }\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/media/videos.blade.php",
    "content": "@props([\n    'name' => 'images',\n    'allowMultiple' => false,\n    'uploadedVideos' => [],\n    'width' => '210px',\n    'height' => '120px'\n])\n\n<v-media-videos\n    name=\"{{ $name }}\"\n    v-bind:allow-multiple=\"{{ $allowMultiple ? 'true' : 'false' }}\"\n    :uploaded-videos='{{ json_encode($uploadedVideos) }}'\n    width=\"{{ $width }}\"\n    height=\"{{ $height }}\"\n    :errors=\"errors\"\n    {{ $attributes->get('class') }}\n>\n</v-media-videos>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-media-videos-template\"\n    >\n        <!-- Panel Content -->\n        <div class=\"grid\">\n            <div class=\"flex gap-1\">\n                <!-- Upload Video Button -->\n\n                <label\n                    class=\"grid h-[120px] max-h-[120px] w-full max-w-[210px] cursor-pointer items-center justify-items-center rounded border border-dashed transition-all hover:border-gray-400 dark:border-gray-800 dark:mix-blend-exclusion dark:invert\"\n                    :class=\"[errors['videos.files[0]'] ? 'border border-red-500' : 'border-gray-300']\"\n                    :for=\"$.uid + '_videoInput'\"\n                    v-if=\"allowMultiple || videos.length == 0\"\n                >\n                    <div class=\"flex flex-col items-center\">\n                        <span class=\"icon-image text-2xl\"></span>\n\n                        <p class=\"grid text-center text-sm font-semibold text-gray-600 dark:text-gray-300\">\n                            @lang('admin::app.components.media.videos.add-video-btn')\n                            \n                            <span class=\"text-xs\">\n                                @lang('admin::app.components.media.videos.allowed-types')\n                            </span>\n                        </p>\n\n                        <input\n                            type=\"file\"\n                            class=\"hidden\"\n                            :id=\"$.uid + '_videoInput'\"\n                            accept=\"video/*\"\n                            :multiple=\"allowMultiple\"\n                            :ref=\"$.uid + '_videoInput'\"\n                            @change=\"add\"\n                        />\n                    </div>\n                </label>\n\n                <!-- Uploaded Videos -->\n                <draggable\n                    class=\"flex gap-1\"\n                    ghost-class=\"draggable-ghost\"\n                    v-bind=\"{animation: 200}\"\n                    :list=\"videos\"\n                    item-key=\"id\"\n                >\n                    <template #item=\"{ element, index }\">\n                        <v-media-video-item\n                            :name=\"name\"\n                            :index=\"index\"\n                            :video=\"element\"\n                            :width=\"width\"\n                            :height=\"height\"\n                            @onRemove=\"remove($event)\"\n                        >\n                        </v-media-video-item>\n                    </template>\n                </draggable>\n            </div>\n        </div>\n    </script>\n\n    <script\n        type=\"text/x-template\"\n        id=\"v-media-video-item-template\"\n    >\n        <div class=\"group relative grid h-[120px] max-h-[120px] min-w-[210px] max-w-[210px] justify-items-center overflow-hidden rounded border border-dashed border-gray-300 transition-all hover:border-gray-400 dark:border-gray-800\">\n            <!-- Video Preview -->\n            <video\n                class=\"h-[120px] w-[210px] object-cover\"\n                ref=\"videoPreview\"\n                v-if=\"video.url.length > 0\"\n            >\n                <source :src=\"video.url\" type=\"video/mp4\">\n            </video>\n\n            <div class=\"invisible absolute bottom-0 top-0 flex w-full flex-col justify-between bg-white p-3 opacity-80 transition-all group-hover:visible dark:bg-gray-900\">\n                <!-- Video Name -->\n                <p class=\"break-all text-xs font-semibold text-gray-600 dark:text-gray-300\"></p>\n\n                <!-- Actions -->\n                <div class=\"flex justify-between\">\n                    <!-- Remove Button -->\n                    <span\n                        class=\"icon-delete cursor-pointer rounded-md p-1.5 text-2xl hover:bg-gray-200 dark:hover:bg-gray-800\"\n                        @click=\"remove\"\n                    ></span>\n\n                    <!-- Play Pause Button -->\n                    <span\n                        class=\"cursor-pointer rounded-md p-1.5 text-2xl hover:bg-gray-200 dark:hover:bg-gray-800\"\n                        :class=\"[isPlaying ? 'icon-pause': 'icon-play']\"\n                        @click=\"playPause\"\n                    ></span>\n\n                    <!-- Edit Button -->\n                    <label\n                        class=\"icon-edit cursor-pointer rounded-md p-1.5 text-2xl hover:bg-gray-200 dark:hover:bg-gray-800\"\n                        :for=\"$.uid + '_videoInput_' + index\"\n                    ></label>\n\n                    <input\n                        type=\"hidden\"\n                        :name=\"name + '[' + video.id + ']'\"\n                        v-if=\"! video.is_new\"\n                    />\n\n                    <input\n                        type=\"file\"\n                        :name=\"name + '[]'\"\n                        class=\"hidden\"\n                        accept=\"video/*\"\n                        :id=\"$.uid + '_videoInput_' + index\"\n                        :ref=\"$.uid + '_videoInput_' + index\"\n                        @change=\"edit\"\n                    />\n                </div>\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-media-videos', {\n            template: '#v-media-videos-template',\n\n            props: {\n                name: {\n                    type: String, \n                    default: 'videos',\n                },\n\n                allowMultiple: {\n                    type: Boolean,\n                    default: false,\n                },\n\n                uploadedVideos: {\n                    type: Array,\n                    default: () => []\n                },\n\n                width: {\n                    type: String,\n                    default: '210px'\n                },\n\n                height: {\n                    type: String,\n                    default: '120px'\n                },\n\n                errors: {\n                    type: Object,\n                    default: () => {}\n                }\n            },\n\n            data() {\n                return {\n                    videos: [],\n                }\n            },\n\n            mounted() {\n                this.videos = this.uploadedVideos;\n            },\n\n            methods: {\n                add() {\n                    let videoInput = this.$refs[this.$.uid + '_videoInput'];\n\n                    if (videoInput.files == undefined) {\n                        return;\n                    }\n\n                    const validFiles = Array.from(videoInput.files).every(file => file.type.includes('video/'));\n\n                    if (! validFiles) {\n                        this.$emitter.emit('add-flash', {\n                            type: 'warning',\n                            message: \"@lang('admin::app.components.media.videos.not-allowed-error')\"\n                        });\n\n                        return;\n                    }\n\n                    videoInput.files.forEach((file, index) => {\n                        this.videos.push({\n                            id: 'video_' + this.videos.length,\n                            url: '',\n                            file: file\n                        });\n                    });\n                },\n\n                remove(video) {\n                    let index = this.videos.indexOf(video);\n\n                    this.videos.splice(index, 1);\n                },\n            }\n        });\n\n        app.component('v-media-video-item', {\n            template: '#v-media-video-item-template',\n\n            props: ['index', 'video', 'name', 'width', 'height'],\n\n            data() {\n                return {\n                    isPlaying: false\n                }\n            },\n\n            mounted() {\n                if (this.video.file instanceof File) {\n                    this.setFile(this.video.file);\n\n                    this.readFile(this.video.file);\n                }\n            },\n\n            methods: {\n                edit() {\n                    let videoInput = this.$refs[this.$.uid + '_videoInput_' + this.index];\n\n                    if (videoInput.files == undefined) {\n                        return;\n                    }\n\n                    const validFiles = Array.from(videoInput.files).every(file => file.type.includes('video/'));\n\n                    if (! validFiles) {\n                        this.$emitter.emit('add-flash', {\n                            type: 'warning',\n                            message: \"@lang('admin::app.components.media.videos.not-allowed-error')\"\n                        });\n\n                        return;\n                    }\n\n                    this.setFile(videoInput.files[0]);\n\n                    this.readFile(videoInput.files[0]);\n                },\n\n                remove() {\n                    this.$emit('onRemove', this.video)\n                },\n\n                setFile(file) {\n                    this.video.is_new = 1;\n\n                    const dataTransfer = new DataTransfer();\n\n                    dataTransfer.items.add(file);\n\n                    this.$refs[this.$.uid + '_videoInput_' + this.index].files = dataTransfer.files;\n                },\n\n                readFile(file) {\n                    let reader = new FileReader();\n\n                    reader.onload = (e) => {\n                        this.video.url = e.target.result;\n                    }\n\n                    reader.readAsDataURL(file);\n                },\n\n                playPause() {\n                    let videoPreview = this.$refs.videoPreview;\n\n                    if (videoPreview.paused == true) {\n                        this.isPlaying = true;\n\n                        videoPreview.play();\n                    } else {\n                        this.isPlaying = false;\n\n                        videoPreview.pause();\n                    }\n                }\n            }\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/modal/confirm.blade.php",
    "content": "<v-modal-confirm ref=\"confirmModal\"></v-modal-confirm>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-modal-confirm-template\"\n    >\n        <div>\n            <transition\n                tag=\"div\"\n                name=\"modal-overlay\"\n                enter-class=\"duration-300 ease-out\"\n                enter-from-class=\"opacity-0\"\n                enter-to-class=\"opacity-100\"\n                leave-class=\"duration-200 ease-in\"\n                leave-from-class=\"opacity-100\"\n                leave-to-class=\"opacity-0\"\n            >\n                <div\n                    class=\"fixed inset-0 z-[10003] bg-gray-500 bg-opacity-50 transition-opacity\"\n                    v-show=\"isOpen\"\n                ></div>\n            </transition>\n\n            <transition\n                tag=\"div\"\n                name=\"modal-content\"\n                enter-class=\"duration-300 ease-out\"\n                enter-from-class=\"translate-y-4 opacity-0 md:translate-y-0 md:scale-95\"\n                enter-to-class=\"translate-y-0 opacity-100 md:scale-100\"\n                leave-class=\"duration-200 ease-in\"\n                leave-from-class=\"translate-y-0 opacity-100 md:scale-100\"\n                leave-to-class=\"translate-y-4 opacity-0 md:translate-y-0 md:scale-95\"\n            >\n                <div\n                    class=\"fixed inset-0 z-[10004] transform overflow-y-auto transition\"\n                    v-if=\"isOpen\"\n                >\n                    <div class=\"flex min-h-full items-end justify-center p-5 sm:items-center sm:p-0\">\n                        <div class=\"box-shadow absolute left-1/2 top-1/2 z-[999] w-full max-w-[400px] -translate-x-1/2 -translate-y-1/2 rounded-lg bg-white dark:bg-gray-900 max-md:w-[90%]\">\n                            <div class=\"flex items-center justify-between gap-2.5 border-b px-4 py-3 text-lg font-bold text-gray-800 dark:border-gray-800 dark:text-white\">\n                                @{{ title }}\n                            </div>\n\n                            <div class=\"px-4 py-3 text-left text-gray-600 dark:text-gray-300\">\n                                @{{ message }}\n                            </div>\n\n                            <div class=\"flex justify-end gap-2.5 px-4 py-2.5\">\n                                <button type=\"button\" class=\"transparent-button\" @click=\"disagree\">\n                                    @{{ options.btnDisagree }}\n                                </button>\n\n                                <button type=\"button\" class=\"primary-button\" @click=\"agree\">\n                                    @{{ options.btnAgree }}\n                                </button>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </transition>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-modal-confirm', {\n            template: '#v-modal-confirm-template',\n\n            data() {\n                return {\n                    isOpen: false,\n\n                    title: '',\n\n                    message: '',\n\n                    options: {\n                        btnDisagree: '',\n                        btnAgree: '',\n                    },\n\n                    agreeCallback: null,\n\n                    disagreeCallback: null,\n                };\n            },\n\n            created() {\n                this.registerGlobalEvents();\n            },\n\n            methods: {\n                open({\n                    title = \"@lang('admin::app.components.modal.confirm.title')\",\n                    message = \"@lang('admin::app.components.modal.confirm.message')\",\n                    options = {\n                        btnDisagree: \"@lang('admin::app.components.modal.confirm.disagree-btn')\",\n                        btnAgree: \"@lang('admin::app.components.modal.confirm.agree-btn')\",\n                    },\n                    agree = () => {},\n                    disagree = () => {},\n                }) {\n                    this.isOpen = true;\n\n                    document.body.style.overflow = 'hidden';\n\n                    this.title = title;\n\n                    this.message = message;\n\n                    this.options = options;\n\n                    this.agreeCallback = agree;\n\n                    this.disagreeCallback = disagree;\n                },\n\n                disagree() {\n                    this.isOpen = false;\n\n                    document.body.style.overflow = 'auto';\n\n                    this.disagreeCallback();\n                },\n\n                agree() {\n                    this.isOpen = false;\n\n                    document.body.style.overflow = 'auto';\n\n                    this.agreeCallback();\n                },\n\n                registerGlobalEvents() {\n                    this.$emitter.on('open-confirm-modal', this.open);\n                },\n            }\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/modal/index.blade.php",
    "content": "@props([\n    'isActive' => false,\n    'position' => 'center',\n    'size' => 'normal',\n])\n\n<v-modal\n    is-active=\"{{ $isActive }}\"\n    position=\"{{ $position }}\"\n    size=\"{{ $size }}\"\n    {{ $attributes }}\n>\n    @isset($toggle)\n        <template v-slot:toggle>\n            {{ $toggle }}\n        </template>\n    @endisset\n\n    @isset($header)\n        <template v-slot:header=\"{ toggle, isOpen }\">\n            <div {{ $header->attributes->merge(['class' => 'flex items-center justify-between gap-2.5 border-b px-4 py-3 dark:border-gray-800']) }}>\n                {{ $header }}\n\n                <span\n                    class=\"icon-cross-large cursor-pointer text-3xl hover:rounded-md hover:bg-gray-100 dark:hover:bg-gray-950\"\n                    @click=\"toggle\"\n                >\n                </span>\n            </div>\n        </template>\n    @endisset\n\n    @isset($content)\n        <template v-slot:content>\n            <div {{ $content->attributes->merge(['class' => 'border-b px-4 py-2.5 dark:border-gray-800']) }}>\n                {{ $content }}\n            </div>\n        </template>\n    @endisset\n\n    @isset($footer)\n        <template v-slot:footer>\n            <div {{ $content->attributes->merge(['class' => 'flex justify-end px-4 py-2.5']) }}>\n                {{ $footer }}\n            </div>\n        </template>\n    @endisset\n</v-modal>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-modal-template\"\n    >\n        <div>\n            <div @click=\"toggle\">\n                <slot name=\"toggle\">\n                </slot>\n            </div>\n\n            <transition\n                tag=\"div\"\n                name=\"modal-overlay\"\n                enter-class=\"duration-300 ease-[cubic-bezier(.4,0,.2,1)]\"\n                enter-from-class=\"opacity-0\"\n                enter-to-class=\"opacity-100\"\n                leave-class=\"duration-200 ease-[cubic-bezier(.4,0,.2,1)]\"\n                leave-from-class=\"opacity-100\"\n                leave-to-class=\"opacity-0\"\n            >\n                <div\n                    class=\"fixed inset-0 z-[10002] bg-gray-500 bg-opacity-50 transition-opacity\"\n                    v-show=\"isOpen\"\n                ></div>\n            </transition>\n\n            <transition\n                tag=\"div\"\n                name=\"modal-content\"\n                enter-class=\"duration-300 ease-[cubic-bezier(.4,0,.2,1)]\"\n                :enter-from-class=\"enterFromLeaveToClasses\"\n                enter-to-class=\"translate-y-0 opacity-100\"\n                leave-class=\"duration-300 ease-[cubic-bezier(.4,0,.2,1)]\"\n                leave-from-class=\"translate-y-0 opacity-100\"\n                :leave-to-class=\"enterFromLeaveToClasses\"\n            >\n                <div\n                    class=\"fixed inset-0 z-[10003] transform overflow-y-auto transition\"\n                    v-if=\"isOpen\"\n                >\n                    <div class=\"flex min-h-full items-center justify-center max-md:p-4\">\n                        <div\n                            class=\"box-shadow z-[999] w-full overflow-hidden rounded-lg bg-white dark:bg-gray-900 sm:absolute\"\n                            :class=\"[finalPositionClass, sizeClass]\"\n                        >\n                            <!-- Header Slot -->\n                            <slot\n                                name=\"header\"\n                                :toggle=\"toggle\"\n                                :isOpen=\"isOpen\"\n                            >\n                            </slot>\n\n                            <!-- Content Slot -->\n                            <slot name=\"content\"></slot>\n                            \n                            <!-- Footer Slot -->\n                            <slot name=\"footer\"></slot>\n                        </div>\n                    </div>\n                </div>\n            </transition>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-modal', {\n            template: '#v-modal-template',\n\n            props: [\n                'isActive',\n                'position',\n                'size'\n            ],\n\n            emits: [\n                'toggle',\n                'open',\n                'close',\n            ],\n\n            data() {\n                return {\n                    isOpen: this.isActive,\n\n                    isMobile: window.innerWidth < 640,\n                };\n            },\n\n            created() {\n                window.addEventListener('resize', this.checkScreenSize);\n            },\n\n            beforeUnmount() {\n                window.removeEventListener('resize', this.checkScreenSize);\n            },\n\n            computed: {\n                positionClass() {\n                    return {\n                        'center': 'items-center justify-center',\n                        'top-center': 'top-4',\n                        'bottom-center': 'bottom-4',\n                        'bottom-right': 'bottom-4 right-4',\n                        'bottom-left': 'bottom-4 left-4',\n                        'top-right': 'top-4 right-4',\n                        'top-left': 'top-4 left-4',\n                    }[this.position];\n                },\n\n                finalPositionClass() {\n                    return this.isMobile \n                        ? 'items-center justify-center' \n                        : this.positionClass;\n                },\n\n                sizeClass() {\n                    return {\n                        'normal': 'max-w-[525px]',\n                        'medium': 'max-w-[768px]',\n                        'large': 'max-w-[950px]',\n                    }[this.size] || 'max-w-[525px]';\n                },\n\n                enterFromLeaveToClasses() {\n                    const effectivePosition = this.isMobile ? 'center' : this.position;\n                    \n                    return {\n                        'center': '-translate-y-4 opacity-0',\n                        'top-center': '-translate-y-4 opacity-0',\n                        'bottom-center': 'translate-y-4 opacity-0',\n                        'bottom-right': 'translate-y-4 opacity-0',\n                        'bottom-left': 'translate-y-4 opacity-0',\n                        'top-right': '-translate-y-4 opacity-0',\n                        'top-left': '-translate-y-4 opacity-0',\n                    }[effectivePosition];\n                }\n            },\n\n            methods: {\n                checkScreenSize() {\n                    this.isMobile = window.innerWidth < 640;\n                },\n                \n                toggle() {\n                    this.isOpen = ! this.isOpen;\n\n                    if (this.isOpen) {\n                        document.body.style.overflow = 'hidden';\n                    } else {\n                        document.body.style.overflow ='auto';\n                    }\n\n                    this.$emit('toggle', { isActive: this.isOpen });\n                },\n\n                open() {\n                    this.isOpen = true;\n\n                    document.body.style.overflow = 'hidden';\n\n                    this.$emit('open', { isActive: this.isOpen });\n                },\n\n                close() {\n                    this.isOpen = false;\n\n                    document.body.style.overflow = 'auto';\n\n                    this.$emit('close', { isActive: this.isOpen });\n                }\n            }\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/accordion/index.blade.php",
    "content": "<div class=\"!rounded-lg bg-white dark:bg-gray-900\">\n    <div class=\"flex items-center justify-between gap-x-5 p-4\">\n        <p class=\"shimmer w-[200px] p-2.5\"></p>\n        <p class=\"shimmer w-5 p-2.5\"></p>\n    </div>\n    \n    <div class=\"px-4 pb-4\">\n        <div class=\"grid gap-y-2.5\">\n            <p class=\"shimmer w-[200px] p-2.5\"></p>\n            <p class=\"shimmer w-[200px] p-2.5\"></p>\n            <p class=\"shimmer w-40 p-2.5\"></p>\n            <p class=\"shimmer w-40 p-2.5\"></p>\n            <p class=\"shimmer w-40 p-2.5\"></p>\n            <p class=\"shimmer w-40 p-2.5\"></p>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/activities/index.blade.php",
    "content": "<div class=\"w-full rounded-md border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n    <!-- Tabs -->\n    <div class=\"flex gap-2 overflow-x-auto border-b border-gray-200 dark:border-gray-800\">\n        @for ($i = 0; $i < 5; $i++)\n            <div class=\"px-3 py-[11px]\">\n                <div class=\"shimmer h-5 w-24\"></div>\n            </div>\n        @endfor\n    </div>\n\n    <!-- Tab Content -->\n    <div class=\"p-4\">\n        <!-- Activity List -->\n        <div class=\"flex flex-col gap-4\">\n            @for ($i = 0; $i < 5; $i++)\n                <!-- Activity Item -->\n                <div class=\"flex gap-2\">\n                    <!-- Icon -->\n                    <div class=\"shimmer mt-2 flex h-9 w-9 rounded-full\"></div>\n\n                    <!-- Details -->\n                    <div class=\"flex w-full justify-between gap-4 p-4\">\n                        <div class=\"flex w-full flex-col gap-2\">\n                            <div class=\"shimmer h-[17px] w-48\"></div>\n\n                            <div class=\"flex flex-col gap-1\">\n                                <div class=\"shimmer h-[17px] w-full\"></div>\n                                <div class=\"shimmer h-[17px] w-1/2\"></div>\n                            </div>\n\n                            <div class=\"shimmer h-5 w-48\"></div>\n                        </div>\n\n                        <!-- Menu -->\n                        <div class=\"shimmer h-7 w-7 rounded-md\"></div>\n                    </div>\n                </div>\n            @endfor\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/charts/bar.blade.php",
    "content": "@props(['count' => 30])\n\n<div class=\"flex gap-1.5\">\n    <div class=\"grid\">\n        @foreach (range(1, 10) as $i)\n            <div class=\"shimmer h-[15px] w-[39px]\"></div>\n        @endforeach\n    </div>\n\n    <div class=\"grid w-full gap-1.5\">\n        <div class=\"flex aspect-[3.23/1] w-full items-end border-b border-l pl-2.5 dark:border-gray-800\">\n            <div class=\"flex aspect-[3.23/1] w-full items-end justify-between gap-5 max-lg:gap-4 max-sm:gap-2.5\">\n                @foreach (range(1, $count) as $i)\n                    <div\n                        class=\"shimmer flex w-full\"\n                        style=\"height: {{ rand(10, 100) }}%\"\n                    ></div>\n                @endforeach\n            </div>\n        </div>\n\n        <div class=\"flex justify-between gap-5 pl-2.5 max-lg:gap-4 max-sm:gap-2.5\">\n            @foreach (range(1, $count) as $i)\n                <div class=\"shimmer flex h-[15px] w-full\"></div>\n            @endforeach\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/common/address.blade.php",
    "content": "<div class=\"flex gap-4\">\n    <div class=\"w-full\">\n        <div class=\"shimmer w-50% h-56\"></div>\n    </div>\n\n    <div class=\"grid w-full gap-3\">\n        <div class=\"shimmer w-50% h-10\"></div>\n\n        <div class=\"shimmer w-50% h-10\"></div>\n\n        <div class=\"shimmer w-50% h-10\"></div>\n        \n        <div class=\"shimmer w-50% h-10\"></div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/open-leads-by-states.blade.php",
    "content": "<div class=\"grid gap-4 rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n    <div class=\"flex items-center justify-between\">\n        <div class=\"shimmer h-[17px] w-28\"></div>\n    </div>\n\n    <div class=\"flex w-full max-w-full flex-col gap-4\">\n        <div class=\"flex w-full flex-col\">\n            @for ($i = 0; $i < 4; $i++)\n                <div class=\"flex w-full flex-col gap-1 border-b border-gray-200 pb-[9px] pt-2.5 last:border-none dark:border-gray-800\">\n                    <div class=\"shimmer h-[18px] w-[76px] rounded-sm\"></div>\n                    <div class=\"shimmer h-[18px] w-[76px] rounded-sm\"></div>\n                </div>\n            @endfor\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/over-all.blade.php",
    "content": "<div class=\"grid grid-cols-3 gap-4 max-md:grid-cols-2 max-sm:grid-cols-1\">\n    @for ($i = 1; $i <= 6; $i++)\n        <div class=\"flex flex-col gap-2 rounded-lg border border-gray-200 bg-white px-4 py-5 dark:border-gray-800 dark:bg-gray-900\">\n            <div class=\"shimmer h-[17px] w-40\"></div>\n\n            <div class=\"flex gap-2\">\n                <div class=\"shimmer h-[17px] w-24\"></div>\n\n                <div class=\"shimmer h-[17px] w-8\"></div>\n            </div>\n        </div>\n    @endfor\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-sources.blade.php",
    "content": "<div class=\"grid gap-4 rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n    <div class=\"flex items-center justify-between\">\n        <div class=\"shimmer h-[17px] w-28\"></div>\n    </div>\n\n    <div class=\"flex flex-col gap-4 px-8 pt-8\">\n        <div class=\"shimmer h-[280px] w-[280px] rounded-full\"></div>\n\n        <div class=\"flex justify-center gap-5\">\n            <div class=\"flex items-center gap-2\">\n                <div class=\"shimmer h-3.5 w-3.5 rounded-sm\"></div>\n                <div class=\"shimmer h-[17px] w-[76px] rounded-sm\"></div>\n            </div>\n            \n            <div class=\"flex items-center gap-2\">\n                <div class=\"shimmer h-3.5 w-3.5 rounded-sm\"></div>\n                <div class=\"shimmer h-[17px] w-[76px] rounded-sm\"></div>\n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue-by-types.blade.php",
    "content": "<div class=\"grid gap-4 rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n    <div class=\"flex items-center justify-between\">\n        <div class=\"shimmer h-[17px] w-28\"></div>\n    </div>\n\n    <div class=\"flex flex-col gap-4 px-8 pt-8\">\n        <div class=\"shimmer h-[280px] w-[280px] rounded-full\"></div>\n\n        <div class=\"flex justify-center gap-5\">\n            <div class=\"flex items-center gap-2\">\n                <div class=\"shimmer h-3.5 w-3.5 rounded-sm\"></div>\n                <div class=\"shimmer h-[17px] w-[76px] rounded-sm\"></div>\n            </div>\n            \n            <div class=\"flex items-center gap-2\">\n                <div class=\"shimmer h-3.5 w-3.5 rounded-sm\"></div>\n                <div class=\"shimmer h-[17px] w-[76px] rounded-sm\"></div>\n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/revenue.blade.php",
    "content": "<div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n    <div class=\"flex gap-4 max-md:flex-wrap\">\n        <!-- Total Revenue -->\n        <div class=\"flex gap-2 max-md:flex-wrap md:flex-col\">\n            <div class=\"flex min-w-[177px] flex-col gap-2 rounded-lg border border-gray-200 bg-white px-4 py-5 dark:border-gray-800 dark:bg-gray-900\">\n                <div class=\"shimmer h-[17px] w-20\"></div>\n\n                <div class=\"flex gap-2\">\n                    <div class=\"shimmer h-[17px] w-24\"></div>\n\n                    <div class=\"shimmer h-[17px] w-8\"></div>\n                </div>\n            </div>\n            \n            <div class=\"flex min-w-[177px] flex-col gap-2 rounded-lg border border-gray-200 bg-white px-4 py-5 dark:border-gray-800 dark:bg-gray-900\">\n                <div class=\"shimmer h-[17px] w-20\"></div>\n\n                <div class=\"flex gap-2\">\n                    <div class=\"shimmer h-[17px] w-24\"></div>\n\n                    <div class=\"shimmer h-[17px] w-8\"></div>\n                </div>\n            </div>\n        </div>\n\n        <!-- Bar Chart -->\n        <div class=\"flex w-full max-w-full flex-col gap-11\">\n            <div class=\"flex flex-col gap-4 p-2\">\n                <div class=\"shimmer h-[49px] w-full max-w-full\"></div>\n                <div class=\"shimmer h-12 w-3/4\"></div>\n            </div>\n\n            <div class=\"flex justify-center gap-5\">\n                <div class=\"flex items-center gap-2\">\n                    <div class=\"shimmer h-3.5 w-3.5 rounded-sm\"></div>\n                    <div class=\"shimmer h-[17px] w-[76px] rounded-sm\"></div>\n                </div>\n                \n                <div class=\"flex items-center gap-2\">\n                    <div class=\"shimmer h-3.5 w-3.5 rounded-sm\"></div>\n                    <div class=\"shimmer h-[17px] w-[76px] rounded-sm\"></div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-persons.blade.php",
    "content": "<div class=\"w-full rounded-lg border border-gray-200 bg-white dark:bg-gray-900 dark:border-gray-800\">\n    <div class=\"flex items-center justify-between p-4\">\n        <div class=\"shimmer h-[17px] w-28\"></div>\n    </div>\n\n    <div class=\"flex flex-col\">\n        @for ($i = 1; $i <= 5; $i++)\n            <div class=\"flex gap-2.5 border-b p-4 last:border-b-0 dark:border-gray-800\">\n                <!-- Product Details -->\n                <div class=\"flex w-full flex-col gap-1.5\">\n                    <!-- Product Name -->\n                    <div class=\"shimmer h-[17px] w-full\"></div>\n\n                    <div class=\"flex justify-between\">\n                        <!-- Product Price -->\n                        <div class=\"shimmer h-[17px] w-[52px]\"></div>\n\n                        <!-- Grand Total -->\n                        <div class=\"shimmer h-[17px] w-[72px]\"></div>\n                    </div>\n                </div>\n            </div>\n        @endfor\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/top-selling-products.blade.php",
    "content": "<div class=\"w-full rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n    <div class=\"flex items-center justify-between p-4\">\n        <div class=\"shimmer h-[17px] w-28\"></div>\n    </div>\n\n    <div class=\"flex flex-col\">\n        @for ($i = 1; $i <= 5; $i++)\n            <div class=\"flex gap-2.5 border-b p-4 last:border-b-0 dark:border-gray-800\">\n                <!-- Product Details -->\n                <div class=\"flex w-full flex-col gap-1.5\">\n                    <!-- Product Name -->\n                    <div class=\"shimmer h-[17px] w-full\"></div>\n\n                    <div class=\"flex justify-between\">\n                        <!-- Product Price -->\n                        <div class=\"shimmer h-[17px] w-[52px]\"></div>\n\n                        <!-- Grand Total -->\n                        <div class=\"shimmer h-[17px] w-[72px]\"></div>\n                    </div>\n                </div>\n            </div>\n        @endfor\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/dashboard/index/total-leads.blade.php",
    "content": "<div class=\"grid gap-4 rounded-lg border border-gray-200 bg-white px-4 py-2 dark:border-gray-800 dark:bg-gray-900\">\n    <div class=\"shimmer h-[17px] w-40\"></div>\n    \n    <!-- Bar Chart -->\n    <x-admin::shimmer.charts.bar />\n\n    <div class=\"flex justify-center gap-5\">\n        <div class=\"flex items-center gap-2\">\n            <div class=\"shimmer h-3.5 w-3.5 rounded-sm\"></div>\n            <div class=\"shimmer h-[17px] w-[76px] rounded-sm\"></div>\n        </div>\n        \n        <div class=\"flex items-center gap-2\">\n            <div class=\"shimmer h-3.5 w-3.5 rounded-sm\"></div>\n            <div class=\"shimmer h-[17px] w-[76px] rounded-sm\"></div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/index.blade.php",
    "content": "@props(['isMultiRow' => false])\n\n<div>\n    <x-admin::shimmer.datagrid.toolbar />\n\n    <div class=\"flex\">\n        <div class=\"w-full\">\n            <div class=\"table-responsive box-shadow grid w-full overflow-hidden rounded border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                <x-admin::shimmer.datagrid.table.head :isMultiRow=\"$isMultiRow\" />\n\n                <x-admin::shimmer.datagrid.table.body :isMultiRow=\"$isMultiRow\" />\n            </div>\n        </div>\n    </div>\n</div>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/body.blade.php",
    "content": "@props(['isMultiRow' => false])\n\n@for ($i = 0;  $i < 10; $i++)\n    @if (! $isMultiRow)\n        <div class=\"row grid grid-cols-6 gap-2.5 border-b px-4 py-4 text-gray-600 dark:border-gray-800 dark:text-gray-300\">\n            <div class=\"shimmer mb-0.5 h-6 w-6\"></div>\n\n            <div class=\"shimmer h-[17px] w-[100px]\"></div>\n\n            <div class=\"shimmer h-[17px] w-[100px]\"></div>\n\n            <div class=\"shimmer h-[17px] w-[100px]\"></div>\n\n            <div class=\"shimmer h-[17px] w-[100px]\"></div>\n\n            <div class=\"flex gap-2.5 place-self-end\">\n                <div class=\"shimmer h-6 w-6 p-1.5\"></div>\n\n                <div class=\"shimmer h-6 w-6 p-1.5\"></div>\n            </div>\n        </div>\n    @else\n        <div class=\"row grid grid-cols-[2fr_1fr_1fr] gap-2.5 border-b px-4 py-2.5 text-gray-600 dark:border-gray-800 dark:text-gray-300\">\n            <div class=\"flex gap-2.5\">\n                <div class=\"shimmer h-6 w-6\"></div>\n\n                <div class=\"flex flex-col gap-1.5\">\n                    <div class=\"shimmer h-[19px] w-[250px]\"></div>\n\n                    <div class=\"shimmer h-[17px] w-[150px]\"></div>\n\n                    <div class=\"shimmer h-[17px] w-[150px]\"></div>\n                </div>\n            </div>\n\n            <div class=\"flex flex-col gap-1.5\">\n                <div class=\"shimmer h-[19px] w-[250px]\"></div>\n\n                <div class=\"shimmer h-[17px] w-[150px]\"></div>\n\n                <div class=\"shimmer h-[17px] w-[150px]\"></div>\n            </div>\n\n            <div class=\"flex flex-col gap-1.5\">\n                <div class=\"shimmer h-[19px] w-[250px]\"></div>\n\n                <div class=\"shimmer h-[17px] w-[150px]\"></div>\n\n                <div class=\"shimmer h-[17px] w-[150px]\"></div>\n            </div>\n        </div>\n    @endif\n@endfor\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/table/head.blade.php",
    "content": "@props(['isMultiRow' => false])\n\n@if (! $isMultiRow)\n    <div class=\"row grid grid-cols-6 items-center gap-2.5 border-b px-4 py-2.5 dark:border-gray-800\">\n        <div class=\"shimmer h-[26px] w-6\"></div>\n\n        <div class=\"shimmer h-[17px] w-[100px]\"></div>\n\n        <div class=\"shimmer h-[17px] w-[100px]\"></div>\n\n        <div class=\"shimmer h-[17px] w-[100px]\"></div>\n\n        <div class=\"shimmer h-[17px] w-[100px]\"></div>\n\n        <div class=\"shimmer h-[17px] w-[100px] place-self-end\"></div>\n    </div>\n@else\n    <div class=\"row grid grid-cols-[2fr_1fr_1fr] items-center gap-2.5 border-b px-4 py-2.5 dark:border-gray-800\">\n        <div class=\"flex items-center gap-2.5\">\n            <div class=\"shimmer h-6 w-6\"></div>\n\n            <div class=\"shimmer h-[17px] w-[200px]\"></div>\n        </div>\n\n        <div class=\"shimmer h-[17px] w-[200px]\"></div>\n\n        <div class=\"shimmer h-[17px] w-[200px]\"></div>\n    </div>\n@endif\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/filter.blade.php",
    "content": "{{-- <div class=\"\">\n    <div class=\"shimmer w-[94px] h-[38px] rounded-md\"></div>\n</div> --}}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/pagination.blade.php",
    "content": "<div class=\"flex items-center gap-x-2\">\n    <div>\n        <p class=\"shimmer h-[17px] w-[75px]\"></p>\n    </div>\n\n    <div class=\"flex items-center gap-x-2\">\n        <div class=\"shimmer h-[38px] w-[72px] rounded-md\"></div>\n\n        <p class=\"shimmer h-[17px] w-[75px]\"></p>\n\n        <div class=\"flex items-center gap-1\">\n            <div class=\"shimmer h-[38px] w-[38px] rounded-md\"></div>\n\n            <div class=\"shimmer h-[38px] w-[38px] rounded-md\"></div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar/search.blade.php",
    "content": "<div class=\"flex w-full items-center gap-x-1.5\">\n    <div class=\"shimmer h-[38px] w-[264px] rounded-lg\"></div>\n\n    <div class=\"shimmer h-[38px] w-[66px] rounded-lg\"></div>\n</div>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/datagrid/toolbar.blade.php",
    "content": "<div class=\"flex items-center justify-between gap-4 rounded-t-lg border border-b-0 border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 max-md:flex-wrap\">\n    <!-- Left Toolbar -->\n    <div class=\"flex w-full items-center gap-x-1.5\">\n        <div class=\"shimmer h-[38px] w-[264px] rounded-lg\"></div>\n    \n        <div class=\"shimmer h-[38px] w-[66px] rounded-md\"></div>\n    </div>\n\n    <!-- Right Toolbar -->\n    <div class=\"flex items-center gap-x-2\">\n        <div>\n            <p class=\"shimmer h-[17px] w-[75px]\"></p>\n        </div>\n\n        <div class=\"flex items-center gap-x-2\">\n            <div class=\"shimmer h-[38px] w-[72px] rounded-md\"></div>\n\n            <p class=\"shimmer h-[17px] w-[75px]\"></p>\n\n            <div class=\"flex items-center gap-1\">\n                <div class=\"shimmer h-[38px] w-[38px] rounded-md\"></div>\n\n                <div class=\"shimmer h-[38px] w-[38px] rounded-md\"></div>\n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/configurations.blade.php",
    "content": "@for ($i = 0; $i < 3; $i++)\n    <div class=\"flex justify-between gap-2.5 border-b border-slate-300 p-4 dark:border-gray-800\">\n        <!-- Left Information -->\n        <div class=\"flex gap-2.5\">\n            <!-- Details -->\n            <div class=\"grid place-content-start gap-1.5\">\n                <p class=\"shimmer h-[17px] w-[150px]\"></p>\n                <p class=\"shimmer h-[17px] w-[350px]\"></p>\n            </div>\n        </div>\n    </div>\n@endfor\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/leads.blade.php",
    "content": "@for ($i = 0; $i < 3; $i++)\n    <div class=\"flex justify-between gap-2.5 border-b border-slate-300 p-4 dark:border-gray-800\">\n        <!-- Left Information -->\n        <div class=\"flex gap-2.5\">\n            <!-- Details -->\n            <div class=\"grid place-content-start gap-1.5\">\n                <p class=\"shimmer h-[17px] w-[150px]\"></p>\n                <p class=\"shimmer h-[17px] w-[350px]\"></p>\n            </div>\n        </div>\n\n        <!-- Right Information -->\n        <div class=\"grid place-content-center gap-1 text-right\">\n            <p class=\"shimmer h-[17px] w-[50px]\"></p>\n        </div>\n    </div>\n@endfor\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/persons.blade.php",
    "content": "@for ($i = 0; $i < 3; $i++)\n    <div class=\"flex justify-between gap-2.5 border-b border-slate-300 p-4 dark:border-gray-800\">\n        <!-- Left Information -->\n        <div class=\"flex gap-2.5\">\n            <!-- Details -->\n            <div class=\"grid place-content-start gap-1.5\">\n                <p class=\"shimmer h-[17px] w-[150px]\"></p>\n                <p class=\"shimmer h-[17px] w-[350px]\"></p>\n            </div>\n        </div>\n\n        <!-- Right Information -->\n        <div class=\"grid place-content-center gap-1 text-right\">\n            <p class=\"shimmer h-[17px] w-[50px]\"></p>\n        </div>\n    </div>\n@endfor"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/products.blade.php",
    "content": "@for ($i = 0; $i < 3; $i++)\n    <div class=\"flex justify-between gap-2.5 border-b border-slate-300 p-4 dark:border-gray-800\">\n        <!-- Left Information -->\n        <div class=\"flex gap-2.5\">\n            <!-- Details -->\n            <div class=\"grid place-content-start gap-1.5\">\n                <p class=\"shimmer h-[17px] w-[350px]\"></p>\n                <p class=\"shimmer h-[17px] w-[150px]\"></p>\n            </div>\n        </div>\n\n        <!-- Right Information -->\n        <div class=\"grid place-content-center gap-1 text-right\">\n            <p class=\"shimmer h-[17px] w-[50px]\"></p>\n        </div>\n    </div>\n@endfor"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/quotes.blade.php",
    "content": "@for ($i = 0; $i < 3; $i++)\n    <div class=\"flex justify-between gap-2.5 border-b border-slate-300 p-4 dark:border-gray-800\">\n        <!-- Left Information -->\n        <div class=\"flex gap-2.5\">\n            <!-- Details -->\n            <div class=\"grid place-content-start gap-1.5\">\n                <p class=\"shimmer h-[17px] w-[150px]\"></p>\n                <p class=\"shimmer h-[17px] w-[350px]\"></p>\n            </div>\n        </div>\n    </div>\n@endfor"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/header/mega-search/settings.blade.php",
    "content": "@for ($i = 0; $i < 3; $i++)\n    <div class=\"flex justify-between gap-2.5 border-b border-slate-300 p-4 dark:border-gray-800\">\n        <!-- Left Information -->\n        <div class=\"flex gap-2.5\">\n            <!-- Details -->\n            <div class=\"grid place-content-start gap-1.5\">\n                <p class=\"shimmer h-[17px] w-[150px]\"></p>\n                <p class=\"shimmer h-[17px] w-[350px]\"></p>\n            </div>\n        </div>\n    </div>\n@endfor\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/image/index.blade.php",
    "content": "<v-shimmer-image {{ $attributes }}>\n    <div {{ $attributes->merge(['class' => 'shimmer bg-neutral-100']) }}></div>\n</v-shimmer-image>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-shimmer-image-template\"\n    >\n        <div\n            class=\"shimmer\"\n            v-bind=\"$attrs\"\n            v-show=\"isLoading\"\n        >\n        </div>\n\n        <img\n            v-bind=\"$attrs\"\n            :src=\"src\"\n            @load=\"onLoad\"\n            v-show=\"! isLoading\"\n        >\n    </script>\n\n    <script type=\"module\">\n        app.component('v-shimmer-image', {\n            template: '#v-shimmer-image-template',\n\n            props: ['src'],\n\n            data() {\n                return {\n                    isLoading: true,\n                };\n            },\n            \n            methods: {\n                onLoad() {\n                    this.isLoading = false;\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/datagrid.blade.php",
    "content": "<div class=\"box-shadow flex flex-col gap-4 rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900 max-xl:flex-wrap\">\n    <!-- Tabs -->\n    <div class=\"flex gap-2 border-b border-gray-200 py-2.5 dark:border-gray-800\">\n        <div class=\"shimmer mx-3 h-[21px] w-[50px]\"></div>\n        <div class=\"shimmer mx-3 h-[21px] w-[100px]\"></div>\n        <div class=\"shimmer mx-3 h-[21px] w-16\"></div>\n    </div>\n\n    <!-- Tab Content -->\n    <div class=\"flex flex-col gap-4 px-4 py-2\">\n        <!-- Details Section -->\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex flex-col gap-1\">\n                <div class=\"shimmer h-[17px] w-20\"></div>\n\n                <div class=\"shimmer h-[17px] w-64\"></div>\n            </div>\n\n            <div class=\"w-1/2 max-md:w-full\">\n                <!-- Title -->\n                <div class=\"mb-4 w-full\">\n                    <div class=\"shimmer mb-1.5 h-4 w-16\"></div>\n\n                    <div class=\"shimmer h-[42px] w-full\"></div>\n                </div>\n\n                <!-- Description -->\n                <div class=\"mb-4 w-full\">\n                    <div class=\"shimmer mb-1.5 h-5 w-20\"></div>\n\n                    <div class=\"shimmer h-[59px] w-full\"></div>\n                </div>\n\n                <div class=\"flex gap-4 max-sm:flex-wrap\">\n                    <!-- Source & Expected Close date & Lead Value -->\n                    <div class=\"w-full\">\n                        <div class=\"mb-4 w-full\">\n                            <div class=\"shimmer mb-1.5 h-5 w-16\"></div>\n        \n                            <div class=\"shimmer h-[42px] w-full\"></div>\n                        </div>\n\n                        <div class=\"mb-4 w-full\">\n                            <div class=\"shimmer mb-1.5 h-5 w-16\"></div>\n        \n                            <div class=\"shimmer h-[42px] w-full\"></div>\n                        </div>\n\n                        <div class=\"mb-4 w-full\">\n                            <div class=\"shimmer mb-1.5 h-4 w-16\"></div>\n        \n                            <div class=\"shimmer h-[42px] w-full\"></div>\n                        </div>\n                    </div>\n\n                    <!-- Type & Sales Owner -->\n                    <div class=\"w-full\">\n                        <div class=\"mb-4 w-full\">\n                            <div class=\"shimmer mb-1.5 h-5 w-16\"></div>\n        \n                            <div class=\"shimmer h-[42px] w-full\"></div>\n                        </div>\n\n                        <div class=\"mb-4 w-full\">\n                            <div class=\"shimmer mb-1.5 h-5 w-16\"></div>\n        \n                            <div class=\"shimmer h-[42px] w-full\"></div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n\n        <!-- Contact Section -->\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex flex-col gap-1\">\n                <div class=\"shimmer h-[17px] w-32\"></div>\n\n                <div class=\"shimmer h-[17px] w-80\"></div>\n            </div>\n\n            <div class=\"w-1/2 max-md:w-full\">\n                <!-- Name -->\n                <div class=\"mb-4 w-full\">\n                    <div class=\"shimmer mb-1.5 h-5 w-16\"></div>\n\n                    <div class=\"shimmer h-[44px] w-full\"></div>\n                </div>\n\n                <!-- Email -->\n                <div class=\"mb-4 w-full\">\n                    <div class=\"shimmer mb-1.5 h-5 w-16\"></div>\n\n                    <div class=\"shimmer mb-2 h-[42px] w-full\"></div>\n\n                    <div class=\"shimmer h-5 w-16\"></div>\n                </div>\n\n                <!-- Contact Number -->\n                <div class=\"mb-4 w-full\">\n                    <div class=\"shimmer mb-1.5 h-5 w-16\"></div>\n\n                    <div class=\"shimmer mb-2 h-[42px] w-full\"></div>\n\n                    <div class=\"shimmer h-5 w-16\"></div>\n                </div>\n\n                <!-- Organization -->\n                <div class=\"mb-4 w-full\">\n                    <div class=\"shimmer mb-1.5 h-5 w-16\"></div>\n\n                    <div class=\"shimmer h-[44px] w-full\"></div>\n                </div>\n            </div>\n        </div>\n\n        <!-- Product Section -->\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex flex-col gap-1\">\n                <div class=\"shimmer h-[17px] w-32\"></div>\n\n                <div class=\"shimmer h-[17px] w-80\"></div>\n            </div>\n\n            <div class=\"flex flex-col gap-4\">\n                <!-- Table Section -->\n                <div class=\"w-full min-w-[800px] table-fixed border border-gray-200 text-left text-sm dark:border-gray-800\">\n                    <div class=\"bg-gray-50 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                        <div class=\"flex\">\n                            <div class=\"shimmer mx-6 my-4 h-5 w-full whitespace-nowrap font-semibold\"></div>\n                            <div class=\"shimmer mx-6 my-4 h-5 w-full whitespace-nowrap font-semibold\"></div>\n                            <div class=\"shimmer mx-6 my-4 h-5 w-full whitespace-nowrap font-semibold\"></div>\n                            <div class=\"shimmer mx-6 my-4 h-5 w-full whitespace-nowrap font-semibold\"></div>\n                            <div class=\"shimmer mx-6 my-4 h-5 w-full whitespace-nowrap font-semibold\"></div>\n                        </div>\n                    </div>\n                </div>\n\n                <!-- Add More Button -->\n                <div class=\"shimmer h-5 w-16\"></div>\n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban/toolbar.blade.php",
    "content": "<div class=\"flex justify-between gap-2 max-md:flex-wrap\">\n    <div class=\"flex w-full items-center gap-x-1.5\">\n        <div class=\"shimmer light-shimmer-bg h-[38px] w-[264px] rounded-md\"></div>\n        <div class=\"shimmer light-shimmer-bg h-9 w-[62px] rounded-md\"></div>\n    </div>\n\n    <div class=\"flex items-center gap-4 max-md:w-full max-md:!justify-between\">\n        <!-- Pipeline Switcher -->\n        <div class=\"shimmer light-shimmer-bg h-10 w-[172px] rounded-md\"></div>\n\n        <!-- View Switcher -->\n        <div class=\"flex items-center gap-0.5\">\n            <div class=\"shimmer light-shimmer-bg h-10 w-10 rounded-md\"></div>\n            <div class=\"shimmer light-shimmer-bg h-10 w-10 rounded-md\"></div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/index/kanban.blade.php",
    "content": "<x-admin::shimmer.leads.index.kanban.toolbar />\n\n<div class=\"flex gap-2.5 overflow-x-auto\">\n    <!-- Stages -->\n    @for ($i = 1; $i <= 6; $i++)\n        <div class=\"flex min-w-[275px] max-w-[275px] flex-col gap-1 rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n            <!-- Stage Header -->\n            <div class=\"flex flex-col px-2 py-3\">\n                <div class=\"flex items-center justify-between\">\n                    <div class=\"shimmer h-4 w-20\"></div>\n                    <div class=\"shimmer h-[26px] w-[26px] rounded-md\"></div>\n                </div>\n\n                <div class=\"flex items-center justify-between gap-2\">\n                    <div class=\"shimmer h-4 w-14\"></div>\n                    <div class=\"shimmer h-1 w-36\"></div>\n                </div>\n            </div>\n\n            <!-- Stage Lead Cards -->\n            <div class=\"flex h-[calc(100vh-317px)] flex-col gap-2 overflow-y-auto p-2\">\n                @for ($j = 1; $j <= 3; $j++)\n                    <!-- Card -->\n                    <div class=\"flex w-full flex-col gap-5 rounded-md border border-gray-100 p-2 dark:border-gray-800\">\n                        <!-- Header -->\n                        <div class=\"flex items-start justify-between\">\n                            <div class=\"flex items-center gap-1\">\n                                <!-- Avatar -->\n                                <div class=\"shimmer h-9 w-9 rounded-full\"></div>\n\n                                <!-- Name and Organization -->\n                                <div class=\"flex flex-col gap-0.5\">\n                                    <div class=\"shimmer h-4 w-20\"></div>\n                                    <div class=\"shimmer h-[15px] w-12\"></div>\n                                </div>\n                            </div>\n\n                            <!-- Rotten Lead Info -->\n                            <div class=\"shimmer h-5 w-5 rounded-md\"></div>\n                        </div>\n\n                        <!-- Body -->\n                        <div class=\"flex flex-col gap-0.5\">\n                            <div class=\"shimmer h-4 w-full\"></div>\n                            <div class=\"shimmer h-4 w-1/2\"></div>\n                        </div>\n\n                        <!-- Footer -->\n                        <div class=\"flex flex-wrap gap-1\">\n                            <div class=\"shimmer h-6 w-16 rounded-xl\"></div>\n                            <div class=\"shimmer h-6 w-16 rounded-xl\"></div>\n                            <div class=\"shimmer h-6 w-16 rounded-xl\"></div>\n                            <div class=\"shimmer h-6 w-16 rounded-xl\"></div>\n                        </div>\n                    </div>\n                @endfor\n            </div>\n        </div>\n    @endfor\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/mail/index.blade.php",
    "content": "@props([\n    'count' => 1,\n])\n\n<div class=\"mt-3.5 flex gap-2.5 max-xl:flex-wrap\">\n    <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n        @for ($i = 0; $i < $count; $i++)\n            <div class=\"flex gap-2.5 box-shadow rounded bg-white p-4 dark:bg-gray-900 max-xl:flex-wrap\">\n                <div class=\"flex flex-col gap-4 w-full\">\n                    <div class=\"flex gap-4 w-full items-center justify-between\">\n                        <div class=\"flex gap-4\">\n                            <div class=\"shimmer flex h-9 w-9 items-center justify-center rounded-full bg-green-200 text-xs font-medium\"></div>\n\n                            <div class=\"flex flex-col gap-1\">\n                                <div class=\"shimmer h-4 w-32\"></div>\n                                <div class=\"shimmer h-4 w-48\"></div>\n                            </div>\n                        </div>\n\n                        <div class=\"flex gap-2 items-center justify-center\">\n                            <div class=\"flex gap-2 items-center\">\n                                <div class=\"shimmer h-4 w-20\"></div>\n                                <div class=\"shimmer h-5 w-5\"></div>\n                            </div>\n                        </div>\n                    </div>\n\n                    <div class=\"shimmer h-40 w-full\"></div>\n\n                    <div class=\"flex gap-2 items-center justify-between py-2\">\n                        <div class=\"flex gap-6 items-center\">\n                            <div class=\"shimmer h-5 w-20\"></div>\n                            <div class=\"shimmer h-5 w-20\"></div>\n                            <div class=\"shimmer h-5 w-20\"></div>\n                        </div>\n                    </div>\n                </div>\n            </div>    \n        @endfor\n    </div>\n\n    <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n        <div class=\"box-shadow rounded bg-white dark:bg-gray-900\">\n            <div class=\"flex flex-col gap-8 p-4\">\n                <div class=\"flex gap-4 w-full items-center justify-between\">\n                    <div class=\"flex flex-col gap-4\">\n                        <div class=\"shimmer h-4 w-20\"></div>\n\n                        <div class=\"flex gap-4\">\n                            <div class=\"shimmer flex h-9 w-9 items-center justify-center rounded-full bg-green-200 text-xs font-medium\"></div>\n\n                            <div class=\"flex flex-col gap-1\">\n                                <div class=\"shimmer h-4 w-32\"></div>\n                                <div class=\"shimmer h-4 w-28\"></div>\n                                <div class=\"shimmer h-4 w-48\"></div>\n                                <div class=\"shimmer h-4 w-24\"></div>\n                            </div>\n                        </div>\n                    </div>\n\n                    <div class=\"flex gap-2 items-center justify-center\">\n                        <div class=\"flex gap-2 items-center\">\n                            <div class=\"shimmer h-5 w-5\"></div>\n                            <div class=\"shimmer h-5 w-5\"></div>\n                        </div>\n                    </div>\n                </div>\n\n                <div class=\"flex w-full flex-col gap-5 rounded-md dark:border-gray-400\">\n                    <div class=\"shimmer h-4 w-20\"></div>\n\n                    <!-- Header -->\n                    <div class=\"flex items-start justify-between\">\n                        <div class=\"flex items-center gap-1\">\n                            <!-- Avatar -->\n                            <div class=\"shimmer h-9 w-9 rounded-full\"></div>\n\n                            <!-- Name and Organization -->\n                            <div class=\"flex flex-col gap-0.5\">\n                                <div class=\"shimmer h-4 w-20\"></div>\n                                <div class=\"shimmer h-[15px] w-12\"></div>\n                            </div>\n                        </div>\n\n                        <div class=\"flex gap-2 items-center justify-center\">\n                            <div class=\"flex gap-2 items-center\">\n                                <div class=\"shimmer h-5 w-5\"></div>\n                                <div class=\"shimmer h-5 w-5\"></div>\n                                <div class=\"shimmer h-5 w-5\"></div>\n                            </div>\n                        </div>\n                    </div>\n\n                    <!-- Body -->\n                    <div class=\"flex flex-col gap-0.5\">\n                        <div class=\"shimmer h-4 w-full\"></div>\n                        <div class=\"shimmer h-4 w-1/2\"></div>\n                    </div>\n\n                    <!-- Footer -->\n                    <div class=\"flex flex-wrap gap-1\">\n                        <div class=\"shimmer h-6 w-16 rounded-xl\"></div>\n                        <div class=\"shimmer h-6 w-16 rounded-xl\"></div>\n                        <div class=\"shimmer h-6 w-16 rounded-xl\"></div>\n                        <div class=\"shimmer h-6 w-16 rounded-xl\"></div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/leads/view/stages.blade.php",
    "content": "@props(['count' => 5])\n\n<div class=\"flex\">\n    @for ($i = 0; $i < $count; $i++)\n        <div class=\"stage relative flex h-7 min-w-24 cursor-pointer items-center justify-center bg-white pl-7 pr-4 first:rounded-l-lg dark:bg-gray-900\">\n            <div class=\"shimmer h-5 w-[68px]\"></div>\n        </div>\n    @endfor\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/index.blade.php",
    "content": "<div>\n    <x-admin::shimmer.datagrid.toolbar />\n\n    <div class=\"flex\">\n        <div class=\"w-full\">\n            <div class=\"table-responsive box-shadow grid w-full overflow-hidden rounded border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                <x-admin::shimmer.mail.datagrid.table.head />\n\n                <x-admin::shimmer.mail.datagrid.table.body />\n            </div>\n        </div>\n    </div>\n</div>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/body.blade.php",
    "content": "@for ($i = 0; $i < 10; $i++)\n    <div class=\"flex cursor-pointer items-center justify-between border-b px-8 py-4 text-gray-600 hover:bg-gray-50 dark:border-gray-800 dark:text-gray-300 dark:hover:bg-gray-950\">\n        <div class=\"flex w-full items-center justify-start gap-[100px]\">\n            <div class=\"flex items-center gap-6\">\n                <div class=\"relative flex items-center\">\n                    <div class=\"flex items-center justify-center gap-1.5\">\n                        <div class=\"shimmer absolute right-8 h-1.5 w-1.5 rounded-full bg-sky-600 dark:bg-white\"></div>\n\n                        <div class=\"shimmer h-6 w-6\"></div>\n                    </div>\n                </div>\n            \n                <div class=\"flex items-center gap-2\">\n                    <div class=\"shimmer flex h-9 min-w-9 rounded-full\"></div>\n\n                    <div class=\"shimmer h-[17px] w-[125px]\"></div>\n                </div>\n            </div>\n\n            <div class=\"flex w-full items-center justify-between gap-4\">\n                <div class=\"flex-frow flex items-center gap-2\">\n                    <div class=\"shimmer h-6 w-[650px]\"></div>\n                </div>\n            \n                <div class=\"min-w-[80px] flex-shrink-0 text-right\">\n                    <div class=\"shimmer h-[17px] w-[100px]\"></div>\n                </div>\n            </div>\n        </div>\n    </div>\n@endfor"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/mail/datagrid/table/head.blade.php",
    "content": "<div class=\"row tems-center grid grid-cols-[2fr_7fr_.1fr] items-center gap-2.5 border-b px-8 py-4 dark:border-gray-800\">\n    <div class=\"flex items-center gap-6\">\n        <div class=\"shimmer h-6 w-6\"></div>\n\n        <div class=\"shimmer h-[17px] w-[150px]\"></div>\n    </div>\n\n    <div class=\"flex w-full items-center justify-between gap-4\">\n        <div class=\"shimmer h-[17px] w-[280px]\"></div>\n\n        <div class=\"shimmer float-right h-[17px] w-[75px]\"></div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/activities/index.blade.php",
    "content": "<div class=\"w-full bg-white\">\n    <!-- Tabs -->\n    <div class=\"flex gap-4 border-b border-gray-200\">\n        @for ($i = 0; $i < 5; $i++)\n            <div class=\"px-4 py-[11px]\">\n                <div class=\"shimmer h-5 w-24\"></div>\n            </div>\n        @endfor\n    </div>\n\n    <!-- Tab Content -->\n    <div class=\"p-4\">\n        <!-- Activity List -->\n        <div class=\"flex flex-col gap-4\">\n            @for ($i = 0; $i < 5; $i++)\n                <!-- Activity Item -->\n                <div class=\"flex gap-2\">\n                    <!-- Icon -->\n                    <div class=\"shimmer mt-2 flex h-9 w-9 rounded-full\"></div>\n\n                    <!-- Details -->\n                    <div class=\"flex w-full justify-between gap-4 p-4\">\n                        <div class=\"flex w-full flex-col gap-2\">\n                            <div class=\"shimmer h-[17px] w-48\"></div>\n\n                            <div class=\"flex flex-col gap-1\">\n                                <div class=\"shimmer h-[17px] w-full\"></div>\n                                <div class=\"shimmer h-[17px] w-1/2\"></div>\n                            </div>\n\n                            <div class=\"shimmer h-5 w-48\"></div>\n                        </div>\n\n                        <!-- Menu -->\n                        <div class=\"shimmer h-7 w-7 rounded-md\"></div>\n                    </div>\n                </div>\n            @endfor\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/stages.blade.php",
    "content": "@props(['count' => 5])\n\n<div class=\"flex\">\n    @for ($i = 0; $i < $count; $i++)\n        <div class=\"stage relative flex h-7 min-w-24 cursor-pointer items-center justify-center bg-white pl-7 pr-4 first:rounded-l-lg\">\n            <div class=\"shimmer h-5 w-[68px]\"></div>\n        </div>\n    @endfor\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/person/view/tags.blade.php",
    "content": "@props(['count' => 5])\n\n<div class=\"flex items-center gap-1\">\n    @for ($i = 0; $i < $count; $i++)\n        <div class=\"shimmer h-7 w-16 rounded-md\"></div>\n    @endfor\n\n    <div class=\"shimmer h-7 w-7 rounded-md\"></div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/pipelines/kanban.blade.php",
    "content": "<div class=\"flex gap-4 overflow-auto max-xl:flex-wrap\">\n    @for ($i = 1; $i <= 6; $i++)\n        <div class=\"flex h-[380px] min-w-[275px] max-w-[275px] flex-col justify-between rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n            <!-- Stage Header -->\n            <div class=\"flex flex-col gap-6 px-4 py-3\">\n                <!-- Stage Title and Action -->\n                <div class=\"flex items-center justify-between\">\n                    <div class=\"shimmer h-4 w-20\"></div>\n                    <div class=\"shimmer h-[28px] w-[28px] rounded-md\"></div>\n                </div>\n                \n                <!-- Attribute Name -->\n                <div class=\"flex flex-col gap-4\">\n                    <div class=\"flex flex-col gap-2\">\n                        <div class=\"shimmer h-5 w-20\"></div>\n                        <div class=\"shimmer h-[38px] w-full rounded\"></div>\n                    </div>\n                    \n                    <div class=\"flex flex-col gap-2\">\n                        <div class=\"shimmer h-5 w-20\"></div>\n                        <div class=\"shimmer h-[38px] w-full rounded\"></div>\n                    </div>\n                </div>\n            </div>\n            \n            <div class=\"flex items-center gap-2 p-2\">\n                <div class=\"shimmer h-[26px] w-[26px] rounded-md\"></div>\n\n                <div class=\"shimmer h-5 w-20\"></div>\n            </div>\n        </div>\n    @endfor\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/quotes/index.blade.php",
    "content": "<div class=\"box-shadow flex flex-col gap-4 rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n    <!-- tabs -->\n    <div class=\"flex gap-2 border-b border-gray-200 dark:border-gray-800\">\n        <div class=\"shimmer mx-3 my-2.5 h-[21px] w-[120px]\"></div>\n        <div class=\"shimmer mx-3 my-2.5 h-[21px] w-[136px]\"></div>\n        <div class=\"shimmer mx-3 my-2.5 h-[21px] w-[80px]\"></div>\n    </div>\n\n    <div class=\"flex flex-col gap-4 px-4 py-2\">\n        <!-- Quote Information -->\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex flex-col gap-1\">\n                <div class=\"shimmer h-[17px] w-1/3\"></div>\n                <div class=\"shimmer h-[17px] w-1/3\"></div>\n            </div>\n\n            <div class=\"w-1/2 max-md:w-full\">\n                <!-- Subject -->\n                <div class=\"mb-4 w-full\">\n                    <div class=\"shimmer mb-1.5 h-5 w-[60px]\"></div>\n\n                    <div class=\"shimmer h-[39px] w-full rounded\"></div>\n                </div>\n\n                <!-- Description -->\n                <div class=\"mb-4 w-full\">\n                    <div class=\"shimmer mb-1.5 h-5 w-20\"></div>\n\n                    <div class=\"shimmer h-[59px] w-full rounded\"></div>\n                </div>\n\n                <!-- Sales Owner & Expires At -->\n                <div class=\"flex gap-4\">\n                    <div class=\"mb-4 w-full\">\n                        <div class=\"shimmer mb-1.5 h-5 w-24\"></div>\n\n                        <div class=\"shimmer h-[42px] w-full rounded\"></div>\n                    </div>\n\n                    <div class=\"mb-4 w-full\">\n                        <div class=\"shimmer mb-1.5 h-5 w-20\"></div>\n\n                        <div class=\"shimmer h-[42px] w-full rounded\"></div>\n                    </div>\n                </div>\n\n                <!-- Person & Link to lead -->\n                <div class=\"flex gap-4\">\n                    <div class=\"mb-4 w-full\">\n                        <div class=\"shimmer mb-1.5 h-5 w-[60px]\"></div>\n\n                        <div class=\"shimmer h-[42px] w-full rounded\"></div>\n                    </div>\n\n                    <div class=\"mb-4 w-full\">\n                        <div class=\"shimmer mb-1.5 h-5 w-20\"></div>\n\n                        <div class=\"shimmer h-[42px] w-full rounded\"></div>\n                    </div>\n                </div>\n            </div>\n        </div>\n\n        <!-- Address Information -->\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex flex-col gap-4\">\n                <div class=\"flex flex-col gap-1\">\n                    <div class=\"shimmer h-[17px] w-1/3\"></div>\n                    <div class=\"shimmer h-[17px] w-1/3\"></div>\n                </div>\n\n                <div class=\"w-1/2 max-md:w-full\">\n                    <!-- Billing Address -->\n                    <div class=\"mb-4 w-full\">\n                        <div class=\"shimmer mb-1.5 h-5 w-28\"></div>\n\n                        <div class=\"flex gap-4 max-md:flex-wrap\">\n                            <div class=\"shimmer mb-4 h-[223px] w-full rounded\"></div>\n\n                            <div class=\"grid w-full\">\n                                <div class=\"shimmer mb-4 h-[42px] w-full rounded\"></div>\n                                <div class=\"shimmer mb-4 h-[40px] w-full rounded\"></div>\n                                <div class=\"shimmer mb-4 h-[40px] w-full rounded\"></div>\n                                <div class=\"shimmer mb-4 h-[40px] w-full rounded\"></div>\n                            </div>\n                        </div>\n                    </div>\n\n                    <!-- Shipping Address -->\n                    <div class=\"mb-4 w-full\">\n                        <div class=\"shimmer mb-1.5 h-5 w-28\"></div>\n\n                        <div class=\"flex gap-4 max-md:flex-wrap\">\n                            <div class=\"shimmer mb-4 h-[223px] w-full rounded\"></div>\n\n                            <div class=\"grid w-full\">\n                                <div class=\"shimmer mb-4 h-[42px] w-full rounded\"></div>\n                                <div class=\"shimmer mb-4 h-[40px] w-full rounded\"></div>\n                                <div class=\"shimmer mb-4 h-[40px] w-full rounded\"></div>\n                                <div class=\"shimmer mb-4 h-[40px] w-full rounded\"></div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n\n        <!-- Quotes Items -->\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex flex-col gap-1\">\n                <div class=\"shimmer h-[17px] w-1/3\"></div>\n                <div class=\"shimmer h-[17px] w-1/3\"></div>\n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/attributes.blade.php",
    "content": "<!-- Pannel Content -->\n<div class=\"flex gap-2.5 rounded-lg max-xl:flex-wrap\">\n    <!-- Left Component -->\n    <div class=\"flex flex-1 flex-col gap-2 overflow-auto max-xl:flex-auto\">\n        <div class=\"box-shadow rounded bg-white p-4 dark:bg-gray-900\">\n            <div class=\"shimmer mb-4 h-4 w-16\"></div>\n\n            @for ($i = 1; $i < 5; $i++)\n                <div class=\"mb-6 h-14 w-full\">\n                    <div class=\"shimmer mb-2 h-4 w-24\"></div>\n\n                    <div class=\"shimmer flex h-10 w-full rounded-md py-px\"></div>\n                </div>\n            @endfor\n        </div>\n    </div>\n\n    <!-- Right Component -->\n    <div class=\"flex w-[360px] max-w-full flex-col gap-2\">\n        <!-- General -->\n        <div class=\"box-shadow rounded bg-white dark:bg-gray-900\">\n            <div class=\"flex items-center justify-between gap-x-5 p-4\">\n                <p class=\"shimmer w-20 p-2.5\"></p>\n                \n                <p class=\"shimmer w-5 p-2.5\"></p>\n            </div>\n            \n            <div class=\"px-4 pb-4\">\n                @for ($i = 1; $i < 4; $i++)\n                    <div class=\"mb-4 last:mb-0\">\n                        <div class=\"shimmer mb-1.5 h-4 w-24\"></div>\n\n                        <div class=\"shimmer flex h-10 w-full rounded-md py-px\"></div>\n                    </div>\n                @endfor\n            </div>\n        </div>\n\n        <!-- Validation Section -->\n        <div class=\"box-shadow rounded bg-white dark:bg-gray-900\">\n            <div class=\"flex items-center justify-between gap-x-5 p-4\">\n                <p class=\"shimmer w-24 p-2.5\"></p>\n                \n                <p class=\"shimmer w-5 p-2.5\"></p>\n            </div>\n\n            <div class=\"px-4 pb-4\">\n                <div class=\"mb-2 flex items-center gap-2.5\">\n                    <div class=\"shimmer h-6 w-6\"></div>\n\n                    <div class=\"shimmer h-4 w-20\"></div>\n                </div>\n\n                <div class=\"flex items-center gap-2.5\">\n                    <div class=\"shimmer h-6 w-6\"></div>\n\n                    <div class=\"shimmer h-4 w-20\"></div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/body.blade.php",
    "content": "<div class=\"row grid grid-cols-3 items-center gap-2.5 border-b px-4 py-4 text-gray-600 dark:border-gray-800 dark:text-gray-300\">\n    <div class=\"shimmer mb-0.5 h-6 w-6\"></div>\n\n    <div class=\"shimmer h-[17px] w-[100px]\"></div>\n\n    <div class=\"flex gap-2.5 place-self-end\">\n        <div class=\"shimmer my-1 h-7 w-7 p-1.5\"></div>\n\n        <div class=\"shimmer my-1 h-7 w-7 p-1.5\"></div>\n\n        <div class=\"shimmer my-1 h-7 w-7 p-1.5\"></div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/head.blade.php",
    "content": "<div class=\"row grid grid-cols-3 items-center gap-2.5 border-b px-4 py-2.5 dark:border-gray-800\">\n    <div class=\"shimmer h-[26px] w-6\"></div>\n\n    <div class=\"shimmer h-[17px] w-[100px]\"></div>\n\n    <div class=\"shimmer h-[17px] w-[100px] place-self-end\"></div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/settings/web-forms/index.blade.php",
    "content": "<div>\n    <x-admin::shimmer.datagrid.toolbar />\n\n    <div class=\"flex\">\n        <div class=\"w-full\">\n            <div class=\"table-responsive box-shadow grid w-full overflow-hidden rounded border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                <x-admin::shimmer.settings.web-forms.head />\n\n                <x-admin::shimmer.settings.web-forms.body />\n            </div>\n        </div>\n    </div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/tabs/index.blade.php",
    "content": "<div class=\"justify-left flex gap-4 bg-neutral-100 pt-2 max-sm:hidden\">\n    <span class=\"shimmer block h-10 w-[141px] bg-gray-300\"></span>\n\n    <span class=\"shimmer block h-10 w-[70px] bg-gray-300\"></span>\n\n    <span class=\"shimmer block h-10 w-[101px] bg-gray-300\"></span>\n\n    <span class=\"shimmer block h-10 w-52 bg-gray-300\"></span>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/tags/index.blade.php",
    "content": "@props(['count' => 5])\n\n<div class=\"flex items-center gap-1\">\n    @for ($i = 0; $i < $count; $i++)\n        <div class=\"shimmer h-7 w-16 rounded-md\"></div>\n    @endfor\n\n    <div class=\"shimmer h-7 w-7 rounded-md\"></div>\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/tinymce/index.blade.php",
    "content": "<div {{ $attributes->merge(['class' => 'shimmer block bg-neutral-100']) }}>\n\n</div>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/shimmer/tree/index.blade.php",
    "content": "@for ($j = 0; $j < 3; $j++)\n    <div>\n        <!-- Group Container -->\n        <div class=\"flex items-center\">\n            <!-- Toggle -->\n            <div class=\"shimmer mr-1 h-4 w-4\"></div>\n\n            <!-- Group Name -->\n            <div class=\"group_node flex max-w-max gap-1.5 py-1.5 ltr:pr-1.5 rtl:pl-1.5\">\n                <div class=\"shimmer h-[21px] w-5\"></div>\n\n                <div class=\"shimmer h-[21px] w-5\"></div>\n                \n                <div class=\"shimmer h-[21px] w-[105px]\"></div>\n            </div>\n        </div>\n\n        <!-- Group Attributes -->\n        <div class=\"ltr:ml-11 rtl:mr-11\">\n            @for ($k = 0; $k < 5; $k++)\n                <div class=\"flex max-w-max gap-1.5 py-1.5 ltr:pr-1.5 rtl:pl-1.5\">\n                    <div class=\"shimmer h-[21px] w-5\"></div>\n\n                    <div class=\"shimmer h-[21px] w-5\"></div>\n                    \n                    <div class=\"shimmer h-[21px] w-[105px]\"></div>\n                </div>\n            @endfor\n        </div>\n    </div>\n@endfor"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/spinner/index.blade.php",
    "content": "<!-- Spinner -->\n@props(['color' => 'currentColor'])\n\n<svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    fill=\"none\"\n    aria-hidden=\"true\"\n    viewBox=\"0 0 24 24\"\n    {{ $attributes->merge(['class' => 'h-5 w-5 animate-spin dark:text-white']) }}\n>\n    <circle\n        class=\"opacity-25\"\n        cx=\"12\"\n        cy=\"12\"\n        r=\"10\"\n        stroke=\"{{ $color }}\"\n        stroke-width=\"4\"\n    >\n    </circle>\n\n    <path\n        class=\"opacity-75\"\n        fill=\"{{ $color }}\"\n        d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n    >\n    </path>\n</svg>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/table/index.blade.php",
    "content": "<table {{ $attributes->merge(['class' => 'table-fixed w-full min-w-[800px] text-left text-sm border border-gray-200 dark:border-gray-800']) }}>\n    {{ $slot }}\n</table>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/table/tbody/index.blade.php",
    "content": "<tbody {{ $attributes->merge(['class' => 'bg-white dark:bg-gray-900 dark:text-gray-300 dark:border-gray-800']) }}>\n    {{ $slot }}\n</tbody>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/table/tbody/tr.blade.php",
    "content": "<tr {{ $attributes->merge(['scope' => 'row', 'class' => 'border-b border-gray-200 last:border-b-0 dark:border-gray-800']) }}>\n    {{ $slot }}\n</tr>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/table/td.blade.php",
    "content": "<td {{ $attributes->merge(['scope' => 'row', 'class' => 'whitespace-nowrap px-6 py-4']) }}>\n    {{ $slot }}\n</td>\n    "
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/table/th.blade.php",
    "content": "<th {{ $attributes->merge(['scope' => 'col', 'class' => 'whitespace-nowrap px-6 py-4 font-semibold']) }}>\n    {{ $slot }}\n</th>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/table/thead/index.blade.php",
    "content": "<thead {{ $attributes->merge(['class' => 'bg-gray-50 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300']) }}>\n    {{ $slot }}\n</thead>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/table/thead/tr.blade.php",
    "content": "<tr {{ $attributes->merge(['scope' => 'row', 'class' => 'border-b border-gray-200 dark:border-gray-800']) }}>\n    {{ $slot }}\n</tr>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/tabs/index.blade.php",
    "content": "@props(['position' => 'left'])\n\n<v-tabs\n    position=\"{{ $position }}\"\n    {{ $attributes }}\n>\n    <x-admin::shimmer.tabs />\n</v-tabs>\n\n@pushOnce('scripts')\n    <script \n        type=\"text/x-template\"\n        id=\"v-tabs-template\"\n    >\n        <div class=\"w-full\">\n            <div\n                class=\"flex justify-center gap-4 border-b border-gray-200\"\n                :style=\"positionStyles\"\n            >\n                <div\n                    v-for=\"tab in tabs\"\n                    class=\"cursor-pointer px-4 py-2.5 text-sm font-medium text-gray-800\"\n                    :class=\"{'border-brandColor border-b-2 !text-brandColor transition': tab.isActive }\"\n                    @click=\"change(tab)\"\n                >\n                    @{{ tab.title }}\n                </div>\n            </div>\n\n            <div>\n                {{ $slot }}\n            </div>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-tabs', {\n            template: '#v-tabs-template',\n\n            props: ['position'],\n\n            data() {\n                return {\n                    tabs: []\n                }\n            },\n\n            computed: {\n                positionStyles() {\n                    return [\n                        `justify-content: ${this.position}`\n                    ];\n                },\n            },\n\n            methods: {\n                change(selectedTab) {\n                    this.tabs.forEach(tab => {\n                        tab.isActive = (tab.title == selectedTab.title);\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/tabs/item.blade.php",
    "content": "@props([\n    'title' => '',\n    'isSelected' => false,\n])\n\n<v-tab-item\n    title=\"{{ $title }}\"\n    is-selected=\"{{ $isSelected }}\"\n    {{ $attributes->merge(['class' => 'p-4']) }}\n>\n    <template v-slot>\n        {{ $slot }}\n    </template>\n</v-tab-item>\n\n@pushOnce('scripts')\n    <script \n        type=\"text/x-template\" \n        id=\"v-tab-item-template\"\n    >\n        <div\n            v-if=\"isActive\"\n            class=\"animate-[on-fade_0.5s_ease-in-out]\"\n        >\n            <slot></slot>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-tab-item', {\n            template: '#v-tab-item-template',\n\n            props: ['title', 'isSelected'],\n\n            data() {\n                return {\n                    isActive: false\n                }\n            },\n\n            mounted() {\n                this.isActive = this.isSelected;\n\n                /**\n                 * On mounted, pushing element to its parents component.\n                 */\n                this.$parent.$data.tabs.push(this);\n            }\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/tags/index.blade.php",
    "content": "@props([\n    'attachEndpoint',\n    'detachEndpoint',\n    'addedTags' => [],\n])\n\n<v-tags\n    attach-endpoint=\"{{ $attachEndpoint }}\"\n    detach-endpoint=\"{{ $detachEndpoint }}\"\n    :added-tags='@json($addedTags)'\n>\n    <x-admin::shimmer.tags count=\"3\" />\n</v-tags>\n\n@pushOnce('scripts')\n    <script type=\"text/x-template\" id=\"v-tags-template\">\n        <div class=\"flex flex-wrap items-center gap-1\">\n            <!-- Tags -->\n            <span\n                class=\"flex items-center gap-1 break-all rounded-md bg-rose-100 px-3 py-1.5 text-xs font-medium\"\n                :style=\"{\n                    'background-color': tag.color,\n                    'color': backgroundColors.find(color => color.background === tag.color)?.text\n                }\"\n                v-for=\"(tag, index) in tags\"\n                v-safe-html=\"tag.name\"\n            >\n            </span>\n\n            <!-- Add Button -->\n            <x-admin::dropdown\n                ::close-on-click=\"false\"\n                position=\"bottom-{{ in_array(app()->getLocale(), ['fa', 'ar']) ? 'right' : 'left' }}\"\n            >\n                <x-slot:toggle>\n                    <button class=\"icon-settings-tag rounded-md p-1 text-xl transition-all hover:bg-gray-200 dark:hover:bg-gray-950\"></button>\n                </x-slot>\n\n                <x-slot:content class=\"!p-0\">\n                    <!-- Dropdown Container !-->\n                    <div class=\"flex flex-col gap-2\">\n                        <!-- Search Input -->\n                        <div class=\"flex flex-col gap-1 px-4 py-2\">\n                            <label class=\"font-semibold text-gray-600 dark:text-gray-300\">\n                                @lang('admin::app.components.tags.index.title')\n                            </label>\n\n                            <!-- Search Button -->\n                            <div class=\"relative\">\n                                <div class=\"relative rounded border border-gray-200 p-2 hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:hover:border-gray-400 dark:focus:border-gray-400\" role=\"button\">\n                                    <input\n                                        type=\"text\"\n                                        class=\"w-full cursor-pointer pr-6 dark:bg-gray-900 dark:text-gray-300\"\n                                        placeholder=\"@lang('admin::app.components.tags.index.placeholder')\"\n                                        v-model.lazy=\"searchTerm\"\n                                        v-debounce=\"500\"\n                                    />\n\n                                    <template v-if=\"! isSearching\">\n                                        <span\n                                            class=\"absolute right-1.5 top-1.5 text-2xl\"\n                                            :class=\"[searchTerm.length >= 2 ? 'icon-up-arrow' : 'icon-down-arrow']\"\n                                        ></span>\n                                    </template>\n\n                                    <template v-else>\n                                        <x-admin::spinner class=\"absolute right-2 top-2\" />\n                                    </template>\n                                </div>\n\n                                <!-- Search Tags Dropdown -->\n                                <div\n                                    class=\"absolute z-10 w-full rounded bg-white shadow-[0px_10px_20px_0px_#0000001F] dark:bg-gray-800\"\n                                    v-if=\"searchTerm.length >= 2\"\n                                >\n                                    <ul class=\"p-2\">\n                                        <li\n                                            class=\"cursor-pointer break-all rounded-sm px-5 py-2 text-sm text-gray-800 hover:bg-gray-100 dark:text-white dark:hover:bg-gray-950\"\n                                            v-for=\"tag in searchedTags\"\n                                            @click=\"attachToEntity(tag)\"\n                                        >\n                                            @{{ tag.name }}\n                                        </li>\n\n                                        @if (bouncer()->hasPermission('settings.other_settings.tags.create'))\n                                            <template v-if=\"! searchedTags.length && ! isSearching\">\n                                                <li\n                                                    class=\"cursor-pointer rounded-sm bg-gray-100 px-5 py-2 text-sm text-gray-800 dark:bg-gray-950 dark:text-white\"\n                                                    @click=\"create\"\n                                                >\n                                                    @{{ `@lang('admin::app.components.tags.index.add-tag', ['term' => 'replaceTerm'])`.replace('replaceTerm', searchTerm) }}\n                                                </li>\n                                            </template>\n                                        @endif\n                                    </ul>\n                                </div>\n                            </div>\n                        </div>\n\n                        <!-- Tags -->\n                        <div\n                            class=\"flex flex-col gap-2 px-4 py-1.5\"\n                            v-if=\"tags.length\"\n                        >\n                            <label class=\"text-gray-600 dark:text-gray-300\">\n                                @lang('admin::app.components.tags.index.added-tags')\n                            </label>\n\n                            <!-- Added Tags List -->\n                            <ul class=\"flex flex-col\">\n                                <template v-for=\"tag in tags\">\n                                    <li\n                                        class=\"flex items-center justify-between gap-2.5 rounded-sm p-2 text-sm text-gray-800 dark:text-white\"\n                                        v-if=\"tag.id\"\n                                    >\n                                        <!-- Name -->\n                                        <span\n                                            class=\"break-all rounded-md bg-rose-100 px-3 py-1.5 text-xs font-medium\"\n                                            :style=\"{\n                                                'background-color': tag.color,\n                                                'color': backgroundColors.find(color => color.background === tag.color)?.text\n                                            }\"\n                                        >\n                                            @{{ tag.name }}\n                                        </span>\n\n                                        <!-- Action -->\n                                        <div class=\"flex items-center gap-1\">\n                                            @if (bouncer()->hasPermission('settings.other_settings.tags.edit'))\n                                                <x-admin::dropdown position=\"bottom-right\">\n                                                    <x-slot:toggle>\n                                                        <button class=\"flex cursor-pointer items-center gap-1 rounded border border-gray-200 px-2 py-0.5 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:hover:border-gray-400 dark:focus:border-gray-400\">\n                                                            <span\n                                                                class=\"h-4 w-4 break-all rounded-full\"\n                                                                :style=\"'background-color: ' + (tag.color ? tag.color : '#546E7A')\"\n                                                            >\n                                                            </span>\n\n                                                            <span class=\"icon-down-arrow text-xl\"></span>\n                                                        </button>\n                                                    </x-slot>\n\n                                                    <x-slot:menu class=\"!top-7 !p-0\">\n                                                        <x-admin::dropdown.menu.item\n                                                            class=\"top-5 flex gap-2\"\n                                                            ::class=\"{ 'bg-gray-100 dark:bg-gray-950': tag.color === color.background }\"\n                                                            v-for=\"color in backgroundColors\"\n                                                            @click=\"update(tag, color)\"\n                                                        >\n                                                            <span\n                                                                class=\"flex h-4 w-4 break-all rounded-full\"\n                                                                :style=\"'background-color: ' + color.background\"\n                                                            >\n                                                            </span>\n\n                                                            @{{ color.label }}\n                                                        </x-admin::dropdown.menu.item>\n                                                    </x-slot>\n                                                </x-admin::dropdown>\n                                            @endif\n\n                                            @if (bouncer()->hasPermission('settings.other_settings.tags.delete'))\n                                                <div class=\"flex items-center\">\n                                                    <span\n                                                        class=\"icon-cross-large flex cursor-pointer rounded-md p-1 text-xl text-gray-600 transition-all hover:bg-gray-200 dark:text-gray-300 dark:hover:bg-gray-800\"\n                                                        v-show=\"! isRemoving[tag.id]\"\n                                                        @click=\"detachFromEntity(tag)\"\n                                                    ></span>\n\n                                                    <span\n                                                        class=\"p-1\"\n                                                        v-show=\"isRemoving[tag.id]\"\n                                                    >\n                                                        <x-admin::spinner />\n                                                    </span>\n                                                </div>\n                                            @endif\n                                        </div>\n                                    </li>\n                                </template>\n                            </ul>\n                        </div>\n                    </div>\n                </x-slot>\n            </x-admin::dropdown>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-tags', {\n            template: '#v-tags-template',\n\n            props: {\n                attachEndpoint: {\n                    type: String,\n                    default: '',\n                },\n\n                detachEndpoint: {\n                    type: String,\n                    default: '',\n                },\n\n                addedTags: {\n                    type: Array,\n                    default: () => [],\n                },\n            },\n\n            data: function () {\n                return {\n                    searchTerm: '',\n\n                    isStoring: false,\n\n                    isSearching: false,\n\n                    isRemoving: {},\n\n                    tags: [],\n\n                    searchedTags: [],\n\n                    backgroundColors: [\n                        {\n                            label: \"@lang('admin::app.components.tags.index.aquarelle-red')\",\n                            text: '#DC2626',\n                            background: '#FEE2E2',\n                        }, {\n                            label: \"@lang('admin::app.components.tags.index.crushed-cashew')\",\n                            text: '#EA580C',\n                            background: '#FFEDD5',\n                        }, {\n                            label: \"@lang('admin::app.components.tags.index.beeswax')\",\n                            text: '#D97706',\n                            background: '#FEF3C7',\n                        }, {\n                            label: \"@lang('admin::app.components.tags.index.lemon-chiffon')\",\n                            text: '#CA8A04',\n                            background: '#FEF9C3',\n                        }, {\n                            label: \"@lang('admin::app.components.tags.index.snow-flurry')\",\n                            text: '#65A30D',\n                            background: '#ECFCCB',\n                        }, {\n                            label: \"@lang('admin::app.components.tags.index.honeydew')\",\n                            text: '#16A34A',\n                            background: '#DCFCE7',\n                        },\n                    ],\n                }\n            },\n\n            watch: {\n                searchTerm(newVal, oldVal) {\n                    this.search();\n                },\n            },\n\n            mounted() {\n                this.tags = this.addedTags;\n            },\n\n            methods: {\n                openModal(type) {\n                    this.$refs.mailActivityModal.open();\n                },\n\n                search() {\n                    if (this.searchTerm.length <= 1) {\n                        this.searchedTags = [];\n\n                        this.isSearching = false;\n\n                        return;\n                    }\n\n                    this.isSearching = true;\n\n                    let self = this;\n\n                    this.$axios.get(\"{{ route('admin.settings.tags.search') }}\", {\n                            params: {\n                                search: 'name:' + this.searchTerm,\n                                searchFields: 'name:like',\n                            }\n                        })\n                        .then (function(response) {\n                            self.tags.forEach(function(addedTag) {\n                                response.data.data = response.data.data.filter(function(tag) {\n                                    return tag.id !== addedTag.id;\n                                });\n                            });\n\n                            self.searchedTags = response.data.data;\n\n                            self.isSearching = false;\n                        })\n                        .catch (function (error) {\n                            self.isSearching = false;\n                        });\n                },\n\n                create() {\n                    this.isStoring = true;\n\n                    var self = this;\n\n                    this.$axios.post(\"{{ route('admin.settings.tags.store') }}\", {\n                        name: this.searchTerm,\n                        color: this.backgroundColors[Math.floor(Math.random() * this.backgroundColors.length)].background,\n                    })\n                        .then(response => {\n                            self.attachToEntity(response.data.data);\n                        })\n                        .catch(error => {\n                            self.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n\n                            self.isStoring = false;\n                        });\n                },\n\n                update(tag, color) {\n                    var self = this;\n\n                    this.$axios.put(\"{{ route('admin.settings.tags.update', 'replaceTagId') }}\".replace('replaceTagId', tag.id), {\n                        name: tag.name,\n                        color: color.background,\n                    })\n                        .then(response => {\n                            tag.color = color.background;\n\n                            self.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                        })\n                        .catch(error => {\n                            self.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                        });\n                },\n\n                attachToEntity(params) {\n                    this.isStoring = true;\n\n                    var self = this;\n\n                    this.$axios.post(this.attachEndpoint, {\n                        tag_id: params.id,\n                    })\n                        .then(response => {\n                            self.searchedTags = [];\n\n                            self.searchTerm = '';\n\n                            self.isStoring = false;\n\n                            self.tags.push(params);\n\n                            self.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                        })\n                        .catch(error => {\n                            self.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n\n                            self.isStoring = false;\n                        });\n                },\n\n                detachFromEntity(tag) {\n                    var self = this;\n\n                    this.$emitter.emit('open-confirm-modal', {\n                        agree: () => {\n                            this.isRemoving[tag.id] = true;\n\n                            this.$axios.delete(this.detachEndpoint, {\n                                    data: {\n                                        tag_id: tag.id,\n                                    }\n                                })\n                                .then(response => {\n                                    self.isRemoving[tag.id] = false;\n\n                                    const index = self.tags.indexOf(tag);\n\n                                    self.tags.splice(index, 1);\n\n                                    self.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                                })\n                                .catch(error => {\n                                    self.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n\n                                    self.isRemoving[tag.id] = false;\n                                });\n                        },\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/tinymce/index.blade.php",
    "content": "@php($placeholders = app('\\Webkul\\Automation\\Helpers\\Entity')->getEmailTemplatePlaceholders())\n\n<v-tinymce {{ $attributes }}></v-tinymce>\n\n@pushOnce('scripts')\n    <!--\n        TODO (@devansh-webkul): Only this portion is pending; it just needs to be integrated using the Vite bundler. Currently,\n        there is an issue with relative paths in the plugins. I intend to address this task at the end.\n    -->\n    <script\n        src=\"https://cdnjs.cloudflare.com/ajax/libs/tinymce/6.6.2/tinymce.min.js\"\n        crossorigin=\"anonymous\"\n        referrerpolicy=\"no-referrer\"\n    ></script>\n\n    <script\n        type=\"text/x-template\"\n        id=\"v-tinymce-template\"\n    >\n    </script>\n\n    <script type=\"module\">\n        app.component('v-tinymce', {\n            template: '#v-tinymce-template',\n\n            props: ['selector', 'field'],\n\n            data() {\n                return {\n                    currentSkin: document.documentElement.classList.contains('dark') ? 'oxide-dark' : 'oxide',\n\n                    currentContentCSS: document.documentElement.classList.contains('dark') ? 'dark' : 'default',\n\n                    isLoading: false,\n                };\n            },\n\n            mounted() {\n                this.destroyTinymceInstance();\n\n                this.init();\n\n                this.$emitter.on('change-theme', (theme) => {\n                    this.destroyTinymceInstance();\n\n                    this.currentSkin = (theme === 'dark') ? 'oxide-dark' : 'oxide';\n                    this.currentContentCSS = (theme === 'dark') ? 'dark' : 'default';\n\n                    this.init();\n                });\n            },\n\n            methods: {\n                destroyTinymceInstance() {\n                    if (! tinymce.activeEditor) {\n                        return;\n                    }\n\n                    tinymce.activeEditor.destroy();\n                },\n\n                init() {\n                    let self = this;\n\n                    let tinyMCEHelper = {\n                        initTinyMCE: function(extraConfiguration) {\n                            let self2 = this;\n\n                            let config = {\n                                relative_urls: false,\n                                menubar: false,\n                                remove_script_host: false,\n                                document_base_url: '{{ asset('/') }}',\n                                uploadRoute: '{{ route('admin.tinymce.upload') }}',\n                                csrfToken: '{{ csrf_token() }}',\n                                ...extraConfiguration,\n                                skin: self.currentSkin,\n                                content_css: self.currentContentCSS,\n                            };\n\n                            const image_upload_handler = (blobInfo, progress) => new Promise((resolve, reject) => {\n                                self2.uploadImageHandler(config, blobInfo, resolve, reject, progress);\n                            });\n\n                            tinymce.init({\n                                ...config,\n\n                                file_picker_callback: function(cb, value, meta) {\n                                    self2.filePickerCallback(config, cb, value, meta);\n                                },\n\n                                images_upload_handler: image_upload_handler,\n                            });\n                        },\n\n                        filePickerCallback: function(config, cb, value, meta) {\n                            let input = document.createElement('input');\n                            input.setAttribute('type', 'file');\n                            input.setAttribute('accept', 'image/*');\n\n                            input.onchange = function() {\n                                let file = this.files[0];\n\n                                let reader = new FileReader();\n                                reader.readAsDataURL(file);\n                                reader.onload = function() {\n                                    let id = 'blobid' + new Date().getTime();\n                                    let blobCache = tinymce.activeEditor.editorUpload.blobCache;\n                                    let base64 = reader.result.split(',')[1];\n                                    let blobInfo = blobCache.create(id, file, base64);\n\n                                    blobCache.add(blobInfo);\n\n                                    cb(blobInfo.blobUri(), {\n                                        title: file.name\n                                    });\n                                };\n                            };\n\n                            input.click();\n                        },\n\n                        uploadImageHandler: function(config, blobInfo, resolve, reject, progress) {\n                            let xhr, formData;\n\n                            xhr = new XMLHttpRequest();\n\n                            xhr.withCredentials = false;\n\n                            xhr.open('POST', config.uploadRoute);\n\n                            xhr.upload.onprogress = ((e) => progress((e.loaded / e.total) * 100));\n\n                            xhr.onload = function() {\n                                let json;\n\n                                if (xhr.status === 403) {\n                                    reject(\"@lang('admin::app.components.tiny-mce.http-error')\", {\n                                        remove: true\n                                    });\n\n                                    return;\n                                }\n\n                                if (xhr.status < 200 || xhr.status >= 300) {\n                                    reject(\"@lang('admin::app.components.tiny-mce.http-error')\");\n\n                                    return;\n                                }\n\n                                json = JSON.parse(xhr.responseText);\n\n                                if (! json || typeof json.location != 'string') {\n                                    reject(\"@lang('admin::app.components.tiny-mce.invalid-json')\" + xhr.responseText);\n\n                                    return;\n                                }\n\n                                resolve(json.location);\n                            };\n\n                            xhr.onerror = (()=>reject(\"@lang('admin::app.components.tiny-mce.upload-failed')\"));\n\n                            formData = new FormData();\n                            formData.append('_token', config.csrfToken);\n                            formData.append('file', blobInfo.blob(), blobInfo.filename());\n\n                            xhr.send(formData);\n                        },\n                    };\n\n                    tinyMCEHelper.initTinyMCE({\n                        selector: this.selector,\n                        plugins: 'image media wordcount save fullscreen code table lists link',\n                        toolbar: 'placeholders | bold italic strikethrough forecolor backcolor image alignleft aligncenter alignright alignjustify | link hr | numlist bullist outdent indent | removeformat | code | table',\n                        image_advtab: true,\n                        directionality: 'ltr',\n                        setup: (editor) => {\n                            let toggleState = false;\n\n                            editor.ui.registry.addMenuButton('placeholders', {\n                                text: 'Placeholders',\n                                fetch: function (callback) {\n                                    const items = [\n                                        @foreach($placeholders as $placeholder)\n                                            {\n                                                type: 'nestedmenuitem',\n                                                text: '{{ $placeholder['text'] }}',\n                                                getSubmenuItems: () => [\n                                                    @foreach($placeholder['menu'] as $child)\n                                                        {\n                                                            type: 'menuitem',\n                                                            text: '{{ $child['text'] }}',\n                                                            onAction: function () {\n                                                                editor.insertContent('{{ $child['value'] }}');\n                                                            },\n                                                        },\n                                                    @endforeach\n                                                ],\n                                            },\n                                        @endforeach\n                                    ];\n\n                                    callback(items);\n                                }\n                            });\n\n                            ['change', 'paste', 'keyup'].forEach((event) => {\n                                editor.on(event, () => this.field.onInput(editor.getContent()));\n                            });\n                        }\n                    });\n                },\n            },\n        })\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/tree/checkbox.blade.php",
    "content": "@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-tree-checkbox-template\"\n    >\n        <label\n            :for=\"id\"\n            class=\"group inline-flex w-max cursor-pointer select-none items-center gap-2.5 p-1.5\"\n        >\n            <input\n                type=\"checkbox\"\n                :name=\"[name + '[]']\"\n                :value=\"value\"\n                :id=\"id\"\n                class=\"peer hidden\"\n                :checked=\"isActive\"\n                @change=\"inputChanged()\"\n            />\n\n            <span class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-600 peer-checked:text-brandColor\">\n            </span>\n\n            <div class=\"cursor-pointer text-sm text-gray-600 hover:text-gray-800 dark:text-gray-300 dark:hover:text-white\">\n                @{{ label }}\n            </div>\n        </label>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-tree-checkbox', {\n            template: '#v-tree-checkbox-template',\n\n            name: 'v-tree-checkbox',\n\n            props: ['id', 'label', 'name', 'value'],\n\n            computed: {\n                isActive() {\n                    return this.$parent.has(this.value);\n                },\n            },\n\n            methods: {\n                inputChanged() {\n                    this.$emit('change-input', {\n                        id: this.id,\n                        label: this.label,\n                        name: this.name,\n                        value: this.value,\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/tree/radio.blade.php",
    "content": "@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-tree-radio-template\"\n    >\n        <label\n            :for=\"id\"\n            class=\"inline-flex w-max cursor-pointer select-none items-center p-1.5 text-gray-600 dark:text-gray-300\"\n        >\n            <input\n                type=\"radio\"\n                :name=\"name\"\n                :value=\"value\"\n                :id=\"id\"\n                class=\"peer hidden\"\n                :checked=\"isActive\"\n                @change=\"inputChanged()\"\n            >\n\n            <span class=\"icon-radio-normal peer-checked:icon-radio-selected mr-1 cursor-pointer rounded-md text-2xl peer-checked:text-blue-600\"></span>\n\n            <div class=\"cursor-pointer text-sm text-gray-600 hover:text-gray-800 dark:text-gray-300 dark:hover:text-white\">\n                @{{ label }}\n            </div>\n        </label>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-tree-radio', {\n            template: '#v-tree-radio-template',\n\n            name: 'v-tree-radio',\n\n            props: ['id', 'label', 'name', 'value'],\n\n            computed: {\n                isActive() {\n                    return this.$parent.has(this.value);\n                },\n            },\n\n            methods: {\n                inputChanged() {\n                    this.$emit('change-input', {\n                        id: this.id,\n                        label: this.label,\n                        name: this.name,\n                        value: this.value,\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/components/tree/view.blade.php",
    "content": "@props([\n    'inputType' => 'checkbox',\n    'selectionType' => 'hierarchical',\n])\n\n@if ($inputType == 'checkbox')\n    <!-- Tree Checkbox Component -->\n    <x-admin::tree.checkbox />\n@else\n    <!-- Tree Radio Component -->\n    <x-admin::tree.radio />\n@endif\n\n<v-tree-view\n    {{ $attributes->except(['input-type', 'selection-type']) }}\n    input-type=\"{{ $inputType }}\"\n    selection-type=\"{{ $selectionType }}\"\n>\n    <x-admin::shimmer.tree />\n</v-tree-view>\n\n@pushOnce('scripts')\n    <script type=\"module\">\n        app.component('v-tree-view', {\n            name: 'v-tree-view',\n\n            inheritAttrs: false,\n\n            props: {\n                inputType: {\n                    type: String,\n                    required: false,\n                    default: 'checkbox'\n                },\n\n                selectionType: {\n                    type: String,\n                    required: false,\n                    default: 'hierarchical'\n                },\n\n                nameField: {\n                    type: String,\n                    required: false,\n                    default: 'permissions'\n                },\n\n                valueField: {\n                    type: String,\n                    required: false,\n                    default: 'value'\n                },\n\n                idField: {\n                    type: String,\n                    required: false,\n                    default: 'id'\n                },\n\n                labelField: {\n                    type: String,\n                    required: false,\n                    default: 'name'\n                },\n\n                childrenField: {\n                    type: String,\n                    required: false,\n                    default: 'children'\n                },\n\n                items: {\n                    type: [Array, String, Object],\n                    required: false,\n                    default: () => ([])\n                },\n\n                value: {\n                    type: [Array, String, Object],\n                    required: false,\n                    default: () => ([])\n                },\n\n                fallbackLocale: {\n                    type: String,\n                    required: 'en',\n                },\n\n                collapse: {\n                    type: Boolean,\n                    required: false,\n                    default: false\n                },\n            },\n\n            data() {\n                return {\n                    formattedItems: null,\n\n                    formattedValues: null,\n                };\n            },\n\n            created() {\n                this.formattedItems = this.getInitialFormattedItems();\n\n                this.formattedValues = this.getInitialFormattedValues();\n            },\n\n            methods: {\n                getInitialFormattedItems() {\n                    return (typeof this.items == 'string')\n                        ? JSON.parse(this.items)\n                        : this.items;\n                },\n\n                getInitialFormattedValues() {\n                    if (this.inputType == 'radio') {\n                        if (typeof this.value == 'array') {\n                            return this.value;\n                        } else {\n                            return [this.value];\n                        }\n                    }\n\n                    return (typeof this.value == 'string')\n                        ? JSON.parse(this.value)\n                        : this.value;\n                },\n\n                getId(item) {\n                    const timestamp = new Date().getTime().toString(36);\n\n                    const id = item[this.idField];\n\n                    return `${timestamp}_${id}`\n                },\n\n                getLabel(item) {\n                    return item[this.labelField]\n                        ? item[this.labelField]\n                        : item.translations.filter((translation) => translation.locale === this.fallbackLocale)[0][this.labelField];\n                },\n\n                generateToggleIconComponent(props) {\n                    return this.$h('i', {\n                        ...props,\n\n                        onClick: (selection) => {\n                            selection.srcElement.parentElement.classList.toggle('active');\n\n                            selection.srcElement.classList.toggle('icon-down-arrow', !selection.srcElement.classList.contains('icon-down-arrow'));\n                            selection.srcElement.classList.toggle('icon-right-arrow', !selection.srcElement.classList.contains('icon-right-arrow'));\n                        },\n                    });\n                },\n\n                generateFolderIconComponent(props) {\n                    return this.$h('i', {\n                        ...props,\n                    });\n                },\n\n                generateCheckboxComponent(props) {\n                    return this.$h(this.$resolveComponent('v-tree-checkbox'), {\n                        ...props,\n\n                        onChangeInput: (item) => {\n                            this.handleCheckbox(item.value);\n\n                            this.$emit('change-input', this.formattedValues);\n                        },\n                    });\n                },\n\n                generateRadioComponent(props) {\n                    return this.$h(this.$resolveComponent('v-tree-radio'), {\n                        ...props,\n\n                        onChangeInput: (item) => {\n                            this.$emit('change-input', this.formattedValues[0]);\n                        },\n                    });\n                },\n\n                generateInputComponent(props) {\n                    switch (this.inputType) {\n                        case 'checkbox':\n                            return this.generateCheckboxComponent(props);\n\n                        case 'radio':\n                            return this.generateRadioComponent(props);\n\n                        default:\n                            return this.generateCheckboxComponent(props);\n                    }\n                },\n\n                generateTreeItemComponents(items, level = 1) {\n                    let treeItems = [];\n\n                    for (let key in items) {\n                        let hasChildren = Object.entries(items[key][this.childrenField]).length > 0;\n\n                        treeItems.push(\n                            this.$h(\n                                'div', {\n                                    class: [\n                                        this.collapse ? '' : 'active',\n                                        'v-tree-item inline-block w-full [&>.v-tree-item]:ltr:pl-6 [&>.v-tree-item]:rtl:pr-6 [&>.v-tree-item]:hidden [&.active>.v-tree-item]:block',\n                                        level === 1 && ! hasChildren\n                                            ? 'ltr:!pl-5 rtl:!pr-5'\n                                            : level > 1 && ! hasChildren\n                                            ? 'ltr:!pl-14 rtl:!pr-14'\n                                            : '',\n                                    ],\n                                }, [\n                                    this.generateToggleIconComponent({\n                                        class: [\n                                            hasChildren ? 'icon-down-arrow' : '',\n                                            'text-xl rounded-md cursor-pointer transition-all hover:bg-gray-100 dark:hover:bg-gray-950'\n                                        ],\n                                    }),\n\n                                    this.generateFolderIconComponent({\n                                        class: [\n                                            hasChildren ? 'icon-folder' : 'icon-file',\n                                            'text-2xl cursor-pointer'\n                                        ],\n                                    }),\n\n                                    this.generateInputComponent({\n                                        id: this.getId(items[key]),\n                                        label: this.getLabel(items[key]),\n                                        name: this.nameField,\n                                        value: items[key][this.valueField],\n                                    }),\n\n                                    this.generateTreeItemComponents(items[key][this.childrenField], level + 1),\n                                ]\n                            )\n                        );\n                    }\n\n                    return treeItems;\n                },\n\n                generateTree() {\n                    return this.$h(\n                        'div', {\n                            class: [\n                                'v-tree-item-wrapper',\n                            ],\n                        }, [\n                            this.generateTreeItemComponents(this.formattedItems),\n                        ]\n                    );\n                },\n\n                searchInTree(items, value, ancestors = []) {\n                    for (let key in items) {\n                        if (items[key][this.valueField] === value) {\n                            return Object.assign(items[key], { ancestors: ancestors.reverse() });\n                        }\n\n                        const result = this.searchInTree(items[key][this.childrenField], value, [...ancestors, items[key]]);\n\n                        if (result !== undefined) {\n                            return result;\n                        }\n                    }\n\n                    return undefined;\n                },\n\n                has(key) {\n                    let foundValues = this.formattedValues.filter(value => value == key);\n\n                    return foundValues.length > 0;\n                },\n\n                select(key) {\n                    if (! this.has(key)) {\n                        this.formattedValues.push(key);\n                    }\n                },\n\n                unSelect(key) {\n                    this.formattedValues = this.formattedValues.filter((savedKey) => savedKey !== key);\n                },\n\n                toggle(key) {\n                    this.has(key) ? this.unSelect(key) : this.select(key);\n                },\n\n                handleCheckbox(key) {\n                    let item = this.searchInTree(this.formattedItems, key);\n\n                    switch (this.selectionType) {\n                        case 'individual':\n                            this.handleIndividualSelectionType(item);\n\n                            break;\n\n                        case 'hierarchical':\n                            this.handleHierarchicalSelectionType(item);\n\n                            break;\n\n                        default:\n                            this.handleHierarchicalSelectionType(item);\n\n                            break;\n                    }\n                },\n\n                handleIndividualSelectionType(item) {\n                    this.handleCurrent(item);\n                },\n\n                handleHierarchicalSelectionType(item) {\n                    this.handleAncestors(item);\n\n                    this.handleCurrent(item);\n\n                    this.handleChildren(item);\n\n                    if (! this.has(item[this.valueField])) {\n                        this.unSelectAllChildren(item);\n                    }\n                },\n\n                handleAncestors(item) {\n                    if (item.ancestors.length) {\n                        item.ancestors.forEach((ancestor) => {\n                            this.select(ancestor[this.valueField]);\n                        });\n                    }\n                },\n\n                handleCurrent(item) {\n                    this.toggle(item[this.valueField]);\n                },\n\n                handleChildren(item) {\n                    let selectedChildrenCount = this.countSelectedChildren(item);\n\n                    selectedChildrenCount ? this.unSelectAllChildren(item) : this.selectAllChildren(item);\n                },\n\n                countSelectedChildren(item, selectedCount = 0) {\n                    if (typeof item[this.childrenField] === 'object') {\n                        for (let childKey in item[this.childrenField]) {\n                            if (this.has(item[this.childrenField][childKey][this.valueField])) {\n                                ++selectedCount;\n                            }\n\n                            this.countSelectedChildren(item[this.childrenField][childKey], selectedCount);\n                        }\n                    }\n\n                    return selectedCount;\n                },\n\n                selectAllChildren(item) {\n                    if (typeof item[this.childrenField] === 'object') {\n                        for (let childKey in item[this.childrenField]) {\n                            this.select(item[this.childrenField][childKey][this.valueField]);\n\n                            this.selectAllChildren(item[this.childrenField][childKey]);\n                        }\n                    }\n                },\n\n                unSelectAllChildren(item) {\n                    if (typeof item[this.childrenField] === 'object') {\n                        for (let childKey in item[this.childrenField]) {\n                            this.unSelect(item[this.childrenField][childKey][this.valueField]);\n\n                            this.unSelectAllChildren(item[this.childrenField][childKey]);\n                        }\n                    }\n                },\n            },\n\n            render() {\n                return this.$h('div', {\n                    class: ['v-tree-container']\n                }, [this.generateTree()]);\n            }\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/configuration/edit.blade.php",
    "content": "@php\n    $activeConfiguration = system_config()->getActiveConfigurationItem();\n\n    $name = $activeConfiguration->getName();\n@endphp\n\n<x-admin::layouts>\n    <x-slot:title>\n        {{ strip_tags($name) }}\n    </x-slot>\n\n    {!! view_render_event('admin.configuration.edit.form_controls.before') !!}\n\n    <!-- Configuration form fields -->\n    <x-admin::form\n        action=\"\"\n        enctype=\"multipart/form-data\"\n    >\n        <!-- Save Inventory -->\n        <div class=\"mt-3.5 flex items-center justify-between gap-4 max-sm:flex-wrap\">\n            <p class=\"text-xl font-bold text-gray-800 dark:text-white\">\n                {{ $name }}\n            </p>\n\n            <!-- Save Inventory -->\n            <div class=\"flex items-center gap-x-2.5\">\n                {!! view_render_event('admin.configuration.edit.back_button.before') !!}\n\n                <!-- Back Button -->\n                <a\n                    href=\"{{ route('admin.configuration.index') }}\"\n                    class=\"transparent-button hover:bg-gray-200 dark:text-white dark:hover:bg-gray-800\"\n                >\n                    @lang('admin::app.configuration.index.back')\n                </a>\n\n                {!! view_render_event('admin.configuration.edit.back_button.after') !!}\n\n                {!! view_render_event('admin.configuration.edit.save_button.before') !!}\n\n                <button\n                    type=\"submit\"\n                    class=\"primary-button\"\n                >\n                    @lang('admin::app.configuration.index.save-btn')\n                </button>\n\n                {!! view_render_event('admin.configuration.edit.save_button.after') !!}\n            </div>\n        </div>\n\n        <div class=\"grid grid-cols-[1fr_2fr] gap-10 max-lg:grid-cols-1 max-lg:gap-4 lg:mt-6\">\n            @foreach ($activeConfiguration->getChildren() as $child)\n                <div class=\"grid content-start gap-2.5 max-lg:mt-6\">\n                    <p class=\"text-base font-semibold text-gray-600 dark:text-gray-300\">\n                        {{ $child->getName() }}\n                    </p>\n\n                    <p class=\"leading-[140%] text-gray-600 dark:text-gray-300\">\n                        {!! $child->getInfo() !!}\n                    </p>\n                </div>\n\n                <div class=\"box-shadow rounded bg-white p-4 dark:bg-gray-900\">\n                    {!! view_render_event('admin.configuration.edit.form_controls.before') !!}\n\n                    @foreach ($child->getFields() as $field)\n                        @if (\n                            $field->getType() == 'blade'\n                            && view()->exists($path = $field->getPath())\n                        )\n                            {!! view($path, compact('field', 'child'))->render() !!}\n                        @else \n                            @include ('admin::configuration.field-type')\n                        @endif\n                    @endforeach\n\n                    {!! view_render_event('admin.configuration.edit.form_controls.after') !!}\n                </div>\n            @endforeach\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.configuration.edit.form_controls.after') !!}\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/configuration/field-type.blade.php",
    "content": "@php($value = old($field->getNameKey()) ??  system_config()->getConfigData($field->getNameKey()))\n\n<input\n    type=\"hidden\"\n    name=\"keys[]\"\n    value=\"{{ json_encode($child) }}\"\n/>\n\n<div class=\"mb-4 last:!mb-0\">\n    <v-configurable\n        name=\"{{ $field->getNameField() }}\"\n        value=\"{{ $value }}\"\n        label=\"{{ trans($field->getTitle()) }}\"\n        info=\"{{ trans($field->getInfo()) }}\"\n        validations=\"{{ $field->getValidations() }}\"\n        is-require=\"{{ $field->isRequired() }}\"\n        depend-name=\"{{ $field->getDependFieldName() }}\"\n        src=\"{{ Storage::url($value) }}\"\n        field-data=\"{{ json_encode($field) }}\"\n        :tinymce=\"{{ json_encode($field->getTinymce()) }}\"\n    >\n        <div class=\"shimmer mb-1.5 h-5 w-24\"></div>\n\n        <div class=\"shimmer flex h-[42px] w-full rounded-md\"></div>\n    </v-configurable>\n</div>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-configurable-template\"\n    >\n        <x-admin::form.control-group class=\"last:!mb-0\">\n            <!-- Title of the input field -->\n            <div    \n                v-if=\"field.is_visible\"\n                class=\"flex justify-between\"\n            >\n                <x-admin::form.control-group.label ::for=\"name\">\n                    @{{ label }} <span :class=\"isRequire\"></span>\n\n                    <span\n                        v-if=\"field['channel_based'] && channelCount\"\n                        class=\"rounded border border-gray-200 bg-gray-100 px-1 py-0.5 text-[10px] font-semibold leading-normal text-gray-600\"\n                        v-text=\"JSON.parse(currentChannel).name\"\n                    >\n                    </span>\n        \n                    <span\n                        v-if=\"field['locale_based']\"\n                        class=\"rounded border border-gray-200 bg-gray-100 px-1 py-0.5 text-[10px] font-semibold leading-normal text-gray-600\"\n                        v-text=\"JSON.parse(currentLocale).name\"\n                    >\n                    </span>\n                </x-admin::form.control-group.label>\n            </div>\n        \n            <!-- Text input -->\n            <template v-if=\"field.type == 'text' && field.is_visible\">\n                <x-admin::form.control-group.control\n                    type=\"text\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    ::value=\"value\"\n                    ::rules=\"validations\"\n                    ::label=\"label\"\n                />\n            </template>\n        \n            <!-- Password input -->\n            <template v-if=\"field.type == 'password' && field.is_visible\">\n                <x-admin::form.control-group.control\n                    type=\"password\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    ::value=\"value\"\n                    ::rules=\"validations\"\n                    ::label=\"label\"\n                />\n            </template>\n        \n            <!-- Number input -->\n            <template v-if=\"field.type == 'number' && field.is_visible\">\n                <x-admin::form.control-group.control\n                    type=\"number\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    ::rules=\"validations\"\n                    ::value=\"value\"\n                    ::label=\"label\"\n                    ::min=\"field.name == 'minimum_order_amount'\"\n                />\n            </template>\n\n            <!-- Color Input -->\n            <template v-if=\"field.type == 'color' && field.is_visible\">\n                <v-field\n                    v-slot=\"{ field, errors }\"\n                    :id=\"name\"\n                    :name=\"name\"\n                    :value=\"value != '' ? value : '#ffffff'\"\n                    :label=\"label\"\n                    :rules=\"validations\"\n                >\n                    <input\n                        type=\"color\"\n                        v-bind=\"field\"\n                        :class=\"[errors.length ? 'border border-red-500' : '']\"\n                        class=\"w-full appearance-none rounded-md border text-sm text-gray-600 transition-all hover:border-gray-400 dark:text-gray-300 dark:hover:border-gray-400\"\n                    />\n                </v-field>\n            </template>\n\n            <!-- Textarea Input -->\n            <template v-if=\"field.type == 'textarea' && field.is_visible && !field.tinymce\">\n                <x-admin::form.control-group.control\n                    type=\"textarea\"\n                    class=\"text-gray-600 dark:text-gray-300\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    ::rules=\"validations\"\n                    ::value=\"value\"\n                    ::label=\"label\"\n                />\n            </template>\n\n            <!-- Textarea with tinymce -->\n            <template v-if=\"field.type == 'editor' && field.is_visible && field.tinymce\">\n                <x-admin::form.control-group.control\n                    type=\"textarea\"\n                    class=\"text-gray-600 dark:text-gray-300\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    ::rules=\"validations\"\n                    ::value=\"value\"\n                    ::label=\"label\"\n                    tinymce=\"true\"\n                />\n            </template>\n        \n            <!-- Select input -->\n            <template v-if=\"field.type == 'select' && field.is_visible\">\n                <v-field\n                    v-slot=\"data\"\n                    :id=\"name\"\n                    :name=\"name\"\n                    :rules=\"validations\"\n                    :value=\"value\"\n                    :label=\"label\"\n                >\n                    <select\n                        :id=\"name\"\n                        :name=\"name\"\n                        v-bind=\"data.field\"\n                        :class=\"[data.errors.length ? 'border border-red-500' : '']\"\n                        class=\"custom-select w-full rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                    >\n                        <option\n                            v-for=\"option in field.options\"\n                            :value=\"option.value\"\n                            v-text=\"option.title\"\n                        >\n                        </option>\n                    </select>\n                </v-field>\n            </template>\n\n            <!-- Multiselect Input -->\n            <template v-if=\"field.type == 'multiselect' && field.is_visible\">\n                <v-field\n                    v-slot=\"data\"\n                    :id=\"name\"\n                    :name=\"`${name}[]`\"\n                    :rules=\"validations\"\n                    :value=\"value\"\n                    :label=\"label\"\n                    multiple\n                >\n                    <select\n                        :name=\"`${name}[]`\"\n                        v-bind=\"data.field\"\n                        :class=\"[data.errors.length ? 'border border-red-500' : '']\"\n                        class=\"custom-select w-full rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                        multiple\n                    >\n                        <option\n                            v-for=\"option in field.options\"\n                            :value=\"option.value\"\n                            v-text=\"option.title\"\n                        >\n                        </option>\n                    </select>\n                </v-field>\n            </template>\n           \n            <!-- Boolean/Switch input -->\n            <template v-if=\"field.type == 'boolean' && field.is_visible\">\n                <input\n                    type=\"hidden\"\n                    :name=\"name\"\n                    :value=\"0\"\n                />\n        \n                <label class=\"relative inline-flex cursor-pointer items-center\">\n                    <input  \n                        type=\"checkbox\"\n                        :name=\"name\"\n                        :value=\"1\"\n                        :id=\"name\"\n                        class=\"peer sr-only\"\n                        :checked=\"parseInt(value || 0)\"\n                    >\n\n                    <label\n                        class=\"peer h-5 w-9 cursor-pointer rounded-full bg-gray-200 after:absolute after:top-0.5 after:h-4 after:w-4 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[''] peer-checked:bg-blue-600 peer-checked:after:border-white peer-focus:outline-none peer-focus:ring-blue-300 dark:bg-gray-800 dark:after:border-white dark:after:bg-white dark:peer-checked:bg-gray-950 after:ltr:left-0.5 peer-checked:after:ltr:translate-x-full after:rtl:right-0.5 peer-checked:after:rtl:-translate-x-full\"\n                        :for=\"name\"\n                    ></label>\n                </label>\n            </template>\n        \n            <template v-if=\"field.type == 'image' && field.is_visible\">\n                <div class=\"flex items-center justify-center\">\n                    <a\n                        :href=\"src\"\n                        target=\"_blank\"\n                        v-if=\"value\"\n                    >\n                        <img\n                            :src=\"src\"\n                            :alt=\"name\"\n                            class=\"top-15 rounded-3 border-3 relative h-[33px] w-[33px] border-gray-500 ltr:mr-5 rtl:ml-5\"\n                        />\n                    </a>\n                    \n                    <x-admin::form.control-group.control\n                        type=\"file\"\n                        ::name=\"name\"\n                        ::id=\"name\"\n                        ::rules=\"validations\"\n                        ::label=\"label\"\n                    />\n                </div>\n        \n                <template v-if=\"value\">\n                    <x-admin::form.control-group class=\"mt-1.5 flex w-max cursor-pointer select-none items-center gap-1.5\">\n                        <x-admin::form.control-group.control\n                            type=\"checkbox\"\n                            ::id=\"`${name}[delete]`\"\n                            ::name=\"`${name}[delete]`\"\n                            value=\"1\"\n                            ::for=\"`${name}[delete]`\"\n                        />\n        \n                        <label\n                            :for=\"`${name}[delete]`\"\n                            class=\"cursor-pointer !text-sm !font-semibold !text-gray-600 dark:!text-gray-300\"\n                        >\n                            @lang('admin::app.configuration.index.delete')\n                        </label>\n                    </x-admin::form.control-group>\n                </template>\n            </template>\n\n            <template v-if=\"field.type == 'file' && field.is_visible\">\n                <a\n                    v-if=\"value\"\n                    :href=\"'{{ route('admin.configuration.download', [request()->route('slug'), request()->route('slug2'), ':id']) }}'.replace(':id', value.split('/')[1])\"\n                >\n                    <div class=\"mb-1 inline-flex w-full max-w-max cursor-pointer appearance-none items-center justify-between gap-x-1 rounded-md border border-transparent p-1.5 text-center text-gray-600 transition-all marker:shadow hover:bg-gray-200 active:border-gray-300 dark:text-gray-300 dark:hover:bg-gray-800\">\n                        <i class=\"icon-stats-down text-2xl\"></i>\n                    </div>\n                </a>\n        \n                <x-admin::form.control-group.control\n                    type=\"file\"\n                    ::id=\"name\"\n                    ::name=\"name\"\n                    ::rules=\"validations\"\n                    ::label=\"label\"\n                />\n        \n                <template v-if=\"value\">\n                    <div class=\"flex cursor-pointer gap-2.5\">\n                        <x-admin::form.control-group.control\n                            type=\"checkbox\"\n                            ::id=\"`${name}[delete]`\"\n                            ::name=\"`${name}[delete]`\"\n                            value=\"1\"\n                        />\n        \n                        <label\n                            class=\"cursor-pointer\"\n                            ::for=\"`${name}[delete]`\"\n                        >\n                            @lang('admin::app.configuration.index.delete')\n                        </label>\n                    </div>\n                </template>\n            </template>\n\n            <template v-if=\"field.type == 'country' && field.is_visible\">\n                <v-country :selected-country=\"value\">\n                    <template v-slot:default=\"{ changeCountry }\">\n                        <x-admin::form.control-group class=\"flex\">\n                            <x-admin::form.control-group.control\n                                type=\"select\"\n                                ::id=\"name\"\n                                ::name=\"name\"\n                                ::rules=\"validations\"\n                                ::value=\"value\"\n                                ::label=\"label\"\n                                @change=\"changeCountry($event.target.value)\"\n                            >\n                                <option value=\"\">\n                                    @lang('admin::app.configuration.index.select-country')\n                                </option>\n        \n                                @foreach (core()->countries() as $country)\n                                    <option value=\"{{ $country->code }}\">\n                                        {{ $country->name }}\n                                    </option>\n                                @endforeach\n                            </x-admin::form.control-group.control>\n                        </x-admin::form.control-group>\n                    </template>\n                </v-country>\n            </template>\n        \n            <!-- State select Vue component -->\n            <template v-if=\"field.type == 'state' && field.is_visible\">\n                <v-state>\n                    <template v-slot:default=\"{ countryStates, country, haveStates, isStateComponenetLoaded }\">\n                        <div v-if=\"isStateComponenetLoaded\">\n                            <template v-if=\"haveStates()\">\n                                <x-admin::form.control-group class=\"flex\">\n                                    <x-admin::form.control-group.control\n                                        type=\"select\"\n                                        ::id=\"name\"\n                                        ::name=\"name\"\n                                        ::rules=\"validations\"\n                                        ::value=\"value\"\n                                        ::label=\"label\"\n                                    >\n                                        <option value=\"\">\n                                            @lang('admin::app.configuration.index.select-state')\n                                        </option>\n                                        \n                                        <option value=\"*\">\n                                            *\n                                        </option>\n                                        \n                                        <option\n                                            v-for='(state, index) in countryStates[country]'\n                                            :value=\"state.code\"\n                                        >\n                                            @{{ state.default_name }}\n                                        </option>\n                                    </x-admin::form.control-group.control>\n                                </x-admin::form.control-group>\n                            </template>\n        \n                            <template v-else>\n                                <x-admin::form.control-group class=\"flex\">\n                                    <x-admin::form.control-group.control\n                                        type=\"text\"\n                                        ::id=\"name\"\n                                        ::name=\"name\"\n                                        ::rules=\"validations\"\n                                        ::value=\"value\"\n                                        ::label=\"label\"\n                                    />\n                                </x-admin::form.control-group>\n                            </template>\n                        </div>\n                    </template>\n                </v-state>\n            </template>\n        \n            <p\n                v-if=\"field.info && field.is_visible\"\n                class=\"mt-1 block text-xs italic leading-5 text-gray-600 dark:text-gray-300\"\n                v-text=\"info\"\n            >\n            </p>\n     \n            <!-- validaiton message -->\n            <v-error-message\n                :name=\"name\"\n                v-slot=\"{ message }\"\n            >\n                <p\n                    class=\"mt-1 text-xs italic text-red-600\"\n                    v-text=\"message\"\n                >\n                </p>\n            </v-error-message>\n        </x-admin::form.control-group>\n    </script>\n\n    <script\n        type=\"text/x-template\"\n        id=\"v-country-template\"\n    >\n        <div>\n            <slot :changeCountry=\"changeCountry\"></slot>\n        </div>\n    </script>\n\n    <script\n        type=\"text/x-template\"\n        id=\"v-state-template\"\n    >\n        <div>\n            <slot\n                :country=\"country\"\n                :country-states=\"countryStates\"\n                :have-states=\"haveStates\"\n                :is-state-componenet-loaded=\"isStateComponenetLoaded\"\n            >\n            </slot>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-configurable', {\n            template: '#v-configurable-template',\n\n            props: [\n                'dependName',\n                'fieldData',\n                'info',\n                'isRequire',\n                'label',\n                'name',\n                'src',\n                'validations',\n                'value',\n                'tinymce',\n            ],\n\n            data() {\n                return {\n                    field: JSON.parse(this.fieldData),\n                };\n            },\n\n            mounted() {\n                if (! this.dependName) {\n                    return;\n                }\n\n                const dependElement = document.getElementById(this.dependName);\n\n                if (! dependElement) {\n                    return;\n                }\n\n                dependElement.addEventListener('change', (event) => {\n                    this.field['is_visible'] = \n                        event.target.type === 'checkbox' \n                        ? event.target.checked\n                        : this.validations.split(',').slice(1).includes(event.target.value);\n                });\n\n                dependElement.dispatchEvent(new Event('change'));\n            },\n        });\n\n        app.component('v-country', {\n            template: '#v-country-template',\n\n            props: ['selectedCountry'],\n\n            data() {\n                return {\n                    country: this.selectedCountry,\n                };\n            },\n\n            mounted() {\n                this.$emitter.emit('country-changed', this.country);\n            },\n\n            methods: {\n                changeCountry(selectedCountryCode) {\n                    this.$emitter.emit('country-changed', selectedCountryCode);\n                },\n            },\n        });\n\n        app.component('v-state', {\n            template: '#v-state-template',\n\n            data() {\n                return {\n                    country: \"\",\n\n                    isStateComponenetLoaded: false,\n\n                    countryStates: @json(core()->groupedStatesByCountries())\n                };\n            },\n\n            created() {\n                this.$emitter.on('country-changed', (value) => this.country = value);\n\n                setTimeout(() => {\n                    this.isStateComponenetLoaded = true;\n                }, 0);\n            },\n\n            methods: {\n                haveStates() {\n                    /*\n                    * The double negation operator is used to convert the value to a boolean.\n                    * It ensures that the final result is a boolean value,\n                    * true if the array has a length greater than 0, and otherwise false.\n                    */\n                    return !!this.countryStates[this.country]?.length;\n                },\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/configuration/index.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Title of the page. -->\n    <x-slot:title>\n        @lang('admin::app.configuration.index.title')\n    </x-slot>\n\n    <!-- Breadcrumbs -->\n    <x-admin::breadcrumbs name=\"configuration\" />\n\n    {!! view_render_event('admin.configuration.index.header.before') !!}\n\n    <!-- Heading of the page -->\n    <div class=\"mb-7 flex flex-wrap items-center justify-between\">\n        <p class=\"py-3 text-xl font-bold text-gray-800 dark:text-white\">\n            @lang('admin::app.configuration.index.title')\n        </p>\n\n        {!! view_render_event('admin.configuration.index.header.configuration_search.before') !!}\n\n        <!-- Configuration Search Bar Vue Component -->\n        <v-configuration-search>\n            <div class=\"relative flex w-[525px] max-w-[525px] items-center max-lg:w-[400px]\">\n                <i class=\"icon-search absolute top-1.5 flex items-center text-2xl ltr:left-3 rtl:right-3\"></i>\n\n                <input \n                    type=\"text\" \n                    class=\"block w-full rounded-lg border bg-white px-10 py-1.5 leading-6 text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\"\n                    placeholder=\"@lang('admin::app.configuration.index.search')\" \n                >\n            </div>\n        </v-configuration-search>\n\n        {!! view_render_event('admin.configuration.index.header.configuration_search.after') !!}\n    </div>\n\n    {!! view_render_event('admin.configuration.index.header.after') !!}\n\n    {!! view_render_event('admin.configuration.index.content.before') !!}\n\n    <!-- Page Content -->\n    <div class=\"grid gap-y-8\">\n        @foreach (system_config()->getItems() as $item)\n            <div>\n                <div class=\"grid gap-1\">\n                    <!-- Title of the Main Card -->\n                    <p class=\"font-semibold text-gray-600 dark:text-gray-300\">\n                        {{ $item->getName() }}\n                    </p>\n\n                    <!-- Info of the Main Card -->\n                    <p class=\"text-gray-600 dark:text-gray-300\">\n                        {{ $item->getInfo() }}\n                    </p>\n                </div>\n\n                <div class=\"box-shadow max-1580:grid-cols-3 mt-2 grid grid-cols-4 flex-wrap justify-between gap-x-12 gap-y-6 rounded bg-white p-4 dark:bg-gray-900 max-xl:grid-cols-2 max-lg:gap-y-4 max-sm:grid-cols-1\">\n                    <!-- Menus cards -->\n                    @foreach ($item->getChildren() as $key => $child)\n                        <a \n                            class=\"flex max-w-[360px] items-center gap-2 rounded-lg p-2 transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                            href=\"{{ route('admin.configuration.index', ($item->getKey() . '/' . $key)) }}\"\n                        >\n                            @if ($icon = $child->getIcon())\n                                <div class=\"rounded-lg bg-gray-100 p-3 dark:bg-gray-800\">\n                                    <i class=\"{{ $child->getIcon() }} text-3xl \"></i>\n                                </div>\n                            @endif\n\n                            <div class=\"grid\">\n                                <p class=\"mb-1.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                    {{ $child->getName() }}\n                                </p>\n                                \n                                <p class=\"text-xs text-gray-600 dark:text-gray-300\">\n                                    {{ $child->getInfo() }}\n                                </p>\n                            </div>\n                        </a>\n                    @endforeach\n                </div>\n            </div>\n        @endforeach\n    </div>\n\n    {!! view_render_event('admin.configuration.index.content.after') !!}\n\n    @pushOnce('scripts')\n        <script type=\"text/x-template\" id=\"v-configuration-search-template\">\n            <div class=\"relative flex w-[525px] max-w-[525px] items-center max-lg:w-[400px]\">\n                <i class=\"icon-search absolute top-1.5 flex items-center text-2xl ltr:left-3 rtl:right-3\"></i>\n\n                <input \n                    type=\"text\"\n                    class=\"peer block w-full rounded-lg border bg-white px-10 py-1.5 leading-6 text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                    :class=\"{'border-gray-400': isDropdownOpen}\"\n                    placeholder=\"@lang('admin::app.configuration.index.search')\"\n                    v-model.lazy=\"searchTerm\"\n                    @click=\"searchTerm.length >= 2 ? isDropdownOpen = true : {}\"\n                    v-debounce=\"500\"\n                >\n\n                <div\n                    class=\"absolute top-10 z-10 w-full rounded-lg border bg-white shadow-[0px_0px_0px_0px_rgba(0,0,0,0.10),0px_1px_3px_0px_rgba(0,0,0,0.10),0px_5px_5px_0px_rgba(0,0,0,0.09),0px_12px_7px_0px_rgba(0,0,0,0.05),0px_22px_9px_0px_rgba(0,0,0,0.01),0px_34px_9px_0px_rgba(0,0,0,0.00)] dark:border-gray-800 dark:bg-gray-900\"\n                    v-if=\"isDropdownOpen\"\n                >\n                    <template v-if=\"isLoading\">\n                        <div class=\"shimmer flex h-[42px] w-full rounded-md\"></div>\n                    </template>\n\n                    <template v-else>\n                        <div class=\"grid max-h-[400px] overflow-y-auto\">\n                            <a\n                                :href=\"category.url\"\n                                class=\"cursor-pointer border-b p-4 text-sm font-semibold text-gray-600 last:border-b-0 hover:bg-gray-100 dark:border-gray-800 dark:text-gray-300 dark:hover:bg-gray-950\"\n                                v-for=\"category in searchedResults.data\"\n                            >\n                                @{{ category.title }}\n                            </a>\n\n                            <div\n                                class=\"p-4 text-sm font-semibold text-gray-600 dark:text-gray-300\"\n                                v-if=\"searchedResults.data.length === 0\"\n                            >\n                                @lang('No results found.')\n                            </div>\n                        </div>\n                    </template>\n                </div>\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-configuration-search', {\n                template: '#v-configuration-search-template',\n                \n                data() {\n                    return {\n                        isDropdownOpen: false,\n\n                        isLoading: false,\n\n                        searchTerm: '',\n\n                        searchedResults: [],\n                    };\n                },\n\n                watch: {\n                    searchTerm(newVal, oldVal) {\n                        this.search();\n                    },\n                },\n\n                created() {\n                    window.addEventListener('click', this.handleFocusOut);\n                },\n\n                beforeDestroy() {\n                    window.removeEventListener('click', this.handleFocusOut);\n                },\n\n                methods: {\n                    search() {\n                        if (this.searchTerm.length <= 1) {\n                            this.searchedResults = [];\n\n                            this.isDropdownOpen = false;\n\n                            return;\n                        }\n\n                        this.isDropdownOpen = true;\n\n                        this.isLoading = true;\n                        \n                        this.$axios.get(\"{{ route('admin.configuration.search') }}\", {\n                                params: {query: this.searchTerm}\n                            })\n                            .then((response) => {\n                                this.searchedResults = response.data;\n\n                                this.isLoading = false;\n                            })\n                            .catch((error) => {});\n                    },\n\n                    handleFocusOut(e) {\n                        if (! this.$el.contains(e.target)) {\n                            this.isDropdownOpen = false;\n                        }\n                    },\n                },\n            });\n        </script>\n    @endpushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/contacts/organizations/create.blade.php",
    "content": "\n<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.contacts.organizations.create.title')\n    </x-slot>\n\n    {!! view_render_event('admin.organizations.create.form.before') !!}\n\n    <x-admin::form\n        :action=\"route('admin.contacts.organizations.store')\"\n        method=\"POST\"\n    >\n    \n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.organizations.create.breadcrumbs.before') !!}\n\n                    <!-- Breadcrumbs -->\n                    <x-admin::breadcrumbs name=\"contacts.organizations.create\" />\n\n                    {!! view_render_event('admin.organizations.create.breadcrumbs.before') !!}\n\n                    <div class=\"text-xl font-bold dark:text-gray-300\">\n                        @lang('admin::app.contacts.organizations.create.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.organizations.create.save_buttons.before') !!}\n\n                        <!-- Create button for person -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.contacts.organizations.create.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.organizations.create.save_buttons.before') !!}\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                {!! view_render_event('admin.contacts.organizations.create.form_controls.before') !!}\n\n                <x-admin::attributes\n                    :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                        'entity_type' => 'organizations',\n                    ])\"\n                    :custom-validations=\"[\n                        'name' => [\n                            'max:100',\n                        ],\n                        'address' => [\n                            'max:100',\n                        ],\n                        'postcode' => [\n                            'postcode',\n                        ],\n                    ]\"\n                />\n\n                {!! view_render_event('admin.contacts.organizations.edit.form_controls.after') !!}\n            </div>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.organizations.create.form.after') !!}\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/contacts/organizations/edit.blade.php",
    "content": "\n<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.contacts.organizations.edit.title')\n    </x-slot>\n\n    {!! view_render_event('admin.organizations.edit.form.before') !!}\n\n    <x-admin::form\n        :action=\"route('admin.contacts.organizations.update', $organization->id)\"\n        method=\"PUT\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.organizations.edit.breadcrumbs.before', ['organization' => $organization]) !!}\n\n                    <x-admin::breadcrumbs \n                        name=\"contacts.organizations.edit\" \n                        :entity=\"$organization\"\n                    />\n\n                    {!! view_render_event('admin.organizations.edit.breadcrumbs.before', ['organization' => $organization]) !!}\n\n                    <div class=\"text-xl font-bold dark:text-gray-300\">\n                        @lang('admin::app.contacts.organizations.edit.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.organizations.edit.save_button.before', ['organization' => $organization]) !!}\n\n                        <!-- Save button for person -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.contacts.organizations.edit.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.organizations.edit.save_button.after', ['organization' => $organization]) !!}\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                {!! view_render_event('admin.contacts.organizations.edit.form_controls.before') !!}\n\n                <x-admin::attributes\n                    :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                        'entity_type' => 'organizations',\n                    ])\"\n                    :custom-validations=\"[\n                        'name' => [\n                            'max:100',\n                        ],\n                        'address' => [\n                            'max:100',\n                        ],\n                        'postcode' => [\n                            'postcode',\n                        ],\n                    ]\"\n                    :entity=\"$organization\"\n                />\n                \n                {!! view_render_event('admin.contacts.organizations.edit.form_controls.after') !!}\n            </div>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.organizations.edit.form.after') !!}\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/contacts/organizations/index.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.contacts.organizations.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.organizations.index.breadcrumbs.before') !!}\n\n                <!-- Breadcrumbs -->\n                <x-admin::breadcrumbs name=\"contacts.organizations\" />\n\n                {!! view_render_event('admin.organizations.index.breadcrumbs.before') !!}\n                \n                <div class=\"text-xl font-bold dark:text-gray-300\">\n                    @lang('admin::app.contacts.organizations.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.organizations.index.create_button.before') !!}\n\n                    @if (bouncer()->hasPermission('contacts.organizations.create'))\n                        <!-- Create button for person -->\n                        <a\n                            href=\"{{ route('admin.contacts.organizations.create') }}\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.contacts.organizations.index.create-btn')\n                        </a>\n                    @endif\n\n                    {!! view_render_event('admin.organizations.index.create_button.after') !!}\n                </div>\n            </div>\n        </div>\n\n        {!! view_render_event('admin.organizations.datagrid.index.before') !!}\n\n        <x-admin::datagrid :src=\"route('admin.contacts.organizations.index')\" >\n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </x-admin::datagrid>\n\n        {!! view_render_event('admin.organizations.datagrid.index.after') !!}\n    </div>\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/contacts/persons/create.blade.php",
    "content": "<x-admin::layouts>\n    <!--Page title -->\n    <x-slot:title>\n        @lang('admin::app.contacts.persons.create.title')\n    </x-slot>\n\n    {!! view_render_event('admin.persons.create.form.before') !!}\n\n    <!--Create Page Form -->\n    <x-admin::form\n        :action=\"route('admin.contacts.persons.store')\"\n        enctype=\"multipart/form-data\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <!-- Header -->\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.persons.create.breadcrumbs.before') !!}\n\n                    <!-- Breadcrumb -->\n                    <x-admin::breadcrumbs name=\"contacts.persons.create\" />\n\n                    {!! view_render_event('admin.persons.create.breadcrumbs.after') !!}\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.contacts.persons.create.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.persons.create.create_button.before') !!}\n\n                        <!-- Create button for Person -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.contacts.persons.create.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.persons.create.create_button.after') !!}\n                    </div>\n                </div>\n            </div>\n\n            <!-- Form fields -->\n            <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                {!! view_render_event('admin.persons.create.form_controls.before') !!}\n\n                <x-admin::attributes\n                    :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                        ['code', 'NOTIN', ['organization_id']],\n                        'entity_type' => 'persons',\n                    ])\"\n                    :custom-validations=\"[\n                        'name' => [\n                            'min:2',\n                            'max:100',\n                        ],\n                        'job_title' => [\n                            'max:100',\n                        ],\n                    ]\"\n                />\n\n                <v-organization></v-organization>\n\n                {!! view_render_event('admin.persons.create.form_controls.after') !!}\n            </div>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.persons.create.form.after') !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-organization-template\"\n        >\n            <div>\n                <x-admin::attributes\n                    :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                        ['code', 'IN', ['organization_id']],\n                        'entity_type' => 'persons',\n                    ])\"\n                />\n\n                <template v-if=\"organizationName\">\n                    <x-admin::form.control-group.control\n                        type=\"hidden\"\n                        name=\"organization_name\"\n                        v-model=\"organizationName\"\n                    />\n                </template>\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-organization', {\n                template: '#v-organization-template',\n\n                data() {\n                    return {\n                        organizationName: null,\n                    };\n                },\n\n                methods: {\n                    handleLookupAdded(event) {\n                        this.organizationName = event?.name || null;\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/contacts/persons/edit.blade.php",
    "content": "\n<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.contacts.persons.edit.title')\n    </x-slot>\n\n    {!! view_render_event('admin.persons.edit.form.before') !!}\n\n    <x-admin::form\n        :action=\"route('admin.contacts.persons.update', $person->id)\"\n        method=\"PUT\"\n        enctype=\"multipart/form-data\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.persons.edit.breadcrumbs.before') !!}\n\n                    <x-admin::breadcrumbs\n                        name=\"contacts.persons.edit\"\n                        :entity=\"$person\"\n                    />\n\n                    {!! view_render_event('admin.persons.edit.breadcrumbs.after') !!}\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.contacts.persons.edit.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <!--  Save button for Person -->\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.persons.edit.save_button.before') !!}\n\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.contacts.persons.edit.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.persons.edit.save_button.after') !!}\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                {!! view_render_event('admin.contacts.persons.edit.form_controls.before') !!}\n\n                <x-admin::attributes\n                    :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                        ['code', 'NOTIN', ['organization_id']],\n                        'entity_type' => 'persons',\n                    ])\"\n                    :custom-validations=\"[\n                        'name' => [\n                            'min:2',\n                            'max:100',\n                        ],\n                        'job_title' => [\n                            'max:100',\n                        ],\n                    ]\"\n                    :entity=\"$person\"\n                />\n\n                <v-organization></v-organization>\n\n                {!! view_render_event('admin.contacts.persons.edit.form_controls.after') !!}\n            </div>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.persons.edit.form.after') !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-organization-template\"\n        >\n            <div>\n                <x-admin::attributes\n                    :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                        ['code', 'IN', ['organization_id']],\n                        'entity_type' => 'persons',\n                    ])\"\n                    :entity=\"$person\"\n                />\n\n                <template v-if=\"organizationName\">\n                    <x-admin::form.control-group.control\n                        type=\"hidden\"\n                        name=\"organization_name\"\n                        v-model=\"organizationName\"\n                    />\n                </template>\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-organization', {\n                template: '#v-organization-template',\n\n                data() {\n                    return {\n                        organizationName: null,\n                    };\n                },\n\n                methods: {\n                    handleLookupAdded(event) {\n                        this.organizationName = event?.name || null;\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/contacts/persons/index.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.contacts.persons.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                <x-admin::breadcrumbs name=\"contacts.persons\" />\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    @lang('admin::app.contacts.persons.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <!-- Export Modal -->\n                <x-admin::datagrid.export :src=\"route('admin.contacts.persons.index')\" />\n\n                <!-- Create button for person -->\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.persons.index.create_button.before') !!}\n\n                    @if (bouncer()->hasPermission('contacts.persons.create'))\n                        <a\n                            href=\"{{ route('admin.contacts.persons.create') }}\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.contacts.persons.index.create-btn')\n                        </a>\n                    @endif\n\n                    {!! view_render_event('admin.persons.index.create_button.after') !!}\n                </div>\n            </div>\n        </div>\n\n        {!! view_render_event('admin.persons.index.datagrid.before') !!}\n\n        <v-persons>\n            <!-- Datagrid shimmer -->\n            <x-admin::shimmer.datagrid :is-multi-row=\"true\"/>\n        </v-persons>\n\n        {!! view_render_event('admin.persons.index.datagrid.after') !!}\n    </div>\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-persons-template\"\n        >\n            <x-admin::datagrid\n                src=\"{{ route('admin.contacts.persons.index') }}\"\n                :isMultiRow=\"true\"\n                ref=\"datagrid\"\n            >\n                <template #header=\"{\n                    isLoading,\n                    available,\n                    applied,\n                    selectAll,\n                    sort,\n                    performAction\n                }\">\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.datagrid.table.head :isMultiRow=\"true\" />\n                    </template>\n\n                    <template v-else>\n                        <div class=\"row grid grid-cols-[.1fr_.2fr_.2fr_.2fr_.2fr_.2fr] grid-rows-1 items-center border-b px-4 py-2.5 dark:border-gray-800 max-lg:hidden\">\n                            <div\n                                class=\"flex select-none items-center gap-2.5\"\n                                v-for=\"(columnGroup, index) in [['id'], ['person_name'], ['emails'], ['contact_numbers'], ['organization']]\"\n                            >\n                                <label\n                                    class=\"flex w-max cursor-pointer select-none items-center gap-1\"\n                                    for=\"mass_action_select_all_records\"\n                                    v-if=\"! index\"\n                                >\n                                    <input\n                                        type=\"checkbox\"\n                                        name=\"mass_action_select_all_records\"\n                                        id=\"mass_action_select_all_records\"\n                                        class=\"peer hidden\"\n                                        :checked=\"['all', 'partial'].includes(applied.massActions.meta.mode)\"\n                                        @change=\"selectAll\"\n                                    >\n\n                                    <span\n                                        class=\"icon-checkbox-outline cursor-pointer rounded-md text-2xl text-gray-600 dark:text-gray-300\"\n                                        :class=\"[\n                                            applied.massActions.meta.mode === 'all' ? 'peer-checked:icon-checkbox-select peer-checked:text-brandColor' : (\n                                                applied.massActions.meta.mode === 'partial' ? 'peer-checked:icon-checkbox-multiple peer-checked:text-brandColor' : ''\n                                            ),\n                                        ]\"\n                                    >\n                                    </span>\n                                </label>\n\n                                <p class=\"text-gray-600 dark:text-gray-300\">\n                                    <span class=\"[&>*]:after:content-['_/_']\">\n                                        <template v-for=\"column in columnGroup\">\n                                            <span\n                                                class=\"after:content-['/'] last:after:content-['']\"\n                                                :class=\"{\n                                                    'font-medium text-gray-800 dark:text-white': applied.sort.column == column,\n                                                    'cursor-pointer hover:text-gray-800 dark:hover:text-white': available.columns.find(columnTemp => columnTemp.index === column)?.sortable,\n                                                }\"\n                                                @click=\"\n                                                    available.columns.find(columnTemp => columnTemp.index === column)?.sortable ? sort(available.columns.find(columnTemp => columnTemp.index === column)): {}\n                                                \"\n                                            >\n                                                @{{ available.columns.find(columnTemp => columnTemp.index === column)?.label }}\n                                            </span>\n                                        </template>\n                                    </span>\n\n                                    <i\n                                        class=\"align-text-bottom text-base text-gray-800 dark:text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                        :class=\"[applied.sort.order === 'asc' ? 'icon-stats-down': 'icon-stats-up']\"\n                                        v-if=\"columnGroup.includes(applied.sort.column)\"\n                                    ></i>\n                                </p>\n                            </div>\n                        </div>\n\n                        <!-- Mobile Sort/Filter Header -->\n                        <div class=\"hidden border-b bg-gray-50 px-4 py-3 text-black dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 max-lg:block\">\n                            <div class=\"flex items-center justify-between\">\n                                <!-- Mass Actions for Mobile -->\n                                <div v-if=\"available.massActions.length\">\n                                    <label\n                                        class=\"flex w-max cursor-pointer select-none items-center gap-1\"\n                                        for=\"mass_action_select_all_records\"\n                                    >\n                                        <input\n                                            type=\"checkbox\"\n                                            name=\"mass_action_select_all_records\"\n                                            id=\"mass_action_select_all_records\"\n                                            class=\"peer hidden\"\n                                            :checked=\"['all', 'partial'].includes(applied.massActions.meta.mode)\"\n                                            @change=\"selectAll\"\n                                        >\n\n                                        <span\n                                            class=\"icon-checkbox-outline cursor-pointer rounded-md text-2xl text-gray-600 dark:text-gray-300\"\n                                            :class=\"[\n                                                applied.massActions.meta.mode === 'all' ? 'peer-checked:icon-checkbox-select peer-checked:text-brandColor' : (\n                                                    applied.massActions.meta.mode === 'partial' ? 'peer-checked:icon-checkbox-multiple peer-checked:text-brandColor' : ''\n                                                ),\n                                            ]\"\n                                        >\n                                        </span>\n                                    </label>\n                                </div>\n                                \n                                <!-- Mobile Sort Dropdown -->\n                                <div v-if=\"available.columns.some(column => column.sortable)\">\n                                    <x-admin::dropdown position=\"bottom-{{ in_array(app()->getLocale(), ['fa', 'ar']) ? 'left' : 'right' }}\">\n                                        <x-slot:toggle>\n                                            <div class=\"flex items-center gap-1\">\n                                                <button\n                                                    type=\"button\"\n                                                    class=\"inline-flex w-full max-w-max cursor-pointer appearance-none items-center justify-between gap-x-2 rounded-md border bg-white px-2.5 py-1.5 text-center leading-6 text-gray-600 transition-all marker:shadow hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                                >\n                                                    <span>\n                                                        Sort\n                                                    </span>\n                    \n                                                    <span class=\"icon-down-arrow text-2xl\"></span>\n                                                </button>\n                                            </div>\n                                        </x-slot>\n                \n                                        <x-slot:menu>\n                                            <x-admin::dropdown.menu.item\n                                                v-for=\"column in available.columns.filter(column => column.sortable && column.visibility)\"\n                                                @click=\"sort(column)\"\n                                            >\n                                                <div class=\"flex items-center gap-2\">\n                                                    <span v-html=\"column.label\"></span>\n                                                    <i\n                                                        class=\"align-text-bottom text-base text-gray-600 dark:text-gray-300\"\n                                                        :class=\"[applied.sort.order === 'asc' ? 'icon-stats-down': 'icon-stats-up']\"\n                                                        v-if=\"column.index == applied.sort.column\"\n                                                    ></i>\n                                                </div>\n                                            </x-admin::dropdown.menu.item>\n                                        </x-slot>\n                                    </x-admin::dropdown>\n                                </div>\n                            </div>\n                        </div>\n                    </template>\n                </template>\n\n                <template #body=\"{\n                    isLoading,\n                    available,\n                    applied,\n                    selectAll,\n                    sort,\n                    performAction\n                }\">\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.datagrid.table.body :isMultiRow=\"true\" />\n                    </template>\n\n                    <template v-else>\n                        <div\n                            class=\"row grid grid-cols-[.1fr_.2fr_.2fr_.2fr_.2fr_.2fr] grid-rows-1 border-b px-4 py-2.5 transition-all hover:bg-gray-50 dark:border-gray-800 dark:hover:bg-gray-950 max-lg:hidden\"\n                            v-for=\"record in available.records\"\n                        >\n                            <!-- Mass Action and Person ID. -->\n                            <div class=\"flex items-center gap-2.5\">\n                                <input\n                                    type=\"checkbox\"\n                                    :name=\"`mass_action_select_record_${record.id}`\"\n                                    :id=\"`mass_action_select_record_${record.id}`\"\n                                    :value=\"record.id\"\n                                    class=\"peer hidden\"\n                                    v-model=\"applied.massActions.indices\"\n                                >\n\n                                <label\n                                    class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-600 peer-checked:text-brandColor dark:text-gray-300\"\n                                    :for=\"`mass_action_select_record_${record.id}`\"\n                                ></label>\n\n                                <div class=\"flex flex-col gap-1.5 dark:text-gray-300\">\n                                    @{{ record.id }}\n                                </div>\n                            </div>\n\n                            <!-- Name -->\n                            <div class=\"flex items-center gap-1.5 dark:text-gray-300\">\n                                <x-admin::avatar ::name=\"record.person_name\" />\n\n                                @{{ record.person_name }}\n                            </div>\n\n                            <!-- Emails -->\n                            <p class=\"flex items-center dark:text-gray-300\">\n                                @{{ record.emails }}\n                            </p>\n\n                            <!-- Contact Numbers -->\n                            <p class=\"flex items-center dark:text-gray-300\">\n                                @{{ record.contact_numbers }}\n                            </p>\n\n                            <!-- Organization -->\n                            <p class=\"flex items-center dark:text-gray-300\">\n                                @{{ record.organization }}\n                            </p>\n\n                            <!-- Actions -->\n                            <div class=\"flex items-center justify-end gap-x-4\">\n                                <div class=\"flex items-center gap-1.5\">\n                                    <p\n                                        class=\"place-self-end\"\n                                        v-if=\"available.actions.length\"\n                                    >\n                                        <span\n                                            class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                            :class=\"action.icon\"\n                                            v-text=\"! action.icon ? action.title : ''\"\n                                            v-for=\"action in record.actions\"\n                                            @click=\"performAction(action)\"\n                                        ></span>\n                                    </p>\n                                </div>\n                            </div>\n                        </div>\n\n                        <!-- Mobile Card View -->\n                        <div\n                            class=\"hidden border-b px-4 py-4 text-black dark:border-gray-800 dark:text-gray-300 max-lg:block\"\n                            v-for=\"record in available.records\"\n                        >\n                            <div class=\"mb-2 flex items-center justify-between\">\n                                <!-- Mass Actions for Mobile Cards -->\n                                <div class=\"flex w-full items-center justify-between gap-2\">\n                                    <p v-if=\"available.massActions.length\">\n                                        <label :for=\"`mass_action_select_record_${record[available.meta.primary_column]}`\">\n                                            <input\n                                                type=\"checkbox\"\n                                                :name=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                :value=\"record[available.meta.primary_column]\"\n                                                :id=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                class=\"peer hidden\"\n                                                v-model=\"applied.massActions.indices\"\n                                            >\n    \n                                            <span class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-500 peer-checked:text-brandColor\">\n                                            </span>\n                                        </label>\n                                    </p>\n\n                                    <!-- Actions for Mobile -->\n                                    <div\n                                        class=\"flex w-full items-center justify-end\"\n                                        v-if=\"available.actions.length\"\n                                    >\n                                        <span\n                                            class=\"dark:hover:bg-gray-80 cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200\"\n                                            :class=\"action.icon\"\n                                            v-text=\"! action.icon ? action.title : ''\"\n                                            v-for=\"action in record.actions\"\n                                            @click=\"performAction(action)\"\n                                        >\n                                        </span>\n                                    </div>\n                                </div>\n                            </div>\n\n                            <!-- Card Content -->\n                            <div class=\"grid gap-2\">\n                                <template v-for=\"column in available.columns\">\n                                    <div class=\"flex flex-wrap items-baseline gap-x-2\">\n                                        <span class=\"text-slate-600 dark:text-gray-300\" v-html=\"column.label + ':'\"></span>\n                                        <span class=\"break-words font-medium text-slate-900 dark:text-white\" v-html=\"record[column.index]\"></span>\n                                    </div>\n                                </template>\n                            </div>\n                        </div>\n                    </template>\n                </template>\n            </x-admin::datagrid>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-persons', {\n                template: '#v-persons-template',\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/contacts/persons/view/attributes.blade.php",
    "content": "{!! view_render_event('admin.contacts.persons.view.attributes.before', ['person' => $person]) !!}\n\n<div class=\"flex w-full flex-col gap-4 border-b border-gray-200 p-4 dark:border-gray-800\">\n    <x-admin::accordion class=\"select-none !border-none\">\n        <x-slot:header class=\"!p-0\">\n            <h4 class=\"font-semibold dark:text-white\">\n                @lang('admin::app.contacts.persons.view.about-person')\n            </h4>\n        </x-slot>\n\n        <x-slot:content class=\"mt-4 !px-0 !pb-0\">\n            {!! view_render_event('admin.contacts.persons.view.attributes.form_controls.before', ['person' => $person]) !!}\n\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modalForm\"\n            >\n                <form @submit=\"handleSubmit($event, () => {})\">\n                    {!! view_render_event('admin.contacts.persons.view.attributes.form_controls.attributes_view.before', ['person' => $person]) !!}\n        \n                    <x-admin::attributes.view\n                        :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                            'entity_type' => 'persons',\n                            ['code', 'NOTIN', ['name']]\n                        ])\"\n                        :entity=\"$person\"\n                        :url=\"route('admin.contacts.persons.update', $person->id)\"\n                        :allow-edit=\"true\"\n                    />\n        \n                    {!! view_render_event('admin.contacts.persons.view.attributes.form_controls.attributes_view.after', ['person' => $person]) !!}\n                </form>\n            </x-admin::form>\n        \n            {!! view_render_event('admin.contacts.persons.view.attributes.form_controls.after', ['person' => $person]) !!}\n        </x-slot>\n    </x-admin::accordion>\n</div>\n\n{!! view_render_event('admin.contacts.persons.view.attributes.before', ['person' => $person]) !!}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/contacts/persons/view/organization.blade.php",
    "content": "{!! view_render_event('admin.contacts.persons.view.organization.before', ['person' => $person]) !!}\n\n@if ($person?->organization)\n    <div class=\"flex w-full flex-col gap-4 border-b border-gray-200 p-4 dark:border-gray-800\">\n        <h4 class=\"flex items-center justify-between font-semibold dark:text-white\">\n            @lang('admin::app.contacts.persons.view.about-organization')\n\n            <a\n                href=\"{{ route('admin.contacts.organizations.edit', $person->organization->id) }}\"\n                class=\"icon-edit rounded-md p-1 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                target=\"_blank\"\n            ></a>\n        </h4>\n\n        <div class=\"flex gap-2\">\n            {!! view_render_event('admin.contacts.persons.view.organization.avatar.before', ['person' => $person]) !!}\n\n            <!-- Organization Initials -->\n            <x-admin::avatar :name=\"$person->organization->name\" />\n\n            {!! view_render_event('admin.contacts.persons.view.organization.avatar.after', ['person' => $person]) !!}\n\n            <!-- Organization Details -->\n            <div class=\"flex flex-col gap-1\">\n                {!! view_render_event('admin.contacts.persons.view.organization.name.before', ['person' => $person]) !!}\n\n                <span class=\"font-semibold text-brandColor\">\n                    {{ $person->organization->name }}\n                </span>\n\n                {!! view_render_event('admin.contacts.persons.view.organization.name.after', ['person' => $person]) !!}\n\n\n                {!! view_render_event('admin.contacts.persons.view.organization.address.before', ['person' => $person]) !!}\n\n                @if ($person->organization->address)\n                    <div class=\"flex flex-col gap-0.5 dark:text-white\">\n                        @isset($person->organization->address['address'])\n                            <span>\n                                {{ $person->organization->address['address'] }}\n                            </span>\n                        @endisset\n\n                        @if(\n                            isset($person->organization->address['postcode'])\n                            && isset($person->organization->address['city'])\n                        )\n                            <span>\n                                {{ $person->organization->address['postcode'] . '  ' . $person->organization->address['city'] }}\n                            </span>\n                        @endif\n\n                        @isset($person->organization->address['state'])\n                            <span>\n                                {{ core()->state_name($person->organization->address['state']) }}\n                            </span>\n                        @endisset\n\n                        @isset($person->organization->address['country'])\n                            <span>\n                                {{ core()->country_name($person->organization->address['country']) }}\n                            </span>\n                        @endisset\n                    </div>\n                @endif\n\n                {!! view_render_event('admin.contacts.persons.view.organization.address.after', ['person' => $person]) !!}\n            </div>\n        </div>\n    </div>\n@endif\n\n{!! view_render_event('admin.contacts.persons.view.organization.after', ['person' => $person]) !!}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/contacts/persons/view.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.contacts.persons.view.title', ['name' => strip_tags($person->name)])\n    </x-slot>\n\n    <!-- Content -->\n    <div class=\"flex gap-4 max-lg:flex-wrap\">\n        <!-- Left Panel -->\n        {!! view_render_event('admin.contact.persons.view.left.before', ['person' => $person]) !!}\n\n        <div class=\"max-lg:min-w-full max-lg:max-w-full [&>div:last-child]:border-b-0 lg:sticky lg:top-[73px] flex min-w-[394px] max-w-[394px] flex-col self-start rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n            <!-- Person Information -->\n            <div class=\"flex w-full flex-col gap-2 border-b border-gray-200 p-4 dark:border-gray-800\">\n                <!-- Breadcrumbs -->\n                <div class=\"flex items-center justify-between\">\n                    <x-admin::breadcrumbs\n                        name=\"contacts.persons.view\"\n                        :entity=\"$person\"\n                    />\n                </div>\n\n                {!! view_render_event('admin.contact.persons.view.tags.before', ['person' => $person]) !!}\n\n                <!-- Tags -->\n                <x-admin::tags\n                    :attach-endpoint=\"route('admin.contacts.persons.tags.attach', $person->id)\"\n                    :detach-endpoint=\"route('admin.contacts.persons.tags.detach', $person->id)\"\n                    :added-tags=\"$person->tags\"\n                />\n\n                {!! view_render_event('admin.contact.persons.view.tags.after', ['person' => $person]) !!}\n\n                \n                <!-- Title -->\n                <div class=\"mb-4 flex flex-col gap-0.5\">\n                    {!! view_render_event('admin.contact.persons.view.title.before', ['person' => $person]) !!}\n\n                    <h3 class=\"text-lg font-bold dark:text-white\">\n                        {{ $person->name }}\n                    </h3>\n\n                    <p class=\"dark:text-white\">\n                        {{ $person->job_title }}\n                    </p>\n\n                    {!! view_render_event('admin.contact.persons.view.title.after', ['person' => $person]) !!}\n                </div>\n                \n                <!-- Activity Actions -->\n                <div class=\"flex flex-wrap gap-2\">\n                    {!! view_render_event('admin.contact.persons.view.actions.before', ['person' => $person]) !!}\n\n                    <!-- Mail Activity Action -->\n                    <x-admin::activities.actions.mail\n                        :entity=\"$person\"\n                        entity-control-name=\"person_id\"\n                    />\n\n                    <!-- File Activity Action -->\n                    <x-admin::activities.actions.file\n                        :entity=\"$person\"\n                        entity-control-name=\"person_id\"\n                    />\n\n                    <!-- Note Activity Action -->\n                    <x-admin::activities.actions.note\n                        :entity=\"$person\"\n                        entity-control-name=\"person_id\"\n                    />\n\n                    <!-- Activity Action -->\n                    <x-admin::activities.actions.activity\n                        :entity=\"$person\"\n                        entity-control-name=\"person_id\"\n                    />\n\n                    {!! view_render_event('admin.contact.persons.view.actions.after', ['person' => $person]) !!}\n                </div>\n            </div>\n\n            <!-- Person Attributes -->\n            @include ('admin::contacts.persons.view.attributes')\n\n            <!-- Contact Organization -->\n            @include ('admin::contacts.persons.view.organization')\n        </div>\n\n        {!! view_render_event('admin.contact.persons.view.left.after', ['person' => $person]) !!}\n\n        <!-- Right Panel -->\n        <div class=\"flex w-full flex-col gap-4 rounded-lg\">\n            {!! view_render_event('admin.contact.persons.view.right.before', ['person' => $person]) !!}\n\n            <!-- Stages Navigation -->\n            <x-admin::activities :endpoint=\"route('admin.contacts.persons.activities.index', $person->id)\" />\n\n            {!! view_render_event('admin.contact.persons.view.right.after', ['person' => $person]) !!}\n        </div>\n    </div>\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/dashboard/index/open-leads-by-states.blade.php",
    "content": "{!! view_render_event('admin.dashboard.index.open_leads_by_states.before') !!}\n\n<!-- Total Leads Vue Component -->\n<v-dashboard-open-leads-by-states>\n    <!-- Shimmer -->\n    <x-admin::shimmer.dashboard.index.open-leads-by-states />\n</v-dashboard-open-leads-by-states>\n\n{!! view_render_event('admin.dashboard.index.open_leads_by_states.after') !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-dashboard-open-leads--by-states-template\"\n    >\n        <!-- Shimmer -->\n        <template v-if=\"isLoading\">\n            <x-admin::shimmer.dashboard.index.open-leads-by-states />\n        </template>\n\n        <!-- Total Sales Section -->\n        <template v-else>\n            <div class=\"grid gap-4 rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                <div class=\"flex flex-col justify-between gap-1\">\n                    <p class=\"text-base font-semibold dark:text-gray-300\">\n                        @lang('admin::app.dashboard.index.open-leads-by-states.title')\n                    </p>\n                </div>\n\n                <!-- Doughnut Chart -->\n                <div\n                    class=\"relative flex w-full max-w-full flex-col gap-4\"\n                    v-if=\"report.statistics.length\"\n                >\n                    <canvas\n                        :id=\"$.uid + '_chart'\"\n                        class=\"w-full max-w-full items-end px-12\"\n                        :style=\"{ height: report.statistics.length * 60 + 'px' }\"\n                    ></canvas>\n\n                    <ul class=\"absolute flex w-full flex-col\">\n                        <li\n                            class=\"flex w-full flex-col border-b border-gray-200 pb-[9px] pt-2.5 last:border-none dark:border-gray-800\"\n                            v-for=\"(stat, index) in report.statistics\"\n                        >\n                            <span class=\"text-sm font-semibold dark:text-gray-100\">\n                                @{{ stat.total }}\n                            </span>\n\n                            <span class=\"text-sm font-semibold dark:text-gray-100\">\n                                @{{ stat.name }}\n                            </span>\n                        </li>\n                    </ul>\n                </div>\n\n                <!-- Empty Product Design -->\n                <div\n                    class=\"flex flex-col gap-8 p-4\"\n                    v-else\n                >\n                    <div class=\"grid justify-center justify-items-center gap-3.5 py-2.5\">\n                        <!-- Placeholder Image -->\n                        <img\n                            src=\"{{ vite()->asset('images/empty-placeholders/default.svg') }}\"\n                            class=\"dark:mix-blend-exclusion dark:invert\"\n                        >\n\n                        <!-- Add Variants Information -->\n                        <div class=\"flex flex-col items-center\">\n                            <p class=\"text-base font-semibold text-gray-400\">\n                                @lang('admin::app.dashboard.index.open-leads-by-states.empty-title')\n                            </p>\n\n                            <p class=\"text-gray-400\">\n                                @lang('admin::app.dashboard.index.open-leads-by-states.empty-info')\n                            </p>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </template>\n    </script>\n\n\n    <script type=\"module\">\n        app.component('v-dashboard-open-leads-by-states', {\n            template: '#v-dashboard-open-leads--by-states-template',\n\n            data() {\n                return {\n                    report: [],\n\n                    isLoading: true,\n\n                    chart: undefined,\n                }\n            },\n\n            mounted() {\n                this.getStats({});\n\n                this.$emitter.on('reporting-filter-updated', this.getStats);\n            },\n\n            methods: {\n                getStats(filtets) {\n                    this.isLoading = true;\n\n                    var filtets = Object.assign({}, filtets);\n\n                    filtets.type = 'open-leads-by-states';\n\n                    this.$axios.get(\"{{ route('admin.dashboard.stats') }}\", {\n                            params: filtets\n                        })\n                        .then(response => {\n                            this.report = response.data;\n\n                            this.isLoading = false;\n\n                            setTimeout(() => {\n                                this.prepare();\n                            }, 0);\n                        })\n                        .catch(error => {});\n                },\n\n                prepare() {\n                    if (this.chart) {\n                        this.chart.destroy();\n                    }\n\n                    if (this.report.statistics.length === 0) {\n                        return;\n                    }\n\n                    const ctx = document.getElementById(this.$.uid + '_chart')?.getContext('2d');\n\n                    // Create gradient\n                    const gradient = ctx.createLinearGradient(0, 0, 0, 400);\n                    gradient.addColorStop(0, 'rgba(144, 247, 236, 0.8)');\n                    gradient.addColorStop(1, 'rgba(50, 204, 188, 1)');\n\n                    this.chart = new Chart(ctx, {\n                        type: 'funnel',\n\n                        data: {\n                            labels: this.report.statistics.map(stat => stat.name),\n                            datasets: [\n                                {\n                                    data: this.report.statistics.map(stat => stat.total),\n                                    backgroundColor: gradient,\n                                    borderColor: 'rgba(0, 0, 0, 0)',\n                                    borderWidth: 0,\n                                },\n                            ],\n                        },\n\n                        options: {\n                            indexAxis: 'y',\n                        },\n                    });\n                }\n            }\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/dashboard/index/over-all.blade.php",
    "content": "{!! view_render_event('admin.dashboard.index.over_all.before') !!}\n\n<!-- Over Details Vue Component -->\n<v-dashboard-over-all-stats>\n    <!-- Shimmer -->\n    <x-admin::shimmer.dashboard.index.over-all />\n</v-dashboard-over-all-stats>\n\n{!! view_render_event('admin.dashboard.index.over_all.after') !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-dashboard-over-all-stats-template\"\n    >\n        <!-- Shimmer -->\n        <template v-if=\"isLoading\">\n            <x-admin::shimmer.dashboard.index.over-all />\n        </template>\n\n        <!-- Total Sales Section -->\n        <template v-else>\n            <!-- Stats Cards -->\n            <div class=\"grid grid-cols-3 gap-4 max-md:grid-cols-2 max-sm:grid-cols-1\">\n                <!-- Average Revenue Card -->\n                <div class=\"flex flex-col gap-2 rounded-lg border border-gray-200 bg-white px-4 py-5 dark:border-gray-800 dark:bg-gray-900\">\n                    <p class=\"text-xs font-medium text-gray-600 dark:text-gray-300\">\n                        @lang('admin::app.dashboard.index.over-all.average-lead-value')\n                    </p>\n\n                    <div class=\"flex gap-2\">\n                        <p class=\"text-xl font-bold dark:text-gray-300\">\n                            @{{ report.statistics.average_lead_value.formatted_total }}\n                        </p>\n\n                        <div class=\"flex items-center gap-0.5\">\n                            <span\n                                class=\"text-base !font-semibold text-green-500\"\n                                :class=\"[report.statistics.average_lead_value.progress < 0 ? 'icon-stats-down text-red-500 dark:!text-red-500' : 'icon-stats-up text-green-500 dark:!text-green-500']\"\n                            ></span>\n\n                            <p\n                                class=\"text-xs font-semibold text-green-500\"\n                                :class=\"[report.statistics.average_lead_value.progress < 0 ?  'text-red-500' : 'text-green-500']\"\n                            >\n                                @{{ Math.abs(report.statistics.average_lead_value.progress.toFixed(2)) }}%\n                            </p>\n                        </div>\n                    </div>\n                </div>\n                \n                <!-- Average Revenue Card -->\n                <div class=\"flex flex-col gap-2 rounded-lg border border-gray-200 bg-white px-4 py-5 dark:border-gray-800 dark:bg-gray-900\">\n                    <p class=\"text-xs font-medium text-gray-600 dark:text-gray-300\">\n                        @lang('admin::app.dashboard.index.over-all.total-leads')\n                    </p>\n\n                    <div class=\"flex gap-2\">\n                        <p class=\"text-xl font-bold dark:text-gray-300\">\n                            @{{ report.statistics.total_leads.current }}\n                        </p>\n\n                        <div class=\"flex items-center gap-0.5\">\n                            <span\n                                class=\"text-base !font-semibold text-green-500\"\n                                :class=\"[report.statistics.total_leads.progress < 0 ? 'icon-stats-down text-red-500 dark:!text-red-500' : 'icon-stats-up text-green-500 dark:!text-green-500']\"\n                            ></span>\n\n                            <p\n                                class=\"text-xs font-semibold text-green-500\"\n                                :class=\"[report.statistics.total_leads.progress < 0 ?  'text-red-500' : 'text-green-500']\"\n                            >\n                                @{{ Math.abs(report.statistics.total_leads.progress.toFixed(2)) }}%\n                            </p>\n                        </div>\n                    </div>\n                </div>\n                \n                <!-- Average Lead Per Day -->\n                <div class=\"flex flex-col gap-2 rounded-lg border border-gray-200 bg-white px-4 py-5 dark:border-gray-800 dark:bg-gray-900\">\n                    <p class=\"text-xs font-medium text-gray-600 dark:text-gray-300\">\n                        @lang('admin::app.dashboard.index.over-all.average-leads-per-day')\n                    </p>\n\n                    <div class=\"flex gap-2\">\n                        <p class=\"text-xl font-bold dark:text-gray-300\">\n                            @{{ report.statistics.average_leads_per_day.current.toFixed(2) }}\n                        </p>\n\n                        <div class=\"flex items-center gap-0.5\">\n                            <span\n                                class=\"text-base !font-semibold text-green-500\"\n                                :class=\"[report.statistics.average_leads_per_day.progress < 0 ? 'icon-stats-down text-red-500 dark:!text-red-500' : 'icon-stats-up text-green-500 dark:!text-green-500']\"\n                            ></span>\n\n                            <p\n                                class=\"text-xs font-semibold text-green-500\"\n                                :class=\"[report.statistics.average_leads_per_day.progress < 0 ?  'text-red-500' : 'text-green-500']\"\n                            >\n                                @{{ Math.abs(report.statistics.average_leads_per_day.progress.toFixed(2)) }}%\n                            </p>\n                        </div>\n                    </div>\n                </div>\n                \n                <!-- Total Quotes -->\n                <div class=\"flex flex-col gap-2 rounded-lg border border-gray-200 bg-white px-4 py-5 dark:border-gray-800 dark:bg-gray-900\">\n                    <p class=\"text-xs font-medium text-gray-600 dark:text-gray-300\">\n                        @lang('admin::app.dashboard.index.over-all.total-quotations')\n                    </p>\n\n                    <div class=\"flex gap-2\">\n                        <p class=\"text-xl font-bold dark:text-gray-300\">\n                            @{{ report.statistics.total_quotations.current }}\n                        </p>\n\n                        <div class=\"flex items-center gap-0.5\">\n                            <span\n                                class=\"text-base !font-semibold text-green-500\"\n                                :class=\"[report.statistics.total_quotations.progress < 0 ? 'icon-stats-down text-red-500 dark:!text-red-500' : 'icon-stats-up text-green-500 dark:!text-green-500']\"\n                            ></span>\n\n                            <p\n                                class=\"text-xs font-semibold text-green-500\"\n                                :class=\"[report.statistics.total_quotations.progress < 0 ?  'text-red-500' : 'text-green-500']\"\n                            >\n                                @{{ Math.abs(report.statistics.total_quotations.progress.toFixed(2)) }}%\n                            </p>\n                        </div>\n                    </div>\n                </div>\n                \n                <!-- Total Persons -->\n                <div class=\"flex flex-col gap-2 rounded-lg border border-gray-200 bg-white px-4 py-5 dark:border-gray-800 dark:bg-gray-900\">\n                    <p class=\"text-xs font-medium text-gray-600 dark:text-gray-300\">\n                        @lang('admin::app.dashboard.index.over-all.total-persons')\n                    </p>\n\n                    <div class=\"flex gap-2\">\n                        <p class=\"text-xl font-bold dark:text-gray-300\">\n                            @{{ report.statistics.total_persons.current }}\n                        </p>\n\n                        <div class=\"flex items-center gap-0.5\">\n                            <span\n                                class=\"text-base !font-semibold text-green-500\"\n                                :class=\"[report.statistics.total_persons.progress < 0 ? 'icon-stats-down text-red-500 dark:!text-red-500' : 'icon-stats-up text-green-500 dark:!text-green-500']\"\n                            ></span>\n\n                            <p\n                                class=\"text-xs font-semibold text-green-500\"\n                                :class=\"[report.statistics.total_persons.progress < 0 ?  'text-red-500' : 'text-green-500']\"\n                            >\n                                @{{ Math.abs(report.statistics.total_persons.progress.toFixed(2)) }}%\n                            </p>\n                        </div>\n                    </div>\n                </div>\n                \n                <!-- Total Organizations -->\n                <div class=\"flex flex-col gap-2 rounded-lg border border-gray-200 bg-white px-4 py-5 dark:border-gray-800 dark:bg-gray-900\">\n                    <p class=\"text-xs font-medium text-gray-600 dark:text-gray-300\">\n                        @lang('admin::app.dashboard.index.over-all.total-organizations')\n                    </p>\n\n                    <div class=\"flex gap-2\">\n                        <p class=\"text-xl font-bold dark:text-gray-300\">\n                            @{{ report.statistics.total_organizations.current }}\n                        </p>\n\n                        <div class=\"flex items-center gap-0.5\">\n                            <span\n                                class=\"text-base !font-semibold text-green-500\"\n                                :class=\"[report.statistics.total_organizations.progress < 0 ? 'icon-stats-down text-red-500 dark:!text-red-500' : 'icon-stats-up text-green-500 dark:!text-green-500']\"\n                            ></span>\n\n                            <p\n                                class=\"text-xs font-semibold text-green-500\"\n                                :class=\"[report.statistics.total_organizations.progress < 0 ?  'text-red-500' : 'text-green-500']\"\n                            >\n                                @{{ Math.abs(report.statistics.total_organizations.progress.toFixed(2)) }}%\n                            </p>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </template>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-dashboard-over-all-stats', {\n            template: '#v-dashboard-over-all-stats-template',\n\n            data() {\n                return {\n                    report: [],\n\n                    isLoading: true,\n                    \n                    chart: undefined,\n                }\n            },\n\n            mounted() {\n                this.getStats({});\n\n                this.$emitter.on('reporting-filter-updated', this.getStats);\n            },\n\n            methods: {\n                getStats(filters) {\n                    this.isLoading = true;\n\n                    var filters = Object.assign({}, filters);\n\n                    filters.type = 'over-all';\n\n                    this.$axios.get(\"{{ route('admin.dashboard.stats') }}\", {\n                            params: filters\n                        })\n                        .then(response => {\n                            this.report = response.data;\n\n                            this.isLoading = false;\n                        })\n                        .catch(error => {});\n                },\n            }\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-sources.blade.php",
    "content": "{!! view_render_event('admin.dashboard.index.revenue_by_sources.before') !!}\n\n<!-- Total Leads Vue Component -->\n<v-dashboard-revenue-by-sources>\n    <!-- Shimmer -->\n    <x-admin::shimmer.dashboard.index.revenue-by-sources />\n</v-dashboard-revenue-by-sources>\n\n{!! view_render_event('admin.dashboard.index.revenue_by_sources.after') !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-dashboard-revenue-by-sources-template\"\n    >\n        <!-- Shimmer -->\n        <template v-if=\"isLoading\">\n            <x-admin::shimmer.dashboard.index.revenue-by-sources />\n        </template>\n\n        <!-- Total Sales Section -->\n        <template v-else>\n            <div class=\"grid gap-4 rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                <div class=\"flex flex-col justify-between gap-1\">\n                    <p class=\"text-base font-semibold dark:text-gray-300\">\n                        @lang('admin::app.dashboard.index.revenue-by-sources.title')\n                    </p>\n                </div>\n\n                <!-- Doughnut Chart -->\n                <div\n                    class=\"flex w-full max-w-full flex-col gap-4 px-8 pt-8\"\n                    v-if=\"report.statistics.length\"\n                >\n                    <x-admin::charts.doughnut\n                        ::labels=\"chartLabels\"\n                        ::datasets=\"chartDatasets\"\n                    />\n\n                    <div class=\"flex flex-wrap justify-center gap-5\">\n                        <div\n                            class=\"flex items-center gap-2 whitespace-nowrap\"\n                            v-for=\"(stat, index) in report.statistics\"\n                        >\n                            <span\n                                class=\"h-3.5 w-3.5 rounded-sm\"\n                                :style=\"{ backgroundColor: colors[index] }\"\n                            ></span>\n\n                            <p class=\"text-xs dark:text-gray-300\">\n                                @{{ stat.name }}\n                            </p>\n                        </div>\n                    </div>\n                </div>\n\n                <!-- Empty Product Design -->\n                <div\n                    class=\"flex flex-col gap-8 p-4\"\n                    v-else\n                >\n                    <div class=\"grid justify-center justify-items-center gap-3.5 py-2.5\">\n                        <!-- Placeholder Image -->\n                        <img\n                            src=\"{{ vite()->asset('images/empty-placeholders/default.svg') }}\"\n                            class=\"dark:mix-blend-exclusion dark:invert\"\n                        >\n\n                        <!-- Add Variants Information -->\n                        <div class=\"flex flex-col items-center\">\n                            <p class=\"text-base font-semibold text-gray-400\">\n                                @lang('admin::app.dashboard.index.revenue-by-sources.empty-title')\n                            </p>\n\n                            <p class=\"text-gray-400\">\n                                @lang('admin::app.dashboard.index.revenue-by-sources.empty-info')\n                            </p>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </template>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-dashboard-revenue-by-sources', {\n            template: '#v-dashboard-revenue-by-sources-template',\n\n            data() {\n                return {\n                    report: [],\n\n                    colors: [\n                        '#8979FF',\n                        '#FF928A',\n                        '#3CC3DF',\n                    ],\n\n                    isLoading: true,\n                }\n            },\n\n            computed: {\n                chartLabels() {\n                    return this.report.statistics.map(({ name }) => name);\n                },\n\n                chartDatasets() {\n                    return [{\n                        data: this.report.statistics.map(({ total }) => total),\n                        barThickness: 24,\n                        backgroundColor: this.colors,\n                    }];\n                }\n            },\n\n            mounted() {\n                this.getStats({});\n\n                this.$emitter.on('reporting-filter-updated', this.getStats);\n            },\n\n            methods: {\n                getStats(filters) {\n                    this.isLoading = true;\n\n                    var filters = Object.assign({}, filters);\n\n                    filters.type = 'revenue-by-sources';\n\n                    this.$axios.get(\"{{ route('admin.dashboard.stats') }}\", {\n                            params: filters\n                        })\n                        .then(response => {\n                            this.report = response.data;\n\n                            this.extendColors(this.report.statistics.length);\n\n                            this.isLoading = false;\n                        })\n                        .catch(error => {});\n                },\n                \n                extendColors(length) {\n                    while (this.colors.length < length) {\n                        const hue = Math.floor(Math.random() * 360);\n                        const newColor = `hsl(${hue}, 70%, 60%)`;\n                        this.colors.push(newColor);\n                    }\n                },\n            }\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue-by-types.blade.php",
    "content": "{!! view_render_event('admin.dashboard.index.revenue_by_types.before') !!}\n\n<!-- Total Leads Vue Component -->\n<v-dashboard-revenue-by-types>\n    <!-- Shimmer -->\n    <x-admin::shimmer.dashboard.index.revenue-by-types />\n</v-dashboard-revenue-by-types>\n\n{!! view_render_event('admin.dashboard.index.revenue_by_types.after') !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-dashboard-revenue-by-types-template\"\n    >\n        <!-- Shimmer -->\n        <template v-if=\"isLoading\">\n            <x-admin::shimmer.dashboard.index.revenue-by-types />\n        </template>\n\n        <!-- Total Sales Section -->\n        <template v-else>\n            <div class=\"grid gap-4 rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                <div class=\"flex flex-col justify-between gap-1\">\n                    <p class=\"text-base font-semibold dark:text-gray-300\">\n                        @lang('admin::app.dashboard.index.revenue-by-types.title')\n                    </p>\n                </div>\n\n                <!-- Doughnut Chart -->\n                <div\n                    class=\"flex w-full max-w-full flex-col gap-4 px-8 pt-8\"\n                    v-if=\"report.statistics.length\"\n                >\n                    <x-admin::charts.doughnut\n                        ::labels=\"chartLabels\"\n                        ::datasets=\"chartDatasets\"\n                    />\n\n                    <div class=\"flex flex-wrap justify-center gap-5\">\n                        <div\n                            class=\"flex items-center gap-2 whitespace-nowrap\"\n                            v-for=\"(stat, index) in report.statistics\"\n                        >\n                            <span\n                                class=\"h-3.5 w-3.5 rounded-sm\"\n                                :style=\"{ backgroundColor: colors[index] }\"\n                            ></span>\n\n                            <p class=\"text-xs dark:text-gray-300\">\n                                @{{ stat.name }}\n                            </p>\n                        </div>\n                    </div>\n                </div>\n\n                <!-- Empty Product Design -->\n                <div\n                    class=\"flex flex-col gap-8 p-4\"\n                    v-else\n                >\n                    <div class=\"grid justify-center justify-items-center gap-3.5 py-2.5\">\n                        <!-- Placeholder Image -->\n                        <img\n                            src=\"{{ vite()->asset('images/empty-placeholders/default.svg') }}\"\n                            class=\"dark:mix-blend-exclusion dark:invert\"\n                        >\n\n                        <!-- Add Variants Information -->\n                        <div class=\"flex flex-col items-center\">\n                            <p class=\"text-base font-semibold text-gray-400\">\n                                @lang('admin::app.dashboard.index.revenue-by-sources.empty-title')\n                            </p>\n\n                            <p class=\"text-gray-400\">\n                                @lang('admin::app.dashboard.index.revenue-by-sources.empty-info')\n                            </p>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </template>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-dashboard-revenue-by-types', {\n            template: '#v-dashboard-revenue-by-types-template',\n\n            data() {\n                return {\n                    report: [],\n\n                    colors: [\n                        '#8979FF',\n                        '#FF928A',\n                        '#3CC3DF',\n                    ],\n\n                    isLoading: true,\n                }\n            },\n\n            computed: {\n                chartLabels() {\n                    return this.report.statistics.map(({ name }) => name);\n                },\n\n                chartDatasets() {\n                    return [{\n                        data: this.report.statistics.map(({ total }) => total),\n                        barThickness: 24,\n                        backgroundColor: this.colors,\n                    }];\n                }\n            },\n\n            mounted() {\n                this.getStats({});\n\n                this.$emitter.on('reporting-filter-updated', this.getStats);\n            },\n\n            methods: {\n                getStats(filters) {\n                    this.isLoading = true;\n\n                    var filters = Object.assign({}, filters);\n\n                    filters.type = 'revenue-by-types';\n\n                    this.$axios.get(\"{{ route('admin.dashboard.stats') }}\", {\n                            params: filters\n                        })\n                        .then(response => {\n                            this.report = response.data;\n\n                            this.extendColors(this.report.statistics.length);\n\n                            this.isLoading = false;\n                        })\n                        .catch(error => {});\n                },\n\n                extendColors(length) {\n                    while (this.colors.length < length) {\n                        const hue = Math.floor(Math.random() * 360);\n                        const newColor = `hsl(${hue}, 70%, 60%)`;\n                        this.colors.push(newColor);\n                    }\n                },\n            }\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/dashboard/index/revenue.blade.php",
    "content": "{!! view_render_event('admin.dashboard.index.revenue.after') !!}\n\n<!-- Over Details Vue Component -->\n<v-dashboard-revenue-stats>\n    <!-- Shimmer -->\n    <x-admin::shimmer.dashboard.index.revenue />\n</v-dashboard-revenue-stats>\n\n{!! view_render_event('admin.dashboard.index.revenue.after') !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-dashboard-revenue-stats-template\"\n    >\n        <!-- Shimmer -->\n        <template v-if=\"isLoading\">\n            <x-admin::shimmer.dashboard.index.revenue />\n        </template>\n\n        <!-- Total Sales Section -->\n        <template v-else>\n            <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                <div class=\"flex gap-4 max-md:flex-wrap\">\n                    <!-- Total Revenue -->\n                    <div class=\"flex gap-2 max-md:flex-wrap md:flex-col\">\n                        <!-- Won Revenue Card -->\n                        <div class=\"flex flex-col gap-2 rounded-lg border border-gray-200 px-4 py-5 dark:border-gray-800 max-sm:w-full\">\n                            <p class=\"text-xs font-medium text-gray-600 dark:text-gray-300\">\n                                @lang('admin::app.dashboard.index.revenue.won-revenue')\n                            </p>\n\n                            <div class=\"flex gap-2\">\n                                <p class=\"text-xl font-bold text-green-600\">\n                                    @{{ report.statistics.total_won_revenue.formatted_total }}\n                                </p>\n\n                                <div class=\"flex items-center gap-0.5\">\n                                    <span\n                                        class=\"text-base !font-semibold text-green-500\"\n                                        :class=\"[report.statistics.total_won_revenue.progress < 0 ? 'icon-stats-down text-red-500 dark:!text-red-500' : 'icon-stats-up text-green-500 dark:!text-green-500']\"\n                                    ></span>\n\n                                    <p\n                                        class=\"text-xs font-semibold text-green-500\"\n                                        :class=\"[report.statistics.total_won_revenue.progress < 0 ?  'text-red-500' : 'text-green-500']\"\n                                    >\n                                        @{{ Math.abs(report.statistics.total_won_revenue.progress.toFixed(2)) }}%\n                                    </p>\n                                </div>\n                            </div>\n                        </div>\n\n                        <!-- Lost Revenue Card -->\n                        <div class=\"flex flex-col gap-2 rounded-lg border border-gray-200 px-4 py-5 dark:border-gray-800 max-sm:w-full\">\n                            <p class=\"text-xs font-medium text-gray-600 dark:text-gray-300\">\n                                @lang('admin::app.dashboard.index.revenue.lost-revenue')\n                            </p>\n\n                            <div class=\"flex gap-2\">\n                                <p class=\"text-xl font-bold text-red-500\">\n                                    @{{ report.statistics.total_lost_revenue.formatted_total }}\n                                </p>\n\n                                <div class=\"flex items-center gap-0.5\">\n                                    <span\n                                        class=\"text-base !font-semibold text-green-500\"\n                                        :class=\"[report.statistics.total_lost_revenue.progress < 0 ? 'icon-stats-down text-red-500 dark:!text-red-500' : 'icon-stats-up text-green-500 dark:!text-green-500']\"\n                                    ></span>\n\n                                    <p\n                                        class=\"text-xs font-semibold text-green-500\"\n                                        :class=\"[report.statistics.total_lost_revenue.progress < 0 ?  'text-red-500' : 'text-green-500']\"\n                                    >\n                                        @{{ Math.abs(report.statistics.total_lost_revenue.progress.toFixed(2)) }}%\n                                    </p>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n\n                    <!-- Bar Chart -->\n                    <div class=\"flex w-full max-w-full flex-col gap-4\">\n                        <canvas\n                            :id=\"$.uid + '_chart'\"\n                            class=\"w-full max-w-full items-end\"\n                        ></canvas>\n\n                        <div class=\"flex justify-center gap-5\">\n                            <div class=\"flex items-center gap-2\">\n                                <span class=\"h-3.5 w-3.5 rounded-sm bg-green-500 opacity-80\"></span>\n\n                                <p class=\"text-xs dark:text-gray-300\">\n                                    @lang('admin::app.dashboard.index.revenue.won-revenue')\n                                </p>\n                            </div>\n\n                            <div class=\"flex items-center gap-2\">\n                                <span class=\"h-3.5 w-3.5 rounded-sm bg-red-500 opacity-80\"></span>\n\n                                <p class=\"text-xs dark:text-gray-300\">\n                                    @lang('admin::app.dashboard.index.revenue.lost-revenue')\n                                </p>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </template>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-dashboard-revenue-stats', {\n            template: '#v-dashboard-revenue-stats-template',\n\n            data() {\n                return {\n                    report: [],\n\n                    isLoading: true,\n\n                    chart: undefined,\n                }\n            },\n\n            mounted() {\n                this.getStats({});\n\n                this.$emitter.on('reporting-filter-updated', this.getStats);\n            },\n\n            methods: {\n                getStats(filters) {\n                    this.isLoading = true;\n\n                    var filters = Object.assign({}, filters);\n\n                    filters.type = 'revenue-stats';\n\n                    this.$axios.get(\"{{ route('admin.dashboard.stats') }}\", {\n                            params: filters\n                        })\n                        .then(response => {\n                            this.report = response.data;\n\n                            this.isLoading = false;\n\n                            setTimeout(() => {\n                                this.prepare();\n                            }, 0);\n                        })\n                        .catch(error => {});\n                },\n\n                prepare() {\n                    if (this.chart) {\n                        this.chart.destroy();\n                    }\n\n                    this.chart = new Chart(document.getElementById(this.$.uid + '_chart'), {\n                        type: 'bar',\n\n                        data: {\n                            labels: [\n                            \"@lang('admin::app.dashboard.index.revenue.won-revenue')\",\n                            \"@lang('admin::app.dashboard.index.revenue.lost-revenue')\"\n                        ],\n\n                            datasets: [{\n                                axis: 'y',\n                                data: [\n                                    this.report.statistics.total_won_revenue.current,\n                                    this.report.statistics.total_lost_revenue.current\n                                ],\n\n                                backgroundColor: [\n                                    'rgba(34, 197, 94, 0.8)',\n                                    'rgba(239, 68, 68, 0.8)',\n                                ],\n\n                                barPercentage: 0.8,\n                                categoryPercentage: 0.7,\n                            }],\n                        },\n\n                        options: {\n                            aspectRatio: 5,\n\n                            indexAxis: 'y',\n\n                            plugins: {\n                                legend: {\n                                    display: false,\n                                },\n                            },\n\n                            scales: {\n                                x: {\n                                    beginAtZero: true,\n\n                                    ticks: {\n                                        stepSize: 500,\n                                    },\n\n                                    border: {\n                                        dash: [8, 4],\n                                    }\n                                },\n\n                                y: {\n                                    beginAtZero: true,\n\n                                    ticks: {\n                                        display: false,\n                                    },\n\n                                    border: {\n                                        dash: [8, 4],\n                                    }\n                                }\n                            },\n\n                            maintainAspectRatio: true,\n\n                            responsive: true,\n\n                            layout: {\n                                padding: {\n                                    left: 0,\n                                    right: 0,\n                                    top: 0,\n                                    bottom: 0\n                                }\n                            }\n                        }\n                    });\n                }\n            }\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/dashboard/index/top-persons.blade.php",
    "content": "{!! view_render_event('admin.dashboard.index.top_persons.before') !!}\n\n<!-- Top Selling Products Vue Component -->\n<v-dashboard-top-persons>\n    <!-- Shimmer -->\n    <x-admin::shimmer.dashboard.index.top-persons />\n</v-dashboard-top-persons>\n\n{!! view_render_event('admin.dashboard.index.top_persons.after') !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-dashboard-top-persons-template\"\n    >\n        <!-- Shimmer -->\n        <template v-if=\"isLoading\">\n            <x-admin::shimmer.dashboard.index.top-persons />\n        </template>\n\n        <!-- Total Sales Section -->\n        <template v-else>\n            <div class=\"w-full rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                <div class=\"flex items-center justify-between p-4\">\n                    <p class=\"text-base font-semibold text-gray-600 dark:text-gray-300\">\n                        @lang('admin::app.dashboard.index.top-persons.title')\n                    </p>\n                </div>\n\n                <!-- Top Selling Products Details -->\n                <div\n                    class=\"flex flex-col\"\n                    v-if=\"report.statistics.length\"\n                >\n                    <a\n                        :href=\"'{{ route('admin.contacts.persons.view', ':id') }}'.replace(':id', item.id)\"\n                        class=\"flex gap-2.5 border-b p-4 transition-all last:border-b-0 hover:bg-gray-50 dark:border-gray-800 dark:hover:bg-gray-950\"\n                        target=\"_blank\"\n                        v-for=\"item in report.statistics\"\n                    >\n                        <!-- Person Initials -->\n                        <x-admin::avatar ::name=\"item.name\" />\n\n                        <!-- Person Details -->\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"font-medium text-gray-800 dark:text-white\">@{{ item.name }}</p>\n\n                            <p class=\"font-normal text-gray-800 dark:text-white\">@{{ item.emails.map(item => item.value).join(', ') }}</p>\n                        </div>\n                    </a>\n                </div>\n\n                <!-- Empty Product Design -->\n                <div\n                    class=\"flex flex-col gap-8 p-4\"\n                    v-else\n                >\n                    <div class=\"grid justify-center justify-items-center gap-3.5 py-2.5\">\n                        <!-- Placeholder Image -->\n                        <img\n                            src=\"{{ vite()->asset('images/empty-placeholders/users.svg') }}\"\n                            class=\"dark:mix-blend-exclusion dark:invert\"\n                        >\n\n                        <!-- Add Variants Information -->\n                        <div class=\"flex flex-col items-center\">\n                            <p class=\"text-base font-semibold text-gray-400\">\n                                @lang('admin::app.dashboard.index.top-persons.empty-title')\n                            </p>\n\n                            <p class=\"text-gray-400\">\n                                @lang('admin::app.dashboard.index.top-persons.empty-info')\n                            </p>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </template>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-dashboard-top-persons', {\n            template: '#v-dashboard-top-persons-template',\n\n            data() {\n                return {\n                    report: [],\n\n                    isLoading: true,\n                }\n            },\n\n            mounted() {\n                this.getStats({});\n\n                this.$emitter.on('reporting-filter-updated', this.getStats);\n            },\n\n            methods: {\n                getStats(filters) {\n                    this.isLoading = true;\n\n                    var filters = Object.assign({}, filters);\n\n                    filters.type = 'top-persons';\n\n                    this.$axios.get(\"{{ route('admin.dashboard.stats') }}\", {\n                            params: filters\n                        })\n                        .then(response => {\n                            this.report = response.data;\n\n                            this.isLoading = false;\n                        })\n                        .catch(error => {});\n                }\n            }\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/dashboard/index/top-selling-products.blade.php",
    "content": "{!! view_render_event('admin.dashboard.index.top_selling_proudcts.before') !!}\n\n<!-- Top Selling Products Vue Component -->\n<v-dashboard-top-selling-products>\n    <!-- Shimmer -->\n    <x-admin::shimmer.dashboard.index.top-selling-products />\n</v-dashboard-top-selling-products>\n\n{!! view_render_event('admin.dashboard.index.top_selling_proudcts.after') !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-dashboard-top-selling-products-template\"\n    >\n        <!-- Shimmer -->\n        <template v-if=\"isLoading\">\n            <x-admin::shimmer.dashboard.index.top-selling-products />\n        </template>\n\n        <!-- Total Sales Section -->\n        <template v-else>\n            <div class=\"w-full rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                <div class=\"flex items-center justify-between p-4\">\n                    <p class=\"text-base font-semibold text-gray-600 dark:text-gray-300\">\n                        @lang('admin::app.dashboard.index.top-selling-products.title')\n                    </p>\n                </div>\n\n                <!-- Top Selling Products Details -->\n                <div\n                    class=\"flex flex-col\"\n                    v-if=\"report.statistics.length\"\n                >\n                    <a\n                        :href=\"'{{ route('admin.products.view', ':id') }}'.replace(':id', item.id)\"\n                        class=\"flex gap-2.5 border-b p-4 transition-all last:border-b-0 hover:bg-gray-50 dark:border-gray-800 dark:hover:bg-gray-950\"\n                        target=\"_blank\"\n                        v-for=\"item in report.statistics\"\n                    >\n                        <!-- Product Details -->\n                        <div class=\"flex w-full flex-col gap-1.5\">\n                            <p\n                                class=\"text-gray-600 dark:text-gray-300\"\n                                v-text=\"item.name\"\n                            >\n                            </p>\n\n                            <div class=\"flex justify-between\">\n                                <p class=\"font-medium text-gray-800 dark:text-white\">\n                                    @{{ item.formatted_price }}\n                                </p>\n\n                                <p class=\"font-normal text-gray-800 dark:text-white\">\n                                    @{{ item.formatted_revenue }}\n                                </p>\n                            </div>\n                        </div>\n                    </a>\n                </div>\n\n                <!-- Empty Product Design -->\n                <div\n                    class=\"flex flex-col gap-8 p-4\"\n                    v-else\n                >\n                    <div class=\"grid justify-center justify-items-center gap-3.5 py-2.5\">\n                        <!-- Placeholder Image -->\n                        <img\n                            src=\"{{ vite()->asset('images/empty-placeholders/products.svg') }}\"\n                            class=\"dark:mix-blend-exclusion dark:invert\"\n                        >\n\n                        <!-- Add Variants Information -->\n                        <div class=\"flex flex-col items-center\">\n                            <p class=\"text-base font-semibold text-gray-400\">\n                                @lang('admin::app.dashboard.index.top-selling-products.empty-title')\n                            </p>\n\n                            <p class=\"text-gray-400\">\n                                @lang('admin::app.dashboard.index.top-selling-products.empty-info')\n                            </p>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </template>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-dashboard-top-selling-products', {\n            template: '#v-dashboard-top-selling-products-template',\n\n            data() {\n                return {\n                    report: [],\n\n                    isLoading: true,\n                }\n            },\n\n            mounted() {\n                this.getStats({});\n\n                this.$emitter.on('reporting-filter-updated', this.getStats);\n            },\n\n            methods: {\n                getStats(filters) {\n                    this.isLoading = true;\n\n                    var filters = Object.assign({}, filters);\n\n                    filters.type = 'top-selling-products';\n\n                    this.$axios.get(\"{{ route('admin.dashboard.stats') }}\", {\n                            params: filters\n                        })\n                        .then(response => {\n                            this.report = response.data;\n\n                            this.isLoading = false;\n                        })\n                        .catch(error => {});\n                }\n            }\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/dashboard/index/total-leads.blade.php",
    "content": "{!! view_render_event('admin.dashboard.index.total_leads.before') !!}\n\n<!-- Total Leads Vue Component -->\n<v-dashboard-total-leads>\n    <!-- Shimmer -->\n    <x-admin::shimmer.dashboard.index.total-leads />\n</v-dashboard-total-leads>\n\n{!! view_render_event('admin.dashboard.index.total_leads.after') !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-dashboard-total-leads-template\"\n    >\n        <!-- Shimmer -->\n        <template v-if=\"isLoading\">\n            <x-admin::shimmer.dashboard.index.total-leads />\n        </template>\n\n        <!-- Total Sales Section -->\n        <template v-else>\n            <div class=\"grid gap-4 rounded-lg border border-gray-200 bg-white px-4 py-2 dark:border-gray-800 dark:bg-gray-900\">\n                <div class=\"flex flex-col justify-between gap-1\">\n                    <p class=\"text-base font-semibold dark:text-gray-300\">\n                        @lang('admin::app.dashboard.index.total-leads.title')\n                    </p>\n                </div>\n\n                <!-- Bar Chart -->\n                <div class=\"flex w-full max-w-full flex-col gap-4\">\n                    <x-admin::charts.bar\n                        ::labels=\"chartLabels\"\n                        ::datasets=\"chartDatasets\"\n                    />\n\n                    <div class=\"flex justify-center gap-5\">\n                        <div class=\"flex items-center gap-2\">\n                            <span class=\"h-3.5 w-3.5 rounded-sm bg-[#8979FF]\"></span>\n                            \n                            <p class=\"text-xs dark:text-gray-300\">\n                                @lang('admin::app.dashboard.index.total-leads.total')\n                            </p>\n                        </div>\n                        \n                        <div class=\"flex items-center gap-2\">\n                            <span class=\"h-3.5 w-3.5 rounded-sm bg-[#63CFE5]\"></span>\n                            \n                            <p class=\"text-xs dark:text-gray-300\">\n                                @lang('admin::app.dashboard.index.total-leads.won')\n                            </p>\n                        </div>\n                        \n                        <div class=\"flex items-center gap-2\">\n                            <span class=\"h-3.5 w-3.5 rounded-sm bg-[#FFA8A1]\"></span>\n                            \n                            <p class=\"text-xs dark:text-gray-300\">\n                                @lang('admin::app.dashboard.index.total-leads.lost')\n                            </p>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </template>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-dashboard-total-leads', {\n            template: '#v-dashboard-total-leads-template',\n\n            data() {\n                return {\n                    report: [],\n\n                    isLoading: true,\n                }\n            },\n\n            computed: {\n                chartLabels() {\n                    return this.report.statistics.all.over_time.map(({ label }) => label);\n                },\n\n                chartDatasets() {\n                    return [{\n                        data: this.report.statistics.all.over_time.map(({ count }) => count),\n                        barThickness: 24,\n                        backgroundColor: '#8979FF',\n                    },{\n                        data: this.report.statistics.won.over_time.map(({ count }) => count),\n                        barThickness: 24,\n                        backgroundColor: '#63CFE5',\n                    },{\n                        data: this.report.statistics.lost.over_time.map(({ count }) => count),\n                        barThickness: 24,\n                        backgroundColor: '#FFA8A1',\n                    }];\n                }\n            },\n\n            mounted() {\n                this.getStats({});\n\n                this.$emitter.on('reporting-filter-updated', this.getStats);\n            },\n\n            methods: {\n                getStats(filters) {\n                    this.isLoading = true;\n\n                    var filters = Object.assign({}, filters);\n\n                    filters.type = 'total-leads';\n\n                    this.$axios.get(\"{{ route('admin.dashboard.stats') }}\", {\n                            params: filters\n                        })\n                        .then(response => {\n                            this.report = response.data;\n\n                            this.isLoading = false;\n                        })\n                        .catch(error => {});\n                }\n            }\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/dashboard/index.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.dashboard.index.title')\n    </x-slot>\n\n    <!-- Head Details Section -->\n    {!! view_render_event('admin.dashboard.index.header.before') !!}\n\n    <div class=\"mb-5 flex items-center justify-between gap-4 max-sm:flex-wrap\">\n        {!! view_render_event('admin.dashboard.index.header.left.before') !!}\n\n        <div class=\"grid gap-1.5\">\n            <p class=\"text-2xl font-semibold dark:text-white\">\n                @lang('admin::app.dashboard.index.title')\n            </p>\n        </div>\n\n        {!! view_render_event('admin.dashboard.index.header.left.after') !!}\n\n        <!-- Actions -->\n        {!! view_render_event('admin.dashboard.index.header.right.before') !!}\n\n        <v-dashboard-filters>\n            <!-- Shimmer -->\n            <div class=\"flex gap-1.5\">\n                <div class=\"light-shimmer-bg dark:shimmer h-[39px] w-[140px] rounded-md\"></div>\n                <div class=\"light-shimmer-bg dark:shimmer h-[39px] w-[140px] rounded-md\"></div>\n            </div>\n        </v-dashboard-filters>\n\n        {!! view_render_event('admin.dashboard.index.header.right.after') !!}\n    </div>\n\n    {!! view_render_event('admin.dashboard.index.header.after') !!}\n\n    <!-- Body Component -->\n    {!! view_render_event('admin.dashboard.index.content.before') !!}\n\n    <div class=\"mt-3.5 flex gap-4 max-xl:flex-wrap\">\n        <!-- Left Section -->\n        {!! view_render_event('admin.dashboard.index.content.left.before') !!}\n\n        <div class=\"flex flex-1 flex-col gap-4 max-xl:flex-auto\">\n            <!-- Revenue Stats -->\n            @include('admin::dashboard.index.revenue')\n\n            <!-- Over All Stats -->\n            @include('admin::dashboard.index.over-all')\n\n            <!-- Total Leads Stats -->\n            @include('admin::dashboard.index.total-leads')\n\n            <div class=\"flex gap-4 max-lg:flex-wrap\">\n                <!-- Total Products -->\n                @include('admin::dashboard.index.top-selling-products')\n\n                <!-- Total Persons -->\n                @include('admin::dashboard.index.top-persons')\n            </div>\n        </div>\n\n        {!! view_render_event('admin.dashboard.index.content.left.after') !!}\n\n        <!-- Right Section -->\n        {!! view_render_event('admin.dashboard.index.content.right.before') !!}\n\n        <div class=\"flex w-[378px] max-w-full flex-col gap-4 max-sm:w-full\">\n            <!-- Revenue by Types -->\n            @include('admin::dashboard.index.open-leads-by-states')\n\n            <!-- Revenue by Sources -->\n            @include('admin::dashboard.index.revenue-by-sources')\n\n            <!-- Revenue by Types -->\n            @include('admin::dashboard.index.revenue-by-types')\n        </div>\n\n        {!! view_render_event('admin.dashboard.index.content.left.after') !!}\n    </div>\n\n    {!! view_render_event('admin.dashboard.index.content.after') !!}\n\n    @pushOnce('scripts')\n\n        <script\n            type=\"module\"\n            src=\"{{ vite()->asset('js/chart.js') }}\"\n        >\n        </script>\n\n        <script\n            type=\"module\"\n            src=\"https://cdn.jsdelivr.net/npm/chartjs-chart-funnel@4.2.1/build/index.umd.min.js\"\n        >\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-dashboard-filters-template\"\n        >\n            {!! view_render_event('admin.dashboard.index.date_filters.before') !!}\n\n            <div class=\"flex gap-1.5\">\n                <x-admin::flat-picker.date\n                    class=\"!w-[140px]\"\n                    ::allow-input=\"false\"\n                    ::max-date=\"filters.end\"\n                >\n                    <input\n                        class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                        v-model=\"filters.start\"\n                        placeholder=\"@lang('admin::app.dashboard.index.start-date')\"\n                    />\n                </x-admin::flat-picker.date>\n\n                <x-admin::flat-picker.date\n                    class=\"!w-[140px]\"\n                    ::allow-input=\"false\"\n                    ::max-date=\"filters.end\"\n                >\n                    <input\n                        class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                        v-model=\"filters.end\"\n                        placeholder=\"@lang('admin::app.dashboard.index.end-date')\"\n                    />\n                </x-admin::flat-picker.date>\n            </div>\n\n            {!! view_render_event('admin.dashboard.index.date_filters.after') !!}\n        </script>\n\n        <script type=\"module\">\n            app.component('v-dashboard-filters', {\n                template: '#v-dashboard-filters-template',\n\n                data() {\n                    return {\n                        filters: {\n                            channel: '',\n\n                            start: \"{{ $startDate->format('Y-m-d') }}\",\n\n                            end: \"{{ $endDate->format('Y-m-d') }}\",\n                        }\n                    }\n                },\n\n                watch: {\n                    filters: {\n                        handler() {\n                            this.$emitter.emit('reporting-filter-updated', this.filters);\n                        },\n\n                        deep: true\n                    }\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/emails/common/index.blade.php",
    "content": "@component('admin::emails.layout')\n   {!! $body !!}\n@endcomponent\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/emails/layout.blade.php",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n    <head>\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n\n        <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n        <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n    </head>\n\n    <body style=\"font-family: inter;\">\n        <div style=\"max-width: 640px; margin-left: auto; margin-right: auto;\">\n            <div style=\"padding: 30px;\">\n                <!-- Email Header -->\n                <div style=\"margin-bottom: 45px;\">\n                    <a href=\"{{ config('app.url') }}\">\n                        <img\n                            src=\"{{ vite()->asset('images/logo.svg') }}\"\n                            alt=\"{{ config('app.name') }}\"\n                            style=\"height: 40px; width: 110px;\"\n                        />\n                    </a>\n                </div>\n\n                <!-- Email Content -->\n                {{ $slot }}\n\n                <!-- Email Footer -->\n                <p style=\"font-size: 16px;color: #202B3C;line-height: 24px;\">\n                    @lang('admin::app.emails.common.cheers', ['app_name' => config('app.name')])\n                </p>\n            </div>\n        </div>\n    </body>\n</html>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/emails/users/create.blade.php",
    "content": "@component('admin::emails.layout')\n    <div style=\"margin-bottom: 34px;\">\n        <p style=\"font-weight: bold;font-size: 20px;color: #121A26;line-height: 24px;margin-bottom: 24px\">\n            @lang('admin::app.emails.common.user.dear', ['username' => $user_name]), 👋\n        </p>\n\n        <p style=\"font-size: 16px;color: #384860;line-height: 24px;\">\n            @lang('admin::app.emails.common.user.create-body')\n        </p>\n    </div>\n@endcomponent\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/emails/users/forget-password.blade.php",
    "content": "@component('admin::emails.layout')\n    <div style=\"margin-bottom: 34px;\">\n        <p style=\"font-size: 16px;color: #5E5E5E;line-height: 24px;\">\n            @lang('admin::app.emails.common.user.forget-password.dear', ['username' => $user_name]), 👋\n        </p>\n\n        <p style=\"font-size: 16px;color: #5E5E5E;line-height: 24px;\">\n            @lang('admin::app.emails.common.user.forget-password.info')\n        </p>\n\n        <p style=\"text-align: center;padding: 20px 0;\">\n            <a \n                href=\"{{ route('admin.reset_password.create', $token) }}\"\n                style=\"padding: 10px 20px;background: #0D8DD5;color: #ffffff;text-transform: uppercase;text-decoration: none; font-size: 16px\"\n            >\n                @lang('admin::app.emails.common.user.forget-password.reset-password')\n            </a>\n        </p>\n\n        <p style=\"font-size: 16px;color: #5E5E5E;line-height: 24px;\">\n            @lang('admin::app.emails.common.user.forget-password.final-summary')\n        </p>\n\n        <p style=\"font-size: 16px;color: #5E5E5E;line-height: 24px;\">\n            @lang('admin::app.emails.common.user.forget-password.thanks')\n        </p>\n    </div>\n@endcomponent\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/errors/index.blade.php",
    "content": "<x-admin::layouts.anonymous>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang(\"admin::app.errors.{$errorCode}.title\")\n    </x-slot>\n\n    <!-- Error page Information -->\n\t<div class=\"flex h-[100vh] items-center justify-center bg-white dark:bg-gray-900\">\n        <div class=\"flex max-w-[745px] items-center gap-5\">\n            <div class=\"flex w-full flex-col gap-6\">\n                <img\n                    src=\"{{ \n                        request()->cookie('dark_mode') \n                        ? vite()->asset('images/dark-logo.svg') \n                        : vite()->asset('images/logo.svg') \n                    }}\"\n                    class=\"w-40 ltr:pr-16 rtl:pl-16\"\n                >\n\n\t\t\t\t<div class=\"text-[38px] font-bold text-gray-800 dark:text-white\">\n                    {{ $errorCode }}\n                </div>\n\n                <p class=\"text-sm text-gray-800 dark:text-white\">\n                    @lang(\"admin::app.errors.{$errorCode}.description\")\n                </p>\n\n                <div class=\"flex items-center gap-2.5\">\n                    <a\n                        href=\"{{ url()->previous() }}\"\n                        class=\"cursor-pointer text-sm font-semibold text-blue-600 transition-all hover:underline\"\n                    >\n                        @lang('admin::app.errors.go-back')\n                    </a>\n\n                    <span>\n                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"6\" height=\"7\" viewBox=\"0 0 6 7\" fill=\"none\">\n                            <circle cx=\"3\" cy=\"3.5\" r=\"3\" fill=\"#9CA3AF\"/>\n                        </svg>\n                    </span>\n\n                    <a\n                        href=\"{{ route('admin.dashboard.index') }}\"\n                        class=\"hover:underlsine text-sm font-semibold text-blue-600 transition-all\"\n                    >\n                        @lang('admin::app.errors.dashboard')\n                    </a>\n                </div>\n\n                <p class=\"text-sm text-gray-800 dark:text-white\">\n                    @lang('admin::app.errors.support', [\n                        'link' => 'mailto:support@example.com',\n                        'email' => 'support@example.com',\n                        'class' => 'font-semibold text-blue-600 transition-all hover:underline',\n                    ])\n                </p>\n            </div>\n\n            <div class=\"w-full\">\n                <img src=\"{{ vite()->asset('images/error.svg') }}\" />\n            </div>\n        </div>\n\t</div>\n</x-admin::layouts.anonymous>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/common/contact.blade.php",
    "content": "{!! view_render_event('admin.leads.create.contact_person.form_controls.before') !!}\n\n<v-contact-component :data=\"person\"></v-contact-component>\n\n{!! view_render_event('admin.leads.create.contact_person.form_controls.after') !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-contact-component-template\"\n    >\n        <!-- Person Search Lookup -->\n        <x-admin::form.control-group>\n            <x-admin::form.control-group.label class=\"required\">\n                @lang('admin::app.leads.common.contact.name')\n            </x-admin::form.control-group.label>\n\n            <x-admin::lookup\n                ::src=\"src\"\n                name=\"person[id]\"\n                ::params=\"params\"\n                ::rules=\"nameValidationRule\"\n                :label=\"trans('admin::app.leads.common.contact.name')\"\n                ::value=\"{id: person.id, name: person.name}\"\n                :placeholder=\"trans('admin::app.leads.common.contact.name')\"\n                @on-selected=\"addPerson\"\n                :can-add-new=\"true\"\n            />\n\n            <x-admin::form.control-group.control\n                type=\"hidden\"\n                name=\"person[name]\"\n                v-model=\"person.name\"\n                v-if=\"person.name\"\n            />\n\n            <x-admin::form.control-group.error control-name=\"person[id]\" />\n        </x-admin::form.control-group>\n\n        <!-- Person Email -->\n        <x-admin::form.control-group>\n            <x-admin::form.control-group.label class=\"required\">\n                @lang('admin::app.leads.common.contact.email')\n            </x-admin::form.control-group.label>\n\n            <x-admin::attributes.edit.email />\n\n            <v-email-component\n                :attribute=\"{'id': person?.id, 'code': 'person[emails]', 'name': 'Email'}\"\n                validations=\"required\"\n                :value=\"person.emails\"\n                :is-disabled=\"person?.id ? true : false\"\n            ></v-email-component>\n        </x-admin::form.control-group>\n\n        <!-- Person Contact Numbers -->\n        <x-admin::form.control-group>\n            <x-admin::form.control-group.label>\n                @lang('admin::app.leads.common.contact.contact-number')\n            </x-admin::form.control-group.label>\n\n            <x-admin::attributes.edit.phone />\n\n            <v-phone-component\n                :attribute=\"{'id': person?.id, 'code': 'person[contact_numbers]', 'name': 'Contact Numbers'}\"\n                :value=\"person.contact_numbers\"\n                :is-disabled=\"person?.id ? true : false\"\n            ></v-phone-component>\n        </x-admin::form.control-group>\n\n        <!-- Person Organization -->\n        <x-admin::form.control-group>\n            <x-admin::form.control-group.label>\n                @lang('admin::app.leads.common.contact.organization')\n            </x-admin::form.control-group.label>\n\n            @php\n                $organizationAttribute = app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findOneWhere([\n                    'entity_type' => 'persons',\n                    'code' => 'organization_id'\n                ]);\n\n                $organizationAttribute->code = 'person[' . $organizationAttribute->code . ']';\n            @endphp\n\n            <x-admin::attributes.edit.lookup />\n\n            <v-lookup-component\n                :key=\"person.organization?.id\"\n                :attribute='@json($organizationAttribute)'\n                :value=\"person.organization\"\n                :is-disabled=\"person?.id ? true : false\"\n                can-add-new=\"true\"\n            ></v-lookup-component>\n        </x-admin::form.control-group>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-contact-component', {\n            template: '#v-contact-component-template',\n\n            props: ['data'],\n\n            data () {\n                return {\n                    is_searching: false,\n\n                    person: this.data ? this.data : {\n                        'name': ''\n                    },\n\n                    persons: [],\n                }\n            },\n\n            computed: {\n                src() {\n                    return \"{{ route('admin.contacts.persons.search') }}\";\n                },\n\n                params() {\n                    return {\n                        params: {\n                            query: this.person['name']\n                        }\n                    }\n                },\n\n                nameValidationRule() {\n                    return this.person.name ? '' : 'required';\n                }\n            },\n\n            methods: {\n                addPerson (person) {\n                    this.person = person;\n                },\n            }\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/common/products.blade.php",
    "content": "{!! view_render_event('admin.leads.create.products.form_controls.before') !!}\n\n<v-product-list :data=\"products\"></v-product-list>\n\n{!! view_render_event('admin.leads.create.products.form_controls.after') !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-product-list-template\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            {!! view_render_event('admin.leads.create.products.form_controls.table.before') !!}\n\n            <div class=\"block w-full\">\n                <!-- Table -->\n                <x-admin::table>\n                    {!! view_render_event('admin.leads.create.products.form_controls.table.head.before') !!}\n\n                    <!-- Table Head -->\n                    <x-admin::table.thead>\n                        <x-admin::table.thead.tr>\n                            <x-admin::table.th>\n                                @lang('admin::app.leads.common.products.product-name')\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"text-center\">\n                                @lang('admin::app.leads.common.products.quantity')\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"text-center\">\n                                @lang('admin::app.leads.common.products.price')\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"text-center\">\n                                @lang('admin::app.leads.common.products.amount')\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"text-right\">\n                                @lang('admin::app.leads.common.products.action')\n                            </x-admin::table.th>\n                        </x-admin::table.thead.tr>\n                    </x-admin::table.thead>\n\n                    {!! view_render_event('admin.leads.create.products.form_controls.table.head.after') !!}\n\n                    {!! view_render_event('admin.leads.create.products.form_controls.table.body.before') !!}\n\n                    <!-- Table Body -->\n                    <x-admin::table.tbody>\n                        {!! view_render_event('admin.leads.create.products.form_controls.table.body.product_item.before') !!}\n\n                        <!-- Product Item Vue Component -->\n                        <v-product-item\n                            v-for='(product, index) in products'\n                            :product=\"product\"\n                            :key=\"index\"\n                            :index=\"index\"\n                            @onRemoveProduct=\"removeProduct($event)\"\n                        ></v-product-item>\n\n                        {!! view_render_event('admin.leads.create.products.form_controls.table.body.product_item.after') !!}\n                    </x-admin::table.tbody>\n\n                    {!! view_render_event('admin.leads.create.products.form_controls.table.body.after') !!}\n                </x-admin::table>\n            </div>\n\n            {!! view_render_event('admin.leads.create.products.form_controls.table.after') !!}\n\n            <!-- Add New Product Item -->\n            <button\n                type=\"button\"\n                class=\"flex max-w-max items-center gap-2 text-brandColor\"\n                @click=\"addProduct\"\n            >\n                <i class=\"icon-add text-md !text-brandColor\"></i>\n\n                @lang('admin::app.leads.common.products.add-more')\n            </button>\n        </div>\n    </script>\n\n    <script\n        type=\"text/x-template\"\n        id=\"v-product-item-template\"\n    >\n        <x-admin::table.thead.tr>\n            <!-- Product Name -->\n            <x-admin::table.td>\n                <x-admin::form.control-group class=\"!mb-0\">\n                    <x-admin::lookup\n                        ::src=\"src\"\n                        ::name=\"`${inputName}[name]`\"\n                        :preload=\"true\"\n                        :placeholder=\"trans('admin::app.leads.common.products.product-name')\"\n                        @on-selected=\"(product) => addProduct(product)\"\n                    />\n\n                    <x-admin::form.control-group.control\n                        type=\"hidden\"\n                        ::name=\"`${inputName}[product_id]`\"\n                        v-model=\"product.product_id\"\n                        rules=\"required\"\n                        :label=\"trans('admin::app.leads.common.products.product-name')\"\n                        :placeholder=\"trans('admin::app.leads.common.products.product-name')\"\n                    />\n\n                    <x-admin::form.control-group.error ::name=\"`${inputName}[product_id]`\" />\n                </x-admin::form.control-group>\n            </x-admin::table.td>\n\n            <!-- Product Quantity -->\n            <x-admin::table.td class=\"text-right\">\n                <x-admin::form.control-group>\n                    <x-admin::form.control-group.control\n                        type=\"inline\"\n                        ::name=\"`${inputName}[quantity]`\"\n                        ::value=\"product.quantity\"\n                        rules=\"required|decimal:4\"\n                        :label=\"trans('admin::app.leads.common.products.quantity')\"\n                        :placeholder=\"trans('admin::app.leads.common.products.quantity')\"\n                        @on-change=\"(event) => product.quantity = event.value\"\n                        position=\"center\"\n                    />\n                </x-admin::form.control-group>\n            </x-admin::table.td>\n\n            <!-- Price -->\n            <x-admin::table.td class=\"text-right\">\n                <x-admin::form.control-group>\n                    <x-admin::form.control-group.control\n                        type=\"inline\"\n                        ::name=\"`${inputName}[price]`\"\n                        ::value=\"product.price\"\n                        rules=\"required|decimal:4\"\n                        :label=\"trans('admin::app.leads.common.products.price')\"\n                        :placeholder=\"trans('admin::app.leads.common.products.price')\"\n                        @on-change=\"(event) => product.price = event.value\"\n                        ::value-label=\"$admin.formatPrice(Number(product.price) || 0)\"\n                        position=\"center\"\n                    />\n                </x-admin::form.control-group>\n            </x-admin::table.td>\n\n            <!-- Amount -->\n            <x-admin::table.td class=\"text-right\">\n                <x-admin::form.control-group>\n                    <x-admin::form.control-group.control\n                        type=\"inline\"\n                        ::name=\"`${inputName}[amount]`\"\n                        ::value=\"product.price * product.quantity\"\n                        rules=\"required|decimal:4\"\n                        :label=\"trans('admin::app.leads.common.products.total')\"\n                        :placeholder=\"trans('admin::app.leads.common.products.total')\"\n                        ::value-label=\"$admin.formatPrice((Number(product.price) || 0) * (Number(product.quantity) || 0))\"\n                        :allowEdit=\"false\"\n                        position=\"center\"\n                    />\n                </x-admin::form.control-group>\n            </x-admin::table.td>\n\n            <!-- Action -->\n            <x-admin::table.td class=\"text-right\">\n                <x-admin::form.control-group >\n                    <i\n                        @click=\"removeProduct\"\n                        class=\"icon-delete cursor-pointer text-2xl\"\n                    ></i>\n                </x-admin::form.control-group>\n            </x-admin::table.td>\n        </x-admin::table.thead.tr>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-product-list', {\n            template: '#v-product-list-template',\n\n            props: ['data'],\n\n            data: function () {\n                return {\n                    products: this.data ? this.data : [],\n                }\n            },\n\n            methods: {\n                addProduct() {\n                    this.products.push({\n                        id: null,\n                        product_id: null,\n                        name: '',\n                        quantity: 1,\n                        price: 0,\n                        amount: null,\n                    })\n                },\n\n                removeProduct (product) {\n                    const index = this.products.indexOf(product);\n                    this.products.splice(index, 1);\n                },\n            },\n        });\n\n        app.component('v-product-item', {\n            template: '#v-product-item-template',\n\n            props: ['index', 'product'],\n\n            data() {\n                return {\n                    products: [],\n                }\n            },\n\n            computed: {\n                inputName() {\n                    if (this.product.id) {\n                        return \"products[\" + this.product.id + \"]\";\n                    }\n\n                    return \"products[product_\" + this.index + \"]\";\n                },\n\n                src() {\n                    return '{{ route('admin.products.search') }}';\n                },\n\n                params() {\n                    return {\n                        params: {\n                            query: this.product.name,\n                        },\n                    };\n                },\n            },\n\n            methods: {\n                /**\n                 * Add the product.\n                 *\n                 * @param {Object} result\n                 *\n                 * @return {void}\n                 */\n                addProduct(result) {\n                    this.product.product_id = result.id;\n\n                    this.product.name = result.name;\n\n                    this.product.price = result.price;\n\n                    this.product.quantity = result.quantity ?? 1;\n                },\n\n                /**\n                 * Remove the product.\n                 *\n                 * @return {void}\n                 */\n                removeProduct () {\n                    this.$emit('onRemoveProduct', this.product)\n                }\n            }\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/create.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.leads.create.title')\n    </x-slot>\n\n    {!! view_render_event('admin.leads.create.form.before') !!}\n\n    <!-- Create Lead Form -->\n    <x-admin::form :action=\"route('admin.leads.store')\">\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    <x-admin::breadcrumbs name=\"leads.create\" />\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.leads.create.title')\n                    </div>\n                </div>\n\n                {!! view_render_event('admin.leads.create.save_button.before') !!}\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <!-- Save button for person -->\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.leads.create.form_buttons.before') !!}\n\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.leads.create.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.leads.create.form_buttons.after') !!}\n                    </div>\n                </div>\n\n                {!! view_render_event('admin.leads.create.save_button.after') !!}\n            </div>\n\n            @if (request('stage_id'))\n                <input\n                    type=\"hidden\"\n                    id=\"lead_pipeline_stage_id\"\n                    name=\"lead_pipeline_stage_id\"\n                    value=\"{{ request('stage_id') }}\"\n                />\n            @endif\n\n            @if (request('pipeline_id'))\n                <input\n                    type=\"hidden\"\n                    id=\"lead_pipeline_id\"\n                    name=\"lead_pipeline_id\"\n                    value=\"{{ request('pipeline_id') }}\"\n                />\n            @endif\n\n            <!-- Lead Create Component -->\n            <v-lead-create>\n                <x-admin::shimmer.leads.datagrid />\n            </v-lead-create>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.leads.create.form.after') !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-lead-create-template\"\n        >\n            <div class=\"box-shadow flex flex-col gap-4 rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                {!! view_render_event('admin.leads.edit.form_controls.before') !!}\n\n                <div class=\"flex w-full gap-2 border-b border-gray-200 dark:border-gray-800\">\n                    <!-- Tabs -->\n                    <template\n                        v-for=\"tab in tabs\"\n                        :key=\"tab.id\"\n                    >\n                        {!! view_render_event('admin.leads.create.tabs.before') !!}\n\n                        <a\n                            :href=\"'#' + tab.id\"\n                            :class=\"[\n                                'inline-block px-3 py-2.5 border-b-2  text-sm font-medium ',\n                                activeTab === tab.id\n                                ? 'text-brandColor border-brandColor dark:brandColor dark:brandColor'\n                                : 'text-gray-600 dark:text-gray-300  border-transparent hover:text-gray-800 hover:border-gray-400 dark:hover:border-gray-400  dark:hover:text-white'\n                            ]\"\n                            @click=\"scrollToSection(tab.id)\"\n                            :text=\"tab.label\"\n                        >\n                        </a>\n\n                        {!! view_render_event('admin.leads.create.tabs.after') !!}\n                    </template>\n                </div>\n\n                <div class=\"flex flex-col gap-4 px-4 py-2\">\n                    {!! view_render_event('admin.leads.create.details.before') !!}\n\n                    <!-- Details section -->\n                    <div\n                        class=\"flex flex-col gap-4\"\n                        id=\"lead-details\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.leads.create.details')\n                            </p>\n\n                            <p class=\"text-gray-600 dark:text-white\">\n                                @lang('admin::app.leads.create.details-info')\n                            </p>\n                        </div>\n\n                        <div class=\"w-1/2 max-md:w-full\">\n                            {!! view_render_event('admin.leads.create.details.attributes.before') !!}\n\n                            <!-- Lead Details Title and Description -->\n                            <x-admin::attributes\n                                :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                    ['code', 'NOTIN', ['lead_value', 'lead_type_id', 'lead_source_id', 'expected_close_date', 'user_id', 'lead_pipeline_id', 'lead_pipeline_stage_id']],\n                                    'entity_type' => 'leads',\n                                    'quick_add' => 1\n                                ])\"\n                                :custom-validations=\"[\n                                    'expected_close_date' => [\n                                        'date_format:yyyy-MM-dd',\n                                        'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                    ],\n                                ]\"\n                            />\n\n                            <!-- Lead Details Other input fields -->\n                            <div class=\"flex gap-4 max-sm:flex-wrap\">\n                                <div class=\"w-full\">\n                                    <x-admin::attributes\n                                        :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                            ['code', 'IN', ['lead_value', 'lead_type_id', 'lead_source_id']],\n                                            'entity_type' => 'leads',\n                                            'quick_add' => 1\n                                        ])\"\n                                        :custom-validations=\"[\n                                            'expected_close_date' => [\n                                                'date_format:yyyy-MM-dd',\n                                                'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                            ],\n                                        ]\"\n                                    />\n                                </div>\n\n                                <div class=\"w-full\">\n                                    <x-admin::attributes\n                                        :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                            ['code', 'IN', ['expected_close_date', 'user_id']],\n                                            'entity_type' => 'leads',\n                                            'quick_add' => 1\n                                        ])\"\n                                        :custom-validations=\"[\n                                            'expected_close_date' => [\n                                                'date_format:yyyy-MM-dd',\n                                                'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                            ],\n                                        ]\"\n                                    />\n                                </div>\n                            </div>\n\n                            {!! view_render_event('admin.leads.create.details.attributes.after') !!}\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.leads.create.details.after') !!}\n\n                    {!! view_render_event('admin.leads.create.contact_person.before') !!}\n\n                    <!-- Contact Person -->\n                    <div\n                        class=\"flex flex-col gap-4\"\n                        id=\"contact-person\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.leads.create.contact-person')\n                            </p>\n\n                            <p class=\"text-gray-600 dark:text-white\">\n                                @lang('admin::app.leads.create.contact-info')\n                            </p>\n                        </div>\n\n                        <div class=\"w-1/2 max-md:w-full\">\n                            <!-- Contact Person Component -->\n                            @include('admin::leads.common.contact')\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.leads.create.contact_person.after') !!}\n\n                    <!-- Product Section -->\n                    <div\n                        class=\"flex flex-col gap-4\"\n                        id=\"products\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.leads.create.products')\n                            </p>\n\n                            <p class=\"text-gray-600 dark:text-white\">\n                                @lang('admin::app.leads.create.products-info')\n                            </p>\n                        </div>\n\n                        <div>\n                            <!-- Product Component -->\n                            @include('admin::leads.common.products')\n                        </div>\n                    </div>\n                </div>\n\n                {!! view_render_event('admin.leads.form_controls.after') !!}\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-lead-create', {\n                template: '#v-lead-create-template',\n\n                data() {\n                    return {\n                        activeTab: 'lead-details',\n\n                        tabs: [\n                            { id: 'lead-details', label: '@lang('admin::app.leads.create.details')' },\n                            { id: 'contact-person', label: '@lang('admin::app.leads.create.contact-person')' },\n                            { id: 'products', label: '@lang('admin::app.leads.create.products')' }\n                        ],\n                    };\n                },\n\n                methods: {\n                    /**\n                     * Scroll to the section.\n                     *\n                     * @param {String} tabId\n                     *\n                     * @returns {void}\n                     */\n                    scrollToSection(tabId) {\n                        const section = document.getElementById(tabId);\n\n                        if (section) {\n                            section.scrollIntoView({ behavior: 'smooth' });\n                        }\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n\n    @pushOnce('styles')\n        <style>\n            html {\n                scroll-behavior: smooth;\n            }\n        </style>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/edit.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.leads.edit.title')\n    </x-slot>\n\n    {!! view_render_event('admin.leads.edit.form_controls.before', ['lead' => $lead]) !!}\n\n    <!-- Edit Lead Form -->\n    <x-admin::form         \n        :action=\"route('admin.leads.update', $lead->id)\"\n        method=\"PUT\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    <x-admin::breadcrumbs \n                        name=\"leads.edit\" \n                        :entity=\"$lead\"\n                    />\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.leads.edit.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.leads.edit.save_button.before', ['lead' => $lead]) !!}\n\n                    <!-- Save button for Editing Lead -->\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.leads.edit.form_buttons.before') !!}\n\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.leads.edit.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.leads.edit.form_buttons.after') !!}\n                    </div>\n\n                    {!! view_render_event('admin.leads.edit.save_button.after', ['lead' => $lead]) !!}\n                </div>\n            </div>\n\n            <input type=\"hidden\" id=\"lead_pipeline_stage_id\" name=\"lead_pipeline_stage_id\" value=\"{{ $lead->lead_pipeline_stage_id }}\" />\n\n            <!-- Lead Edit Component -->\n            <v-lead-edit :lead=\"{{ json_encode($lead) }}\">\n                <x-admin::shimmer.leads.datagrid />\n            </v-lead-edit>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.leads.edit.form_controls.after', ['lead' => $lead]) !!}\n\n    @pushOnce('scripts')\n        <script \n            type=\"text/x-template\"\n            id=\"v-lead-edit-template\"\n        >\n            <div class=\"box-shadow flex flex-col gap-4 rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                <div class=\"flex gap-2 border-b border-gray-200 dark:border-gray-800\">\n                    <!-- Tabs -->\n                    <template v-for=\"tab in tabs\" :key=\"tab.id\">\n                        {!! view_render_event('admin.leads.edit.tabs.before', ['lead' => $lead]) !!}\n\n                        <a\n                            :href=\"'#' + tab.id\"\n                            :class=\"[\n                                'inline-block px-3 py-2.5 border-b-2  text-sm font-medium ',\n                                activeTab === tab.id\n                                ? 'text-brandColor border-brandColor dark:brandColor dark:brandColor'\n                                : 'text-gray-600 dark:text-gray-300  border-transparent hover:text-gray-800 hover:border-gray-400 dark:hover:border-gray-400  dark:hover:text-white'\n                            ]\"\n                            @click=\"scrollToSection(tab.id)\"\n                            :text=\"tab.label\"\n                        ></a>\n\n                        {!! view_render_event('admin.leads.edit.tabs.after', ['lead' => $lead]) !!}\n                    </template>\n                </div>\n\n                <div class=\"flex flex-col gap-4 px-4 py-2\">\n                    {!! view_render_event('admin.leads.edit.lead_details.before', ['lead' => $lead]) !!}\n\n                    <!-- Details section -->\n                    <div \n                        class=\"flex flex-col gap-4\" \n                        id=\"lead-details\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.leads.edit.details')\n                            </p>\n\n                            <p class=\"text-gray-600 dark:text-white\">\n                                @lang('admin::app.leads.edit.details-info')\n                            </p>\n                        </div>\n\n                        <div class=\"w-1/2 max-md:w-full\">\n                            {!! view_render_event('admin.leads.edit.lead_details.attributes.before', ['lead' => $lead]) !!}\n\n                            <!-- Lead Details Title and Description -->\n                            <x-admin::attributes\n                                :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                    ['code', 'NOTIN', ['lead_value', 'lead_type_id', 'lead_source_id', 'expected_close_date', 'user_id', 'lead_pipeline_id', 'lead_pipeline_stage_id']],\n                                    'entity_type' => 'leads',\n                                    'quick_add' => 1\n                                ])\"\n                                :custom-validations=\"[\n                                    'expected_close_date' => [\n                                        'date_format:yyyy-MM-dd',\n                                        'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                    ],\n                                ]\"\n                                :entity=\"$lead\"\n                            />\n\n                            <!-- Lead Details Other input fields -->\n                            <div class=\"flex gap-4 max-sm:flex-wrap\">\n                                <div class=\"w-full\">\n                                    <x-admin::attributes\n                                        :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                            ['code', 'IN', ['lead_value', 'lead_type_id', 'lead_source_id']],\n                                            'entity_type' => 'leads',\n                                            'quick_add' => 1\n                                        ])\"\n                                        :custom-validations=\"[\n                                            'expected_close_date' => [\n                                                'date_format:yyyy-MM-dd',\n                                                'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                            ],\n                                        ]\"\n                                        :entity=\"$lead\"\n                                    />\n                                </div>\n                                    \n                                <div class=\"w-full\">\n                                    <x-admin::attributes\n                                        :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                            ['code', 'IN', ['expected_close_date', 'user_id']],\n                                            'entity_type' => 'leads',\n                                            'quick_add' => 1\n                                        ])\"\n                                        :custom-validations=\"[\n                                            'expected_close_date' => [\n                                                'date_format:yyyy-MM-dd',\n                                                'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                            ],\n                                        ]\"\n                                        :entity=\"$lead\"\n                                        />\n                                </div>\n                            </div>\n\n                            {!! view_render_event('admin.leads.edit.lead_details.attributes.after', ['lead' => $lead]) !!}\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.leads.edit.lead_details.after', ['lead' => $lead]) !!}\n\n                    {!! view_render_event('admin.leads.edit.contact_person.before', ['lead' => $lead]) !!}\n\n                    <!-- Contact Person -->\n                    <div \n                        class=\"flex flex-col gap-4\" \n                        id=\"contact-person\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.leads.edit.contact-person')\n                            </p>\n\n                            <p class=\"text-gray-600 dark:text-white\">\n                                @lang('admin::app.leads.edit.contact-info')\n                            </p>\n                        </div>\n\n                        <div class=\"w-1/2 max-md:w-full\">\n                            <!-- Contact Person Component -->\n                            @include('admin::leads.common.contact')\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.leads.edit.contact_person.after', ['lead' => $lead]) !!}\n\n                    {!! view_render_event('admin.leads.edit.contact_person.products.before', ['lead' => $lead]) !!}\n\n                    <!-- Product Section -->\n                    <div \n                        class=\"flex flex-col gap-4\" \n                        id=\"products\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.leads.edit.products')\n                            </p>\n\n                            <p class=\"text-gray-600 dark:text-white\">\n                                @lang('admin::app.leads.edit.products-info')\n                            </p>\n                        </div>\n\n                        <div>\n                            <!-- Product Component -->\n                            @include('admin::leads.common.products')\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.leads.edit.contact_person.products.after', ['lead' => $lead]) !!}\n                </div>\n                \n                {!! view_render_event('admin.leads.form_controls.after') !!}\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-lead-edit', {\n                template: '#v-lead-edit-template',\n\n                data() {\n                    return {\n                        activeTab: 'lead-details',\n                        \n                        lead:  @json($lead),  \n\n                        person:  @json($lead->person),  \n\n                        products: @json($lead->products),\n\n                        tabs: [\n                            { id: 'lead-details', label: '@lang('admin::app.leads.edit.details')' },\n                            { id: 'contact-person', label: '@lang('admin::app.leads.edit.contact-person')' },\n                            { id: 'products', label: '@lang('admin::app.leads.edit.products')' }\n                        ],\n                    };\n                },\n\n                methods: {\n                    /**\n                     * Scroll to the section.\n                     * \n                     * @param {String} tabId\n                     * \n                     * @returns {void}\n                     */\n                    scrollToSection(tabId) {\n                        const section = document.getElementById(tabId);\n\n                        if (section) {\n                            section.scrollIntoView({ behavior: 'smooth' });\n                        }\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n\n    @pushOnce('styles')\n        <style>\n            html {\n                scroll-behavior: smooth;\n            }\n        </style>\n    @endPushOnce    \n</x-admin::layouts>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/index/kanban/filter.blade.php",
    "content": "{!! view_render_event('admin.leads.index.kanban.filter.before') !!}\n\n<v-kanban-filter\n    :is-loading=\"isLoading\"\n    :available=\"available\"\n    :applied=\"applied\"\n    @applyFilters=\"filter\"\n>\n</v-kanban-filter>\n\n{!! view_render_event('admin.leads.index.kanban.filter.after') !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-kanban-filter-template\"\n    >\n        {!! view_render_event('admin.leads.index.kanban.filter.drawer.before') !!}\n\n        <x-admin::drawer\n            width=\"350px\"\n            ref=\"kanbanFilterDrawer\"\n        >\n            <!-- Drawer Toggler -->\n            <x-slot:toggle>\n                {!! view_render_event('admin.leads.index.kanban.filter.drawer.toggle_button.before') !!}\n\n                <div class=\"relative flex cursor-pointer items-center rounded-md bg-sky-100 px-4 py-[9px] font-semibold text-sky-600 dark:bg-brandColor dark:text-white\">\n                    @lang('admin::app.leads.index.kanban.toolbar.filters.filter')\n\n                    <span\n                        class=\"absolute right-2 top-2 h-1.5 w-1.5 rounded-full bg-sky-600 dark:bg-white\"\n                        v-if=\"hasAnyAppliedColumn()\"\n                    >\n                    </span>\n                </div>\n\n                {!! view_render_event('admin.leads.index.kanban.filter.drawer.toggle_button.after') !!}\n            </x-slot>\n\n            <!-- Drawer Header -->\n            <x-slot:header class=\"p-3.5\">\n                {!! view_render_event('admin.leads.index.kanban.filter.drawer.header.title.before') !!}\n\n                <div class=\"grid gap-3\">\n                    <div class=\"flex items-center justify-between\">\n                        <p class=\"text-xl font-semibold dark:text-white\">\n                            @lang('admin::app.leads.index.kanban.toolbar.filters.filters')\n                        </p>\n                    </div>\n                </div>\n\n                {!! view_render_event('admin.leads.index.kanban.filter.drawer.header.title.after') !!}\n            </x-slot>\n\n            <!-- Drawer Content -->\n            <x-slot:content>\n                {!! view_render_event('admin.leads.index.kanban.filter.drawer.content.before') !!}\n\n                <div>\n                    <div v-for=\"column in available.columns\">\n                        <div v-if=\"column.filterable\">\n                            <!-- Boolean -->\n                            <div v-if=\"column.type === 'boolean'\">\n                                <!-- Dropdown -->\n                                <template v-if=\"column.filterable_type === 'dropdown'\">\n                                    <div class=\"flex items-center justify-between\">\n                                        <p\n                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                            v-text=\"column.label\"\n                                        >\n                                        </p>\n\n                                        <div\n                                            class=\"flex items-center gap-x-1.5\"\n                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                        >\n                                            <p\n                                                class=\"cursor-pointer text-xs font-medium leading-6 text-brandColor\"\n                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                            >\n                                                @lang('admin::app.leads.index.kanban.toolbar.filters.clear-all')\n                                            </p>\n                                        </div>\n                                    </div>\n\n                                    <div class=\"mb-2 mt-1.5\">\n                                        <x-admin::dropdown>\n                                            <x-slot:toggle>\n                                                <button\n                                                    type=\"button\"\n                                                    class=\"inline-flex w-full cursor-pointer appearance-none items-center justify-between gap-x-2 rounded-md border bg-white px-2.5 py-1.5 text-center leading-6 text-gray-600 transition-all marker:shadow hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                                >\n                                                    <!-- If Allow Multiple Values -->\n                                                    <span\n                                                        class=\"text-sm text-gray-400 dark:text-gray-400\"\n                                                        v-text=\"'@lang('admin::app.leads.index.kanban.toolbar.filters.select')'\"\n                                                        v-if=\"column.allow_multiple_values\"\n                                                    >\n                                                    </span>\n\n                                                    <!-- If Allow Single Value -->\n                                                    <span\n                                                        class=\"text-sm text-gray-400 dark:text-gray-400\"\n                                                        v-text=\"column.filterable_options.find((option => option.value === getAppliedColumnValues(column.index)))?.label ?? '@lang('admin::app.leads.index.kanban.toolbar.filters.select')'\"\n                                                        v-else\n                                                    >\n                                                    </span>\n\n                                                    <span class=\"icon-down-arrow text-2xl\"></span>\n                                                </button>\n                                            </x-slot>\n\n                                            <x-slot:menu>\n                                                <x-admin::dropdown.menu.item\n                                                    v-for=\"option in column.filterable_options\"\n                                                    v-text=\"option.label\"\n                                                    @click=\"addFilter(option.value, column)\"\n                                                >\n                                                </x-admin::dropdown.menu.item>\n                                            </x-slot>\n                                        </x-admin::dropdown>\n                                    </div>\n\n                                    <div class=\"mb-4 flex flex-wrap gap-2\">\n                                        <!-- If Allow Multiple Values -->\n                                        <template v-if=\"column.allow_multiple_values\">\n                                            <p\n                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                v-for=\"appliedColumnValue in getAppliedColumnValues(column.index)\"\n                                            >\n                                                <!-- Retrieving the label from the options based on the applied column value. -->\n                                                <span v-text=\"column.filterable_options.find((option => option.value == appliedColumnValue)).label\"></span>\n\n                                                <span\n                                                    class=\"icon-cross-large-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                    @click=\"removeAppliedColumnValue(column.index, appliedColumnValue)\"\n                                                >\n                                                </span>\n                                            </p>\n                                        </template>\n                                    </div>\n                                </template>\n\n                                <!-- Basic (If Needed) -->\n                                <template v-else></template>\n                            </div>\n\n                            <!-- Date -->\n                            <div v-else-if=\"column.type === 'date'\">\n                                <!-- Range -->\n                                <template v-if=\"column.filterable_type === 'date_range'\">\n                                    <div class=\"flex items-center justify-between\">\n                                        <p\n                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                            v-text=\"column.label\"\n                                        >\n                                        </p>\n\n                                        <div\n                                            class=\"flex items-center gap-x-1.5\"\n                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                        >\n                                            <p\n                                                class=\"cursor-pointer text-xs font-medium leading-6 text-brandColor\"\n                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                            >\n                                                @lang('admin::app.leads.index.kanban.toolbar.filters.clear-all')\n                                            </p>\n                                        </div>\n                                    </div>\n\n                                    <div class=\"mt-1.5 grid grid-cols-2 gap-1.5\">\n                                        <p\n                                            class=\"cursor-pointer rounded-md border px-3 py-2 text-center text-sm font-medium leading-6 text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:text-gray-300 dark:hover:border-gray-400\"\n                                            v-for=\"option in column.filterable_options\"\n                                            v-text=\"option.label\"\n                                            @click=\"addFilter(\n                                                $event,\n                                                column,\n                                                { quickFilter: { isActive: true, selectedFilter: option } }\n                                            )\"\n                                        >\n                                        </p>\n\n                                        <x-admin::flat-picker.date ::allow-input=\"false\">\n                                            <input\n                                                type=\"date\"\n                                                :name=\"`${column.index}[from]`\"\n                                                value=\"\"\n                                                class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 ltr:pr-8 rtl:pl-8\"\n                                                placeholder=\"@lang('admin::app.leads.index.kanban.toolbar.filters.from')\"\n                                                :ref=\"`${column.index}[from]`\"\n                                                @change=\"addFilter(\n                                                    $event,\n                                                    column,\n                                                    { range: { name: 'from' }, quickFilter: { isActive: false } }\n                                                )\"\n                                            />\n                                        </x-admin::flat-picker.date>\n\n                                        <x-admin::flat-picker.date ::allow-input=\"false\">\n                                            <input\n                                                type=\"date\"\n                                                :name=\"`${column.index}[to]`\"\n                                                value=\"\"\n                                                class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 ltr:pr-8 rtl:pl-8\"\n                                                placeholder=\"@lang('admin::app.leads.index.kanban.toolbar.filters.to')\"\n                                                :ref=\"`${column.index}[from]`\"\n                                                @change=\"addFilter(\n                                                    $event,\n                                                    column,\n                                                    { range: { name: 'to' }, quickFilter: { isActive: false } }\n                                                )\"\n                                            />\n                                        </x-admin::flat-picker.date>\n\n                                        <div class=\"mb-4 flex flex-wrap gap-2\">\n                                            <p\n                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                v-if=\"findAppliedColumn(column.index)\"\n                                            >\n                                                <span>\n                                                    @{{ getFormattedDates(findAppliedColumn(column.index)) }}\n                                                </span>\n\n                                                <span\n                                                    class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                    @click=\"removeAppliedColumnValue(column.index)\"\n                                                >\n                                                </span>\n                                            </p>\n                                        </div>\n                                    </div>\n                                </template>\n\n                                <!-- Basic -->\n                                <template v-else>\n                                    <div class=\"flex items-center justify-between\">\n                                        <p\n                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                            v-text=\"column.label\"\n                                        >\n                                        </p>\n\n                                        <div\n                                            class=\"flex items-center gap-x-1.5\"\n                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                        >\n                                            <p\n                                                class=\"cursor-pointer text-xs font-medium leading-6 text-brandColor\"\n                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                            >\n                                                @lang('admin::app.leads.index.kanban.toolbar.filters.clear-all')\n                                            </p>\n                                        </div>\n                                    </div>\n\n                                    <div class=\"mt-1.5 grid\">\n                                        <x-admin::flat-picker.date ::allow-input=\"false\">\n                                            <input\n                                                type=\"date\"\n                                                :name=\"column.index\"\n                                                value=\"\"\n                                                class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                                :placeholder=\"column.label\"\n                                                :ref=\"column.index\"\n                                                @change=\"addFilter($event, column)\"\n                                            />\n                                        </x-admin::flat-picker.date>\n\n                                        <div class=\"mb-4 flex flex-wrap gap-2\">\n                                            <p\n                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                v-if=\"findAppliedColumn(column.index)\"\n                                            >\n                                                <span>\n                                                    @{{ getFormattedDates(findAppliedColumn(column.index)) }}\n                                                </span>\n\n                                                <span\n                                                    class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                    @click=\"removeAppliedColumnValue(column.index)\"\n                                                >\n                                                </span>\n                                            </p>\n                                        </div>\n                                    </div>\n                                </template>\n                            </div>\n\n                            <!-- Date Time -->\n                            <div v-else-if=\"column.type === 'datetime'\">\n                                <!-- Range -->\n                                <template v-if=\"column.filterable_type === 'datetime_range'\">\n                                    <div class=\"flex items-center justify-between\">\n                                        <p\n                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                            v-text=\"column.label\"\n                                        >\n                                        </p>\n\n                                        <div\n                                            class=\"flex items-center gap-x-1.5\"\n                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                        >\n                                            <p\n                                                class=\"cursor-pointer text-xs font-medium leading-6 text-brandColor\"\n                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                            >\n                                                @lang('admin::app.leads.index.kanban.toolbar.filters.clear-all')\n                                            </p>\n                                        </div>\n                                    </div>\n\n                                    <div class=\"my-4 grid grid-cols-2 gap-1.5\">\n                                        <p\n                                            class=\"cursor-pointer rounded-md border px-3 py-2 text-center text-sm font-medium leading-6 text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:text-gray-300 dark:hover:border-gray-400\"\n                                            v-for=\"option in column.filterable_options\"\n                                            v-text=\"option.label\"\n                                            @click=\"addFilter(\n                                                $event,\n                                                column,\n                                                { quickFilter: { isActive: true, selectedFilter: option } }\n                                            )\"\n                                        >\n                                        </p>\n\n                                        <x-admin::flat-picker.datetime ::allow-input=\"false\">\n                                            <input\n                                                type=\"datetime-local\"\n                                                :name=\"`${column.index}[from]`\"\n                                                value=\"\"\n                                                class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                                placeholder=\"@lang('admin::app.leads.index.kanban.toolbar.filters.from')\"\n                                                :ref=\"`${column.index}[from]`\"\n                                                @change=\"addFilter(\n                                                    $event,\n                                                    column,\n                                                    { range: { name: 'from' }, quickFilter: { isActive: false } }\n                                                )\"\n                                            />\n                                        </x-admin::flat-picker.datetime>\n\n                                        <x-admin::flat-picker.datetime ::allow-input=\"false\">\n                                            <input\n                                                type=\"datetime-local\"\n                                                :name=\"`${column.index}[to]`\"\n                                                value=\"\"\n                                                class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                                placeholder=\"@lang('admin::app.leads.index.kanban.toolbar.filters.to')\"\n                                                :ref=\"`${column.index}[from]`\"\n                                                @change=\"addFilter(\n                                                    $event,\n                                                    column,\n                                                    { range: { name: 'to' }, quickFilter: { isActive: false } }\n                                                )\"\n                                            />\n                                        </x-admin::flat-picker.datetime>\n\n                                        <div class=\"mb-4 flex flex-wrap gap-2\">\n                                            <p\n                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                v-if=\"findAppliedColumn(column.index)\"\n                                            >\n                                                <span>\n                                                    @{{ getFormattedDates(findAppliedColumn(column.index)) }}\n                                                </span>\n\n                                                <span\n                                                    class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                    @click=\"removeAppliedColumnValue(column.index)\"\n                                                >\n                                                </span>\n                                            </p>\n                                        </div>\n                                    </div>\n                                </template>\n\n                                <!-- Basic -->\n                                <template v-else>\n                                    <div class=\"flex items-center justify-between\">\n                                        <p\n                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                            v-text=\"column.label\"\n                                        >\n                                        </p>\n\n                                        <div\n                                            class=\"flex items-center gap-x-1.5\"\n                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                        >\n                                            <p\n                                                class=\"cursor-pointer text-xs font-medium leading-6 text-brandColor\"\n                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                            >\n                                                @lang('admin::app.leads.index.kanban.toolbar.filters.clear-all')\n                                            </p>\n                                        </div>\n                                    </div>\n\n                                    <div class=\"my-4 grid\">\n                                        <x-admin::flat-picker.datetime ::allow-input=\"false\">\n                                            <input\n                                                type=\"datetime-local\"\n                                                :name=\"column.index\"\n                                                value=\"\"\n                                                class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                                :placeholder=\"column.label\"\n                                                :ref=\"column.index\"\n                                                @change=\"addFilter($event, column)\"\n                                            />\n                                        </x-admin::flat-picker.datetime>\n\n                                        <div class=\"mb-4 flex flex-wrap gap-2\">\n                                            <p\n                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                v-if=\"findAppliedColumn(column.index)\"\n                                            >\n                                                <span>\n                                                    @{{ getFormattedDates(findAppliedColumn(column.index)) }}\n                                                </span>\n\n                                                <span\n                                                    class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                    @click=\"removeAppliedColumnValue(column.index)\"\n                                                >\n                                                </span>\n                                            </p>\n                                        </div>\n                                    </div>\n                                </template>\n                            </div>\n\n                            <!-- Rest -->\n                            <div v-else>\n                                <!-- Dropdown -->\n                                <template v-if=\"column.filterable_type === 'dropdown'\">\n                                    <div class=\"flex items-center justify-between\">\n                                        <p\n                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                            v-text=\"column.label\"\n                                        >\n                                        </p>\n\n                                        <div\n                                            class=\"flex items-center gap-x-1.5\"\n                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                        >\n                                            <p\n                                                class=\"cursor-pointer text-xs font-medium leading-6 text-brandColor\"\n                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                            >\n                                                @lang('admin::app.leads.index.kanban.toolbar.filters.clear-all')\n                                            </p>\n                                        </div>\n                                    </div>\n\n                                    <div class=\"mb-2 mt-1.5\">\n                                        <x-admin::dropdown>\n                                            <x-slot:toggle>\n                                                <button\n                                                    type=\"button\"\n                                                    class=\"inline-flex w-full cursor-pointer appearance-none items-center justify-between gap-x-2 rounded-md border bg-white px-2.5 py-1.5 text-center leading-6 text-gray-600 transition-all marker:shadow hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                                >\n                                                    <!-- If Allow Multiple Values -->\n                                                    <span\n                                                        class=\"text-sm text-gray-400 dark:text-gray-400\"\n                                                        v-text=\"'@lang('admin::app.leads.index.kanban.toolbar.filters.select')'\"\n                                                        v-if=\"column.allow_multiple_values\"\n                                                    >\n                                                    </span>\n\n                                                    <!-- If Allow Single Value -->\n                                                    <span\n                                                        class=\"text-sm text-gray-400 dark:text-gray-400\"\n                                                        v-text=\"column.filterable_options.find((option => option.value === getAppliedColumnValues(column.index)))?.label ?? '@lang('admin::app.leads.index.kanban.toolbar.filters.select')'\"\n                                                        v-else\n                                                    >\n                                                    </span>\n\n                                                    <span class=\"icon-down-arrow text-2xl\"></span>\n                                                </button>\n                                            </x-slot>\n\n                                            <x-slot:menu>\n                                                <x-admin::dropdown.menu.item\n                                                    v-for=\"option in column.filterable_options\"\n                                                    v-text=\"option.label\"\n                                                    @click=\"addFilter(option.value, column)\"\n                                                >\n                                                </x-admin::dropdown.menu.item>\n                                            </x-slot>\n                                        </x-admin::dropdown>\n                                    </div>\n\n                                    <div class=\"mb-4 flex flex-wrap gap-2\">\n                                        <!-- If Allow Multiple Values -->\n                                        <template v-if=\"column.allow_multiple_values\">\n                                            <p\n                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                v-for=\"appliedColumnValue in getAppliedColumnValues(column.index)\"\n                                            >\n                                                <!-- Retrieving the label from the options based on the applied column value. -->\n                                                <span v-text=\"column.filterable_options.find((option => option.value == appliedColumnValue)).label\"></span>\n\n                                                <span\n                                                    class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                    @click=\"removeAppliedColumnValue(column.index, appliedColumnValue)\"\n                                                >\n                                                </span>\n                                            </p>\n                                        </template>\n                                    </div>\n                                </template>\n\n                                <template v-else-if=\"column.filterable_type === 'searchable_dropdown'\">\n                                    <div class=\"flex items-center justify-between\">\n                                        <p\n                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                            v-text=\"column.label\"\n                                        >\n                                        </p>\n\n                                        <div\n                                            class=\"flex items-center gap-x-1.5\"\n                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                        >\n                                            <p\n                                                class=\"cursor-pointer text-xs font-medium leading-6 text-blue-600\"\n                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                            >\n                                                @lang('admin::app.components.datagrid.filters.custom-filters.clear-all')\n                                            </p>\n                                        </div>\n                                    </div>\n\n                                    <div class=\"mb-2 mt-1.5\">\n                                        <v-kanban-searchable-dropdown\n                                            :column=\"column\"\n                                            @select-option=\"addFilter($event.target.value, column);\"\n                                        >\n                                        </v-kanban-searchable-dropdown>\n                                    </div>\n\n                                    <div class=\"mb-4 flex flex-wrap gap-2\">\n                                        <p\n                                            class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                            v-for=\"appliedColumnValue in getAppliedColumnValues(column.index)\"\n                                        >\n                                            <span v-text=\"appliedColumnValue.label\"></span>\n\n                                            <span\n                                                class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                @click=\"removeAppliedColumnValue(column.index, appliedColumnValue)\"\n                                            >\n                                            </span>\n                                        </p>\n                                    </div>\n                                </template>\n\n                                <!-- Basic -->\n                                <template v-else>\n                                    <div class=\"flex items-center justify-between\">\n                                        <p\n                                            class=\"text-xs font-medium text-gray-800 dark:text-white\"\n                                            v-text=\"column.label\"\n                                        >\n                                        </p>\n\n                                        <div\n                                            class=\"flex items-center gap-x-1.5\"\n                                            @click=\"removeAppliedColumnAllValues(column.index)\"\n                                        >\n                                            <p\n                                                class=\"cursor-pointer text-xs font-medium leading-6 text-brandColor\"\n                                                v-if=\"hasAnyAppliedColumnValues(column.index)\"\n                                            >\n                                                @lang('admin::app.leads.index.kanban.toolbar.filters.clear-all')\n                                            </p>\n                                        </div>\n                                    </div>\n\n                                    <div class=\"mb-2 mt-1.5 grid\">\n                                        <input\n                                            type=\"text\"\n                                            class=\"block w-full rounded-md border bg-white px-2 py-1.5 text-sm leading-6 text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                            :name=\"column.index\"\n                                            :placeholder=\"column.label\"\n                                            @keyup.enter=\"addFilter($event, column)\"\n                                        />\n                                    </div>\n\n                                    <div class=\"mb-4 flex flex-wrap gap-2\">\n                                        <!-- If Allow Multiple Values -->\n                                        <template v-if=\"column.allow_multiple_values\">\n                                            <p\n                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                v-for=\"appliedColumnValue in getAppliedColumnValues(column.index)\"\n                                            >\n                                                <span v-text=\"appliedColumnValue\"></span>\n\n                                                <span\n                                                    class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                    @click=\"removeAppliedColumnValue(column.index, appliedColumnValue)\"\n                                                >\n                                                </span>\n                                            </p>\n                                        </template>\n\n                                        <!-- If Allow Single Value -->\n                                        <template v-else>\n                                            <p\n                                                class=\"flex items-center rounded bg-gray-600 px-2 py-1 font-semibold text-white\"\n                                                v-if=\"getAppliedColumnValues(column.index) !== ''\"\n                                            >\n                                                <span v-text=\"getAppliedColumnValues(column.index)\"></span>\n\n                                                <span\n                                                    class=\"icon-cross-large cursor-pointer text-lg text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                                    @click=\"removeAppliedColumnValue(column.index, getAppliedColumnValues(column.index))\"\n                                                >\n                                                </span>\n                                            </p>\n                                        </template>\n                                    </div>\n                                </template>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n\n                {!! view_render_event('admin.leads.index.kanban.filter.drawer.content.after') !!}\n            </x-slot:content>\n\n            <!-- Drawer Footer -->\n            <x-slot:footer class=\"!pb-3\">\n                {!! view_render_event('admin.leads.index.kanban.filter.drawer.footer.before') !!}\n\n                <div class=\"flex justify-end gap-2 px-2 pt-3\">\n                    <!-- Apply Filter Button -->\n                    <button\n                        type=\"button\"\n                        class=\"primary-button\"\n                        @click=\"applyFilters\"\n                    >\n                        @lang('admin::app.leads.index.kanban.toolbar.filters.apply-filters')\n                    </button>\n                </div>\n\n                {!! view_render_event('admin.leads.index.kanban.filter.drawer.footer.after') !!}\n            </x-slot>\n        </x-admin::drawer>\n\n        {!! view_render_event('admin.leads.index.kanban.filter.drawer.after') !!}\n    </script>\n\n    <script type=\"module\">\n        app.component('v-kanban-filter', {\n            template: '#v-kanban-filter-template',\n\n            props: ['isLoading', 'available', 'applied'],\n\n            emits: ['applyFilters'],\n\n            data() {\n                return {\n                    filters: {\n                        columns: [],\n                    },\n                };\n            },\n\n            mounted() {\n                this.filters.columns = this.getAppliedColumns();\n            },\n\n            methods: {\n                /**\n                 * Get applied columns.\n                 *\n                 * @returns {object}\n                 */\n                getAppliedColumns() {\n                    return this.applied.filters.columns.filter((column) => column.index !== 'all');\n                },\n\n                /**\n                 * Has any applied column.\n                 *\n                 * @returns {boolean}\n                 */\n                hasAnyAppliedColumn() {\n                    return this.getAppliedColumns().length > 0;\n                },\n\n                /**\n                 * Apply all added filters.\n                 *\n                 * @returns {void}\n                 */\n                applyFilters() {\n                    this.$emit('applyFilters', this.filters);\n\n                    this.$refs.kanbanFilterDrawer.close();\n                },\n\n                /**\n                 * Add filter.\n                 *\n                 * @param {Event} $event\n                 * @param {object} column\n                 * @param {object} additional\n                 * @returns {void}\n                 */\n                addFilter($event, column = null, additional = {}) {\n                    let quickFilter = additional?.quickFilter;\n\n                    if (quickFilter?.isActive) {\n                        let options = quickFilter.selectedFilter;\n\n                        switch (column.type) {\n                            case 'date':\n                            case 'datetime':\n                                this.applyColumnValues(column, options.name);\n\n                                break;\n\n                            default:\n                                break;\n                        }\n                    } else {\n                        /**\n                         * Here, either a real event will come or a string value. If a string value is present, then\n                         * we create a similar event-like structure to avoid any breakage and make it easy to use.\n                         */\n                        if ($event?.target?.value === undefined) {\n                            $event = {\n                                target: {\n                                    value: $event,\n                                }\n                            };\n                        }\n\n                        this.applyColumnValues(column, $event.target.value, additional);\n\n                        if (column) {\n                            $event.target.value = '';\n                        }\n                    }\n                },\n\n                /**\n                 * Apply column values.\n                 *\n                 * @param {object} column\n                 * @param {string} requestedValue\n                 * @param {object} additional\n                 * @returns {void}\n                 */\n                applyColumnValues(column, requestedValue, additional = {}) {\n                    let appliedColumn = this.findAppliedColumn(column?.index);\n\n                    if (\n                        requestedValue === undefined ||\n                        requestedValue === '' ||\n                        (appliedColumn?.allow_multiple_values && appliedColumn?.value.includes(requestedValue)) ||\n                        (! appliedColumn?.allow_multiple_values && appliedColumn?.value === requestedValue)\n                    ) {\n                        return;\n                    }\n\n                    switch (column.type) {\n                        case 'date':\n                        case 'datetime':\n                            let { range } = additional;\n\n                            if (appliedColumn) {\n                                if (range) {\n                                    let appliedRanges = ['', ''];\n\n                                    if (typeof appliedColumn.value !== 'string') {\n                                        appliedRanges = appliedColumn.value[0];\n                                    }\n\n                                    if (range.name == 'from') {\n                                        appliedRanges[0] = requestedValue;\n                                    }\n\n                                    if (range.name == 'to') {\n                                        appliedRanges[1] = requestedValue;\n                                    }\n\n                                    appliedColumn.value = [appliedRanges];\n                                } else {\n                                    appliedColumn.value = requestedValue;\n                                }\n                            } else {\n                                if (range) {\n                                    let appliedRanges = ['', ''];\n\n                                    if (range.name == 'from') {\n                                        appliedRanges[0] = requestedValue;\n                                    }\n\n                                    if (range.name == 'to') {\n                                        appliedRanges[1] = requestedValue;\n                                    }\n\n                                    this.filters.columns.push({\n                                        ...column,\n                                        value: [appliedRanges]\n                                    });\n                                } else {\n                                    this.filters.columns.push({\n                                        ...column,\n                                        value: requestedValue\n                                    });\n                                }\n                            }\n\n                            break;\n\n                        default:\n                            if (appliedColumn) {\n                                if (appliedColumn.allow_multiple_values) {\n                                    appliedColumn.value.push(requestedValue);\n                                } else {\n                                    appliedColumn.value = requestedValue;\n                                }\n                            } else {\n                                this.filters.columns.push({\n                                    ...column,\n                                    value: column.allow_multiple_values ? [requestedValue] : requestedValue,\n                                });\n                            }\n\n                            break;\n                    }\n                },\n\n                /**\n                 * Get formatted dates.\n                 *\n                 * @param {object} appliedColumn\n                 * @returns {string}\n                 */\n                getFormattedDates(appliedColumn)\n                {\n                    if (! appliedColumn) {\n                        return '';\n                    }\n\n                    if (typeof appliedColumn.value === 'string') {\n                        const availableColumn = this.available.columns.find(column => column.index === appliedColumn.index);\n\n                        if (availableColumn.filterable_type === 'date_range' || availableColumn.filterable_type === 'datetime_range') {\n                            const option = availableColumn.filterable_options.find(option => option.name === appliedColumn.value);\n\n                            return option.label;\n                        }\n\n                        return appliedColumn.value;\n                    }\n\n                    if (! appliedColumn.value.length) {\n                        return '';\n                    }\n\n                    return appliedColumn.value[0].join(' to ');\n                },\n\n                /**\n                 * Check if any values are applied for the specified column.\n                 *\n                 * @param {object} column\n                 * @returns {boolean}\n                 */\n                hasAnyValue(column) {\n                    if (column.allow_multiple_values) {\n                        return column.value.length > 0;\n                    }\n\n                    return column.value !== '';\n                },\n\n                /**\n                 * Find applied column.\n                 *\n                 * @param {string} columnIndex\n                 * @returns {object}\n                 */\n                findAppliedColumn(columnIndex) {\n                    return this.filters.columns.find(column => column.index === columnIndex);\n                },\n\n                /**\n                 * Check if any values are applied for the specified column.\n                 *\n                 * @param {string} columnIndex\n                 * @returns {boolean}\n                 */\n                hasAnyAppliedColumnValues(columnIndex) {\n                    let appliedColumn = this.findAppliedColumn(columnIndex);\n\n                    if (! appliedColumn) {\n                        return false;\n                    }\n\n                    return this.hasAnyValue(appliedColumn);\n                },\n\n                /**\n                 * Get applied values for the specified column.\n                 *\n                 * @param {string} columnIndex\n                 * @returns {Array}\n                 */\n                getAppliedColumnValues(columnIndex) {\n                    const appliedColumn = this.findAppliedColumn(columnIndex);\n\n                    if (appliedColumn?.allow_multiple_values) {\n                        return appliedColumn?.value ?? [];\n                    }\n\n                    return appliedColumn?.value ?? '';\n                },\n\n                /**\n                 * Remove a specific value from the applied values of the specified column.\n                 *\n                 * @param {string} columnIndex\n                 * @param {any} appliedColumnValue\n                 * @returns {void}\n                 */\n                removeAppliedColumnValue(columnIndex, appliedColumnValue) {\n                    let appliedColumn = this.findAppliedColumn(columnIndex);\n\n                    if (appliedColumn?.type === 'date' || appliedColumn?.type === 'datetime') {\n                        appliedColumn.value = [];\n                    } else {\n                        if (appliedColumn.allow_multiple_values) {\n                            appliedColumn.value = appliedColumn?.value.filter(value => value !== appliedColumnValue);\n                        } else {\n                            appliedColumn.value = '';\n                        }\n                    }\n\n                    /**\n                     * Clean up is done here. If there are no applied values present, there is no point in including the applied column as well.\n                     */\n                    if (! appliedColumn.value.length) {\n                        this.filters.columns = this.filters.columns.filter(column => column.index !== columnIndex);\n                    }\n                },\n\n                /**\n                 * Remove all values from the applied values of the specified column.\n                 *\n                 * @param {string} columnIndex\n                 * @returns {void}\n                 */\n                removeAppliedColumnAllValues(columnIndex) {\n                    this.filters.columns = this.filters.columns.filter(column => column.index !== columnIndex);\n                },\n            },\n        });\n    </script>\n\n    <script\n        type=\"text/x-template\"\n        id=\"v-kanban-searchable-dropdown-template\"\n    >\n        <x-admin::dropdown ::close-on-click=\"false\">\n            <!-- Dropdown Toggler -->\n            <x-slot:toggle>\n                <button\n                    type=\"button\"\n                    class=\"inline-flex h-[38px] w-full cursor-pointer appearance-none items-center justify-between gap-x-2 rounded-md border bg-white px-2.5 py-1.5 text-center leading-6 text-gray-600 transition-all marker:shadow hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                >\n                    <span\n                        class=\"text-sm text-gray-400 dark:text-gray-400\"\n                        v-text=\"'@lang('admin::app.components.datagrid.filters.select')'\"\n                    >\n                    </span>\n\n                    <span class=\"icon-down-arrow text-2xl\"></span>\n                </button>\n            </x-slot>\n\n            <!-- Dropdown Content -->\n            <x-slot:menu>\n                <div class=\"relative\">\n                    <div class=\"relative rounded\">\n                        <ul class=\"list-reset\">\n                            <li class=\"p-2\">\n                                <input\n                                    class=\"block w-full rounded-md border bg-white px-2 py-1.5 text-sm leading-6 text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                    @keyup=\"lookUp($event)\"\n                                >\n                            </li>\n\n                            <ul class=\"p-2\">\n                                <li v-if=\"!isMinimumCharacters\">\n                                    <p\n                                        class=\"block p-2 text-gray-600 dark:text-gray-300\"\n                                        v-text=\"'@lang('admin::app.components.datagrid.filters.dropdown.searchable.at-least-two-chars')'\"\n                                    >\n                                    </p>\n                                </li>\n\n                                <li v-else-if=\"!searchedOptions.length\">\n                                    <p\n                                        class=\"block p-2 text-gray-600 dark:text-gray-300\"\n                                        v-text=\"'@lang('admin::app.components.datagrid.filters.dropdown.searchable.no-results')'\"\n                                    >\n                                    </p>\n                                </li>\n\n                                <li\n                                    v-for=\"option in searchedOptions\"\n                                    v-else\n                                >\n                                    <p\n                                        class=\"cursor-pointer p-2 text-sm text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950\"\n                                        v-text=\"option.label\"\n                                        @click=\"selectOption(option)\"\n                                    >\n                                    </p>\n                                </li>\n                            </ul>\n                        </ul>\n                    </div>\n                </div>\n            </x-slot>\n        </x-admin::dropdown>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-kanban-searchable-dropdown', {\n            template: '#v-kanban-searchable-dropdown-template',\n\n            props: ['column'],\n\n            data() {\n                return {\n                    isMinimumCharacters: false,\n\n                    searchedOptions: [],\n                };\n            },\n\n            methods: {\n                lookUp($event) {\n                    let params = {\n                        column: this.column.index,\n                        search: $event.target.value,\n                    };\n\n                    if (! (params['search'].length > 1)) {\n                        this.searchedOptions = [];\n\n                        this.isMinimumCharacters = false;\n\n                        return;\n                    }\n\n                    this.$axios\n                        .get('{{ route('admin.leads.kanban.look_up') }}', {\n                            params\n                        })\n                        .then(({\n                            data\n                        }) => {\n                            this.isMinimumCharacters = true;\n\n                            this.searchedOptions = data;\n                        });\n                },\n\n                selectOption(option) {\n                    this.searchedOptions = [];\n\n                    this.$emit('select-option', {\n                        target: {\n                            value: option,\n                        }\n                    });\n                },\n            }\n        });\n    </script>\n@endpushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/index/kanban/search.blade.php",
    "content": "{!! view_render_event('admin.leads.index.kanban.search.before') !!}\n\n<v-kanban-search\n    :is-loading=\"isLoading\"\n    :available=\"available\"\n    :applied=\"applied\"\n    @search=\"search\"\n>\n</v-kanban-search>\n\n{!! view_render_event('admin.leads.index.kanban.search.after') !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-kanban-search-template\"\n    >\n        <div class=\"relative flex max-w-[445px] items-center max-md:w-full max-md:max-w-full\">\n            <div class=\"icon-search absolute top-1.5 flex items-center text-2xl ltr:left-3 rtl:right-3\"></div>\n\n            <input\n                type=\"text\"\n                name=\"search\"\n                class=\"block w-full rounded-lg border bg-white py-1.5 leading-6 text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400 ltr:pl-10 ltr:pr-3 rtl:pl-3 rtl:pr-10\"\n                placeholder=\"@lang('admin::app.leads.index.kanban.toolbar.search.title')\"\n                autocomplete=\"off\"\n                :value=\"getSearchedValues()\"\n                @keyup.enter=\"search\"\n            >\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-kanban-search', {\n            template: '#v-kanban-search-template',\n\n            props: ['isLoading', 'available', 'applied'],\n\n            emits: ['search'],\n\n            data() {\n                return {\n                    filters: {\n                        columns: [],\n                    },\n                };\n            },\n\n            mounted() {\n                this.filters.columns = this.applied.filters.columns.filter((column) => column.index === 'all');\n            },\n\n            methods: {\n                /**\n                 * Perform a search operation based on the input value.\n                 *\n                 * @param {Event} $event\n                 * @returns {void}\n                 */\n                search($event) {\n                    let requestedValue = $event.target.value;\n\n                    let appliedColumn = this.filters.columns.find(column => column.index === 'all');\n\n                    if (! requestedValue) {\n                        appliedColumn.value = [];\n\n                        this.$emit('search', this.filters);\n\n                        return;\n                    }\n\n                    if (appliedColumn) {\n                        appliedColumn.value = [requestedValue];\n                    } else {\n                        this.filters.columns.push({\n                            index: 'all',\n                            value: [requestedValue]\n                        });\n                    }\n\n                    this.$emit('search', this.filters);\n                },\n\n                /**\n                 * Get the searched values for a specific column.\n                 *\n                 * @returns {Array}\n                 */\n                getSearchedValues() {\n                    let appliedColumn = this.filters.columns.find(column => column.index === 'all');\n\n                    return appliedColumn?.value ?? [];\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/index/kanban/toolbar.blade.php",
    "content": "{!! view_render_event('admin.leads.index.kanban.toolbar.before') !!}\n\n<div class=\"flex justify-between gap-2 max-md:flex-wrap\">\n    <div class=\"flex w-full items-center gap-x-1.5 max-md:justify-between\">\n        {!! view_render_event('admin.leads.index.kanban.toolbar.search.before') !!}\n\n        <!-- Search Panel -->\n        @include('admin::leads.index.kanban.search')\n\n        {!! view_render_event('admin.leads.index.kanban.toolbar.search.after') !!}\n\n        {!! view_render_event('admin.leads.index.kanban.toolbar.filter.before') !!}\n\n        <!-- Filter -->\n        @include('admin::leads.index.kanban.filter')\n\n        {!! view_render_event('admin.leads.index.kanban.toolbar.filter.after') !!}\n\n        <div class=\"z-10 hidden w-full divide-y divide-gray-100 rounded bg-white shadow dark:bg-gray-900\"></div>\n    </div>\n\n    {!! view_render_event('admin.leads.index.kanban.toolbar.switcher.before') !!}\n\n    <!-- View Switcher -->\n    @include('admin::leads.index.view-switcher')\n\n    {!! view_render_event('admin.leads.index.kanban.toolbar.switcher.after') !!}\n</div>\n\n{!! view_render_event('admin.leads.index.kanban.toolbar.after') !!}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/index/kanban.blade.php",
    "content": "{!! view_render_event('admin.leads.index.kanban.before') !!}\n\n<!-- Kanban Vue Component -->\n<v-leads-kanban ref=\"leadsKanban\">\n    <div class=\"flex flex-col gap-4\">\n        <!-- Shimmer -->\n        <x-admin::shimmer.leads.index.kanban />\n    </div>\n</v-leads-kanban>\n\n{!! view_render_event('admin.leads.index.kanban.after') !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-leads-kanban-template\"\n    >\n        <template v-if=\"isLoading\">\n            <div class=\"flex flex-col gap-4\">\n                <x-admin::shimmer.leads.index.kanban />\n            </div>\n        </template>\n\n        <template v-else>\n            <div class=\"flex flex-col gap-4\">\n                @include('admin::leads.index.kanban.toolbar')\n\n                {!! view_render_event('admin.leads.index.kanban.content.before') !!}\n\n                <div class=\"flex gap-2.5 overflow-x-auto\">\n                    <!-- Stage Cards -->\n                    <div\n                        class=\"flex min-w-[275px] max-w-[275px] flex-col gap-1 rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\"\n                        v-for=\"(stage, index) in stageLeads\"\n                    >\n                        {!! view_render_event('admin.leads.index.kanban.content.stage.header.before') !!}\n\n                        <!-- Stage Header -->\n                        <div class=\"flex flex-col px-2 py-3\">\n                            <!-- Stage Title and Action -->\n                            <div class=\"flex items-center justify-between\">\n                                <span class=\"text-xs font-medium dark:text-white\">\n                                    @{{ stage.name }} (@{{ stage.leads.meta.total }})\n                                </span>\n\n                                @if (bouncer()->hasPermission('leads.create'))\n                                    <a\n                                        :href=\"'{{ route('admin.leads.create') }}' + '?stage_id=' + stage.id\"\n                                        class=\"icon-add cursor-pointer rounded p-1 text-lg text-gray-600 transition-all hover:bg-gray-200 hover:text-gray-800 dark:text-gray-600 dark:hover:bg-gray-800 dark:hover:text-white\"\n                                        target=\"_blank\"\n                                    >\n                                    </a>\n                                @endif\n                            </div>\n\n                            <!-- Stage Total Leads and Amount -->\n                            <div class=\"flex items-center justify-between gap-2\">\n                                <span class=\"text-xs font-medium dark:text-white\">\n                                    @{{ $admin.formatPrice(stage.lead_value) }}\n                                </span>\n\n                                <!-- Progress Bar -->\n                                <div class=\"h-1 w-36 overflow-hidden rounded-full bg-gray-200 dark:bg-gray-800\">\n                                    <div\n                                        class=\"h-1 bg-green-500\"\n                                        :style=\"{ width: (stage.lead_value / totalStagesAmount) * 100 + '%' }\"\n                                    ></div>\n                                </div>\n                            </div>\n                        </div>\n\n                        {!! view_render_event('admin.leads.index.kanban.content.stage.header.after') !!}\n\n                        {!! view_render_event('admin.leads.index.kanban.content.stage.body.before') !!}\n\n                        <!-- Draggable Stage Lead Cards -->\n                        <draggable\n                            class=\"flex h-[calc(100vh-317px)] flex-col gap-2 overflow-y-auto p-2\"\n                            :class=\"{ 'justify-center': stage.leads.data.length === 0 }\"\n                            ghost-class=\"draggable-ghost\"\n                            handle=\".lead-item\"\n                            v-bind=\"{animation: 200}\"\n                            :list=\"stage.leads.data\"\n                            item-key=\"id\"\n                            group=\"leads\"\n                            @scroll=\"handleScroll(stage, $event)\"\n                            @change=\"handleUpdate(stage, $event)\"\n                        >\n                            <template #header>\n                                <div\n                                    class=\"flex flex-col items-center justify-center\"\n                                    v-if=\"! stage.leads.data.length\"\n                                >\n                                    <img\n                                        class=\"dark:mix-blend-exclusion dark:invert\"\n                                        src=\"{{ vite()->asset('images/empty-placeholders/pipedrive.svg') }}\"\n                                    >\n\n                                    <div class=\"flex flex-col items-center gap-4\">\n                                        <div class=\"flex flex-col items-center gap-2\">\n                                            <p class=\"!text-base font-semibold dark:text-white\">\n                                                @lang('admin::app.leads.index.kanban.empty-list')\n                                            </p>\n\n                                            <p class=\"!text-sm text-gray-400 dark:text-gray-400\">\n                                                @lang('admin::app.leads.index.kanban.empty-list-description')\n                                            </p>\n                                        </div>\n\n                                        @if (bouncer()->hasPermission('leads.create'))\n                                            <a\n                                                :href=\"'{{ route('admin.leads.create') }}' + '?stage_id=' + stage.id\"\n                                                class=\"secondary-button\"\n                                            >\n                                                @lang('admin::app.leads.index.kanban.create-lead-btn')\n                                            </a>\n                                        @endif\n                                    </div>\n                                </div>\n                            </template>\n\n                            <!-- Lead Card -->\n                            <template #item=\"{ element, index }\">\n                                {!! view_render_event('admin.leads.index.kanban.content.stage.body.card.before') !!}\n\n                                <a\n                                    class=\"lead-item flex cursor-pointer flex-col gap-5 rounded-md border border-gray-100 bg-gray-50 p-2 dark:border-gray-400 dark:bg-gray-400\"\n                                    :href=\"'{{ route('admin.leads.view', 'replaceId') }}'.replace('replaceId', element.id)\"\n                                >\n                                    {!! view_render_event('admin.leads.index.kanban.content.stage.body.card.header.before') !!}\n\n                                    <!-- Header -->\n                                    <div class=\"flex items-start justify-between\">\n                                        <div class=\"flex items-center gap-1\">\n                                            <x-admin::avatar ::name=\"element.person.name\" />\n\n                                            <div class=\"flex flex-col gap-0.5\">\n                                                <span class=\"text-xs font-medium\">\n                                                    @{{ element.person.name }}\n                                                </span>\n\n                                                <span class=\"text-[10px] leading-normal\">\n                                                    @{{ element.person.organization?.name }}\n                                                </span>\n                                            </div>\n                                        </div>\n\n                                        <div\n                                            class=\"group relative\"\n                                            v-if=\"element.rotten_days > 0\"\n                                        >\n                                            <span class=\"icon-rotten cursor-default text-xl text-rose-600\"></span>\n\n                                            <div class=\"absolute -top-1 right-7 hidden w-max flex-col items-center group-hover:flex\">\n                                                <span class=\"whitespace-no-wrap relative rounded-md bg-black px-4 py-2 text-xs leading-none text-white shadow-lg\">\n                                                    @{{ \"@lang('admin::app.leads.index.kanban.rotten-days', ['days' => 'replaceDays'])\".replace('replaceDays', element.rotten_days) }}\n                                                </span>\n\n                                                <div class=\"absolute -right-1 top-2 h-3 w-3 rotate-45 bg-black\"></div>\n                                            </div>\n                                        </div>\n                                    </div>\n\n                                    {!! view_render_event('admin.leads.index.kanban.content.stage.body.card.header.after') !!}\n\n                                    {!! view_render_event('admin.leads.index.kanban.content.stage.body.card.title.before') !!}\n\n                                    <!-- Lead Title -->\n                                    <p class=\"text-xs font-medium\">\n                                        @{{ element.title }}\n                                    </p>\n\n                                    {!! view_render_event('admin.leads.index.kanban.content.stage.body.card.title.after') !!}\n\n                                    <div class=\"flex flex-wrap gap-1\">\n                                        <div\n                                            class=\"flex items-center gap-1 rounded-xl bg-gray-200 px-2 py-1 text-xs font-medium dark:bg-gray-800 dark:text-white\"\n                                            v-if=\"element.user\"\n                                        >\n                                            <span class=\"icon-settings-user text-sm\"></span>\n\n                                            @{{ element.user.name }}\n                                        </div>\n\n                                        <div class=\"rounded-xl bg-gray-200 px-2 py-1 text-xs font-medium dark:bg-gray-800 dark:text-white\">\n                                            @{{ element.formatted_lead_value }}\n                                        </div>\n\n                                        <div class=\"rounded-xl bg-gray-200 px-2 py-1 text-xs font-medium dark:bg-gray-800 dark:text-white\">\n                                            @{{ element.source.name }}\n                                        </div>\n\n                                        <div class=\"rounded-xl bg-gray-200 px-2 py-1 text-xs font-medium dark:bg-gray-800 dark:text-white\">\n                                            @{{ element.type.name }}\n                                        </div>\n\n                                        <!-- Tags -->\n                                        <template v-for=\"tag in element.tags\">\n                                            {!! view_render_event('admin.leads.index.kanban.content.stage.body.card.tag.before') !!}\n\n                                            <div\n                                                class=\"rounded-xl bg-gray-200 px-2 py-1 text-xs font-medium dark:bg-gray-800\"\n                                                :style=\"{\n                                                    backgroundColor: tag.color,\n                                                    color: tagTextColor[tag.color]\n                                                }\"\n                                            >\n                                                @{{ tag.name }}\n                                            </div>\n\n                                            {!! view_render_event('admin.leads.index.kanban.content.stage.body.card.tag.after') !!}\n                                        </template>\n                                    </div>\n                                </a>\n\n                                {!! view_render_event('admin.leads.index.kanban.content.stage.body.card.after') !!}\n                            </template>\n                        </draggable>\n\n                        {!! view_render_event('admin.leads.index.kanban.content.stage.body.after') !!}\n                    </div>\n                </div>\n\n                {!! view_render_event('admin.leads.index.kanban.content.after') !!}\n            </div>\n\n            <!-- Show modal for additional information while updating the leads into won or lost stage. -->\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"stageUpdateForm\"\n            >\n                <form @submit=\"handleSubmit($event, handleFormSubmit)\">\n                    <!-- Modal -->\n                    <x-admin::modal\n                        ref=\"stageUpdateModal\"\n                        @toggle=\"handleCloseModal\"\n                    >\n                        <!-- Header -->\n                        <x-slot:header>\n                            <h3 class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.leads.index.kanban.stages.need-more-info')\n                            </h3>\n                        </x-slot>\n\n                        <!-- Content -->\n                        <x-slot:content>\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"lead_pipeline_stage_id\"\n                                ::value=\"finalized.stage.id\"\n                            />\n\n                            <!-- Won Value -->\n                            <template v-if=\"finalized.stage.code == 'won'\">\n                                <x-admin::form.control-group>\n                                    <x-admin::form.control-group.label>\n                                        @lang('admin::app.leads.index.kanban.stages.won-value')\n                                    </x-admin::form.control-group.label>\n\n                                    <x-admin::form.control-group.control\n                                        type=\"price\"\n                                        name=\"lead_value\"\n                                        ::value=\"finalized.lead.lead_value\"\n                                    />\n                                </x-admin::form.control-group>\n                            </template>\n\n                            <!-- Lost Reason -->\n                            <template v-else>\n                                <x-admin::form.control-group>\n                                    <x-admin::form.control-group.label>\n                                        @lang('admin::app.leads.index.kanban.stages.lost-reason')\n                                    </x-admin::form.control-group.label>\n\n                                    <x-admin::form.control-group.control\n                                        type=\"textarea\"\n                                        name=\"lost_reason\"\n                                    />\n                                </x-admin::form.control-group>\n                            </template>\n\n                            <!-- Closed At -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label>\n                                    @lang('admin::app.leads.index.kanban.stages.closed-at')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"datetime\"\n                                    name=\"closed_at\"\n                                    :label=\"trans('admin::app.leads.index.kanban.stages.closed-at')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"closed_at\"/>\n                            </x-admin::form.control-group>\n                        </x-slot>\n\n                        <!-- Footer -->\n                        <x-slot:footer>\n                            <x-admin::button\n                                class=\"primary-button\"\n                                :title=\"trans('admin::app.leads.index.kanban.stages.save-btn')\"\n                                ::loading=\"finalized.updating\"\n                                ::disabled=\"finalized.updating\"\n                            />\n                        </x-slot>\n                    </x-admin::modal>\n                </form>\n            </x-admin::form>\n        </template>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-leads-kanban', {\n            template: '#v-leads-kanban-template',\n\n            data() {\n                return {\n                    available: {\n                        columns: @json($columns),\n                    },\n\n                    applied: {\n                        filters: {\n                            columns: [],\n                        }\n                    },\n\n                    finalized: {\n                        lead: null,\n                        stage: null,\n                        updating: false,\n                    },\n\n                    stages: @json($pipeline->stages->toArray()),\n\n                    stageLeads: {},\n\n                    isLoading: true,\n\n                    tagTextColor: {\n                        '#FEE2E2': '#DC2626',\n                        '#FFEDD5': '#EA580C',\n                        '#FEF3C7': '#D97706',\n                        '#FEF9C3': '#CA8A04',\n                        '#ECFCCB': '#65A30D',\n                        '#DCFCE7': '#16A34A',\n                    },\n                };\n            },\n\n            computed: {\n                /**\n                 * Computes the total amount of leads across all stages.\n                 *\n                 * @return {number} The total amount of leads.\n                 */\n                totalStagesAmount() {\n                    let totalAmount = 0;\n\n                    for (let [key, stage] of Object.entries(this.stageLeads)) {\n                        totalAmount += parseFloat(stage.lead_value);\n                    }\n\n                    return totalAmount;\n                }\n            },\n\n            mounted () {\n                this.boot();\n            },\n\n            methods: {\n                /**\n                 * Initialization: This function checks for any previously saved filters in local storage and applies them as needed.\n                 *\n                 * @returns {void}\n                 */\n                boot() {\n                    let kanbans = this.getKanbans();\n\n                    if (kanbans?.length) {\n                        const currentKanban = kanbans.find(({ src }) => src === this.src);\n\n                        if (currentKanban) {\n                            this.applied.filters = currentKanban.applied.filters;\n\n                            this.get()\n                                .then(response => {\n                                    for (let [sortOrder, data] of Object.entries(response.data)) {\n                                        this.stageLeads[sortOrder] = data;\n                                    }\n                                });\n\n                            return;\n                        }\n                    }\n\n                    this.get()\n                        .then(response => {\n                            for (let [sortOrder, data] of Object.entries(response.data)) {\n                                this.stageLeads[sortOrder] = data;\n                            }\n                        });\n                },\n\n                /**\n                 * Fetches the leads based on the applied filters.\n                 *\n                 * @param {object} requestedParams - The requested parameters.\n                 * @returns {Promise} The promise object representing the request.\n                 */\n                get(requestedParams = {}) {\n                    let params = {\n                        search: '',\n                        searchFields: '',\n                        pipeline_id: \"{{ request('pipeline_id') }}\",\n                        limit: 10,\n                    };\n\n                    this.applied.filters.columns.forEach((column) => {\n                        if (column.index === 'all') {\n                            if (! column.value.length) {\n                                return;\n                            }\n\n                            params['search'] += `title:${column.value.join(',')};`;\n                            params['searchFields'] += `title:like;`;\n\n                            return;\n                        }\n\n                        /**\n                         * If the column is a searchable dropdown, then we need to append the column value\n                         * with the column label. Otherwise, we can directly append the column value.\n                         */\n                        params['search'] += column.filterable_type === 'searchable_dropdown'\n                            ? `${column.index}:${column.value.map(option => option.value).join(',')};`\n                            : `${column.index}:${column.value.join(',')};`;\n\n                        params['searchFields'] += `${column.index}:${column.search_field};`;\n                    });\n\n                    return this.$axios\n                        .get(\"{{ route('admin.leads.get') }}\", {\n                            params: {\n                                ...params,\n\n                                ...requestedParams,\n                            }\n                        })\n                        .then(response => {\n                            this.isLoading = false;\n\n                            this.updateKanbans();\n\n                            return response;\n                        })\n                        .catch(error => {\n                            console.log(error)\n                        });\n                },\n\n                /**\n                 * Filters the leads based on the applied filters.\n                 *\n                 * @param {object} filters - The filters to be applied.\n                 * @returns {void}\n                 */\n                filter(filters) {\n                    this.applied.filters.columns = [\n                        ...(this.applied.filters.columns.filter((column) => column.index === 'all')),\n                        ...filters.columns,\n                    ];\n\n                    this.get()\n                        .then(response => {\n                            for (let [sortOrder, data] of Object.entries(response.data)) {\n                                this.stageLeads[sortOrder] = data;\n                            }\n                        });\n                },\n\n                /**\n                 * Searches the leads based on the applied filters.\n                 *\n                 * @param {object} filters - The filters to be applied.\n                 * @returns {void}\n                 */\n                search(filters) {\n                    this.applied.filters.columns = [\n                        ...(this.applied.filters.columns.filter((column) => column.index !== 'all')),\n                        ...filters.columns,\n                    ];\n\n                    this.get()\n                        .then(response => {\n                            for (let [sortOrder, data] of Object.entries(response.data)) {\n                                this.stageLeads[sortOrder] = data;\n                            }\n                        });\n                },\n\n                /**\n                 * Appends the leads to the stage.\n                 *\n                 * @param {object} params - The parameters to be appended.\n                 * @returns {void}\n                 */\n                append(params) {\n                    this.get(params)\n                        .then(response => {\n                            for (let [sortOrder, data] of Object.entries(response.data)) {\n                                if (! this.stageLeads[sortOrder]) {\n                                    this.stageLeads[sortOrder] = data;\n                                } else {\n                                    this.stageLeads[sortOrder].leads.data = this.stageLeads[sortOrder].leads.data.concat(data.leads.data);\n\n                                    this.stageLeads[sortOrder].leads.meta = data.leads.meta;\n                                }\n                            }\n                        });\n                },\n\n                /**\n                 * Updates the stage with the latest lead data.\n                 *\n                 * @param {object} stage - The stage object.\n                 * @param {object} event - The event object.\n                 * @returns {void}\n                 */\n                handleUpdate(stage, event) {\n                    if (event.moved) {\n                        return;\n                    }\n\n                    if (\n                        (stage.code === \"won\" || stage.code === \"lost\")\n                        && event.added\n                        && event.added.element\n                    ) {\n                        this.finalized.lead = event.added.element;\n\n                        this.finalized.stage = stage;\n\n                        this.toggleStageUpdateModal();\n\n                        return;\n                    }\n\n                    if (event.removed) {\n                        stage.lead_value = parseFloat(stage.lead_value) - parseFloat(event.removed.element.lead_value);\n\n                        this.stageLeads[stage.sort_order].leads.meta.total = this.stageLeads[stage.sort_order].leads.meta.total - 1;\n\n                        return;\n                    }\n\n                    stage.lead_value = parseFloat(stage.lead_value) + parseFloat(event.added.element.lead_value);\n\n                    this.stageLeads[stage.sort_order].leads.meta.total = this.stageLeads[stage.sort_order].leads.meta.total + 1;\n\n                    this.updateStage('{{ route('admin.leads.stage.update', '__LEAD_ID__') }}'.replace('__LEAD_ID__', event.added.element.id), {\n                        'lead_pipeline_stage_id': stage.id\n                    })\n                        .then(response => {\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                        })\n                        .catch(error => {\n                            this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                        });;\n                },\n\n                /**\n                 * Updates the stage with the latest lead data.\n                 *\n                 * @param {string} url - The URL to update the stage.\n                 * @param {object} params - The parameters to be updated.\n                 *\n                 * @returns {Promise} The promise object representing the request.\n                 */\n                updateStage(url, params) {\n                    return this.$axios.put(url, params);\n                },\n\n                handleFormSubmit(params) {\n                    this.finalized.updating = true;\n\n                    this.updateStage(\"{{ route('admin.leads.stage.update', '__LEAD_ID__') }}\".replace('__LEAD_ID__', this.finalized.lead.id), {\n                        ...params,\n                        lead_pipeline_stage_id: this.finalized.stage.id,\n                    })\n                        .then(response => {\n                            this.toggleStageUpdateModal();\n\n                            this.resetFinalized();\n\n                            this.get()\n                                .then(response => {\n                                    for (let [sortOrder, data] of Object.entries(response.data)) {\n                                        this.stageLeads[sortOrder] = data;\n                                    }\n                                });\n\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                        })\n                        .catch(error => {\n                            this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                        }).finally(() => {\n                            this.finalized.updating = false;\n                        });\n                },\n\n                /**\n                 * Resets the finalized lead and stage data.\n                 *\n                 * @returns {void}\n                 */\n                resetFinalized() {\n                    this.finalized = {\n                        lead: null,\n                        stage: null,\n                        updating: false,\n                    };\n                },\n\n                /**\n                 * Handles the close event of the modal.\n                 *\n                 * @returns {void}\n                 */\n                handleCloseModal(state) {\n                    if (state.isActive) {\n                        return;\n                    }\n\n                    this.resetFinalized();\n\n                    this.get()\n                        .then(response => {\n                            for (let [sortOrder, data] of Object.entries(response.data)) {\n                                this.stageLeads[sortOrder] = data;\n                            }\n                        });\n                },\n\n                /**\n                 * Toggles the stage update modal.\n                 *\n                 * @returns {void}\n                 */\n                toggleStageUpdateModal() {\n                    this.$refs.stageUpdateModal.toggle();\n                },\n\n                /**\n                 * Handles the scroll event on the stage leads.\n                 *\n                 * @param {object} stage - The stage object.\n                 * @param {object} event - The scroll event.\n                 * @returns {void}\n                 */\n                handleScroll(stage, event) {\n                    const bottom = event.target.scrollHeight - event.target.scrollTop === event.target.clientHeight;\n\n                    if (! bottom) {\n                        return;\n                    }\n\n                    if (this.stageLeads[stage.sort_order].leads.meta.current_page == this.stageLeads[stage.sort_order].leads.meta.last_page) {\n                        return;\n                    }\n\n                    this.append({\n                        pipeline_stage_id: stage.id,\n                        pipeline_id: stage.lead_pipeline_id,\n                        page: this.stageLeads[stage.sort_order].leads.meta.current_page + 1,\n                        limit: 10,\n                    });\n                },\n\n                //=======================================================================================\n                // Support for previous applied values in kanban's. All code is based on local storage.\n                //=======================================================================================\n\n                /**\n                 * Updates the kanban's stored in local storage with the latest data.\n                 *\n                 * @returns {void}\n                 */\n                 updateKanbans() {\n                    let kanbans = this.getKanbans();\n\n                    if (kanbans?.length) {\n                        const currentKanban = kanbans.find(({ src }) => src === this.src);\n\n                        if (currentKanban) {\n                            kanbans = kanbans.map(kanban => {\n                                if (kanban.src === this.src) {\n                                    return {\n                                        ...kanban,\n                                        requestCount: ++kanban.requestCount,\n                                        available: this.available,\n                                        applied: this.applied,\n                                    };\n                                }\n\n                                return kanban;\n                            });\n                        } else {\n                            kanbans.push(this.getKanbanInitialProperties());\n                        }\n                    } else {\n                        kanbans = [this.getKanbanInitialProperties()];\n                    }\n\n                    this.setKanbans(kanbans);\n                },\n\n                /**\n                 * Returns the initial properties for a kanban.\n                 *\n                 * @returns {object} Initial properties for a kanban.\n                 */\n                getKanbanInitialProperties() {\n                    return {\n                        src: this.src,\n                        requestCount: 0,\n                        available: this.available,\n                        applied: this.applied,\n                    };\n                },\n\n                /**\n                 * Returns the storage key for kanban's in local storage.\n                 *\n                 * @returns {string} Storage key for kanban's.\n                 */\n                getKanbansStorageKey() {\n                    return 'kanbans';\n                },\n\n                /**\n                 * Retrieves the kanban's stored in local storage.\n                 *\n                 * @returns {Array} Kanban's stored in local storage.\n                 */\n                getKanbans() {\n                    let kanbans = localStorage.getItem(\n                        this.getKanbansStorageKey()\n                    );\n\n                    return JSON.parse(kanbans) ?? [];\n                },\n\n                /**\n                 * Sets the kanban's in local storage.\n                 *\n                 * @param {Array} kanbans - Kanban's to be stored in local storage.\n                 * @returns {void}\n                 */\n                setKanbans(kanbans) {\n                    localStorage.setItem(\n                        this.getKanbansStorageKey(),\n                        JSON.stringify(kanbans)\n                    );\n                },\n            }\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/index/table.blade.php",
    "content": "{!! view_render_event('admin.leads.index.table.before') !!}\n\n<x-admin::datagrid :src=\"route('admin.leads.index')\">\n    <!-- DataGrid Shimmer -->\n    <x-admin::shimmer.datagrid />\n\n    <x-slot:toolbar-right-after>\n        @include('admin::leads.index.view-switcher')\n    </x-slot>\n</x-admin::datagrid>\n\n{!! view_render_event('admin.leads.index.table.after') !!}"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/index/upload.blade.php",
    "content": "<v-upload>\n    <button\n        type=\"button\"\n        class=\"secondary-button\"\n    >\n        @lang('admin::app.leads.index.upload.upload-file')\n    </button>\n</v-upload>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"upload-template\"\n    >\n        <div>\n            <button\n                type=\"button\"\n                class=\"secondary-button\"\n                @click=\"$refs.userUpdateAndCreateModal.open()\"\n            >\n                @lang('admin::app.leads.index.upload.upload-file')\n            </button>\n\n            <x-admin::form\n                v-slot=\"{ meta, values, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modalForm\"\n            >\n                <form \n                    @submit=\"handleSubmit($event, create)\"\n                    enctype=\"multipart/form-data\"\n                    ref=\"userForm\"\n                >\n                    <x-admin::modal ref=\"userUpdateAndCreateModal\">\n                        <!-- Modal Header -->\n                        <x-slot:header>\n                            <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                                @lang('admin::app.leads.index.upload.create-lead')\n                            </p>\n                        </x-slot>\n\n                        <!-- Modal Content -->\n                        <x-slot:content>\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.leads.index.upload.file')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"file\"\n                                    id=\"files\"\n                                    name=\"files\"\n                                    rules=\"required|mimes:pdf,bmp,jpeg,jpg,png,webp\"\n                                    :label=\"trans('admin::app.leads.index.upload.file')\"\n                                    ::disabled=\"isLoading\"\n                                    ref=\"file\"\n                                    accept=\"application/pdf,image/*\"\n                                    multiple\n                                />\n\n                                <p class=\"mt-1 text-xs text-gray-600 dark:text-gray-300\">\n                                    @lang('admin::app.leads.index.upload.file-info')\n                                </p>\n\n                                <x-admin::form.control-group.error control-name=\"files\" />\n                            </x-admin::form.control-group>\n                        </x-slot>\n\n                        <!-- Modal Footer -->\n                        <x-slot:footer>\n                            <x-admin::button\n                                button-type=\"submit\"\n                                class=\"primary-button justify-center\"\n                                :title=\"trans('admin::app.leads.index.upload.save-btn')\"\n                                ::loading=\"isLoading\"\n                                ::disabled=\"isLoading\"\n                            />\n                        </x-slot>\n                    </x-admin::modal>\n                </form>\n            </x-admin::form>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-upload', {\n            template: '#upload-template',\n\n            data() {\n                return {\n                    isLoading: false,\n                };\n            },\n\n            methods: {\n                create(params, { resetForm, setErrors }) {\n                    const selectedFiles = this.$refs.file?.files;\n\n                    if (selectedFiles.length === 0) {\n                        this.$emitter.emit('add-flash', { type: 'error', message: \"@lang('admin::app.leads.index.upload.file-required')\" });\n\n                        return;\n                    }\n\n                    this.isLoading = true;\n\n                    const formData = new FormData();\n\n                    selectedFiles.forEach((file, index) => {\n                        formData.append(`files[${index}]`, file);\n                    });\n\n                    formData.append('_method', 'post');\n\n                    this.sendRequest(formData);\n                },\n\n                sendRequest(formData) {\n                    this.$axios.post(\"{{ route('admin.leads.create_by_ai') }}\", formData, {\n                        headers: {\n                            'Content-Type': 'multipart/form-data',\n                        }\n                    })\n                    .then(response => {\n                        this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                        this.$parent.$refs.leadsKanban.boot()\n                    })\n                    .catch(error => {\n                        this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                    })\n                    .finally(() => {\n                        this.isLoading = false;\n\n                        this.$refs.userUpdateAndCreateModal.close();\n                    });\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/index/view-switcher.blade.php",
    "content": "{!! view_render_event('admin.leads.index.view_switcher.before') !!}\n\n<div class=\"flex items-center gap-4 max-md:w-full max-md:!justify-between\">\n    <x-admin::dropdown>\n        <x-slot:toggle>\n            {!! view_render_event('admin.leads.index.view_switcher.pipeline.button.before') !!}\n\n            <button\n                type=\"button\"\n                class=\"flex cursor-pointer appearance-none items-center justify-between gap-x-2 rounded-md border bg-white px-2.5 py-[7px] text-center leading-6 text-gray-600 transition-all marker:shadow hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n            >\n                <span class=\"whitespace-nowrap\">\n                    {{ $pipeline->name }}\n                </span>\n                \n                <span class=\"icon-down-arrow text-2xl\"></span>\n            </button>\n\n            {!! view_render_event('admin.leads.index.view_switcher.pipeline.button.after') !!}\n        </x-slot>\n\n        <x-slot:content class=\"!p-0\">\n            {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.header.before') !!}\n\n            <!-- Header -->\n            <div class=\"flex items-center justify-between px-3 py-2.5\">\n                <span class=\"text-xs font-medium text-gray-500 dark:text-gray-300\">\n                    @lang('admin::app.leads.index.view-switcher.all-pipelines')\n                </span>\n            </div>\n\n            {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.header.after') !!}\n            \n            <!-- Pipeline Links -->\n            @foreach (app('Webkul\\Lead\\Repositories\\PipelineRepository')->all() as $tempPipeline)\n                {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.before', ['tempPipeline' => $tempPipeline]) !!}\n\n                <a\n                    href=\"{{ route('admin.leads.index', [\n                        'pipeline_id' => $tempPipeline->id,\n                        'view_type' => request('view_type')\n                    ]) }}\"\n                    class=\"block px-3 py-2.5 pl-4 text-gray-600 transition-all hover:bg-gray-100 dark:hover:bg-gray-950 dark:text-gray-300 {{ $pipeline->id == $tempPipeline->id ? 'bg-gray-100 dark:bg-gray-950' : '' }}\"\n                >\n                    {{ $tempPipeline->name }}\n                </a>\n\n                {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.after', ['tempPipeline' => $tempPipeline]) !!}\n            @endforeach\n\n            {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.footer.before') !!}\n\n            <!-- Footer -->\n            <a\n                href=\"{{ route('admin.settings.pipelines.create') }}\"\n                target=\"_blank\"\n                class=\"flex items-center justify-between border-t border-gray-300 px-3 py-2.5 text-brandColor dark:border-gray-800\"\n            >\n                <span class=\"font-medium\">                    \n                    @lang('admin::app.leads.index.view-switcher.create-new-pipeline')\n                </span>\n            </a>\n\n            {!! view_render_event('admin.leads.index.view_switcher.pipeline.content.footer.after') !!}\n        </x-slot>\n    </x-admin::dropdown>\n\n    <div class=\"flex items-center gap-0.5\">\n        {!! view_render_event('admin.leads.index.view_switcher.pipeline.view_type.before') !!}\n\n        @if (request('view_type'))\n            <a\n                class=\"flex\"\n                href=\"{{ route('admin.leads.index') }}\"\n            >\n                <span class=\"icon-kanban p-2 text-2xl\"></span>\n            </a>\n\n            <span class=\"icon-list rounded-md bg-gray-100 p-2 text-2xl dark:bg-gray-950\"></span>\n        @else\n            <span class=\"icon-kanban rounded-md bg-white p-2 text-2xl dark:bg-gray-900\"></span>\n\n            <a\n                href=\"{{ route('admin.leads.index', ['view_type' => 'table']) }}\"\n                class=\"flex\"\n            >\n                <span class=\"icon-list p-2 text-2xl\"></span>\n            </a>\n        @endif\n\n        {!! view_render_event('admin.leads.index.view_switcher.pipeline.view_type.after') !!}\n    </div>\n</div>\n\n{!! view_render_event('admin.leads.index.view_switcher.after') !!}"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/index.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.leads.index.title')\n    </x-slot>\n\n    <!-- Header -->\n    {!! view_render_event('admin.leads.index.header.before') !!}\n\n    <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n        {!! view_render_event('admin.leads.index.header.left.before') !!}\n\n        <div class=\"flex flex-col gap-2\">\n            <!-- Breadcrumb's -->\n            <x-admin::breadcrumbs name=\"leads\" />\n\n            <div class=\"text-xl font-bold dark:text-white\">\n                @lang('admin::app.leads.index.title')\n            </div>\n        </div>\n\n        {!! view_render_event('admin.leads.index.header.left.after') !!}\n\n        {!! view_render_event('admin.leads.index.header.right.before') !!}\n\n        <div class=\"flex items-center gap-x-2.5\">\n            <!-- Upload File for Lead Creation -->\n            @if(core()->getConfigData('general.magic_ai.doc_generation.enabled'))\n                @include('admin::leads.index.upload')\n            @endif\n\n            @if ((request()->view_type ?? \"kanban\") == \"table\")\n                <!-- Export Modal -->\n                <x-admin::datagrid.export :src=\"route('admin.leads.index')\" />\n            @endif\n\n            <!-- Create button for Leads -->\n            <div class=\"flex items-center gap-x-2.5\">\n                @if (bouncer()->hasPermission('leads.create'))\n                    <a\n                        href=\"{{ route('admin.leads.create', request()->query()) }}\"\n                        class=\"primary-button\"\n                    >\n                        @lang('admin::app.leads.index.create-btn')\n                    </a>\n                @endif\n            </div>\n        </div>\n\n        {!! view_render_event('admin.leads.index.header.right.after') !!}\n    </div>\n\n    {!! view_render_event('admin.leads.index.header.after') !!}\n\n    {!! view_render_event('admin.leads.index.content.before') !!}\n\n    <!-- Content -->\n    <div class=\"[&>*>*>*.toolbarRight]:max-lg:w-full [&>*>*>*.toolbarRight]:max-lg:justify-between [&>*>*>*.toolbarRight]:max-md:gap-y-2 [&>*>*>*.toolbarRight]:max-md:flex-wrap mt-3.5 [&>*>*:nth-child(1)]:max-lg:!flex-wrap\">\n        @if ((request()->view_type ?? \"kanban\") == \"table\")\n            @include('admin::leads.index.table')\n        @else\n            @include('admin::leads.index.kanban')\n        @endif\n    </div>\n\n    {!! view_render_event('admin.leads.index.content.after') !!}\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/view/attributes.blade.php",
    "content": "{!! view_render_event('admin.leads.view.attributes.before', ['lead' => $lead]) !!}\n\n<div class=\"flex w-full flex-col gap-4 border-b border-gray-200 p-4 dark:border-gray-800\">\n    <x-admin::accordion class=\"select-none !border-none\">\n        <x-slot:header class=\"!p-0\">\n            <div class=\"flex w-full items-center justify-between gap-4 font-semibold dark:text-white\">\n                <h4>@lang('admin::app.leads.view.attributes.title')</h4>\n                \n                @if (bouncer()->hasPermission('leads.edit'))\n                    <a\n                        href=\"{{ route('admin.leads.edit', $lead->id) }}\"\n                        class=\"icon-edit rounded-md p-1.5 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                        target=\"_blank\"\n                    ></a>\n                @endif\n            </div>\n        </x-slot>\n\n        <x-slot:content class=\"mt-4 !px-0 !pb-0\">\n            {!! view_render_event('admin.leads.view.attributes.form_controls.before', ['lead' => $lead]) !!}\n\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modalForm\"\n            >\n                <form @submit=\"handleSubmit($event, () => {})\">\n                    {!! view_render_event('admin.leads.view.attributes.form_controls.attributes.view.before', ['lead' => $lead]) !!}\n        \n                    <x-admin::attributes.view\n                        :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                            'entity_type' => 'leads',\n                            ['code', 'NOTIN', ['title', 'description', 'lead_pipeline_id', 'lead_pipeline_stage_id']]\n                        ])\"\n                        :entity=\"$lead\"\n                        :url=\"route('admin.leads.attributes.update', $lead->id)\"\n                        :allow-edit=\"true\"\n                    />\n        \n                    {!! view_render_event('admin.leads.view.attributes.form_controls.attributes.view.after', ['lead' => $lead]) !!}\n                </form>\n            </x-admin::form>\n        \n            {!! view_render_event('admin.leads.view.attributes.form_controls.after', ['lead' => $lead]) !!}\n        </x-slot>\n    </x-admin::accordion>\n</div>\n\n{!! view_render_event('admin.leads.view.attributes.before', ['lead' => $lead]) !!}\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/view/person.blade.php",
    "content": "{!! view_render_event('admin.leads.view.person.before', ['lead' => $lead]) !!}\n\n@if ($lead?->person)\n    <div class=\"flex w-full flex-col gap-4 border-b border-gray-200 p-4 dark:border-gray-800\">\n        <x-admin::accordion class=\"select-none !border-none\">\n            <x-slot:header class=\"!p-0\">\n                <div class=\"flex w-full items-center justify-between gap-4 font-semibold dark:text-white\">\n                    <h4 >@lang('admin::app.leads.view.persons.title')</h4>\n\n                    @if (bouncer()->hasPermission('contacts.persons.edit'))\n                        <a\n                            href=\"{{ route('admin.contacts.persons.edit', $lead->person->id) }}\"\n                            class=\"icon-edit rounded-md p-1.5 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                            target=\"_blank\"\n                        ></a>\n                    @endif\n                </div>\n            </x-slot>\n            \n            <x-slot:content class=\"mt-4 !px-0 !pb-0\">\n                <div class=\"flex gap-2\">\n                    {!! view_render_event('admin.leads.view.person.avatar.before', ['lead' => $lead]) !!}\n        \n                    <!-- Person Initials -->\n                    <x-admin::avatar :name=\"$lead->person->name\" />\n        \n                    {!! view_render_event('admin.leads.view.person.avatar.after', ['lead' => $lead]) !!}\n        \n                    <!-- Person Details -->\n                    <div class=\"flex flex-col gap-1\">\n                        {!! view_render_event('admin.leads.view.person.name.before', ['lead' => $lead]) !!}\n        \n                        <a\n                            href=\"{{ route('admin.contacts.persons.view', $lead->person->id) }}\"\n                            class=\"font-semibold text-brandColor\"\n                            target=\"_blank\"\n                        >\n                            {{ $lead->person->name }}\n                        </a>\n        \n                        {!! view_render_event('admin.leads.view.person.name.after', ['lead' => $lead]) !!}\n        \n                        {!! view_render_event('admin.leads.view.person.job_title.before', ['lead' => $lead]) !!}\n        \n                        @if ($lead->person->job_title)\n                            <span class=\"dark:text-white\">\n                                @if ($lead->person->organization)\n                                    @lang('admin::app.leads.view.persons.job-title', [\n                                        'job_title' => $lead->person->job_title,\n                                        'organization' => $lead->person->organization->name\n                                    ])\n                                @else\n                                    {{ $lead->person->job_title }}\n                                @endif\n                            </span>\n                        @endif\n        \n                        {!! view_render_event('admin.leads.view.person.job_title.after', ['lead' => $lead]) !!}\n                    \n                        {!! view_render_event('admin.leads.view.person.email.before', ['lead' => $lead]) !!}\n        \n                        @foreach ($lead->person->emails as $email)\n                            <div class=\"flex gap-1\">\n                                <a \n                                    class=\"text-brandColor\"\n                                    href=\"mailto:{{ $email['value'] }}\"\n                                >\n                                    {{ $email['value'] }}\n                                </a>\n        \n                                <span class=\"text-gray-500 dark:text-gray-300\">\n                                    ({{ $email['label'] }})\n                                </span>\n                            </div>\n                        @endforeach\n        \n                        {!! view_render_event('admin.leads.view.person.email.after', ['lead' => $lead]) !!}\n        \n                        {!! view_render_event('admin.leads.view.person.contact_numbers.before', ['lead' => $lead]) !!}\n                    \n                        @foreach ($lead->person->contact_numbers as $contactNumber)\n                            <div class=\"flex gap-1\">\n                                <a  \n                                    class=\"text-brandColor\"\n                                    href=\"callto:{{ $contactNumber['value'] }}\"\n                                >\n                                    {{ $contactNumber['value'] }}\n                                </a>\n        \n                                <span class=\"text-gray-500 dark:text-gray-300\">\n                                    ({{ $contactNumber['label'] }})\n                                </span>\n                            </div>\n                        @endforeach\n        \n                        {!! view_render_event('admin.leads.view.person.contact_numbers.after', ['lead' => $lead]) !!}\n                    </div>\n                </div>\n            </x-slot>\n        </x-admin::accordion>\n    </div>\n@endif\n{!! view_render_event('admin.leads.view.person.after', ['lead' => $lead]) !!}"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/view/products.blade.php",
    "content": "{!! view_render_event('admin.leads.view.products.before', ['lead' => $lead]) !!}\n\n<v-lead-products></v-lead-products>\n\n{!! view_render_event('admin.leads.view.products.after', ['lead' => $lead]) !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-lead-products-template\"\n    >\n        <div v-if=\"products.length\" class=\"flex flex-col gap-4 p-3\">\n            {!! view_render_event('admin.leads.view.products.table.before', ['lead' => $lead]) !!}\n\n            <!-- Table -->\n            <div class=\"block w-full overflow-x-auto\">\n                <x-admin::table>\n                    {!! view_render_event('admin.leads.view.products.table.table_head.before', ['lead' => $lead]) !!}\n\n                    <!-- Table Head -->\n                    <x-admin::table.thead>\n                        <x-admin::table.thead.tr>\n                            <x-admin::table.th>\n                                @lang('admin::app.leads.view.products.product-name')\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"ltr:text-left rtl:text-right\">\n                                @lang('admin::app.leads.view.products.quantity')\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"ltr:text-left rtl:text-right\">\n                                @lang('admin::app.leads.view.products.price')\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"ltr:text-left rtl:text-right\">\n                                @lang('admin::app.leads.view.products.amount')\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"ltr:text-right rtl:text-left\">\n                                @lang('admin::app.leads.view.products.action')\n                            </x-admin::table.th>\n                        </x-admin::table.thead.tr>\n                    </x-admin::table.thead>\n\n                    {!! view_render_event('admin.leads.view.products.table.table_head.after', ['lead' => $lead]) !!}\n\n                    {!! view_render_event('admin.leads.view.products.table.table_body.before', ['lead' => $lead]) !!}\n\n                    <!-- Table Body -->\n                    <x-admin::table.tbody>\n                        <!-- Product Item Vue Component -->\n                        <v-product-item\n                            v-for='(product, index) in products'\n                            :product=\"product\"\n                            :key=\"index\"\n                            :index=\"index\"\n                            @onRemoveProduct=\"removeProduct($event)\"\n                        ></v-product-item>\n                    </x-admin::table.tbody>\n                    {!! view_render_event('admin.leads.view.products.table.table_body.after', ['lead' => $lead]) !!}\n                </x-admin::table>\n            </div>\n            \n            {!! view_render_event('admin.leads.view.products.table.after', ['lead' => $lead]) !!}\n\n            {!! view_render_event('admin.leads.view.products.table.add_more.before', ['lead' => $lead]) !!}\n\n            <!-- Add New Product Item -->\n            <div>\n                <button\n                    type=\"button\"\n                    class=\"flex max-w-max items-center gap-2 text-brandColor\"\n                    @click=\"addProduct\"\n                >\n                    <i class=\"icon-add text-md !text-brandColor\"></i>\n\n                    @lang('admin::app.leads.view.products.add-more')\n                </button>\n            </div>\n\n            {!! view_render_event('admin.leads.view.products.table.add_more.after', ['lead' => $lead]) !!}\n        </div>\n\n        <div v-else>\n            <div class=\"grid justify-center justify-items-center gap-3.5 py-12\">\n                <img\n                    class=\"dark:mix-blend-exclusion dark:invert\"\n                    src=\"{{ vite()->asset('images/empty-placeholders/products.svg') }}\"\n                >\n\n                <div class=\"flex flex-col items-center gap-2\">\n                    <p class=\"text-xl font-semibold dark:text-white\">\n                        @lang('admin::app.leads.view.products.empty-title')\n                    </p>\n\n                    <p class=\"text-gray-400 dark:text-gray-400\">\n                        @lang('admin::app.leads.view.products.empty-info')\n                    </p>\n                </div>\n\n                <div\n                    class=\"secondary-button\"\n                    @click=\"addProduct\"\n                >\n                     @lang('admin::app.leads.view.products.add-product')\n                </div>\n            </div>\n        </div>\n    </script>\n\n    <script\n        type=\"text/x-template\"\n        id=\"v-product-item-template\"\n    >\n        <x-admin::table.tbody.tr class=\"border-b border-gray-200 align-top dark:border-gray-800\">\n            <!-- Product Name -->\n            <x-admin::table.td class=\"!px-4\">\n                <v-form v-slot=\"{ errors }\" @keydown.enter.prevent>\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::lookup\n                            ::key=\"product.product_id\"\n                            ::src=\"src\"\n                            name=\"name\"\n                            ::params=\"params\"\n                            :placeholder=\"trans('admin::app.leads.view.products.product-name')\"\n                            @on-selected=\"(product) => addProduct(product)\"\n                            ::value=\"{ id: product.product_id, name: product.name }\"\n                        />\n\n                        <x-admin::form.control-group.control\n                            type=\"hidden\"\n                            name=\"product_id\"\n                            v-model=\"product.product_id\"\n                            rules=\"required\"\n                            :label=\"trans('admin::app.leads.view.products.product-name')\"\n                            :placeholder=\"trans('admin::app.leads.view.products.product-name')\"\n                            ::url=\"url(product)\"\n                        />\n\n                        <x-admin::form.control-group.error ::name=\"`${inputName}[product_id]`\" />\n                    </x-admin::form.control-group>\n                </v-form>\n            </x-admin::table.td>\n\n            <!-- Product Quantity -->\n            <x-admin::table.td class=\"!px-4 ltr:text-right rtl:text-left\">\n                <v-form v-slot=\"{ errors }\" @keydown.enter.prevent>\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.control\n                            type=\"inline\"\n                            ::name=\"'quantity'\"\n                            ::value=\"product.quantity\"\n                            rules=\"required|decimal:4\"\n                            :label=\"trans('admin::app.leads.view.products.quantity')\"\n                            :placeholder=\"trans('admin::app.leads.view.products.quantity')\"\n                            @on-change=\"(event) => product.quantity = event.value\"\n                            ::url=\"url(product)\"\n                            ::params=\"{product_id: product.product_id}\"\n                            position=\"left\"\n                            ::errors=\"errors\"\n                        />\n                    </x-admin::form.control-group>\n                </v-form>\n            </x-admin::table.td>\n\n            <!-- Price -->\n            <x-admin::table.td class=\"!px-4 ltr:text-right rtl:text-left\">\n                <v-form v-slot=\"{ errors }\" @keydown.enter.prevent>\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.control\n                            type=\"inline\"\n                            ::name=\"'price'\"\n                            ::value=\"product.price\"\n                            rules=\"required|decimal:4\"\n                            :label=\"trans('admin::app.leads.view.products.price')\"\n                            :placeholder=\"trans('admin::app.leads.view.products.price')\"\n                            @on-change=\"(event) => product.price = event.value\"\n                            ::url=\"url(product)\"\n                            ::params=\"{product_id: product.product_id}\"\n                            position=\"left\"\n                            ::value-label=\"$admin.formatPrice(product.price)\"\n                            ::errors=\"errors\"\n                        />\n                    </x-admin::form.control-group>\n                </v-form>\n            </x-admin::table.td>\n\n            <!-- Total -->\n            <x-admin::table.td class=\"!px-4 ltr:text-right rtl:text-left\">\n                <v-form v-slot=\"{ errors }\" @keydown.enter.prevent>\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.control\n                            type=\"inline\"\n                            ::name=\"'amount'\"\n                            ::value=\"product.price * product.quantity\"\n                            rules=\"required|decimal:4\"\n                            :label=\"trans('admin::app.leads.view.products.total')\"\n                            :placeholder=\"trans('admin::app.leads.view.products.total')\"\n                            :allowEdit=\"false\"\n                            ::url=\"url(product)\"\n                            position=\"left\"\n                            ::value-label=\"$admin.formatPrice(product.price * product.quantity)\"\n                            ::errors=\"errors\"\n                        />\n                    </x-admin::form.control-group>\n                </v-form>\n            </x-admin::table.td>\n\n            <!-- Action -->\n            <x-admin::table.td class=\"ltr:text-right rtl:text-left\">\n                <template v-if=\"product.is_new\">\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <div class=\"flex items-center justify-center gap-4\">\n                            <i\n                                @click=\"attachProduct(product)\"\n                                class=\"icon-enter cursor-pointer text-2xl text-black\"\n                            ></i>\n\n                            <i\n                                @click=\"removeProduct\"\n                                class=\"icon-cross-large cursor-pointer text-2xl text-black\"\n                            ></i>\n                        </div>\n                    </x-admin::form.control-group>\n                </template>\n\n                <template v-else>\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <i\n                            @click=\"removeProduct\"\n                            class=\"icon-delete cursor-pointer text-2xl\"\n                        ></i>\n                    </x-admin::form.control-group>\n                </template>\n            </x-admin::table.td>\n        </x-admin::table.tbody.tr>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-lead-products', {\n            template: '#v-lead-products-template',\n\n            props: ['data'],\n\n            data: function () {\n                return {\n                    products: @json($lead->products),\n                }\n            },\n\n            methods: {\n                addProduct() {\n                    this.products.push({\n                        is_new: true,\n                        id: null,\n                        product_id: null,\n                        name: '',\n                        quantity: 0,\n                        price: 0,\n                        amount: null,\n                    })\n                },\n\n                removeProduct (product) {\n                    const index = this.products.indexOf(product);\n                    this.products.splice(index, 1);\n                },\n            },\n        });\n\n        app.component('v-product-item', {\n            template: '#v-product-item-template',\n\n            props: ['index', 'product'],\n\n            data() {\n                return {\n                    products: [],\n                }\n            },\n\n            computed: {\n                inputName() {\n                    if (this.product.id) {\n                        return \"products[\" + this.product.id + \"]\";\n                    }\n\n                    return \"products[product_\" + this.index + \"]\";\n                },\n\n                src() {\n                    return '{{ route('admin.products.search') }}';\n                },\n\n                params() {\n                    return {\n                        params: {\n                            query: this.product.name\n                        },\n                    };\n                },\n            },\n\n            methods: {\n                /**\n                 * Add the product.\n                 *\n                 * @param {Object} result\n                 *\n                 * @return {void}\n                 */\n                addProduct(result) {\n                    this.product.product_id = result.id;\n\n                    this.product.name = result.name;\n\n                    this.product.price = result.price;\n\n                    this.product.quantity = result.quantity ?? 0;\n                },\n\n                /**\n                 * Attach Product.\n                 *\n                 * @return {void}\n                 */\n                attachProduct(product) {\n                    this.$axios.post('{{ route('admin.leads.product.add', $lead->id) }}', {\n                        _method: 'PUT',\n                        ...product,\n                    })\n                        .then(response => {\n                            this.product.is_new = false;\n\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                        })\n                        .catch(error => {});\n                },\n\n                /**\n                 * Remove the product.\n                 *\n                 * @return {void}\n                 */\n                removeProduct() {\n                    this.$emitter.emit('open-confirm-modal', {\n                        agree: () => {\n                            this.$axios.post('{{ route('admin.leads.product.remove', $lead->id) }}', {\n                                _method: 'DELETE',\n                                product_id: this.product.product_id,\n                            })\n                                .then(response => {\n                                    this.$emit('onRemoveProduct', this.product);\n\n                                    this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                                })\n                                .catch(error => {});\n                        },\n                    });\n                },\n\n                /**\n                 * Get the product URL.\n                 *\n                 * @param {Object} product\n                 *\n                 * @return {String}\n                 */\n                url(product) {\n                    if (product.is_new) {\n                        return;\n                    }\n\n                    return '{{ route('admin.leads.product.add', $lead->id) }}';\n                }\n            }\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/view/quotes.blade.php",
    "content": "{!! view_render_event('admin.leads.view.quotes.before', ['lead' => $lead]) !!}\n\n<v-lead-quotes></v-lead-quotes>\n\n{!! view_render_event('admin.leads.view.quotes.after', ['lead' => $lead]) !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-lead-quotes-template\"\n    >\n        @if (bouncer()->hasPermission('quotes'))\n            <div class=\"p-3\">\n                {!! view_render_event('admin.leads.view.quotes.table.before', ['lead' => $lead]) !!}\n\n                <x-admin::table v-if=\"quotes.length\">\n                    {!! view_render_event('admin.leads.view.quotes.table.table_head.before', ['lead' => $lead]) !!}\n\n                    <x-admin::table.thead>\n                        <x-admin::table.thead.tr>\n                            <x-admin::table.th class=\"!px-2\">\n                                @lang('admin::app.leads.view.quotes.subject')\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"!px-2\">\n                                @lang('admin::app.leads.view.quotes.expired-at')\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"!px-2\">\n                                @lang('admin::app.leads.view.quotes.sub-total')\n                                <span class=\"currency-code\">({{ core()->currencySymbol(config('app.currency')) }})</span>\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"!px-2\">\n                                @lang('admin::app.leads.view.quotes.discount')\n                                <span class=\"currency-code\">({{ core()->currencySymbol(config('app.currency')) }})</span>\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"!px-2\">\n                                @lang('admin::app.leads.view.quotes.tax')\n                                <span class=\"currency-code\">({{ core()->currencySymbol(config('app.currency')) }})</span>\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"!px-2\">\n                                @lang('admin::app.leads.view.quotes.adjustment')\n                                <span class=\"currency-code\">({{ core()->currencySymbol(config('app.currency')) }})</span>\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"!px-2\">\n                                @lang('admin::app.leads.view.quotes.grand-total')\n                                <span class=\"currency-code\">({{ core()->currencySymbol(config('app.currency')) }})</span>\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"actions\"></x-admin::table.th>\n                        </x-admin::table.thead.tr>\n                    </x-admin::table.thead>\n\n                    {!! view_render_event('admin.leads.view.quotes.table.table_head.after', ['lead' => $lead]) !!}\n\n                    {!! view_render_event('admin.leads.view.quotes.table.table_body.before', ['lead' => $lead]) !!}\n\n                    <x-admin::table.tbody>\n                        <x-admin::table.tbody.tr v-for=\"quote in quotes\" class=\"border-b\">\n                            <x-admin::table.td class=\"text-wrap !px-2\">@{{ quote.subject }}</x-admin::table.td>\n\n                            <x-admin::table.td class=\"!px-2\">@{{ quote.expired_at }}</x-admin::table.td>\n\n                            <x-admin::table.td class=\"!px-2\">@{{ quote.sub_total }}</x-admin::table.td>\n\n                            <x-admin::table.td class=\"!px-2\">@{{ quote.discount_amount }}</x-admin::table.td>\n\n                            <x-admin::table.td class=\"!px-2\">@{{ quote.tax_amount }}</x-admin::table.td>\n\n                            <x-admin::table.td class=\"!px-2\">@{{ quote.adjustment_amount }}</x-admin::table.td>\n\n                            <x-admin::table.td class=\"!px-2\">@{{ quote.grand_total }}</x-admin::table.td>\n\n                            <x-admin::table.td class=\"!px-2\">\n                                {!! view_render_event('admin.leads.view.quotes.table.table_body.dropdown.before', ['lead' => $lead]) !!}\n\n                                <x-admin::dropdown position=\"bottom-right\">\n                                    <x-slot:toggle>\n                                        <i class=\"icon-more text-2xl\"></i>\n                                    </x-slot>\n\n                                    <x-slot:menu class=\"!min-w-40\">\n                                        @if (bouncer()->hasPermission('quotes.edit'))\n                                            {!! view_render_event('admin.leads.view.quotes.table.table_body.dropdown.item.before', ['lead' => $lead]) !!}\n\n                                            <x-admin::dropdown.menu.item>\n                                                <a :href=\"'{{ route('admin.quotes.edit') }}/' + quote.id + '?from=lead&lead_id={{ $lead->id }}'\">\n                                                    <div class=\"flex items-center gap-2\">\n                                                        <span class=\"icon-edit text-2xl\"></span>\n\n                                                        @lang('admin::app.leads.view.quotes.edit')\n                                                    </div>\n                                                </a>\n                                            </x-admin::dropdown.menu.item>\n\n                                            {!! view_render_event('admin.leads.view.quotes.table.table_body.dropdown.item.after', ['lead' => $lead]) !!}\n                                        @endif\n\n                                        @if (bouncer()->hasPermission('quotes.print'))\n                                            {!! view_render_event('admin.leads.view.quotes.table.table_body.dropdown.item.before', ['lead' => $lead]) !!}\n\n                                            <x-admin::dropdown.menu.item>\n                                                <a :href=\"'{{ route('admin.quotes.print') }}/' + quote.id\" target=\"_blank\">\n                                                    <div class=\"flex items-center gap-2\">\n                                                        <span class=\"icon-download text-2xl\"></span>\n\n                                                        @lang('admin::app.leads.view.quotes.download')\n                                                    </div>\n                                                </a>\n\n                                            </x-admin::dropdown.menu.item>\n\n                                            {!! view_render_event('admin.leads.view.quotes.table.table_body.dropdown.item.after', ['lead' => $lead]) !!}\n                                        @endif\n\n                                        @if (bouncer()->hasPermission('quotes.delete'))\n                                            {!! view_render_event('admin.leads.view.quotes.table.table_body.dropdown.item.before', ['lead' => $lead]) !!}\n\n                                            <x-admin::dropdown.menu.item @click=\"removeQuote(quote)\">\n                                                <div class=\"flex items-center gap-2\">\n                                                    <span class=\"icon-delete text-2xl\"></span>\n\n                                                    @lang('admin::app.leads.view.quotes.delete')\n                                                </div>\n                                            </x-admin::dropdown.menu.item>\n\n                                            {!! view_render_event('admin.leads.view.quotes.table.table_body.dropdown.item.after', ['lead' => $lead]) !!}\n                                        @endif\n                                    </x-slot>\n                                </x-admin::dropdown>\n\n                                {!! view_render_event('admin.leads.view.quotes.table.table_body.dropdown.after', ['lead' => $lead]) !!}\n                            </x-admin::table.td>\n                        </x-admin::table.tbody.tr>\n                    </x-admin::table.tbody>\n\n                    {!! view_render_event('admin.leads.view.quotes.table.table_body.after', ['lead' => $lead]) !!}\n                </x-admin::table>\n\n                {!! view_render_event('admin.leads.view.quotes.table.after', ['lead' => $lead]) !!}\n\n                <div v-else>\n                    <div class=\"grid justify-center justify-items-center gap-3.5 py-12\">\n                        <img\n                            class=\"dark:mix-blend-exclusion dark:invert\"\n                            src=\"{{ vite()->asset('images/empty-placeholders/quotes.svg') }}\"\n                        >\n\n                        <div class=\"flex flex-col items-center gap-2\">\n                            <p class=\"text-xl font-semibold dark:text-white\">\n                                @lang('admin::app.leads.view.quotes.empty-title')\n                            </p>\n\n                            <p class=\"text-gray-400\">\n                                @lang('admin::app.leads.view.quotes.empty-info')\n                            </p>\n                        </div>\n\n                        <a\n                            class=\"secondary-button\"\n                            href=\"{{ route('admin.quotes.create', $lead->id) }}?from=lead\"\n                        >\n                            @lang('admin::app.leads.view.quotes.add-btn')\n                        </a>\n                    </div>\n                </div>\n            </div>\n        @endif\n    </script>\n\n\n    <script type=\"module\">\n        app.component('v-lead-quotes', {\n            template: '#v-lead-quotes-template',\n\n            props: ['data'],\n\n            data: function () {\n                return {\n                    quotes: @json($lead->quotes()->with(['person', 'user'])->get())\n                }\n            },\n\n            methods: {\n                removeQuote(quote) {\n                    this.$emitter.emit('open-confirm-modal', {\n                        agree: () => {\n                            this.isLoading = true;\n\n                            this.$axios.delete(\"{{ route('admin.leads.quotes.delete', $lead->id) }}/\" + quote.id)\n                                .then(response => {\n                                    this.isLoading = false;\n\n                                    const index = this.quotes.indexOf(quote);\n\n                                    if (index !== -1) {\n                                        this.quotes.splice(index, 1);\n                                    }\n\n                                    this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                                })\n                                .catch(error => {\n                                    this.isLoading = false;\n\n                                    this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                                });\n                        }\n                    });\n                }\n\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/view/stages.blade.php",
    "content": "<!-- Stages Navigation -->\n{!! view_render_event('admin.leads.view.stages.before', ['lead' => $lead]) !!}\n\n<!-- Stages Vue Component -->\n<v-lead-stages>\n    <x-admin::shimmer.leads.view.stages :count=\"$lead->pipeline->stages->count() - 1\" />\n</v-lead-stages>\n\n{!! view_render_event('admin.leads.view.stages.after', ['lead' => $lead]) !!}\n\n@pushOnce('scripts')\n    <script type=\"text/x-template\" id=\"v-lead-stages-template\">\n        <!-- Stages Container -->\n        <div\n            class=\"flex w-full max-w-full overflow-auto\"\n            :class=\"{'opacity-50 pointer-events-none': isUpdating}\"\n        >\n            <!-- Stages Item -->\n            <template v-for=\"stage in stages\">\n                {!! view_render_event('admin.leads.view.stages.items.before', ['lead' => $lead]) !!}\n\n                <div\n                    class=\"stage relative flex h-7 cursor-pointer items-center justify-center bg-white pl-7 pr-4 dark:bg-gray-900 ltr:first:rounded-l-lg rtl:first:rounded-r-lg\"\n                    :class=\"{\n                        '!bg-green-500 text-white dark:text-gray-900 ltr:after:bg-green-500 rtl:before:bg-green-500': currentStage.sort_order >= stage.sort_order,\n                        '!bg-red-500 text-white dark:text-gray-900 ltr:after:bg-red-500 rtl:before:bg-red-500': currentStage.code == 'lost',\n                    }\"\n                    v-if=\"! ['won', 'lost'].includes(stage.code)\"\n                    @click=\"update(stage)\"\n                >\n                    <span class=\"z-20 whitespace-nowrap text-sm font-medium dark:text-white\">\n                        @{{ stage.name }}\n                    </span>\n                </div>\n\n                {!! view_render_event('admin.leads.view.stages.items.after', ['lead' => $lead]) !!}\n            </template>\n\n            {!! view_render_event('admin.leads.view.stages.items.dropdown.before', ['lead' => $lead]) !!}\n\n            <!-- Won/Lost Stage Item -->\n            <x-admin::dropdown position=\"bottom-right\">\n                <x-slot:toggle>\n                    {!! view_render_event('admin.leads.view.stages.items.dropdown.toggle.before', ['lead' => $lead]) !!}\n\n                    <div\n                        class=\"relative flex h-7 min-w-24 cursor-pointer items-center justify-center rounded-r-lg bg-white pl-7 pr-4 dark:bg-gray-900\"\n                        :class=\"{\n                            '!bg-green-500 text-white dark:text-gray-900 after:bg-green-500': ['won', 'lost'].includes(currentStage.code) && currentStage.code == 'won',\n                            '!bg-red-500 text-white dark:text-gray-900 after:bg-red-500': ['won', 'lost'].includes(currentStage.code) && currentStage.code == 'lost',\n                        }\"\n                        @click=\"stageToggler = ! stageToggler\"\n                    >\n                        <span class=\"z-20 whitespace-nowrap text-sm font-medium dark:text-white\">\n                             @{{ stages.filter(stage => ['won', 'lost'].includes(stage.code)).map(stage => stage.name).join('/') }}\n                        </span>\n\n                        <span\n                            class=\"text-2xl dark:text-gray-900\"\n                            :class=\"{'icon-up-arrow': stageToggler, 'icon-down-arrow': ! stageToggler}\"\n                        ></span>\n                    </div>\n\n                    {!! view_render_event('admin.leads.view.stages.items.dropdown.toggle.after', ['lead' => $lead]) !!}\n                </x-slot>\n\n                <x-slot:menu>\n                    {!! view_render_event('admin.leads.view.stages.items.dropdown.menu_item.before', ['lead' => $lead]) !!}\n\n                    <x-admin::dropdown.menu.item\n                        v-for=\"stage in stages.filter(stage => ['won', 'lost'].includes(stage.code))\"\n                        @click=\"openModal(stage)\"\n                    >\n                        @{{ stage.name }}\n                    </x-admin::dropdown.menu.item>\n\n                    {!! view_render_event('admin.leads.view.stages.items.dropdown.menu_item.after', ['lead' => $lead]) !!}\n                </x-slot>\n            </x-admin::dropdown>\n\n            {!! view_render_event('admin.leads.view.stages.items.dropdown.after', ['lead' => $lead]) !!}\n\n            {!! view_render_event('admin.leads.view.stages.form_controls.before', ['lead' => $lead]) !!}\n\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"stageUpdateForm\"\n            >\n                <form @submit=\"handleSubmit($event, handleFormSubmit)\">\n                    {!! view_render_event('admin.leads.view.stages.form_controls.modal.before', ['lead' => $lead]) !!}\n\n                    <x-admin::modal ref=\"stageUpdateModal\">\n                        <x-slot:header>\n                            {!! view_render_event('admin.leads.view.stages.form_controls.modal.header.before', ['lead' => $lead]) !!}\n\n                            <h3 class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.leads.view.stages.need-more-info')\n                            </h3>\n\n                            {!! view_render_event('admin.leads.view.stages.form_controls.modal.header.after', ['lead' => $lead]) !!}\n                        </x-slot>\n\n                        <x-slot:content>\n                            {!! view_render_event('admin.leads.view.stages.form_controls.modal.content.before', ['lead' => $lead]) !!}\n\n                            <!-- Won Value -->\n                            <template v-if=\"nextStage.code == 'won'\">\n                                <x-admin::form.control-group>\n                                    <x-admin::form.control-group.label>\n                                        @lang('admin::app.leads.view.stages.won-value')\n                                    </x-admin::form.control-group.label>\n\n                                    <x-admin::form.control-group.control\n                                        type=\"price\"\n                                        name=\"lead_value\"\n                                        :value=\"$lead->lead_value\"\n                                        v-model=\"nextStage.lead_value\"\n                                    />\n                                </x-admin::form.control-group>\n                            </template>\n\n                            <!-- Lost Reason -->\n                            <template v-else>\n                                <x-admin::form.control-group>\n                                    <x-admin::form.control-group.label>\n                                        @lang('admin::app.leads.view.stages.lost-reason')\n                                    </x-admin::form.control-group.label>\n\n                                    <x-admin::form.control-group.control\n                                        type=\"textarea\"\n                                        name=\"lost_reason\"\n                                        v-model=\"nextStage.lost_reason\"\n                                    />\n                                </x-admin::form.control-group>\n                            </template>\n\n                            <!-- Closed At -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label>\n                                    @lang('admin::app.leads.view.stages.closed-at')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"datetime\"\n                                    name=\"closed_at\"\n                                    v-model=\"nextStage.closed_at\"\n                                    :label=\"trans('admin::app.leads.view.stages.closed-at')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"closed_at\"/>\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.leads.view.stages.form_controls.modal.content.after', ['lead' => $lead]) !!}\n                        </x-slot>\n\n                        <x-slot:footer>\n                            {!! view_render_event('admin.leads.view.stages.form_controls.modal.footer.before', ['lead' => $lead]) !!}\n\n                            <button\n                                type=\"submit\"\n                                class=\"primary-button\"\n                            >\n                                @lang('admin::app.leads.view.stages.save-btn')\n                            </button>\n\n                            {!! view_render_event('admin.leads.view.stages.form_controls.modal.footer.after', ['lead' => $lead]) !!}\n                        </x-slot>\n                    </x-admin::modal>\n\n                    {!! view_render_event('admin.leads.view.stages.form_controls.modal.after', ['lead' => $lead]) !!}\n                </form>\n            </x-admin::form>\n\n            {!! view_render_event('admin.leads.view.stages.form_controls.after', ['lead' => $lead]) !!}\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-lead-stages', {\n            template: '#v-lead-stages-template',\n\n            data() {\n                return {\n                    isUpdating: false,\n\n                    currentStage: @json($lead->stage),\n\n                    nextStage: null,\n\n                    stages: @json($lead->pipeline->stages),\n\n                    stageToggler: '',\n                }\n            },\n\n            methods: {\n                openModal(stage) {\n                    if (this.currentStage.code == stage.code) {\n                        return;\n                    }\n\n                    this.nextStage = stage;\n\n                    this.$refs.stageUpdateModal.open();\n                },\n\n                handleFormSubmit(event) {\n                    let params = {\n                        'lead_pipeline_stage_id': this.nextStage.id\n                    };\n\n                    if (this.nextStage.code == 'won') {\n                        params.lead_value = this.nextStage.lead_value;\n\n                        params.closed_at = this.nextStage.closed_at;\n                    } else if (this.nextStage.code == 'lost') {\n                        params.lost_reason = this.nextStage.lost_reason;\n\n                        params.closed_at = this.nextStage.closed_at;\n                    }\n\n                    this.update(this.nextStage, params);\n                },\n\n                update(stage, params = null) {\n                    if (this.currentStage.code == stage.code) {\n                        return;\n                    }\n\n                    this.$refs.stageUpdateModal.close();\n\n                    this.isUpdating = true;\n\n                    this.$axios\n                        .put(\"{{ route('admin.leads.stage.update', $lead->id) }}\", params ?? {\n                            'lead_pipeline_stage_id': stage.id\n                        })\n                        .then ((response) => {\n                            this.isUpdating = false;\n\n                            this.currentStage = stage;\n\n                            this.$parent.$refs.activities.get();\n\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                        })\n                        .catch ((error) => {\n                            this.isUpdating = false;\n\n                            this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                        });\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/leads/view.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.leads.view.title', ['title' => strip_tags($lead->title)])\n    </x-slot>\n\n    <!-- Content -->\n    <div class=\"relative flex gap-4 max-lg:flex-wrap\">\n\n        <!-- Left Panel -->\n        {!! view_render_event('admin.leads.view.left.before', ['lead' => $lead]) !!}\n\n        <div class=\"max-lg:min-w-full max-lg:max-w-full [&>div:last-child]:border-b-0 lg:sticky lg:top-[73px] flex min-w-[394px] max-w-[394px] flex-col self-start rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n            <!-- Lead Information -->\n            <div class=\"flex w-full flex-col gap-2 border-b border-gray-200 p-4 dark:border-gray-800\">\n                <!-- Breadcrumb's -->\n                <div class=\"flex items-center justify-between\">\n                    <x-admin::breadcrumbs\n                        name=\"leads.view\"\n                        :entity=\"$lead\"\n                    />\n                </div>\n\n                <div class=\"mb-2\">\n                    @if (($days = $lead->rotten_days) > 0)\n                        @php\n                            $lead->tags->prepend([\n                                'name' => '<span class=\"icon-rotten text-base\"></span>' . trans('admin::app.leads.view.rotten-days', ['days' => $days]),\n                                'color' => '#FEE2E2'\n                            ]);\n                        @endphp\n                    @endif\n\n                    {!! view_render_event('admin.leads.view.tags.before', ['lead' => $lead]) !!}\n\n                    <!-- Tags -->\n                    <x-admin::tags\n                        :attach-endpoint=\"route('admin.leads.tags.attach', $lead->id)\"\n                        :detach-endpoint=\"route('admin.leads.tags.detach', $lead->id)\"\n                        :added-tags=\"$lead->tags\"\n                    />\n\n                    {!! view_render_event('admin.leads.view.tags.after', ['lead' => $lead]) !!}\n                </div>\n\n\n                {!! view_render_event('admin.leads.view.title.before', ['lead' => $lead]) !!}\n\n                <!-- Title -->\n                <h1 class=\"text-lg font-bold dark:text-white\">\n                    {{ $lead->title }}\n                </h1>\n\n                {!! view_render_event('admin.leads.view.title.after', ['lead' => $lead]) !!}\n\n                <!-- Activity Actions -->\n                <div class=\"flex flex-wrap gap-2\">\n                    {!! view_render_event('admin.leads.view.actions.before', ['lead' => $lead]) !!}\n\n                    @if (bouncer()->hasPermission('mail.compose'))\n                        <!-- Mail Activity Action -->\n                        <x-admin::activities.actions.mail\n                            :entity=\"$lead\"\n                            entity-control-name=\"lead_id\"\n                        />\n                    @endif\n\n                    @if (bouncer()->hasPermission('activities.create'))\n                        <!-- File Activity Action -->\n                        <x-admin::activities.actions.file\n                            :entity=\"$lead\"\n                            entity-control-name=\"lead_id\"\n                        />\n\n                        <!-- Note Activity Action -->\n                        <x-admin::activities.actions.note\n                            :entity=\"$lead\"\n                            entity-control-name=\"lead_id\"\n                        />\n\n                        <!-- Activity Action -->\n                        <x-admin::activities.actions.activity\n                            :entity=\"$lead\"\n                            entity-control-name=\"lead_id\"\n                        />\n                    @endif\n\n                    {!! view_render_event('admin.leads.view.actions.after', ['lead' => $lead]) !!}\n                </div>\n            </div>\n\n            <!-- Lead Attributes -->\n            @include ('admin::leads.view.attributes')\n\n            <!-- Contact Person -->\n            @include ('admin::leads.view.person')\n        </div>\n\n        {!! view_render_event('admin.leads.view.left.after', ['lead' => $lead]) !!}\n\n        {!! view_render_event('admin.leads.view.right.before', ['lead' => $lead]) !!}\n\n        <!-- Right Panel -->\n        <div class=\"flex w-full flex-col gap-4 rounded-lg\">\n            <!-- Stages Navigation -->\n            @include ('admin::leads.view.stages')\n\n            <!-- Activities -->\n            {!! view_render_event('admin.leads.view.activities.before', ['lead' => $lead]) !!}\n\n            <x-admin::activities\n                :endpoint=\"route('admin.leads.activities.index', $lead->id)\"\n                :email-detach-endpoint=\"route('admin.leads.emails.detach', $lead->id)\"\n                :activeType=\"request()->query('from') === 'quotes' ? 'quotes' : 'all'\"\n                :extra-types=\"[\n                    ['name' => 'description', 'label' => trans('admin::app.leads.view.tabs.description')],\n                    ['name' => 'products', 'label' => trans('admin::app.leads.view.tabs.products')],\n                    ['name' => 'quotes', 'label' => trans('admin::app.leads.view.tabs.quotes')],\n                ]\"\n            >\n                <!-- Products -->\n                <x-slot:products>\n                    @include ('admin::leads.view.products')\n                </x-slot>\n\n                <!-- Quotes -->\n                <x-slot:quotes>\n                    @include ('admin::leads.view.quotes')\n                </x-slot>\n\n                <!-- Description -->\n                <x-slot:description>\n                    <div class=\"p-4 dark:text-white\">\n                        {{ $lead->description }}\n                    </div>\n                </x-slot>\n            </x-admin::activities>\n\n            {!! view_render_event('admin.leads.view.activities.after', ['lead' => $lead]) !!}\n        </div>\n\n        {!! view_render_event('admin.leads.view.right.after', ['lead' => $lead]) !!}\n    </div>\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/mail/index.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.mail.index.' . $route)\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.mail.create.breadcrumbs.before') !!}\n                \n                <!-- breadcrumbs -->\n                <x-admin::breadcrumbs\n                    name=\"mail.route\"\n                    :entity=\"$route\"\n                />\n\n                {!! view_render_event('admin.mail.create.breadcrumbs.after') !!}\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    <!-- title -->\n                    @lang('admin::app.mail.index.' . $route)\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.mail.create.compose_mail_btn.before') !!}\n\n                    <!-- Create button for person -->\n                    @if (bouncer()->hasPermission('mail.compose'))\n                        <button\n                            type=\"button\"\n                            class=\"primary-button\"\n                            @click=\"$refs.composeMail.toggleModal()\"\n                        >\n                            @lang('admin::app.mail.index.compose-mail-btn')\n                        </button>\n                    @endif\n\n                    {!! view_render_event('admin.mail.create.compose_mail_btn.after') !!}\n                </div>\n            </div>\n        </div>\n\n        <!-- Compose Mail Vue Component -->\n        <v-mail ref=\"composeMail\">\n            <!-- Datagrid Shimmer -->\n            <x-admin::shimmer.mail.datagrid :is-multi-row=\"true\"/>\n        </v-mail>\n    </div>\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-mail-template\"\n        >\n            {!! view_render_event('admin.mail.'. $route .'.datagrid.before') !!}\n\n            <!-- DataGrid -->\n            <x-admin::datagrid\n                ref=\"datagrid\"\n                :src=\"route('admin.mail.index', $route)\"\n            >\n                <template #header=\"{\n                    isLoading,\n                    available,\n                    applied,\n                    selectAll,\n                    sort,\n                    performAction\n                }\">\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.mail.datagrid.table.head />\n                    </template>\n\n                    <template v-else>\n                        <div class=\"row grid grid-cols-[2fr_7fr_.0.3fr] grid-rows-1 items-center border-b px-8 py-4 dark:border-gray-800 max-lg:hidden\">\n                            <div\n                                class=\"flex items-center gap-6\"\n                                v-for=\"(columnGroup, index) in [['name'], ['attachments', 'tags', 'subject', 'reply'], ['created_at']]\"\n                            >\n                                <label\n                                    class=\"flex w-max cursor-pointer select-none items-center gap-2\"\n                                    for=\"mass_action_select_all_records\"\n                                    v-if=\"! index\"\n                                >\n                                    <input\n                                        type=\"checkbox\"\n                                        name=\"mass_action_select_all_records\"\n                                        id=\"mass_action_select_all_records\"\n                                        class=\"peer hidden\"\n                                        :checked=\"['all', 'partial'].includes(applied.massActions.meta.mode)\"\n                                        @change=\"selectAll\"\n                                    >\n\n                                    <span\n                                        class=\"icon-checkbox-outline cursor-pointer rounded-md text-2xl text-gray-600 dark:text-gray-300\"\n                                        :class=\"[\n                                            applied.massActions.meta.mode === 'all' ? 'peer-checked:icon-checkbox-select peer-checked:text-brandColor' : (\n                                                applied.massActions.meta.mode === 'partial' ? 'peer-checked:icon-checkbox-multiple peer-checked:text-brandColor' : ''\n                                            ),\n                                        ]\"\n                                    >\n                                    </span>\n                                </label>\n\n                                <p class=\"text-gray-600 dark:text-gray-300\">\n                                    <span class=\"[&>*]:after:content-['_/_']\">\n                                        <template v-for=\"column in columnGroup\">\n                                            <span\n                                                class=\"after:content-['/'] last:after:content-['']\"\n                                                :class=\"{\n                                                    'font-medium text-gray-800 dark:text-white': applied.sort.column == column,\n                                                    'cursor-pointer hover:text-gray-800 dark:hover:text-white': available.columns.find(columnTemp => columnTemp.index === column)?.sortable,\n                                                }\"\n                                                @click=\"\n                                                    available.columns.find(columnTemp => columnTemp.index === column)?.sortable ? sort(available.columns.find(columnTemp => columnTemp.index === column)): {}\n                                                \"\n                                                v-html=\"available.columns.find(columnTemp => columnTemp.index === column)?.label\"\n                                            >\n                                            </span>\n                                        </template>\n                                    </span>\n\n                                    <i\n                                        class=\"align-text-bottom text-base text-gray-800 dark:text-white ltr:ml-1.5 rtl:mr-1.5\"\n                                        :class=\"[applied.sort.order === 'asc' ? 'icon-down-stat': 'icon-up-stat']\"\n                                        v-if=\"columnGroup.includes(applied.sort.column)\"\n                                    ></i>\n                                </p>\n                            </div>\n                        </div>\n                        \n                        <!-- Mobile Sort/Filter Header -->\n                        <div class=\"hidden border-b bg-gray-50 px-4 py-3 text-black dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 max-lg:block\">\n                            <div class=\"flex items-center justify-between\">\n                                <!-- Mass Actions for Mobile -->\n                                <div v-if=\"available.massActions.length\">\n                                    <label for=\"mass_action_select_all_records_mobile\">\n                                        <input\n                                            type=\"checkbox\"\n                                            name=\"mass_action_select_all_records_mobile\"\n                                            id=\"mass_action_select_all_records_mobile\"\n                                            class=\"peer hidden\"\n                                            :checked=\"['all', 'partial'].includes(applied.massActions.meta.mode)\"\n                                            @change=\"selectAll\"\n                                        >\n\n                                        <span\n                                            class=\"icon-checkbox-outline cursor-pointer rounded-md text-2xl text-gray-500 peer-checked:text-brandColor\"\n                                            :class=\"[\n                                                applied.massActions.meta.mode === 'all' ? 'peer-checked:icon-checkbox-select peer-checked:text-brandColor ' : (\n                                                    applied.massActions.meta.mode === 'partial' ? 'peer-checked:icon-checkbox-multiple peer-checked:brandColor' : ''\n                                                ),\n                                            ]\"\n                                        >\n                                        </span>\n                                    </label>\n                                </div>\n                                \n                                <!-- Mobile Sort Dropdown -->\n                                <div v-if=\"available.columns.some(column => column.sortable)\">\n                                    <x-admin::dropdown position=\"bottom-{{ in_array(app()->getLocale(), ['fa', 'ar']) ? 'left' : 'right' }}\">\n                                        <x-slot:toggle>\n                                            <div class=\"flex items-center gap-1\">\n                                                <button\n                                                    type=\"button\"\n                                                    class=\"inline-flex w-full max-w-max cursor-pointer appearance-none items-center justify-between gap-x-2 rounded-md border bg-white px-2.5 py-1.5 text-center leading-6 text-gray-600 transition-all marker:shadow hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                                >\n                                                    <span>\n                                                        Sort\n                                                    </span>\n                    \n                                                    <span class=\"icon-down-arrow text-2xl\"></span>\n                                                </button>\n                                            </div>\n                                        </x-slot>\n                \n                                        <x-slot:menu>\n                                            <x-admin::dropdown.menu.item\n                                                v-for=\"column in available.columns.filter(column => column.sortable && column.visibility)\"\n                                                @click=\"sort(column)\"\n                                            >\n                                                <div class=\"flex items-center gap-2\">\n                                                    <span v-html=\"column.label\"></span>\n                                                    <i\n                                                        class=\"align-text-bottom text-base text-gray-600 dark:text-gray-300\"\n                                                        :class=\"[applied.sort.order === 'asc' ? 'icon-stats-down': 'icon-stats-up']\"\n                                                        v-if=\"column.index == applied.sort.column\"\n                                                    ></i>\n                                                </div>\n                                            </x-admin::dropdown.menu.item>\n                                        </x-slot>\n                                    </x-admin::dropdown>\n                                </div>\n                            </div>\n                        </div>\n                    </template>\n                </template>\n\n                <template #body=\"{\n                    isLoading,\n                    available,\n                    applied,\n                    selectAll,\n                    sort,\n                    performAction\n                }\">\n\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.mail.datagrid.table.body />\n                    </template>\n\n                    <template v-else>\n                        <!-- Desktop Table View -->\n                        <div\n                            v-for=\"record in available.records\"\n                            class=\"flex cursor-pointer items-center justify-between border-b px-8 py-4 text-gray-600 hover:bg-gray-50 dark:border-gray-800 dark:text-gray-300 dark:hover:bg-gray-950 max-lg:hidden\"\n                            @click.stop=\"selectedMail=true; editModal(record.actions.find(action => action.index === 'edit'))\"\n                        >\n                            <!-- Select Box -->\n                            <div class=\"flex w-full items-center justify-start gap-[124px]\">\n                                <div class=\"flex items-center gap-6\">\n                                    <div class=\"relative flex items-center\">\n                                        <!-- Dot Indicator -->\n                                        <span\n                                            class=\"absolute right-8 h-1.5 w-1.5 rounded-full bg-sky-600 dark:bg-white\"\n                                            v-if=\"! record.is_read\"\n                                        ></span>\n\n                                        <!-- Checkbox Container -->\n                                        <div class=\"flex items-center gap-2\">\n                                            <input\n                                                type=\"checkbox\"\n                                                :name=\"`mass_action_select_record_${record.id}`\"\n                                                :id=\"`mass_action_select_record_${record.id}`\"\n                                                :value=\"record.id\"\n                                                class=\"peer hidden\"\n                                                v-model=\"applied.massActions.indices\"\n                                                @click.stop\n                                            >\n\n                                            <label\n                                                class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl !text-gray-500 peer-checked:!text-brandColor dark:!text-gray-300\"\n                                                :for=\"`mass_action_select_record_${record.id}`\"\n                                                @click.stop\n                                            ></label>\n                                        </div>\n                                    </div>\n\n                                    <p class=\"flex items-center gap-2 overflow-hidden text-ellipsis whitespace-nowrap leading-none\">\n                                        <x-admin::avatar ::name=\"record.name ?? record.from\" />\n\n                                        @{{ record.name }}\n                                    </p>\n                                </div>\n\n                                <div class=\"flex w-full items-center justify-between gap-4\">\n                                    <!-- Content -->\n                                    <div class=\"flex-frow flex items-center gap-2\">\n                                        <!-- Attachments -->\n                                        <p v-html=\"record.attachments\"></p>\n\n                                        <!-- Tags -->\n                                        <span\n                                            class=\"flex items-center gap-1 rounded-2xl bg-rose-100 px-2 py-1\"\n                                            :style=\"{\n                                                'background-color': tag.color,\n                                                'color': backgroundColors.find(color => color.background === tag.color)?.text\n                                            }\"\n                                            v-for=\"(tag, index) in record.tags\"\n                                            v-html=\"tag.name\"\n                                        >\n                                        </span>\n\n                                        <!-- Subject And Reply -->\n                                        <div class=\"min-w-0 flex-1\">\n                                            <!-- Subject -->\n                                            <p\n                                                class=\"line-clamp-1 text-sm text-gray-900 dark:text-gray-100\"\n                                                v-text=\"record.subject\"\n                                            >\n                                            </p>\n\n                                            <!-- Reply (Content) -->\n                                            <p\n                                                class=\"!font-normal\"\n                                                v-html=\"truncatedReply(record.reply)\"\n                                            >\n                                            </p>\n                                        </div>\n                                    </div>\n\n                                    <!-- Time -->\n                                    <div class=\"min-w-[80px] flex-shrink-0 text-right\">\n                                        <p class=\"leading-none\">@{{ record.created_at }}</p>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                        \n                        <!-- Mobile Card View -->\n                        <div\n                            class=\"hidden border-b px-4 py-4 text-black dark:border-gray-800 dark:text-gray-300 max-lg:block\"\n                            v-for=\"record in available.records\"\n                            @click.stop=\"selectedMail=true; editModal(record.actions.find(action => action.index === 'edit'))\"\n                        >\n                            <div class=\"mb-2 flex items-center justify-between\">\n                                <!-- Mass Actions for Mobile Cards -->\n                                <div class=\"flex w-full items-center justify-between gap-2\">\n                                    <p v-if=\"available.massActions.length\">\n                                        <input\n                                            type=\"checkbox\"\n                                            :name=\"`mass_action_select_record_${record.id}`\"\n                                            :id=\"`mass_action_select_record_${record.id}`\"\n                                            :value=\"record.id\"\n                                            class=\"peer hidden\"\n                                            v-model=\"applied.massActions.indices\"\n                                            @click.stop\n                                        >\n\n                                        <label\n                                            class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl !text-gray-500 peer-checked:!text-brandColor dark:!text-gray-300\"\n                                            :for=\"`mass_action_select_record_${record.id}`\"\n                                            @click.stop\n                                        ></label>\n                                    </p>\n\n                                    <!-- Dot Indicator -->\n                                    <span\n                                        class=\"h-1.5 w-1.5 rounded-full bg-sky-600 dark:bg-white\"\n                                        v-if=\"! record.is_read\"\n                                    ></span>\n                                </div>\n                            </div>\n\n                            <!-- Card Content -->\n                            <div class=\"grid gap-2\">\n                                <template v-for=\"column in available.columns\">\n                                    <div class=\"flex flex-wrap items-baseline gap-x-2\">\n                                        <span \n                                            :class=\"{'font-semibold': ! record.is_read}\"\n                                            class=\"text-slate-600 dark:text-gray-300\" \n                                            v-html=\"column.label + ':'\"\n                                        ></span>\n                                        <span                         \n                                            :class=\"{\n                                                'font-medium': record.is_read,\n                                                'font-semibold': ! record.is_read\n                                            }\"\n                                            class=\"break-words text-slate-900 dark:text-white\" \n                                            v-html=\"record[column.index]\"\n                                        ></span>\n                                    </div>\n                                </template>\n                            </div>\n                        </div>\n                    </template>\n                </template>\n            </x-admin::datagrid>\n\n            {!! view_render_event('admin.mail.'. $route .'.datagrid.after') !!}\n\n            {!! view_render_event('admin.mail.create.form.before') !!}\n\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                enctype=\"multipart/form-data\"\n                as=\"div\"\n            >\n                <form\n                    @submit=\"handleSubmit($event, save)\"\n                    ref=\"mailForm\"\n                >\n                    <x-admin::modal\n                        ref=\"toggleComposeModal\"\n                        position=\"bottom-right\"\n                        @toggle=\"removeTinyMCE\"\n                    >\n                        <x-slot:header>\n                            <h3 class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                                @lang('admin::app.mail.index.mail.title')\n                            </h3>\n                        </x-slot>\n\n                        <x-slot:content>\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"id\"\n                                id=\"id\"\n                                v-model=\"draft.id\"\n                            />\n\n                            <!-- To -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.mail.index.mail.to')\n                                </x-admin::form.control-group.label>\n\n                                <div class=\"relative\">\n                                    <x-admin::form.control-group.controls.tags\n                                        name=\"reply_to\"\n                                        class=\"w-[calc(100%-62px)]\"\n                                        input-rules=\"email\"\n                                        rules=\"required\"\n                                        ::data=\"draft.reply_to\"\n                                        :label=\"trans('admin::app.mail.index.mail.to')\"\n                                        :placeholder=\"trans('admin::app.mail.index.mail.enter-emails')\"\n                                        ::allow-duplicates=\"false\"\n                                    />\n\n                                    <div class=\"absolute top-[9px] flex items-center gap-2 ltr:right-2 rtl:left-2\">\n                                        <span\n                                            class=\"cursor-pointer font-medium hover:underline dark:text-white\"\n                                            @click=\"showCC = ! showCC\"\n                                        >\n                                            @lang('admin::app.mail.index.mail.cc')\n                                        </span>\n\n                                        <span\n                                            class=\"cursor-pointer font-medium hover:underline dark:text-white\"\n                                            @click=\"showBCC = ! showBCC\"\n                                        >\n                                            @lang('admin::app.mail.index.mail.bcc')\n                                        </span>\n                                    </div>\n                                </div>\n\n                                <x-admin::form.control-group.error control-name=\"reply_to\" />\n                            </x-admin::form.control-group>\n\n                            <template v-if=\"showCC\">\n                                <!-- Cc -->\n                                <x-admin::form.control-group>\n                                    <x-admin::form.control-group.label>\n                                        @lang('admin::app.mail.index.mail.cc')\n                                    </x-admin::form.control-group.label>\n\n                                    <x-admin::form.control-group.controls.tags\n                                        name=\"cc\"\n                                        class=\"w-[calc(100%-62px)]\"\n                                        input-rules=\"email\"\n                                        ::data=\"draft.cc\"\n                                        :label=\"trans('admin::app.mail.index.mail.cc')\"\n                                        :placeholder=\"trans('admin::app.mail.index.mail.enter-emails')\"\n                                    />\n\n                                    <x-admin::form.control-group.error control-name=\"cc\" />\n                                </x-admin::form.control-group>\n                            </template>\n\n                            <template v-if=\"showBCC\">\n                                <!-- Cc -->\n                                <x-admin::form.control-group>\n                                    <x-admin::form.control-group.label>\n                                        @lang('admin::app.mail.index.mail.bcc')\n                                    </x-admin::form.control-group.label>\n\n                                    <x-admin::form.control-group.controls.tags\n                                        name=\"bcc\"\n                                        class=\"w-[calc(100%-62px)]\"\n                                        input-rules=\"email\"\n                                        ::data=\"draft.bcc\"\n                                        :label=\"trans('admin::app.mail.index.mail.bcc')\"\n                                        :placeholder=\"trans('admin::app.mail.index.mail.enter-emails')\"\n                                    />\n\n                                    <x-admin::form.control-group.error control-name=\"bcc\" />\n                                </x-admin::form.control-group>\n                            </template>\n\n                            <!-- Subject -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.mail.index.mail.subject')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"subject\"\n                                    name=\"subject\"\n                                    rules=\"required\"\n                                    v-model=\"draft.subject\"\n                                    :label=\"trans('admin::app.mail.index.mail.subject')\"\n                                    :placeholder=\"trans('admin::app.mail.index.mail.subject')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"subject\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Content -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.control\n                                    type=\"textarea\"\n                                    name=\"reply\"\n                                    id=\"reply\"\n                                    rules=\"required\"\n                                    rows=\"8\"\n                                    ::value=\"draft.reply\"\n                                    :tinymce=\"true\"\n                                    :label=\"trans('admin::app.mail.index.mail.message')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"reply\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Attachments -->\n                            <x-admin::form.control-group class=\"!mb-0\">\n                                <x-admin::attachments\n                                    allow-multiple=\"true\"\n                                    hide-button=\"true\"\n                                />\n                            </x-admin::form.control-group>\n                        </x-slot>\n\n                        <x-slot:footer>\n                            <div class=\"flex w-full items-center justify-between\">\n                                <label\n                                    class=\"icon-attachment cursor-pointer rounded-md p-1 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800\"\n                                    for=\"file-upload\"\n                                ></label>\n\n                                <div class=\"flex items-center gap-4\">\n                                    <button\n                                        type=\"submit\"\n                                        ref=\"submitBtn\"\n                                        class=\"transparent-button hover:bg-gray-200 dark:text-white dark:hover:bg-gray-800 dark:focus:bg-gray-800\"\n                                        :disabled=\"isStoring\"\n                                        @click=\"saveAsDraft = 1\"\n                                    >\n                                        @lang('admin::app.mail.index.mail.draft')\n                                    </button>\n\n                                    <x-admin::button\n                                        class=\"primary-button\"\n                                        type=\"submit\"\n                                        ref=\"submitBtn\"\n                                        :title=\"trans('admin::app.mail.index.mail.send-btn')\"\n                                        ::loading=\"isStoring\"\n                                        ::disabled=\"isStoring\"\n                                        @click=\"saveAsDraft = 0\"\n                                    />\n                                </div>\n                            </div>\n                        </x-slot>\n                    </x-admin::modal>\n                </form>\n            </x-admin::form>\n\n            {!! view_render_event('admin.mail.create.form.after') !!}\n        </script>\n\n        <script type=\"module\">\n            app.component('v-mail', {\n                template: '#v-mail-template',\n        \n                data() {\n                    return {\n                        selectedMail: false,\n        \n                        showCC: false,\n        \n                        showBCC: false,\n        \n                        isStoring: false,\n        \n                        saveAsDraft: 0,\n        \n                        draft: {\n                            id: null,\n                            reply_to: [],\n                            cc: [],\n                            bcc: [],\n                            subject: '',\n                            reply: '',\n                            attachments: [],\n                        },\n        \n                        backgroundColors: [\n                            {\n                                label: \"@lang('admin::app.components.tags.index.aquarelle-red')\",\n                                text: '#DC2626',\n                                background: '#FEE2E2',\n                            }, {\n                                label: \"@lang('admin::app.components.tags.index.crushed-cashew')\",\n                                text: '#EA580C',\n                                background: '#FFEDD5',\n                            }, {\n                                label: \"@lang('admin::app.components.tags.index.beeswax')\",\n                                text: '#D97706',\n                                background: '#FEF3C7',\n                            }, {\n                                label: \"@lang('admin::app.components.tags.index.lemon-chiffon')\",\n                                text: '#CA8A04',\n                                background: '#FEF9C3',\n                            }, {\n                                label: \"@lang('admin::app.components.tags.index.snow-flurry')\",\n                                text: '#65A30D',\n                                background: '#ECFCCB',\n                            }, {\n                                label: \"@lang('admin::app.components.tags.index.honeydew')\",\n                                text: '#16A34A',\n                                background: '#DCFCE7',\n                            },\n                        ],\n                    };\n                },\n        \n                mounted() {\n                    const params = new URLSearchParams(window.location.search);\n        \n                    if (params.get('openModal')) {\n                        this.$refs.toggleComposeModal.toggle();\n                    }\n                },\n        \n                methods: {\n                    removeTinyMCE() {\n                        tinymce?.remove?.();\n                    },\n                    \n                    truncatedReply(reply) {\n                        const maxLength = 100;\n        \n                        if (reply.length > maxLength) {\n                            return `${reply.substring(0, maxLength)}...`;\n                        }\n        \n                        return reply;\n                    },\n        \n                    toggleModal() {\n                        this.draft.reply_to = [];\n        \n                        this.$refs.toggleComposeModal.toggle();\n                    },\n        \n                    save(params, { resetForm, setErrors  }) {\n                        this.isStoring = true;\n        \n                        let formData = new FormData(this.$refs.mailForm);\n        \n                        formData.append('is_draft', this.saveAsDraft);\n        \n                        if (this.draft.id) {\n                            formData.append('_method', 'PUT');\n                        }\n        \n                        this.$axios.post(this.draft.id ? \"{{ route('admin.mail.update', ':id') }}\".replace(':id', this.draft.id) : '{{ route('admin.mail.store') }}', formData, {\n                                headers: {\n                                    'Content-Type': 'multipart/form-data',\n                                },\n                            })\n                            .then ((response) => {\n                                this.$refs.datagrid.get();\n        \n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data?.message });\n        \n                                resetForm();\n                            })\n                            .catch ((error) => {\n                                if (error?.response?.status == 422) {\n                                    setErrors(error.response.data.errors);\n                                } else {\n                                    this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                                }\n                            }).finally(() => {\n                                this.$refs.toggleComposeModal.close();\n        \n                                this.isStoring = false;\n        \n                                this.resetForm();\n                            });\n                    },\n        \n                    editModal(row) {\n                        if(row.title == 'View') {\n                            window.location.href = row.url;\n        \n                            return;\n                        }\n        \n                        this.$axios.get(row.url)\n                            .then(response => {\n                                this.draft = response.data.data;\n        \n                                this.$refs.toggleComposeModal.toggle();\n        \n                                this.showCC = this.draft.cc.length > 0;\n        \n                                this.showBCC = this.draft.bcc.length > 0;\n        \n                            })\n                            .catch(error => {});\n                    },\n        \n                    resetForm() {\n                        this.draft = {\n                            id: null,\n                            reply_to: [],\n                            cc: [],\n                            bcc: [],\n                            subject: '',\n                            reply: '',\n                            attachments: [],\n                        };\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/mail/view.blade.php",
    "content": "@php\n    if (! $email->is_read) {\n        $email->is_read = true;\n\n        $email->save();\n    }\n@endphp\n\n<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.mail.view.subject', ['subject' => strip_tags($email->subject)])\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.mail.view.form.before', ['email' => $email]) !!}\n\n                <!-- Bredcrumbs -->\n                <x-admin::breadcrumbs\n                    name=\"mail.route.view\"\n                    :entity=\"$email\"\n                    :route=\"$route\"\n                />\n\n                {!! view_render_event('admin.mail.view.form.after', ['email' => $email]) !!}\n\n                <!-- Title -->\n                <div class=\"flex items-center gap-2\">\n                    <div class=\"text-xl font-bold dark:text-gray-300\">\n                        @lang('admin::app.mail.view.title')\n                    </div>\n\n                    <span class=\"label-active\">{{ ucfirst($route) }}</span>\n\n                    {!! view_render_event('admin.mail.view.tags.before', ['email' => $email]) !!}\n\n                    <x-admin::tags\n                        :attach-endpoint=\"route('admin.mail.tags.attach', $email->id)\"\n                        :detach-endpoint=\"route('admin.mail.tags.detach', $email->id)\"\n                        :added-tags=\"$email->tags\"\n                    />\n\n                    {!! view_render_event('admin.mail.view.tags.after', ['email' => $email]) !!}\n                </div>\n            </div>\n        </div>\n\n        {!! view_render_event('admin.mail.view.email-list.before', ['email' => $email]) !!}\n\n        <!-- Email List Vue Component -->\n        <v-email-list>\n           <x-admin::shimmer.leads.view.mail :count=\"$email->count()\"/>\n        </v-email-list>\n\n        {!! view_render_event('admin.mail.view.email-list.before', ['email' => $email]) !!}\n    </div>\n\n    @pushOnce('scripts')\n        <!-- Email List Template -->\n        <script\n            type=\"text/x-template\"\n            id=\"v-email-list-template\"\n        >\n            <div class=\"mt-3.5 flex gap-2.5 max-xl:flex-wrap\">\n                <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                    {!! view_render_event('admin.mail.view.email-item.before', ['email' => $email]) !!}\n\n                    <!-- Email Item Vue Component -->\n                    <v-email-item\n                        :email=\"email\"\n                        :key=\"0\"\n                        :index=\"0\"\n                        :action=\"action\"\n                        @on-discard=\"action = {}\"\n                        @on-email-action=\"emailAction($event)\"\n                    ></v-email-item>\n\n                    {!! view_render_event('admin.mail.view.email-item.after', ['email' => $email]) !!}\n\n                    {!! view_render_event('admin.mail.view.email-item.before', ['email' => $email]) !!}\n\n                    <!-- Email Item Vue Component -->\n                    <v-email-item\n                        v-for='(email, index) in email.emails'\n                        :email=\"email\"\n                        :key=\"index + 1\"\n                        :index=\"index + 1\"\n                        :action=\"action\"\n                        @on-discard=\"action = {}\"\n                        @on-email-action=\"emailAction($event)\"\n                    ></v-email-item>\n\n                    {!! view_render_event('admin.mail.view.email-item.after', ['email' => $email]) !!}\n                </div>\n\n                @if (\n                    bouncer()->hasPermission('contacts.persons.create')\n                    || bouncer()->hasPermission('leads.create')\n                    || bouncer()->hasPermission('leads.view')\n                    || bouncer()->hasPermission('contacts.persons.edit')\n                )\n                    <!-- Email Actions -->\n                    <div class=\"sticky top-4 flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                        <div class=\"box-shadow rounded bg-white dark:bg-gray-900\">\n                            <div class=\"flex flex-col gap-4 p-4\">\n                                <!-- Email Action Vue Component -->\n                                <v-action-email ref=\"emailAction\"></v-action-email>\n                            </div>\n                        </div>\n                    </div>\n                @endif\n            </div>\n        </script>\n\n        <!-- Email Item Template -->\n        <script\n            type=\"text/x-template\"\n            id=\"v-email-item-template\"\n        >\n            <div class=\"box-shadow flex gap-2.5 rounded bg-white p-4 dark:bg-gray-900 max-xl:flex-wrap\">\n                <div class=\"flex w-full flex-col gap-4\">\n                    <div class=\"flex w-full items-center justify-between gap-4\">\n                        <div class=\"flex gap-4\">\n                            {!! view_render_event('admin.mail.view.avatar.before', ['email' => $email]) !!}\n\n                            <!-- Mailer Sort name -->\n                            <x-admin::avatar ::name=\"email.name ?? email.from\" />\n\n                            {!! view_render_event('admin.mail.view.avatar.after', ['email' => $email]) !!}\n\n                            {!! view_render_event('admin.mail.view.mail_receivers.before', ['email' => $email]) !!}\n\n                            <!-- Mailer receivers -->\n                            <div class=\"flex flex-col gap-1\">\n                                <!-- Mailer Name -->\n                                <span class=\"dark:text-gray-300\">@{{ email.name ?? email.from }}</span>\n\n                                <div class=\"flex flex-col gap-1 dark:text-gray-300\">\n                                    <div class=\"flex items-center gap-1\">\n                                        <!-- Mail To -->\n                                        <span>@lang('admin::app.mail.view.to') @{{ email.reply_to.join(', ') }}</span>\n\n                                        <!-- Show More Button -->\n                                        <i\n                                            v-if=\"email?.cc?.length || email?.bcc?.length\"\n                                            class=\"cursor-pointer text-2xl\"\n                                            :class=\"email.showMore ? 'icon-up-arrow' : 'icon-down-arrow'\"\n                                            @click=\"email.showMore = ! email.showMore\"\n                                        ></i>\n                                    </div>\n\n                                    <!-- Show more emails -->\n                                    <div\n                                        class=\"flex flex-col\"\n                                        v-if=\"email.showMore\"\n                                    >\n                                        <span v-if=\"email?.cc\">\n                                            @lang('admin::app.mail.view.cc'):\n\n                                            @{{ email.cc.join(', ') }}\n                                        </span>\n\n                                        <span v-if=\"email.bcc\">\n                                            @lang('admin::app.mail.view.bcc'):\n\n                                            @{{ email.bcc?.join(', ') }}\n                                        </span>\n                                    </div>\n                                </div>\n                            </div>\n\n                            {!! view_render_event('admin.mail.view.mail_receivers.after', ['email' => $email]) !!}\n                        </div>\n\n                        {!! view_render_event('admin.mail.view.time_actions.before', ['email' => $email]) !!}\n\n                        <!-- Time and Actions -->\n                        <div class=\"flex items-center justify-center gap-2 dark:text-gray-300\">\n                            @{{ email.time_ago }}\n\n                            <div class=\"flex select-none items-center\">\n                                <x-admin::dropdown position=\"bottom-right\">\n                                    <x-slot:toggle>\n                                        <button class=\"icon-more flex h-7 w-7 cursor-pointer items-center justify-center rounded-md text-2xl transition-all hover:rounded-md hover:bg-gray-100 dark:hover:bg-gray-950\"></button>\n                                    </x-slot>\n\n                                    <!-- Admin Dropdown -->\n                                    <x-slot:menu class=\"!min-w-40\">\n                                        <x-admin::dropdown.menu.item>\n                                            <div\n                                                class=\"flex cursor-pointer items-center gap-2\"\n                                                @click=\"emailAction('reply')\"\n                                            >\n                                                <i class=\"icon-reply text-2xl\"></i>\n\n                                                @lang('admin::app.mail.view.reply')\n                                            </div>\n                                        </x-admin::dropdown.menu.item>\n\n                                        <x-admin::dropdown.menu.item>\n                                            <div\n                                                class=\"flex cursor-pointer items-center gap-2\"\n                                                @click=\"emailAction('reply')\"\n                                            >\n                                                <i class=\"icon-reply text-2xl\"></i>\n\n                                                @lang('admin::app.mail.view.reply')\n                                            </div>\n                                        </x-admin::dropdown.menu.item>\n\n                                        <x-admin::dropdown.menu.item>\n                                            <div\n                                                class=\"flex cursor-pointer items-center gap-2\"\n                                                @click=\"emailAction('forward')\"\n                                            >\n                                                <i class=\"icon-forward text-2xl\"></i>\n\n                                                @lang('admin::app.mail.view.forward')\n                                            </div>\n                                        </x-admin::dropdown.menu.item>\n\n                                        <x-admin::dropdown.menu.item>\n                                            <div\n                                                class=\"flex cursor-pointer items-center gap-2\"\n                                                @click=\"emailAction('delete')\"\n                                            >\n                                                <i class=\"icon-delete text-2xl\"></i>\n\n                                                @lang('admin::app.mail.view.delete')\n                                            </div>\n                                        </x-admin::dropdown.menu.item>\n                                    </x-slot>\n                                </x-admin::dropdown>\n                            </div>\n                        </div>\n\n                        {!! view_render_event('admin.mail.view.time_actions.before', ['email' => $email]) !!}\n                    </div>\n\n                    {!! view_render_event('admin.mail.view.mail_body.before', ['email' => $email]) !!}\n\n                    <!-- Mail Body -->\n                    <div\n                        class=\"dark:text-gray-300\"\n                        v-safe-html=\"email.reply\"\n                    ></div>\n\n                    {!! view_render_event('admin.mail.view.mail_body.after', ['email' => $email]) !!}\n\n                    {!! view_render_event('admin.mail.view.attach.before', ['email' => $email]) !!}\n\n                    <div\n                        class=\"flex flex-wrap gap-2\"\n                        v-if=\"email.attachments.length\"\n                    >\n                        <div\n                            class=\"group relative flex items-center gap-2 rounded-md border border-gray-300 bg-gray-100 px-2 py-1.5 dark:border-gray-800 dark:bg-gray-900\"\n                            target=\"_blank\"\n                            v-for=\"attachment in email.attachments\"\n                        >\n                            <!-- Thumbnail or Icon -->\n                            <div class=\"flex items-center gap-2\">\n                                <template v-if=\"isImage(attachment.path)\">\n                                    <span class=\"icon-image text-2xl\"></span>\n                                </template>\n\n                                <template v-else-if=\"isVideo(attachment.path)\">\n                                    <span class=\"icon-video text-2xl\"></span>\n                                </template>\n\n                                <template v-else-if=\"isDocument(attachment.path)\">\n                                    <span class=\"icon-file text-2xl\"></span>\n                                </template>\n\n                                <template v-else>\n                                    <span class=\"icon-attachment text-2xl\"></span>\n                                </template>\n                            </div>\n\n                            <span class=\"max-w-[400px] truncate dark:text-white\">\n                                @{{ attachment.name || attachment.path }}\n                            </span>\n\n                            <a\n                                class=\"icon-download absolute right-0 rounded-md bg-gradient-to-r from-transparent via-gray-50 to-gray-100 p-2 pl-8 text-xl opacity-0 transition-all group-hover:opacity-100 dark:via-gray-900 dark:to-gray-900\"\n                                :href=\"'{{ route('admin.mail.attachment_download') }}/' + attachment.id\"\n                            ></a>\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.mail.view.attach.after', ['email' => $email]) !!}\n\n                    {!! view_render_event('admin.mail.view.replay_reply_all_forward_email.before', ['email' => $email]) !!}\n\n                    <!-- Reply, Reply All and Forward email -->\n                    <template v-if=\"! action[email.id]\">\n                        <div class=\"flex gap-6 border-t-2 py-4 font-medium dark:border-gray-800\">\n                            <label\n                                class=\"flex cursor-pointer items-center gap-2 text-brandColor\"\n                                @click=\"emailAction('reply')\"\n                            >\n                                @lang('admin::app.mail.view.reply')\n\n                                <i class=\"icon-reply text-2xl\"></i>\n                            </label>\n\n                            <label\n                                class=\"flex cursor-pointer items-center gap-2 text-brandColor\"\n                                @click=\"emailAction('reply-all')\"\n                            >\n                                @lang('admin::app.mail.view.reply-all')\n\n                                <i class=\"icon-reply-all text-2xl\"></i>\n                            </label>\n\n                            <label\n                                class=\"flex cursor-pointer items-center gap-2 text-brandColor\"\n                                @click=\"emailAction('forward')\"\n                            >\n                                @lang('admin::app.mail.view.forward')\n\n                                <i class=\"icon-forward text-2xl\"></i>\n                            </label>\n                        </div>\n                    </template>\n\n                    {!! view_render_event('admin.mail.view.replay_reply_all_forward_email.after', ['email' => $email]) !!}\n\n                    <template v-else>\n                        <!-- Email Form Vue Component -->\n                        <v-email-form\n                            :action=\"action\"\n                            :email=\"email\"\n                            @on-discard=\"$emit('onDiscard')\"\n                        ></v-email-form>\n                    </template>\n                </div>\n            </div>\n        </script>\n\n        <!-- Email Form Template -->\n        <script\n            type=\"text/x-template\"\n            id=\"v-email-form-template\"\n        >\n            <div class=\"flex w-full gap-2\">\n                <x-admin::avatar ::name=\"email.name ?? email.from\" />\n\n                {!! view_render_event('admin.mail.view.form.before', ['email' => $email]) !!}\n\n                <div class=\"w-[926px] gap-2 rounded border p-4 dark:border-gray-800\">\n                    <x-admin::form\n                        v-slot=\"{ meta, errors, handleSubmit }\"\n                        enctype=\"multipart/form-data\"\n                        as=\"div\"\n                    >\n                        <form\n                            @submit=\"handleSubmit($event, save)\"\n                            ref=\"mailActionForm\"\n                        >\n                            <div class=\"flex flex-col gap-2\">\n                                <div class=\"border-b dark:border-gray-800\">\n                                    <!-- Activity Type -->\n                                    <x-admin::form.control-group.control\n                                        type=\"hidden\"\n                                        name=\"parent_id\"\n                                        value=\"{{ request('id') }}\"\n                                    />\n\n                                    <!-- To -->\n                                    <x-admin::form.control-group>\n                                        <x-admin::form.control-group.label class=\"required\">\n                                            @lang('admin::app.mail.view.to')\n                                        </x-admin::form.control-group.label>\n\n                                        <div class=\"relative\">\n                                            <x-admin::form.control-group.controls.tags\n                                                name=\"reply_to\"\n                                                input-rules=\"email\"\n                                                rules=\"required\"\n                                                ::data=\"reply_to\"\n                                                :label=\"trans('admin::app.mail.view.to')\"\n                                                :placeholder=\"trans('admin::app.mail.view.enter-mails')\"\n                                            />\n\n                                            <div class=\"absolute top-[9px] flex items-center gap-2 ltr:right-2 rtl:left-2\">\n                                                <span\n                                                    class=\"cursor-pointer font-medium hover:underline dark:text-gray-300\"\n                                                    @click=\"showCC = ! showCC\"\n                                                >\n                                                    @lang('admin::app.mail.view.cc')\n                                                </span>\n\n                                                <span\n                                                    class=\"cursor-pointer font-medium hover:underline dark:text-gray-300\"\n                                                    @click=\"showBCC = ! showBCC\"\n                                                >\n                                                    @lang('admin::app.mail.view.bcc')\n                                                </span>\n                                            </div>\n                                        </div>\n\n                                        <x-admin::form.control-group.error control-name=\"reply_to\" />\n                                    </x-admin::form.control-group>\n\n                                    <template v-if=\"showCC\">\n                                        <!-- Cc -->\n                                        <x-admin::form.control-group>\n                                            <x-admin::form.control-group.label>\n                                                @lang('admin::app.mail.view.cc')\n                                            </x-admin::form.control-group.label>\n\n                                            <x-admin::form.control-group.control\n                                                type=\"tags\"\n                                                name=\"cc\"\n                                                input-rules=\"email\"\n                                                :label=\"trans('admin::app.mail.view.cc')\"\n                                                :placeholder=\"trans('admin::app.mail.view.enter-mails')\"\n                                            />\n\n                                            <x-admin::form.control-group.error control-name=\"cc\" />\n                                        </x-admin::form.control-group>\n                                    </template>\n\n                                    <template v-if=\"showBCC\">\n                                        <!-- Cc -->\n                                        <x-admin::form.control-group>\n                                            <x-admin::form.control-group.label>\n                                                @lang('admin::app.mail.view.bcc')\n                                            </x-admin::form.control-group.label>\n\n                                            <x-admin::form.control-group.control\n                                                type=\"tags\"\n                                                name=\"bcc\"\n                                                input-rules=\"email\"\n                                                :label=\"trans('admin::app.mail.view.bcc')\"\n                                                :placeholder=\"trans('admin::app.mail.view.enter-mails')\"\n                                            />\n\n                                            <x-admin::form.control-group.error control-name=\"bcc\" />\n                                        </x-admin::form.control-group>\n                                    </template>\n\n                                    <!-- Content -->\n                                    <x-admin::form.control-group>\n                                        <x-admin::form.control-group.control\n                                            type=\"textarea\"\n                                            name=\"reply\"\n                                            id=\"reply\"\n                                            rules=\"required\"\n                                            ::value=\"reply\"\n                                            :tinymce=\"true\"\n                                            :label=\"trans('admin::app.mail.view.message')\"\n                                        />\n\n                                        <x-admin::form.control-group.error control-name=\"reply\" />\n                                    </x-admin::form.control-group>\n\n                                    <!-- Attachments -->\n                                    <x-admin::form.control-group>\n                                        <x-admin::attachments\n                                            allow-multiple=\"true\"\n                                            hide-button=\"true\"\n                                        />\n                                    </x-admin::form.control-group>\n\n                                    <!-- Divider -->\n                                    {{-- <hr class=\"h-1 dark:text-gray-800\"> --}}\n                                </div>\n\n                                <!-- Action and Attachement -->\n                                <div class=\"flex w-full items-center justify-between\">\n                                    <label\n                                        class=\"flex cursor-pointer items-center gap-1 dark:text-gray-300\"\n                                        for=\"file-upload\"\n                                    >\n                                        <i class=\"icon-attachment text-xl font-medium\"></i>\n\n                                        @lang('admin::app.mail.view.add-attachments')\n                                    </label>\n\n                                    <div class=\"flex items-center justify-center gap-4\">\n                                        <label\n                                            class=\"flex cursor-pointer items-center gap-1 font-semibold dark:text-gray-300\"\n                                            @click=\"$emit('onDiscard')\"\n                                        >\n                                            @lang('admin::app.mail.view.discard')\n                                        </label>\n\n                                        <x-admin::button\n                                            class=\"primary-button\"\n                                            :title=\"trans('admin::app.mail.view.send')\"\n                                            ::loading=\"isStoring\"\n                                            ::disabled=\"isStoring\"\n                                        />\n                                    </div>\n                                </div>\n                            </div>\n                        </form>\n                    </x-admin::form>\n                </div>\n\n                {!! view_render_event('admin.mail.view.form.after', ['email' => $email]) !!}\n            </div>\n        </script>\n\n        <!-- Contact Lookup Template -->\n        <script\n            type=\"text/x-template\"\n            id=\"v-contact-lookup-template\"\n        >\n            <div>\n                {!! view_render_event('admin.mail.view.contact_lookup.before', ['email' => $email]) !!}\n\n                <template v-if=\"email?.person_id\">\n                    <div class=\"flex justify-between\">\n                        <div class=\"flex gap-2\">\n                            <x-admin::avatar ::name=\"email.person.name\" />\n\n                            <!-- Mailer receivers -->\n                            <div class=\"flex flex-col gap-1\">\n                                <!-- Mailer Name -->\n                                <span class=\"text-xs font-medium text-gray-800 dark:text-gray-300\">\n                                    @{{ email.person?.name }}\n                                </span>\n\n                                <!-- Mailer Additional Deatils -->\n                                <div class=\"flex flex-col gap-1\">\n                                    <span class=\"text-[10px] dark:text-gray-300\">@{{ email.person.job_title }}</span>\n\n                                    <!-- Emails -->\n                                    <template v-for=\"email in email?.person?.emails.map(item => item.value)\">\n                                        <a\n                                            class=\"text-brandColor\"\n                                            :href=\"`mailto:${email}`\"\n                                        >\n                                            @{{ email }}\n                                        </a>\n                                    </template>\n\n                                    <!-- Contact Numbers -->\n                                    <template v-for=\"contactNumber in email.person?.contact_numbers.map(item => item.value)\">\n                                        <a\n                                            class=\"text-brandColor\"\n                                            :href=\"`tel:${contactNumber}`\"\n                                        >\n                                            @{{ contactNumber }}\n                                        </a>\n                                    </template>\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"flex gap-2\">\n                            <template v-if=\"! unlinking.contact\">\n                                <button\n                                    type=\"button\"\n                                    class=\"icon-delete flex h-7 w-7 cursor-pointer items-center justify-center rounded-md text-2xl hover:rounded-md hover:bg-gray-100 dark:hover:bg-gray-950\"\n                                    @click=\"unlinkContact\"\n                                ></button>\n                            </template>\n\n                            <template v-else>\n                                <x-admin::spinner />\n                            </template>\n\n                            <a\n                                :href=\"'{{ route('admin.contacts.persons.edit', ':id') }}'.replace(':id', email.person_id)\"\n                                target=\"_blank\"\n                                class=\"icon-right-arrow flex h-7 w-7 cursor-pointer items-center justify-center rounded-md text-2xl hover:rounded-md hover:bg-gray-100 dark:hover:bg-gray-950\"\n                            ></a>\n                        </div>\n                    </div>\n                </template>\n\n                <template v-else>\n                    <div\n                        class=\"relative\"\n                        ref=\"lookup\"\n                    >\n                        <!-- Input Box (Button) -->\n                        <div\n                            class=\"relative inline-block w-full\"\n                            @click=\"toggle\"\n                        >\n                            <!-- Input-like div -->\n                            <div class=\"w-full cursor-pointer rounded-md border border-gray-300 px-3 py-2 text-gray-800 dark:border-gray-800 dark:text-gray-300\">\n                                @{{ selectedItem.name ?? '@lang('admin::app.mail.view.search-an-existing-contact')'}}\n                            </div>\n\n                            <!-- Arrow down icon -->\n                            <div class=\"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-3\">\n                                <i class=\"fas fa-chevron-down text-gray-400\"></i>\n                            </div>\n                        </div>\n\n                        <span class=\"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-3\">\n                            <div class=\"flex items-center justify-center space-x-1\">\n                                <i\n                                    class=\"text-2xl\"\n                                    :class=\"showPopup ? 'icon-up-arrow': 'icon-down-arrow'\"\n                                ></i>\n                            </div>\n                        </span>\n\n                        <!-- Popup Box -->\n                        <div\n                            v-if=\"showPopup\"\n                            class=\"transcontact_lookup absolute top-full z-10 mt-1 flex w-full origin-top flex-col gap-2 rounded-lg border border-gray-200 bg-white p-2 shadow-lg transition-transform dark:border-gray-900 dark:bg-gray-800\"\n                        >\n                            <!-- Search Bar -->\n                            <div class=\"relative\">\n                                <!-- Input Box -->\n                                <input\n                                    type=\"text\"\n                                    v-model.lazy=\"searchTerm\"\n                                    v-debounce=\"500\"\n                                    class=\"w-full rounded border border-gray-200 px-2.5 py-2 pr-10 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                    placeholder=\"Search...\"\n                                    ref=\"searchInput\"\n                                    @keyup=\"search\"\n                                />\n\n                                <!-- Search Icon (absolute positioned) -->\n                                <span class=\"absolute inset-y-0 right-0 flex items-center pr-3\">\n                                    <div class=\"flex items-center justify-center space-x-1\">\n                                        <!-- Loader (optional, based on condition) -->\n                                        <div\n                                            class=\"relative\"\n                                            v-if=\"isSearching\"\n                                        >\n                                            <x-admin::spinner />\n                                        </div>\n\n                                        <!-- Search Icon -->\n                                        <i class=\"fas fa-search text-gray-500\"></i>\n                                    </div>\n                                </span>\n                            </div>\n\n                            <!-- Results List -->\n                            <ul class=\"max-h-40 divide-y divide-gray-100 overflow-y-auto\">\n                                <li\n                                    v-for=\"person in persons\"\n                                    :key=\"person.id\"\n                                    class=\"flex cursor-pointer gap-2 px-4 py-2 text-gray-800 transition-colors hover:bg-blue-100 dark:text-white dark:hover:bg-gray-900\"\n                                    @click=\"linkContact(person)\"\n                                >\n                                    <x-admin::avatar ::name=\"person.name\" />\n\n                                    <!-- Mailer receivers -->\n                                    <div class=\"flex flex-col gap-1\">\n                                        <!-- Mailer Name -->\n                                        <span>@{{ person.name }}</span>\n\n                                        <div class=\"flex flex-col gap-1\">\n                                            <span class=\"text-sm\">@{{ person.emails.map(item => item.value).join(', ') }}</span>\n                                        </div>\n                                    </div>\n                                </li>\n\n                                <li\n                                    v-if=\"persons.length === 0\"\n                                    class=\"px-4 py-2 text-gray-800 dark:text-gray-300\"\n                                >\n                                    @lang('admin::app.mail.view.no-result-found')\n                                </li>\n                            </ul>\n\n                            <!-- Add New Contact Button -->\n                            @if (bouncer()->hasPermission('contacts.persons.create'))\n                                <button\n                                    type=\"button\"\n                                    class=\"flex cursor-pointer items-center gap-2 border-t border-gray-200 p-2 text-brandColor transition-colors\"\n                                    @click=\"toggleContactModal\"\n                                >\n                                    <i class=\"icon-add text-md !text-brandColor\"></i>\n\n                                    @lang('admin::app.mail.view.add-new-contact')\n                                </button>\n                            @endif\n                        </div>\n                    </div>\n                </template>\n\n                {!! view_render_event('admin.mail.view.contact_lookup.after', ['email' => $email]) !!}\n            </div>\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-lead-lookup-template\"\n        >\n            <div>\n                {!! view_render_event('admin.mail.view.lead_lookup.before', ['email' => $email]) !!}\n\n                <template v-if=\"email?.lead_id\">\n                    <div class=\"flex\">\n                        <div class=\"lead-item flex flex-col gap-5 rounded-md border border-gray-100 bg-gray-50 p-2 dark:border-gray-400 dark:bg-gray-400\">\n                            <!-- Header -->\n                            <div\n                                class=\"flex items-start justify-between\"\n                                v-if=\"email.lead?.person\"\n                            >\n                                <div class=\"flex items-center gap-1\">\n                                    <x-admin::avatar ::name=\"email.lead.person?.name\" />\n\n                                    <div class=\"flex flex-col gap-1\">\n                                        <span class=\"text-xs font-medium\">\n                                            @{{ email.lead.person?.name }}\n                                        </span>\n\n                                        <span class=\"text-[10px] leading-normal\">\n                                            @{{ email.lead.person?.organization?.name }}\n                                        </span>\n                                    </div>\n                                </div>\n\n                                <div class=\"flex items-center justify-center gap-2\">\n                                    <div\n                                        class=\"group relative\"\n                                        v-if=\"email.lead.rotten_days > 0\"\n                                    >\n                                        <span class=\"icon-rotten flex cursor-default items-center justify-center text-2xl text-rose-600\"></span>\n\n                                        <div class=\"absolute bottom-0 right-0 mb-7 hidden w-max flex-col items-center group-hover:flex\">\n                                            <span class=\"whitespace-no-wrap relative rounded-md bg-black px-4 py-2 text-xs leading-none text-white shadow-lg\">\n                                                @{{ \"@lang('admin::app.mail.view.rotten-days', ['days' => 'replaceDays'])\".replace('replaceDays', email.lead.rotten_days) }}\n                                            </span>\n\n                                            <div class=\"absolute -bottom-0.5 right-1 h-3 w-3 rotate-45 bg-black\"></div>\n                                        </div>\n                                    </div>\n\n                                    <template v-if=\"! unlinking.lead\">\n                                        <button\n                                            type=\"button\"\n                                            class=\"icon-delete flex h-7 w-7 cursor-pointer items-center justify-center rounded-md text-2xl hover:rounded-md hover:bg-gray-100 dark:hover:bg-gray-950\"\n                                            @click=\"unlinkLead\"\n                                        ></button>\n                                    </template>\n\n                                    <template v-else>\n                                        <x-admin::spinner />\n                                    </template>\n\n                                    <a\n                                        :href=\"'{{ route('admin.leads.view', ':id') }}'.replace(':id', email.lead_id)\"\n                                        target=\"_blank\"\n                                        class=\"icon-right-arrow flex h-7 w-7 cursor-pointer items-center justify-center rounded-md text-2xl hover:rounded-md hover:bg-gray-100 dark:hover:bg-gray-950\"\n                                    ></a>\n                                </div>\n                            </div>\n\n                            <!-- Lead Title -->\n                            <p class=\"text-xs font-medium\">\n                                @{{ email.lead.title }}\n                            </p>\n\n                            <!-- Lead Additional Information -->\n                            <div\n                                class=\"flex flex-wrap gap-1\"\n                                v-if=\"email.lead\"\n                            >\n                                <!-- Tags -->\n                                <template v-for=\"tag in email.lead.tags\">\n                                    <div\n                                        class=\"rounded-xl bg-slate-200 px-3 py-1 text-xs font-medium dark:bg-gray-900\"\n                                        :style=\"{\n                                            backgroundColor: tag.color,\n                                            color: tagTextColor[tag.color]\n                                        }\"\n                                    >\n                                        @{{ tag?.name }}\n                                    </div>\n                                </template>\n\n                                <!-- Lead Value -->\n                                <div class=\"rounded-xl bg-slate-200 px-3 py-1 text-xs font-medium dark:bg-gray-900\">\n                                    @{{ $admin.formatPrice(email.lead.lead_value) }}\n                                </div>\n\n                                <!-- Source Name -->\n                                <div class=\"rounded-xl bg-slate-200 px-3 py-1 text-xs font-medium dark:bg-gray-900\">\n                                    @{{ email.lead.source?.name }}\n                                </div>\n\n                                <!-- Lead Type Name -->\n                                <div class=\"rounded-xl bg-slate-200 px-3 py-1 text-xs font-medium dark:bg-gray-900\">\n                                    @{{ email.lead.type?.name }}\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </template>\n\n                @if (bouncer()->hasPermission('leads.view'))\n                    <template v-else>\n                        <div\n                            class=\"relative\"\n                            ref=\"lookup\"\n                        >\n                            <!-- Input Box (Button) -->\n                            <div\n                                class=\"relative inline-block w-full\"\n                                @click=\"toggle\"\n                            >\n                                <!-- Input-like div -->\n                                <div class=\"w-full cursor-pointer rounded-md border border-gray-300 px-3 py-2 text-gray-800 dark:border-gray-800 dark:text-gray-300\">\n                                    @{{ selectedItem.name ?? '@lang('admin::app.mail.view.search-an-existing-lead')'}}\n                                </div>\n\n                                <!-- Arrow down icon -->\n                                <div class=\"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-3\">\n                                    <i class=\"fas fa-chevron-down text-gray-400\"></i>\n                                </div>\n                            </div>\n\n                            <!-- toggle popup -->\n                            <span class=\"pointer-events-none absolute inset-y-0 right-0 flex items-center pr-3\">\n                                <div class=\"flex items-center justify-center space-x-1\">\n                                    <i\n                                        class=\"text-2xl\"\n                                        :class=\"showPopup ? 'icon-up-arrow': 'icon-down-arrow'\"\n                                    ></i>\n                                </div>\n                            </span>\n\n                            <!-- Popup Box -->\n                            <div\n                                v-if=\"showPopup\"\n                                class=\"absolute top-full z-10 mt-1 flex w-full origin-top transform flex-col gap-2 rounded-lg border border-gray-200 bg-white p-2 shadow-lg transition-transform dark:border-gray-900 dark:bg-gray-800\"\n                            >\n                                <!-- Search Bar -->\n                                <div class=\"relative\">\n                                    <!-- Input Box -->\n                                    <input\n                                        type=\"text\"\n                                        v-model.lazy=\"searchTerm\"\n                                        v-debounce=\"500\"\n                                        class=\"w-full rounded border border-gray-200 px-2.5 py-2 pr-10 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                        placeholder=\"@lang('admin::app.mail.view.search')\"\n                                        ref=\"searchInput\"\n                                        @keyup=\"search\"\n                                    />\n\n                                    <!-- Search Icon (absolute positioned) -->\n                                    <span class=\"absolute inset-y-0 right-0 flex items-center pr-3\">\n                                        <div class=\"flex items-center justify-center space-x-1\">\n                                            <!-- Loader (optional, based on condition) -->\n                                            <div\n                                                class=\"relative\"\n                                                v-if=\"isSearching\"\n                                            >\n                                                <x-admin::spinner />\n                                            </div>\n\n                                            <!-- Search Icon -->\n                                            <i class=\"fas fa-search text-gray-500\"></i>\n                                        </div>\n                                    </span>\n                                </div>\n\n                                <!-- Results List -->\n                                <ul class=\"max-h-40 divide-y divide-gray-100 overflow-y-auto dark:divide-gray-700\">\n                                    <li\n                                        v-for=\"lead in leads\"\n                                        :key=\"lead.id\"\n                                        class=\"flex cursor-pointer gap-2 px-4 py-2 text-gray-800 transition-colors hover:bg-blue-100 dark:text-white dark:hover:bg-gray-900\"\n                                        @click=\"linkLead(lead)\"\n                                    >\n                                        <x-admin::avatar ::name=\"lead.title\" />\n\n                                        <!-- Lead Title -->\n                                        <div class=\"flex flex-col gap-1\">\n                                            <span>@{{ lead.title }}</span>\n                                        </div>\n                                    </li>\n\n                                    <li\n                                        v-if=\"leads.length === 0\"\n                                        class=\"px-4 py-2 text-gray-800 dark:text-gray-300\"\n                                    >\n                                        @lang('admin::app.mail.view.no-result-found')\n                                    </li>\n                                </ul>\n\n                                <!-- Add New Lead Button -->\n                                @if (bouncer()->hasPermission('leads.create'))\n                                    <button\n                                        type=\"button\"\n                                        class=\"flex cursor-pointer items-center gap-2 border-t border-gray-200 p-2 text-brandColor transition-colors dark:border-gray-700\"\n                                        @click=\"toggleLeadModal\"\n                                    >\n                                        <i class=\"icon-add text-md !text-brandColor\"></i>\n\n                                        @lang('admin::app.mail.view.add-new-lead')\n                                    </button>\n                                @endif\n                            </div>\n                        </div>\n                    </template>\n                @endif\n\n                {!! view_render_event('admin.mail.view.lead_lookup.after', ['email' => $email]) !!}\n            </div>\n        </script>\n\n        <!-- Create Contact Template -->\n        <script\n            type=\"text/x-template\"\n            id=\"v-create-contact-template\"\n        >\n            {!! view_render_event('admin.mail.view.contact_form.before', ['email' => $email]) !!}\n\n            <Teleport to=\"body\">\n                <x-admin::form\n                    v-slot=\"{ meta, errors, handleSubmit }\"\n                    as=\"div\"\n                >\n                    <form\n                        @submit=\"handleSubmit($event, create)\"\n                        ref=\"contactForm\"\n                    >\n                        <!-- Add Contact Modal -->\n                        <x-admin::modal\n                            ref=\"contactModal\"\n                            @toggle=\"toggleModal\"\n                        >\n                            <x-slot:header>\n                                <div class=\"flex items-center justify-between\">\n                                    <p class=\"text-xl font-semibold text-gray-800 dark:text-white\">\n                                        @lang('admin::app.mail.view.create-new-contact')\n                                    </p>\n                                </div>\n                            </x-slot>\n\n                            <x-slot:content>\n                                <x-admin::attributes\n                                    :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                        'entity_type' => 'persons',\n                                    ])\"\n                                />\n                            </x-slot>\n\n                            <x-slot:footer>\n                                <x-admin::button\n                                    class=\"primary-button\"\n                                    :title=\"trans('admin::app.mail.view.save-contact')\"\n                                    ::loading=\"isStoring\"\n                                    ::disabled=\"isStoring\"\n                                />\n                            </x-slot>\n                        </x-admin::modal>\n                    </form>\n                </x-admin::form>\n            </Teleport>\n\n            {!! view_render_event('admin.mail.view.contact_form.after', ['email' => $email]) !!}\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-create-lead-template\"\n        >\n            {!! view_render_event('admin.mail.view.lead_form.before', ['email' => $email]) !!}\n\n            <Teleport to=\"body\">\n                <x-admin::form\n                    v-slot=\"{ meta, errors, handleSubmit }\"\n                    as=\"div\"\n                    ref=\"leadFormWrapper\"\n                >\n                    <form\n                        @submit=\"handleSubmit($event, create)\"\n                        ref=\"leadForm\"\n                    >\n                        <!-- Add Contact Modal -->\n                        <x-admin::modal\n                            ref=\"leadModal\"\n                            @toggle=\"toggleModal\"\n                            size=\"large\"\n                        >\n                            <x-slot:header>\n                                <div class=\"flex items-center justify-between\">\n                                    <p class=\"text-xl font-semibold text-gray-800 dark:text-white\">\n                                        @lang('admin::app.mail.view.create-lead')\n                                    </p>\n                                </div>\n                            </x-slot>\n\n                            <x-slot:content>\n                                <div class=\"flex flex-col gap-2\">\n                                    <div class=\"flex gap-2 border-b border-gray-200 dark:border-gray-800\">\n                                        <!-- Tabs -->\n                                        <template\n                                            v-for=\"type in types\"\n                                            :key=\"type.name\"\n                                        >\n                                            <span\n                                                :class=\"[\n                                                    'inline-block px-3 py-2.5 border-b-2 cursor-pointer text-sm font-medium ',\n                                                    selectedType == type.name\n                                                    ? 'text-brandColor border-brandColor dark:brandColor dark:brandColor'\n                                                    : 'text-gray-600 dark:text-gray-300  border-transparent hover:text-gray-800 hover:border-gray-400 dark:hover:border-gray-400  dark:hover:text-white'\n                                                ]\"\n                                                @click=\"selectedType = type.name\"\n                                            >\n                                                @{{ type.label }}\n                                            </span>\n                                        </template>\n                                    </div>\n\n                                    <!-- Container -->\n                                    <div>\n                                        <div v-show=\"selectedType == 'lead'\">\n                                            <div class=\"w-full\">\n                                                <div class=\"flex gap-4 max-sm:flex-wrap\">\n                                                    <div class=\"w-1/2\">\n                                                        <x-admin::attributes\n                                                            :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                                                ['code', 'IN', ['title']],\n                                                                'entity_type' => 'leads',\n                                                                'quick_add' => 1\n                                                            ])\"\n                                                        />\n                                                    </div>\n\n                                                    <div class=\"w-1/2\">\n                                                        <x-admin::attributes\n                                                            :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                                                ['code', 'IN', ['lead_value']],\n                                                                'entity_type' => 'leads',\n                                                                'quick_add' => 1\n                                                            ])\"\n                                                        />\n                                                    </div>\n                                                </div>\n\n                                                <div class=\"flex w-full gap-4 max-sm:flex-wrap\">\n                                                    <!-- Description -->\n                                                    <x-admin::attributes\n                                                        :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                                            ['code', 'IN', ['description']],\n                                                            'entity_type' => 'leads',\n                                                            'quick_add' => 1\n                                                        ])\"\n                                                    />\n                                                </div>\n\n\n                                                <div class=\"flex gap-4 max-sm:flex-wrap\">\n                                                    <div class=\"w-1/2\">\n                                                        <x-admin::attributes\n                                                            :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                                                ['code', 'IN', ['lead_pipeline_id']],\n                                                                'entity_type' => 'leads',\n                                                                'quick_add' => 1\n                                                            ])\"\n                                                        />\n                                                    </div>\n\n                                                    <div class=\"w-1/2\">\n                                                        <x-admin::attributes\n                                                            :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                                                ['code', 'IN', ['lead_pipeline_stage_id']],\n                                                                'entity_type' => 'leads',\n                                                                'quick_add' => 1\n                                                            ])\"\n                                                        />\n                                                    </div>\n                                                </div>\n\n                                                <div class=\"flex gap-4 max-sm:flex-wrap\">\n                                                    <div class=\"w-1/2\">\n                                                        <x-admin::attributes\n                                                            :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                                                ['code', 'IN', ['lead_type_id']],\n                                                                'entity_type' => 'leads',\n                                                                'quick_add' => 1\n                                                            ])\"\n                                                        />\n                                                    </div>\n\n                                                    <div class=\"w-1/2\">\n                                                        <x-admin::attributes\n                                                            :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                                                ['code', 'IN', ['lead_source_id']],\n                                                                'entity_type' => 'leads',\n                                                                'quick_add' => 1\n                                                            ])\"\n                                                        />\n                                                    </div>\n                                                </div>\n\n                                                <div class=\"flex gap-4 max-sm:flex-wrap\">\n                                                    <div class=\"w-1/2\">\n                                                        <x-admin::attributes\n                                                            :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                                                ['code', 'IN', ['user_id']],\n                                                                'entity_type' => 'leads',\n                                                                'quick_add' => 1\n                                                            ])\"\n                                                        />\n                                                    </div>\n\n                                                    <div class=\"w-1/2\">\n                                                        <x-admin::attributes\n                                                            :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                                                ['code', 'IN', ['expected_close_date']],\n                                                                'entity_type' => 'leads',\n                                                                'quick_add' => 1\n                                                            ])\"\n                                                            :custom-validations=\"[\n                                                                'expected_close_date' => [\n                                                                    'date_format:yyyy-MM-dd',\n                                                                    'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                                                ],\n                                                            ]\"\n                                                        />\n                                                    </div>\n                                                </div>\n                                            </div>\n                                        </div>\n\n                                        <div v-show=\"selectedType == 'person'\">\n                                            @include('admin::leads.common.contact')\n                                        </div>\n\n                                        <div\n                                            class=\"overflow-y-auto\"\n                                            v-show=\"selectedType == 'product'\"\n                                        >\n                                            @include('admin::leads.common.products')\n                                        </div>\n                                    </div>\n                                </div>\n                            </x-slot>\n\n                            <x-slot:footer>\n                                <x-admin::button\n                                    class=\"primary-button\"\n                                    :title=\"trans('Save Lead')\"\n                                    ::loading=\"isStoring\"\n                                    ::disabled=\"isStoring\"\n                                />\n                            </x-slot>\n                        </x-admin::modal>\n                    </form>\n                </x-admin::form>\n            </Teleport>\n\n            {!! view_render_event('admin.mail.view.lead_form.after', ['email' => $email]) !!}\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-action-email-template\"\n        >\n            {!! view_render_event('admin.mail.view.action_mail.before', ['email' => $email]) !!}\n\n            <div class=\"flex flex-col gap-4\">\n                <!-- Contact Lookup -->\n                @if (\n                    bouncer()->hasPermission('contacts.persons.create')\n                    || bouncer()->hasPermission('contacts.persons.edit')\n                )\n                    <!-- Link to contact -->\n                    <label class=\"font-semibold text-gray-800 dark:text-gray-300\">\n                        @{{ email?.person ? \"@lang('admin::app.mail.view.linked-contact')\" : \"@lang('admin::app.mail.view.link-to-contact')\" }}\n                    </label>\n\n                    <v-contact-lookup\n                        @link-contact=\"linkContact\"\n                        @unlink-contact=\"unlinkContact\"\n                        @open-contact-modal=\"openContactModal\"\n                        :unlinking=\"unlinking\"\n                        :email=\"email\"\n                        :tag-text-color=\"tagTextColor\"\n                    ></v-contact-lookup>\n                @endif\n\n\n                <!-- Lead Lookup -->\n                @if (\n                    bouncer()->hasPermission('leads.view')\n                    || bouncer()->hasPermission('leads.create')\n                )\n                    <!-- Link to Lead -->\n                    <label class=\"font-semibold text-gray-800 dark:text-gray-300\">\n                        @{{ email?.lead ? \"@lang('admin::app.mail.view.linked-lead')\" : \"@lang('admin::app.mail.view.link-to-lead')\" }}\n                    </label>\n\n                    <v-lead-lookup\n                        @link-lead=\"linkLead\"\n                        @unlink-lead=\"unlinkLead\"\n                        @open-lead-modal=\"openLeadModal\"\n                        :unlinking=\"unlinking\"\n                        :email=\"email\"\n                        :tag-text-color=\"tagTextColor\"\n                    ></v-lead-lookup>\n                @endif\n            </div>\n\n            <!-- Create Contact Modal -->\n            <v-create-contact ref=\"createContact\"></v-create-contact>\n\n            <!-- Create Lead Modal -->\n            <v-create-lead ref=\"createLead\"></v-create-lead>\n\n            {!! view_render_event('admin.mail.view.action_mail.after', ['email' => $email]) !!}\n        </script>\n\n        <!-- Email List Vue Component -->\n        <script type=\"module\">\n            app.component('v-email-list', {\n                template: '#v-email-list-template',\n\n                data() {\n                    return {\n                        email: @json($email),\n\n                        action: {},\n                    };\n                },\n\n                mounted() {\n                    this.$emitter.on('on-email-save', (email) => {\n                        this.email.emails.push(email);\n\n                        this.action = {};\n\n                        setTimeout(() => this.scrollBottom(), 0);\n                    });\n                },\n\n                methods: {\n                    emailAction(action) {\n                        this.action[action.email.id] = action;\n\n                        if (! this.action.email) {\n                            this.action.email = this.lastEmail();\n                        }\n                    },\n\n                    scrollBottom() {\n                        const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n\n                        const windowHeight = window.innerHeight;\n\n                        const scrollBottom = scrollTop + windowHeight;\n\n                        window.scrollTo({\n                            top: scrollBottom,\n                            behavior: 'smooth',\n                        });\n                    },\n\n                    lastEmail() {\n                        if (\n                            this.email.emails === undefined\n                            || ! this.email.emails.length\n                        ) {\n                            return this.email;\n                        }\n\n                        return this.email.emails[this.email.emails.length - 1];\n                    },\n                },\n            });\n        </script>\n\n        <!-- Email Item Vue Component -->\n        <script type=\"module\">\n            app.component('v-email-item', {\n                template: '#v-email-item-template',\n\n                props: ['index', 'email', 'action'],\n\n                emits: ['on-discard', 'on-email-action'],\n\n                methods: {\n                    isImage(path) {\n                        return /\\.(jpg|jpeg|png|gif|webp)$/i.test(path);\n                    },\n\n                    isVideo(path) {\n                        return /\\.(mp4|avi|mov|wmv|mkv)$/i.test(path);\n                    },\n\n                    isDocument(path) {\n                        return /\\.(pdf|docx?|xlsx?|pptx?)$/i.test(path);\n                    },\n\n                    emailAction(type) {\n                        if (type != 'delete') {\n                            this.$emit('on-email-action', {type, email: this.email});\n                        } else {\n                            this.$emitter.emit('open-confirm-modal', {\n                                agree: () => {\n                                    this.$axios.post(`{{ route('admin.mail.delete', ':id') }}`.replace(':id', this.email.id), {\n                                        _method: 'DELETE',\n                                        type: 'trash'\n                                    })\n                                    .then ((response) => {\n                                        if (response.status == 200) {\n                                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                                            this.$emit('on-discard');\n                                        }\n                                    });\n                                }\n                            });\n                        }\n                    },\n                },\n            });\n        </script>\n\n        <!-- Email Form Vue Component -->\n        <script type=\"module\">\n            app.component('v-email-form', {\n                template: '#v-email-form-template',\n\n                props: ['action', 'email'],\n\n                data() {\n                    return {\n                        showCC: false,\n\n                        showBCC: false,\n\n                        isStoring: false,\n                    };\n                },\n\n                computed: {\n                    reply_to() {\n                        if (this.getActionType == 'forward') {\n                            return [];\n                        }\n\n                        if (this.getActionType == 'reply-all') {\n                            return [\n                                this.action.email.from,\n                                ...(this.action.email?.cc || []),\n                                ...(this.action.email?.bcc || []),\n                            ];\n                        }\n\n                        return [this.action.email.from];\n                    },\n\n                    cc() {\n                        if (this.getActionType != 'reply-all') {\n                            return [];\n                        }\n\n                        return this.action.email.cc;\n                    },\n\n                    bcc() {\n                        if (this.getActionType != 'reply-all') {\n                            return [];\n                        }\n\n                        return this.action.email.bcc;\n                    },\n\n                    reply() {\n                        if (this.getActionType == 'forward') {\n                            return this.action.email.reply;\n                        }\n\n                        return '';\n                    },\n\n                    getActionType() {\n                        return this.action[this.email.id].type;\n                    },\n                },\n\n                methods: {\n                    save(params, { resetForm, setErrors  }) {\n                        let formData = new FormData(this.$refs.mailActionForm);\n\n                        this.isStoring = true;\n\n                        this.$axios.post(\"{{ route('admin.mail.store') }}\", formData, {\n                                headers: {\n                                    'Content-Type': 'multipart/form-data'\n                                }\n                            })\n                            .then ((response) => {\n                                this.isStoring = false;\n\n                                this.$emitter.emit('on-email-save', response.data.data);\n\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch ((error) => {\n                                this.isStoring = false;\n\n                                if (error.response.status == 422) {\n                                    setErrors(error.response.data.errors);\n                                } else {\n                                    this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                                }\n                            });\n                    },\n                },\n            });\n        </script>\n\n        <!-- Contact Lookup Component -->\n        <script type=\"module\">\n            app.component('v-contact-lookup', {\n                template: '#v-contact-lookup-template',\n\n                props: ['email', 'unlinking', 'tagTextColor'],\n\n                emits: ['link-contact', 'unlink-contact', 'open-contact-modal'],\n\n                data() {\n                    return {\n                        showPopup: false,\n\n                        searchTerm: '',\n\n                        selectedItem: {},\n\n                        searchedResults: [],\n\n                        isSearching: false,\n\n                        cancelToken: null,\n                    };\n                },\n\n                mounted() {\n                    if (this.value) {\n                        this.selectedItem = this.value;\n                    }\n                },\n\n                created() {\n                    window.addEventListener('click', this.handleFocusOut);\n                },\n\n                beforeDestroy() {\n                    window.removeEventListener('click', this.handleFocusOut);\n                },\n\n                watch: {\n                    searchTerm(newVal, oldVal) {\n                        this.search();\n                    },\n                },\n\n                computed: {\n                    /**\n                     * Filter the searchedResults based on the search query.\n                     *\n                     * @return {Array}\n                     */\n                    persons() {\n                        return this.searchedResults.filter(item =>\n                            item.name.toLowerCase().includes(this.searchTerm.toLowerCase())\n                        );\n                    }\n                },\n\n                methods: {\n                    /**\n                     * Toggle the popup.\n                     *\n                     * @return {void}\n                     */\n                    toggle() {\n                        this.showPopup = ! this.showPopup;\n\n                        if (this.showPopup) {\n                            this.$nextTick(() => this.$refs.searchInput.focus());\n                        }\n                    },\n\n                    /**\n                     * Select an item from the list.\n                     *\n                     * @param {Object} item\n                     *\n                     * @return {void}\n                     */\n                    linkContact(person) {\n                        this.showPopup = false;\n\n                        this.searchTerm = '';\n\n                        this.selectedItem = person;\n\n                        this.$emit('link-contact', person);\n                    },\n\n                    unlinkContact() {\n                        this.selectedItem = {};\n\n                        this.$emit('unlink-contact');\n                    },\n\n                    /**\n                     * Initialize the items.\n                     *\n                     * @return {void}\n                     */\n                    search() {\n                        if (this.searchTerm.length <= 2) {\n                            this.searchedResults = [];\n\n                            this.isSearching = false;\n\n                            return;\n                        }\n\n                        this.isSearching = true;\n\n                        if (this.cancelToken) {\n                            this.cancelToken.cancel();\n                        }\n\n                        this.cancelToken = this.$axios.CancelToken.source();\n\n                        this.$axios.get('{{ route('admin.contacts.persons.search') }}', {\n                                params: {\n                                    ...this.params,\n                                    query: this.searchTerm\n                                },\n                                cancelToken: this.cancelToken.token,\n                            })\n                            .then(response => {\n                                this.searchedResults = response.data.data;\n                            })\n                            .catch(error => {\n                                if (! this.$axios.isCancel(error)) {\n                                    console.error(\"Search request failed:\", error);\n                                }\n\n                                this.isSearching = false;\n                            })\n                            .finally(() => this.isSearching = false);\n                    },\n\n                    /**\n                     * Handle the focus out event.\n                     *\n                     * @param {Event} event\n                     *\n                     * @return {void}\n                     */\n                    handleFocusOut(event) {\n                        const lookup = this.$refs.lookup;\n\n                        if (\n                            lookup &&\n                            ! lookup.contains(event.target)\n                        ) {\n                            this.showPopup = false;\n                        }\n                    },\n\n                    toggleContactModal() {\n                        this.showPopup = false;\n\n                        this.$emit('open-contact-modal');\n                    },\n                },\n            });\n        </script>\n\n        <!-- Contact Lookup Component -->\n        <script type=\"module\">\n            app.component('v-lead-lookup', {\n                template: '#v-lead-lookup-template',\n\n                props: ['email', 'unlinking', 'tagTextColor'],\n\n                emits: ['link-lead', 'unlink-lead', 'open-lead-modal'],\n\n                data() {\n                    return {\n                        showPopup: false,\n\n                        searchTerm: '',\n\n                        selectedItem: {},\n\n                        searchedResults: [],\n\n                        isSearching: false,\n\n                        cancelToken: null,\n                    };\n                },\n\n                mounted() {\n                    if (this.value) {\n                        this.selectedItem = this.value;\n                    }\n                },\n\n                created() {\n                    window.addEventListener('click', this.handleFocusOut);\n                },\n\n                beforeDestroy() {\n                    window.removeEventListener('click', this.handleFocusOut);\n                },\n\n                watch: {\n                    searchTerm(newVal, oldVal) {\n                        this.search();\n                    },\n                },\n\n                computed: {\n                    /**\n                     * Filter the searchedResults based on the search query.\n                     *\n                     * @return {Array}\n                     */\n                    leads() {\n                        return this.searchedResults.filter(item =>\n                            item.title.toLowerCase().includes(this.searchTerm.toLowerCase())\n                        );\n                    },\n                },\n\n                methods: {\n                    /**\n                     * Toggle the popup.\n                     *\n                     * @return {void}\n                     */\n                    toggle() {\n                        this.showPopup = ! this.showPopup;\n\n                        if (this.showPopup) {\n                            this.$nextTick(() => this.$refs.searchInput.focus());\n                        }\n                    },\n\n                    /**\n                     * Select an item from the list.\n                     *\n                     * @param {Object} item\n                     *\n                     * @return {void}\n                     */\n                    linkLead(lead) {\n                        this.showPopup = false;\n\n                        this.searchTerm = '';\n\n                        this.selectedItem = lead;\n\n                        this.$emit('link-lead', lead);\n                    },\n\n                    unlinkLead() {\n                        this.selectedItem = {};\n\n                        this.$emit('unlink-lead');\n                    },\n\n                    /**\n                     * Initialize the items.\n                     *\n                     * @return {void}\n                     */\n                    search() {\n                        if (this.searchTerm.length <= 2) {\n                            this.searchedResults = [];\n\n                            this.isSearching = false;\n\n                            return;\n                        }\n\n                        this.isSearching = true;\n\n                        if (this.cancelToken) {\n                            this.cancelToken.cancel();\n                        }\n\n                        this.cancelToken = this.$axios.CancelToken.source();\n\n                        this.$axios.get('{{ route('admin.leads.search') }}', {\n                                params: {\n                                    ...this.params,\n                                    query: this.searchTerm\n                                },\n                                cancelToken: this.cancelToken.token,\n                            })\n                            .then(response => {\n                                this.searchedResults = response.data.data;\n                            })\n                            .catch(error => {\n                                if (! this.$axios.isCancel(error)) {\n                                    console.error(\"Search request failed:\", error);\n                                }\n\n                                this.isSearching = false;\n                            })\n                            .finally(() => this.isSearching = false);\n                    },\n\n                    /**\n                     * Handle the focus out event.\n                     *\n                     * @param {Event} event\n                     *\n                     * @return {void}\n                     */\n                    handleFocusOut(event) {\n                        const lookup = this.$refs.lookup;\n\n                        if (\n                            lookup &&\n                            ! lookup.contains(event.target)\n                        ) {\n                            this.showPopup = false;\n                        }\n                    },\n\n                    toggleLeadModal() {\n                        this.showPopup = false;\n\n                        this.$emit('open-lead-modal');\n                    },\n                },\n            });\n        </script>\n\n        <!-- Create Contact Modal Component -->\n        <script type=\"module\">\n            app.component('v-create-contact', {\n                template: '#v-create-contact-template',\n\n                data() {\n                    return {\n                        isStoring: false,\n                    };\n                },\n\n                methods: {\n                    toggleModal({ isActive }) {\n                        if (! isActive) {\n                            this.$parent.$refs.emailLinkDrawer.toggle();\n                        }\n                    },\n\n                    create(params, { setErrors }) {\n                        this.isStoring = true;\n\n                        const formData = new FormData(this.$refs.contactForm);\n\n                        this.$axios.post('{{ route('admin.contacts.persons.store') }}', formData)\n                            .then(response => {\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                                this.$refs.contactModal.close();\n                            })\n                            .catch(error => {\n                                if (error.response.status == 422) {\n                                    setErrors(error.response.data.errors);\n                                } else {\n                                    this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                                }\n                            })\n                            .finally(() => {\n                                this.isStoring = false;\n\n                                this.$parent.$refs.emailLinkDrawer.open();\n                            });\n                    },\n                },\n            });\n        </script>\n\n        <!-- Create Lead Modal Component -->\n        <script type=\"module\">\n            app.component('v-create-lead', {\n                template: '#v-create-lead-template',\n\n                data() {\n                    return {\n                        isStoring: false,\n\n                        selectedType: \"lead\",\n\n                        types: [\n                            {\n                                name: 'lead',\n                                label: \"{{ trans('admin::app.mail.view.lead-details') }}\",\n                            }, {\n                                name: 'person',\n                                label: \"{{ trans('admin::app.mail.view.contact-person') }}\",\n                            }, {\n                                name: 'product',\n                                label: \"{{ trans('admin::app.mail.view.product') }}\",\n                            },\n                        ],\n                    };\n                },\n\n                mounted() {\n                    this.$watch(\n                        () => this.$refs.leadFormWrapper?.errors,\n                        (newErrors, oldErrors) => {\n                            if (\n                                newErrors\n                                && ! Object.keys(newErrors).length\n                            ) {\n                                return;\n                            }\n\n                            const allErrorKeys = Object.keys(newErrors);\n\n                            const hasPersonErrors = allErrorKeys.some(key => key.startsWith('person['));\n\n                            const hasNonPersonErrors = allErrorKeys.some(key => !key.startsWith('person['));\n\n                            if (\n                                hasPersonErrors\n                                && ! hasNonPersonErrors\n                            ) {\n                                this.selectedType = 'person';\n                            }\n                        },\n                        {\n                            deep: true,\n                            immediate: true,\n                        }\n                    );\n                },\n\n                methods: {\n                    toggleModal({ isActive }) {\n                        if (! isActive) {\n                            this.$parent.$refs.emailLinkDrawer.toggle();\n                        }\n                    },\n\n                    create(params, { setErrors }) {\n                        this.isStoring = true;\n\n                        const formData = new FormData(this.$refs.leadForm);\n\n                        formData.append('lead_pipeline_stage_id', 1)\n\n                        this.$axios.post('{{ route('admin.leads.store') }}', formData)\n                            .then(response => {\n                                if (response.data.data) {\n                                    this.$parent.$parent.$refs.emailAction.linkLead(response.data.data);\n                                }\n\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                                this.$refs.leadModal.close();\n                            })\n                            .catch(error => {\n                                if (error.response.status == 422) {\n                                    setErrors(error.response.data.errors);\n                                } else {\n                                    this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                                }\n                            })\n                            .finally(() => {\n                                this.isStoring = false;\n\n                                this.$parent.$refs.emailLinkDrawer.open();\n                            });\n                    },\n                },\n            });\n        </script>\n\n        <!-- Link to mail Component -->\n        <script type=\"module\">\n            app.component('v-action-email', {\n                template: '#v-action-email-template',\n\n                data() {\n                    return {\n                        link: 'contact',\n\n                        email: @json($email->getAttributes()),\n\n                        unlinking: {\n                            lead: false,\n                            contact: false,\n                        },\n\n                        tagTextColor: {\n                            '#FEE2E2': '#DC2626',\n                            '#FFEDD5': '#EA580C',\n                            '#FEF3C7': '#D97706',\n                            '#FEF9C3': '#CA8A04',\n                            '#ECFCCB': '#65A30D',\n                            '#DCFCE7': '#16A34A',\n                        },\n                    };\n                },\n\n                created() {\n                    @if ($email->person)\n                        this.email.person = @json($email->person);\n                    @endif\n\n                    @if ($email->lead)\n                        this.email.lead = @json($email->lead);\n                    @endif\n                },\n\n                methods: {\n                    openDrawer() {\n                        this.$refs.emailLinkDrawer.open();\n                    },\n\n                    linkContact(person) {\n                        this.email['person'] = person;\n\n                        this.email['person_id'] = person.id;\n\n                        this.$axios.post('{{ route('admin.mail.update', $email->id) }}', {\n                            _method: 'PUT',\n                            person_id: person.id,\n                        })\n                            .then (response => {\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch (error => {});\n                    },\n\n                    unlinkContact() {\n                        this.$emitter.emit('open-confirm-modal', {\n                            agree: () => {\n                                this.unlinking.contact = true;\n\n                                this.$axios.post('{{ route('admin.mail.update', $email->id) }}', {\n                                    _method: 'PUT',\n                                    person_id: null,\n                                })\n                                    .then (response => {\n                                        this.email['person'] = this.email['person_id'] = null;\n\n                                        this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                                    })\n                                    .catch (error => {})\n                                    .finally(() => this.unlinking.contact = false);\n                            },\n                        });\n                    },\n\n                    linkLead(lead) {\n                        this.email['lead'] = lead;\n\n                        this.email['lead_id'] = lead.id;\n\n                        this.$axios.post('{{ route('admin.mail.update', $email->id) }}', {\n                            _method: 'PUT',\n                            lead_id: lead.id,\n                        })\n                            .then (response => {\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch (error => {});\n                    },\n\n                    unlinkLead() {\n                        this.$emitter.emit('open-confirm-modal', {\n                            agree: () => {\n                                this.unlinking.lead = true;\n\n                                this.$axios.post('{{ route('admin.mail.update', $email->id) }}', {\n                                    _method: 'PUT',\n                                    lead_id: null,\n                                })\n                                    .then (response => {\n                                        this.email['lead'] = this.email['lead_id'] = null;\n\n                                        this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                                    })\n                                    .catch (error => {})\n                                    .finally(() => this.unlinking.lead = false);\n                            },\n                        });\n                    },\n\n                    openContactModal() {\n                        this.$refs.createContact.$refs.contactModal.open();\n                    },\n\n                    openLeadModal() {\n                        this.$refs.createLead.$refs.leadModal.open();\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/partials/breadcrumbs.blade.php",
    "content": "@unless ($breadcrumbs->isEmpty())\n    <nav aria-label=\"\">\n        <ol class=\"flex flex-wrap\">\n            @foreach ($breadcrumbs as $breadcrumb)\n                @if (\n                    $breadcrumb->url \n                    && ! $loop->last\n                )\n                    <li class=\"flex items-center gap-x-1 text-sm font-normal text-brandColor dark:text-brandColor\">\n                        <a href=\"{{ $breadcrumb->url }}\">\n                            {{ $breadcrumb->title }}\n                        </a>\n\n                        <span class=\"after:content-['/'] ltr:mr-1 rtl:ml-1\"></span>\n                    </li>\n                @else\n                    <li \n                        class=\"flex items-center gap-x-1 text-base text-gray-600 after:content-['/'] last:cursor-default after:last:hidden dark:text-gray-300\" \n                        aria-current=\"page\"\n                    >\n                        {{ $breadcrumb->title }}\n                    </li>\n                @endif\n            @endforeach\n        </ol>\n    </nav>\n@endunless\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/products/create.blade.php",
    "content": "\n<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.products.create.title')\n    </x-slot>\n\n    {!! view_render_event('admin.products.create.form.before') !!}\n\n    <x-admin::form\n        :action=\"route('admin.products.store')\"\n        method=\"POST\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.products.create.breadcrumbs.before') !!}\n\n                    <!-- Breadcrumbs -->\n                    <x-admin::breadcrumbs name=\"products.create\" />\n\n                    {!! view_render_event('admin.products.create.breadcrumbs.after') !!}\n                    \n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.products.create.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.products.create.save_button.before') !!}\n\n                        <!-- Create button for Product -->\n                        @if (bouncer()->hasPermission('settings.user.groups.create'))\n                            <button\n                                type=\"submit\"\n                                class=\"primary-button\"\n                            >\n                                @lang('admin::app.products.create.save-btn')\n                            </button>\n                        @endif\n\n                        {!! view_render_event('admin.products.create.save_button.after') !!}\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"flex gap-2.5 max-xl:flex-wrap\">\n                <!-- Left sub-component -->\n                <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                    <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                        <p class=\"mb-4 text-base font-semibold text-gray-800 dark:text-white\">\n                            @lang('admin::app.products.create.general')\n                        </p>\n\n                        {!! view_render_event('admin.products.create.attributes.before') !!}\n\n                        <x-admin::attributes\n                            :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                'entity_type' => 'products',\n                                ['code', 'NOTIN', ['price', 'quantity']],\n                            ])\"\n                        />\n\n                        {!! view_render_event('admin.products.create.attributes.after') !!}\n                    </div>\n                </div>\n\n                <!-- Right sub-component -->\n                <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                    {!! view_render_event('admin.products.create.accordion.before') !!}\n\n                    <x-admin::accordion>\n                        <x-slot:header>\n                            {!! view_render_event('admin.products.create.accordion.header.before') !!}\n\n                            <div class=\"flex items-center justify-between\">\n                                <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.products.create.price')\n                                </p>\n                            </div>\n\n                            {!! view_render_event('admin.products.create.accordion.header.after') !!}\n                        </x-slot>\n\n                        <x-slot:content>\n                            {!! view_render_event('admin.products.create.accordion.content.attributes.before') !!}\n\n                            <x-admin::attributes\n                                :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                    'entity_type' => 'products',\n                                    ['code', 'IN', ['price', 'quantity']],\n                                ])\"\n                            />\n\n                            {!! view_render_event('admin.products.create.accordion.content.attributes.after') !!}\n                        </x-slot>\n                    </x-admin::accordion>\n\n                    {!! view_render_event('admin.products.create.accordion.before') !!}\n                </div>\n            </div>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.products.create.form.after') !!}\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/products/edit.blade.php",
    "content": "\n<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.products.edit.title')\n    </x-slot>\n\n    {!! view_render_event('admin.products.edit.form.before') !!}\n\n    <x-admin::form\n        :action=\"route('admin.products.update', $product->id)\"\n        encType=\"multipart/form-data\"\n        method=\"PUT\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    <!-- Breadcrumbs -->\n                    <x-admin::breadcrumbs\n                        name=\"products.edit\"\n                        :entity=\"$product\"\n                     />\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.products.edit.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.products.edit.create_button.before', ['product' => $product]) !!}\n                        \n                        <!-- Edit button for Product -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.products.create.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.products.edit.create_button.after', ['product' => $product]) !!}\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"flex gap-2.5 max-xl:flex-wrap\">\n                <!-- Left sub-component -->\n                <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                    <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                        <p class=\"mb-4 text-base font-semibold text-gray-800 dark:text-white\">\n                            @lang('admin::app.products.create.general')\n                        </p>\n\n                        {!! view_render_event('admin.products.edit.attributes.before', ['product' => $product]) !!}\n\n                        <x-admin::attributes\n                            :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                'entity_type' => 'products',\n                                ['code', 'NOTIN', ['price', 'quantity']],\n                            ])\"\n                            :entity=\"$product\"\n                        />\n\n                        {!! view_render_event('admin.products.edit.attributes.after', ['product' => $product]) !!}\n                    </div>\n                </div>\n\n                <!-- Right sub-component -->\n                <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                    {!! view_render_event('admin.products.edit.accordion.before', ['product' => $product]) !!}\n\n                    <x-admin::accordion >\n                        <x-slot:header>\n                            {!! view_render_event('admin.products.edit.accordion.header.before', ['product' => $product]) !!}\n\n                            <div class=\"flex items-center justify-between\">\n                                <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.products.create.price')\n                                </p>\n                            </div>\n\n                            {!! view_render_event('admin.products.edit.accordion.header.after', ['product' => $product]) !!}\n                        </x-slot>\n\n                        <x-slot:content>\n                            {!! view_render_event('admin.products.edit.accordion.content.attributes.before', ['product' => $product]) !!}\n\n                            <x-admin::attributes\n                                :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                    'entity_type' => 'products',\n                                    ['code', 'IN', ['price', 'quantity']],\n                                ])\"\n                                :entity=\"$product\"\n                            />\n\n                            {!! view_render_event('admin.products.edit.accordion.content.attributes.after', ['product' => $product]) !!}\n                        </x-slot>\n                    </x-admin::accordion>\n\n                    {!! view_render_event('admin.products.edit.accordion.after', ['product' => $product]) !!}\n                </div>\n            </div>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.products.edit.form.after') !!}\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/products/index.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.products.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                <!-- Breadcrumbs -->\n                <x-admin::breadcrumbs name=\"products\" />\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    @lang('admin::app.products.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                {!! view_render_event('admin.products.index.create_button.before') !!}\n\n                <!-- Create button for Product -->\n                @if (bouncer()->hasPermission('products.create'))\n                    <div class=\"flex items-center gap-x-2.5\">\n                        <a\n                            href=\"{{ route('admin.products.create') }}\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.products.index.create-btn')\n                        </a>\n                    </div>\n                @endif\n\n                {!! view_render_event('admin.products.index.create_button.after') !!}\n            </div>\n        </div>\n\n        {!! view_render_event('admin.products.index.datagrid.before') !!}\n\n        <x-admin::datagrid :src=\"route('admin.products.index')\">\n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </x-admin::datagrid>\n\n        {!! view_render_event('admin.products.index.datagrid.after') !!}\n    </div>\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/products/view/attributes.blade.php",
    "content": "{!! view_render_event('admin.products.view.attributes.before', ['product' => $product]) !!}\n\n<div class=\"flex w-full flex-col gap-4 border-b border-gray-200 p-4 dark:border-gray-800 dark:text-white\">\n    <x-admin::accordion  class=\"select-none !border-none\">\n        <x-slot:header class=\"!p-0\">\n            <h4 class=\"font-semibold dark:text-white\">\n                @lang('admin::app.products.view.attributes.about-product')\n            </h4>\n        </x-slot>\n\n        <x-slot:content class=\"mt-4 !px-0 !pb-0\">\n            {!! view_render_event('admin.products.view.attributes.view.before', ['product' => $product]) !!}\n    \n            <!-- Attributes Listing -->\n            <div>\n                <!-- Default Attributes --> \n                <x-admin::attributes.view\n                    :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                        'entity_type' => 'products',\n                        ['code', 'IN', ['SKU', 'price', 'quantity', 'status']]\n                    ])->sortBy('sort_order')\"\n                    :entity=\"$product\"\n                    :url=\"route('admin.products.update', $product->id)\"   \n                    :allow-edit=\"true\"\n                />\n        \n                <!-- Custom Attributes --> \n                <x-admin::attributes.view\n                    :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                        'entity_type' => 'products',\n                        ['code', 'NOTIN', ['SKU', 'price', 'quantity', 'status']]\n                    ])->sortBy('sort_order')\"\n                    :entity=\"$product\"\n                    :url=\"route('admin.products.update', $product->id)\"   \n                    :allow-edit=\"true\"\n                />\n            </div>\n            \n            {!! view_render_event('admin.products.view.attributes.view.after', ['product' => $product]) !!}\n        </x-slot>\n    </x-admin::accordion>\n</div>\n\n{!! view_render_event('admin.products.view.attributes.before', ['product' => $product]) !!}"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/products/view/inventory.blade.php",
    "content": "{!! view_render_event('admin.products.view.inventory.before', ['product' => $product]) !!}\n\n<!-- Product Inventories Component -->\n<v-product-inventories></v-product-inventories>\n\n{!! view_render_event('admin.products.view.inventory.after', ['product' => $product]) !!}\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-product-inventories-template\"\n    >\n        <div class=\"p-4\">\n            <div class=\"flex flex-col gap-4\">\n                {!! view_render_event('admin.products.view.inventory.table.before', ['product' => $product]) !!}\n\n                <div class=\"block w-full overflow-x-auto\">\n                    <x-admin::table>\n                        <!-- Table Head -->\n                        <x-admin::table.thead>\n                            <x-admin::table.thead.tr>\n                                <x-admin::table.th>\n                                    @lang('admin::app.products.view.inventory.source')\n                                </x-admin::table.th>\n\n                                <x-admin::table.th >\n                                    @lang('admin::app.products.view.inventory.in-stock')\n                                </x-admin::table.th>\n\n                                <x-admin::table.th>\n                                    @lang('admin::app.products.view.inventory.allocated')\n                                </x-admin::table.th>\n\n                                <x-admin::table.th>\n                                    @lang('admin::app.products.view.inventory.on-hand')\n                                </x-admin::table.th>\n\n                                <x-admin::table.th>\n                                    @lang('admin::app.products.view.inventory.actions')\n                                </x-admin::table.th>\n                            </x-admin::table.thead.tr>\n                        </x-admin::table.thead>\n\n                        <!-- Table Body -->\n                        <x-admin::table.tbody class=\"align-top\">\n                            <template v-for=\"warehouse in productWarehouses\">\n                                <x-admin::table.tbody.tr class=\"hover:bg-gray-50 dark:hover:bg-gray-950\">\n                                    <x-admin::table.td\n                                        class=\"truncate font-bold dark:text-white\"\n                                        ::title=\"warehouse.name\"\n                                    >\n                                        @{{ warehouse.name }}\n                                    </x-admin::table.td>\n\n                                    <x-admin::table.td class=\"dark:text-white\">\n                                        @{{ warehouse.in_stock }}\n                                    </x-admin::table.td>\n\n                                    <x-admin::table.td class=\"dark:text-white\">\n                                        @{{ warehouse.allocated }}\n                                    </x-admin::table.td>\n\n                                    <x-admin::table.td class=\"dark:text-white\">\n                                        @{{ warehouse.on_hand }}\n                                    </x-admin::table.td>\n\n                                    <x-admin::table.td>\n                                        <div\n                                            @click=\"selectWarehouse(warehouse)\"\n                                            class=\"cursor-pointer text-brandColor\"\n                                        >\n                                            @lang('admin::app.products.view.inventory.assign')\n                                        </div>\n                                    </x-admin::table.td>\n                                </x-admin::table.tbody.tr>\n\n                                <template v-for=\"location in warehouse.locations\">\n                                    <x-admin::table.tbody.tr class=\"border-b border-gray-200 hover:bg-gray-50 dark:border-gray-800 dark:hover:bg-gray-950\">\n                                        <x-admin::table.td class=\"dark:text-white\">\n                                            @{{ location.name }}\n                                        </x-admin::table.td>\n\n                                        <x-admin::table.td class=\"dark:text-white\">\n                                            @{{ location.in_stock }}\n                                        </x-admin::table.td>\n\n                                        <x-admin::table.td class=\"dark:text-white\">\n                                            @{{ location.allocated }}\n                                        </x-admin::table.td>\n\n                                        <x-admin::table.td class=\"dark:text-white\">\n                                            @{{ location.on_hand }}\n                                        </x-admin::table.td>\n\n                                        <x-admin::table.td></x-admin::table.td>\n                                    </x-admin::table.tbody.tr>\n                                </template>\n                            </template>\n                        </x-admin::table.tbody>\n                    </x-admin::table>\n                </div>\n\n                {!! view_render_event('admin.products.view.inventory.table.after', ['product' => $product]) !!}\n\n                {!! view_render_event('admin.products.view.inventory.source.before', ['product' => $product]) !!}\n\n                <!-- Add Source dropdown -->\n                <div v-if=\"notAddedWarehouses.length\">\n                    <x-admin::dropdown\n                        position=\"bottom-right\"\n                        class=\"!static\"\n                    >\n                        <x-slot:toggle>\n                            <button\n                                type=\"button\"\n                                class=\"flex max-w-max items-center gap-2 text-brandColor\"\n                            >\n                                <i class=\"icon-add text-md !text-brandColor\"></i>\n\n                                @lang('admin::app.products.view.inventory.add-source')\n                            </button>\n                        </x-slot>\n\n                        <x-slot:menu class=\"!top-[30px] max-h-[200px] overflow-auto\">\n                            {!! view_render_event('admin.products.view.inventory.source.menu.item.before', ['product' => $product]) !!}\n\n                            <x-admin::dropdown.menu.item\n                                v-for=\"warehouse in notAddedWarehouses\"\n                                @click=\"addWarehouse(warehouse)\"\n                            >\n                                @{{ warehouse.name }}\n\n                            </x-admin::dropdown.menu.item>\n\n                            {!! view_render_event('admin.products.view.inventory.source.menu.item.after', ['product' => $product]) !!}\n                        </x-slot>\n                    </x-admin::dropdown>\n                </div>\n\n                {!! view_render_event('admin.products.view.inventory.source.after', ['product' => $product]) !!}\n            </div>\n\n            {!! view_render_event('admin.products.view.inventory.form_controls.before', ['product' => $product]) !!}\n\n            <!-- Drawer for Add Location -->\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n            >\n                <form\n                    @submit=\"handleSubmit($event, onSubmit)\"\n                    ref=\"locationForm\"\n                >\n                    {!! view_render_event('admin.products.view.inventory.form_controls.drawer.before', ['product' => $product]) !!}\n\n                    <!-- Edit Drawer -->\n                    <x-admin::drawer\n                        ref=\"assignLocationDrawer\"\n                        width=\"500px\"\n                        class=\"text-left\"\n                    >\n                        <!-- Drawer Header -->\n                        <x-slot:header>\n                            {!! view_render_event('admin.products.view.inventory.form_controls.drawer.header.before', ['product' => $product]) !!}\n\n                            <div class=\"flex items-center justify-between\">\n                                <p class=\"text-xl font-medium dark:text-white\">\n                                    @{{ selectedWarehouse.name }}\n                                </p>\n\n                                <button\n                                    type=\"submit\"\n                                    class=\"primary-button ltr:mr-11 rtl:ml-11\"\n                                >\n                                     @lang('admin::app.products.view.inventory.save')\n                                </button>\n                            </div>\n\n                            {!! view_render_event('admin.products.view.inventory.form_controls.drawer.header.after', ['product' => $product]) !!}\n                        </x-slot>\n\n                        <!-- Drawer Content -->\n                        <x-slot:content>\n                            {!! view_render_event('admin.products.view.inventory.form_controls.drawer.content.before', ['product' => $product]) !!}\n\n                            <v-warehouse-location-inventories\n                                :warehouse=\"selectedWarehouse\"\n                            ></v-warehouse-location-inventories>\n\n                            {!! view_render_event('admin.products.view.inventory.form_controls.drawer.content.after', ['product' => $product]) !!}\n                        </x-slot>\n                    </x-admin::drawer>\n\n                    {!! view_render_event('admin.products.view.inventory.form_controls.drawer.after', ['product' => $product]) !!}\n                </form>\n            </x-admin::form>\n\n            {!! view_render_event('admin.products.view.inventory.form_controls.after', ['product' => $product]) !!}\n        </div>\n    </script>\n\n    <script\n        type=\"text/x-template\"\n        id=\"v-warehouse-location-inventories-template\"\n    >\n        <div class=\"flex flex-col gap-2\">\n            <!-- Add location header -->\n            <div class=\"block w-full overflow-x-auto\">\n                <x-admin::table class=\"!min-w-[600px]\">\n                    <x-admin::table.thead>\n                        <x-admin::table.thead.tr>\n                            <x-admin::table.th class=\"!w-56\">\n                                @lang('admin::app.products.view.inventory.location')\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"!w-[150px]\">\n                                @lang('admin::app.products.view.inventory.in-stock')\n                            </x-admin::table.th>\n\n                            <x-admin::table.th class=\"!w-[150px]\">\n                                @lang('admin::app.products.view.inventory.allocated')\n                            </x-admin::table.th>\n\n                            <x-admin::table.th></x-admin::table.th>\n                        </x-admin::table.thead.tr>\n                    </x-admin::table.thead>\n\n                    <x-admin::table.tbody class=\"align-top\">\n                        <v-warehouse-location-inventory-item\n                            v-for='(location, index) in warehouseLocations'\n                            :location=\"location\"\n                            :warehouse=\"warehouse\"\n                            :key=\"index\"\n                            :index=\"index\"\n                            @onRemove=\"removeLocation($event)\"\n                        ></v-warehouse-location-inventory-item>\n                    </x-admin::table.tbody>\n                </x-admin::table>\n            </div>\n\n            <!-- Add more button for location -->\n            <button\n                type=\"button\"\n                class=\"flex max-w-max items-center gap-2 text-brandColor\"\n                @click=\"addLocation\"\n            >\n                <i class=\"icon-add text-md !text-brandColor\"></i>\n\n                @lang('admin::app.products.view.inventory.add-more')\n            </button>\n        </div>\n    </script>\n\n    <script\n        type=\"text/x-template\"\n        id=\"v-warehouse-location-inventory-item-template\"\n    >\n        <!-- Input fields for add locations -->\n        <x-admin::table.tbody.tr>\n            <x-admin::table.td class=\"!px-2\">\n                <x-admin::form.control-group>\n                    <x-admin::lookup\n                        ::src=\"src\"\n                        ::name=\"`${inputName('warehouse_location_id')}`\"\n                        ::params=\"params\"\n                        v-model=\"location['id']\"\n                        rules=\"required\"\n                        :placeholder=\"trans('admin::app.products.view.inventory.location')\"\n                        :label=\"trans('admin::app.products.view.inventory.location')\"\n                        @on-selected=\"add\"\n                        ::value=\"{ id: location.id, name: location.name }\"\n                    />\n\n                    <input\n                        type=\"hidden\"\n                        :name=\"'inventories[inventory_' + index + '][warehouse_id]'\"\n                        v-model=\"warehouse.id\"\n                    />\n\n                    <x-admin::form.control-group.error ::name=\"`${inputName('warehouse_location_id')}`\"/>\n                </x-admin::form.control-group>\n            </x-admin::table.td>\n\n            <x-admin::table.td class=\"!px-2\">\n                <x-admin::form.control-group.control\n                    type=\"number\"\n                    ::name=\"'inventories[inventory_' + index + '][in_stock]'\"\n                    v-model=\"location.in_stock\"\n                    rules=\"required|numeric|min_value:0\"\n                    :label=\"trans('admin::app.products.view.inventory.in-stock')\"\n                    :placeholder=\"trans('admin::app.products.view.inventory.in-stock')\"\n                />\n\n                <x-admin::form.control-group.error ::name=\"'inventories[inventory_' + index + '][in_stock]'\"/>\n            </x-admin::table.td>\n\n            <x-admin::table.td class=\"!px-2\">\n                <x-admin::form.control-group.control\n                    type=\"number\"\n                    ::name=\"'inventories[inventory_' + index + '][allocated]'\"\n                    v-model=\"location.allocated\"\n                    ::rules=\"`required|numeric|min_value:0|max_value:${location.in_stock}`\"\n                    :label=\"trans('admin::app.products.view.inventory.allocated')\"\n                    :placeholder=\"trans('admin::app.products.view.inventory.allocated')\"\n                />\n\n                <x-admin::form.control-group.error ::name=\"'inventories[inventory_' + index + '][allocated]'\"/>\n            </x-admin::table.td>\n\n            <x-admin::table.td class=\"!px-2 !py-[22px]\">\n                <i\n                    @click=\"remove\"\n                    class=\"icon-delete cursor-pointer text-2xl\"\n                ></i>\n            </x-admin::table.td>\n        </x-admin::table.tbody.tr>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-product-inventories', {\n            template: '#v-product-inventories-template',\n\n            data() {\n                return {\n                    warehouses: [],\n\n                    productWarehouses: [],\n\n                    selectedWarehouse: null,\n                };\n            },\n\n            computed: {\n                notAddedWarehouses () {\n                    return this.warehouses.filter(warehouse => {\n                        return ! this.productWarehouses.find(productWarehouse => productWarehouse.id == warehouse.id);\n                    });\n                }\n            },\n\n            mounted() {\n                this.getAllWarehouses();\n\n                this.getProductWarehouses();\n            },\n\n            methods: {\n                getAllWarehouses() {\n                    this.$axios.get(\"{{ route('admin.settings.warehouses.search') }}\")\n                        .then(response => {\n                            this.warehouses = response.data;\n                        })\n                        .catch(error => {\n                            console.log(error);\n                        });\n                },\n\n                getProductWarehouses() {\n                    this.$axios.get(\"{{ route('admin.products.warehouses', $product->id) }}\")\n                        .then(response => {\n                            this.productWarehouses = response.data;\n                        })\n                        .catch(error => {\n                            console.log(error);\n                        });\n                },\n\n                addWarehouse(warehouse) {\n                    warehouse = {\n                        id: warehouse.id,\n                        name: warehouse.name,\n                        in_stock: 0,\n                        allocated: 0,\n                        on_hand: 0,\n                        locations: []\n                    };\n\n                    this.productWarehouses.push(warehouse);\n\n                    this.selectWarehouse(warehouse);\n\n                    this.$refs.assignLocationDrawer.open();\n                },\n\n                selectWarehouse(warehouse) {\n                    this.selectedWarehouse = warehouse;\n\n                    setTimeout(() => {\n                        this.$refs.assignLocationDrawer.open();\n                    }, 0);\n                },\n\n                onSubmit(params, { setErrors }) {\n                    let formData = new FormData(this.$refs.locationForm);\n\n                    this.$axios.post(\"{{ route('admin.products.inventories.store', ['id' => $product->id, 'warehouseId' => 'warehouseId']) }}\".replace('warehouseId', this.selectedWarehouse.id), formData, {\n                        headers: {\n                            'Content-Type': 'multipart/form-data'\n                        }\n                    }).then(response => {\n                        this.getAllWarehouses();\n\n                        this.getProductWarehouses();\n\n                        this.$refs.assignLocationDrawer.close();\n\n                        this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                    })\n                    .catch(error => {\n                        setErrors(error.response.data.errors);\n\n                        this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                    });\n                },\n            },\n        });\n\n        app.component('v-warehouse-location-inventories', {\n            template: '#v-warehouse-location-inventories-template',\n\n            props: ['warehouse'],\n\n            data() {\n                return {\n                    warehouseLocations: [],\n                }\n            },\n\n            created() {\n                if (this.warehouse.locations.length) {\n                    this.warehouseLocations = JSON.parse(JSON.stringify(this.warehouse.locations));\n                }\n            },\n\n            methods: {\n                addLocation() {\n                    this.warehouseLocations.push({\n                        id: null,\n                        name: '',\n                        in_stock: 0,\n                        allocated: 0,\n                        on_hand: 0,\n                    })\n                },\n\n                removeLocation(inventory) {\n                    const index = this.warehouseLocations.indexOf(inventory);\n\n                    if (index !== -1) {\n                        this.warehouseLocations.splice(index, 1);\n                    }\n                },\n            },\n        });\n\n        app.component('v-warehouse-location-inventory-item', {\n            template: '#v-warehouse-location-inventory-item-template',\n\n            props: ['index', 'warehouse', 'location'],\n\n            data() {\n                return {\n                    isSearching: false,\n                }\n            },\n\n            computed: {\n                src() {\n                    return '{{ route('admin.settings.locations.search') }}';\n                },\n\n                params() {\n                    return {\n                        search: 'warehouse_id:' + this.warehouse.id + ';name:' + this.location.name,\n                        searchFields: 'warehouse_id:=;name:like',\n                        searchJoin: 'and'\n                    };\n                },\n            },\n\n            methods: {\n                inputName(type) {\n                  return 'inventories[inventory_' + this.index + ']['+ type +']';\n                },\n\n                /**\n                 * Add the product.\n                 *\n                 * @param {Object} result\n                 *\n                 * @return {void}\n                 */\n                 add(result) {\n                    this.location.id = result.id;\n\n                    this.location.warehouse_id = result.warehouse_id;\n\n                    this.location.name = result.name;\n                },\n\n                remove() {\n                    this.$emit('onRemove', this.location);\n                },\n            },\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/products/view.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        {{ strip_tags($product->name) }}\n    </x-slot>\n\n    <!-- Content -->\n    <div class=\"flex gap-4 max-lg:flex-wrap\">\n        <!-- Left Panel -->\n        {!! view_render_event('admin.products.view.left.before', ['product' => $product]) !!}\n\n        <div class=\"max-lg:min-w-full max-lg:max-w-full [&>div:last-child]:border-b-0 lg:sticky lg:top-[73px] flex min-w-[394px] max-w-[394px] flex-col self-start rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n            <!-- Product Information -->\n            <div class=\"flex w-full flex-col gap-2 border-b border-gray-200 p-4 dark:border-gray-800\">\n                <!-- Breadcrumbs -->\n                <div class=\"flex items-center justify-between\">\n                    <x-admin::breadcrumbs name=\"products.view\" :entity=\"$product\" />\n                </div>\n\n                {!! view_render_event('admin.products.view.left.tags.before', ['product' => $product]) !!}\n\n                <!-- Tags -->\n                <x-admin::tags\n                    :attach-endpoint=\"route('admin.products.tags.attach', $product->id)\"\n                    :detach-endpoint=\"route('admin.products.tags.detach', $product->id)\"\n                    :added-tags=\"$product->tags\"\n                />\n\n                {!! view_render_event('admin.products.view.left.tags.after', ['product' => $product]) !!}\n\n                <!-- Title -->\n                <div class=\"mb-2 flex flex-col gap-0.5\">\n                    {!! view_render_event('admin.products.view.left.title.before', ['product' => $product]) !!}\n\n                    <h3 class=\"break-words text-lg font-bold dark:text-white\">\n                        {{ $product->name }}\n                    </h3>\n                    \n                    {!! view_render_event('admin.products.view.left.title.after', ['product' => $product]) !!}\n\n                    {!! view_render_event('admin.products.view.left.sku.before', ['product' => $product]) !!}\n\n                    <p class=\"break-words text-sm font-normal dark:text-white\">\n                        @lang('admin::app.products.view.sku') : {{ $product->sku }}\n                    </p>\n\n                    {!! view_render_event('admin.products.view.left.sku.after', ['product' => $product]) !!}\n                </div>\n\n                {!! view_render_event('admin.products.view.left.activity_actions.before', ['product' => $product]) !!}\n\n                <!-- Activity Actions -->\n                <div class=\"flex flex-wrap gap-2\">\n                    {!! view_render_event('admin.products.view.left.activity_actions.note.before', ['product' => $product]) !!}\n\n                    <!-- Note Activity Action -->\n                    <x-admin::activities.actions.note\n                        :entity=\"$product\"\n                        entity-control-name=\"product_id\"\n                    />\n\n                    {!! view_render_event('admin.products.view.left.activity_actions.note.after', ['product' => $product]) !!}\n\n                    {!! view_render_event('admin.products.view.left.activity_actions.file.before', ['product' => $product]) !!}\n\n                    <!-- File Activity Action -->\n                    <x-admin::activities.actions.file\n                        :entity=\"$product\"\n                        entity-control-name=\"product_id\"\n                    />\n\n                    {!! view_render_event('admin.products.view.left.activity_actions.file.after', ['product' => $product]) !!}\n                </div>\n\n                {!! view_render_event('admin.products.view.left.activity_actions.after', ['product' => $product]) !!}\n            </div>\n            \n            <!-- Product Attributes -->\n            @include ('admin::products.view.attributes')\n        </div>\n\n        {!! view_render_event('admin.products.view.left.after', ['product' => $product]) !!}\n\n        {!! view_render_event('admin.products.view.right.before', ['product' => $product]) !!}\n        \n        <!-- Right Panel -->\n        <div class=\"flex w-full flex-col gap-4 rounded-lg\">\n            {!! view_render_event('admin.products.view.right.activities.before', ['product' => $product]) !!}\n\n            <!-- Activity Navigation -->\n            <x-admin::activities\n                :endpoint=\"route('admin.products.activities.index', $product->id)\" \n                :types=\"[\n                    ['name' => 'all', 'label' => trans('admin::app.products.view.all')],\n                    ['name' => 'note', 'label' => trans('admin::app.products.view.notes')],\n                    ['name' => 'file', 'label' => trans('admin::app.products.view.files')],\n                    ['name' => 'system', 'label' => trans('admin::app.products.view.change-logs')],\n                ]\"\n                :extra-types=\"[\n                    ['name' => 'inventory', 'label' => trans('admin::app.products.view.inventories')],\n                ]\"\n            >\n                <x-slot:inventory>\n                    @include('admin::products.view.inventory')\n                </x-slot>\n            </x-admin::activities>\n\n            {!! view_render_event('admin.products.view.right.activities.after', ['product' => $product]) !!}\n        </div>\n\n        {!! view_render_event('admin.products.view.right.after', ['product' => $product]) !!}\n    </div>    \n</x-admin::layouts>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/quotes/create.blade.php",
    "content": "@php\n    $quote = app('\\Webkul\\Quote\\Repositories\\QuoteRepository')->getModel();\n\n    if (isset($lead)) {\n        $quote->fill([\n            'person_id' => $lead->person_id,\n            'user_id' => $lead->user_id,\n            'billing_address' => $lead->person->organization ? $lead->person->organization->address : null\n        ]);\n    }\n@endphp\n\n<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.quotes.create.title')\n    </x-slot>\n\n    {!! view_render_event('admin.contacts.quotes.create.form_controls.before') !!}\n\n    <x-admin::form\n        :action=\"route('admin.quotes.store').'?'.http_build_query(array_merge(\n            request()->route()->parameters(),\n            request()->all()\n        ))\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    <x-admin::breadcrumbs\n                        name=\"quotes.create\"\n                    />\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.quotes.create.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <!-- Save button for person -->\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.contacts.quotes.create.save_button.before') !!}\n\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.quotes.create.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.contacts.quotes.create.save_button.after') !!}\n                    </div>\n                </div>\n            </div>\n\n            <v-quote :errors=\"errors\">\n                <x-admin::shimmer.quotes />\n            </v-quote>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.contacts.quotes.create.form_controls.after') !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-quote-template\"\n        >\n            <div class=\"box-shadow flex flex-col gap-4 rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                <div class=\"flex w-full gap-2 border-b border-gray-200 dark:border-gray-800\">\n                    {!! view_render_event('admin.contacts.quotes.create.tabs.before') !!}\n\n                    <template\n                        v-for=\"tab in tabs\"\n                        :key=\"tab.id\"\n                    >\n                        <a\n                            :href=\"'#' + tab.id\"\n                            :class=\"[\n                                'inline-block px-3 py-2.5 border-b-2  text-sm font-medium ',\n                                activeTab === tab.id\n                                ? 'text-brandColor border-brandColor dark:brandColor dark:brandColor'\n                                : 'text-gray-600 dark:text-gray-300  border-transparent hover:text-gray-800 hover:border-gray-400 dark:hover:border-gray-400  dark:hover:text-white'\n                            ]\"\n                            @click=\"scrollToSection(tab.id)\"\n                            :text=\"tab.label\"\n                        ></a>\n                    </template>\n\n                    {!! view_render_event('admin.contacts.quotes.create.tabs.after') !!}\n                </div>\n\n                <div class=\"flex flex-col gap-4 px-4 py-2\">\n                    {!! view_render_event('admin.contacts.quotes.create.quote_information.before') !!}\n\n                    <!-- Quote information -->\n                    <div\n                        id=\"quote-info\"\n                        class=\"flex flex-col gap-4\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                @lang('admin::app.quotes.create.quote-info')\n                            </p>\n\n                            <p class=\"text-sm text-gray-600 dark:text-white\">\n                                @lang('admin::app.quotes.create.quote-info-info')\n                            </p>\n                        </div>\n\n                        {!! view_render_event('admin.contacts.quotes.create.attribute.form_controls.before') !!}\n\n                        <div class=\"w-1/2 max-md:w-full\">\n                            <x-admin::attributes\n                                :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                    'entity_type' => 'quotes',\n                                    ['code', 'IN', ['subject']],\n                                ])\"\n\n                                :custom-validations=\"[\n                                    'expired_at' => [\n                                        'required',\n                                        'date_format:yyyy-MM-dd',\n                                        'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                    ],\n                                ]\"\n                            />\n\n                            <x-admin::attributes\n                                :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                        'entity_type' => 'quotes',\n                                        ['code', 'IN', ['description']],\n                                    ])\"\n                                :custom-validations=\"[\n                                    'expired_at' => [\n                                        'required',\n                                        'date_format:yyyy-MM-dd',\n                                        'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                    ],\n                                ]\"\n                            />\n\n                            <div class=\"flex gap-4\">\n                                <x-admin::attributes\n                                    :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                        'entity_type' => 'quotes',\n                                        ['code', 'IN', ['expired_at', 'user_id']],\n                                    ])->sortBy('sort_order')\"\n                                    :custom-validations=\"[\n                                        'expired_at' => [\n                                            'required',\n                                            'date_format:yyyy-MM-dd',\n                                            'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                        ],\n                                    ]\"\n                                    :entity=\"$quote\"\n                                />\n                            </div>\n\n                            <div class=\"flex gap-4\">\n                                <x-admin::attributes\n                                    :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                        'entity_type' => 'quotes',\n                                        ['code', 'IN', ['person_id']],\n                                    ])->sortBy('sort_order')\"\n                                    :custom-validations=\"[\n                                        'expired_at' => [\n                                            'required',\n                                            'date_format:yyyy-MM-dd',\n                                            'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                        ],\n                                    ]\"\n                                    :entity=\"$quote\"\n                                />\n\n                                <x-admin::attributes.edit.lookup />\n\n                                @php\n                                    $lookUpEntityData = app('Webkul\\Attribute\\Repositories\\AttributeRepository')->getLookUpEntity('leads', request('lead_id'));\n                                @endphp\n\n                                <x-admin::form.control-group class=\"w-full\">\n                                    <x-admin::form.control-group.label>\n                                        @lang('admin::app.quotes.create.link-to-lead')\n                                    </x-admin::form.control-group.label>\n\n                                    <v-lookup-component\n                                        :attribute=\"{'code': 'lead_id', 'name': 'Lead', 'lookup_type': 'leads'}\"\n                                        :value='@json($lookUpEntityData)'\n                                        can-add-new=\"true\"\n                                    ></v-lookup-component>\n                                </x-admin::form.control-group>\n                            </div>\n\n                            <!-- Custom Attributes -->\n                            <x-admin::attributes\n                                :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                    'entity_type' => 'quotes',\n                                    'is_user_defined' => 1,\n                                ])->sortBy('sort_order')\"\n                                :custom-validations=\"[\n                                    'expired_at' => [\n                                        'required',\n                                        'date_format:yyyy-MM-dd',\n                                        'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                    ],\n                                ]\"\n                                :entity=\"$quote\"\n                            />\n                        </div>\n\n                        {!! view_render_event('admin.contacts.quotes.create.attribute.form_controls.after') !!}\n                    </div>\n\n                    {!! view_render_event('admin.contacts.quotes.create.quote_information.after') !!}\n\n                    {!! view_render_event('admin.contacts.quotes.create.address_information.before') !!}\n\n                    <!-- Address information -->\n                    <div\n                        id=\"address-info\"\n                        class=\"flex flex-col gap-4\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                @lang('admin::app.quotes.create.address-info')\n                            </p>\n\n                            <p class=\"text-sm text-gray-600 dark:text-white\">@lang('admin::app.quotes.create.address-info-info')</p>\n                        </div>\n\n                        <div class=\"w-1/2 max-md:w-full\">\n                            {!! view_render_event('admin.contacts.quotes.create.address_information.attributes.before') !!}\n\n                            <x-admin::attributes\n                                :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                    'entity_type' => 'quotes',\n                                    ['code', 'IN', ['billing_address', 'shipping_address']],\n                                ])\"\n                                :custom-validations=\"[\n                                    'billing_address' => [\n                                        'max:100',\n                                    ],\n                                    'shipping_address' => [\n                                        'max:100',\n                                    ],\n                                ]\"\n                                :entity=\"$quote\"\n                            />\n\n                            {!! view_render_event('admin.contacts.quotes.create.address_information.attributes.after') !!}\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.contacts.quotes.create.address_information.after') !!}\n\n                    {!! view_render_event('admin.contacts.quotes.create.quote_items.before') !!}\n\n                    <!-- Quote Item Information -->\n                    <div\n                        id=\"quote-items\"\n                        class=\"flex flex-col gap-4\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                @lang('admin::app.quotes.create.quote-items')\n                            </p>\n\n                            <p class=\"text-sm text-gray-600 dark:text-white\">\n                                @lang('admin::app.quotes.create.quote-item-info')\n                            </p>\n                        </div>\n\n                        <!-- Quote Item List Vue Component -->\n                        <v-quote-item-list :errors=\"errors\"></v-quote-item-list>\n                    </div>\n\n                    {!! view_render_event('admin.contacts.quotes.create.quote_items.after') !!}\n                </div>\n            </div>\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-quote-item-list-template\"\n        >\n            <div class=\"flex flex-col gap-4\">\n                <div class=\"block w-full\">\n                    {!! view_render_event('admin.contacts.quotes.create.table.after') !!}\n\n                    <!-- Table -->\n                    <x-admin::table>\n                        <!-- Table Head -->\n                        <x-admin::table.thead>\n                            <x-admin::table.thead.tr>\n                                <x-admin::table.th >\n                                    @lang('admin::app.quotes.create.product-name')\n                                </x-admin::table.th>\n\n                                <x-admin::table.th class=\"text-center\">\n                                    @lang('admin::app.quotes.create.quantity')\n                                </x-admin::table.th>\n\n                                <x-admin::table.th class=\"text-center\">\n                                    @lang('admin::app.quotes.create.price')\n                                </x-admin::table.th>\n\n                                <x-admin::table.th class=\"text-center\">\n                                    @lang('admin::app.quotes.create.amount')\n                                </x-admin::table.th>\n\n                                <x-admin::table.th class=\"text-center\">\n                                    @lang('admin::app.quotes.create.discount')\n                                </x-admin::table.th>\n\n                                <x-admin::table.th class=\"text-center\">\n                                    @lang('admin::app.quotes.create.tax')\n                                </x-admin::table.th>\n\n                                <x-admin::table.th class=\"text-center\">\n                                    @lang('admin::app.quotes.create.total')\n                                </x-admin::table.th>\n\n                                <x-admin::table.th\n                                    v-if=\"products.length > 1\"\n                                    class=\"!px-2 ltr:text-right rtl:text-left\"\n                                >\n                                    @lang('admin::app.quotes.create.action')\n                                </x-admin::table.th>\n                            </x-admin::table.thead.tr>\n                        </x-admin::table.thead>\n\n                        <!-- Table Body -->\n                        <x-admin::table.tbody>\n                            <!-- Quote Item Vue component -->\n                            <template\n                                v-for='(product, index) in products'\n                                :key=\"index\"\n                            >\n                                <v-quote-item\n                                    :product=\"product\"\n                                    :index=\"index\"\n                                    :errors=\"errors\"\n                                    @onRemoveProduct=\"removeProduct($event)\"\n                                ></v-quote-item>\n                            </template>\n                        </x-admin::table.tbody>\n                    </x-admin::table>\n\n                    {!! view_render_event('admin.contacts.quotes.create.table.before') !!}\n                </div>\n\n                <!-- Add New Quote Item -->\n                <span\n                    class=\"text-md flex max-w-max cursor-pointer items-center gap-2 text-brandColor\"\n                    @click=\"addProduct\"\n                >\n                    @lang('admin::app.quotes.create.add-item')\n                </span>\n\n                <div class=\"flex justify-end\">\n                    <div class=\"grid w-[348px] gap-4 rounded-lg bg-gray-100 p-4 text-sm dark:bg-gray-950 dark:text-white\">\n                        <div class=\"flex w-full justify-between gap-x-5\">\n                            @lang('admin::app.quotes.create.sub-total', ['symbol' => core()->currencySymbol(config('app.currency'))])\n\n                            <input\n                                type=\"hidden\"\n                                name=\"sub_total\"\n                                class=\"control\"\n                                :value=\"subTotal\"\n                                readonly\n                            >\n\n                            <p>@{{ subTotal }}</p>\n                        </div>\n\n                        <div class=\"flex w-full justify-between gap-x-5\">\n                            @lang('admin::app.quotes.create.total-discount', ['symbol' => core()->currencySymbol(config('app.currency'))])\n\n                            <input\n                                type=\"hidden\"\n                                name=\"discount_amount\"\n                                :value=\"discountAmount\"\n                            >\n\n                            <p>@{{ discountAmount }}</p>\n                        </div>\n\n                        <div class=\"flex w-full justify-between gap-x-5\">\n                            @lang('admin::app.quotes.create.total-tax', ['symbol' => core()->currencySymbol(config('app.currency'))])\n\n                            <input\n                                type=\"hidden\"\n                                name=\"tax_amount\"\n                                :value=\"taxAmount\"\n                            >\n\n                            <p>@{{ taxAmount }}</p>\n                        </div>\n\n                        <div class=\"flex w-full justify-between gap-x-5\">\n                            @lang('admin::app.quotes.create.total-adjustment', ['symbol' => core()->currencySymbol(config('app.currency'))])\n\n                            <x-admin::form.control-group.control\n                                type=\"inline\"\n                                ::name=\"`adjustment_amount`\"\n                                ::value=\"adjustmentAmount\"\n                                rules=\"required|decimal:4\"\n                                ::errors=\"errors\"\n                                :label=\"trans('admin::app.quotes.create.adjustment-amount')\"\n                                :placeholder=\"trans('admin::app.quotes.create.adjustment-amount')\"\n                                @on-change=\"(event) => adjustmentAmount = event.value\"\n                            />\n                        </div>\n\n                        <div class=\"flex w-full justify-between gap-x-5\">\n                            @lang('admin::app.quotes.create.grand-total', ['symbol' => core()->currencySymbol(config('app.currency'))])\n\n                            <input\n                                type=\"hidden\"\n                                name=\"grand_total\"\n                                :value=\"grandTotal\"\n                            >\n\n                            <p>@{{ grandTotal }}</p>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-quote-item-template\"\n        >\n            <x-admin::table.thead.tr>\n                <!-- Quote Product Name -->\n                <x-admin::table.td>\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::lookup\n                            ::src=\"src\"\n                            ::name=\"`${inputName}[product_id]`\"\n                            :preload=\"true\"\n                            :placeholder=\"trans('admin::app.quotes.create.search-products')\"\n                            @on-selected=\"(product) => addProduct(product)\"\n                            rules=\"required\"\n                            :label=\"trans('admin::app.quotes.create.product-name')\"\n                            ::class=\"errors[`${inputName}[product_id]`] ? 'border !border-red-600 hover:border-red-600' : ''\"\n                        />\n\n                        <x-admin::form.control-group.error name=\"items.item_0.product_id\"/>\n                        <x-admin::form.control-group.error name=\"items[item_0][product_id]\"/>\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n\n                <!-- Quantity -->\n                <x-admin::table.td class=\"!px-2 ltr:text-right rtl:text-left\">\n                    <x-admin::form.control-group class=\"!mb-0\">\n\n                        <x-admin::form.control-group.control\n                            type=\"inline\"\n                            ::name=\"`${inputName}[quantity]`\"\n                            ::value=\"product.quantity\"\n                            rules=\"required|numeric|min:1\"\n                            ::errors=\"errors\"\n                            :label=\"trans('admin::app.quotes.create.quantity')\"\n                            :placeholder=\"trans('admin::app.quotes.create.quantity')\"\n                            @on-change=\"(event) => product.quantity = event.value\"\n                            position=\"center\"\n                        />\n                        <x-admin::form.control-group.error name=\"items.item_0.quantity\"/>\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n\n                <!-- Price -->\n                <x-admin::table.td class=\"!px-2 ltr:text-right rtl:text-left\">\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.control\n                            type=\"inline\"\n                            ::name=\"`${inputName}[price]`\"\n                            ::value=\"product.price\"\n                            rules=\"required|decimal:4\"\n                            ::errors=\"errors\"\n                            :label=\"trans('admin::app.quotes.create.price')\"\n                            :placeholder=\"trans('admin::app.quotes.create.price')\"\n                            @on-change=\"(event) => product.price = event.value\"\n                            position=\"center\"\n                            ::value-label=\"$admin.formatPrice(product.price)\"\n                        />\n                        <x-admin::form.control-group.error name=\"items.item_0.price\"/>\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n\n                <!-- Total -->\n                <x-admin::table.td class=\"!px-2 ltr:text-right rtl:text-left\">\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.control\n                            type=\"inline\"\n                            ::name=\"`${inputName}[total]`\"\n                            ::value=\"product.price * product.quantity\"\n                            rules=\"required|decimal:4\"\n                            ::errors=\"errors\"\n                            :label=\"trans('admin::app.quotes.create.total')\"\n                            :placeholder=\"trans('admin::app.quotes.create.total')\"\n                            :allowEdit=\"false\"\n                            position=\"center\"\n                            ::value-label=\"$admin.formatPrice(product.price * product.quantity)\"\n                        />\n                        <x-admin::form.control-group.error name=\"items.item_0.total\"/>\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n\n                <!-- Discount Amount -->\n                <x-admin::table.td class=\"!px-2 ltr:text-right rtl:text-left\">\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.control\n                            type=\"inline\"\n                            ::name=\"`${inputName}[discount_amount]`\"\n                            ::value=\"product.discount_amount\"\n                            rules=\"required|decimal:4\"\n                            ::errors=\"errors\"\n                            :label=\"trans('admin::app.quotes.create.discount-amount')\"\n                            :placeholder=\"trans('admin::app.quotes.create.discount-amount')\"\n                            @on-change=\"(event) => product.discount_amount = event.value\"\n                            position=\"center\"\n                            ::value-label=\"$admin.formatPrice(product.discount_amount)\"\n                        />\n                        <x-admin::form.control-group.error name=\"items.item_0.discount_amount\"/>\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n\n                <!-- Tax Amount -->\n                <x-admin::table.td class=\"!px-2 ltr:text-right rtl:text-left\">\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.control\n                            type=\"inline\"\n                            ::name=\"`${inputName}[tax_amount]`\"\n                            ::value=\"product.tax_amount\"\n                            rules=\"required|decimal:4\"\n                            ::errors=\"errors\"\n                            :label=\"trans('admin::app.quotes.create.tax-amount')\"\n                            :placeholder=\"trans('admin::app.quotes.create.tax-amount')\"\n                            @on-change=\"(event) => product.tax_amount = event.value\"\n                            position=\"center\"\n                            ::value-label=\"$admin.formatPrice(product.tax_amount)\"\n                        />\n                        <x-admin::form.control-group.error name=\"items.item_0.tax_amount\"/>\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n\n                <!-- Total with Discount -->\n                <x-admin::table.td class=\"!px-2 ltr:text-right rtl:text-left\">\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.control\n                            type=\"inline\"\n                            ::name=\"`${inputName}[final_total]`\"\n                            ::errors=\"errors\"\n                            ::value=\"parseFloat(product.price * product.quantity) + parseFloat(product.tax_amount) - parseFloat(product.discount_amount)\"\n                            :allowEdit=\"false\"\n                            position=\"center\"\n                            ::value-label=\"$admin.formatPrice(parseFloat(product.price * product.quantity) + parseFloat(product.tax_amount) - parseFloat(product.discount_amount))\"\n                        />\n                        <x-admin::form.control-group.error name=\"items.item_0.final_total\"/>\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n\n                <!-- Action -->\n                <x-admin::table.td\n                    v-if=\"$parent.products.length > 1\"\n                    class=\"!px-2 ltr:text-right rtl:text-left\"\n                >\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <i\n                            @click=\"removeProduct\"\n                            class=\"icon-delete cursor-pointer text-2xl\"\n                        ></i>\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n            </x-admin::table.thead.tr>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-quote', {\n                template: '#v-quote-template',\n\n                props: ['errors'],\n\n                data() {\n                    return {\n                        activeTab: 'quote-info',\n\n                        tabs: [\n                            { id: 'quote-info', label: '@lang('admin::app.quotes.create.quote-info')' },\n                            { id: 'address-info', label: '@lang('admin::app.quotes.create.address-info')' },\n                            { id: 'quote-items', label: '@lang('admin::app.quotes.create.quote-items')' }\n                        ],\n                    };\n                },\n\n                methods: {\n                    /**\n                     * Scroll to the section.\n                     *\n                     * @param {String} tabId\n                     *\n                     * @returns {void}\n                     */\n                    scrollToSection(tabId) {\n                        const section = document.getElementById(tabId);\n\n                        if (section) {\n                            section.scrollIntoView({ behavior: 'smooth' });\n                        }\n                    },\n                },\n            });\n\n            app.component('v-quote-item-list', {\n                template: '#v-quote-item-list-template',\n\n                props: ['data', 'errors'],\n\n                data() {\n                    return {\n                        adjustmentAmount: 0,\n\n                        products: [{\n                            'id': null,\n                            'product_id': null,\n                            'name': '',\n                            'quantity': 0,\n                            'price': 0,\n                            'discount_amount': 0,\n                            'tax_amount': 0,\n                        }],\n                    }\n                },\n\n                computed: {\n                    /**\n                     * Calculate the sub total of the products.\n                     *\n                     * @returns {Number}\n                     */\n                    subTotal() {\n                        let total = 0;\n\n                        this.products.forEach(product => {\n                            total += parseFloat(product.price * product.quantity);\n                        });\n\n                        return total;\n                    },\n\n                    /**\n                     * Calculate the total discount amount of the products.\n                     *\n                     * @returns {Number}\n                     */\n                    discountAmount() {\n                        let total = 0;\n\n                        this.products.forEach(product => total += parseFloat(product.discount_amount));\n\n                        return total;\n                    },\n\n                    /**\n                     * Calculate the total tax amount of the products.\n                     *\n                     * @returns {Number}\n                     */\n                    taxAmount() {\n                        let total = 0;\n\n                        this.products.forEach(product => total += parseFloat(product.tax_amount));\n\n                        return total;\n                    },\n\n                    /**\n                     * Calculate the grand total of the products.\n                     *\n                     * @returns {Number}\n                     */\n                    grandTotal() {\n                        let total = 0;\n\n                        this.products.forEach(product => {\n                            total += parseFloat(product.price * product.quantity) + parseFloat(product.tax_amount) - parseFloat(product.discount_amount) + parseFloat(this.adjustmentAmount);\n                        });\n\n                        return total;\n                    },\n                },\n\n                methods: {\n                    /**\n                     * Add a new product.\n                     *\n                     * @returns {void}\n                     */\n                    addProduct() {\n                        this.products.push({\n                            id: null,\n                            product_id: null,\n                            name: '',\n                            quantity: 1,\n                            total: 0,\n                            price: 0,\n                            discount_amount: 0,\n                            tax_amount: 0,\n                        });\n                    },\n\n                    /**\n                     * Remove the product.\n                     *\n                     * @param {Object} product\n                     */\n                    removeProduct(product) {\n                        this.$emitter.emit('open-confirm-modal', {\n                            agree: () => {\n                                if (this.products.length === 1) {\n                                    this.products = [{\n                                        id: null,\n                                        product_id: null,\n                                        name: '',\n                                        quantity: null,\n                                        total: 0,\n                                        price: null,\n                                        discount_amount: null,\n                                        tax_amount: null,\n                                    }];\n                                } else {\n                                    const index = this.products.indexOf(product);\n\n                                    if (index !== -1) {\n                                        this.products.splice(index, 1);\n                                    }\n                                }\n                            },\n                        });\n                    },\n                },\n            });\n\n            app.component('v-quote-item', {\n                template: '#v-quote-item-template',\n\n                props: ['index', 'product', 'errors'],\n\n                data() {\n                    return {\n                        products: [],\n                    }\n                },\n\n                computed: {\n                    /**\n                     * Get the input name.\n                     *\n                     * @returns {String}\n                     */\n                    inputName() {\n                        if (this.product.id) {\n                            return \"items[\" + this.product.id + \"]\";\n                        }\n\n                        return \"items[item_\" + this.index + \"]\";\n                    },\n\n                    /**\n                     * Get the source URL.\n                     *\n                     * @returns {String}\n                     */\n                    src() {\n                        return \"{{ route('admin.products.search') }}\";\n                    },\n                },\n\n                methods: {\n                    /**\n                     * Add the product.\n                     *\n                     * @param {Object} result\n                     *\n                     * @return {void}\n                     */\n                    addProduct(result) {\n                        this.product.product_id = result.id ?? null;\n                        this.product.name = result.name ?? '';\n                        this.product.price = result.price ?? 0;\n                        this.product.quantity = result.quantity ?? 1;\n                        this.product.discount_amount = 0;\n                        this.product.tax_amount = 0;\n                    },\n\n                    /**\n                     * Remove the product.\n                     *\n                     * @return {void}\n                     */\n                    removeProduct() {\n                        this.$emit('onRemoveProduct', this.product);\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n\n    @pushOnce('styles')\n        <style>\n            html {\n                scroll-behavior: smooth;\n            }\n        </style>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/quotes/edit.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.quotes.edit.title')\n    </x-slot>\n\n    {!! view_render_event('admin.contacts.quotes.edit.form_controls.before', ['quote' => $quote]) !!}\n\n    <x-admin::form\n        :action=\"route('admin.quotes.update', $quote->id) . '?' . http_build_query(array_merge(\n            request()->route()->parameters(),\n            request()->all()\n        ))\"\n        method=\"PUT\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    <x-admin::breadcrumbs\n                        name=\"quotes.edit\"\n                        :entity=\"$quote\"\n                    />\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.quotes.edit.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.contacts.quotes.edit.save_button.before', ['quote' => $quote]) !!}\n\n                        <!-- Save button for person -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.quotes.edit.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.contacts.quotes.edit.save_button.after', ['quote' => $quote]) !!}\n                    </div>\n                </div>\n            </div>\n\n            <v-quote :errors=\"errors\">\n                <x-admin::shimmer.quotes />\n            </v-quote>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.contacts.quotes.edit.form_controls.after', ['quote' => $quote]) !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-quote-template\"\n        >\n            <div class=\"box-shadow flex flex-col gap-4 rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                <div class=\"flex w-full gap-2 border-b border-gray-200 dark:border-gray-800\">\n                    {!! view_render_event('admin.contacts.quotes.edit.tags.before', ['quote' => $quote]) !!}\n\n                    <template\n                        v-for=\"tab in tabs\"\n                        :key=\"tab.id\"\n                    >\n                        <a\n                            :href=\"'#' + tab.id\"\n                            :class=\"[\n                                'inline-block px-3 py-2.5 border-b-2  text-sm font-medium ',\n                                activeTab === tab.id\n                                ? 'text-brandColor border-brandColor dark:brandColor dark:brandColor'\n                                : 'text-gray-600 dark:text-gray-300  border-transparent hover:text-gray-800 hover:border-gray-400 dark:hover:border-gray-400  dark:hover:text-white'\n                            ]\"\n                            @click=\"scrollToSection(tab.id)\"\n                            :text=\"tab.label\"\n                        ></a>\n                    </template>\n\n                    {!! view_render_event('admin.contacts.quotes.edit.tags.after', ['quote' => $quote]) !!}\n                </div>\n\n                <div class=\"flex flex-col gap-4 px-4 py-2\">\n                    {!! view_render_event('admin.contacts.quotes.edit.quote_information.before', ['quote' => $quote]) !!}\n\n                    <!-- Quote information -->\n                    <div\n                        id=\"quote-info\"\n                        class=\"flex flex-col gap-4\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                @lang('admin::app.quotes.create.quote-info')\n                            </p>\n\n                            <p class=\"text-sm text-gray-600 dark:text-white\">@lang('admin::app.quotes.create.quote-info-info')</p>\n                        </div>\n\n                        <div class=\"w-1/2 max-md:w-full\">\n                            <x-admin::attributes\n                                :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                    'entity_type' => 'quotes',\n                                    ['code', 'IN', ['subject']],\n                                ])\"\n                                :custom-validations=\"[\n                                    'expired_at' => [\n                                        'required',\n                                        'date_format:yyyy-MM-dd',\n                                        'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                    ],\n                                ]\"\n                                :entity=\"$quote\"\n                            />\n\n                            <x-admin::attributes\n                                :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                        'entity_type' => 'quotes',\n                                        ['code', 'IN', ['description']],\n                                    ])\"\n                                :custom-validations=\"[\n                                    'expired_at' => [\n                                        'required',\n                                        'date_format:yyyy-MM-dd',\n                                        'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                    ],\n                                ]\"\n                                :entity=\"$quote\"\n                            />\n\n                            <div class=\"flex gap-4\">\n                                <x-admin::attributes\n                                    :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                        'entity_type' => 'quotes',\n                                        ['code', 'IN', ['expired_at', 'user_id']],\n                                    ])->sortBy('sort_order')\"\n                                    :custom-validations=\"[\n                                        'expired_at' => [\n                                            'required',\n                                            'date_format:yyyy-MM-dd',\n                                            'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                        ],\n                                    ]\"\n                                    :entity=\"$quote\"\n                                />\n                            </div>\n\n                            <div class=\"flex gap-4\">\n                                <x-admin::attributes\n                                    :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                        'entity_type' => 'quotes',\n                                        ['code', 'IN', ['person_id']],\n                                    ])->sortBy('sort_order')\"\n                                    :custom-validations=\"[\n                                        'expired_at' => [\n                                            'required',\n                                            'date_format:yyyy-MM-dd',\n                                            'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                        ],\n                                    ]\"\n                                    :entity=\"$quote\"\n                                />\n\n                                <x-admin::attributes.edit.lookup />\n\n                                @php\n                                    $leadId = old('lead_id') ?? optional($quote->leads->first())->id;\n\n                                    $lookUpEntityData = app('Webkul\\Attribute\\Repositories\\AttributeRepository')->getLookUpEntity('leads', $leadId);\n                                @endphp\n\n                                <x-admin::form.control-group class=\"w-full\">\n                                    <x-admin::form.control-group.label>\n                                        @lang('admin::app.quotes.create.link-to-lead')\n                                    </x-admin::form.control-group.label>\n\n                                    <v-lookup-component\n                                        :key=\"leadEntity.id\"\n                                        :attribute=\"{'code': 'lead_id', 'name': 'Lead', 'lookup_type': 'leads'}\"\n                                        :value=\"leadEntity\"\n                                        can-add-new=\"true\"\n                                        @lookup-removed=\"setLeadEntity\"\n                                    ></v-lookup-component>\n                                </x-admin::form.control-group>\n                            </div>\n\n                            <!-- Custom Attributes -->\n                            <x-admin::attributes\n                                :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                    'entity_type' => 'quotes',\n                                    'is_user_defined' => 1,\n                                ])->sortBy('sort_order')\"\n                                :custom-validations=\"[\n                                    'expired_at' => [\n                                        'required',\n                                        'date_format:yyyy-MM-dd',\n                                        'after:' .  \\Carbon\\Carbon::yesterday()->format('Y-m-d')\n                                    ],\n                                ]\"\n                                :entity=\"$quote\"\n                            />\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.contacts.quotes.edit.quote_information.after', ['quote' => $quote]) !!}\n\n                    {!! view_render_event('admin.contacts.quotes.edit.address_information.before', ['quote' => $quote]) !!}\n\n                    <!-- Address information -->\n                    <div\n                        id=\"address-info\"\n                        class=\"flex flex-col gap-4\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                @lang('admin::app.quotes.create.address-info')\n                            </p>\n\n                            <p class=\"text-sm text-gray-600 dark:text-white\">\n                                @lang('admin::app.quotes.create.address-info-info')\n                            </p>\n                        </div>\n\n                        <div class=\"w-1/2 max-md:w-full\">\n                            <x-admin::attributes\n                                :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                    'entity_type' => 'quotes',\n                                    ['code', 'IN', ['billing_address', 'shipping_address']],\n                                ])\"\n                                :custom-validations=\"[\n                                    'billing_address' => [\n                                        'max:100',\n                                    ],\n                                    'shipping_address' => [\n                                        'max:100',\n                                    ],\n                                ]\"\n                                :entity=\"$quote\"\n                            />\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.contacts.quotes.edit.address_information.after', ['quote' => $quote]) !!}\n\n                    {!! view_render_event('admin.contacts.quotes.edit.quote_information.before', ['quote' => $quote]) !!}\n\n                    <!-- Quote Item Information -->\n                    <div\n                        id=\"quote-items\"\n                        class=\"flex flex-col gap-4\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                @lang('admin::app.quotes.create.quote-items')\n                            </p>\n\n                            <p class=\"text-sm text-gray-600 dark:text-white\">\n                                @lang('admin::app.quotes.create.quote-item-info')\n                            </p>\n                        </div>\n\n                        <!-- Quote Item List Vue Component -->\n                        <v-quote-item-list :errors=\"errors\"></v-quote-item-list>\n                    </div>\n\n                    {!! view_render_event('admin.contacts.quotes.edit.quote_information.after', ['quote' => $quote]) !!}\n                </div>\n\n                {!! view_render_event('admin.contacts.quotes.edit.form_controls.after', ['quote' => $quote]) !!}\n            </div>\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-quote-item-list-template\"\n        >\n            <div class=\"flex flex-col gap-4\">\n                <div class=\"block w-full\">\n                    <!-- Table -->\n                    <x-admin::table>\n                        <!-- Table Head -->\n                        <x-admin::table.thead>\n                            <x-admin::table.thead.tr>\n                                <x-admin::table.th>\n                                    @lang('admin::app.quotes.create.product-name')\n                                </x-admin::table.th>\n\n                                <x-admin::table.th class=\"text-center\">\n                                    @lang('admin::app.quotes.create.quantity')\n                                </x-admin::table.th>\n\n                                <x-admin::table.th class=\"text-center\">\n                                    @lang('admin::app.quotes.create.price') ({{ core()->currencySymbol(config('app.currency')) }})\n                                </x-admin::table.th>\n\n                                <x-admin::table.th class=\"text-center\">\n                                    @lang('admin::app.quotes.create.amount') ({{ core()->currencySymbol(config('app.currency')) }})\n                                </x-admin::table.th>\n\n                                <x-admin::table.th class=\"text-center\">\n                                    @lang('admin::app.quotes.create.discount') ({{ core()->currencySymbol(config('app.currency')) }})\n                                </x-admin::table.th>\n\n                                <x-admin::table.th class=\"text-center\">\n                                    @lang('admin::app.quotes.create.tax') ({{ core()->currencySymbol(config('app.currency')) }})\n                                </x-admin::table.th>\n\n                                <x-admin::table.th class=\"text-center\">\n                                    @lang('admin::app.quotes.create.total') ({{ core()->currencySymbol(config('app.currency')) }})\n                                </x-admin::table.th>\n\n                                <x-admin::table.th\n                                    v-if=\"products.length > 1\"\n                                    class=\"!px-2 ltr:text-right rtl:text-left\"\n                                >\n                                    @lang('admin::app.quotes.create.action')\n                                </x-admin::table.th>\n                            </x-admin::table.thead.tr>\n                        </x-admin::table.thead>\n\n                        <!-- Table Body -->\n                        <x-admin::table.tbody>\n                            <!-- Quote Item Vue component -->\n                            <template\n                                v-for='(product, index) in products'\n                                :key=\"index\"\n                            >\n                                <v-quote-item\n                                    :product=\"product\"\n                                    :index=\"index\"\n                                    :errors=\"errors\"\n                                    @onRemoveProduct=\"removeProduct($event)\"\n                                ></v-quote-item>\n                            </template>\n                        </x-admin::table.tbody>\n                    </x-admin::table>\n                    <x-admin::form.control-group.error name=\"items\"/>\n                </div>\n\n                <!-- Add New Quote Item -->\n                <span\n                    class=\"text-md flex max-w-max cursor-pointer items-center gap-2 text-brandColor\"\n                    @click=\"addProduct\"\n                >\n                    @lang('admin::app.quotes.create.add-item')\n                </span>\n\n                <div class=\"flex justify-end\">\n                    <div class=\"grid w-[348px] gap-4 rounded-lg bg-gray-100 p-4 text-sm dark:bg-gray-950 dark:text-white\">\n                        <div class=\"flex w-full justify-between gap-x-5\">\n                            @lang('admin::app.quotes.create.sub-total', ['symbol' => core()->currencySymbol(config('app.currency'))])\n\n                            <input\n                                type=\"hidden\"\n                                name=\"sub_total\"\n                                class=\"control\"\n                                :value=\"subTotal\"\n                                readonly\n                            >\n\n                            <p>@{{ subTotal }}</p>\n                        </div>\n\n                        <div class=\"flex w-full justify-between gap-x-5\">\n                            @lang('admin::app.quotes.create.total-discount', ['symbol' => core()->currencySymbol(config('app.currency'))])\n\n                            <input\n                                type=\"hidden\"\n                                name=\"discount_amount\"\n                                :value=\"discountAmount\"\n                            >\n\n                            <p>@{{ discountAmount }}</p>\n                        </div>\n\n                        <div class=\"flex w-full justify-between gap-x-5\">\n                            @lang('admin::app.quotes.create.total-tax', ['symbol' => core()->currencySymbol(config('app.currency'))])\n\n                            <input\n                                type=\"hidden\"\n                                name=\"tax_amount\"\n                                :value=\"taxAmount\"\n                            >\n\n                            <p>@{{ taxAmount }}</p>\n                        </div>\n\n                        <div class=\"flex w-full justify-between gap-x-5\">\n                            @lang('admin::app.quotes.create.total-adjustment', ['symbol' => core()->currencySymbol(config('app.currency'))])\n\n                            <x-admin::form.control-group.control\n                                type=\"inline\"\n                                ::name=\"`adjustment_amount`\"\n                                ::value=\"adjustmentAmount\"\n                                rules=\"required|decimal:4\"\n                                ::errors=\"errors\"\n                                :label=\"trans('admin::app.quotes.create.adjustment-amount')\"\n                                :placeholder=\"trans('admin::app.quotes.create.adjustment-amount')\"\n                                @on-change=\"(event) => adjustmentAmount = event.value\"\n                            />\n                        </div>\n\n                        <div class=\"flex w-full justify-between gap-x-5\">\n                            @lang('admin::app.quotes.create.grand-total', ['symbol' => core()->currencySymbol(config('app.currency'))])\n\n                            <input\n                                type=\"hidden\"\n                                name=\"grand_total\"\n                                :value=\"grandTotal\"\n                            >\n\n                            <p>@{{ grandTotal }}</p>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-quote-item-template\"\n        >\n            <x-admin::table.thead.tr>\n                <!-- Quote Product Name -->\n                <x-admin::table.td>\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::lookup\n                            ::src=\"src\"\n                            ::name=\"`${inputName}[product_id]`\"\n                            ::params=\"params\"\n                            ::value=\"{ id: product.product_id, name: product.name }\"\n                            @on-selected=\"(product) => addProduct(product)\"\n                            :placeholder=\"trans('admin::app.quotes.edit.search-products')\"\n                            rules=\"required\"\n                            :label=\"trans('admin::app.quotes.edit.product-name')\"\n                            ::class=\"errors[`${inputName}[product_id]`] ? 'border !border-red-600 hover:border-red-600' : ''\"\n                        />\n                        <x-admin::form.control-group.error name=\"`items.${product.id}.product_id`\"/>\n                        <x-admin::form.control-group.error ::name=\"`${inputName}[product_id]`\"/>\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n\n                <!-- Quantity -->\n                <x-admin::table.td class=\"!px-2 ltr:text-right rtl:text-left\">\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.control\n                            type=\"inline\"\n                            ::name=\"`${inputName}[quantity]`\"\n                            ::value=\"product.quantity\"\n                            rules=\"required|decimal:4\"\n                            ::errors=\"errors\"\n                            :label=\"trans('admin::app.quotes.create.quantity')\"\n                            :placeholder=\"trans('admin::app.quotes.create.quantity')\"\n                            @on-change=\"(event) => product.quantity = event.value\"\n                            position=\"center\"\n                        />\n                        <x-admin::form.control-group.error ::name=\"`items.${product.id}.quantity`\"/>\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n\n                <!-- Price -->\n                <x-admin::table.td class=\"!px-2 ltr:text-right rtl:text-left\">\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.control\n                            type=\"inline\"\n                            ::name=\"`${inputName}[price]`\"\n                            ::value=\"(product.price) ?? 0\"\n                            rules=\"required|decimal:4\"\n                            ::errors=\"errors\"\n                            :label=\"trans('admin::app.quotes.create.price')\"\n                            :placeholder=\"trans('admin::app.quotes.create.price')\"\n                            @on-change=\"(event) => product.price = event.value\"\n                            position=\"center\"\n                            ::value-label=\"$admin.formatPrice(product.price)\"\n                        />\n                        <x-admin::form.control-group.error name=\"`items.${product.id}.price`\"/>\n                        <x-admin::form.control-group.error ::name=\"`${inputName}[price]`\"/>\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n\n                <!-- Total -->\n                <x-admin::table.td class=\"!px-2 ltr:text-right rtl:text-left\">\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.control\n                            type=\"inline\"\n                            ::name=\"`${inputName}[total]`\"\n                            ::value=\"(product.price * product.quantity) ?? 0\"\n                            rules=\"required|decimal:4\"\n                            ::errors=\"errors\"\n                            :label=\"trans('admin::app.quotes.create.total')\"\n                            :placeholder=\"trans('admin::app.quotes.create.total')\"\n                            :allowEdit=\"false\"\n                            position=\"center\"\n                            ::value-label=\"$admin.formatPrice(product.price * product.quantity)\"\n                        />\n                        <x-admin::form.control-group.error name=\"`items.${product.id}.total`\"/>\n                        <x-admin::form.control-group.error ::name=\"`${inputName}[total]`\"/>\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n\n                <!-- Discount Amount -->\n                <x-admin::table.td class=\"!px-2 ltr:text-right rtl:text-left\">\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.control\n                            type=\"inline\"\n                            ::name=\"`${inputName}[discount_amount]`\"\n                            ::value=\"product.discount_amount\"\n                            rules=\"required|decimal:4\"\n                            ::errors=\"errors\"\n                            :label=\"trans('admin::app.quotes.create.discount-amount')\"\n                            :placeholder=\"trans('admin::app.quotes.create.discount-amount')\"\n                            @on-change=\"(event) => product.discount_amount = event.value\"\n                            position=\"center\"\n                            ::value-label=\"$admin.formatPrice(product.discount_amount)\"\n                        />\n                        <x-admin::form.control-group.error name=\"`items.${product.id}.discount_amount`\"/>\n                        <x-admin::form.control-group.error ::name=\"`${inputName}[discount_amount]`\"/>\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n\n                <!-- Tax Amount -->\n                <x-admin::table.td class=\"!px-2 ltr:text-right rtl:text-left\">\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.control\n                            type=\"inline\"\n                            ::name=\"`${inputName}[tax_amount]`\"\n                            ::value=\"product.tax_amount\"\n                            rules=\"required|decimal:4\"\n                            ::errors=\"errors\"\n                            :label=\"trans('admin::app.quotes.create.tax-amount')\"\n                            :placeholder=\"trans('admin::app.quotes.create.tax-amount')\"\n                            @on-change=\"(event) => product.tax_amount = event.value\"\n                            position=\"center\"\n                            ::value-label=\"$admin.formatPrice(product.tax_amount)\"\n                        />\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n\n                <!-- Total with Discount -->\n                <x-admin::table.td class=\"!px-2 ltr:text-right rtl:text-left\">\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.control\n                            type=\"inline\"\n                            ::name=\"`${inputName}[final_total]`\"\n                            ::errors=\"errors\"\n                            ::value=\"parseFloat(product.price * product.quantity) + parseFloat(product.tax_amount) - parseFloat(product.discount_amount)\"\n                            :allowEdit=\"false\"\n                            position=\"center\"\n                            ::value-label=\"$admin.formatPrice(parseFloat(product.price * product.quantity) + parseFloat(product.tax_amount) - parseFloat(product.discount_amount))\"\n                        />\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n\n                <!-- Action -->\n                <x-admin::table.td\n                    v-if=\"$parent.products.length > 1\"\n                    class=\"!p-2 !px-2 ltr:text-right rtl:text-left\"\n                >\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <i\n                            @click=\"removeProduct\"\n                            class=\"icon-delete cursor-pointer text-2xl\"\n                        ></i>\n                    </x-admin::form.control-group>\n                </x-admin::table.td>\n            </x-admin::table.thead.tr>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-quote', {\n                template: '#v-quote-template',\n\n                props: ['errors'],\n\n                data() {\n                    return {\n                        activeTab: 'quote-info',\n\n                        tabs: [\n                            { id: 'quote-info', label: '@lang('admin::app.quotes.create.quote-info')' },\n                            { id: 'address-info', label: '@lang('admin::app.quotes.create.address-info')' },\n                            { id: 'quote-items', label: '@lang('admin::app.quotes.create.quote-items')' }\n                        ],\n\n                        leadEntity: @json($lookUpEntityData ?? []),\n                    };\n                },\n\n                methods: {\n                    /**\n                     * Scroll to the section.\n                     *\n                     * @param {String} tabId\n                     *\n                     * @returns {void}\n                     */\n                    scrollToSection(tabId) {\n                        const section = document.getElementById(tabId);\n\n                        if (section) {\n                            section.scrollIntoView({ behavior: 'smooth' });\n                        }\n                    },\n\n                    setLeadEntity($event) {\n                        this.leadEntity = $event;\n                    },\n                },\n            });\n\n            app.component('v-quote-item-list', {\n                template: '#v-quote-item-list-template',\n\n                props: ['errors'],\n\n                data() {\n                    return {\n                        adjustmentAmount: 0,\n\n                        products: @json($quote->items),\n                    }\n                },\n\n                computed: {\n                    /**\n                     * Calculate the sub total of the products.\n                     *\n                     * @returns {Number}\n                     */\n                    subTotal() {\n                        let total = 0;\n\n                        this.products.forEach(product => {\n                            total += parseFloat(product.price * product.quantity);\n                        });\n\n                        return total;\n                    },\n\n                    /**\n                     * Calculate the total discount amount of the products.\n                     *\n                     * @returns {Number}\n                     */\n                    discountAmount() {\n                        let total = 0;\n\n                        this.products.forEach(product => total += parseFloat(product.discount_amount));\n\n                        return total;\n                    },\n\n                    /**\n                     * Calculate the total tax amount of the products.\n                     *\n                     * @returns {Number}\n                     */\n                    taxAmount() {\n                        let total = 0;\n\n                        this.products.forEach(product => total += parseFloat(product.tax_amount));\n\n                        return total;\n                    },\n\n                    /**\n                     * Calculate the grand total of the products.\n                     *\n                     * @returns {Number}\n                     */\n                    grandTotal() {\n                        let total = 0;\n\n                        this.products.forEach(product => {\n                            total += parseFloat(product.price * product.quantity) + parseFloat(product.tax_amount) - parseFloat(product.discount_amount) + parseFloat(this.adjustmentAmount);\n                        });\n\n                        return total;\n                    },\n                },\n\n                methods: {\n                    /**\n                     * Add a new product.\n                     *\n                     * @returns {void}\n                     */\n                    addProduct() {\n                        this.products.push({\n                            id: null,\n                            product_id: null,\n                            name: '',\n                            quantity: 1,\n                            total: 0,\n                            price: 0,\n                            discount_amount: 0,\n                            tax_amount: 0,\n                        });\n                    },\n\n                    /**\n                     * Remove the product.\n                     *\n                     * @param {Object} product\n                     */\n                    removeProduct(product) {\n                        this.$emitter.emit('open-confirm-modal', {\n                            agree: () => {\n                                if (this.products.length === 1) {\n                                    this.products = [{\n                                        id: null,\n                                        product_id: null,\n                                        name: '',\n                                        quantity: null,\n                                        total: 0,\n                                        price: null,\n                                        discount_amount: null,\n                                        tax_amount: null,\n                                    }];\n                                } else {\n                                    const index = this.products.indexOf(product);\n\n                                    if (index !== -1) {\n                                        this.products.splice(index, 1);\n                                    }\n                                }\n                            },\n                        });\n                    },\n                },\n            });\n\n            app.component('v-quote-item', {\n                template: '#v-quote-item-template',\n\n                props: ['index', 'product', 'errors'],\n\n                data() {\n                    return {\n                        state: this.product['product_id'] ? 'old' : '',\n\n                        products: [],\n                    }\n                },\n\n                computed: {\n                    /**\n                     * Get the input name.\n                     *\n                     * @returns {String}\n                     */\n                    inputName() {\n                        if (this.product.id) {\n                            return \"items[\" + this.product.id + \"]\";\n                        }\n\n                        return \"items[item_\" + this.index + \"]\";\n                    },\n\n                    /**\n                     * Get the source URL.\n                     *\n                     * @returns {String}\n                     */\n                    src() {\n                        return \"{{ route('admin.products.search') }}\";\n                    },\n\n                    params() {\n                        return {\n                            params: {\n                                query: this.product.name,\n                            },\n                        };\n                    },\n                },\n\n                methods: {\n                    /**\n                     * Add the product.\n                     *\n                     * @param {Object} result\n                     *\n                     * @return {void}\n                     */\n                    addProduct(result) {\n                        this.product.product_id = result.id;\n                        this.product.name = result.name;\n                        this.product.price = result.price ?? 0;\n                        this.product.quantity = result.quantity ?? 1;\n                        this.product.discount_amount = 0;\n                        this.product.tax_amount = 0;\n                    },\n\n                    /**\n                     * Remove the product.\n                     *\n                     * @return {void}\n                     */\n                    removeProduct() {\n                        this.$emit('onRemoveProduct', this.product);\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n\n    @pushOnce('styles')\n        <style>\n            html {\n                scroll-behavior: smooth;\n            }\n        </style>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/quotes/index.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.quotes.index.title')\n    </x-slot>\n\n    <v-qoute>\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    <!-- Bredcrumbs -->\n                    <x-admin::breadcrumbs name=\"quotes\" />\n        \n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.quotes.index.title')\n                    </div>\n                </div>\n        \n                <div class=\"flex items-center gap-x-2.5\">\n                    <!-- Create button for Quote -->\n                    <div class=\"flex items-center gap-x-2.5\">\n                        @if (bouncer()->hasPermission('quotes.create'))\n                            <a \n                                href=\"{{ route('admin.quotes.create') }}\"\n                                class=\"primary-button\"\n                            >\n                                @lang('admin::app.quotes.index.create-btn')\n                            </a>\n                        @endif\n                    </div>\n                </div>\n            </div>\n        \n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </div>\n    </v-qoute>\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-qoute-template\"\n        >\n            <div class=\"flex flex-col gap-4\">\n                <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                    <div class=\"flex flex-col gap-2\">\n                        <!-- Bredcrumbs -->\n                        <x-admin::breadcrumbs name=\"quotes\" />\n        \n                        <div class=\"text-xl font-bold dark:text-white\">\n                            @lang('admin::app.quotes.index.title')\n                        </div>\n                    </div>\n\n                    <div class=\"flex items-center gap-x-2.5\">\n                        <!-- Create button for person -->\n                        <div class=\"flex items-center gap-x-2.5\">\n                            {!! view_render_event('admin.quotes.index.create_button.before') !!}\n                            \n                            @if (bouncer()->hasPermission('quotes.create'))\n                                <a \n                                    href=\"{{ route('admin.quotes.create') }}\"\n                                    class=\"primary-button\"\n                                >\n                                    @lang('admin::app.quotes.index.create-btn')\n                                </a>\n                            @endif\n            \n                            {!! view_render_event('admin.quotes.index.create_button.after') !!}\n                        </div>\n                    </div>\n                </div>\n            \n                {!! view_render_event('admin.quotes.index.datagrid.before') !!}\n            \n                <!-- DataGrid -->\n                <x-admin::datagrid :src=\"route('admin.quotes.index')\" />\n\n                {!! view_render_event('admin.quotes.index.datagrid.after') !!}\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-qoute', {\n                template: '#v-qoute-template',\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/quotes/pdf.blade.php",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html\n    lang=\"{{ $locale = app()->getLocale() }}\"\n    dir=\"{{ in_array($locale, ['fa', 'ar']) ? 'rtl' : 'ltr' }}\"\n>\n    <head>\n        <!-- meta tags -->\n        <meta\n            http-equiv=\"Cache-control\"\n            content=\"no-cache\"\n        >\n\n        <meta\n            http-equiv=\"Content-Type\"\n            content=\"text/html; charset=utf-8\"\n        />\n\n        @php\n            if ($locale == 'en') {\n                $fontFamily = [\n                    'regular' => 'DejaVu Sans',\n                    'bold' => 'DejaVu Sans',\n                ];\n            }  else {\n                $fontFamily = [\n                    'regular' => 'Arial, sans-serif',\n                    'bold' => 'Arial, sans-serif',\n                ];\n            }\n\n            if (in_array($locale, ['ar', 'fa', 'tr'])) {\n                $fontFamily = [\n                    'regular' => 'DejaVu Sans',\n                    'bold' => 'DejaVu Sans',\n                ];\n            }\n        @endphp\n\n        <!-- lang supports inclusion -->\n        <style type=\"text/css\">\n            * {\n                margin: 0;\n                padding: 0;\n                box-sizing: border-box;\n                font-family: {{ $fontFamily['regular'] }};\n            }\n\n            body {\n                font-size: 10px;\n                color: #091341;\n                font-family: \"{{ $fontFamily['regular'] }}\";\n            }\n\n            b, th {\n                font-family: \"{{ $fontFamily['bold'] }}\";\n            }\n\n            .page-content {\n                padding: 12px;\n            }\n\n            .page-header {\n                border-bottom: 1px solid #E9EFFC;\n                text-align: center;\n                font-size: 24px;\n                text-transform: uppercase;\n                color: #000DBB;\n                padding: 24px 0;\n                margin: 0;\n            }\n\n            .logo-container {\n                position: absolute;\n                top: 20px;\n                left: 20px;\n            }\n\n            .logo-container.rtl {\n                left: auto;\n                right: 20px;\n            }\n\n            .logo-container img {\n                max-width: 100%;\n                height: auto;\n            }\n\n            .page-header b {\n                display: inline-block;\n                vertical-align: middle;\n            }\n\n            .small-text {\n                font-size: 7px;\n            }\n\n            table {\n                width: 100%;\n                border-spacing: 1px 0;\n                border-collapse: separate;\n                margin-bottom: 16px;\n            }\n            \n            table thead th {\n                background-color: #E9EFFC;\n                color: #000DBB;\n                padding: 6px 18px;\n                text-align: left;\n            }\n\n            table.rtl thead tr th {\n                text-align: right;\n            }\n\n            table tbody td {\n                padding: 9px 18px;\n                border-bottom: 1px solid #E9EFFC;\n                text-align: left;\n                vertical-align: top;\n            }\n\n            table.rtl tbody tr td {\n                text-align: right;\n            }\n\n            .summary {\n                width: 100%;\n                display: inline-block;\n            }\n\n            .summary table {\n                float: right;\n                width: 250px;\n                padding-top: 5px;\n                padding-bottom: 5px;\n                background-color: #E9EFFC;\n                white-space: nowrap;\n            }\n\n            .summary table.rtl {\n                width: 280px;\n            }\n\n            .summary table.rtl {\n                margin-right: 480px;\n            }\n\n            .summary table td {\n                padding: 5px 10px;\n            }\n\n            .summary table td:nth-child(2) {\n                text-align: center;\n            }\n\n            .summary table td:nth-child(3) {\n                text-align: right;\n            }\n        </style>\n    </head>\n\n    <body dir=\"{{ $locale }}\">\n        <div class=\"page\">\n            <!-- Header -->\n            <div class=\"page-header\">\n                <b>@lang('admin::app.quotes.index.pdf.title')</b>\n            </div>\n\n            <div class=\"page-content\">\n                <!-- Invoice Information -->\n                <table class=\"{{ app()->getLocale   () }}\">\n                    <tbody>\n                        <tr>\n                            <td style=\"width: 50%; padding: 2px 18px;border:none;\">\n                                <b>\n                                    @lang('admin::app.quotes.index.pdf.quote-id'): \n                                </b>\n\n                                <span>\n                                    #{{ $quote->id }}\n                                </span>\n                            </td>\n\n                            <td style=\"width: 50%; padding: 2px 18px;border:none;\">\n                                <b>\n                                    @lang('admin::app.quotes.index.pdf.person'):\n                                </b>\n\n                                <span>\n                                    {{ $quote->person->name }}\n                                </span>\n                            </td>\n                        </tr>\n\n                        <tr>\n                            <td style=\"width: 50%; padding: 2px 18px;border:none;\">\n                                <b>\n                                    @lang('admin::app.quotes.index.pdf.sales-person'): \n                                </b>\n\n                                <span>\n                                    {{ $quote->user->name }}\n                                </span>\n                            </td>\n\n                            <td style=\"width: 50%; padding: 2px 18px;border:none;\">\n                                <b>\n                                    @lang('admin::app.quotes.index.pdf.subject'):\n                                </b>\n\n                                <span>\n                                    {{ $quote->subject }}\n                                </span>\n                            </td>\n                        </tr>\n                        \n                        <tr>\n                            <td style=\"width: 50%; padding: 2px 18px;border:none;\">\n                                <b>\n                                    @lang('admin::app.quotes.index.pdf.date'):\n                                </b>\n\n                                <span>\n                                    {{ core()->formatDate($quote->created_at, 'd-m-Y') }}\n                                </span>\n                            </td>\n\n                            <td style=\"width: 50%; padding: 2px 18px;border:none;\">\n                                <b>\n                                    @lang('admin::app.quotes.index.pdf.sales-person'):\n                                </b>\n\n                                <span>\n                                    {{ $quote->user->name }}\n                                </span>\n                            </td>\n                        </tr>\n\n                        <tr>\n                            <td style=\"width: 50%; padding: 2px 18px;border:none;\">\n                                <b>\n                                    @lang('admin::app.quotes.index.pdf.expired-at'):\n                                </b>\n\n                                <span>\n                                    {{ core()->formatDate($quote->expired_at, 'd-m-Y') }}\n                                </span>\n                            </td>\n                        </tr>\n                    </tbody>\n                </table>\n\n                <!-- Billing & Shipping Address -->\n                <table class=\"{{ $locale }}\">\n                    <thead>\n                        <tr>\n                            @if ($quote->billing_address)\n                                <th style=\"width: 50%;\">\n                                    <b>\n                                        @lang('admin::app.quotes.index.pdf.billing-address')\n                                    </b>\n                                </th>\n                            @endif\n\n                            @if ($quote->shipping_address)\n                                <th style=\"width: 50%\">\n                                    <b>\n                                        @lang('admin::app.quotes.index.pdf.shipping-address')\n                                    </b>\n                                </th>\n                            @endif\n                        </tr>\n                    </thead>\n\n                    <tbody>\n                        <tr>\n                            @if ($quote->billing_address)\n                                <td style=\"width: 50%\">\n                                    <div>{{ $quote->billing_address['address'] ?? '' }}</div>\n\n                                    <div>{{ $quote->billing_address['postcode'] ?? '' . ' ' .$quote->billing_address['city'] ?? '' }} </div>\n\n                                    <div>{{ $quote->billing_address['state'] ?? '' }}</div>\n\n                                    <div>{{ core()->country_name($quote->billing_address['country'] ?? '') }}</div>\n                                </td>\n                            @endif\n                            \n                            @if ($quote->shipping_address)\n                                <td style=\"width: 50%\">\n                                    <div>{{ $quote->shipping_address['address'] ?? ''}}</div>\n\n                                    <div>{{ $quote->shipping_address['postcode'] ?? '' . ' ' .$quote->shipping_address['city'] ?? '' }} </div>\n\n                                    <div>{{ $quote->shipping_address['state'] ?? '' }}</div>\n\n                                    <div>{{ core()->country_name($quote->shipping_address['country'] ?? '') }}</div>\n                                </td>\n                            @endif\n                        </tr>\n                    </tbody>\n                </table>\n\n                <!-- Items -->\n                <div class=\"items\">\n                    <table class=\"{{ app()->getLocale   () }}\">\n                        <thead>\n                            <tr>\n                                <th>\n                                    @lang('admin::app.quotes.index.pdf.sku')\n                                </th>\n\n                                <th>\n                                    @lang('admin::app.quotes.index.pdf.product-name')\n                                </th>\n\n                                <th>\n                                    @lang('admin::app.quotes.index.pdf.price')\n                                </th>\n\n                                <th>\n                                    @lang('admin::app.quotes.index.pdf.quantity')\n                                </th>\n\n                                <th>\n                                    @lang('admin::app.quotes.index.pdf.amount')\n                                </th>\n\n                                <th>\n                                    @lang('admin::app.quotes.index.pdf.discount')\n                                </th>\n\n                                <th>\n                                    @lang('admin::app.quotes.index.pdf.tax')\n                                </th>\n\n                                <th>\n                                    @lang('admin::app.quotes.index.pdf.grand-total')\n                                </th>\n                            </tr>\n                        </thead>\n\n                        <tbody>\n                            @foreach ($quote->items as $item)\n                                <tr>\n                                    <td>{{ $item->sku }}</td>\n\n                                    <td>\n                                        {{ $item->name }}\n                                    </td>\n\n                                    <td>{!! core()->formatBasePrice($item->price, true) !!}</td>\n\n                                    <td class=\"text-center\">{{ $item->quantity }}</td>\n\n                                    <td class=\"text-center\">{!! core()->formatBasePrice($item->total, true) !!}</td>\n\n                                    <td class=\"text-center\">{!! core()->formatBasePrice($item->discount_amount, true) !!}</td>\n\n                                    <td class=\"text-center\">{!! core()->formatBasePrice($item->tax_amount, true) !!}</td>\n                                    \n                                    <td class=\"text-center\">{!! core()->formatBasePrice($item->total + $item->tax_amount - $item->discount_amount, true) !!}</td>\n                                </tr>\n                            @endforeach\n                        </tbody>\n                    </table>\n                </div>\n\n               <!-- Summary Table -->\n                <div class=\"summary\">\n                    <table class=\"{{ app()->getLocale   () }}\">\n                        <tbody>\n                            <tr>\n                                <td>@lang('admin::app.quotes.index.pdf.sub-total')</td>\n                                <td>-</td>\n                                <td>{!! core()->formatBasePrice($quote->sub_total, true) !!}</td>\n                            </tr>\n        \n                            <tr>\n                                <td>@lang('admin::app.quotes.index.pdf.tax')</td>\n                                <td>-</td>\n                                <td>{!! core()->formatBasePrice($quote->tax_amount, true) !!}</td>\n                            </tr>\n        \n                            <tr>\n                                <td>@lang('admin::app.quotes.index.pdf.discount')</td>\n                                <td>-</td>\n                                <td>{!! core()->formatBasePrice($quote->discount_amount, true) !!}</td>\n                            </tr>\n        \n                            <tr>\n                                <td>@lang('admin::app.quotes.index.pdf.adjustment')</td>\n                                <td>-</td>\n                                <td>{!! core()->formatBasePrice($quote->adjustment_amount, true) !!}</td>\n                            </tr>\n        \n                            <tr>\n                                <td><strong>@lang('admin::app.quotes.index.pdf.grand-total')</strong></td>\n                                <td><strong>-</strong></td>\n                                <td><strong>{!! core()->formatBasePrice($quote->grand_total, true) !!}</strong></td>\n                            </tr>\n                        </tbody>\n                    </table>\n                </div>\n            </div>\n        </div>\n    </body>\n</html>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/sessions/forgot-password.blade.php",
    "content": "<x-admin::layouts.anonymous>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.users.forget-password.create.page-title')\n    </x-slot>\n\n    <div class=\"flex h-[100vh] flex-col items-center justify-center gap-10\">\n        <div class=\"flex flex-col items-center gap-5\">\n            <!-- Logo -->\n            @if ($logo = core()->getConfigData('general.design.admin_logo.logo_image'))\n                <img\n                    class=\"h-10 w-[110px]\"\n                    src=\"{{ Storage::url($logo) }}\"\n                    alt=\"{{ config('app.name') }}\"\n                />\n            @else\n                <img\n                    class=\"w-max\"\n                    src=\"{{ vite()->asset('images/logo.svg') }}\"\n                    alt=\"{{ config('app.name') }}\"\n                />\n            @endif\n\n            <div class=\"box-shadow flex min-w-[300px] flex-col rounded-md bg-white dark:bg-gray-900\">\n                {!! view_render_event('admin.sessions.forgor_password.form_controls.before') !!}\n\n                <!-- Forget Password Form -->\n                <x-admin::form :action=\"route('admin.forgot_password.store')\">\n                    <div class=\"p-4\">\n                        <p class=\"text-xl font-bold text-gray-800 dark:text-white\">\n                            @lang('admin::app.users.forget-password.create.title')\n                        </p>\n                    </div>\n\n                    <div class=\"border-y p-4 dark:border-gray-800\">\n                        <!-- Registered Email -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.users.forget-password.create.email')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"email\"\n                                class=\"w-[254px] max-w-full\"\n                                id=\"email\"\n                                name=\"email\"\n                                rules=\"required|email\"\n                                :value=\"old('email')\"\n                                :label=\"trans('admin::app.users.forget-password.create.email')\"\n                                :placeholder=\"trans('admin::app.users.forget-password.create.email')\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"email\" />\n                        </x-admin::form.control-group>\n                    </div>\n\n                    <div class=\"flex items-center justify-between p-4\">\n                        <!-- Back to Sign In link -->\n                        <a\n                            class=\"cursor-pointer text-xs font-semibold leading-6 text-brandColor\"\n                            href=\"{{ route('admin.session.create') }}\"\n                        >\n                            @lang('admin::app.users.forget-password.create.sign-in-link')\n                        </a>\n\n                        <!-- Form Submit Button -->\n                        <button\n                            class=\"primary-button\">\n                            @lang('admin::app.users.forget-password.create.submit-btn')\n                        </button>\n                    </div>\n                </x-admin::form>\n\n                {!! view_render_event('admin.sessions.forgor_password.form_controls.after') !!}\n            </div>\n        </div>\n\n        <!-- Powered By -->\n        <div class=\"text-sm font-normal\">\n            @lang('admin::app.components.layouts.powered-by.description', [\n                'krayin' => '<a class=\"text-brandColor hover:underline \" href=\"https://krayincrm.com/\">Krayin</a>',\n                'webkul' => '<a class=\"text-brandColor hover:underline \" href=\"https://webkul.com/\">Webkul</a>',\n            ]) \n        </div>\n    </div>\n</x-admin::layouts.anonymous>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/sessions/login.blade.php",
    "content": "<x-admin::layouts.anonymous>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.users.login.title')\n    </x-slot>\n\n    <div class=\"flex h-[100vh] flex-col items-center justify-center gap-10\">\n        <div class=\"flex flex-col items-center gap-5\">\n            <!-- Logo -->\n            @if ($logo = core()->getConfigData('general.design.admin_logo.logo_image'))\n                <img\n                    class=\"h-10 w-[110px]\"\n                    src=\"{{ Storage::url($logo) }}\"\n                    alt=\"{{ config('app.name') }}\"\n                />\n            @else\n                <img\n                    class=\"w-max\"\n                    src=\"{{ vite()->asset('images/logo.svg') }}\"\n                    alt=\"{{ config('app.name') }}\"\n                />\n            @endif\n\n            <div class=\"box-shadow flex min-w-[300px] flex-col rounded-md bg-white dark:bg-gray-900\">\n                {!! view_render_event('admin.sessions.login.form_controls.before') !!}\n\n                <!-- Login Form -->\n                <x-admin::form :action=\"route('admin.session.store')\">\n                    <p class=\"p-4 text-xl font-bold text-gray-800 dark:text-white\">\n                        @lang('admin::app.users.login.title')\n                    </p>\n\n                    <div class=\"border-y p-4 dark:border-gray-800\">\n                        <!-- Email -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.users.login.email')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"email\"\n                                class=\"w-[254px] max-w-full\"\n                                id=\"email\"\n                                name=\"email\"\n                                rules=\"required|email\"\n                                :label=\"trans('admin::app.users.login.email')\"\n                                :placeholder=\"trans('admin::app.users.login.email')\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"email\" />\n                        </x-admin::form.control-group>\n\n                        <!-- Password -->\n                        <x-admin::form.control-group class=\"relative w-full\">\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.users.login.password')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"password\"\n                                class=\"w-[254px] max-w-full ltr:pr-10 rtl:pl-10\"\n                                id=\"password\"\n                                name=\"password\"\n                                rules=\"required|min:6\"\n                                :label=\"trans('admin::app.users.login.password')\"\n                                :placeholder=\"trans('admin::app.users.login.password')\"\n                            />\n\n                            <span\n                                class=\"icon-eye-hide absolute top-11 -translate-y-2/4 cursor-pointer text-2xl ltr:right-3 rtl:left-3\"\n                                onclick=\"switchVisibility()\"\n                                id=\"visibilityIcon\"\n                                role=\"presentation\"\n                                tabindex=\"0\"\n                            >\n                            </span>\n\n                            <x-admin::form.control-group.error control-name=\"password\" />\n                        </x-admin::form.control-group>\n                    </div>\n\n                    <div class=\"flex items-center justify-between p-4\">\n                        <!-- Forgot Password Link -->\n                        <a\n                            class=\"cursor-pointer text-xs font-semibold leading-6 text-brandColor\"\n                            href=\"{{ route('admin.forgot_password.create') }}\"\n                        >\n                            @lang('admin::app.users.login.forget-password-link')\n                        </a>\n\n                        <!-- Submit Button -->\n                        <button\n                            class=\"primary-button\"\n                            aria-label=\"{{ trans('admin::app.users.login.submit-btn')}}\"\n                        >\n                            @lang('admin::app.users.login.submit-btn')\n                        </button>\n                    </div>\n                </x-admin::form>\n\n                {!! view_render_event('admin.sessions.login.form_controls.after') !!}\n            </div>\n        </div>\n\n        <!-- Powered By -->\n        <div class=\"text-sm font-normal\">\n            @lang('admin::app.components.layouts.powered-by.description', [\n                'krayin' => '<a class=\"text-brandColor hover:underline \" href=\"https://krayincrm.com/\">Krayin</a>',\n                'webkul' => '<a class=\"text-brandColor hover:underline \" href=\"https://webkul.com/\">Webkul</a>',\n            ]) \n        </div>\n    </div>\n\n    @push('scripts')\n        <script>\n            function switchVisibility() {\n                let passwordField = document.getElementById(\"password\");\n                let visibilityIcon = document.getElementById(\"visibilityIcon\");\n\n                passwordField.type = passwordField.type === \"password\" ? \"text\" : \"password\";\n                visibilityIcon.classList.toggle(\"icon-eye\");\n            }\n        </script>\n    @endpush\n</x-admin::layouts.anonymous>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/sessions/reset-password.blade.php",
    "content": "<x-admin::layouts.anonymous>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.users.reset-password.title')\n    </x-slot>\n\n    <div class=\"flex h-[100vh] flex-col items-center justify-center gap-10\">\n        <div class=\"flex flex-col items-center gap-5\">\n            <!-- Logo -->\n            @if ($logo = core()->getConfigData('general.design.admin_logo.logo_image'))\n                <img\n                    class=\"h-10 w-[110px]\"\n                    src=\"{{ Storage::url($logo) }}\"\n                    alt=\"{{ config('app.name') }}\"\n                />\n            @else\n                <img\n                    class=\"w-max\"\n                    src=\"{{ vite()->asset('images/logo.svg') }}\"\n                    alt=\"{{ config('app.name') }}\"\n                />\n            @endif\n\n            <div class=\"box-shadow flex min-w-[300px] flex-col rounded-md bg-white dark:bg-gray-900\">\n                {!! view_render_event('admin.sessions.reset-password.form_controls.before') !!}\n\n                <!-- Login Form -->\n                <x-admin::form :action=\"route('admin.reset_password.store')\">\n                    <div class=\"p-4\">\n                        <p class=\"text-xl font-bold text-gray-800 dark:text-white\">\n                            @lang('admin::app.users.reset-password.title')\n                        </p>\n                    </div>\n\n                    <x-admin::form.control-group.control\n                        type=\"hidden\"\n                        name=\"token\"\n                        :value=\"$token\"\n                    />\n\n                    <div class=\"border-y p-4 dark:border-gray-800\">\n                        <!-- Email -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.users.reset-password.email')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"email\"\n                                class=\"w-[254px] max-w-full\"\n                                id=\"email\"\n                                name=\"email\"\n                                rules=\"required|email\"\n                                :label=\"trans('admin::app.users.reset-password.email')\"\n                                :placeholder=\"trans('admin::app.users.reset-password.email')\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"email\" />\n                        </x-admin::form.control-group>\n\n                        <!-- Password -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.users.reset-password.password')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"password\"\n                                class=\"w-[254px] max-w-full\"\n                                id=\"password\"\n                                name=\"password\"\n                                rules=\"required|min:6\"\n                                :label=\"trans('admin::app.users.reset-password.password')\"\n                                :placeholder=\"trans('admin::app.users.reset-password.password')\"\n                                ref=\"password\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"password\" />\n                        </x-admin::form.control-group>\n\n                        <!-- Confirm Password -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.users.reset-password.confirm-password')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"password\"\n                                class=\"w-[254px] max-w-full\"\n                                id=\"password_confirmation\"\n                                name=\"password_confirmation\"\n                                rules=\"confirmed:@password\"\n                                :label=\"trans('admin::app.users.reset-password.confirm-password')\"\n                                :placeholder=\"trans('admin::app.users.reset-password.confirm-password')\"\n                                ref=\"password\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"password_confirmation\" />\n                        </x-admin::form.control-group>\n                    </div>\n\n                    <div class=\"flex items-center justify-between p-4\">\n                        <!-- Back Button-->\n                        <a\n                            class=\"cursor-pointer text-xs font-semibold leading-6 text-brandColor\"\n                            href=\"{{ route('admin.session.create') }}\"\n                        >\n                            @lang('admin::app.users.reset-password.back-link-title')\n                        </a>\n\n                        <!-- Submit Button -->\n                        <button\n                            class=\"primary-button\">\n                            @lang('admin::app.users.reset-password.submit-btn')\n                        </button>\n                    </div>\n                </x-admin::form>\n\n                {!! view_render_event('admin.sessions.reset-password.form_controls.after') !!}\n            </div>\n        </div>\n\n        <!-- Powered By -->\n        <div class=\"text-sm font-normal\">\n            @lang('admin::app.components.layouts.powered-by.description', [\n                'krayin' => '<a class=\"text-brandColor hover:underline \" href=\"https://krayincrm.com/\">Krayin</a>',\n                'webkul' => '<a class=\"text-brandColor hover:underline \" href=\"https://webkul.com/\">Webkul</a>',\n            ]) \n        </div>\n    </div>\n</x-admin::layouts.anonymous>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/attributes/create.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.settings.attributes.create.title')\n    </x-slot>\n\n    {!! view_render_event('admin.settings.attributes.create.before') !!}\n\n    <!-- Input Form -->\n    <x-admin::form\n        :action=\"route('admin.settings.attributes.store')\"\n        enctype=\"multipart/form-data\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            {!! view_render_event('admin.settings.attributes.create.form_controls.before') !!}\n\n            <!-- actions buttons -->\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.attributes.create.breadcrumbs.before') !!}\n\n                    <x-admin::breadcrumbs name=\"settings.attributes.create\" />\n\n                    {!! view_render_event('admin.settings.attributes.create.breadcrumbs.after') !!}\n                    \n                    <div class=\"text-xl font-bold dark:text-white\">\n                        {!! view_render_event('admin.settings.attributes.create.title.before') !!}\n\n                        @lang('admin::app.settings.attributes.create.title')\n\n                        {!! view_render_event('admin.settings.attributes.create.title.after') !!}\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <!-- Create button for Attributes -->\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.attributes.create.create_button.before') !!}\n\n                        @if (bouncer()->hasPermission('settings.automation.attributes.create'))\n                            <button\n                                type=\"submit\"\n                                class=\"primary-button\"\n                            >\n                                @lang('admin::app.settings.attributes.create.save-btn')\n                            </button>\n                        @endif\n\n                        {!! view_render_event('admin.settings.attributes.create.create_button.after') !!}\n                    </div>\n                </div>\n            </div>\n            \n            <!-- Create Attributes Vue Components -->\n            <v-create-attributes>\n                <!-- Shimmer Effect -->\n                <x-admin::shimmer.settings.attributes />\n            </v-create-attributes>\n\n            {!! view_render_event('admin.settings.attributes.create.form_controls.after') !!}\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.settings.attributes.create.after') !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-create-attributes-template\"\n        >\n            <!-- body content -->\n            {!! view_render_event('admin.settings.attributes.create.card.label.before') !!}\n            \n            <div class=\"flex gap-2.5 max-xl:flex-wrap\">\n                <!-- Left sub Component -->\n                <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                    <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                        <p class=\"mb-4 text-base font-semibold text-gray-800 dark:text-white\">\n                            @lang('admin::app.settings.attributes.create.labels')\n                        </p>\n\n                        {!! view_render_event('admin.settings.attributes.create.form_controls.name.before') !!}\n\n                        <!-- Name -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.attributes.create.name')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"text\"\n                                id=\"name\"\n                                name=\"name\"\n                                rules=\"required\"\n                                value=\"{{ old('name') }}\"\n                                :label=\"trans('admin::app.settings.attributes.create.name')\"\n                                :placeholder=\"trans('admin::app.settings.attributes.create.name')\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"name\" />\n                        </x-admin::form.control-group>\n\n                        {!! view_render_event('admin.settings.attributes.create.form_controls.name.after') !!}\n\n                        <!-- Options -->\n                        <div\n                            v-if=\"swatchAttribute && (\n                                    attributeType == 'select'\n                                    || attributeType == 'multiselect'\n                                    || attributeType == 'checkbox'\n                                    || attributeType == 'lookup'\n                                )\"\n                        >\n                            <div class=\"mb-3 flex items-center justify-between\">\n                                <p class=\"mb-4 text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.attributes.create.options')\n                                </p>\n\n                                <!-- Add Row Button -->\n                                <div\n                                    v-if=\"optionType == 'options' && attributeType != 'lookup'\"\n                                    class=\"secondary-button text-sm\"\n                                    @click=\"$refs.addOptionsRow.toggle();swatchValue=''\"\n                                >\n                                    @lang('admin::app.settings.attributes.create.add-option')\n                                </div>\n                            </div>\n\n                            <!-- For Attribute Options If Data Exist -->\n                            <div class=\"mt-4 overflow-x-auto\">\n                                <div class=\"flex gap-4 max-sm:flex-wrap\">\n                                    {!! view_render_event('admin.settings.attributes.create.form_controls.option_type.before') !!}\n\n                                    <!-- Input Option Type -->\n                                    <x-admin::form.control-group v-if=\"attributeType != 'lookup'\" class=\"mb-2.5 w-1/2\">\n                                        <x-admin::form.control-group.label>\n                                            @lang('admin::app.settings.attributes.create.option-type')\n                                        </x-admin::form.control-group.label>\n                                \n                                        <x-admin::form.control-group.control\n                                            type=\"select\"\n                                            id=\"optionType\"\n                                            name=\"option_type\"\n                                            :value=\"old('optionType')\"\n                                            v-model=\"optionType\"\n                                            @change=\"showSwatch=true\"\n                                        >\n                                            <option value=\"lookup\">\n                                                @lang('admin::app.settings.attributes.create.lookup')\n                                            </option>\n                                            <option value=\"options\">\n                                                @lang('admin::app.settings.attributes.create.options')\n                                            </option>\n                                        </x-admin::form.control-group.control>\n                                \n                                        <x-admin::form.control-group.error\n                                            class=\"mt-3\"\n                                            control-name=\"admin\"\n                                        />\n                                    </x-admin::form.control-group>\n                                \n                                    {!! view_render_event('admin.settings.attributes.create.form_controls.option_type.after') !!}\n\n                                    {!! view_render_event('admin.settings.attributes.create.form_controls.lookup_type.before') !!}\n\n                                    <!-- Input Lookup Type -->\n                                    <x-admin::form.control-group v-if=\"attributeType == 'lookup' || (optionType == 'lookup')\" class=\"mb-2.5 w-1/2\">\n                                        <x-admin::form.control-group.label>\n                                            @lang('admin::app.settings.attributes.create.lookup-type')\n                                        </x-admin::form.control-group.label>\n                                \n                                        <x-admin::form.control-group.control\n                                            type=\"select\"\n                                            id=\"lookup_type\"\n                                            name=\"lookup_type\"\n                                            :value=\"old('optionType')\"\n                                            @change=\"showSwatch=true\"\n                                        >\n                                            <option\n                                                :key=\"index\"\n                                                :value=\"index\"\n                                                v-text=\"entityType.name\"\n                                                v-for=\"(entityType, index) in lookupEntityTypes\"\n                                            ></option>\n                                        </x-admin::form.control-group.control>\n                                \n                                        <x-admin::form.control-group.error\n                                            class=\"mt-3\"\n                                            control-name=\"admin\"\n                                        />\n                                    </x-admin::form.control-group>\n\n                                    {!! view_render_event('admin.settings.attributes.create.form_controls.lookup_type.after') !!}\n                                </div>\n\n                                <template v-if=\"this.options?.length && optionType == 'options'\">\n                                    {!! view_render_event('admin.settings.attributes.create.table.before') !!}\n\n                                    <!-- Table Information -->\n                                    <x-admin::table>\n                                        <x-admin::table.thead class=\"text-sm font-medium dark:bg-gray-800\">\n                                            <x-admin::table.thead.tr>\n                                                <x-admin::table.th class=\"!p-0\" />\n\n                                                <!-- Admin tables heading -->\n                                                <x-admin::table.th>\n                                                    @lang('admin::app.settings.attributes.create.option-name')\n                                                </x-admin::table.th>\n\n                                                <x-admin::table.th>\n                                                    @lang('admin::app.settings.attributes.edit.actions')\n                                                </x-admin::table.th>\n                                            </x-admin::table.thead.tr>\n                                        </x-admin::table.thead>\n\n                                        <!-- Draggable Component -->\n                                        <draggable\n                                            tag=\"tbody\"\n                                            ghost-class=\"draggable-ghost\"\n                                            handle=\".icon-move\"\n                                            v-bind=\"{animation: 200}\"\n                                            :list=\"options\"\n                                            item-key=\"id\"\n                                        >\n                                            <template #item=\"{ element, index }\">\n                                                <x-admin::table.thead.tr class=\"hover:bg-gray-50 dark:hover:bg-gray-950\">\n                                                    <!-- Draggable Icon -->\n                                                    <x-admin::table.td class=\"!px-0 text-center\">\n                                                        <i class=\"icon-move cursor-grab text-xl transition-all group-hover:text-gray-700\"></i>\n\n                                                        <input\n                                                            type=\"hidden\"\n                                                            :name=\"'options[' + element.id + '][position]'\"\n                                                            :value=\"index\"\n                                                        />\n                                                    </x-admin::table.td>\n\n                                                    <!-- Admin -->\n                                                    <x-admin::table.td>\n                                                        <p class=\"dark:text-white\">\n                                                            @{{ element.params.name }}\n                                                        </p>\n\n                                                        <input\n                                                            type=\"hidden\"\n                                                            :name=\"'options[' + element.id + '][name]'\"\n                                                            v-model=\"element.params.name\"\n                                                        />\n                                                    </x-admin::table.td>\n\n                                                    <!-- Actions button -->\n                                                    <x-admin::table.td class=\"!px-0\">\n                                                        <span\n                                                            class=\"icon-edit cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                                            @click=\"editModal(element)\"\n                                                        >\n                                                        </span>\n\n                                                        <span\n                                                            class=\"icon-delete cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                                            @click=\"removeOption(element.id)\"\n                                                        >\n                                                        </span>\n                                                    </x-admin::table.td>\n                                                </x-admin::table.thead.tr>\n                                            </template>\n                                        </draggable>\n                                    </x-admin::table>\n\n                                    {!! view_render_event('admin.settings.attributes.create.table.after') !!}\n                                </template>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n\n                {!! view_render_event('admin.settings.attributes.create.card.label.after') !!}\n\n                {!! view_render_event('admin.settings.attributes.create.card.general.before') !!}\n\n                <!-- Right sub-component -->\n                <div class=\"flex w-[360px] max-w-full flex-col gap-2\">\n                    {!! view_render_event('admin.settings.attributes.create.accordion.general.before') !!}\n\n                    <!-- General -->\n                    <x-admin::accordion>\n                        <x-slot:header>\n                            <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.attributes.create.general')\n                            </p>\n                        </x-slot>\n\n                        <x-slot:content>\n                            {!! view_render_event('admin.settings.attributes.create.form_controls.code.before') !!}\n\n                            <!-- Code -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.attributes.create.code')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"code\"\n                                    name=\"code\"\n                                    rules=\"required\"\n                                    value=\"{{ old('code') }}\"\n                                    :label=\"trans('admin::app.settings.attributes.create.code')\"\n                                    :placeholder=\"trans('admin::app.settings.attributes.create.code')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"code\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.attributes.create.form_controls.code.after') !!}\n\n                            {!! view_render_event('admin.settings.attributes.create.form_controls.select.before') !!}\n\n                            <!-- Attribute Type -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.attributes.create.type')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    id=\"type\"\n                                    class=\"cursor-pointer\"\n                                    name=\"type\"\n                                    rules=\"required\"\n                                    :value=\"old('type')\"\n                                    v-model=\"attributeType\"\n                                    :label=\"trans('admin::app.settings.attributes.create.type')\"\n                                    @change=\"swatchAttribute=true\"\n                                >\n                                    <!-- Here! All Needed types are defined -->\n                                    @foreach(['text', 'textarea', 'price', 'boolean', 'select', 'multiselect', 'checkbox', 'email', 'address', 'phone', 'lookup', 'datetime', 'date', 'image', 'file'] as $type)\n                                        <option\n                                            value=\"{{ $type }}\"\n                                            {{ $type === 'text' ? \"selected\" : '' }}\n                                        >\n                                            @lang('admin::app.settings.attributes.create.'. $type)\n                                        </option>\n                                    @endforeach\n                                </x-admin::form.control-group.control>\n\n                                <x-admin::form.control-group.error control-name=\"type\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.attributes.create.form_controls.select.after') !!}\n\n                            {!! view_render_event('admin.settings.attributes.create.form_controls.entity_type.before') !!}\n\n                            <!-- Entity Type -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.attributes.create.entity-type')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    id=\"entity_type\"\n                                    name=\"entity_type\"\n                                    rules=\"required\"\n                                    value=\"{{ old('entity_type') }}\"\n                                    :label=\"trans('admin::app.settings.attributes.create.entity-type')\"\n                                    :placeholder=\"trans('admin::app.settings.attributes.create.entity-type')\"\n                                >\n\n                                    @foreach (config('attribute_entity_types') as $key => $entityType)\n                                        <option value=\"{{ $key }}\">{{ trans($entityType['name']) }}</option>\n                                    @endforeach\n                                </x-admin::form.control-group.control>\n                                    \n                                <x-admin::form.control-group.error control-name=\"entity_type\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.attributes.create.form_controls.entity_type.after') !!}\n                        </x-slot>\n                    </x-admin::accordion>\n                    \n                    {!! view_render_event('admin.settings.attributes.create.accordion.general.after') !!}\n\n                    {!! view_render_event('admin.settings.attributes.create.accordion.validation.before') !!}\n\n                    <!-- Validations -->\n                    <x-admin::accordion>\n                        <x-slot:header>\n                            <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.attributes.create.validations')\n                            </p>\n                        </x-slot>\n\n                        <x-slot:content>\n                            {!! view_render_event('admin.settings.attributes.create.form_controls.validation.before') !!}\n\n                            <!-- Input Validation -->\n                            <x-admin::form.control-group v-if=\"swatchAttribute && (attributeType == 'text')\">\n                                <x-admin::form.control-group.label>\n                                    @lang('admin::app.settings.attributes.create.input-validation')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    class=\"cursor-pointer\"\n                                    id=\"validation\"\n                                    name=\"validation\"\n                                    :value=\"old('validation')\"\n                                    v-model=\"validationType\"\n                                    :label=\"trans('admin::app.settings.attributes.create.input-validation')\"\n                                    refs=\"validation\"\n                                    @change=\"inputValidation=true\"\n                                >\n                                    <!-- Here! All Needed types are defined -->\n                                    @foreach(['numeric', 'email', 'decimal', 'url'] as $type)\n                                        <option value=\"{{ $type }}\">\n                                            @lang('admin::app.settings.attributes.create.' . $type)\n                                        </option>\n                                    @endforeach\n                                </x-admin::form.control-group.control>\n\n                                <x-admin::form.control-group.error control-name=\"validation\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.attributes.create.form_controls.validation.after') !!}\n\n                            {!! view_render_event('admin.settings.attributes.create.form_controls.is_required.before') !!}\n\n                            <!-- Is Required -->\n                                <x-admin::form.control-group class=\"!mb-2 flex items-center gap-2.5\">\n                                <x-admin::form.control-group.control\n                                    type=\"checkbox\"\n                                    id=\"is_required\"\n                                    name=\"is_required\"\n                                    value=\"1\"\n                                    for=\"is_required\"\n                                />\n\n                                <label\n                                    class=\"cursor-pointer text-xs font-medium text-gray-600 dark:text-gray-300\"\n                                    for=\"is_required\"\n                                >\n                                    @lang('admin::app.settings.attributes.create.is-required')\n                                </label>\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.attributes.create.form_controls.is_required.after') !!}\n\n                            {!! view_render_event('admin.settings.attributes.create.form_controls.is_unique.before') !!}\n\n                            <!-- Is Unique -->\n                            <x-admin::form.control-group class=\"!mb-0 flex select-none items-center gap-2.5\">\n                                <x-admin::form.control-group.control\n                                    type=\"checkbox\"\n                                    id=\"is_unique\"\n                                    name=\"is_unique\"\n                                    value=\"1\"\n                                    for=\"is_unique\"\n                                />\n\n                                <label\n                                    class=\"cursor-pointer text-xs font-medium text-gray-600 dark:text-gray-300\"\n                                    for=\"is_unique\"\n                                >\n                                    @lang('admin::app.settings.attributes.create.is-unique')\n                                </label>\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.attributes.create.form_controls.is_unique.after') !!}\n                        </x-slot>\n                    </x-admin::accordion>\n\n                    {!! view_render_event('admin.settings.attributes.create.accordion.validation.after') !!}\n                </div>\n            </div>\n            \n            {!! view_render_event('admin.settings.attributes.create.card.general.after') !!}\n\n            {!! view_render_event('admin.settings.attributes.create.modal.before') !!}\n\n            <!-- Add Options Model Form -->\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modelForm\"\n            >\n                <form\n                    @submit.prevent=\"handleSubmit($event, storeOptions)\"\n                    enctype=\"multipart/form-data\"\n                    ref=\"createOptionsForm\"\n                >\n                    <x-admin::modal\n                        @toggle=\"listenModal\"\n                        ref=\"addOptionsRow\"\n                    >\n                        <!-- Modal Header !-->\n                        <x-slot:header>\n                            <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.attributes.create.add-option')\n                            </p>\n                        </x-slot>\n\n                        <!-- Modal Content !-->\n                        <x-slot:content>\n                            <!-- Hidden Id Input -->\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"id\"\n                            />\n\n                            {!! view_render_event('admin.settings.attributes.create.form_controls.name.before') !!}\n\n                            <!-- Admin Input -->\n                            <x-admin::form.control-group class=\"mb-2.5 w-full\">\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.attributes.create.option-name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"name\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.attributes.create.option-name')\"\n                                    :placeholder=\"trans('admin::app.settings.attributes.create.option-name')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.attributes.create.form_controls.name.after') !!}\n                        </x-slot>\n\n                        <!-- Modal Footer !-->\n                        <x-slot:footer>\n                            <button\n                                type=\"submit\"\n                                class=\"primary-button\"\n                            >\n                                @lang('admin::app.settings.attributes.create.save-btn')\n                            </button>\n                        </x-slot>\n                    </x-admin::modal>\n                </form>\n            </x-admin::form>\n\n            {!! view_render_event('admin.settings.attributes.create.modal.after') !!}\n        </script>\n\n        <script type=\"module\">\n            app.component('v-create-attributes', {\n                template: '#v-create-attributes-template',\n\n                data() {\n                    return {\n                        optionRowCount: 1,\n\n                        attributeType: '',\n\n                        validationType: '',\n\n                        inputValidation: false,\n\n                        optionType: '',\n\n                        swatchAttribute: false,\n\n                        showSwatch: false,\n\n                        isNullOptionChecked: false,\n\n                        options: [],\n\n                        swatchValue: [],\n\n                        lookupEntityTypes: @json(config('attribute_lookups')),\n                    }\n                },\n\n                computed: {\n                    isFilterableDisabled() {\n                        return this.attributeType == 'lookup' || this.attributeType == 'checkbox'\n                            || this.attributeType == 'select' || this.attributeType == 'multiselect'\n                            ? false : true;\n                    },\n                },\n\n                methods: {\n                    storeOptions(params, { resetForm }) {\n                        if (params.id) {\n                            let foundIndex = this.options.findIndex(item => item.id === params.id);\n\n                            this.options.splice(foundIndex, 1, {\n                                ...this.options[foundIndex],\n                                params: {\n                                    ...this.options[foundIndex].params,\n                                    ...params,\n                                }\n                            });\n                        } else {\n                            this.options.push({\n                                id: 'option_' + this.optionRowCount,\n                                params\n                            });\n\n                            params.id = 'option_' + this.optionRowCount;\n                            this.optionRowCount++;\n                        }\n\n                        let formData = new FormData(this.$refs.createOptionsForm);\n\n                        const sliderImage = formData.get(\"swatch_value[]\");\n\n                        if (sliderImage) {\n                            params.swatch_value = sliderImage;\n                        }\n\n                        this.$refs.addOptionsRow.toggle();\n\n                        if (params.swatch_value instanceof File) {\n                            this.setFile(params);\n                        }\n\n                        resetForm();\n                    },\n\n                    editModal(values) {\n                        values.params.id = values.id;\n\n                        this.$refs.modelForm.setValues(values.params);\n\n                        this.$refs.addOptionsRow.toggle();\n                    },\n\n                    removeOption(id) {\n                        this.$emitter.emit('open-confirm-modal', {\n                            agree: () => {\n                                this.options = this.options.filter(option => option.id !== id);\n\n                                this.$emitter.emit('add-flash', { type: 'success', message: \"@lang('admin::app.catalog.attributes.create.option-deleted')\" });\n                            }\n                        });\n                    },\n\n                    listenModal(event) {\n                        if (! event.isActive) {\n                            this.isNullOptionChecked = false;\n                        }\n                    },\n\n                    setFile(event) {\n                        let dataTransfer = new DataTransfer();\n\n                        dataTransfer.items.add(event.swatch_value);\n                    }\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/attributes/edit.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.settings.attributes.edit.title')\n    </x-slot>\n\n    {!! view_render_event('admin.catalog.attributes.edit.before', ['attribute' => $attribute]) !!}\n\n    <!-- Input Form -->\n    <x-admin::form\n        :action=\"route('admin.settings.attributes.update', $attribute->id)\"\n        encType=\"multipart/form-data\"\n        method=\"PUT\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            {!! view_render_event('admin.settings.attributes.edit.form_controls.before', ['attribute' => $attribute]) !!}\n\n            <!-- actions buttons -->\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.attributes.edit.breadcrumbs.before', ['attribute' => $attribute]) !!}\n\n                    <x-admin::breadcrumbs \n                        name=\"settings.attributes.edit\" \n                        :entity=\"$attribute\"\n                    />\n                   \n                    {!! view_render_event('admin.settings.attributes.edit.breadcrumbs.after', ['attribute' => $attribute]) !!}\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        {!! view_render_event('admin.settings.attributes.edit.title.before', ['attribute' => $attribute]) !!}\n\n                        @lang('admin::app.settings.attributes.edit.title')\n\n                        {!! view_render_event('admin.settings.attributes.edit.title.after', ['attribute' => $attribute]) !!}\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <!-- Create button for Attributes -->\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.attributes.edit.edit_button.before', ['attribute' => $attribute]) !!}\n\n                        @if (bouncer()->hasPermission('settings.automation.attributes.edit'))\n                            <button\n                                type=\"submit\"\n                                class=\"primary-button\"\n                            >\n                                @lang('admin::app.settings.attributes.edit.save-btn')\n                            </button>\n                        @endif\n\n                        {!! view_render_event('admin.settings.attributes.edit.edit_button.after', ['attribute' => $attribute]) !!}\n                    </div>\n                </div>\n            </div>\n\n            <!-- Edit Attributes Vue Components -->\n            <v-edit-attributes>\n                <!-- Shimmer Effect -->\n                <x-admin::shimmer.settings.attributes />\n            </v-edit-attributes>\n\n            {!! view_render_event('admin.settings.attributes.edit.form_controls.after', ['attribute' => $attribute]) !!}\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.catalog.attributes.edit.after', ['attribute' => $attribute]) !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-edit-attributes-template\"\n        >\n            <!-- body content -->\n            <div class=\"flex gap-2.5 max-xl:flex-wrap\">\n                <!-- Left sub Component -->\n                {!! view_render_event('admin.catalog.attributes.edit.card.label.before', ['attribute' => $attribute]) !!}\n                \n                <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                    <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                        <p class=\"mb-4 text-base font-semibold text-gray-800 dark:text-white\">\n                            @lang('admin::app.settings.attributes.edit.labels')\n                        </p>\n\n                        {!! view_render_event('admin.settings.attributes.edit.form_controls.name.before', ['attribute' => $attribute]) !!}\n\n                        <!-- Admin name -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.attributes.edit.name')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"text\"\n                                name=\"name\"\n                                rules=\"required\"\n                                :value=\"old('name') ?: $attribute->name\"\n                                :label=\"trans('admin::app.settings.attributes.edit.name')\"\n                                :placeholder=\"trans('admin::app.settings.attributes.edit.name')\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"name\" />\n                        </x-admin::form.control-group>\n\n                        {!! view_render_event('admin.settings.attributes.edit.form_controls.name.after', ['attribute' => $attribute]) !!}\n\n                        <!-- Options -->\n                        <div\n                            class=\" {{ in_array($attribute->type, ['select', 'multiselect', 'checkbox', 'lookup']) ?: 'hidden' }}\"\n                            v-if=\"showSwatch\"\n                        >\n                            <div class=\"mb-3 flex items-center justify-between\">\n                                <p class=\"mb-4 text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.attributes.edit.options')\n                                </p>\n\n                                <!-- Add Row Button -->\n                                <div\n                                    v-if=\"optionType == 'options' && attributeType != 'lookup'\"\n                                    class=\"secondary-button text-sm\"\n                                    @click=\"$refs.addOptionsRow.toggle();swatchValue=''\"\n                                >\n                                    @lang('admin::app.settings.attributes.edit.add-option')\n                                </div>\n                            </div>\n\n                            <!-- For Attribute Options If Data Exist -->\n                            <div class=\"mt-4 overflow-x-auto\">\n                                <div class=\"flex gap-4 max-sm:flex-wrap\">\n                                    {!! view_render_event('admin.settings.attributes.edit.form_controls.option_type.before', ['attribute' => $attribute]) !!}\n\n                                    <!-- Input Option Type -->\n                                    <x-admin::form.control-group\n                                        v-if=\"attributeType != 'lookup'\"\n                                        class=\"mb-2.5 w-1/2\"\n                                    >\n                                        <x-admin::form.control-group.label>\n                                            @lang('admin::app.settings.attributes.create.option-type')\n                                        </x-admin::form.control-group.label>\n                                \n                                        <x-admin::form.control-group.control\n                                            type=\"select\"\n                                            id=\"optionType\"\n                                            name=\"option_type\"\n                                            :value=\"old('optionType')\"\n                                            v-model=\"optionType\"\n                                            @change=\"showSwatch=true\"\n                                        >\n                                            <option value=\"lookup\">\n                                                @lang('admin::app.settings.attributes.create.lookup')\n                                            </option>\n\n                                            <option value=\"options\">\n                                                @lang('admin::app.settings.attributes.create.options')\n                                            </option>\n                                        </x-admin::form.control-group.control>\n                                \n                                        <x-admin::form.control-group.error\n                                            class=\"mt-3\"\n                                            control-name=\"admin\"\n                                        />\n                                    </x-admin::form.control-group>\n\n                                    {!! view_render_event('admin.settings.attributes.edit.form_controls.option_type.after', ['attribute' => $attribute]) !!}\n\n                                    {!! view_render_event('admin.settings.attributes.edit.form_controls.lookup_type.before', ['attribute' => $attribute]) !!}\n                                \n                                    <!-- Input Lookup Type -->\n                                    <x-admin::form.control-group v-if=\"attributeType == 'lookup' || (optionType == 'lookup')\" class=\"mb-2.5 w-1/2\">\n                                        <x-admin::form.control-group.label>\n                                            @lang('admin::app.settings.attributes.create.lookup-type')\n                                        </x-admin::form.control-group.label>\n                                \n                                        <x-admin::form.control-group.control\n                                            type=\"select\"\n                                            id=\"lookup_type\"\n                                            name=\"lookup_type\"\n                                            :value=\"$attribute->lookup_type\"\n                                            @change=\"showSwatch=true\"\n                                        >\n                                            <option\n                                                :key=\"index\"\n                                                :value=\"index\"\n                                                v-text=\"entityType.name\"\n                                                v-for=\"(entityType, index) in lookupEntityTypes\"\n                                            ></option>\n                                        </x-admin::form.control-group.control>\n                                \n                                        <x-admin::form.control-group.error\n                                            class=\"mt-3\"\n                                            control-name=\"admin\"\n                                        />\n                                    </x-admin::form.control-group>\n\n                                    {!! view_render_event('admin.settings.attributes.edit.form_controls.lookup_type.after', ['attribute' => $attribute]) !!}\n                                </div>\n                                    \n                                <template v-if=\"optionsData?.length\">\n                                    @if (\n                                        $attribute->type == 'select'\n                                        || $attribute->type == 'multiselect'\n                                        || $attribute->type == 'checkbox'\n                                        || $attribute->type == 'lookup'\n                                    )\n                                        {!! view_render_event('admin.settings.attributes.edit.table.before', ['attribute' => $attribute]) !!}\n\n                                        <!-- Table Information -->\n                                        <x-admin::table>\n                                            <x-admin::table.thead>\n                                                <x-admin::table.thead.tr>\n                                                    <x-admin::table.th></x-admin::table.th>\n                                                    <!-- Admin tables heading -->\n                                                    <x-admin::table.th>\n                                                        @lang('admin::app.settings.attributes.edit.option-name')\n                                                    </x-admin::table.th>\n\n                                                    <x-admin::table.th>\n                                                        @lang('admin::app.settings.attributes.edit.actions')\n                                                    </x-admin::table.th>\n                                                </x-admin::table.thead.tr>\n                                            </x-admin::table.thead>\n\n                                            <!-- Draggable Component -->\n                                            <draggable\n                                                tag=\"tbody\"\n                                                ghost-class=\"draggable-ghost\"\n                                                handle=\".icon-move\"\n                                                v-bind=\"{animation: 200}\"\n                                                :list=\"optionsData\"\n                                                item-key=\"id\"\n                                            >\n                                                <template #item=\"{ element, index }\">\n                                                    <x-admin::table.thead.tr\n                                                        class=\"hover:bg-gray-50 dark:hover:bg-gray-950\"\n                                                        v-show=\"! element.isDelete\"\n                                                    >\n                                                        <input\n                                                            type=\"hidden\"\n                                                            :name=\"'options[' + element.id + '][isNew]'\"\n                                                            :value=\"element.isNew\"\n                                                        >\n\n                                                        <input\n                                                            type=\"hidden\"\n                                                            :name=\"'options[' + element.id + '][isDelete]'\"\n                                                            :value=\"element.isDelete\"\n                                                        >\n\n                                                        <!-- Draggable Icon -->\n                                                        <x-admin::table.td class=\"!px-0 text-center\">\n                                                            <i class=\"icon-move cursor-grab text-xl transition-all group-hover:text-gray-700\"></i>\n\n                                                            <input\n                                                                type=\"hidden\"\n                                                                :name=\"'options[' + element.id + '][sort_order]'\"\n                                                                :value=\"index\"\n                                                            />\n                                                        </x-admin::table.td>\n\n                                                        <!-- Admin-->\n                                                        <x-admin::table.td>\n                                                            <p class=\"dark:text-white\">\n                                                                @{{ element.name }}\n                                                            </p>\n\n                                                            <input\n                                                                type=\"hidden\"\n                                                                :name=\"'options[' + element.id + '][name]'\"\n                                                                v-model=\"element.name\"\n                                                            />\n                                                        </x-admin::table.td>\n\n                                                        <!-- Actions Button -->\n                                                        <x-admin::table.td class=\"!px-0\">\n                                                            <span\n                                                                class=\"icon-edit cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                                                @click=\"editOptions(element)\"\n                                                            >\n                                                            </span>\n\n                                                            <span\n                                                                class=\"icon-delete cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                                                @click=\"removeOption(element.id)\"\n                                                            >\n                                                            </span>\n                                                        </x-admin::table.td>\n                                                    </x-admin::table.thead.tr>\n                                                </template>\n                                            </draggable>\n                                        </x-admin::table>\n\n                                        {!! view_render_event('admin.settings.attributes.edit.table.after', ['attribute' => $attribute]) !!}\n                                    @endif\n                                </template>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n                \n                {!! view_render_event('admin.catalog.attributes.edit.card.label.after', ['attribute' => $attribute]) !!}\n\n                <!-- Right sub-component -->\n                <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                    {!! view_render_event('admin.settings.attributes.edit.accordian.general.before', ['attribute' => $attribute]) !!}\n\n                    <!-- General -->\n                    <x-admin::accordion>\n                        <x-slot:header>\n                            <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.attributes.edit.general')\n                            </p>\n                        </x-slot>\n\n                        <x-slot:content>\n                            {!! view_render_event('admin.settings.attributes.edit.form_controls.code.before', ['attribute' => $attribute]) !!}\n\n                            <!-- Attribute Code -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.attributes.edit.code')\n                                </x-admin::form.control-group.label>\n\n                                @php\n                                    $selectedOption = old('type') ?: $attribute->code;\n                                @endphp\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    class=\"cursor-not-allowed\"\n                                    name=\"code\"\n                                    rules=\"required\"\n                                    :value=\"$selectedOption\"\n                                    :disabled=\"(boolean) $selectedOption\"\n                                    readonly\n                                    :label=\"trans('admin::app.settings.attributes.edit.code')\"\n                                    :placeholder=\"trans('admin::app.settings.attributes.edit.code')\"\n                                />\n\n                                <x-admin::form.control-group.control\n                                    type=\"hidden\"\n                                    name=\"code\"\n                                    :value=\"$selectedOption\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"code\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.attributes.edit.form_controls.code.after', ['attribute' => $attribute]) !!}\n\n                            {!! view_render_event('admin.settings.attributes.edit.form_controls.type.before', ['attribute' => $attribute]) !!}\n\n                            <!-- Attribute Type -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.attributes.edit.type')\n                                </x-admin::form.control-group.label>\n\n                                @php\n                                    $selectedOption = old('type') ?: $attribute->type;\n                                @endphp\n\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    id=\"type\"\n                                    class=\"cursor-not-allowed\"\n                                    name=\"type\"\n                                    rules=\"required\"\n                                    :value=\"$selectedOption\"\n                                    :disabled=\"(boolean) $selectedOption\"\n                                    :label=\"trans('admin::app.settings.attributes.edit.type')\"\n                                >\n                                    <!-- Here! All Needed types are defined -->\n                                    @foreach(['text', 'textarea', 'price', 'boolean', 'select', 'multiselect', 'checkbox', 'email', 'address', 'phone', 'lookup', 'datetime', 'date', 'image', 'file'] as $type)\n                                        <option\n                                            value=\"{{ $type }}\"\n                                            {{ $selectedOption == $type ? 'selected' : '' }}\n                                        >\n                                            @lang('admin::app.settings.attributes.edit.'. $type)\n                                        </option>\n                                    @endforeach\n                                </x-admin::form.control-group.control>\n\n                                <x-admin::form.control-group.control\n                                    type=\"hidden\"\n                                    name=\"type\"\n                                    :value=\"$attribute->type\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"type\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.attributes.edit.form_controls.type.after', ['attribute' => $attribute]) !!}\n\n                            {!! view_render_event('admin.settings.attributes.edit.form_controls.entity_type.before', ['attribute' => $attribute]) !!}\n\n                            <!-- Entity Type -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.attributes.create.entity-type')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    id=\"entity_type\"\n                                    name=\"entity_type\"\n                                    rules=\"required\"\n                                    :value=\"$attribute->entity_type\"\n                                    :label=\"trans('admin::app.settings.attributes.create.entity-type')\"\n                                    :placeholder=\"trans('admin::app.settings.attributes.create.entity-type')\"\n                                >\n\n                                    @foreach (config('attribute_entity_types') as $key => $entityType)\n                                        <option value=\"{{ $key }}\">{{ trans($entityType['name']) }}</option>\n                                    @endforeach\n                                </x-admin::form.control-group.control>\n                                    \n                                <x-admin::form.control-group.error control-name=\"entity_type\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.attributes.edit.form_controls.entity_type.after', ['attribute' => $attribute]) !!}\n                        </x-slot>\n                    </x-admin::accordion>\n                    \n                    {!! view_render_event('admin.settings.attributes.edit.accordian.general.after', ['attribute' => $attribute]) !!}\n\n                    {!! view_render_event('admin.settings.attributes.edit.accordian.validations.before', ['attribute' => $attribute]) !!}\n\n                    <!-- Validations -->\n                    <x-admin::accordion>\n                        <x-slot:header>\n                            <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.attributes.edit.validations')\n                            </p>\n                        </x-slot>\n\n                        <x-slot:content>\n                            <!-- Input Validation -->\n                            @if($attribute->type == 'text')\n                                {!! view_render_event('admin.settings.attributes.edit.form_controls.select.before', ['attribute' => $attribute]) !!}\n\n                                <x-admin::form.control-group>\n                                    <x-admin::form.control-group.label>\n                                        @lang('admin::app.settings.attributes.edit.input-validation')\n                                    </x-admin::form.control-group.label>\n\n                                    <x-admin::form.control-group.control\n                                        type=\"select\"\n                                        class=\"cursor-not-allowed\"\n                                        name=\"validation\"\n                                        :value=\"$attribute->validation\"\n                                        disabled=\"disabled\"\n                                    >\n                                        <!-- Here! All Needed types are defined -->\n                                        @foreach(['numeric', 'email', 'decimal', 'url'] as $type)\n                                            <option value=\"{{ $type }}\" {{ $attribute->validation == $type ? 'selected' : '' }}>\n                                                @lang('admin::app.settings.attributes.edit.' . $type)\n                                            </option>\n                                        @endforeach\n                                    </x-admin::form.control-group.control>\n                                </x-admin::form.control-group>\n\n                                {!! view_render_event('admin.settings.attributes.edit.form_controls.select.after', ['attribute' => $attribute]) !!}\n                            @endif\n\n                            {!! view_render_event('admin.settings.attributes.edit.form_controls.is_required.before', ['attribute' => $attribute]) !!}\n\n                            <!-- Is Required -->\n                            <x-admin::form.control-group class=\"!mb-2 flex select-none items-center gap-2.5\">\n                                @php\n                                    $selectedOption = old('is_required') ?? $attribute->is_required\n                                @endphp\n\n                                <x-admin::form.control-group.control\n                                    type=\"hidden\"\n                                    name=\"is_required\"\n                                    :value=\"(boolean) $selectedOption\"\n                                />\n\n                                <x-admin::form.control-group.control\n                                    type=\"checkbox\"\n                                    name=\"is_required\"\n                                    id=\"is_required\"\n                                    for=\"is_required\"\n                                    value=\"1\"\n                                    :checked=\"(boolean) $selectedOption\"\n                                />\n\n                                <label\n                                    class=\"cursor-pointer text-xs font-medium text-gray-600 dark:text-gray-300\"\n                                    for=\"is_required\"\n                                >\n                                    @lang('admin::app.settings.attributes.edit.is-required')\n                                </label>\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.attributes.edit.form_controls.is_required.after', ['attribute' => $attribute]) !!}\n\n                            {!! view_render_event('admin.settings.attributes.edit.form_controls.is_unique.before', ['attribute' => $attribute]) !!}\n\n                            <!-- Is Unique -->\n                            <x-admin::form.control-group class=\"!mb-0 flex select-none items-center gap-2.5\">\n                                <x-admin::form.control-group.control\n                                    type=\"checkbox\"\n                                    id=\"is_unique\"\n                                    name=\"is_unique\"\n                                    value=\"1\"\n                                    for=\"is_unique\"\n                                    :checked=\"(boolean) $attribute->is_unique\"\n                                    :disabled=\"(boolean) $attribute->is_unique\"\n                                />\n\n                                <label\n                                    class=\"cursor-pointer text-xs font-medium text-gray-600 dark:text-gray-300\"\n                                    for=\"is_unique\"\n                                >\n                                    @lang('admin::app.settings.attributes.edit.is-unique')\n                                </label>    \n\n                                <x-admin::form.control-group.control\n                                    type=\"hidden\"\n                                    :name=\"$type\"\n                                    :value=\"$attribute->is_unique\"\n                                />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.attributes.edit.form_controls.is_unique.after', ['attribute' => $attribute]) !!}\n                        </x-slot>\n                    </x-admin::accordion>\n\n                    {!! view_render_event('admin.settings.attributes.edit.accordian.validations.after', ['attribute' => $attribute]) !!}\n                </div>\n            </div>\n\n            <!-- Add Options Model Form -->\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modelForm\"\n            >\n                <form\n                    @submit.prevent=\"handleSubmit($event, storeOptions)\"\n                    enctype=\"multipart/form-data\"\n                    ref=\"editOptionsForm\"\n                >\n                    <x-admin::modal\n                        @toggle=\"listenModel\"\n                        ref=\"addOptionsRow\"\n                    >\n                        <!-- Modal Header -->\n                        <x-slot:header>\n                            <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.attributes.edit.add-option')\n                            </p>\n                        </x-slot>\n\n                        <!-- Modal Content -->\n                        <x-slot:content>\n                            <!-- Hidden Id Input -->\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"id\"\n                            />\n\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"isNew\"\n                                ::value=\"optionIsNew\"\n                            />\n\n                            {!! view_render_event('admin.settings.attributes.edit.form_controls.name.before', ['attribute' => $attribute]) !!}\n\n                            <!-- Admin Input -->\n                            <x-admin::form.control-group class=\"mb-2.5 w-full\">\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.attributes.edit.option-name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"name\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.attributes.edit.option-name')\"\n                                    :placeholder=\"trans('admin::app.settings.attributes.edit.option-name')\"\n                                    ref=\"inputAdmin\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.attributes.edit.form_controls.name.after', ['attribute' => $attribute]) !!}\n                        </x-slot>\n\n                        <!-- Modal Footer -->\n                        <x-slot:footer>\n                            <!-- Save Button -->\n                            <button\n                                type=\"submit\"\n                                class=\"primary-button\"\n                            >\n                                @lang('admin::app.settings.attributes.edit.save-btn')\n                            </button>\n                        </x-slot>\n                    </x-admin::modal>\n                </form>\n            </x-admin::form>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-edit-attributes', {\n                template: '#v-edit-attributes-template',\n\n                data() {\n                    return {\n                        showSwatch: {{ in_array($attribute->type, ['select', 'checkbox', 'lookup', 'multiselect']) ? 'true' : 'false' }},\n\n                        isNullOptionChecked: false,\n\n                        swatchValue: [\n                            {\n                                image: [],\n                            }\n                        ],\n\n                        optionsData: [],\n\n                        optionIsNew: true,\n\n                        optionId: 0,\n\n                        lookupEntityTypes: @json(config('attribute_lookups')),\n\n                        optionType: \"{{ $attribute->lookup_type ? 'lookup' : 'options' }}\",\n                    }\n                },\n\n                created () {\n                    this.getAttributesOption();\n                },\n\n                methods: {\n                    storeOptions(params, { resetForm, setValues }) {\n                        if (! params.id) {\n                            params.id = 'option_' + this.optionId;\n                            this.optionId++;\n                        }\n\n                        let foundIndex = this.optionsData.findIndex(item => item.id === params.id);\n\n                        if (foundIndex !== -1) {\n                            this.optionsData.splice(foundIndex, 1, params);\n                        } else {\n                            this.optionsData.push(params);\n                        }\n\n                        let formData = new FormData(this.$refs.editOptionsForm);\n\n                        const sliderImage = formData.get(\"swatch_value[]\");\n\n                        if (sliderImage) {\n                            params.swatch_value = sliderImage;\n                        }\n\n                        this.$refs.addOptionsRow.toggle();\n\n                        if (params.swatch_value instanceof File) {\n                            this.setFile(sliderImage, params.id);\n                        }\n\n                        resetForm();\n                    },\n\n                    editOptions(value) {\n                        this.optionIsNew = false;\n\n                        this.$refs.modelForm.setValues(value);\n\n                        this.$refs.addOptionsRow.toggle();\n                    },\n\n                    removeOption(id) {\n                        this.$emitter.emit('open-confirm-modal', {\n                            agree: () => {\n                                let foundIndex = this.optionsData.findIndex(item => item.id === id);\n\n                                if (foundIndex !== -1) {\n                                    if (this.optionsData[foundIndex].isNew) {\n                                        this.optionsData.splice(foundIndex, 1);\n                                    } else {\n                                        this.optionsData[foundIndex].isDelete = true;\n                                    }\n                                }\n\n                                this.$emitter.emit('add-flash', { type: 'success', message: \"@lang('admin::app.settings.attributes.edit.option-deleted')\" });\n                            }\n                        });\n                    },\n\n                    listenModel(event) {\n                        if (! event.isActive) {\n                            this.isNullOptionChecked = false;\n                        }\n                    },\n\n                    getAttributesOption() {\n                        this.$axios.get(`{{ route('admin.settings.attributes.options', $attribute->id) }}`)\n                            .then(response => {\n                                let options = response.data;\n\n                                options.forEach((option) => {\n                                    let row = {\n                                        'id': option.id,\n                                        'name': option.name,\n                                        'sort_order': option.sort_order,\n                                        'attribute_id': option.attribute_id,\n                                        'isNew': false,\n                                        'isDelete': false,\n                                    };\n\n                                    if (! option.label) {\n                                        this.isNullOptionChecked = true;\n\n                                        row['notRequired'] = true;\n                                    } else {\n                                        row['notRequired'] = false;\n                                    }\n\n                                    this.optionsData.push(row);\n                                });\n                            });\n                    },\n\n                    setFile(file, id) {\n                        let dataTransfer = new DataTransfer();\n\n                        dataTransfer.items.add(file);\n                    }\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/attributes/index.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.settings.attributes.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.settings.attributes.index.breadcrumbs.before') !!}\n\n                <!-- breadcrumbs -->\n                <x-admin::breadcrumbs name=\"settings.attributes\" />\n\n                {!! view_render_event('admin.settings.attributes.index.breadcrumbs.after') !!}\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    <!-- Title -->\n                    @lang('admin::app.settings.attributes.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <!-- Create Button for Attributes -->\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.settings.attributes.index.create_button.before') !!}\n\n                    @if (bouncer()->hasPermission('settings.automation.attributes.create'))\n                        <a\n                            href=\"{{ route('admin.settings.attributes.create') }}\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.attributes.index.create-btn')\n                        </a>\n                    @endif\n\n                    {!! view_render_event('admin.settings.attributes.index.create_button.after') !!}\n                </div>\n            </div>\n        </div>\n\n        {!! view_render_event('admin.settings.attributes.index.datagrid.before') !!}\n\n        <!-- DataGrid -->\n        <x-admin::datagrid :src=\"route('admin.settings.attributes.index')\">\n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </x-admin::datagrid>\n\n        {!! view_render_event('admin.settings.attributes.index.datagrid.after') !!}\n    </div>\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/create.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.data-transfer.imports.create.title')\n    </x-slot>\n\n    {!! view_render_event('admin.settings.data_transfer.imports.create.before') !!}\n\n    <x-admin::form\n        :action=\"route('admin.settings.data_transfer.imports.store')\"\n        enctype=\"multipart/form-data\"\n    >\n        {!! view_render_event('admin.settings.data_transfer.imports.create.create_form_controls.before') !!}\n\n        <!-- Page Header -->\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.settings.data_transfers.create.breadcrumbs.before') !!}\n\n                <!-- Breadcrumbs -->\n                <x-admin::breadcrumbs name=\"settings.data_transfers.create\" />\n\n                {!! view_render_event('admin.settings.data_transfers.create.breadcrumbs.after') !!}\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    @lang('admin::app.settings.data-transfer.imports.create.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <!-- Create button for person -->\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.settings.data_transfers.create.save_button.before') !!}\n\n                    @if (bouncer()->hasPermission('settings.automation.data_transfer.imports.create'))\n                        <!-- Save Button -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.data-transfer.imports.create.save-btn')\n                        </button>\n                    @endif\n\n                    {!! view_render_event('admin.settings.data_transfers.create.save_button.after') !!}\n                </div>\n            </div>\n        </div>\n\n        <!-- Body Content -->\n        <div class=\"mt-3.5 flex gap-2.5 max-xl:flex-wrap\">\n            <!-- Left Container -->\n            <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                {!! view_render_event('admin.settings.data_transfer.imports.create.card.general.before') !!}\n\n                <!-- Setup Import Panel -->\n                <div class=\"box-shadow rounded bg-white p-4 dark:bg-gray-900\">\n                    <p class=\"mb-4 text-base font-semibold text-gray-800 dark:text-white\">\n                        @lang('admin::app.settings.data-transfer.imports.create.general')\n                    </p>\n\n                    <!-- Type -->\n                    <x-admin::form.control-group>\n                        <x-admin::form.control-group.label class=\"required\">\n                            @lang('admin::app.settings.data-transfer.imports.create.type')\n                        </x-admin::form.control-group.label>\n\n                        <x-admin::form.control-group.control\n                            type=\"select\"\n                            name=\"type\"\n                            id=\"import-type\"\n                            :value=\"old('type') ?? 'persons'\"\n                            ref=\"importType\"\n                            rules=\"required\"\n                            :label=\"trans('admin::app.settings.data-transfer.imports.create.type')\"\n                        >\n                            @foreach (config('importers') as $code => $importer)\n                                <option value=\"{{ $code }}\">@lang($importer['title'])</option>\n                            @endforeach\n                        </x-admin::form.control-group.control>\n\n                        <!-- Source Sample Download Links -->\n                        <a\n                            :href=\"'{{ route('admin.settings.data_transfer.imports.download_sample') }}/' + $refs['importType']?.value\"\n                            target=\"_blank\"\n                            id=\"source-sample-link\"\n                            class=\"mt-1 cursor-pointer text-sm text-brandColor transition-all hover:underline\"\n                        >\n                            @lang('admin::app.settings.data-transfer.imports.create.download-sample')\n                        </a>\n\n                        <x-admin::form.control-group.error control-name=\"type\" />\n                    </x-admin::form.control-group>\n\n                    <!-- Images Directory Path -->\n                    <x-admin::form.control-group>\n                        <x-admin::form.control-group.label class=\"required\">\n                            @lang('admin::app.settings.data-transfer.imports.create.file')\n                        </x-admin::form.control-group.label>\n\n                        <x-admin::form.control-group.control\n                            type=\"file\"\n                            name=\"file\"\n                            rules=\"required\"\n                            :label=\"trans('admin::app.settings.data-transfer.imports.create.file')\"\n                        />\n\n                        <x-admin::form.control-group.error control-name=\"file\" />\n                    </x-admin::form.control-group>\n                </div>\n\n                {!! view_render_event('admin.settings.data_transfer.imports.create.card.general.after') !!}\n            </div>\n\n            <!-- Right Container -->\n            <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                {!! view_render_event('admin.settings.data_transfer.imports.create.card.accordion.settings.before') !!}\n\n                <!-- Settings Panel -->\n                <x-admin::accordion>\n                    <x-slot:header>\n                        <div class=\"flex items-center justify-between\">\n                            <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.data-transfer.imports.create.settings')\n                            </p>\n                        </div>\n                    </x-slot>\n\n                    <x-slot:content>\n                        <!-- Action -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.data-transfer.imports.create.action')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"select\"\n                                name=\"action\"\n                                id=\"action\"\n                                :value=\"old('action') ?? 'append'\"\n                                rules=\"required\"\n                                :label=\"trans('admin::app.settings.data-transfer.imports.create.action')\"\n                            >\n                                <option value=\"append\">@lang('admin::app.settings.data-transfer.imports.create.create-update')</option>\n                                <option value=\"delete\">@lang('admin::app.settings.data-transfer.imports.create.delete')</option>\n                            </x-admin::form.control-group.control>\n\n                            <x-admin::form.control-group.error control-name=\"action\" />\n                        </x-admin::form.control-group>\n\n                        <!-- Validation Strategy -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.data-transfer.imports.create.validation-strategy')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"select\"\n                                name=\"validation_strategy\"\n                                id=\"validation_strategy\"\n                                :value=\"old('validation_strategy') ?? 'stop-on-errors'\"\n                                rules=\"required\"\n                                :label=\"trans('admin::app.settings.data-transfer.imports.create.validation-strategy')\"\n                            >\n                                <option value=\"stop-on-errors\">@lang('admin::app.settings.data-transfer.imports.create.stop-on-errors')</option>\n                                <option value=\"skip-erros\">@lang('admin::app.settings.data-transfer.imports.create.skip-errors')</option>\n                            </x-admin::form.control-group.control>\n\n                            <x-admin::form.control-group.error control-name=\"validation_strategy\" />\n                        </x-admin::form.control-group>\n\n                        <!-- Allowed Errors -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.data-transfer.imports.create.allowed-errors')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"text\"\n                                name=\"allowed_errors\"\n                                :value=\"old('allowed_errors') ?? 10\"\n                                rules=\"required\"\n                                :label=\"trans('admin::app.settings.data-transfer.imports.create.allowed-errors')\"\n                                :placeholder=\"trans('admin::app.settings.data-transfer.imports.create.allowed-errors')\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"allowed_errors\" />\n                        </x-admin::form.control-group>\n\n                        <!-- CSV Field Separator -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.data-transfer.imports.create.field-separator')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"text\"\n                                name=\"field_separator\"\n                                :value=\"old('field_separator') ?? ','\"\n                                rules=\"required\"\n                                :label=\"trans('admin::app.settings.data-transfer.imports.create.field-separator')\"\n                                :placeholder=\"trans('admin::app.settings.data-transfer.imports.create.field-separator')\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"field_separator\" />\n                        </x-admin::form.control-group>\n\n                        <!-- Process In Queue -->\n                        <x-admin::form.control-group class=\"!mb-0\">\n                            <x-admin::form.control-group.label>\n                                @lang('admin::app.settings.data-transfer.imports.create.process-in-queue')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"switch\"\n                                name=\"process_in_queue\"\n                                id=\"maintenance-mode-status\"\n                                :checked=\"false\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"process_in_queue\" />\n                        </x-admin::form.control-group>\n                    </x-slot>\n                </x-admin::accordion>\n\n                {!! view_render_event('admin.settings.data_transfer.imports.create.card.accordion.settings.after') !!}\n            </div>\n        </div>\n\n        {!! view_render_event('admin.settings.data_transfer.imports.create.create_form_controls.after') !!}\n    </x-admin::form>\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/edit.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.data-transfer.imports.edit.title')\n    </x-slot>\n\n    {!! view_render_event('admin.settings.data_transfer.imports.edit.before', ['import' => $import]) !!}\n\n    <x-admin::form\n        :action=\"route('admin.settings.data_transfer.imports.update', $import->id)\"\n        method=\"PUT\"\n        enctype=\"multipart/form-data\"\n    >\n        {!! view_render_event('admin.settings.data_transfer.imports.edit.edit_form_controls.before', ['import' => $import]) !!}\n\n        <!-- Page Header -->\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.settings.data_transfers.edit.breadcrumbs.before') !!}\n\n                <!-- Breadcrumbs -->\n                <x-admin::breadcrumbs\n                    name=\"settings.data_transfers.edit\"\n                    :entity=\"$import\"\n                />\n\n                {!! view_render_event('admin.settings.data_transfers.edit.breadcrumbs.after') !!}\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    @lang('admin::app.settings.data-transfer.imports.edit.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <!-- Create button for person -->\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.settings.data_transfers.edit.save_button.before') !!}\n\n                    @if (bouncer()->hasPermission('settings.automation.data_transfer.imports.edit'))\n                        <!-- Save Button -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.data-transfer.imports.edit.save-btn')\n                        </button>\n                    @endif\n\n                    {!! view_render_event('admin.settings.data_transfers.edit.save_button.after') !!}\n                </div>\n            </div>\n        </div>\n\n        <!-- Body Content -->\n        <div class=\"mt-3.5 flex gap-2.5 max-xl:flex-wrap\">\n            <!-- Left Container -->\n            <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                {!! view_render_event('admin.settings.data_transfer.imports.edit.card.general.before', ['import' => $import]) !!}\n\n                <!-- Setup Import Panel -->\n                <div class=\"box-shadow rounded bg-white p-4 dark:bg-gray-900\">\n                    <p class=\"mb-4 text-base font-semibold text-gray-800 dark:text-white\">\n                        @lang('admin::app.settings.data-transfer.imports.edit.general')\n                    </p>\n\n                    <!-- Type -->\n                    <x-admin::form.control-group>\n                        <x-admin::form.control-group.label class=\"required\">\n                            @lang('admin::app.settings.data-transfer.imports.edit.type')\n                        </x-admin::form.control-group.label>\n\n                        <div class=\"flex flex-col gap-0.5\">\n                            <x-admin::form.control-group.control\n                                type=\"select\"\n                                name=\"type\"\n                                id=\"type\"\n                                :value=\"old('type') ?? $import->type\"\n                                ref=\"importType\"\n                                rules=\"required\"\n                                :label=\"trans('admin::app.settings.data-transfer.imports.edit.type')\"\n                            >\n                                @foreach (config('importers') as $code => $importer)\n                                    <option value=\"{{ $code }}\">@lang($importer['title'])</option>\n                                @endforeach\n                            </x-admin::form.control-group.control>\n\n                            <!-- Source Sample Download Links -->\n                            <a\n                                :href=\"'{{ route('admin.settings.data_transfer.imports.download_sample') }}/' + $refs['importType']?.value\"\n                                target=\"_blank\"\n                                id=\"source-sample-link\"\n                                class=\"mt-1 cursor-pointer text-sm text-brandColor transition-all hover:underline\"\n                            >\n                                @lang('admin::app.settings.data-transfer.imports.edit.download-sample')\n                            </a>\n                        </div>\n\n                        <x-admin::form.control-group.error control-name=\"type\" />\n                    </x-admin::form.control-group>\n\n                    <!-- Images Directory Path -->\n                    <x-admin::form.control-group>\n                        <x-admin::form.control-group.label>\n                            @lang('admin::app.settings.data-transfer.imports.edit.file')\n                        </x-admin::form.control-group.label>\n\n                        <div class=\"flex flex-col gap-0.5\">\n                            <x-admin::form.control-group.control\n                                type=\"file\"\n                                name=\"file\"\n                                :label=\"trans('admin::app.settings.data-transfer.imports.edit.file')\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"file\" />\n\n                            @if ($import?->file_path)\n                                <!-- Uploaded File Link -->\n                                <a\n                                    href=\"{{ route('admin.settings.data_transfer.imports.download', $import?->id) }}\"\n                                    target=\"_blank\"\n                                    id=\"uploaded-file-link\"\n                                    class=\"mt-1 cursor-pointer text-sm text-brandColor transition-all hover:underline\"\n                                >\n                                   {{ $import?->file_name }}\n                                </a>\n                            @endif\n                        </div>\n                    </x-admin::form.control-group>\n                </div>\n\n                {!! view_render_event('admin.settings.data_transfer.imports.edit.card.general.after', ['import' => $import]) !!}\n            </div>\n\n            <!-- Right Container -->\n            <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                {!! view_render_event('admin.settings.data_transfer.imports.edit.card.accordion.settings.before', ['import' => $import]) !!}\n\n                <!-- Settings Panel -->\n                <x-admin::accordion>\n                    <x-slot:header>\n                        <div class=\"flex items-center justify-between\">\n                            <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.data-transfer.imports.edit.settings')\n                            </p>\n                        </div>\n                    </x-slot>\n\n                    <x-slot:content>\n                        <!-- Action -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.data-transfer.imports.edit.action')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"select\"\n                                name=\"action\"\n                                id=\"action\"\n                                :value=\"old('action') ?? $import->action\"\n                                rules=\"required\"\n                                :label=\"trans('admin::app.settings.data-transfer.imports.edit.action')\"\n                            >\n                                <option value=\"append\">@lang('admin::app.settings.data-transfer.imports.edit.create-update')</option>\n                                <option value=\"delete\">@lang('admin::app.settings.data-transfer.imports.edit.delete')</option>\n                            </x-admin::form.control-group.control>\n\n                            <x-admin::form.control-group.error control-name=\"action\" />\n                        </x-admin::form.control-group>\n\n                        <!-- Validation Strategy -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.data-transfer.imports.edit.validation-strategy')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"select\"\n                                name=\"validation_strategy\"\n                                id=\"validation_strategy\"\n                                :value=\"old('validation_strategy') ?? $import->validation_strategy\"\n                                rules=\"required\"\n                                :label=\"trans('admin::app.settings.data-transfer.imports.edit.validation-strategy')\"\n                            >\n                                <option value=\"stop-on-errors\">@lang('admin::app.settings.data-transfer.imports.edit.stop-on-errors')</option>\n                                <option value=\"skip-erros\">@lang('admin::app.settings.data-transfer.imports.edit.skip-errors')</option>\n                            </x-admin::form.control-group.control>\n\n                            <x-admin::form.control-group.error control-name=\"validation_strategy\" />\n                        </x-admin::form.control-group>\n\n                        <!-- Allowed Errors -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.data-transfer.imports.edit.allowed-errors')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"text\"\n                                name=\"allowed_errors\"\n                                :value=\"old('allowed_errors') ?? $import->allowed_errors\"\n                                rules=\"required\"\n                                :label=\"trans('admin::app.settings.data-transfer.imports.edit.allowed-errors')\"\n                                :placeholder=\"trans('admin::app.settings.data-transfer.imports.edit.allowed-errors')\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"allowed_errors\" />\n                        </x-admin::form.control-group>\n\n                        <!-- CSV Field Separator -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.data-transfer.imports.edit.field-separator')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"text\"\n                                name=\"field_separator\"\n                                :value=\"old('field_separator') ?? $import->field_separator\"\n                                rules=\"required\"\n                                :label=\"trans('admin::app.settings.data-transfer.imports.edit.field-separator')\"\n                                :placeholder=\"trans('admin::app.settings.data-transfer.imports.edit.field-separator')\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"field_separator\" />\n                        </x-admin::form.control-group>\n\n                        <!-- Process In Queue -->\n                        <x-admin::form.control-group class=\"!mb-0\">\n                            <x-admin::form.control-group.label>\n                                @lang('admin::app.settings.data-transfer.imports.edit.process-in-queue')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"switch\"\n                                name=\"process_in_queue\"\n                                :value=\"1\"\n                                :checked=\"(boolean) $import->process_in_queue\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"process_in_queue\" />\n                        </x-admin::form.control-group>\n                    </x-slot>\n                </x-admin::accordion>\n\n                {!! view_render_event('admin.settings.data_transfer.imports.edit.card.accordion.settings.after', ['import' => $import]) !!}\n            </div>\n        </div>\n\n        {!! view_render_event('admin.settings.data_transfer.imports.edit.edit_form_controls.after', ['import' => $import]) !!}\n    </x-admin::form>\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/import.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.settings.data-transfer.imports.import.title')\n    </x-slot>\n\n    <!-- Page Header -->\n    <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n        <div class=\"flex flex-col gap-2\">\n            {!! view_render_event('admin.settings.data_transfers.import.breadcrumbs.before') !!}\n\n            <!-- Breadcrumbs -->\n            <x-admin::breadcrumbs \n                name=\"settings.data_transfers.import\"\n                :entity=\"$import\"\n            />\n\n            {!! view_render_event('admin.settings.data_transfers.import.breadcrumbs.after') !!}\n\n            <div class=\"text-xl font-bold dark:text-white\">\n                @lang('admin::app.settings.data-transfer.imports.import.title')\n            </div>\n        </div>\n\n        <div class=\"flex items-center gap-x-2.5\">\n            <!-- Create button for person -->\n            <div class=\"flex items-center gap-x-2.5\">\n                {!! view_render_event('admin.settings.data_transfers.import.edit_button.before') !!}\n\n                <!-- Edit Button -->\n                @if (bouncer()->hasPermission('settings.automation.data_transfer.imports.edit'))\n                    <a\n                        href=\"{{ route('admin.settings.data_transfer.imports.edit', $import->id) }}\"\n                        class=\"primary-button\"\n                    >\n                        @lang('admin::app.settings.data-transfer.imports.import.edit-btn')\n                    </a>\n                @endif\n\n                {!! view_render_event('admin.settings.data_transfers.import.edit_button.after') !!}\n            </div>\n        </div>\n    </div>\n\n    <!-- Import Vue Compontent -->\n    <v-import />\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-import-template\"\n        >\n            <!-- Body Content -->\n            <div class=\"box-shadow mt-3.5 grid gap-2.5 p-5 max-xl:flex-wrap\">\n                <!-- Validate CSV File -->\n                <div\n                    class=\"flex w-full place-content-between items-center rounded-sm border border-orange-200 bg-orange-50 p-3 dark:border-gray-800 dark:bg-gray-900 dark:text-white\"\n                    v-if=\"importResource.state == 'pending'\"\n                >\n                    <p class=\"flex items-center gap-2\">\n                        <i class=\"icon-info rounded-full bg-orange-200 text-2xl text-orange-600 dark:!text-orange-600\"></i>\n\n                        @lang('admin::app.settings.data-transfer.imports.import.validate-info')\n                    </p>\n\n                    <button\n                        class=\"primary-button place-self-start\"\n                        @click=\"validate\"\n                    >\n                        @lang('admin::app.settings.data-transfer.imports.import.validate')\n                    </button>\n                </div>\n\n                <!-- Validation In Process -->\n                <div\n                    class=\"flex w-full place-content-between items-center rounded-sm border border-blue-200 bg-blue-50 p-3 dark:border-gray-800 dark:bg-gray-900 dark:text-white\"\n                    v-if=\"importResource.state == 'validating'\"\n                >\n                    <p class=\"flex items-center gap-2\">\n                        <i class=\"icon-info rounded-full bg-blue-200 text-2xl text-blue-600 dark:!text-blue-600\"></i>\n\n                        @lang('admin::app.settings.data-transfer.imports.import.validating-info')\n\n                        <!-- Spinner -->\n                        <x-admin::spinner />\n                    </p>\n                </div>\n\n                <!-- Validation Results -->\n                <div\n                    class=\"flex w-full place-content-between rounded-sm border p-3\"\n                    :class=\"isValid ? 'border-green-200 bg-green-50 dark:bg-gray-900 dark:border-gray-800' : 'border-red-200 bg-red-50 dark:bg-gray-900 dark:border-gray-800'\"\n                    v-else-if=\"importResource.state == 'validated'\"\n                >\n                    <!-- Import Stats -->\n                    <div class=\"grid gap-2\">\n                        <p\n                            class=\"mb-2 flex items-center gap-2 dark:text-white\"\n                            v-if=\"isValid\"\n                        >\n                            <i class=\"icon-success h-fit rounded-full bg-green-200 text-2xl text-green-600 dark:!text-green-600\"></i>\n\n                            @lang('admin::app.settings.data-transfer.imports.import.validation-success-info')\n                        </p>\n\n                        <p\n                            class=\"flex items-center gap-2 dark:text-white\"\n                            v-else\n                        >\n                            <i class=\"icon-error h-fit rounded-full bg-red-200 text-2xl text-red-600 dark:!text-red-600\"></i>\n\n                            @lang('admin::app.settings.data-transfer.imports.import.validation-failed-info')\n                        </p>\n\n                        <p class=\"flex items-center gap-2 dark:text-white\">\n                            <i\n                                class=\"icon-info rounded-full text-2xl\"\n                                :class=\"isValid ? 'bg-green-200 text-green-600 dark:!text-green-600' : 'bg-red-200 text-red-600 dark:!text-red-600'\"\n                            ></i>\n\n                            <span class=\"font-medium text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.data-transfer.imports.import.total-rows-processed')\n                            </span>\n\n                            @{{ importResource.processed_rows_count }}\n                        </p>\n\n                        <p class=\"flex items-center gap-2 dark:text-white\">\n                            <i\n                                class=\"icon-info rounded-full text-2xl\"\n                                :class=\"isValid ? 'bg-green-200 text-green-600 dark:!text-green-600' : 'bg-red-200 text-red-600 dark:!text-red-600'\"\n                            ></i>\n\n                            <span class=\"font-medium text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.data-transfer.imports.import.total-invalid-rows')\n                            </span>\n\n                            @{{ importResource.invalid_rows_count }}\n                        </p>\n\n                        <p class=\"flex items-center gap-2 dark:text-white\">\n                            <i\n                                class=\"icon-info rounded-full text-2xl\"\n                                :class=\"isValid ? 'bg-green-200 text-green-600 dark:!text-green-600' : 'bg-red-200 text-red-600 dark:!text-red-600'\"\n                            ></i>\n\n                            <span class=\"font-medium text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.data-transfer.imports.import.total-errors')\n                            </span>\n\n                            @{{ importResource.errors_count }}\n                        </p>\n\n                        <div\n                            class=\"flex place-items-start items-center gap-2 dark:text-white\"\n                            v-if=\"importResource.errors.length\"\n                        >\n                            <i class=\"icon-info rounded-full bg-red-200 text-2xl text-red-600 dark:!text-red-600\"></i>\n\n                            <div class=\"grid gap-2\">\n                                <p\n                                    class=\"break-all\"\n                                    v-for=\"error in importResource.errors\"\n                                >\n                                    @{{ error }}\n                                </p>\n                            </div>\n                        </div>\n                    </div>\n\n                    <!-- Actions -->\n                    <div class=\"flex gap-2\">\n                        <button\n                            class=\"primary-button place-self-start\"\n                            v-if=\"isValid\"\n                            @click=\"start\"\n                        >\n                            @lang('admin::app.settings.data-transfer.imports.import.title')\n                        </button>\n\n                        <a\n                            class=\"primary-button place-self-start\"\n                            href=\"{{ route('admin.settings.data_transfer.imports.download_error_report', $import->id) }}\"\n                            target=\"_blank\"\n                            v-if=\"importResource.errors_count\"\n                        >\n                            @lang('admin::app.settings.data-transfer.imports.import.download-error-report')\n                        </a>\n                    </div>\n                </div>\n\n                <!-- Import In Process -->\n                <div\n                    class=\"grid w-full gap-2 rounded-sm border border-green-200 bg-green-50 p-3 dark:border-gray-800 dark:bg-gray-900 dark:text-white\"\n                    v-else-if=\"importResource.state == 'processing'\"\n                >\n                    <p class=\"flex items-center gap-2\">\n                        <i class=\"icon-info rounded-full bg-green-200 text-2xl text-green-600 dark:!text-green-600\"></i>\n\n                        @lang('admin::app.settings.data-transfer.imports.import.importing-info')\n                    </p>\n\n                    <div class=\"h-5 w-full rounded-sm bg-green-200 dark:bg-green-700\">\n                        <div\n                            class=\"h-5 rounded-sm bg-green-600\"\n                            :style=\"{ 'width': stats.progress + '%' }\"\n                        ></div>\n                    </div>\n\n                    <p class=\"flex items-center gap-2\">\n                        <span class=\"font-medium text-gray-800 dark:text-white\">\n                            @lang('admin::app.settings.data-transfer.imports.import.progress')\n                        </span>\n\n                        @{{ stats.progress }}%\n                    </p>\n\n                    <p class=\"flex items-center gap-2\">\n                        <span class=\"font-medium text-gray-800 dark:text-white\">\n                            @lang('admin::app.settings.data-transfer.imports.import.total-batches')\n                        </span>\n\n                        @{{ stats.batches.total }}\n                    </p>\n\n                    <p class=\"flex items-center gap-2\">\n                        <span class=\"font-medium text-gray-800 dark:text-white\">\n                            @lang('admin::app.settings.data-transfer.imports.import.completed-batches')\n                        </span>\n\n                        @{{ stats.batches.completed }}\n                    </p>\n\n                    <p class=\"flex items-center gap-2\">\n                        <span class=\"font-medium text-gray-800 dark:text-white\">\n                            @lang('admin::app.settings.data-transfer.imports.import.total-created')\n                        </span>\n\n                        @{{ stats.summary.created }}\n                    </p>\n\n                    <p class=\"flex items-center gap-2\">\n                        <span class=\"font-medium text-gray-800 dark:text-white\">\n                            @lang('admin::app.settings.data-transfer.imports.import.total-updated')\n                        </span>\n\n                        @{{ stats.summary.updated }}\n                    </p>\n\n                    <p class=\"flex items-center gap-2\">\n                        <span class=\"font-medium text-gray-800 dark:text-white\">\n                            @lang('admin::app.settings.data-transfer.imports.import.total-deleted')\n                        </span>\n\n                        @{{ stats.summary.deleted }}\n                    </p>\n                </div>\n\n                <!-- Linking In Process -->\n                <div\n                    class=\"grid w-full gap-2 rounded-sm border border-green-200 bg-green-50 p-3 dark:border-gray-800 dark:bg-gray-900\"\n                    v-else-if=\"importResource.state == 'linking'\"\n                >\n                    <p class=\"flex items-center gap-2\">\n                        <i class=\"icon-info rounded-full bg-green-200 text-2xl text-green-600 dark:!text-green-600\"></i>\n\n                        @lang('admin::app.settings.data-transfer.imports.import.linking-info')\n                    </p>\n\n                    <div class=\"h-5 w-full rounded-sm bg-green-200 dark:bg-green-700\">\n                        <div\n                            class=\"h-5 rounded-sm bg-green-600\"\n                            :style=\"{ 'width': stats.progress + '%' }\"\n                        ></div>\n                    </div>\n\n                    <p class=\"flex items-center gap-2\">\n                        <span class=\"font-medium text-gray-800\">\n                            @lang('admin::app.settings.data-transfer.imports.import.progress')\n                        </span>\n\n                        @{{ stats.progress }}%\n                    </p>\n\n                    <p class=\"flex items-center gap-2\">\n                        <span class=\"font-medium text-gray-800\">\n                            @lang('admin::app.settings.data-transfer.imports.import.total-batches')\n                        </span>\n\n                        @{{ stats.batches.total }}\n                    </p>\n\n                    <p class=\"flex items-center gap-2\">\n                        <span class=\"font-medium text-gray-800\">\n                            @lang('admin::app.settings.data-transfer.imports.import.completed-batches')\n                        </span>\n\n                        @{{ stats.batches.completed }}\n                    </p>\n                </div>\n\n                <!-- Indexing In Process -->\n                <div\n                    class=\"grid w-full gap-2 rounded-sm border border-green-200 bg-green-50 p-3\"\n                    v-else-if=\"importResource.state == 'indexing'\"\n                >\n\n                    <p class=\"flex items-center gap-2\">\n                        <i class=\"icon-info rounded-full bg-green-200 text-2xl text-green-600 dark:!text-green-600\"></i>\n\n                        @lang('admin::app.settings.data-transfer.imports.import.indexing-info')\n                    </p>\n\n                    <div class=\"h-5 w-full rounded-sm bg-green-200 dark:bg-green-700\">\n                        <div\n                            class=\"h-5 rounded-sm bg-green-600\"\n                            :style=\"{ 'width': stats.progress + '%' }\"\n                        ></div>\n                    </div>\n\n                    <p class=\"flex items-center gap-2\">\n                        <span class=\"font-medium text-gray-800\">\n                            @lang('admin::app.settings.data-transfer.imports.import.progress')\n                        </span>\n\n                        @{{ stats.progress }}%\n                    </p>\n\n                    <p class=\"flex items-center gap-2\">\n                        <span class=\"font-medium text-gray-800\">\n                            @lang('admin::app.settings.data-transfer.imports.import.total-batches')\n                        </span>\n\n                        @{{ stats.batches.total }}\n                    </p>\n\n                    <p class=\"flex items-center gap-2\">\n                        <span class=\"font-medium text-gray-800\">\n                            @lang('admin::app.settings.data-transfer.imports.import.completed-batches')\n                        </span>\n\n                        @{{ stats.batches.completed }}\n                    </p>\n                </div>\n\n                <!-- Import Completed -->\n                <div\n                    class=\"flex w-full place-content-between rounded-sm border border-green-200 bg-green-50 p-3 dark:border-gray-800 dark:bg-gray-900 dark:text-white\"\n                    v-else-if=\"importResource.state == 'completed'\"\n                >\n                    <!-- Stats -->\n                    <div class=\"grid gap-2\">\n                        <p\n                            class=\"mb-2 flex items-center gap-2 text-base dark:text-white\"\n                            v-if=\"isValid\"\n                        >\n                            <i class=\"icon-success h-fit rounded-full bg-green-200 text-2xl text-green-600 dark:!text-green-600\"></i>\n\n                            @lang('admin::app.settings.data-transfer.imports.import.imported-info')\n                        </p>\n\n                        <p class=\"flex items-center gap-2\">\n                            <i class=\"icon-info rounded-full bg-green-200 text-2xl text-green-600 dark:!text-green-600\"></i>\n\n                            <span class=\"font-medium text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.data-transfer.imports.import.total-created')\n                            </span>\n\n                            @{{ importResource.summary.created }}\n                        </p>\n\n                        <p class=\"flex items-center gap-2\">\n                            <i class=\"icon-info rounded-full bg-green-200 text-2xl text-green-600 dark:!text-green-600\"></i>\n\n                            <span class=\"font-medium text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.data-transfer.imports.import.total-updated')\n                            </span>\n\n                            @{{ importResource.summary.updated }}\n                        </p>\n\n                        <p class=\"flex items-center gap-2\">\n                            <i class=\"icon-info rounded-full bg-green-200 text-2xl text-green-600 dark:!text-green-600\"></i>\n\n                            <span class=\"font-medium text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.data-transfer.imports.import.total-deleted')\n                            </span>\n\n                            @{{ importResource.summary.deleted }}\n                        </p>\n                    </div>\n                </div>\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-import', {\n                template: '#v-import-template',\n\n                data() {\n                    return {\n                        importResource: @json($import),\n\n                        isValid: \"{{ $isValid }}\",\n\n                        stats: @json($stats),\n                    };\n                },\n\n                mounted() {\n                    if (this.importResource.process_in_queue) {\n                        if (\n                            this.importResource.state == 'processing'\n                            || this.importResource.state == 'linking'\n                            || this.importResource.state == 'indexing'\n                        ) {\n                            this.getStats();\n                        }\n                    } else {\n                        if (this.importResource.state == 'processing') {\n                            this.start();\n                        }\n\n                        if (this.importResource.state == 'linking') {\n                            this.link();\n                        }\n\n                        if (this.importResource.state == 'indexing') {\n                            this.index();\n                        }\n                    }\n                },\n\n                methods: {\n                    validate() {\n                        this.importResource.state = 'validating';\n\n                        this.$axios.get(\"{{ route('admin.settings.data_transfer.imports.validate', $import->id) }}\")\n                            .then((response) => {\n                                this.importResource = response.data.import;\n\n                                this.isValid = response.data.is_valid;\n                            })\n                            .catch(error => {\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                            });\n                    },\n\n                    start() {\n                        this.importResource.state = 'processing';\n\n                        this.$axios.get(\"{{ route('admin.settings.data_transfer.imports.start', $import->id) }}\")\n                            .then((response) => {\n                                this.importResource = response.data.import;\n\n                                this.stats = response.data.stats;\n\n                                if (this.importResource.process_in_queue) {\n                                    this.getStats();\n                                } else {\n                                    if (this.importResource.state == 'processing') {\n                                        this.start();\n                                    } else if (this.importResource.state == 'linking') {\n                                        this.link();\n                                    } else if (this.importResource.state == 'indexing') {\n                                        this.index();\n                                    }\n                                }\n                            })\n                            .catch(error => {\n                                this.importResource.state = 'validated';\n\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                            });\n                    },\n\n                    link() {\n                        this.$axios.get(\"{{ route('admin.settings.data_transfer.imports.link', $import->id) }}\")\n                            .then((response) => {\n                                this.importResource = response.data.import;\n\n                                this.stats = response.data.stats;\n\n                                if (this.importResource.state == 'linking') {\n                                    this.link();\n                                } else if (this.importResource.state == 'indexing') {\n                                    this.index();\n                                }\n                            })\n                            .catch(error => {\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                            });\n                    },\n\n                    index() {\n                        this.$axios.get(\"{{ route('admin.settings.data_transfer.imports.index_data', $import->id) }}\")\n                            .then((response) => {\n                                this.importResource = response.data.import;\n\n                                this.stats = response.data.stats;\n\n                                if (this.importResource.state == 'indexing') {\n                                    this.index();\n                                }\n                            })\n                            .catch(error => {\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                            });\n                    },\n\n                    getStats() {\n                        let state = 'processed';\n\n                        if (this.importResource.state == 'linking') {\n                            state = 'linked';\n                        } else if (this.importResource.state == 'indexing') {\n                            state = 'indexed';\n                        }\n\n                        this.$axios.get(\"{{ route('admin.settings.data_transfer.imports.stats', $import->id) }}/\" + state)\n                            .then((response) => {\n                                this.importResource = response.data.import;\n\n                                this.stats = response.data.stats;\n\n                                if (this.importResource.state != 'completed') {\n                                    setTimeout(() => {\n                                        this.getStats();\n                                    }, 1000);\n                                }\n                            })\n                            .catch(error => {\n                                this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                            });\n                    }\n                }\n            })\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/data-transfer/imports/index.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.settings.data-transfer.imports.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\"> \n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.settings.data_transfers.index.breadcrumbs.before') !!}\n\n                <!-- Breadcrumbs -->\n                <x-admin::breadcrumbs name=\"settings.data_transfers\" />\n\n                {!! view_render_event('admin.settings.data_transfers.index.breadcrumbs.after') !!}\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    @lang('admin::app.settings.data-transfer.imports.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <!-- Create button for person -->\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.settings.data_transfers.index.create_button.before') !!}\n\n                    @if (bouncer()->hasPermission('settings.automation.data_transfer.imports.create'))\n                        <a \n                            href=\"{{ route('admin.settings.data_transfer.imports.create') }}\" \n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.data-transfer.imports.index.button-title')\n                        </a>\n                    @endif\n\n                    {!! view_render_event('admin.settings.data_transfers.index.create_button.after') !!}\n                </div>\n            </div>\n        </div>\n\n        {!! view_render_event('admin.settings.data_transfers.index.datagrid.before') !!}\n\n        <!-- DataGrid -->\n        <x-admin::datagrid :src=\"route('admin.settings.data_transfer.imports.index')\">\n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </x-admin::datagrid>\n\n        {!! view_render_event('admin.settings.data_transfers.index.datagrid.after') !!}\n    </div>\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/email-templates/create.blade.php",
    "content": "\n<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.email-template.create.title')\n    </x-slot>\n\n    {!! view_render_event('admin.settings.email_template.create.form.before') !!}\n\n    <x-admin::form\n        :action=\"route('admin.settings.email_templates.store')\"\n        method=\"POST\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.email_template.create.breadcrumbs.after') !!}\n\n                    <!-- Breadcrumbs -->\n                    <x-admin::breadcrumbs name=\"settings.email_templates.create\" />\n\n                    {!! view_render_event('admin.settings.email_template.create.breadcrumbs.after') !!}\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.settings.email-template.create.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <!-- Create button for person -->\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.email_template.create.save_button.before') !!}\n\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.email-template.create.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.settings.email_template.create.save_button.after') !!}\n                    </div>\n                </div>\n            </div>\n\n            <v-email-template></v-email-template>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.email_template.create.form.after') !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-email-template-template\"\n        >\n            <div class=\"flex gap-2.5 max-xl:flex-wrap\">\n                <!-- Left sub-component -->\n                <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                    <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                        <div class=\"mb-4 flex items-center justify-between gap-4\">\n                            <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.email-template.create.email-template')\n                            </p>\n                        </div>\n\n                        {!! view_render_event('admin.settings.email_template.create.subject.before') !!}\n\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.email-template.create.subject')\n                            </x-admin::form.control-group.label>\n\n                            <div class=\"flex\">\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"subject\"\n                                    id=\"subject\"\n                                    class=\"rounded-r-none\"\n                                    :value=\"old('subject')\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.email-template.create.subject')\"\n                                    :placeholder=\"trans('admin::app.settings.email-template.create.subject')\"\n                                    v-model=\"subject\"\n                                    @focusout=\"saveCursorPosition\"\n                                />\n\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    name=\"placeholder\"\n                                    id=\"placeholder\"\n                                    class=\"!w-1/3 rounded-l-none\"\n                                    :label=\"trans('admin::app.settings.email-template.create.subject-placeholder')\"\n                                    v-model=\"selectedPlaceholder\"\n                                    @change=\"insertPlaceholder\"\n                                >\n                                    <optgroup\n                                        v-for=\"entity in placeholders\"\n                                        :key=\"entity.text\"\n                                        :label=\"entity.text\"\n                                    >\n                                        <option\n                                            v-for=\"placeholder in entity.menu\"\n                                            :key=\"placeholder.value\"\n                                            :value=\"placeholder.value\"\n                                            :text=\"placeholder.text\"\n                                        ></option>\n                                    </optgroup>\n                                </x-admin::form.control-group.control>\n                            </div>\n                        </x-admin::form.control-group>\n\n                        <x-admin::form.control-group.error control-name=\"subject\"/>\n\n                        {!! view_render_event('admin.settings.email_template.create.subject.after') !!}\n\n                        {!! view_render_event('admin.settings.email_template.create.content.before') !!}\n\n                        <!-- Event Name -->\n                        <x-admin::form.control-group class=\"!mb-0\">\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.email-template.create.content')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"textarea\"\n                                id=\"content\"\n                                name=\"content\"\n                                rules=\"required\"\n                                :tinymce=\"true\"\n                                :placeholders=\"json_encode($placeholders)\"\n                                :label=\"trans('admin::app.settings.email-template.create.content')\"\n                                :placeholder=\"trans('admin::app.settings.email-template.create.content')\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"content\" />\n                        </x-admin::form.control-group>\n\n                        {!! view_render_event('admin.settings.email_template.create.content.after') !!}\n                    </div>\n                </div>\n\n                <!-- Right sub-component -->\n                <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                    {!! view_render_event('admin.settings.email_template.create.accordion.general.before') !!}\n\n                    <x-admin::accordion>\n                        <x-slot:header>\n                            <div class=\"flex items-center justify-between\">\n                                <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.email-template.create.general')\n                                </p>\n                            </div>\n                        </x-slot>\n\n                        <x-slot:content>\n                            <x-admin::form.control-group class=\"!mb-0\">\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.email-template.create.name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"name\"\n                                    id=\"name\"\n                                    :value=\"old('name')\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.email-template.create.name')\"\n                                    :placeholder=\"trans('admin::app.settings.email-template.create.name')\"\n                                />\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n                        </x-slot>\n                    </x-admin::accordion>\n\n                    {!! view_render_event('admin.settings.email_template.create.accordion.general.after') !!}\n                </div>\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-email-template', {\n                template: '#v-email-template-template',\n\n                data() {\n                    return {\n                        subject: '',\n\n                        selectedPlaceholder: '',\n\n                        cursorPosition: 0,\n\n                        placeholders: @json($placeholders),\n                    };\n                },\n\n                methods: {\n                    /**\n                     * Save the cursor position when the input is focused.\n                     * \n                     * @param {Event} event\n                     * @returns {void}\n                     */\n                    saveCursorPosition(event) {\n                        this.cursorPosition = event.target.selectionStart;\n                    },\n\n                    /**\n                     * Insert the selected placeholder into the subject.\n                     * \n                     * @returns {void}\n                     */\n                    insertPlaceholder() {\n                        const placeholder = this.selectedPlaceholder;\n\n                        if (this.cursorPosition >= 0) {\n                            const before = this.subject.substring(0, this.cursorPosition);\n\n                            const after = this.subject.substring(this.cursorPosition);\n\n                            this.subject = `${before}${placeholder}${after}`;\n\n                            this.cursorPosition += placeholder.length;\n                        } else if (placeholder) {\n                            this.subject += placeholder;\n                        }\n\n                        this.selectedPlaceholder = '';\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/email-templates/edit.blade.php",
    "content": "\n<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.email-template.edit.title')\n    </x-slot>\n\n    {!! view_render_event('admin.settings.email_template.edit.form.before') !!}\n\n    <x-admin::form\n        :action=\"route('admin.settings.email_templates.update', $emailTemplate->id)\"\n        method=\"PUT\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.email_template.edit.breadcrumbs.before') !!}\n\n                    <!-- Breadcrumbs -->\n                    <x-admin::breadcrumbs\n                        name=\"settings.email_templates.edit\"\n                        :entity=\"$emailTemplate\"\n                    />\n\n                    {!! view_render_event('admin.settings.email_template.edit.breadcrumbs.after') !!}\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.settings.email-template.edit.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <!-- Create button for person -->\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.email_template.edit.save_button.before') !!}\n\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('Save Email Template')\n                        </button>\n\n                        {!! view_render_event('admin.settings.email_template.edit.save_button.before') !!}\n                    </div>\n                </div>\n            </div>\n\n            <v-email-template></v-email-template>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.settings.email_template.edit.form.after') !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-email-template-template\"\n        >\n            <div class=\"flex gap-2.5 max-xl:flex-wrap\">\n                <!-- Left sub-component -->\n                <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                    <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                        <div class=\"mb-4 flex items-center justify-between gap-4\">\n                            <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                @lang('admin::app.settings.email-template.edit.email-template')\n                            </p>\n                        </div>\n\n                        {!! view_render_event('admin.settings.email_template.edit.subject.before') !!}\n\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.email-template.edit.subject')\n                            </x-admin::form.control-group.label>\n\n                            <div class=\"flex\">\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"subject\"\n                                    id=\"subject\"\n                                    class=\"rounded-r-none\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.email-template.edit.subject')\"\n                                    :placeholder=\"trans('admin::app.settings.email-template.edit.subject')\"\n                                    v-model=\"subject\"\n                                    @focusout=\"saveCursorPosition\"\n                                />\n\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    name=\"placeholder\"\n                                    id=\"placeholder\"\n                                    class=\"!w-1/3 rounded-l-none\"\n                                    :label=\"trans('admin::app.settings.email-template.edit.subject-placeholder')\"\n                                    v-model=\"selectedPlaceholder\"\n                                    @change=\"insertPlaceholder\"\n                                >\n                                    <optgroup\n                                        v-for=\"entity in placeholders\"\n                                        :key=\"entity.text\"\n                                        :label=\"entity.text\"\n                                    >\n                                        <option\n                                            v-for=\"placeholder in entity.menu\"\n                                            :key=\"placeholder.value\"\n                                            :value=\"placeholder.value\"\n                                            :text=\"placeholder.text\"\n                                        ></option>\n                                    </optgroup>\n                                </x-admin::form.control-group.control>\n\n                            </div>\n                        </x-admin::form.control-group>\n\n                        <x-admin::form.control-group.error control-name=\"subject\"/>\n\n                        {!! view_render_event('admin.settings.email_template.edit.subject.after') !!}\n\n                        {!! view_render_event('admin.settings.email_template.edit.content.before') !!}\n\n                        <!-- Event Name -->\n                        <x-admin::form.control-group class=\"!mb-0\">\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.email-template.edit.content')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"textarea\"\n                                id=\"content\"\n                                name=\"content\"\n                                rules=\"required\"\n                                :value=\"old('content') ?? $emailTemplate->content\"\n                                :tinymce=\"true\"\n                                :placeholders=\"json_encode($placeholders)\"\n                                :label=\"trans('admin::app.settings.email-template.edit.content')\"\n                                :placeholder=\"trans('admin::app.settings.email-template.edit.content')\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"content\" />\n                        </x-admin::form.control-group>\n\n                        {!! view_render_event('admin.settings.email_template.edit.content.after') !!}\n                    </div>\n                </div>\n\n                <!-- Right sub-component -->\n                <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                    {!! view_render_event('admin.settings.email_template.edit.accordion.general.before') !!}\n\n                    <x-admin::accordion>\n                        <x-slot:header>\n                            <div class=\"flex items-center justify-between\">\n                                <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.email-template.edit.general')\n                                </p>\n                            </div>\n                        </x-slot>\n\n                        <x-slot:content>\n                            <x-admin::form.control-group class=\"!mb-0\">\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.email-template.edit.name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"name\"\n                                    id=\"name\"\n                                    :value=\"old('name') ?? $emailTemplate->name\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.email-template.edit.name')\"\n                                    :placeholder=\"trans('admin::app.settings.email-template.edit.name')\"\n                                />\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n                        </x-slot>\n                    </x-admin::accordion>\n\n                    {!! view_render_event('admin.settings.email_template.edit.accordion.general.after') !!}\n                </div>\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-email-template', {\n                template: '#v-email-template-template',\n\n                data() {\n                    return {\n                        subject: '{{ old('subject') ?? $emailTemplate->subject }}',\n\n                        selectedPlaceholder: '',\n\n                        cursorPosition: 0,\n\n                        placeholders: @json($placeholders),\n                    };\n                },\n\n                methods: {\n                    /**\n                     * Save the cursor position when the input is focused.\n                     * \n                     * @param {Event} event\n                     * @returns {void}\n                     */\n                    saveCursorPosition(event) {\n                        this.cursorPosition = event.target.selectionStart;\n                    },\n\n                    /**\n                     * Insert the selected placeholder into the subject.\n                     * \n                     * @returns {void}\n                     */\n                    insertPlaceholder() {\n                        const placeholder = this.selectedPlaceholder;\n\n                        if (this.cursorPosition >= 0) {\n                            const before = this.subject.substring(0, this.cursorPosition);\n\n                            const after = this.subject.substring(this.cursorPosition);\n\n                            this.subject = `${before}${placeholder}${after}`;\n\n                            this.cursorPosition += placeholder.length;\n                        } else if (placeholder) {\n                            this.subject += placeholder;\n                        }\n\n                        this.selectedPlaceholder = '';\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/email-templates/index.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.email-template.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\"> \n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.settings.email_template.index.breadcrumbs.before') !!}\n\n                <!-- Breadcrumbs -->\n                <x-admin::breadcrumbs name=\"settings.email_templates\" />\n\n                {!! view_render_event('admin.settings.email_template.index.breadcrumbs.after') !!}\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    @lang('admin::app.settings.email-template.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <!-- Create button for person -->\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.settings.email_template.index.create_button.before') !!}\n\n                    @if (bouncer()->hasPermission('settings.automation.email_templates.create'))\n                        <a\n                            href=\"{{ route('admin.settings.email_templates.create') }}\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.email-template.index.create-btn')\n                        </a>\n                    @endif\n\n                    {!! view_render_event('admin.settings.email_template.index.create_button.after') !!}\n                </div>\n            </div>\n        </div>\n\n        {!! view_render_event('admin.settings.email_template.index.datagrid.before') !!}\n\n        <!-- DataGrid -->\n        <x-admin::datagrid :src=\"route('admin.settings.email_templates.index')\">\n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </x-admin::datagrid>\n\n        {!! view_render_event('admin.settings.email_template.index.datagrid.after') !!}\n    </div>\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/groups/index.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.groups.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <!-- Header section -->\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.settings.groups.index.breadcrumbs.before') !!}\n\n                <!-- Breadcrumbs -->\n                <x-admin::breadcrumbs name=\"settings.groups\" />\n\n                {!! view_render_event('admin.settings.groups.index.breadcrumbs.after') !!}\n\n                <div class=\"text-xl font-bold dark:text-gray-300\">\n                    @lang('admin::app.settings.groups.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <!-- Create button for Group -->\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.settings.groups.index.breadcrumbs.after') !!}\n\n                    @if (bouncer()->hasPermission('settings.user.groups.create'))\n                        <button\n                            type=\"button\"\n                            class=\"primary-button\"\n                            @click=\"$refs.groupSettings.openModal()\"\n                        >\n                            @lang('admin::app.settings.groups.index.create-btn')\n                        </button>\n                    @endif\n\n                    {!! view_render_event('admin.settings.groups.index.create_button.after') !!}\n                </div>\n            </div>\n        </div>\n\n        <v-group-settings ref=\"groupSettings\">\n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </v-group-settings>\n    </div>\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"group-settings-template\"\n        >\n            {!! view_render_event('admin.settings.groups.index.datagrid.before') !!}\n\n            <!-- DataGrid -->\n            <x-admin::datagrid\n                :src=\"route('admin.settings.groups.index')\"\n                ref=\"datagrid\"\n            >\n                <template #body=\"{\n                    isLoading,\n                    available,\n                    applied,\n                    selectAll,\n                    sort,\n                    performAction\n                }\">\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.datagrid.table.body />\n                    </template>\n\n                    <template v-else>\n                        <div\n                            v-for=\"record in available.records\"\n                            class=\"row grid items-center gap-2.5 border-b px-4 py-4 text-gray-600 transition-all hover:bg-gray-50 dark:border-gray-800 dark:text-gray-300 dark:hover:bg-gray-950 max-lg:hidden\"\n                            :style=\"`grid-template-columns: repeat(${gridsCount}, minmax(0, 1fr))`\"\n                        >\n                            <!-- Group ID -->\n                            <p>@{{ record.id }}</p>\n\n                            <!-- Group Name -->\n                            <p>@{{ record.name }}</p>\n\n                            <!-- Group Description -->\n                            <p>@{{ record.description }}</p>\n\n                            <!-- Actions -->\n                            <div class=\"flex justify-end\">\n                                <a @click=\"selectedGroup=true; editModal(record.actions.find(action => action.index === 'edit')?.url)\">\n                                    <span\n                                        :class=\"record.actions.find(action => action.index === 'edit')?.icon\"\n                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                    >\n                                    </span>\n                                </a>\n\n                                <a @click=\"performAction(record.actions.find(action => action.index === 'delete'))\">\n                                    <span\n                                        :class=\"record.actions.find(action => action.index === 'delete')?.icon\"\n                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                    >\n                                    </span>\n                                </a>\n                            </div>\n                        </div>\n\n                        <!-- Mobile Card View -->\n                        <div\n                            class=\"hidden border-b px-4 py-4 text-black dark:border-gray-800 dark:text-gray-300 max-lg:block\"\n                            v-for=\"record in available.records\"\n                        >\n                            <div class=\"mb-2 flex items-center justify-between\">\n                                <!-- Mass Actions for Mobile Cards -->\n                                <div class=\"flex w-full items-center justify-between gap-2\">\n                                    <p v-if=\"available.massActions.length\">\n                                        <label :for=\"`mass_action_select_record_${record[available.meta.primary_column]}`\">\n                                            <input\n                                                type=\"checkbox\"\n                                                :name=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                :value=\"record[available.meta.primary_column]\"\n                                                :id=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                class=\"peer hidden\"\n                                                v-model=\"applied.massActions.indices\"\n                                            >\n    \n                                            <span class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-500 peer-checked:text-brandColor\">\n                                            </span>\n                                        </label>\n                                    </p>\n\n                                    <!-- Actions for Mobile -->\n                                    <div\n                                        class=\"flex w-full items-center justify-end\"\n                                        v-if=\"available.actions.length\"\n                                    >\n                                        <!-- Actions -->\n                                        <a @click=\"selectedGroup=true; editModal(record.actions.find(action => action.index === 'edit')?.url)\">\n                                            <span\n                                                :class=\"record.actions.find(action => action.index === 'edit')?.icon\"\n                                                class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                            >\n                                            </span>\n                                        </a>\n\n                                        <a @click=\"performAction(record.actions.find(action => action.index === 'delete'))\">\n                                            <span\n                                                :class=\"record.actions.find(action => action.index === 'delete')?.icon\"\n                                                class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                            >\n                                            </span>\n                                        </a>\n                                    </div>\n                                </div>\n                            </div>\n\n                            <!-- Card Content -->\n                            <div class=\"grid gap-2\">\n                                <template v-for=\"column in available.columns\">\n                                    <div class=\"flex flex-wrap items-baseline gap-x-2\">\n                                        <span class=\"text-slate-600 dark:text-gray-300\" v-html=\"column.label + ':'\"></span>\n                                        <span class=\"break-words font-medium text-slate-900 dark:text-white\" v-html=\"record[column.index]\"></span>\n                                    </div>\n                                </template>\n                            </div>\n                        </div>\n                    </template>\n                </template>\n            </x-admin::datagrid>\n\n            {!! view_render_event('admin.settings.groups.index.datagrid.after') !!}\n\n            {!! view_render_event('admin.settings.groups.index.form.before') !!}\n\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modalForm\"\n            >\n                <form @submit=\"handleSubmit($event, updateOrCreate)\">\n                    {!! view_render_event('admin.settings.groups.index.create_form_controls.before') !!}\n\n                    {!! view_render_event('admin.settings.groups.index.form.modal.before') !!}\n\n                    <x-admin::modal ref=\"groupUpdateAndCreateModal\">\n                        <!-- Modal Header -->\n                        <x-slot:header>\n                            <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                                @{{\n                                    selectedGroup\n                                    ? \"@lang('admin::app.settings.groups.index.edit.title')\"\n                                    : \"@lang('admin::app.settings.groups.index.create.title')\"\n                                }}\n                            </p>\n                        </x-slot>\n\n                        <!-- Modal Content -->\n                        <x-slot:content>\n                            {!! view_render_event('admin.settings.groups.index.content.before') !!}\n\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"id\"\n                            />\n\n                            {!! view_render_event('admin.settings.groups.index.form.form_controls.name.before') !!}\n\n                            <!-- Name -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.groups.index.create.name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"name\"\n                                    name=\"name\"\n                                    rules=\"required|min:0|max:50\"\n                                    :label=\"trans('admin::app.settings.groups.index.create.name')\"\n                                    :placeholder=\"trans('admin::app.settings.groups.index.create.name')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.groups.index.form.form_controls.name.after') !!}\n\n                            {!! view_render_event('admin.settings.groups.index.form.form_controls.description.before') !!}\n\n                            <!-- Description -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.groups.index.create.description')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"textarea\"\n                                    id=\"description\"\n                                    name=\"description\"\n                                    rules=\"required|max:250\"\n                                    :label=\"trans('admin::app.settings.groups.index.create.description')\"\n                                    :placeholder=\"trans('admin::app.settings.groups.index.create.description')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"description\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.groups.index.form.form_controls.description.after') !!}\n                        </x-slot>\n\n                        <!-- Modal Footer -->\n                        <x-slot:footer>\n                            {!! view_render_event('admin.settings.groups.index.form.form_controls.save_button.before') !!}\n\n                            <!-- Save Button -->\n                            <x-admin::button\n                                button-type=\"submit\"\n                                class=\"primary-button justify-center\"\n                                :title=\"trans('admin::app.settings.groups.index.create.save-btn')\"\n                                ::loading=\"isProcessing\"\n                                ::disabled=\"isProcessing\"\n                            />\n\n                            {!! view_render_event('admin.settings.groups.index.form.form_controls.save_button.after') !!}\n                        </x-slot>\n                    </x-admin::modal>\n\n                    {!! view_render_event('admin.settings.groups.index.form.modal.after') !!}\n                </form>\n            </x-admin::form>\n\n            {!! view_render_event('admin.settings.groups.index.form.after') !!}\n        </script>\n\n        <script type=\"module\">\n            app.component('v-group-settings', {\n                template: '#group-settings-template',\n\n                data() {\n                    return {\n                        isProcessing: false,\n\n                        selectedGroup: false,\n                    };\n                },\n\n                computed: {\n                    gridsCount() {\n                        let count = this.$refs.datagrid.available.columns.length;\n\n                        if (this.$refs.datagrid.available.actions.length) {\n                            ++count;\n                        }\n\n                        if (this.$refs.datagrid.available.massActions.length) {\n                            ++count;\n                        }\n\n                        return count;\n                    },\n                },\n\n                methods: {\n                    openModal() {\n                        this.selectedGroup=false;\n\n                        this.$refs.groupUpdateAndCreateModal.toggle();\n                    },\n\n                    updateOrCreate(params, {resetForm, setErrors}) {\n                        this.isProcessing = true;\n\n                        this.$axios.post(params.id ? \"{{ route('admin.settings.groups.update', ':id') }}\".replace(':id', params.id) : \"{{ route('admin.settings.groups.store') }}\", {\n                            ...params,\n                            _method: params.id ? 'put' : 'post'\n                        }, {\n                            headers: {\n                                'Content-Type': 'multipart/form-data',\n                            }\n                        }).then(response => {\n                            this.isProcessing = false;\n\n                            this.$refs.groupUpdateAndCreateModal.toggle();\n\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                            this.$refs.datagrid.get();\n\n                            resetForm();\n                        }).catch(error => {\n                            this.isProcessing = false;\n\n                            if (error.response.status === 422) {\n                                setErrors(error.response.data.errors);\n                            }\n                        });\n                    },\n\n                    editModal(url) {\n                        this.$axios.get(url)\n                            .then(response => {\n                                this.$refs.modalForm.setValues(response.data.data);\n\n                                this.$refs.groupUpdateAndCreateModal.toggle();\n                            })\n                            .catch(error => {});\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/index.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Title of the page. -->\n    <x-slot:title>\n        @lang('admin::app.settings.title')\n    </x-slot>\n\n    <x-admin::breadcrumbs name=\"settings\" />\n\n    <!-- Heading of the page -->\n    <div class=\"mb-7 flex items-center justify-between\">\n        <p class=\"py-3 text-xl font-bold text-gray-800 dark:text-white\">\n            @lang('admin::app.settings.title')\n        </p>\n    </div>\n\n    <!-- Page Content -->\n    <div class=\"grid gap-y-8\">\n        @foreach (menu()->getAdminMenuByKey('settings')->getChildren() as $setting)\n            <div>\n                <div class=\"grid gap-1\">\n                    <!-- Title of the Main Card -->\n                    <p class=\"font-semibold text-gray-600 dark:text-gray-300\">\n                        {{ $setting->getName() }}\n                    </p>\n\n                    <!-- Info of the Main Card -->\n                    <p class=\"text-gray-600 dark:text-gray-300\">\n                        {{ $setting->getInfo() }}\n                    </p>\n                </div>\n            \n                <div class=\"box-shadow max-1580:grid-cols-3 mt-2 grid grid-cols-4 flex-wrap justify-between gap-x-12 gap-y-6 rounded bg-white p-4 dark:bg-gray-900 max-xl:grid-cols-2 max-lg:gap-y-4 max-sm:grid-cols-1\">\n                    <!-- Menus cards -->\n                    @foreach ($setting->getChildren() as $key => $child)\n                        <a \n                            class=\"flex max-w-[360px] items-center gap-2 rounded-lg p-2 transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                            href=\"{{ $child->getUrl() }}\"\n                        >\n                            <div class=\"rounded-lg bg-gray-100 p-3 dark:bg-gray-800\">\n                                <i class=\"{{ $child->getIcon() }} text-3xl\"></i>\n                            </div>\n\n                            <div class=\"grid\">\n                                <p class=\"mb-1.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                    {{ $child->getName() }}\n                                </p>\n                                \n                                <p class=\"text-xs text-gray-600 dark:text-gray-300\">\n                                    {{ $child->getInfo() }}\n                                </p>\n                            </div>\n                        </a>\n                    @endforeach\n                </div>\n            </div>\n        @endforeach\n    </div>\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/marketing/campaigns/index.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.marketing.campaigns.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <!-- Header section -->\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                <div class=\"flex cursor-pointer items-center\">\n                    {!! view_render_event('admin.settings.marketing.campaigns.index.breadcrumbs.before') !!}\n\n                    <!-- Bredcrumbs -->\n                    <x-admin::breadcrumbs name=\"settings.marketing.campaigns\" />\n\n                    {!! view_render_event('admin.settings.marketing.campaigns.index.breadcrumbs.after') !!}\n                </div>\n\n                <div class=\"text-xl font-bold dark:text-gray-300\">\n                    @lang('admin::app.settings.marketing.campaigns.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <!-- Create button for Campaings -->\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.settings.marketing.campaigns.index.breadcrumbs.after') !!}\n\n                    @if (bouncer()->hasPermission('settings.automation.campaigns.create'))\n                        <button\n                            type=\"button\"\n                            class=\"primary-button\"\n                            @click=\"$refs.marketingCampaigns.handleCreate()\"\n                        >\n                            @lang('admin::app.settings.marketing.campaigns.index.create-btn')\n                        </button>\n                    @endif\n\n                    {!! view_render_event('admin.settings.marketing.campaigns.index.create_button.after') !!}\n                </div>\n            </div>\n        </div>\n\n        <v-campaigns ref=\"marketingCampaigns\">\n            <x-admin::shimmer.datagrid />\n        </v-campaigns>\n    </div>\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-campaigns-template\"\n        >\n            <div>\n                <!-- Datagrid -->\n                <x-admin::datagrid\n                    :src=\"route('admin.settings.marketing.campaigns.index')\"\n                    ref=\"datagrid\"\n                >\n                    <template #body=\"{\n                        isLoading,\n                        available,\n                        applied,\n                        selectAll,\n                        sort,\n                        performAction\n                    }\">\n                        <template v-if=\"isLoading\">\n                            <x-admin::shimmer.datagrid.table.body />\n                        </template>\n\n                        <template v-else>\n                            <div\n                                v-for=\"record in available.records\"\n                                class=\"row grid items-center gap-2.5 border-b px-4 py-4 text-gray-600 transition-all hover:bg-gray-50 dark:border-gray-800 dark:text-gray-300 dark:hover:bg-gray-950 max-lg:hidden\"\n                                :style=\"`grid-template-columns: repeat(${gridsCount}, minmax(0, 1fr))`\"\n                            >\n                                <!-- Mass Actions, Title and Created By -->\n                                @if (bouncer()->hasPermission('settings.automation.campaigns.mass_delete'))\n                                    <div class=\"flex select-none items-center gap-16\">\n                                        <input\n                                            type=\"checkbox\"\n                                            :name=\"`mass_action_select_record_${record.id}`\"\n                                            :id=\"`mass_action_select_record_${record.id}`\"\n                                            :value=\"record.id\"\n                                            class=\"peer hidden\"\n                                            v-model=\"applied.massActions.indices\"\n                                        >\n\n                                        <label\n                                            class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-600 peer-checked:text-brandColor dark:text-gray-300\"\n                                            :for=\"`mass_action_select_record_${record.id}`\"\n                                        ></label>\n                                    </div>\n                                @endif\n\n                                <!-- Id -->\n                                <p>@{{ record.id }}</p>\n\n                                <!-- Name -->\n                                <p>@{{ record.name }}</p>\n\n                                <!-- Subject -->\n                                <p>@{{ record.subject }}</p>\n\n                                <!-- Status -->\n                                <span\n                                    :class=\"record.status == 1 ? 'label-active' : 'label-inactive'\"\n                                >\n                                    @{{ record.status == 1 ? '@lang('admin::app.settings.marketing.campaigns.index.datagrid.active')' : '@lang('admin::app.settings.marketing.campaigns.index.datagrid.inactive')' }}\n                                </span>\n\n                                <!-- Actions -->\n                                <div class=\"flex justify-end\">\n                                    @if (bouncer()->hasPermission('settings.automation.campaigns.edit'))\n                                        <a @click.prevent=\"actionType = 'edit';edit(record)\">\n                                            <span\n                                                :class=\"record.actions.find(action => action.index === 'edit')?.icon\"\n                                                class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                            >\n                                            </span>\n                                        </a>\n                                    @endif\n\n                                    @if (bouncer()->hasPermission('settings.automation.campaigns.delete'))\n                                        <a @click.prevent=\"performAction(record.actions.find(action => action.index === 'delete'))\">\n                                            <span\n                                                :class=\"record.actions.find(action => action.index === 'delete')?.icon\"\n                                                class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                            >\n                                            </span>\n                                        </a>\n                                    @endif\n                                </div>\n                            </div>\n\n                            <!-- Mobile Card View -->\n                            <div\n                                class=\"hidden border-b px-4 py-4 text-black dark:border-gray-800 dark:text-gray-300 max-lg:block\"\n                                v-for=\"record in available.records\"\n                            >\n                                <div class=\"mb-2 flex items-center justify-between\">\n                                    <!-- Mass Actions for Mobile Cards -->\n                                    <div class=\"flex w-full items-center justify-between gap-2\">\n                                        @if (bouncer()->hasPermission('settings.automation.campaigns.mass_delete'))\n                                            <p v-if=\"available.massActions.length\">\n                                                <label :for=\"`mass_action_select_record_${record[available.meta.primary_column]}`\">\n                                                    <input\n                                                        type=\"checkbox\"\n                                                        :name=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                        :value=\"record[available.meta.primary_column]\"\n                                                        :id=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                        class=\"peer hidden\"\n                                                        v-model=\"applied.massActions.indices\"\n                                                    >\n\n                                                    <span class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-500 peer-checked:text-brandColor\">\n                                                    </span>\n                                                </label>\n                                            </p>\n                                        @endif\n\n                                        <!-- Actions for Mobile -->\n                                        <div\n                                            class=\"flex w-full items-center justify-end\"\n                                            v-if=\"available.actions.length\"\n                                        >\n                                            @if (bouncer()->hasPermission('settings.automation.campaigns.edit'))\n                                                <a @click.prevent=\"actionType = 'edit';edit(record)\">\n                                                    <span\n                                                        :class=\"record.actions.find(action => action.index === 'edit')?.icon\"\n                                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                                    >\n                                                    </span>\n                                                </a>\n                                            @endif\n\n                                            @if (bouncer()->hasPermission('settings.automation.campaigns.delete'))\n                                                <a @click.prevent=\"performAction(record.actions.find(action => action.index === 'delete'))\">\n                                                    <span\n                                                        :class=\"record.actions.find(action => action.index === 'delete')?.icon\"\n                                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                                    >\n                                                    </span>\n                                                </a>\n                                            @endif\n                                        </div>\n                                    </div>\n                                </div>\n\n                                <!-- Card Content -->\n                                <div class=\"grid gap-2\">\n                                    <template v-for=\"column in available.columns\">\n                                        <div class=\"flex flex-wrap items-baseline gap-x-2\">\n                                            <span class=\"text-slate-600 dark:text-gray-300\" v-html=\"column.label + ':'\"></span>\n                                            <span class=\"break-words font-medium text-slate-900 dark:text-white\" v-html=\"record[column.index]\"></span>\n                                        </div>\n                                    </template>\n                                </div>\n                            </div>\n                        </template>\n                    </template>\n                </x-admin::datagrid>\n\n                <Teleport to=\"body\">\n                    {!! view_render_event('admin.settings.marketing.campaigns.index.form_controls.before') !!}\n\n                    <x-admin::form\n                        v-slot=\"{ meta, errors, handleSubmit }\"\n                        as=\"div\"\n                    >\n                        <form\n                            @submit=\"handleSubmit($event, createOrUpdate)\"\n                            ref=\"campaignForm\"\n                        >\n                            {!! view_render_event('admin.settings.marketing.campaigns.index.form_controls.modal.before') !!}\n\n                            <x-admin::modal ref=\"campaignModal\">\n                                <x-slot:header>\n                                    {!! view_render_event('admin.settings.marketing.campaigns.index.form_controls.modal.header.dropdown.before') !!}\n\n                                    <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                                        @{{\n                                            actionType == 'create'\n                                            ? \"@lang('admin::app.settings.marketing.campaigns.index.create.title')\"\n                                            : \"@lang('admin::app.settings.marketing.campaigns.index.edit.title')\"\n                                        }}\n                                    </p>\n\n                                    {!! view_render_event('admin.settings.marketing.campaigns.index.form_controls.modal.header.dropdown.after') !!}\n                                </x-slot>\n\n                                <x-slot:content>\n                                    {!! view_render_event('admin.settings.marketing.campaigns.index.form_controls.modal.content.controls.before') !!}\n\n                                    <!-- Name -->\n                                    <x-admin::form.control-group>\n                                        <x-admin::form.control-group.label\n                                            class=\"required\"\n                                            for=\"name\"\n                                        >\n                                            @lang('admin::app.settings.marketing.campaigns.index.create.name')\n                                        </x-admin::form.control-group.label>\n\n                                        <x-admin::form.control-group.control\n                                            type=\"hidden\"\n                                            name=\"id\"\n                                            ::value=\"campaign.id\"\n                                        />\n\n                                        <x-admin::form.control-group.control\n                                            type=\"text\"\n                                            name=\"name\"\n                                            id=\"name\"\n                                            rules=\"required\"\n                                            ::value=\"campaign.name\"\n                                            :label=\"trans('admin::app.settings.marketing.campaigns.index.create.name')\"\n                                        />\n\n                                        <x-admin::form.control-group.error control-name=\"name\" />\n                                    </x-admin::form.control-group>\n\n                                    <!-- Subject -->\n                                    <x-admin::form.control-group>\n                                        <x-admin::form.control-group.label\n                                            class=\"required\"\n                                            for=\"subject\"\n                                        >\n                                            @lang('admin::app.settings.marketing.campaigns.index.create.subject')\n                                        </x-admin::form.control-group.label>\n\n                                        <x-admin::form.control-group.control\n                                            type=\"text\"\n                                            name=\"subject\"\n                                            id=\"subject\"\n                                            rules=\"required\"\n                                            rows=\"4\"\n                                            ::value=\"campaign.subject\"\n                                            :label=\"trans('admin::app.settings.marketing.campaigns.index.create.subject')\"\n                                        />\n\n                                        <x-admin::form.control-group.error control-name=\"subject\" />\n                                    </x-admin::form.control-group>\n\n                                    <!-- Event -->\n                                    <x-admin::form.control-group>\n                                        <x-admin::form.control-group.label\n                                            class=\"required\"\n                                            for=\"marketing_event_id\"\n                                        >\n                                            @lang('admin::app.settings.marketing.campaigns.index.create.event')\n                                        </x-admin::form.control-group.label>\n\n                                        <x-admin::form.control-group.control\n                                            type=\"select\"\n                                            class=\"cursor-pointer\"\n                                            name=\"marketing_event_id\"\n                                            id=\"marketing_event_id\"\n                                            rules=\"required\"\n                                            ::value=\"campaign.marketing_event_id\"\n                                            :label=\"trans('admin::app.settings.marketing.campaigns.index.create.event')\"\n                                        >\n                                            <option\n                                                v-for=\"event in events\"\n                                                v-text=\"event.name\"\n                                                :value=\"event.id\"\n                                            ></option>\n                                        </x-admin::form.control-group.control>\n\n                                        <x-admin::form.control-group.error control-name=\"marketing_event_id\" />\n                                    </x-admin::form.control-group>\n\n                                    <!-- Email Template -->\n                                    <x-admin::form.control-group>\n                                        <x-admin::form.control-group.label\n                                            class=\"required\"\n                                            for=\"marketing_template_id\"\n                                        >\n                                            @lang('admin::app.settings.marketing.campaigns.index.create.email-template')\n                                        </x-admin::form.control-group.label>\n\n                                        <x-admin::form.control-group.control\n                                            type=\"select\"\n                                            class=\"cursor-pointer\"\n                                            name=\"marketing_template_id\"\n                                            id=\"marketing_template_id\"\n                                            rules=\"required\"\n                                            ::value=\"campaign.marketing_template_id\"\n                                            :label=\"trans('admin::app.settings.marketing.campaigns.index.create.email-template')\"\n                                        >\n                                            <option\n                                                v-for=\"template in emailTemplates\"\n                                                v-text=\"template.name\"\n                                                :value=\"template.id\"\n                                            ></option>\n                                        </x-admin::form.control-group.control>\n\n                                        <x-admin::form.control-group.error control-name=\"marketing_template_id\" />\n                                    </x-admin::form.control-group>\n\n                                    <!-- Status -->\n                                    <x-admin::form.control-group>\n                                        <x-admin::form.control-group.label for=\"status\">\n                                            @lang('admin::app.settings.marketing.campaigns.index.create.status')\n                                        </x-admin::form.control-group.label>\n\n                                        <input\n                                            type=\"hidden\"\n                                            name=\"status\"\n                                            :value=\"0\"\n                                        />\n\n                                        <x-admin::form.control-group.control\n                                            type=\"switch\"\n                                            name=\"status\"\n                                            value=\"1\"\n                                            :label=\"trans('admin::app.settings.marketing.campaigns.index.create.status')\"\n                                            ::checked=\"parseInt(campaign.status || 0)\"\n                                        />\n                                    </x-admin::form.control-group>\n\n                                    {!! view_render_event('admin.settings.marketing.campaigns.index.form_controls.modal.content.controls.after') !!}\n                                </x-slot>\n\n                                <x-slot:footer>\n                                    {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.footer.save_button.before') !!}\n\n                                    <!-- Save Button -->\n                                    <x-admin::button\n                                        type=\"submit\"\n                                        class=\"primary-button\"\n                                        :title=\"trans('admin::app.components.activities.actions.activity.save-btn')\"\n                                        ::loading=\"isStoring\"\n                                        ::disabled=\"isStoring\"\n                                    />\n\n                                    {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.footer.save_button.after') !!}\n                                </x-slot>\n                            </x-admin::modal>\n\n                            {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.after') !!}\n                        </form>\n                    </x-admin::form>\n\n                    {!! view_render_event('admin.components.activities.actions.activity.form_controls.after') !!}\n                </Teleport>\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-campaigns', {\n                template: '#v-campaigns-template',\n\n                data() {\n                    return {\n                        isStoring: false,\n\n                        actionType: 'create',\n\n                        campaign: {},\n\n                        events: [],\n\n                        emailTemplates: [],\n                    };\n                },\n\n                computed: {\n                    gridsCount() {\n                        let count = this.$refs.datagrid.available.columns.length;\n\n                        if (this.$refs.datagrid.available.actions.length) {\n                            ++count;\n                        }\n\n                        if (this.$refs.datagrid.available.massActions.length) {\n                            ++count;\n                        }\n\n                        return count;\n                    },\n                },\n\n                mounted() {\n                    this.getEvents();\n\n                    this.getEmailTemplates();\n                },\n\n                methods: {\n                    /**\n                     * Toggle the modal.\n                     *\n                     * @return {void}\n                     */\n                    toggleModal() {\n                        this.$refs.campaignModal.toggle();\n                    },\n\n                    handleCreate() {\n                        this.actionType = 'create';\n\n                        this.campaign = {};\n\n                        this.toggleModal();\n                    },\n\n                    /**\n                     * Get the all marketing events.\n                     *\n                     * @return {void}\n                     */\n                    getEvents() {\n                        this.$axios.get(\"{{ route('admin.settings.marketing.campaigns.events') }}\")\n                            .then(response => this.events = response.data.data)\n                            .catch(error => {});\n                    },\n\n                    /**\n                     * Get the all Email Templates.\n                     *\n                     * @return {void}\n                     */\n                    getEmailTemplates() {\n                        this.$axios.get(\"{{ route('admin.settings.marketing.campaigns.email-templates') }}\")\n                            .then(response => this.emailTemplates = response.data.data)\n                            .catch(error => {});\n                    },\n\n                    /**\n                     * Create or Update the campaigns.\n                     *\n                     * @param {Object} params\n                     * @param {Function} helpers.resetForm\n                     * @param {Function} helpers.setErrors\n                     * @return {void}\n                     */\n                    createOrUpdate(paramas, { resetForm, setErrors }) {\n                        this.isStoring = true;\n\n                        const campaignForm = new FormData(this.$refs.campaignForm);\n\n                        const isUpdating = paramas.id && this.actionType === 'edit';\n\n                        campaignForm.append('_method', isUpdating ? 'put' : 'post');\n\n                        this.$axios.post(\n                            isUpdating\n                            ? \"{{ route('admin.settings.marketing.campaigns.update', ':id') }}\".replace(':id', paramas.id)\n                            : \"{{ route('admin.settings.marketing.campaigns.store') }}\",\n                            campaignForm,\n                        )\n                            .then(response => {\n                                this.$refs.campaignModal.toggle();\n\n                                this.$refs.datagrid.get();\n\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch(error => {\n                                setErrors(error.response.data?.errors);\n                            })\n                            .finally(() => this.isStoring = false);\n                    },\n\n                    /**\n                     * Get the particular campaign record, so that we can use for edit.\n                     *\n                     * @param {Object} record\n                     */\n                    edit(record) {\n                        this.$axios.get(\"{{ route('admin.settings.marketing.campaigns.edit', ':id') }}\".replace(':id', record.id))\n                            .then(response => {\n                                this.campaign = response.data.data;\n\n                                this.toggleModal();\n                            })\n                            .catch(error => {});\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/marketing/events/index.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.marketing.events.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <!-- Header section -->\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.settings.marketing.events.index.breadcrumbs.before') !!}\n\n                <!-- Breadcrumbs -->\n                <x-admin::breadcrumbs name=\"settings.marketing.events\" />\n\n                {!! view_render_event('admin.settings.marketing.events.index.breadcrumbs.after') !!}\n                \n                <div class=\"text-xl font-bold dark:text-gray-300\">\n                    @lang('admin::app.settings.marketing.events.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">                \n                <!-- Create button for Marketing Event -->\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.settings.marketing.events.index.breadcrumbs.after') !!}\n\n                    @if (bouncer()->hasPermission('settings.automation.events.create'))\n                        <button\n                            type=\"button\"\n                            class=\"primary-button\"\n                            @click=\"$refs.marketingEvent.actionType = 'create';$refs.marketingEvent.toggleModal()\"\n                        >\n                            @lang('admin::app.settings.marketing.events.index.create-btn')\n                        </button>\n                    @endif\n\n                    {!! view_render_event('admin.settings.marketing.events.index.create_button.after') !!}\n                </div>\n            </div>\n        </div>\n        \n        <v-marketing-events ref=\"marketingEvent\">\n            <x-admin::shimmer.datagrid />\n        </v-marketing-events>\n    </div>\n\n    @pushOnce('scripts')\n        <script \n            type=\"text/x-template\" \n            id=\"v-marketing-events-template\"\n        >\n            <div>\n                <!-- Datagrid -->\n                <x-admin::datagrid\n                    :src=\"route('admin.settings.marketing.events.index')\"\n                    ref=\"datagrid\"\n                >\n                    <template #body=\"{\n                        isLoading,\n                        available,\n                        applied,\n                        selectAll,\n                        sort,\n                        performAction\n                    }\">\n                        <template v-if=\"isLoading\">\n                            <x-admin::shimmer.datagrid.table.body />\n                        </template>\n            \n                        <template v-else>\n                            <div\n                                v-for=\"record in available.records\"\n                                class=\"row grid items-center gap-2.5 border-b px-4 py-4 text-gray-600 transition-all hover:bg-gray-50 dark:border-gray-800 dark:text-gray-300 dark:hover:bg-gray-950 max-lg:hidden\"\n                                :style=\"`grid-template-columns: repeat(${gridsCount}, minmax(0, 1fr))`\"\n                            >\n                                <!-- Mass Actions, Title and Created By -->\n                                @if (bouncer()->hasPermission('settings.automation.events.mass_delete'))\n                                    <div class=\"flex select-none items-center gap-16\">\n                                        <input\n                                            type=\"checkbox\"\n                                            :name=\"`mass_action_select_record_${record.id}`\"\n                                            :id=\"`mass_action_select_record_${record.id}`\"\n                                            :value=\"record.id\"\n                                            class=\"peer hidden\"\n                                            v-model=\"applied.massActions.indices\"\n                                        >\n\n                                        <label\n                                            class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-600 peer-checked:text-brandColor dark:text-gray-300\"\n                                            :for=\"`mass_action_select_record_${record.id}`\"\n                                        ></label>\n                                    </div>\n                                @endif\n                                \n                                <!-- Marketing Event Id -->\n                                <p>@{{ record.id }}</p>\n            \n                                <!-- Marketing Event Name -->\n                                <p>@{{ record.name }}</p>\n\n                                <!-- Marketing Event Description -->\n                                <p>@{{ record.description }}</p>\n\n                                <!-- Marketing Event Date -->\n                                <p>@{{ record.date }}</p>\n\n                                <!-- Actions -->\n                                <div class=\"flex justify-end\">\n                                    @if (bouncer()->hasPermission('settings.automation.events.edit'))\n                                        <a @click.prevent=\"actionType = 'edit';edit(record)\">\n                                            <span\n                                                :class=\"record.actions.find(action => action.index === 'edit')?.icon\"\n                                                class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                            >\n                                            </span>\n                                        </a>\n                                    @endif\n\n                                    @if (bouncer()->hasPermission('settings.automation.events.delete'))\n                                        <a @click.prevent=\"performAction(record.actions.find(action => action.index === 'delete'))\">\n                                            <span\n                                                :class=\"record.actions.find(action => action.index === 'delete')?.icon\"\n                                                class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                            >\n                                            </span>\n                                        </a>\n                                    @endif\n                                </div>\n                            </div>\n\n                            <!-- Mobile Card View -->\n                            <div\n                                class=\"hidden border-b px-4 py-4 text-black dark:border-gray-800 dark:text-gray-300 max-lg:block\"\n                                v-for=\"record in available.records\"\n                            >\n                                <div class=\"mb-2 flex items-center justify-between\">\n                                    <!-- Mass Actions for Mobile Cards -->\n                                    <div class=\"flex w-full items-center justify-between gap-2\">\n                                        @if (bouncer()->hasPermission('settings.automation.events.mass_delete'))\n                                            <p v-if=\"available.massActions.length\">\n                                                <label :for=\"`mass_action_select_record_${record[available.meta.primary_column]}`\">\n                                                    <input\n                                                        type=\"checkbox\"\n                                                        :name=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                        :value=\"record[available.meta.primary_column]\"\n                                                        :id=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                        class=\"peer hidden\"\n                                                        v-model=\"applied.massActions.indices\"\n                                                    >\n\n                                                    <span class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-500 peer-checked:text-brandColor\">\n                                                    </span>\n                                                </label>\n                                            </p>\n                                        @endif\n\n                                        <!-- Actions for Mobile -->\n                                        <div\n                                            class=\"flex w-full items-center justify-end\"\n                                            v-if=\"available.actions.length\"\n                                        >\n                                            @if (bouncer()->hasPermission('settings.automation.events.edit'))\n                                                <a @click.prevent=\"actionType = 'edit';edit(record)\">\n                                                    <span\n                                                        :class=\"record.actions.find(action => action.index === 'edit')?.icon\"\n                                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                                    >\n                                                    </span>\n                                                </a>\n                                            @endif\n\n                                            @if (bouncer()->hasPermission('settings.automation.events.delete'))\n                                                <a @click.prevent=\"performAction(record.actions.find(action => action.index === 'delete'))\">\n                                                    <span\n                                                        :class=\"record.actions.find(action => action.index === 'delete')?.icon\"\n                                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                                    >\n                                                    </span>\n                                                </a>\n                                            @endif\n                                        </div>\n                                    </div>\n                                </div>\n\n                                <!-- Card Content -->\n                                <div class=\"grid gap-2\">\n                                    <template v-for=\"column in available.columns\">\n                                        <div class=\"flex flex-wrap items-baseline gap-x-2\">\n                                            <span class=\"text-slate-600 dark:text-gray-300\" v-html=\"column.label + ':'\"></span>\n                                            <span class=\"break-words font-medium text-slate-900 dark:text-white\" v-html=\"record[column.index]\"></span>\n                                        </div>\n                                    </template>\n                                </div>\n                            </div>\n                        </template>\n                    </template>\n                </x-admin::datagrid>\n\n                <Teleport to=\"body\">\n                    {!! view_render_event('admin.settings.marketing.events.index.form_controls.before') !!}\n        \n                    <x-admin::form\n                        v-slot=\"{ meta, errors, handleSubmit }\"\n                        as=\"div\"\n                        ref=\"eventForm\"\n                    >\n                        <form @submit=\"handleSubmit($event, createOrUpdate)\">\n                            {!! view_render_event('admin.settings.marketing.events.index.form_controls.modal.before') !!}\n        \n                            <x-admin::modal ref=\"marketingModal\">\n                                <x-slot:header>\n                                    {!! view_render_event('admin.settings.marketing.events.index.form_controls.modal.header.dropdown.before') !!}\n        \n                                    <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                                        @{{ \n                                            actionType == 'create'\n                                            ? \"@lang('admin::app.settings.marketing.events.index.create.title')\"\n                                            : \"@lang('admin::app.settings.marketing.events.index.edit.title')\" \n                                        }}\n                                    </p>\n\n                                    {!! view_render_event('admin.settings.marketing.events.index.form_controls.modal.header.dropdown.after') !!}\n                                </x-slot>\n        \n                                <x-slot:content>\n                                    {!! view_render_event('admin.settings.marketing.events.index.form_controls.modal.content.controls.before') !!}\n        \n                                    <!-- Name -->\n                                    <x-admin::form.control-group>\n                                        <x-admin::form.control-group.label\n                                            class=\"required\"\n                                            for=\"name\"\n                                        >\n                                            @lang('admin::app.settings.marketing.events.index.create.name')\n                                        </x-admin::form.control-group.label>\n                                        \n                                        <x-admin::form.control-group.control\n                                            type=\"hidden\"\n                                            name=\"id\"\n                                        />\n\n                                        <x-admin::form.control-group.control\n                                            type=\"text\"\n                                            name=\"name\"\n                                            id=\"name\"\n                                            rules=\"required|max:60\"\n                                            :label=\"trans('admin::app.settings.marketing.events.index.create.name')\"\n                                        />\n        \n                                        <x-admin::form.control-group.error control-name=\"name\" />\n                                    </x-admin::form.control-group>\n        \n                                    <!-- Description -->\n                                    <x-admin::form.control-group>\n                                        <x-admin::form.control-group.label \n                                            class=\"required\"\n                                            for=\"description\"\n                                        >\n                                            @lang('admin::app.settings.marketing.events.index.create.description')\n                                        </x-admin::form.control-group.label>\n                                        \n                                        <x-admin::form.control-group.control\n                                            type=\"textarea\"\n                                            name=\"description\"\n                                            id=\"description\"\n                                            rules=\"required\"\n                                            rows=\"4\"\n                                            :label=\"trans('admin::app.settings.marketing.events.index.create.description')\"\n                                        />\n        \n                                        <x-admin::form.control-group.error control-name=\"description\" />\n                                    </x-admin::form.control-group>\n\n                                    <!-- Date -->\n                                    <x-admin::form.control-group>\n                                        <x-admin::form.control-group.label \n                                            class=\"required\"\n                                            for=\"date\"\n                                        >\n                                            @lang('admin::app.settings.marketing.events.index.create.date')\n                                        </x-admin::form.control-group.label>\n                                        \n                                        <x-admin::form.control-group.control\n                                            type=\"date\"\n                                            name=\"date\"\n                                            id=\"date\"\n                                            rules=\"required\"\n                                            :label=\"trans('admin::app.settings.marketing.events.index.create.date')\"\n                                        />\n        \n                                        <x-admin::form.control-group.error control-name=\"date\" />\n                                    </x-admin::form.control-group>\n\n                                    {!! view_render_event('admin.settings.marketing.events.index.form_controls.modal.content.controls.after') !!}\n                                </x-slot>\n        \n                                <x-slot:footer>\n                                    {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.footer.save_button.before') !!}\n        \n                                    <x-admin::button\n                                        type=\"submit\"\n                                        class=\"primary-button\"\n                                        :title=\"trans('admin::app.settings.marketing.events.index.create.save-btn')\"\n                                        ::loading=\"isStoring\"\n                                        ::disabled=\"isStoring\"\n                                    />\n        \n                                    {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.footer.save_button.after') !!}\n                                </x-slot>\n                            </x-admin::modal>\n        \n                            {!! view_render_event('admin.components.activities.actions.activity.form_controls.modal.after') !!}\n                        </form>\n                    </x-admin::form>\n        \n                    {!! view_render_event('admin.components.activities.actions.activity.form_controls.after') !!}\n                </Teleport>\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-marketing-events', {\n                template: '#v-marketing-events-template',\n\n                data() {\n                    return {\n                        isStoring: false,\n\n                        actionType: 'create',   \n                    };\n                },\n\n                computed: {\n                    gridsCount() {\n                        let count = this.$refs.datagrid.available.columns.length;\n        \n                        if (this.$refs.datagrid.available.actions.length) {\n                            ++count;\n                        }\n        \n                        if (this.$refs.datagrid.available.massActions.length) {\n                            ++count;\n                        }\n        \n                        return count;\n                    },\n                },\n\n                methods: {\n                    /**\n                     * Toggle the modal. \n                     */\n                    toggleModal() {\n                        this.$refs.marketingModal.toggle();\n                    },\n\n                    /**\n                     * Create or Update the Events.\n                     * \n                     * @param {Object} params\n                     * @param {Function} helpers.resetForm\n                     * @param {Function} helpers.setErrors\n                     * \n                     * @return {void}\n                     */\n                    createOrUpdate(paramas, { resetForm, setErrors }) {\n                        this.isStoring = true;\n\n                        const isUpdating = paramas.id && this.actionType === 'edit';\n\n                        isUpdating && (paramas._method = 'PUT');\n\n                        this.$axios.post(\n                            isUpdating\n                            ? \"{{ route('admin.settings.marketing.events.update', ':id') }}\".replace(':id', paramas.id)\n                            : \"{{ route('admin.settings.marketing.events.store') }}\", \n                            paramas\n                        )\n                            .then(response => {\n                                this.isStoring = false;\n\n                                this.$refs.marketingModal.toggle();\n\n                                this.$refs.datagrid.get();\n\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch(error => {\n                                this.isStoring = false;\n\n                                setErrors(error.response.data.errors);\n                            });\n                    },\n\n                    /**\n                     * Get the particular event record, so that we can use for edit.\n                     * \n                     * @param {Object} record\n                     */\n                    edit(record) {\n                        this.$refs.eventForm.setValues(record);\n\n                        this.toggleModal();\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/pipelines/create.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.pipelines.create.title')\n    </x-slot>\n\n    {!! view_render_event('admin.settings.pipelines.create.form.before') !!}\n\n    <x-admin::form\n        :action=\"route('admin.settings.pipelines.store')\"\n        method=\"POST\"\n    >\n        <div class=\"flex flex-col gap-2 rounded-lg border border-gray-200 bg-white text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex items-center justify-between px-4 py-2\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.pipelines.create.breadcrumbs.before') !!}\n\n                    <!-- Breadcrumbs -->\n                    <x-admin::breadcrumbs name=\"settings.pipelines.create\" />\n\n                    {!! view_render_event('admin.settings.pipelines.create.breadcrumbs.after') !!}\n\n                    <!-- Title -->\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.settings.pipelines.create.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.pipelines.create.save_button.before') !!}\n\n                        <!-- Create button for Pipeline -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.pipelines.create.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.settings.pipelines.create.save_button.after') !!}\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"flex gap-4 border-t border-gray-200 px-4 py-2 align-top dark:border-gray-800 max-sm:flex-wrap\">\n                {!! view_render_event('admin.settings.pipelines.create.form.name.before') !!}\n\n                <!-- Name -->\n                <x-admin::form.control-group>\n                    <x-admin::form.control-group.label class=\"required\">\n                        @lang('admin::app.settings.pipelines.create.name')\n                    </x-admin::form.control-group.label>\n\n                    <x-admin::form.control-group.control\n                        type=\"text\"\n                        name=\"name\"\n                        id=\"name\"\n                        rules=\"required\"\n                        :label=\"trans('admin::app.settings.pipelines.create.name')\"\n                        :placeholder=\"trans('admin::app.settings.pipelines.create.name')\"\n                        value=\"{{ old('name') }}\"\n                    />\n\n                    <x-admin::form.control-group.error control-name=\"name\" />\n                </x-admin::form.control-group>\n\n                {!! view_render_event('admin.settings.pipelines.create.form.name.after') !!}\n\n                {!! view_render_event('admin.settings.pipelines.create.form.rotten_days.before') !!}\n\n                <!-- Rotten-Days -->\n                <x-admin::form.control-group>\n                    <x-admin::form.control-group.label class=\"required\">\n                        @lang('admin::app.settings.pipelines.create.rotten-days')\n                    </x-admin::form.control-group.label>\n\n                    <x-admin::form.control-group.control\n                        type=\"text\"\n                        name=\"rotten_days\"\n                        id=\"rotten_days\"\n                        rules=\"required|numeric|min_value:1\"\n                        :label=\"trans('admin::app.settings.pipelines.create.rotten-days')\"\n                        :placeholder=\"trans('admin::app.settings.pipelines.create.rotten-days')\"\n                        value=\"{{ old('rotten_days') ?? 30 }}\"\n                    />\n\n                    <x-admin::form.control-group.error control-name=\"rotten_days\" />\n                </x-admin::form.control-group>\n\n                {!! view_render_event('admin.settings.pipelines.create.form.rotten_days.after') !!}\n\n                {!! view_render_event('admin.settings.pipelines.create.form.is_default.before') !!}\n\n                <!-- Mark as Default -->\n                <x-admin::form.control-group class=\"!mb-0 flex items-center gap-4\">\n                    <x-admin::form.control-group.label class=\"!mb-0\">\n                        @lang('admin::app.settings.pipelines.create.mark-as-default')\n                    </x-admin::form.control-group.label>\n\n                    <x-admin::form.control-group.control\n                        type=\"switch\"\n                        class=\"cursor-pointer\"\n                        name=\"is_default\"\n                        id=\"is_default\"\n                        value=\"1\"\n                        for=\"is_default\"\n                        :label=\"trans('admin::app.settings.pipelines.create.mark-as-default')\"\n                    />\n\n                    <x-admin::form.control-group.error control-name=\"is_default\" />\n                </x-admin::form.control-group>\n\n                {!! view_render_event('admin.settings.pipelines.create.form.is_default.after') !!}\n            </div>\n        </div>\n\n        <!-- Stages Component -->\n        <div class=\"flex gap-2.5 overflow-auto py-3.5 max-xl:flex-wrap\">\n            {!! view_render_event('admin.settings.pipelines.create.form.stages.before') !!}\n\n            <v-stages-component>\n                <x-admin::shimmer.pipelines.kanban />\n            </v-stages-component>\n\n            {!! view_render_event('admin.settings.pipelines.create.form.stages.after') !!}\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.settings.pipelines.create.form.after') !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-stages-component-template\"\n        >\n            <div class=\"flex gap-4\">\n                <!-- Stages Draggable Component -->\n                <draggable\n                    tag=\"div\"\n                    ghost-class=\"draggable-ghost\"\n                    :handle=\"isAnyDraggable ? '.icon-move' : ''\"\n                    v-bind=\"{animation: 200}\"\n                    item-key=\"id\"\n                    :list=\"stages\"\n                    :move=\"handleDragging\"\n                    class=\"flex gap-4\"\n                >\n                    <template #item=\"{ element, index }\">\n                        <div\n                            ::class=\"{ draggable: isDragable(element) }\"\n                            class=\"flex gap-4 overflow-x-auto\"\n                        >\n                            <div class=\"flex min-w-[275px] max-w-[275px] flex-col justify-between rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                                <!-- Stage Crad -->\n                                <div class=\"flex flex-col gap-6 px-4 py-3\">\n                                    <!-- Stage Title and Action -->\n                                    <div class=\"flex items-center justify-between\">\n                                        <span class=\"py-1 font-medium dark:text-gray-300\">\n                                            @{{ element.name ? element.name : '@lang('admin::app.settings.pipelines.create.newly-added')'}} \n                                        </span>\n\n                                        <!-- Drag Icon -->\n                                        <i\n                                            v-if=\"isDragable(element)\" \n                                            class=\"icon-move cursor-grab rounded-md p-1 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                                        >\n                                        </i>\n                                    </div>\n                                    \n                                    <!-- Card Body -->\n                                    <div>\n                                        <input\n                                            type=\"hidden\"\n                                            id=\"slug\"\n                                            :value=\"slugify(element.name)\"\n                                            :name=\"'stages[' + element.id + '][code]'\"\n                                        />\n\n                                        {!! view_render_event('admin.settings.pipelines.create.form.stages.name.before') !!}\n\n                                        <!-- Name -->\n                                        <x-admin::form.control-group>\n                                            <x-admin::form.control-group.label class=\"required\">\n                                                @lang('admin::app.settings.pipelines.create.name')\n                                            </x-admin::form.control-group.label>\n                                            \n                                            <x-admin::form.control-group.control\n                                                type=\"text\"\n                                                ::name=\"'stages[' + element.id + '][name]'\"\n                                                v-model=\"element['name']\"\n                                                ::rules=\"getValidation\"\n                                                :label=\"trans('admin::app.settings.pipelines.create.name')\"\n                                                ::readonly=\"! isDragable(element)\"\n                                            />\n\n                                            <x-admin::form.control-group.error ::name=\"'stages[' + element.id + '][name]'\" />\n                                        </x-admin::form.control-group>\n\n                                        {!! view_render_event('admin.settings.pipelines.create.form.stages.name.before') !!}\n\n                                        <input\n                                            type=\"hidden\"\n                                            :value=\"index + 1\"\n                                            :name=\"'stages[' + element.id + '][sort_order]'\"\n                                        />\n\n                                        {!! view_render_event('admin.settings.pipelines.create.form.stages.probability.before') !!}\n\n                                        <!-- Probabilty -->\n                                        <x-admin::form.control-group>\n                                            <x-admin::form.control-group.label class=\"required\">\n                                                @lang('admin::app.settings.pipelines.create.probability')\n                                            </x-admin::form.control-group.label>\n\n                                            <x-admin::form.control-group.control\n                                                type=\"text\"\n                                                ::name=\"'stages[' + element.id + '][probability]'\"\n                                                v-model=\"element['probability']\"\n                                                rules=\"required|numeric|min_value:0|max_value:100\"\n                                                ::readonly=\"element?.code != 'new' && ! isDragable(element)\"\n                                                :label=\"trans('admin::app.settings.pipelines.create.probability')\"\n                                            />\n                                            <x-admin::form.control-group.error ::name=\"'stages[' + element.id + '][probability]'\" />\n                                        </x-admin::form.control-group>\n\n                                        {!! view_render_event('admin.settings.pipelines.create.form.stages.probability.after') !!}\n                                    </div>\n                                </div>\n                                \n                                {!! view_render_event('admin.settings.pipelines.create.form.stages.delete_button.before') !!}\n\n                                <div\n                                    class=\"flex cursor-pointer items-center gap-2 border-t border-gray-200 p-2 text-red-600 dark:border-gray-800\" \n                                    @click=\"removeStage(element)\" \n                                    v-if=\"isDragable(element)\"\n                                >\n                                    <i class=\"icon-delete text-2xl\"></i>\n                                    \n                                    @lang('admin::app.settings.pipelines.create.delete-stage')\n                                </div>\n\n                                {!! view_render_event('admin.settings.pipelines.create.form.stages.delete_button.after') !!}\n                            </div>\n                        </div>\n\n                    </template>\n                </draggable>\n\n                <!-- Add New Stage Card -->\n                <div class=\"flex min-h-[400px] min-w-[275px] max-w-[275px] flex-col items-center justify-center gap-1 rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                    <div class=\"flex flex-col items-center justify-center gap-6 px-4 py-3\">\n                        <div class=\"grid justify-center justify-items-center gap-3.5 text-center\">\n                            <div class=\"flex flex-col items-center gap-2\">\n                                <p class=\"text-xl font-semibold dark:text-gray-300\">\n                                    @lang('admin::app.settings.pipelines.create.add-new-stages')\n                                </p>\n\n                                <p class=\"text-gray-400\">\n                                    @lang('admin::app.settings.pipelines.create.add-stage-info')\n                                </p>\n                            </div>\n\n                            {!! view_render_event('admin.settings.pipelines.create.form.stages.create_button.before') !!}\n\n                            <!-- Add Stage Button -->\n                            <button\n                                class=\"secondary-button\"\n                                @click=\"addStage\"\n                                type=\"button\"\n                            >\n                                @lang('admin::app.settings.pipelines.create.stage-btn')\n                            </button>\n\n                            {!! view_render_event('admin.settings.pipelines.create.form.stages.create_button.after') !!}\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-stages-component', {\n                template: '#v-stages-component-template',\n\n                data() {\n                    return {\n                        stages: [{\n                            'id': 'stage_1',\n                            'code': 'new', \n                            'name': \"@lang('admin::app.settings.pipelines.create.new-stage')\",\n                            'probability': 100\n                        }, {\n                            'id': 'stage_2',\n                            'code': '',\n                            'name': '',\n                            'probability': 100\n                        }, {\n                            'id': 'stage_99',\n                            'code': 'won',\n                            'name': \"@lang('admin::app.settings.pipelines.create.won-stage')\",\n                            'probability': 100\n                        }, {\n                            'id': 'stage_100',\n                            'code': 'lost',\n                            'name': \"@lang('admin::app.settings.pipelines.create.lost-stage')\",\n                            'probability': 0\n                        }],\n\n                        stageCount: 3,\n\n                        isAnyDraggable: true,\n                    }\n                },\n\n                created() {\n                    this.extendValidations();\n                },\n\n                computed: {\n                    getValidation() {\n                        return {\n                            required: true,\n                            unique_name: this.stages,\n                        };\n                    },\n                },\n\n                methods: {\n                    addStage () {\n                        this.stages.splice((this.stages.length - 2), 0, {\n                            'id': 'stage_' + this.stageCount++,\n                            'code': '',\n                            'name': '',\n                            'probability': 100\n                        });\n                    },\n\n                    removeStage(stage) {\n                        this.$emitter.emit('open-confirm-modal', {\n                            agree: () => {\n                                const index = this.stages.indexOf(stage);\n\n                                if (index > -1) {\n                                    this.stages.splice(index, 1);\n                                }\n\n                                this.removeUniqueNameErrors();\n                                \n                                this.$emitter.emit('add-flash', { type: 'success', message: \"@lang('admin::app.settings.pipelines.create.stage-delete-success')\" });\n                            }\n                        });\n                    },\n\n                    isDragable (stage) {\n                        if (stage.code == 'new' || stage.code == 'won' || stage.code == 'lost') {\n                            return false;\n                        }\n\n                        return true;\n                    },\n\n                    slugify (name) {\n                        return name\n                            .toString()\n\n                            .toLowerCase()\n\n                            .replace(/[^\\w\\u0621-\\u064A\\u4e00-\\u9fa5\\u3402-\\uFA6D\\u3041-\\u30A0\\u30A0-\\u31FF- ]+/g, '')\n\n                            // replace whitespaces with dashes\n                            .replace(/ +/g, '-')\n\n                            // avoid having multiple dashes (---- translates into -)\n                            .replace('![-\\s]+!u', '-')\n\n                            .trim();\n                    },\n\n                    extendValidations() {\n                        defineRule('unique_name', (value, stages) => {\n                            if (! value || !value.length) {\n                                return true;\n                            }\n\n                            let filteredStages = stages.filter((stage) => {\n                                return stage.name.toLowerCase() === value.toLowerCase();\n                            });\n\n                            if (filteredStages.length > 1) {\n                                return \"{!! trans('admin::app.settings.pipelines.create.duplicate-name') !!}\";\n                            }\n\n                            this.removeUniqueNameErrors();\n\n                            return true;\n                        });\n                    },\n\n                    isDuplicateStageNameExists() {\n                        let stageNames = this.stages.map((stage) => stage.name);\n\n                        return stageNames.some((name, index) => stageNames.indexOf(name) !== index);\n                    },\n\n                    removeUniqueNameErrors() {\n                        if (!this.isDuplicateStageNameExists() && this.errors && Array.isArray(this.errors.items)) {\n                            const uniqueNameErrorIds = this.errors.items\n                                .filter(error => error.rule === 'unique_name')\n                                .map(error => error.id);\n\n                            uniqueNameErrorIds.forEach(id => this.errors.removeById(id));\n                        }\n                    },\n\n                    handleDragging(event) {\n                        const draggedElement = event.draggedContext.element;\n                        \n                        const relatedElement = event.relatedContext.element;\n\n                        return this.isDragable(draggedElement) && this.isDragable(relatedElement);\n                    },\n                },\n            })\n        </script>\n    @endPushOnce\n</x-admin::layouts>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/pipelines/edit.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.pipelines.edit.title')\n    </x-slot>\n\n    {!! view_render_event('admin.settings.pipelines.edit.form.before', ['pipeline' => $pipeline]) !!}\n\n    <x-admin::form\n        :action=\"route('admin.settings.pipelines.update', $pipeline->id)\"\n        method=\"POST\"\n    >\n        <!-- Header section -->\n        <div class=\"flex flex-col gap-2 rounded-lg border border-gray-200 bg-white text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex items-center justify-between px-4 py-2\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.pipelines.edit.breadcrumbs.before', ['pipeline' => $pipeline]) !!}\n\n                    <!-- Breadcrumbs -->\n                    <x-admin::breadcrumbs \n                        name=\"settings.pipelines.edit\"\n                        :entity=\"$pipeline\"\n                    />\n\n                    {!! view_render_event('admin.settings.pipelines.edit.breadcrumbs.after', ['pipeline' => $pipeline]) !!}\n\n                    <!-- Title -->\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.settings.pipelines.edit.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.pipelines.edit.save_button.before', ['pipeline' => $pipeline]) !!}\n\n                        <!-- Save button -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.pipelines.edit.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.settings.pipelines.edit.save_button.after', ['pipeline' => $pipeline]) !!}\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"flex gap-4 border-t border-gray-200 px-4 py-2 align-top dark:border-gray-800 max-sm:flex-wrap\">\n                {!! view_render_event('admin.settings.pipelines.edit.form.name.before', ['pipeline' => $pipeline]) !!}\n\n                <!-- Pipeline Name -->\n                <x-admin::form.control-group>\n                    <x-admin::form.control-group.label class=\"required\">\n                        @lang('admin::app.settings.pipelines.edit.name')\n                    </x-admin::form.control-group.label>\n\n                    <x-admin::form.control-group.control\n                        type=\"text\"\n                        name=\"name\"\n                        id=\"name\"\n                        rules=\"required\"\n                        :label=\"trans('admin::app.settings.pipelines.edit.name')\"\n                        :placeholder=\"trans('admin::app.settings.pipelines.edit.name')\"\n                        value=\"{{ old('name') ?: $pipeline->name }}\"\n                    />\n\n                    <x-admin::form.control-group.error control-name=\"name\" />\n                </x-admin::form.control-group>\n\n                {!! view_render_event('admin.settings.pipelines.edit.form.name.after', ['pipeline' => $pipeline]) !!}\n\n                {!! view_render_event('admin.settings.pipelines.edit.form.rotten_days.before', ['pipeline' => $pipeline]) !!}\n                \n                <!-- Pipeline Rotten Days -->\n                <x-admin::form.control-group>\n                    <x-admin::form.control-group.label class=\"required\">\n                        @lang('admin::app.settings.pipelines.edit.rotten-days')\n                    </x-admin::form.control-group.label>\n\n                    <x-admin::form.control-group.control\n                        type=\"text\"\n                        name=\"rotten_days\"\n                        id=\"rotten_days\"\n                        rules=\"required|numeric|min_value:1\"\n                        :label=\"trans('admin::app.settings.pipelines.edit.rotten-days')\"\n                        :placeholder=\"trans('admin::app.settings.pipelines.edit.rotten-days')\"\n                        value=\"{{ old('rotten_days') ?: $pipeline->rotten_days }}\"\n                    />\n\n                    <x-admin::form.control-group.error control-name=\"rotten_days\" />\n                </x-admin::form.control-group>\n\n                {!! view_render_event('admin.settings.pipelines.edit.form.rotten_days.after', ['pipeline' => $pipeline]) !!}\n\n                {!! view_render_event('admin.settings.pipelines.edit.form.is_default.before', ['pipeline' => $pipeline]) !!}\n\n                <!-- Pipeline Default Switcher -->\n                <x-admin::form.control-group class=\"mt-4 flex items-center gap-4\">\n                    <x-admin::form.control-group.label class=\"mb-0\">\n                        @lang('admin::app.settings.pipelines.edit.mark-as-default')\n                    </x-admin::form.control-group.label>\n\n                    <x-admin::form.control-group.control\n                        type=\"switch\"\n                        class=\"cursor-pointer\"\n                        name=\"is_default\"\n                        id=\"is_default\"\n                        value=\"1\"\n                        :checked=\"(boolean) $pipeline->is_default\"\n                        :label=\"trans('admin::app.settings.pipelines.edit.mark-as-default')\"\n                    />\n\n                    <x-admin::form.control-group.error control-name=\"is_default\" />\n                </x-admin::form.control-group>\n\n                {!! view_render_event('admin.settings.pipelines.edit.form.is_default.after', ['pipeline' => $pipeline]) !!}\n            </div>\n        </div>\n\n        <div class=\"flex gap-2.5 overflow-auto py-3.5 max-xl:flex-wrap\">\n            <!-- Stages Component -->\n            <v-stages-component>\n                <x-admin::shimmer.pipelines.kanban />\n            </v-stages-component>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.settings.pipelines.edit.form.after', ['pipeline' => $pipeline]) !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-stages-component-template\"\n        >\n            <div class=\"flex gap-4\">\n                <!-- Stages Draggable Component -->\n                <draggable\n                    tag=\"div\"\n                    ghost-class=\"draggable-ghost\"\n                    v-bind=\"{animation: 200}\"\n                    item-key=\"id\"\n                    :list=\"stages\"\n                    :move=\"handleDragging\"\n                    class=\"flex gap-4\"\n                >\n                    <template #item=\"{ element, index }\">\n                        <div ::class=\"{ draggable: isDragable(element) }\" class=\"flex gap-4 overflow-x-auto\">\n                            <div class=\"flex min-w-[275px] max-w-[275px] flex-col justify-between rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                                <div class=\"flex flex-col gap-6 px-4 py-3\">\n                                    <!-- Stage Title and Action -->\n                                    <div class=\"flex items-center justify-between\">\n                                        <span class=\"py-1 font-medium dark:text-gray-300\">\n                                            @{{ element.name ? element.name : 'New Added' }} \n                                        </span>\n\n                                        <i\n                                            v-if=\"isDragable(element)\" \n                                            class=\"icon-move cursor-grab rounded-md p-1 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                                        >\n                                        </i>\n                                    </div>\n                                    \n                                    <!-- Cards input fields -->\n                                    <div>\n                                        <!-- Hidden Inputs Fields -->\n                                        <!-- Code -->\n                                        <input\n                                            type=\"hidden\"\n                                            :value=\"slugify(element.code ? element.code : element.name)\"\n                                            :name=\"'stages[' + element.id + '][code]'\"\n                                        />\n\n                                        <!-- Sort Order -->\n                                        <input\n                                            type=\"hidden\"\n                                            :value=\"index + 1\"\n                                            :name=\"'stages[' + element.id + '][sort_order]'\"\n                                        />\n\n                                        {!! view_render_event('admin.settings.pipelines.edit.form.stages.name.before', ['pipeline' => $pipeline]) !!}\n\n                                        <!-- Name -->\n                                        <x-admin::form.control-group>\n                                            <x-admin::form.control-group.label class=\"required\">\n                                                @lang('admin::app.settings.pipelines.edit.name')\n                                            </x-admin::form.control-group.label>\n                                            \n                                            <x-admin::form.control-group.control\n                                                type=\"text\"\n                                                ::name=\"'stages[' + element.id + '][name]'\"\n                                                v-model=\"element['name']\"\n                                                ::rules=\"{ required: true, unique_name: stages, min: 0, max: 100 }\"\n                                                :label=\"trans('admin::app.settings.pipelines.edit.name')\"\n                                            />\n\n                                            <x-admin::form.control-group.error ::name=\"'stages[' + element.id + '][name]'\" />\n                                        </x-admin::form.control-group>\n\n                                        {!! view_render_event('admin.settings.pipelines.edit.form.stages.name.after', ['pipeline' => $pipeline]) !!}\n\n                                        {!! view_render_event('admin.settings.pipelines.edit.form.stages.probability.before', ['pipeline' => $pipeline]) !!}\n\n                                        <!-- Probability -->\n                                        <x-admin::form.control-group>\n                                            <x-admin::form.control-group.label class=\"required\">\n                                                @lang('admin::app.settings.pipelines.edit.probability')\n                                            </x-admin::form.control-group.label>\n\n                                            <x-admin::form.control-group.control\n                                                type=\"text\"\n                                                ::name=\"'stages[' + element.id + '][probability]'\"\n                                                v-model=\"element['probability']\"\n                                                rules=\"required|numeric|min_value:0|max_value:100\"\n                                                ::readonly=\"element?.code != 'new'\"\n                                                :label=\"trans('admin::app.settings.pipelines.create.probability')\"\n                                            />\n                                            <x-admin::form.control-group.error ::name=\"'stages[' + element.id + '][probability]'\" />\n                                        </x-admin::form.control-group>\n\n                                        {!! view_render_event('admin.settings.pipelines.edit.form.stages.probability.after', ['pipeline' => $pipeline]) !!}\n                                    </div>\n                                </div>\n                                \n                                {!! view_render_event('admin.settings.pipelines.edit.form.stages.remove_button.before', ['pipeline' => $pipeline]) !!}\n\n                                <!-- Remove Stage -->\n                                <div\n                                    class=\"flex cursor-pointer items-center gap-2 border-t border-gray-200 p-2 text-red-600 dark:border-gray-800\" \n                                    @click=\"remove(element)\"\n                                    v-if=\"isDragable(element)\"\n                                >\n                                    <i class=\"icon-delete text-2xl\"></i>\n                                    \n                                    @lang('admin::app.settings.pipelines.edit.delete-stage')\n                                </div>\n\n                                {!! view_render_event('admin.settings.pipelines.edit.form.stages.remove_button.after', ['pipeline' => $pipeline]) !!}\n                            </div>\n                        </div>\n                    </template>\n                </draggable>\n\n                <!-- Add New Stage Card -->\n                <div class=\"flex min-h-[400px] min-w-[275px] max-w-[275px] flex-col items-center justify-center gap-1 rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                    <div class=\"flex flex-col items-center justify-center gap-6 px-4 py-3\">\n                        <div class=\"grid justify-center justify-items-center gap-3.5 text-center\">\n                            <div class=\"flex flex-col items-center gap-2\">\n                                <p class=\"text-xl font-semibold dark:text-gray-300\">\n                                    @lang('admin::app.settings.pipelines.edit.add-new-stages')\n                                </p>\n\n                                <p class=\"text-gray-400\">\n                                    @lang('admin::app.settings.pipelines.edit.add-stage-info')\n                                </p>\n                            </div>\n\n                            {!! view_render_event('admin.settings.pipelines.edit.form.stages.create_button.before', ['pipeline' => $pipeline]) !!}\n\n                            <!-- Add Stage Button -->\n                            <button\n                                class=\"secondary-button\"\n                                @click=\"addStage\"\n                                type=\"button\"\n                            >\n                                @lang('admin::app.settings.pipelines.edit.stage-btn')\n                            </button>\n\n                            {!! view_render_event('admin.settings.pipelines.edit.form.stages.create_button.after', ['pipeline' => $pipeline]) !!}\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-stages-component', {\n                template: '#v-stages-component-template',\n\n                data() {\n                    return {\n                        stages: @json($pipeline->stages),\n\n                        stageCount: 1,\n                    };\n                },\n\n                created() {\n                    this.extendValidations();\n                },\n\n                methods: {\n                    addStage() {\n                        this.stages.splice((this.stages.length - 2), 0, {\n                            'id': 'stage_' + this.stageCount++,\n                            'code': '',\n                            'name': '',\n                            'probability': 100,\n                        });\n                    },\n\n                    remove(stage) {\n                        this.$emitter.emit('open-confirm-modal', {\n                            agree: () => {\n                                let tempStages = this.stages.filter(item => item.id !== stage.id);\n\n                                this.stages = [];\n\n                                this.$nextTick(() => this.stages = tempStages);\n\n                                this.removeUniqueNameErrors();\n                            },\n                        });\n                    },\n\n                    slugify(name) {\n                        return name\n                            .toString()\n                            .toLowerCase()\n                            .replace(/[^\\w\\u0621-\\u064A\\u4e00-\\u9fa5\\u3402-\\uFA6D\\u3041-\\u30A0\\u30A0-\\u31FF- ]+/g, '')\n                            .replace(/ +/g, '-')\n                            .replace('![-\\s]+!u', '-')\n                            .trim();\n                    },\n\n                    extendValidations() {\n                        defineRule('unique_name', (value, stages) => {\n                            if (\n                                ! value\n                                || ! value.length\n                            ) {\n                                return true;\n                            }\n\n                            let filteredStages = stages.filter((stage) => {\n                                return stage.name.toLowerCase() === value.toLowerCase();\n                            });\n\n                            if (filteredStages.length > 1) {\n                                return \"{!! trans('admin::app.settings.pipelines.create.duplicate-name') !!}\";\n                            }\n\n                            this.removeUniqueNameErrors();\n\n                            return true;\n                        });\n                    },\n\n                    isDuplicateStageNameExists() {\n                        let stageNames = this.stages.map((stage) => stage.name);\n\n                        return stageNames.some((name, index) => stageNames.indexOf(name) !== index);\n                    },\n\n                    removeUniqueNameErrors() {\n                        if (\n                            ! this.isDuplicateStageNameExists()\n                            && this.errors\n                            && Array.isArray(this.errors.items)\n                        ) {\n                            const uniqueNameErrorIds = this.errors.items\n                                .filter(error => error.rule === 'unique_name')\n                                .map(error => error.id);\n\n                            uniqueNameErrorIds.forEach(id => this.errors.removeById(id));\n                        }\n                    },\n\n                    handleDragging(event) {\n                        const draggedElement = event.draggedContext.element;\n                        \n                        const relatedElement = event.relatedContext.element;\n\n                        return this.isDragable(draggedElement) && this.isDragable(relatedElement);\n                    },\n\n                    isDragable (stage) {\n                        if (stage.code == 'new' || stage.code == 'won' || stage.code == 'lost') {\n                            return false;\n                        }\n\n                        return true;\n                    },\n                },\n            })\n        </script>\n    @endPushOnce\n</x-admin::layouts>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/pipelines/index.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.pipelines.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.settings.pipelines.index.breadcrumbs.before') !!}\n\n                <!-- Breadcrumbs -->\n                <x-admin::breadcrumbs name=\"settings.pipelines\" />\n\n                {!! view_render_event('admin.settings.pipelines.index.breadcrumbs.after') !!}\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    <!-- Title -->\n                    @lang('admin::app.settings.pipelines.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.settings.pipelines.index.create_button.before') !!}\n                    \n                    @if (bouncer()->hasPermission('settings.lead.pipelines.create'))\n                        <!-- Create button Pipelines -->\n                        <a\n                            href=\"{{ route('admin.settings.pipelines.create') }}\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.pipelines.index.create-btn')\n                        </a>\n                    @endif\n\n                    {!! view_render_event('admin.settings.pipelines.index.create_button.after') !!}\n                </div>\n            </div>\n        </div>\n\n        {!! view_render_event('admin.settings.pipelines.index.datagrid.before') !!}\n\n        <!-- DataGrid -->\n        <x-admin::datagrid :src=\"route('admin.settings.pipelines.index')\">\n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </x-admin::datagrid>\n        \n        {!! view_render_event('admin.settings.pipelines.index.datagrid.after') !!}\n    </div>\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/roles/create.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.roles.create.title')\n    </x-slot>\n\n    {!! view_render_event('admin.settings.roles.create.form.before') !!}\n\n    <!-- Create Form -->\n    <x-admin::form :action=\"route('admin.settings.roles.store')\">\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.roles.create.breadcrumbs.before') !!}\n\n                    <!-- Breadcrumbs -->\n                    <x-admin::breadcrumbs name=\"settings.roles.create\" />\n\n                    {!! view_render_event('admin.settings.roles.create.breadcrumbs.after') !!}\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.settings.roles.create.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.roles.create.create_button.before') !!}\n\n                        @if (bouncer()->hasPermission('settings.user.roles.create'))\n                            <!-- Create button for Roles -->\n                            <button\n                                type=\"submit\"\n                                class=\"primary-button\"\n                            >\n                                @lang('admin::app.settings.roles.create.save-btn')\n                            </button>\n                        @endif\n\n                        {!! view_render_event('admin.settings.roles.create.create_button.after') !!}\n                    </div>\n                </div>\n            </div>\n\n            {!! view_render_event('admin.settings.roles.create.content.before') !!}\n\n            <!-- body content -->\n            <div class=\"flex gap-2.5 max-xl:flex-wrap\">\n                {!! view_render_event('admin.settings.roles.create.content.left.before') !!}\n\n                <!-- Left sub-component -->\n                <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                    <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                        <!-- Create Role for -->\n                        <v-access-control>\n                            <!-- Shimmer Effect -->\n                            <div class=\"mb-4\">\n                                <div class=\"shimmer mb-1.5 h-4 w-24\"></div>\n\n                                <div class=\"custom-select h-11 w-full rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"></div>\n                            </div>\n\n                            <!-- Roles Checkbox -->\n                            <x-admin::shimmer.tree />\n                        </v-access-control>\n                    </div>\n                </div>\n\n                {!! view_render_event('admin.settings.roles.create.content.left.after') !!}\n\n                {!! view_render_event('admin.settings.roles.create.content.right.before') !!}\n\n                <!-- Right sub-component -->\n                <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                    {!! view_render_event('admin.settings.roles.create.accordion.general.before') !!}\n\n                    <x-admin::accordion class=\"rounded-lg\">\n                        <x-slot:header>\n                            <div class=\"flex items-center justify-between\">\n                                <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.roles.create.general')\n                                </p>\n                            </div>\n                        </x-slot>\n\n                        <x-slot:content>\n                            {!! view_render_event('admin.settings.roles.create.form.name.before') !!}\n\n                            <!-- Name -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.roles.create.name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"name\"\n                                    name=\"name\"\n                                    rules=\"required\"\n                                    value=\"{{ old('name') }}\"\n                                    :label=\"trans('admin::app.settings.roles.create.name')\"\n                                    :placeholder=\"trans('admin::app.settings.roles.create.name')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.roles.create.form.name.after') !!}\n\n                            {!! view_render_event('admin.settings.roles.create.form.description.before') !!}\n\n                            <!-- Description -->\n                            <x-admin::form.control-group class=\"!mb-0\">\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.roles.create.description')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"textarea\"\n                                    id=\"description\"\n                                    name=\"description\"\n                                    rules=\"required\"\n                                    :value=\"old('description')\"\n                                    :label=\"trans('admin::app.settings.roles.create.description')\"\n                                    :placeholder=\"trans('admin::app.settings.roles.create.description')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"description\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.roles.create.form.description.after') !!}\n                        </x-slot>\n                    </x-admin::accordion>\n\n                    {!! view_render_event('admin.settings.roles.create.accordion.general.after') !!}\n                </div>\n\n                {!! view_render_event('admin.settings.roles.create.content.right.after') !!}\n            </div>\n\n            {!! view_render_event('admin.settings.roles.create.content.after') !!}\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.settings.roles.create.form.after') !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-access-control-template\"\n        >\n            <div>\n                {!! view_render_event('admin.settings.roles.create.form.permission_type.before') !!}\n\n                <!-- Permission Type -->\n                <x-admin::form.control-group class=\"!mb-0\">\n                    <x-admin::form.control-group.label class=\"required\">\n                        @lang('admin::app.settings.roles.create.permissions')\n                    </x-admin::form.control-group.label>\n\n                    <x-admin::form.control-group.control\n                        type=\"select\"\n                        name=\"permission_type\"\n                        id=\"permission_type\"\n                        rules=\"required\"\n                        :label=\"trans('admin::app.settings.roles.create.permissions')\"\n                        :placeholder=\"trans('admin::app.settings.roles.create.permissions')\"\n                        v-model=\"permission_type\"\n                    >\n                        <option value=\"custom\">\n                            @lang('admin::app.settings.roles.create.custom')\n                        </option>\n\n                        <option value=\"all\">\n                            @lang('admin::app.settings.roles.create.all')\n                        </option>\n                    </x-admin::form.control-group.control>\n\n                    <x-admin::form.control-group.error control-name=\"permission_type\" />\n                </x-admin::form.control-group>\n\n                {!! view_render_event('admin.settings.roles.create.form.permission_type.after') !!}\n\n                <div v-if=\"permission_type == 'custom'\">\n                    <x-admin::form.control-group.error control-name=\"permissions\" />\n\n                    {!! view_render_event('admin.settings.roles.create.form.tree-view.before') !!}\n\n                    <x-admin::tree.view\n                        input-type=\"checkbox\"\n                        value-field=\"key\"\n                        id-field=\"key\"\n                        :items=\"json_encode(acl()->getItems())\"\n                        :fallback-locale=\"config('app.fallback_locale')\"\n                    />\n\n                    {!! view_render_event('admin.settings.roles.create.form.tree-view.after') !!}\n                </div>\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-access-control', {\n                template: '#v-access-control-template',\n\n                data() {\n                    return {\n                        permission_type: 'custom',\n                    };\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/roles/edit.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.roles.edit.title')\n    </x-slot>\n\n    {!! view_render_event('admin.settings.roles.edit.form.before', ['role' => $role]) !!}\n\n    <x-admin::form\n        method=\"PUT\"\n        :action=\"route('admin.settings.roles.update', $role->id)\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.roles.edit.breadcrumbs.before', ['role' => $role]) !!}\n\n                    <!-- Breadcrumbs -->\n                    <x-admin::breadcrumbs \n                        name=\"settings.roles.edit\"\n                        :entity=\"$role\"\n                    />\n\n                    {!! view_render_event('admin.settings.roles.edit.breadcrumbs.after', ['role' => $role]) !!}\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.settings.roles.edit.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.roles.edit.save_button.before', ['role' => $role]) !!}\n\n                        @if (bouncer()->hasPermission('settings.user.roles.edit'))\n                            <!-- Save button for roles -->\n                            <button\n                                type=\"submit\"\n                                class=\"primary-button\"\n                            >\n                                @lang('admin::app.settings.roles.edit.save-btn')\n                            </button>\n                        @endif\n\n                        {!! view_render_event('admin.settings.roles.edit.save_button.after', ['role' => $role]) !!}\n                    </div>\n                </div>\n            </div>\n\n            {!! view_render_event('admin.settings.roles.edit.content.before', ['role' => $role]) !!}\n\n            <!-- body content -->\n            <div class=\"flex gap-2.5 max-xl:flex-wrap\">\n                {!! view_render_event('admin.settings.roles.edit.content.left.before', ['role' => $role]) !!}\n\n                <!-- Left sub-component -->\n                <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                    <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                        <p class=\"mb-4 text-base font-semibold text-gray-800 dark:text-white\">\n                            @lang('admin::app.settings.roles.edit.access-control')\n                        </p>\n\n                        <!-- Edit Role for  -->\n                        <v-access-control>\n                            <!-- Shimmer Effect -->\n                            <div class=\"mb-4\">\n                                <div class=\"shimmer mb-1.5 h-4 w-24\"></div>\n\n                                <div class=\"custom-select h-11 w-full rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"></div>\n                            </div>\n\n                            <!-- Roles Checkbox -->\n                            <x-admin::shimmer.tree />\n                        </v-access-control>\n                    </div>\n                </div>\n\n                {!! view_render_event('admin.settings.roles.edit.content.left.after', ['role' => $role]) !!}\n\n                {!! view_render_event('admin.settings.roles.edit.content.right.before', ['role' => $role]) !!}\n\n                <!-- Right sub-component -->\n                <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                    {!! view_render_event('admin.settings.roles.edit.accordion.general.before', ['role' => $role]) !!}\n\n                    <x-admin::accordion>\n                        <x-slot:header>\n                            <div class=\"flex items-center justify-between\">\n                                <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.roles.edit.general')\n                                </p>\n                            </div>\n                        </x-slot>\n\n                        <x-slot:content>\n                            {!! view_render_event('admin.settings.roles.edit.form.name.before', ['role' => $role]) !!}\n\n                            <!-- Name -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.roles.edit.name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"name\"\n                                    name=\"name\"\n                                    rules=\"required\"\n                                    value=\"{{ old('name') ?: $role->name }}\"\n                                    :label=\"trans('admin::app.settings.roles.edit.name')\"\n                                    :placeholder=\"trans('admin::app.settings.roles.edit.name')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.roles.edit.form.name.after', ['role' => $role]) !!}\n\n                            {!! view_render_event('admin.settings.roles.edit.form.description.before', ['role' => $role]) !!}\n\n                            <!-- Description -->\n                            <x-admin::form.control-group class=\"!mb-0\">\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.roles.edit.description')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"textarea\"\n                                    id=\"description\"\n                                    name=\"description\"\n                                    rules=\"required\"\n                                    value=\"{{ old('description') ?: $role->description }}\"\n                                    :label=\"trans('admin::app.settings.roles.edit.description')\"\n                                    :placeholder=\"trans('admin::app.settings.roles.edit.description')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"description\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.roles.edit.form.description.after', ['role' => $role]) !!}\n                        </x-slot>\n                    </x-admin::accordion>\n\n                    {!! view_render_event('admin.settings.roles.edit.accordion.general.after', ['role' => $role]) !!}\n                </div>\n            </div>\n\n            {!! view_render_event('admin.settings.roles.edit.content.after', ['role' => $role]) !!}\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.settings.roles.edit.form.after', ['role' => $role]) !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-access-control-template\"\n        >\n            <div>\n                {!! view_render_event('admin.settings.roles.edit.form.permission_type.before', ['role' => $role]) !!}\n\n                <!-- Permission Type -->\n                <x-admin::form.control-group>\n                    <x-admin::form.control-group.label class=\"required\">\n                        @lang('admin::app.settings.roles.edit.permissions')\n                    </x-admin::form.control-group.label>\n\n                    <x-admin::form.control-group.control\n                        type=\"select\"\n                        id=\"permission_type\"\n                        name=\"permission_type\"\n                        v-model=\"permission_type\"\n                        :label=\"trans('admin::app.settings.roles.edit.permissions')\"\n                        :placeholder=\"trans('admin::app.settings.roles.edit.permissions')\"\n                    >\n                        <option value=\"custom\">\n                            @lang('admin::app.settings.roles.edit.custom')\n                        </option>\n\n                        <option value=\"all\">\n                            @lang('admin::app.settings.roles.edit.all')\n                        </option>\n                    </x-admin::form.control-group.control>\n\n                    <x-admin::form.control-group.error control-name=\"permission_type\" />\n                </x-admin::form.control-group>\n\n                {!! view_render_event('admin.settings.roles.edit.form.permission_type.after', ['role' => $role]) !!}\n                \n                <!-- Tree structure -->\n                <div v-if=\"permission_type == 'custom'\">\n                    <x-admin::form.control-group.error control-name=\"permissions\" />\n\n                    {!! view_render_event('admin.settings.roles.edit.form.tree_view.before', ['role' => $role]) !!}\n\n                    <x-admin::tree.view\n                        input-type=\"checkbox\"\n                        value-field=\"key\"\n                        id-field=\"key\"\n                        :items=\"json_encode(acl()->getItems())\"\n                        :value=\"json_encode($role->permissions ?? [])\"\n                        :fallback-locale=\"config('app.fallback_locale')\"\n                    />\n\n                    {!! view_render_event('admin.settings.roles.edit.form.tree_view.after', ['role' => $role]) !!}\n                </div>\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-access-control', {\n                template: '#v-access-control-template',\n\n                data() {\n                    return {\n                        permission_type: \"{{ $role->permission_type }}\"\n                    };\n                }\n            })\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/roles/index.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.roles.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.settings.roles.index.breadcrumbs.before') !!}\n\n                <!-- Breadcumbs -->\n                <x-admin::breadcrumbs name=\"settings.roles\" />\n\n                {!! view_render_event('admin.settings.roles.index.breadcrumbs.after') !!}\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    <!-- title -->\n                    @lang('admin::app.settings.roles.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <!-- Create button Roles -->\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.settings.roles.index.create_button.before') !!}\n\n                    @if (bouncer()->hasPermission('settings.user.roles.create'))\n                        <a\n                            href=\"{{ route('admin.settings.roles.create') }}\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.roles.index.create-btn')\n                        </a>\n                    @endif\n\n                    {!! view_render_event('admin.settings.roles.index.create_button.after') !!}\n                </div>\n            </div>\n        </div>\n\n        <x-admin::datagrid :src=\"route('admin.settings.roles.index')\">\n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </x-admin::datagrid>\n    </div>\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/sources/index.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.settings.sources.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <!-- Header section -->\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.settings.sources.index.breadcrumbs.before') !!}\n\n                <!-- Breadcrumbs -->\n                <x-admin::breadcrumbs name=\"settings.sources\" />\n\n                {!! view_render_event('admin.settings.sources.index.breadcrumbs.after') !!}\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    @lang('admin::app.settings.sources.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                {!! view_render_event('admin.settings.sources.index.create_button.before') !!}\n                \n                <!-- Create button for Sources -->\n                @if (bouncer()->hasPermission('settings.lead.sources.create'))\n                    <div class=\"flex items-center gap-x-2.5\">\n                        <button\n                            type=\"button\"\n                            class=\"primary-button\"\n                            @click=\"$refs.sourceSettings.openModal()\"\n                        >\n                            @lang('admin::app.settings.sources.index.create-btn')\n                        </button>\n                    </div>\n                @endif\n\n                {!! view_render_event('admin.settings.sources.index.create_button.after') !!}\n            </div>\n        </div>\n        \n        <v-sources-settings ref=\"sourceSettings\">\n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </v-sources-settings>\n    </div>\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"sources-settings-template\"\n        >\n            {!! view_render_event('admin.settings.sources.index.datagrid.before') !!}\n        \n            <!-- Datagrid -->\n            <x-admin::datagrid\n                :src=\"route('admin.settings.sources.index')\"\n                ref=\"datagrid\"\n            >\n                <template #body=\"{\n                    isLoading,\n                    available,\n                    applied,\n                    selectAll,\n                    sort,\n                    performAction\n                }\">\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.datagrid.table.body />\n                    </template>\n        \n                    <template v-else>\n                        <div\n                            v-for=\"record in available.records\"\n                            class=\"row grid items-center gap-2.5 border-b px-4 py-4 text-gray-600 transition-all hover:bg-gray-50 dark:border-gray-800 dark:text-gray-300 dark:hover:bg-gray-950 max-lg:hidden\"\n                            :style=\"`grid-template-columns: repeat(${gridsCount}, minmax(0, 1fr))`\"\n                        >\n                            <!-- Sources ID -->\n                            <p>@{{ record.id }}</p>\n        \n                            <!-- Sources Name -->\n                            <p class=\"break-words\">@{{ record.name }}</p>\n\n                            <!-- Actions -->\n                            <div class=\"flex justify-end\">\n                                <a @click=\"selectedType=true; editModal(record.actions.find(action => action.index === 'edit')?.url)\">\n                                    <span\n                                        :class=\"record.actions.find(action => action.index === 'edit')?.icon\"\n                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                    >\n                                    </span>\n                                </a>\n    \n                                <a @click=\"performAction(record.actions.find(action => action.index === 'delete'))\">\n                                    <span\n                                        :class=\"record.actions.find(action => action.index === 'delete')?.icon\"\n                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                    >\n                                    </span>\n                                </a>\n                            </div>\n                        </div>\n\n                        <!-- Mobile Card View -->\n                        <div\n                            class=\"hidden border-b px-4 py-4 text-black dark:border-gray-800 dark:text-gray-300 max-lg:block\"\n                            v-for=\"record in available.records\"\n                        >\n                            <div class=\"mb-2 flex items-center justify-between\">\n                                <!-- Mass Actions for Mobile Cards -->\n                                <div class=\"flex w-full items-center justify-between gap-2\">\n                                    <p v-if=\"available.massActions.length\">\n                                        <label :for=\"`mass_action_select_record_${record[available.meta.primary_column]}`\">\n                                            <input\n                                                type=\"checkbox\"\n                                                :name=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                :value=\"record[available.meta.primary_column]\"\n                                                :id=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                class=\"peer hidden\"\n                                                v-model=\"applied.massActions.indices\"\n                                            >\n    \n                                            <span class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-500 peer-checked:text-brandColor\">\n                                            </span>\n                                        </label>\n                                    </p>\n\n                                    <!-- Actions for Mobile -->\n                                    <div\n                                        class=\"flex w-full items-center justify-end\"\n                                        v-if=\"available.actions.length\"\n                                    >\n                                        <a @click=\"selectedType=true; editModal(record.actions.find(action => action.index === 'edit')?.url)\">\n                                            <span\n                                                :class=\"record.actions.find(action => action.index === 'edit')?.icon\"\n                                                class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                            >\n                                            </span>\n                                        </a>\n            \n                                        <a @click=\"performAction(record.actions.find(action => action.index === 'delete'))\">\n                                            <span\n                                                :class=\"record.actions.find(action => action.index === 'delete')?.icon\"\n                                                class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                            >\n                                            </span>\n                                        </a>\n                                    </div>\n                                </div>\n                            </div>\n\n                            <!-- Card Content -->\n                            <div class=\"grid gap-2\">\n                                <template v-for=\"column in available.columns\">\n                                    <div class=\"flex flex-wrap items-baseline gap-x-2\">\n                                        <span class=\"text-slate-600 dark:text-gray-300\" v-html=\"column.label + ':'\"></span>\n                                        <span class=\"break-words font-medium text-slate-900 dark:text-white\" v-html=\"record[column.index]\"></span>\n                                    </div>\n                                </template>\n                            </div>\n                        </div>\n                    </template>\n                </template>\n            </x-admin::datagrid>\n\n            {!! view_render_event('admin.settings.sources.index.datagrid.after') !!}\n            \n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modalForm\"\n            >\n                <form @submit=\"handleSubmit($event, updateOrCreate)\">\n                    {!! view_render_event('admin.settings.sources.index.form_controls.before') !!}\n\n                    <x-admin::modal ref=\"sourceUpdateAndCreateModal\">\n                        <!-- Modal Header -->\n                        <x-slot:header>\n                            <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                                @{{ \n                                    selectedType\n                                    ? \"@lang('admin::app.settings.sources.index.edit.title')\" \n                                    : \"@lang('admin::app.settings.sources.index.create.title')\"\n                                }}\n                            </p>\n                        </x-slot>\n\n                        <!-- Modal Content -->\n                        <x-slot:content>\n                            {!! view_render_event('admin.settings.sources.index.content.before') !!}\n\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"id\"\n                            />\n\n                            {!! view_render_event('admin.settings.sources.index.form.name.before') !!}\n\n                            <!-- Name -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.sources.index.create.name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"name\"\n                                    name=\"name\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.sources.index.create.name')\"\n                                    :placeholder=\"trans('admin::app.settings.sources.index.create.name')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.sources.index.form.name.after') !!}\n                        </x-slot>\n\n                        <!-- Modal Footer -->\n                        <x-slot:footer>\n                            {!! view_render_event('admin.settings.sources.index.form.save_button.before') !!}\n\n                            <!-- Save Button -->\n                            <x-admin::button\n                                button-type=\"submit\"\n                                class=\"primary-button justify-center\"\n                                :title=\"trans('admin::app.settings.sources.index.create.save-btn')\"\n                                ::loading=\"isProcessing\"\n                                ::disabled=\"isProcessing\"\n                            />\n\n                            {!! view_render_event('admin.settings.sources.index.form.save_button.after') !!}\n                        </x-slot>\n                    </x-admin::modal>\n\n                    {!! view_render_event('admin.settings.sources.index.form_controls.after') !!}\n                </form>\n            </x-admin::form>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-sources-settings', {\n                template: '#sources-settings-template',\n        \n                data() {\n                    return {\n                        isProcessing: false,\n                        \n                        selectedType: false,\n                    };\n                },\n        \n                computed: {\n                    gridsCount() {\n                        let count = this.$refs.datagrid.available.columns.length;\n\n                        if (this.$refs.datagrid.available.actions.length) {\n                            ++count;\n                        }\n\n                        if (this.$refs.datagrid.available.massActions.length) {\n                            ++count;\n                        }\n\n                        return count;\n                    },\n                },\n\n                methods: {\n                    openModal() {\n                        this.selectedType = false;\n                        \n                        this.$refs.sourceUpdateAndCreateModal.toggle();\n                    },\n                    \n                    updateOrCreate(params, {resetForm, setErrors}) {\n                        this.isProcessing = true;\n\n                        this.$axios.post(params.id ? \"{{ route('admin.settings.sources.update', ':id') }}\".replace(':id', params.id) : \"{{ route('admin.settings.sources.store') }}\", {\n                            ...params,\n                            _method: params.id ? 'put' : 'post'\n                        },\n\n                        ).then(response => {\n                            this.isProcessing = false;\n\n                            this.$refs.sourceUpdateAndCreateModal.toggle();\n\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                            this.$refs.datagrid.get();\n\n                            resetForm();\n                        }).catch(error => {\n                            this.isProcessing = false;\n\n                            if (error.response.status === 422) {\n                                setErrors(error.response.data.errors);\n                            }\n                        });\n                    },\n                    \n                    editModal(url) {\n                        this.$axios.get(url)\n                            .then(response => {\n                                this.$refs.modalForm.setValues(response.data.data);\n                                \n                                this.$refs.sourceUpdateAndCreateModal.toggle();\n                            })\n                            .catch(error => {});\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/tags/index.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.tags.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <!-- Header Section -->\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.settings.tags.index.breadcrumbs.before') !!}\n\n                <!-- Breadcrumbs -->\n                <x-admin::breadcrumbs name=\"settings.tags\" />\n\n                {!! view_render_event('admin.settings.tags.index.breadcrumbs.after') !!}\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    @lang('admin::app.settings.tags.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                {!! view_render_event('admin.settings.tags.index.create_button.before') !!}\n                \n                <!-- Create button for Tags -->\n                @if (bouncer()->hasPermission('settings.other_settings.tags.create'))\n                    <div class=\"flex items-center gap-x-2.5\">\n                        <button\n                            type=\"button\"\n                            class=\"primary-button\"\n                            @click=\"$refs.tagSettings.openModal()\"\n                        >\n                            @lang('admin::app.settings.tags.index.create-btn')\n                        </button>\n                    </div>\n                @endif\n\n                {!! view_render_event('admin.settings.tags.index.create_button.after') !!}\n            </div>\n        </div>\n        \n        <v-tag-settings ref=\"tagSettings\">\n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </v-tag-settings>\n    </div>\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"tag-settings-template\"\n        >\n            {!! view_render_event('admin.settings.tags.index.datagrid.before') !!}\n        \n            <!-- Datagrid -->\n            <x-admin::datagrid\n                :src=\"route('admin.settings.tags.index')\"\n                ref=\"datagrid\"\n            >\n                <template #body=\"{\n                    isLoading,\n                    available,\n                    applied,\n                    selectAll,\n                    sort,\n                    performAction\n                }\">\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.datagrid.table.body />\n                    </template>\n        \n                    <template v-else>\n                        <div\n                            v-for=\"record in available.records\"\n                            class=\"row grid items-center gap-2.5 border-b px-4 py-4 text-gray-600 transition-all hover:bg-gray-50 dark:border-gray-800 dark:text-gray-300 dark:hover:bg-gray-950 max-lg:hidden\"\n                            :style=\"`grid-template-columns: repeat(${gridsCount}, minmax(0, 1fr))`\"\n                        >\n                            <!-- Mass Actions, Title and Created By -->\n                            <div class=\"flex select-none items-center gap-16\">\n                                <input\n                                    type=\"checkbox\"\n                                    :name=\"`mass_action_select_record_${record.id}`\"\n                                    :id=\"`mass_action_select_record_${record.id}`\"\n                                    :value=\"record.id\"\n                                    class=\"peer hidden\"\n                                    v-model=\"applied.massActions.indices\"\n                                >\n\n                                <label\n                                    class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-600 peer-checked:text-brandColor dark:text-gray-300\"\n                                    :for=\"`mass_action_select_record_${record.id}`\"\n                                ></label>\n                            </div>\n                            \n                            <!-- ID -->\n                            <p>@{{ record.id }}</p>\n        \n                            <!-- Name and Color -->\n                            <p class=\"flex items-center gap-2\">\n                                <span \n                                    class=\"block h-6 w-6 cursor-pointer rounded-full shadow-md transition duration-200 ease-in-out peer-checked:border-4 peer-checked:border-solid peer-checked:border-white\"\n                                    :style=\"`background-color: ${record.color}`\"\n                                ></span>\n\n                                <span>@{{ record.name }}</span>\n                            </p>\n\n                            <!-- User Name -->\n                            <p>@{{ record.user_name }}</p>\n\n                            <!-- Created Date -->\n                            <p>@{{ record.created_at }}</p>\n\n                            <!-- Actions -->\n                            <div class=\"flex justify-end\">\n                                <a @click=\"selectedTag=true; editModal(record.actions.find(action => action.index === 'edit')?.url)\">\n                                    <span\n                                        :class=\"record.actions.find(action => action.index === 'edit')?.icon\"\n                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                    >\n                                    </span>\n                                </a>\n    \n                                <a @click=\"performAction(record.actions.find(action => action.index === 'delete'))\">\n                                    <span\n                                        :class=\"record.actions.find(action => action.index === 'delete')?.icon\"\n                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                    >\n                                    </span>\n                                </a>\n                            </div>\n                        </div>\n\n                        <!-- Mobile Card View -->\n                        <div\n                            class=\"hidden border-b px-4 py-4 text-black dark:border-gray-800 dark:text-gray-300 max-lg:block\"\n                            v-for=\"record in available.records\"\n                        >\n                            <div class=\"mb-2 flex items-center justify-between\">\n                                <!-- Mass Actions for Mobile Cards -->\n                                <div class=\"flex w-full items-center justify-between gap-2\">\n                                    <p v-if=\"available.massActions.length\">\n                                        <label :for=\"`mass_action_select_record_${record[available.meta.primary_column]}`\">\n                                            <input\n                                                type=\"checkbox\"\n                                                :name=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                :value=\"record[available.meta.primary_column]\"\n                                                :id=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                class=\"peer hidden\"\n                                                v-model=\"applied.massActions.indices\"\n                                            >\n    \n                                            <span class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-500 peer-checked:text-brandColor\">\n                                            </span>\n                                        </label>\n                                    </p>\n\n                                    <!-- Actions for Mobile -->\n                                    <div\n                                        class=\"flex w-full items-center justify-end\"\n                                        v-if=\"available.actions.length\"\n                                    >\n                                        <a @click=\"selectedTag=true; editModal(record.actions.find(action => action.index === 'edit')?.url)\">\n                                            <span\n                                                :class=\"record.actions.find(action => action.index === 'edit')?.icon\"\n                                                class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                            >\n                                            </span>\n                                        </a>\n            \n                                        <a @click=\"performAction(record.actions.find(action => action.index === 'delete'))\">\n                                            <span\n                                                :class=\"record.actions.find(action => action.index === 'delete')?.icon\"\n                                                class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                            >\n                                            </span>\n                                        </a>\n                                    </div>\n                                </div>\n                            </div>\n\n                            <!-- Card Content -->\n                            <div class=\"grid gap-2\">\n                                <template v-for=\"column in available.columns\">\n                                    <div class=\"flex flex-wrap items-baseline gap-x-2\">\n                                        <span class=\"text-slate-600 dark:text-gray-300\" v-html=\"column.label + ':'\"></span>\n                                        <span class=\"break-words font-medium text-slate-900 dark:text-white\" v-html=\"record[column.index]\"></span>\n                                    </div>\n                                </template>\n                            </div>\n                        </div>\n                    </template>\n                </template>\n            </x-admin::datagrid>\n            \n            {!! view_render_event('admin.settings.tags.index.datagrid.after') !!}\n            \n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modalForm\"\n            >\n                <form @submit=\"handleSubmit($event, updateOrCreate)\">\n                    {!! view_render_event('admin.settings.tags.index.form_controls.before') !!}\n\n                    <x-admin::modal ref=\"tagsUpdateAndCreateModal\">\n                        <!-- Modal Header -->\n                        <x-slot:header>\n                            {!! view_render_event('admin.settings.tags.index.form_controls.modal.title.before') !!}\n\n                            <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                                @{{ \n                                    selectedTag\n                                    ? \"@lang('admin::app.settings.tags.index.edit.title')\" \n                                    : \"@lang('admin::app.settings.tags.index.create.title')\"\n                                }}\n                            </p>\n\n                            {!! view_render_event('admin.settings.tags.index.form_controls.modal.title.after') !!}\n                        </x-slot>\n\n                        <!-- Modal Content -->\n                        <x-slot:content>\n                            {!! view_render_event('admin.settings.tags.index.content.before') !!}\n\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"id\"\n                            />\n\n                            {!! view_render_event('admin.settings.tags.index.form_controls.before') !!}\n\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.tags.index.create.name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"name\"\n                                    name=\"name\"\n                                    rules=\"required|max:50\"\n                                    :label=\"trans('admin::app.settings.tags.index.create.name')\"\n                                    :placeholder=\"trans('admin::app.settings.tags.index.create.name')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n\n                            <x-admin::form.control-group.label>\n                                @lang('admin::app.settings.tags.index.create.color')\n                            </x-admin::form.control-group.label>\n                            \n                            <div class=\"flex gap-3\">\n                                <template v-for=\"(color, index) in colors\">\n                                    <span class=\"relative inline-block\">\n                                        <x-admin::form.control-group.control\n                                            type=\"radio\" \n                                            ::id=\"index\" \n                                            name=\"color\" \n                                            ::value=\"color.background\" \n                                            class=\"peer absolute left-0 right-3 top-5 z-10 h-full w-full cursor-pointer opacity-0\"\n                                        />\n    \n                                        <label \n                                            :for=\"index\" \n                                            class=\"block h-6 w-6 cursor-pointer rounded-full shadow-md transition duration-200 ease-in-out peer-checked:border-2 peer-checked:border-solid peer-checked:border-brandColor\"\n                                            :style=\"`background-color: ${color.background}`\"\n                                        >\n                                        </label>\n                                    </span>\n                                </template>\n                            </div>\n\n                            {!! view_render_event('admin.settings.tags.index.content.after') !!}\n                        </x-slot>\n\n                        <!-- Modal Footer -->\n                        <x-slot:footer>\n                            {!! view_render_event('admin.settings.tags.index.form_controls.modal.footer.save_button.before') !!}\n\n                            <!-- Save Button -->\n                            <x-admin::button\n                                button-type=\"submit\"\n                                class=\"primary-button justify-center\"\n                                :title=\"trans('admin::app.settings.tags.index.create.save-btn')\"\n                                ::loading=\"isProcessing\"\n                                ::disabled=\"isProcessing\"\n                            />\n\n                            {!! view_render_event('admin.settings.tags.index.form_controls.modal.footer.save_button.after') !!}\n                        </x-slot>\n                    </x-admin::modal>\n\n                    {!! view_render_event('admin.settings.tags.index.form_controls.after') !!}\n                </form>\n            </x-admin::form>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-tag-settings', {\n                template: '#tag-settings-template',\n        \n                data() {\n                    return {\n                        isProcessing: false,\n                        \n                        selectedTag: false,\n\n                        colors: [\n                            {\n                                background: '#FEE2E2',\n                            }, {\n                                background: '#FFEDD5',\n                            }, {\n                                background: '#FEF3C7',\n                            }, {\n                                background: '#FEF9C3',\n                            }, {\n                                background: '#ECFCCB',\n                            }, {\n                                background: '#DCFCE7',\n                            },\n                        ],\n                    };\n                },\n        \n                computed: {\n                    gridsCount() {\n                        let count = this.$refs.datagrid.available.columns.length;\n\n                        if (this.$refs.datagrid.available.actions.length) {\n                            ++count;\n                        }\n\n                        if (this.$refs.datagrid.available.massActions.length) {\n                            ++count;\n                        }\n\n                        return count;\n                    },\n                },\n\n                methods: {\n                    openModal() {\n                        this.selectedTag=false;\n                        \n                        this.$refs.tagsUpdateAndCreateModal.toggle();\n                    },\n                    \n                    updateOrCreate(params, {resetForm, setErrors}) {\n                        this.isProcessing = true;\n\n                        this.$axios.post(params.id ? \"{{ route('admin.settings.tags.update', ':id') }}\".replace(':id', params.id) : \"{{ route('admin.settings.tags.store') }}\", {\n                            ...params,\n                            _method: params.id ? 'put' : 'post'\n                        },\n\n                        ).then(response => {\n                            this.isProcessing = false;\n\n                            this.$refs.tagsUpdateAndCreateModal.toggle();\n\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                            this.$refs.datagrid.get();\n\n                            resetForm();\n                        }).catch(error => {\n                            this.isProcessing = false;\n\n                            if (error.response.status === 422) {\n                                setErrors(error.response.data.errors);\n                            }\n                        });\n                    },\n                    \n                    editModal(url) {\n                        this.$axios.get(url)\n                            .then(response => {\n                                this.$refs.modalForm.setValues(response.data.data);\n                                \n                                this.$refs.tagsUpdateAndCreateModal.toggle();\n                            })\n                            .catch(error => {});\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/types/index.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.settings.types.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <!-- Header Section -->\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                <!-- Breadcrumbs -->\n                <x-admin::breadcrumbs name=\"settings.types\" />\n\n                <div class=\"text-xl font-bold dark:text-gray-300\">\n                    @lang('admin::app.settings.types.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                {!! view_render_event('admin.settings.types.index.create_button.before') !!}\n                \n                <!-- Create button for Types -->\n                <div class=\"flex items-center gap-x-2.5\">\n                    @if (bouncer()->hasPermission('settings.lead.types.create'))\n                        <button\n                            type=\"button\"\n                            class=\"primary-button\"\n                            @click=\"$refs.typeSettings.openModal()\"\n                        >\n                            @lang('admin::app.settings.types.index.create-btn')\n                        </button>\n                    @endif\n                </div>\n\n                {!! view_render_event('admin.settings.types.index.create_button.after') !!}\n            </div>\n        </div>\n\n        <v-types-settings ref=\"typeSettings\">\n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </v-types-settings>\n    </div>\n    \n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"types-settings-template\"\n        >\n            {!! view_render_event('admin.settings.types.index.datagrid.before') !!}\n        \n            <!-- Datagrid -->\n            <x-admin::datagrid\n                :src=\"route('admin.settings.types.index')\"\n                ref=\"datagrid\"\n            >\n                <template #body=\"{\n                    isLoading,\n                    available,\n                    applied,\n                    selectAll,\n                    sort,\n                    performAction\n                }\">\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.datagrid.table.body />\n                    </template>\n        \n                    <template v-else>\n                        <div\n                            v-for=\"record in available.records\"\n                            class=\"row grid items-center gap-2.5 border-b px-4 py-4 text-gray-600 transition-all hover:bg-gray-50 dark:border-gray-800 dark:text-gray-300 dark:hover:bg-gray-950 max-lg:hidden\"\n                            :style=\"`grid-template-columns: repeat(${gridsCount}, minmax(0, 1fr))`\"\n                        >\n                            <!-- Type ID -->\n                            <p>@{{ record.id }}</p>\n        \n                            <!-- Type Name -->\n                            <p>@{{ record.name }}</p>\n\n                            <!-- Actions -->\n                            <div class=\"flex justify-end\">\n                                <a @click=\"selectedType=true; editModal(record.actions.find(action => action.index === 'edit')?.url)\">\n                                    <span\n                                        :class=\"record.actions.find(action => action.index === 'edit')?.icon\"\n                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                    >\n                                    </span>\n                                </a>\n    \n                                <a @click=\"performAction(record.actions.find(action => action.index === 'delete'))\">\n                                    <span\n                                        :class=\"record.actions.find(action => action.index === 'delete')?.icon\"\n                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                    >\n                                    </span>\n                                </a>\n                            </div>\n                        </div>\n\n                        <!-- Mobile Card View -->\n                        <div\n                            class=\"hidden border-b px-4 py-4 text-black dark:border-gray-800 dark:text-gray-300 max-lg:block\"\n                            v-for=\"record in available.records\"\n                        >\n                            <div class=\"mb-2 flex items-center justify-between\">\n                                <!-- Mass Actions for Mobile Cards -->\n                                <div class=\"flex w-full items-center justify-between gap-2\">\n                                    <p v-if=\"available.massActions.length\">\n                                        <label :for=\"`mass_action_select_record_${record[available.meta.primary_column]}`\">\n                                            <input\n                                                type=\"checkbox\"\n                                                :name=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                :value=\"record[available.meta.primary_column]\"\n                                                :id=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                class=\"peer hidden\"\n                                                v-model=\"applied.massActions.indices\"\n                                            >\n    \n                                            <span class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-500 peer-checked:text-brandColor\">\n                                            </span>\n                                        </label>\n                                    </p>\n\n                                    <!-- Actions for Mobile -->\n                                    <div\n                                        class=\"flex w-full items-center justify-end\"\n                                        v-if=\"available.actions.length\"\n                                    >\n                                        <a @click=\"selectedType=true; editModal(record.actions.find(action => action.index === 'edit')?.url)\">\n                                            <span\n                                                :class=\"record.actions.find(action => action.index === 'edit')?.icon\"\n                                                class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                            >\n                                            </span>\n                                        </a>\n            \n                                        <a @click=\"performAction(record.actions.find(action => action.index === 'delete'))\">\n                                            <span\n                                                :class=\"record.actions.find(action => action.index === 'delete')?.icon\"\n                                                class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                            >\n                                            </span>\n                                        </a>\n                                    </div>\n                                </div>\n                            </div>\n\n                            <!-- Card Content -->\n                            <div class=\"grid gap-2\">\n                                <template v-for=\"column in available.columns\">\n                                    <div class=\"flex flex-wrap items-baseline gap-x-2\">\n                                        <span class=\"text-slate-600 dark:text-gray-300\" v-html=\"column.label + ':'\"></span>\n                                        <span class=\"break-words font-medium text-slate-900 dark:text-white\" v-html=\"record[column.index]\"></span>\n                                    </div>\n                                </template>\n                            </div>\n                        </div>\n                    </template>\n                </template>\n            </x-admin::datagrid>\n\n            {!! view_render_event('admin.settings.types.index.datagrid.after') !!}\n            \n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modalForm\"\n            >\n                <form @submit=\"handleSubmit($event, updateOrCreate)\">\n                    {!! view_render_event('admin.settings.types.index.form_controls.before') !!}\n\n                    <x-admin::modal ref=\"typeUpdateAndCreateModal\">\n                        <!-- Modal Header -->\n                        <x-slot:header>\n                            <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                                @{{ \n                                    selectedType\n                                    ? \"@lang('admin::app.settings.types.index.edit.title')\" \n                                    : \"@lang('admin::app.settings.types.index.create.title')\"\n                                }}\n                            </p>\n                        </x-slot>\n\n                        <!-- Modal Content -->\n                        <x-slot:content>\n                            {!! view_render_event('admin.settings.types.index.content.before') !!}\n\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"id\"\n                            />\n\n                            <!-- Name -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.types.index.create.name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"name\"\n                                    name=\"name\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.types.index.create.name')\"\n                                    :placeholder=\"trans('admin::app.settings.types.index.create.name')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.types.index.content.after') !!}\n                        </x-slot>\n\n                        <!-- Modal Footer -->\n                        <x-slot:footer>\n                            {!! view_render_event('admin.settings.types.index.footer.create_button.before') !!}\n\n                            <!-- Save Button -->\n                            <x-admin::button\n                                button-type=\"submit\"\n                                class=\"primary-button justify-center\"\n                                :title=\"trans('admin::app.settings.types.index.create.save-btn')\"\n                                ::loading=\"isProcessing\"\n                                ::disabled=\"isProcessing\"\n                            />\n\n                            {!! view_render_event('admin.settings.types.index.footer.create_button.after') !!}\n                        </x-slot>\n                    </x-admin::modal>\n\n                    {!! view_render_event('admin.settings.types.index.form_controls.after') !!}\n                </form>\n            </x-admin::form>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-types-settings', {\n                template: '#types-settings-template',\n        \n                data() {\n                    return {\n                        isProcessing: false,\n\n                        selectedType: false,\n                    };\n                },\n        \n                computed: {\n                    gridsCount() {\n                        let count = this.$refs.datagrid.available.columns.length;\n\n                        if (this.$refs.datagrid.available.actions.length) {\n                            ++count;\n                        }\n\n                        if (this.$refs.datagrid.available.massActions.length) {\n                            ++count;\n                        }\n\n                        return count;\n                    },\n                },\n\n                methods: {\n                    openModal() {\n                        this.selectedType=false;\n                        \n                        this.$refs.typeUpdateAndCreateModal.toggle();\n                    },\n                    \n                    updateOrCreate(params, {resetForm, setErrors}) {\n                        this.isProcessing = true;\n\n                        this.$axios.post(params.id ? \"{{ route('admin.settings.types.update', ':id') }}\".replace(':id', params.id) : \"{{ route('admin.settings.types.store') }}\", {\n                            ...params,\n                            _method: params.id ? 'put' : 'post'\n                        },\n\n                        ).then(response => {\n                            this.isProcessing = false;\n\n                            this.$refs.typeUpdateAndCreateModal.toggle();\n\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                            this.$refs.datagrid.get();\n\n                            resetForm();\n                        }).catch(error => {\n                            this.isProcessing = false;\n\n                            if (error.response.status === 422) {\n                                setErrors(error.response.data.errors);\n                            }\n                        });\n                    },\n                    \n                    editModal(url) {\n                        this.$axios.get(url)\n                            .then(response => {\n                                this.$refs.modalForm.setValues(response.data.data);\n                                \n                                this.$refs.typeUpdateAndCreateModal.toggle();\n                            })\n                            .catch(error => {});\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/users/index.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.settings.users.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                <!-- Breadcrumbs -->\n                <x-admin::breadcrumbs name=\"settings.users\" />\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    @lang('admin::app.settings.users.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                {!! view_render_event('admin.settings.users.index.create_button.before') !!}\n\n                <!-- Create button for User -->\n                @if (bouncer()->hasPermission('settings.user.users.create'))\n                    <div class=\"flex items-center gap-x-2.5\">\n                        <button\n                            type=\"button\"\n                            class=\"primary-button\"\n                            @click=\"$refs.userSettings.openModal()\"\n                        >\n                            @lang('admin::app.settings.users.index.create-btn')\n                        </button>\n                    </div>\n                @endif\n\n                {!! view_render_event('admin.settings.users.index.create_button.after') !!}\n            </div>\n        </div>\n\n        <v-users-settings ref=\"userSettings\">\n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </v-users-settings>\n    </div>\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"users-settings-template\"\n        >\n            {!! view_render_event('admin.settings.users.index.datagrid.before') !!}\n\n            <!-- Datagrid -->\n            <x-admin::datagrid\n                :src=\"route('admin.settings.users.index')\"\n                ref=\"datagrid\"\n            >\n                <template #body=\"{\n                    isLoading,\n                    available,\n                    applied,\n                    selectAll,\n                    sort,\n                    performAction\n                }\">\n                    <template v-if=\"isLoading\">\n                        <x-admin::shimmer.datagrid.table.body />\n                    </template>\n\n                    <template v-else>\n                        <div\n                            v-for=\"record in available.records\"\n                            class=\"row grid items-center gap-2.5 border-b px-4 py-4 text-gray-600 transition-all hover:bg-gray-50 dark:border-gray-800 dark:text-gray-300 dark:hover:bg-gray-950 max-lg:hidden\"\n                            :style=\"`grid-template-columns: repeat(${gridsCount}, minmax(0, 1fr))`\"\n                        >\n                            <!-- Mass Actions, Title and Created By -->\n                            <div class=\"flex select-none items-center gap-16\">\n                                <input\n                                    type=\"checkbox\"\n                                    :name=\"`mass_action_select_record_${record.id}`\"\n                                    :id=\"`mass_action_select_record_${record.id}`\"\n                                    :value=\"record.id\"\n                                    class=\"peer hidden\"\n                                    v-model=\"applied.massActions.indices\"\n                                >\n\n                                <label\n                                    class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-600 peer-checked:text-brandColor dark:text-gray-300\"\n                                    :for=\"`mass_action_select_record_${record.id}`\"\n                                ></label>\n                            </div>\n\n                            <!-- Users Id -->\n                            <p>@{{ record.id }}</p>\n\n                            <!-- Users Name and Profile -->\n                            <div class=\"flex items-center gap-2.5\">\n                                <template v-if=\"record.name.image\">\n                                    <img\n                                        class=\"flex h-9 w-9 items-center justify-center rounded-full\"\n                                        :src=\"record.name.image\"\n                                        alt=\"record.name\"\n                                    />\n                                </template>\n\n                                <template v-else>\n                                    <x-admin::avatar ::name=\"record.name.name\"/>\n                                </template>\n\n                                <div class=\"text-sm\">\n                                    @{{ record.name.name }}\n                                </div>\n                            </div>\n\n                            <!-- Users Email -->\n                            <p class=\"truncate\">@{{ record.email }}</p>\n\n                            <!-- Users Status -->\n                            <span\n                                :class=\"record.status == 1 ? 'label-active' : 'label-inactive'\"\n                            >\n                                @{{ record.status == 1 ? '@lang('admin::app.settings.users.index.active')' : '@lang('admin::app.settings.users.index.inactive')' }}\n                            </span>\n\n                            <!-- Users Creation Date -->\n                            <p>@{{ record.created_at }}</p>\n\n                            <!-- Actions -->\n                            <div class=\"flex justify-end\">\n                                <a @click=\"editModal(record.actions.find(action => action.index === 'edit')?.url)\">\n                                    <span\n                                        :class=\"record.actions.find(action => action.index === 'edit')?.icon\"\n                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                    >\n                                    </span>\n                                </a>\n\n                                <a @click=\"performAction(record.actions.find(action => action.index === 'delete'))\">\n                                    <span\n                                        :class=\"record.actions.find(action => action.index === 'delete')?.icon\"\n                                        class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                    >\n                                    </span>\n                                </a>\n                            </div>\n                        </div>\n\n                        <!-- Mobile Card View -->\n                        <div\n                            class=\"hidden border-b px-4 py-4 text-black dark:border-gray-800 dark:text-gray-300 max-lg:block\"\n                            v-for=\"record in available.records\"\n                        >\n                            <div class=\"mb-2 flex items-center justify-between\">\n                                <!-- Mass Actions for Mobile Cards -->\n                                <div class=\"flex w-full items-center justify-between gap-2\">\n                                    <p v-if=\"available.massActions.length\">\n                                        <label :for=\"`mass_action_select_record_${record[available.meta.primary_column]}`\">\n                                            <input\n                                                type=\"checkbox\"\n                                                :name=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                :value=\"record[available.meta.primary_column]\"\n                                                :id=\"`mass_action_select_record_${record[available.meta.primary_column]}`\"\n                                                class=\"peer hidden\"\n                                                v-model=\"applied.massActions.indices\"\n                                            >\n\n                                            <span class=\"icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl text-gray-500 peer-checked:text-brandColor\">\n                                            </span>\n                                        </label>\n                                    </p>\n\n                                    <!-- Actions for Mobile -->\n                                    <div\n                                        class=\"flex w-full items-center justify-end\"\n                                        v-if=\"available.actions.length\"\n                                    >\n                                        <!-- Actions -->\n                                        <a @click=\"editModal(record.actions.find(action => action.index === 'edit')?.url)\">\n                                            <span\n                                                :class=\"record.actions.find(action => action.index === 'edit')?.icon\"\n                                                class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                            >\n                                            </span>\n                                        </a>\n\n                                        <a @click=\"performAction(record.actions.find(action => action.index === 'delete'))\">\n                                            <span\n                                                :class=\"record.actions.find(action => action.index === 'delete')?.icon\"\n                                                class=\"cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center\"\n                                            >\n                                            </span>\n                                        </a>\n                                    </div>\n                                </div>\n                            </div>\n\n                            <!-- Card Content -->\n                            <div class=\"grid gap-2\">\n                                <template v-for=\"column in available.columns\">\n                                    <div class=\"flex flex-wrap items-baseline gap-x-2\">\n                                        <span class=\"text-slate-600 dark:text-gray-300\" v-html=\"column.label + ':'\"></span>\n                                        <span class=\"break-words font-medium text-slate-900 dark:text-white\" v-html=\"record[column.index]\"></span>\n                                    </div>\n                                </template>\n                            </div>\n                        </div>\n                        </template>\n                </template>\n            </x-admin::datagrid>\n\n            {!! view_render_event('admin.users.index.datagrid.after') !!}\n\n            <x-admin::form\n                v-slot=\"{ meta, values, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modalForm\"\n            >\n                <form\n                    @submit=\"handleSubmit($event, updateOrCreate)\"\n                    ref=\"userForm\"\n                >\n                    {!! view_render_event('admin.settings.users.index.form_controls.before') !!}\n\n                    <x-admin::modal\n                        ref=\"userUpdateAndCreateModal\"\n                        @toggle=\"handleToggle\"\n                    >\n                        <!-- Modal Header -->\n                        <x-slot:header>\n                            <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                                @{{\n                                    selectedType == 'create'\n                                    ? \"@lang('admin::app.settings.users.index.create.title')\"\n                                    : \"@lang('admin::app.settings.users.index.edit.title')\"\n                                }}\n                            </p>\n                        </x-slot>\n\n                        <!-- Modal Content -->\n                        <x-slot:content>\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"id\"\n                                v-model=\"user.id\"\n                            />\n\n                            {!! view_render_event('admin.settings.users.index.form.name.before') !!}\n\n                            <!-- Name -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.users.index.create.name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"name\"\n                                    name=\"name\"\n                                    rules=\"required\"\n                                    v-model=\"user.name\"\n                                    :label=\"trans('admin::app.settings.users.index.create.name')\"\n                                    :placeholder=\"trans('admin::app.settings.users.index.create.name')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.users.index.form.name.after') !!}\n\n                            {!! view_render_event('admin.settings.users.index.form.email.before') !!}\n\n                            <!-- Email -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.users.index.create.email')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"email\"\n                                    id=\"email\"\n                                    name=\"email\"\n                                    v-model=\"user.email\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.users.index.create.email')\"\n                                    :placeholder=\"trans('admin::app.settings.users.index.create.email')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"email\" />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.users.index.form.email.after') !!}\n\n                            {!! view_render_event('admin.settings.users.index.form.password.before') !!}\n\n                            <div class=\"flex gap-4\">\n                                <!-- Password -->\n                                <x-admin::form.control-group class=\"flex-1\">\n                                    <x-admin::form.control-group.label ::class=\"user.id ? '' : 'required'\">\n                                        @lang('admin::app.settings.users.index.create.password')\n                                    </x-admin::form.control-group.label>\n\n                                    <x-admin::form.control-group.control\n                                        type=\"password\"\n                                        id=\"password\"\n                                        name=\"password\"\n                                        ::rules=\"user.id ? '' : 'required|min:6'\"\n                                        :label=\"trans('admin::app.settings.users.index.create.password')\"\n                                        :placeholder=\"trans('admin::app.settings.users.index.create.password')\"\n                                        ref=\"password\"\n                                    />\n\n                                    <x-admin::form.control-group.error control-name=\"password\" />\n                                </x-admin::form.control-group>\n\n                                <!-- Confirm Password -->\n                                <x-admin::form.control-group class=\"flex-1\">\n                                    <x-admin::form.control-group.label>\n                                        @lang('admin::app.settings.users.index.create.confirm-password')\n                                    </x-admin::form.control-group.label>\n\n                                    <x-admin::form.control-group.control\n                                        type=\"password\"\n                                        id=\"confirm_password\"\n                                        name=\"confirm_password\"\n                                        ::rules=\"values.password ? 'confirmed:@password' : ''\"\n                                        :label=\"trans('admin::app.settings.users.index.create.password')\"\n                                        :placeholder=\"trans('admin::app.settings.users.index.create.confirm-password')\"\n                                    />\n\n                                    <x-admin::form.control-group.error control-name=\"confirm_password\" />\n                                </x-admin::form.control-group>\n                            </div>\n\n                            {!! view_render_event('admin.settings.users.index.form.password.after') !!}\n\n                            {!! view_render_event('admin.settings.users.index.form.role_id.before') !!}\n\n                            <div class=\"flex gap-4\">\n                                <!-- Role -->\n                                <x-admin::form.control-group class=\"flex-1\">\n                                    <x-admin::form.control-group.label class=\"required\">\n                                        @lang('admin::app.settings.users.index.create.role')\n                                    </x-admin::form.control-group.label>\n\n                                    <x-admin::form.control-group.control\n                                        type=\"select\"\n                                        name=\"role_id\"\n                                        rules=\"required\"\n                                        v-model=\"user.role_id\"\n                                        :label=\"trans('admin::app.settings.users.index.create.role')\"\n                                    >\n                                        <option\n                                            v-for=\"role in roles\"\n                                            :key=\"role.id\"\n                                            :value=\"role.id\"\n                                        >\n                                            @{{ role.name }}\n                                        </option>\n                                    </x-admin::form.control-group.control>\n\n                                    <x-admin::form.control-group.error control-name=\"role_id\" />\n                                </x-admin::form.control-group>\n\n                                <!-- Permission -->\n                                <x-admin::form.control-group class=\"flex-1\">\n                                    <x-admin::form.control-group.label class=\"required\">\n                                        @lang('admin::app.settings.users.index.create.view-permission')\n                                    </x-admin::form.control-group.label>\n\n                                    <x-admin::form.control-group.control\n                                        type=\"select\"\n                                        name=\"view_permission\"\n                                        rules=\"required\"\n                                        v-model=\"user.view_permission\"\n                                        value=\"global\"\n                                        :label=\"trans('admin::app.settings.users.index.create.view-permission')\"\n                                    >\n                                        <!-- Default Option -->\n                                        <option  value=\"global\" selected>\n                                            @lang('admin::app.settings.users.index.create.global')\n                                        </option>\n\n                                        <option value=\"group\">\n                                            @lang('admin::app.settings.users.index.create.group')\n                                        </option>\n\n                                        <option value=\"individual\">\n                                            @lang('admin::app.settings.users.index.create.individual')\n                                        </option>\n                                    </x-admin::form.control-group.control>\n\n                                    <x-admin::form.control-group.error control-name=\"view_permission\" />\n                                </x-admin::form.control-group>\n                            </div>\n\n                            {!! view_render_event('admin.settings.users.index.form.role_id.after') !!}\n\n                            {!! view_render_event('admin.settings.users.index.form.role_id.before') !!}\n\n                            <template v-if=\"user.view_permission === 'group'\">\n                                <!-- Group -->\n                                <x-admin::form.control-group>\n                                    <x-admin::form.control-group.label class=\"required\">\n                                        @lang('admin::app.settings.users.index.create.group')\n                                    </x-admin::form.control-group.label>\n\n                                    <v-field\n                                        name=\"groups[]\"\n                                        label=\"@lang('admin::app.settings.users.index.create.group')\"\n                                        multiple\n                                        v-model=\"user.groups\"\n                                        rules=\"required\"\n                                    >\n                                        <select\n                                            name=\"groups[]\"\n                                            class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                            :class=\"[errors['groups[]'] ? 'border !border-red-600 hover:border-red-600' : '']\"\n                                            multiple\n                                            v-model=\"user.groups\"\n                                        >\n                                            <option\n                                                v-for=\"group in groups\"\n                                                :value=\"group.id\"\n                                                :text=\"group.name\"\n                                            >\n                                            </option>\n                                        </select>\n                                    </v-field>\n\n                                    <x-admin::form.control-group.error name=\"groups[]\" />\n                                </x-admin::form.control-group>\n                            </template>\n\n                            {!! view_render_event('admin.settings.users.index.form.role_id.after') !!}\n\n                            {!! view_render_event('admin.settings.users.index.form.status.before') !!}\n\n                            <!-- Status -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label for=\"status\">\n                                    @lang('admin::app.settings.users.index.create.status')\n                                </x-admin::form.control-group.label>\n\n                                <input\n                                    type=\"hidden\"\n                                    name=\"status\"\n                                    :value=\"0\"\n                                />\n\n                                <x-admin::form.control-group.control\n                                    type=\"switch\"\n                                    name=\"status\"\n                                    value=\"1\"\n                                    :label=\"trans('admin::app.settings.users.index.create.status')\"\n                                    ::checked=\"parseInt(user.status || 0)\"\n                                />\n                            </x-admin::form.control-group>\n\n                            {!! view_render_event('admin.settings.users.index.form.status.after') !!}\n                        </x-slot>\n\n                        <!-- Modal Footer -->\n                        <x-slot:footer>\n                            {!! view_render_event('admin.settings.users.index.modal.footer.save_button.before') !!}\n\n                            <!-- Save Button -->\n                            <x-admin::button\n                                button-type=\"submit\"\n                                class=\"primary-button justify-center\"\n                                :title=\"trans('admin::app.settings.users.index.create.save-btn')\"\n                                ::loading=\"isProcessing\"\n                                ::disabled=\"isProcessing\"\n                            />\n\n                            {!! view_render_event('admin.settings.users.index.modal.footer.save_button.after') !!}\n                        </x-slot>\n                    </x-admin::modal>\n\n                    {!! view_render_event('admin.settings.users.index.form_controls.after') !!}\n                </form>\n            </x-admin::form>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-users-settings', {\n                template: '#users-settings-template',\n\n                data() {\n                    return {\n                        isProcessing: false,\n\n                        roles: @json($roles),\n\n                        groups:  @json($groups),\n\n                        user: {\n                            view_permission: 'global',\n                        },\n                    };\n                },\n\n                computed: {\n                    gridsCount() {\n                        let count = this.$refs.datagrid.available.columns.length;\n\n                        if (this.$refs.datagrid.available.actions.length) {\n                            ++count;\n                        }\n\n                        if (this.$refs.datagrid.available.massActions.length) {\n                            ++count;\n                        }\n\n                        return count;\n                    },\n\n                    selectedType() {\n                        return this.user.id ? 'edit' : 'create';\n                    },\n                },\n\n                mounted() {\n                    @if(request('action') === 'create')\n                        this.openModal();\n                    @endif\n                },\n\n                methods: {\n                    handleToggle(state) {\n                        if (state.isActive) {\n                            return;\n                        }\n\n                        const url = new URL(window.location.href);\n\n                        url.searchParams.delete('action');\n\n                        window.history.replaceState({}, '', url);\n                    },\n\n                    openModal() {\n                        this.user = {\n                            groups: [],\n                        };\n\n                        this.$refs.userUpdateAndCreateModal.toggle();\n                    },\n\n                    updateOrCreate(params, {resetForm, setErrors}) {\n                        const userForm = new FormData(this.$refs.userForm);\n\n                        userForm.append('_method', params.id ? 'put' : 'post');\n\n                        this.isProcessing = true;\n\n                        this.$axios.post(\n                                params.id\n                                ? \"{{ route('admin.settings.users.update', ':id') }}\".replace(':id', params.id)\n                                : \"{{ route('admin.settings.users.store') }}\", userForm\n                            )\n                            .then(response => {\n                                this.isProcessing = false;\n\n                                this.$refs.userUpdateAndCreateModal.toggle();\n\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                                this.$refs.datagrid.get();\n\n                                resetForm();\n                            }).catch(error => {\n                                this.isProcessing = false;\n\n                                if (error.response.status === 422) {\n                                    setErrors(error.response.data.errors);\n                                }\n                            });\n                    },\n\n                    editModal(url) {\n                        this.$axios.get(url)\n                            .then(response => {\n                                this.user = response.data.data;\n\n                                this.user.groups = this.user.groups.map(group => group.id);\n\n                                this.$refs.userUpdateAndCreateModal.toggle();\n                            })\n                            .catch(error => {});\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/warehouses/create.blade.php",
    "content": "\n<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.warehouses.create.title')\n    </x-slot>\n\n    {!! view_render_event('admin.settings.warehouses.create.form.before') !!}\n\n    <x-admin::form\n        :action=\"route('admin.settings.warehouses.store')\"\n        method=\"POST\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.warehouses.create.breadcrumbs.before') !!}\n\n                    <!-- Breadcrumbs -->\n                    <x-admin::breadcrumbs name=\"settings.warehouses.create\" />\n\n                    {!! view_render_event('admin.settings.warehouses.create.breadcrumbs.after') !!}\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.settings.warehouses.create.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.warehouses.create.save_button.before') !!}\n                        @if (bouncer()->hasPermission('settings.inventory.warehouse.create'))\n                            <!-- Create button for person -->\n                            <button\n                                type=\"submit\"\n                                class=\"primary-button\"\n                            >\n                                @lang('admin::app.settings.warehouses.create.save-btn')\n                            </button>\n                        @endif\n                    \n                        {!! view_render_event('admin.settings.warehouses.create.save_button.after') !!}\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"flex gap-2.5 max-xl:flex-wrap\">\n                <!-- Left sub-component -->\n                <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                    <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                        <p class=\"mb-4 text-base font-semibold text-gray-800 dark:text-white\">\n                            @lang('admin::app.settings.warehouses.create.contact-info')\n                        </p>\n                        \n                        {!! view_render_event('admin.settings.warehouses.create.left.form_controls.before') !!}\n\n                        <x-admin::attributes\n                            :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                ['code', 'NOTIN', ['name', 'description']],\n                                'entity_type' => 'warehouses',\n                            ])->sortBy('sort_order')\"\n                            :custom-validations=\"[\n                                'contact_address' => [\n                                    'max:100',\n                                ],\n                                'postcode' => [\n                                    'postcode',\n                                ],\n                            ]\"\n                        />\n\n                        {!! view_render_event('admin.settings.warehouses.create.left.form_controls.after') !!}\n                    </div>\n                </div>\n\n                <!-- Right sub-component -->\n                <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                    <x-admin::accordion>\n                        <x-slot:header>\n                            <div class=\"flex items-center justify-between\">\n                                <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.roles.create.general')\n                                </p>\n                            </div>\n                        </x-slot>\n\n                        <x-slot:content>\n                            {!! view_render_event('admin.settings.warehouses.create.right.form_controls.before') !!}\n\n                            <x-admin::attributes\n                                :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                    ['code', 'IN', ['name', 'description']],\n                                    'entity_type' => 'warehouses',\n                                ])->sortBy('sort_order')\"\n                            />\n\n                            {!! view_render_event('admin.settings.warehouses.create.right.form_controls.after') !!}\n                        </x-slot>\n                    </x-admin::accordion>\n                </div>\n            </div>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.settings.warehouses.create.form.after') !!}\n\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/warehouses/edit.blade.php",
    "content": "\n<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.warehouses.edit.title')\n    </x-slot>\n\n    {!! view_render_event('admin.settings.warehouses.edit.form.before', ['warehouse' => $warehouse]) !!}\n\n    <x-admin::form\n        method=\"PUT\"\n        :action=\"route('admin.settings.warehouses.update', $warehouse->id)\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.warehouses.edit.breadcrumbs.before') !!}\n\n                    <!-- Breadcrumbs -->\n                    <x-admin::breadcrumbs \n                        name=\"settings.warehouses.edit\" \n                        :entity=\"$warehouse\"\n                    />\n\n                    {!! view_render_event('admin.settings.warehouses.edit.breadcrumbs.after') !!}\n                    \n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.settings.warehouses.edit.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.warehouse.edit.save_button.after') !!}\n                        \n                        @if (bouncer()->hasPermission('settings.inventory.warehouse.edit'))\n                        <!-- Create button for person -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.warehouses.edit.save-btn')\n                        </button>\n                        @endif\n\n                        {!! view_render_event('admin.settings.warehouses.edit.save_button.before') !!}\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"flex gap-2.5 max-xl:flex-wrap\">\n                <!-- Left sub-component -->\n                <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                    <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                        <p class=\"mb-4 text-base font-semibold text-gray-800 dark:text-white\">\n                            @lang('admin::app.settings.warehouses.edit.contact-info')\n                        </p>\n                        \n                        {!! view_render_event('admin.settings.warehouses.edit.left.form_controls.before', ['warehouse' => $warehouse]) !!}\n\n                        <x-admin::attributes\n                            :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                ['code', 'NOTIN', ['name', 'description']],\n                                'entity_type' => 'warehouses',\n                            ])->sortBy('sort_order')\"\n                            :custom-validations=\"[\n                                'contact_address' => [\n                                    'max:100',\n                                ],\n                                'postcode' => [\n                                    'postcode',\n                                ],\n                            ]\"\n                            :entity=\"$warehouse\"\n                        />\n\n                        {!! view_render_event('admin.settings.warehouses.edit.left.form_controls.after', ['warehouse' => $warehouse]) !!}\n                    </div>\n                </div>\n\n                <!-- Right sub-component -->\n                <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                    <x-admin::accordion>\n                        <x-slot:header>\n                            <div class=\"flex items-center justify-between\">\n                                <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.roles.create.general')\n                                </p>\n                            </div>\n                        </x-slot>\n\n                        <x-slot:content>\n                            {!! view_render_event('admin.settings.warehouses.edit.right.form_controls.before', ['warehouse' => $warehouse]) !!}\n\n                            <x-admin::attributes\n                                :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                                    ['code', 'IN', ['name', 'description']],\n                                    'entity_type' => 'warehouses',\n                                ])->sortBy('sort_order')\"\n                                :entity=\"$warehouse\"\n                            />\n\n                            {!! view_render_event('admin.settings.warehouses.edit.right.form_controls.after', ['warehouse' => $warehouse]) !!}\n                        </x-slot>\n                    </x-admin::accordion>\n                </div>\n            </div>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.settings.warehouses.edit.form.after', ['warehouse' => $warehouse]) !!}\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/warehouses/index.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.settings.warehouses.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                <!-- breadcrumbs -->\n                <x-admin::breadcrumbs name=\"settings.warehouses\" />\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    <!-- title -->\n                    @lang('admin::app.settings.warehouses.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <!-- Create button For Warehouses -->\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.settings.warehouses.index.create_button.before') !!}\n\n                    @if (bouncer()->hasPermission('settings.inventory.warehouse.create'))\n                        <a\n                            href=\"{{ route('admin.settings.warehouses.create') }}\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.warehouses.index.create-btn')\n                        </a>\n                    @endif\n\n                    {!! view_render_event('admin.settings.warehouses.index.create_button.after') !!}\n                </div>\n            </div>\n        </div>\n\n        {!! view_render_event('admin.settings.warehouses.index.datagrid.before') !!}\n\n        <!-- DataGrid -->\n        <x-admin::datagrid :src=\"route('admin.settings.warehouses.index')\">\n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </x-admin::datagrid>\n\n        {!! view_render_event('admin.settings.warehouses.index.datagrid.after') !!}\n    </div>\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/contact-information.blade.php",
    "content": "{!! view_render_event('admin.leads.view.person.before', ['warehouse' => $warehouse]) !!}\n\n<div class=\"flex w-full flex-col gap-4 border-b border-gray-200 p-4 dark:border-gray-800\">\n    <x-admin::accordion  class=\"select-none !border-none\">\n        <x-slot:header class=\"!p-0\">\n            <h4 class=\"font-semibold dark:text-white\">\n                @lang('admin::app.settings.warehouses.view.contact-information.title')\n            </h4>\n        </x-slot>\n\n        <x-slot:content class=\"mt-4 !px-0 !pb-0\">\n            <!-- General Initials -->\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modalForm\"\n            >\n                <form @submit=\"handleSubmit($event, () => {})\">\n                    {!! view_render_event('admin.leads.view.person.attributes.view.before', ['warehouse' => $warehouse]) !!}\n\n                    <x-admin::attributes.view\n                        :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                            'entity_type' => 'warehouses',\n                            ['code', 'IN', ['contact_name', 'contact_emails', 'contact_numbers', 'contact_address']]\n                        ])\"\n                        :entity=\"$warehouse\"\n                        :url=\"route('admin.settings.warehouses.update', $warehouse->id)\"           \n                        :allow-edit=\"true\"\n                    />\n\n                    {!! view_render_event('admin.leads.view.person.attributes.view.after', ['warehouse' => $warehouse]) !!}\n                </form>\n            </x-admin::form>\n        </x-slot>\n    </x-admin::accordion>\n</div>\n\n{!! view_render_event('admin.leads.view.person.after', ['warehouse' => $warehouse]) !!}"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/general-information.blade.php",
    "content": "{!! view_render_event('admin.leads.view.person.before', ['warehouse' => $warehouse]) !!}\n\n<div class=\"flex w-full flex-col gap-4 border-b border-gray-200 p-4 dark:border-gray-800\">\n    <x-admin::accordion  class=\"select-none !border-none\">\n        <x-slot:header class=\"!p-0\">\n            <h4 class=\"font-semibold dark:text-white\">\n                @lang('admin::app.settings.warehouses.view.general-information.title')\n            </h4>\n        </x-slot>\n\n        <x-slot:content class=\"mt-4 !px-0 !pb-0\">\n            <!-- Contact Initials -->\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modalForm\"\n            >\n                <form @submit=\"handleSubmit($event, () => {})\">\n                    {!! view_render_event('admin.leads.view.person.attributes.view.before', ['warehouse' => $warehouse]) !!}\n\n                    <x-admin::attributes.view\n                        :custom-attributes=\"app('Webkul\\Attribute\\Repositories\\AttributeRepository')->findWhere([\n                            'entity_type' => 'warehouses',\n                            ['code', 'NOTIN', ['contact_name', 'contact_emails', 'contact_numbers', 'contact_address']]\n                        ])\"\n                        :entity=\"$warehouse\"\n                        :url=\"route('admin.settings.warehouses.update', $warehouse->id)\"        \n                        :allow-edit=\"true\"\n                    />\n\n                    {!! view_render_event('admin.leads.view.person.attributes.view.after', ['warehouse' => $warehouse]) !!}\n                </form>\n            </x-admin::form>\n        </x-slot>\n    </x-admin::accordion>\n</div>\n\n{!! view_render_event('admin.leads.view.person.after', ['warehouse' => $warehouse]) !!}"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/warehouses/view/locations.blade.php",
    "content": "\n<v-locations></v-locations>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-locations-template\"\n    >\n        <div class=\"flex flex-col gap-2 p-4\">\n            <!-- Location Table -->\n            <x-admin::table>\n                <x-admin::table.thead class=\"rounded-lg border border-gray-200 px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                    <x-admin::table.thead.tr>\n                        <x-admin::table.th>\n                            @lang('admin::app.settings.warehouses.view.locations.name')\n                        </x-admin::table.th>\n\n                        <x-admin::table.th>\n                            @lang('admin::app.settings.warehouses.view.locations.action')\n                    </x-admin::table.th>\n                    </x-admin::table.thead.tr>\n                </x-admin::table.thead>\n\n                <x-admin::table.tbody >\n                    <x-admin::table.tbody.tr\n                        class=\"border border-gray-200 dark:border-gray-800 dark:bg-gray-900\"\n                        v-for=\"location in locations\"\n                    >\n                        <x-admin::table.td class=\"dark:text-white\">\n                            @{{ location.name }}\n                        </x-admin::table.td>\n\n                        <x-admin::table.td>\n                            <div class=\"inline-block\">\n                                <p\n                                    @click=\"remove(location)\"\n                                    class=\"cursor-pointer text-brandColor\"\n                                >\n                                    @lang('admin::app.settings.warehouses.view.locations.delete')\n                                </p>\n                            </div>\n                        </x-admin::table.td>\n                    </x-admin::table.tbody.tr>\n                </x-admin::table.tbody>\n            </x-admin::table>\n\n            <!-- Add Location -->\n            <button\n                type=\"button\"\n                class=\"flex max-w-max items-center gap-2 text-brandColor\"\n                @click=\"openModal()\"\n            >\n                <i class=\"icon-add text-md !text-brandColor\"></i>\n\n                @lang('admin::app.settings.warehouses.view.locations.add-location')\n            </button>\n\n            <x-admin::form\n                v-slot=\"{ meta, errors, handleSubmit }\"\n                as=\"div\"\n                ref=\"modalForm\"\n            >\n                <form @submit=\"handleSubmit($event, addLocation)\">\n                    {!! view_render_event('admin.settings.tags.index.form_controls.before') !!}\n\n                    <x-admin::modal ref=\"locationCreateModal\">\n                        <!-- Modal Header -->\n                        <x-slot:header>\n                            <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                                @lang('Add Location ')\n                            </p>\n                        </x-slot>\n\n                        <!-- Modal Content -->\n                        <x-slot:content>\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"entity_type\"\n                                value=\"Warehouses\"\n                            />\n\n                            <x-admin::form.control-group.control\n                                type=\"hidden\"\n                                name=\"warehouse_id\"\n                                value=\"{{ $warehouse->id }}\"\n                            />\n\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.warehouses.view.locations.name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"name\"\n                                    name=\"name\"\n                                    value=\"{{ old('name') }}\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.warehouses.view.locations.name')\"\n                                    :placeholder=\"trans('admin::app.settings.warehouses.view.locations.name')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n                        </x-slot>\n\n                        <!-- Modal Footer -->\n                        <x-slot:footer>\n                            <!-- Save Button -->\n                            <x-admin::button\n                                button-type=\"submit\"\n                                class=\"primary-button justify-center\"\n                                :title=\"trans('admin::app.settings.warehouses.view.locations.save-btn')\"\n                                ::loading=\"isProcessing\"\n                                ::disabled=\"isProcessing\"\n                            />\n                        </x-slot>\n                    </x-admin::modal>\n\n                    {!! view_render_event('admin.settings.tags.index.form_controls.after') !!}\n                </form>\n            </x-admin::form>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-locations', {\n            template: '#v-locations-template',\n\n            data() {\n                return {\n                    locations: [],\n\n                    isProcessing: false,\n                };\n            },\n\n            mounted() {\n                this.getLocations();\n            },\n\n            methods: {\n                openModal() {\n                    this.$refs.locationCreateModal.toggle();\n                },\n\n                addLocation(params, { resetForm, setErrors }) {\n                    this.isProcessing = true;\n\n                    this.$axios.post('{{ route('admin.settings.locations.store') }}', params)\n                        .then((response) => {\n                            this.isProcessing = false;\n\n                            this.getLocations();\n\n                            this.$refs.locationCreateModal.toggle();\n\n                            this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                            resetForm();\n                        })\n                        .catch((error) => {\n                            this.isProcessing = false;\n\n                            setErrors(error.response.data.errors);\n                        })\n                },\n\n                getLocations() {\n                    this.$axios.get(\"{{ route('admin.settings.locations.search') }}\", {\n                        params: {\n                            search: 'warehouse_id: {{ $warehouse->id }}',\n                        },\n                    })\n                        .then(response => {\n                            this.locations = response.data.data;\n                        })\n                        .catch(error => {\n                            this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n                        });\n                },\n\n                remove(location) {\n                    this.$emitter.emit('open-confirm-modal', {\n                        agree: () => {\n                            this.isLoading = true;\n\n                            this.$axios.delete(\"{{ route('admin.settings.locations.delete', 'locationId') }}\"\n                                .replace('locationId', location.id))\n                                .then(response => {\n                                    this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n\n                                    this.isLoading = false;\n\n                                    this.getLocations();\n                                })\n                                .catch(error => {\n                                    this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n\n                                    this.isLoading = false;\n                                });\n                        }\n                    });\n                }\n            }\n        });\n    </script>\n@endPushOnce\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/warehouses/view.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        {{ strip_tags($warehouse->name) }}\n    </x-slot>\n\n    <div class=\"flex gap-4 max-lg:flex-wrap\">\n        <!-- Left Panel -->\n        {!! view_render_event('admin.settings.warehouses.view.left.before', ['warehouse' => $warehouse]) !!}\n\n        <div class=\"max-lg:min-w-full max-lg:max-w-full [&>div:last-child]:border-b-0 lg:sticky lg:top-[73px] flex min-w-[394px] max-w-[394px] flex-col self-start rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n            <!-- Product Information -->\n            <div class=\"flex w-full flex-col gap-2 border-b border-gray-200 p-4 dark:border-gray-800\">\n                <!-- Breadcrumbs -->\n                <div class=\"flex items-center justify-between\">\n                    <x-admin::breadcrumbs\n                        name=\"settings.warehouses.view\"\n                        :entity=\"$warehouse\"\n                    />\n                </div>\n\n                {!! view_render_event('admin.settings.warehouses.view.left.tags.before', ['warehouse' => $warehouse]) !!}\n\n                <!-- Tags -->\n                <x-admin::tags\n                    :attach-endpoint=\"route('admin.settings.warehouses.tags.attach', $warehouse->id)\"\n                    :detach-endpoint=\"route('admin.settings.warehouses.tags.detach', $warehouse->id)\"\n                    :added-tags=\"$warehouse->tags\"\n                />\n\n                {!! view_render_event('admin.settings.warehouses.view.left.tags.after', ['warehouse' => $warehouse]) !!}\n\n                {!! view_render_event('admin.settings.warehouses.view.left.title.before', ['warehouse' => $warehouse]) !!}\n\n                <!-- Title -->\n                <h3 class=\"text-lg font-bold dark:text-white\">\n                    {{ $warehouse->name }}\n                </h3>\n\n                {!! view_render_event('admin.settings.warehouses.view.left.title.after', ['warehouse' => $warehouse]) !!}\n\n                {!! view_render_event('admin.settings.warehouses.view.left.actions.before', ['warehouse' => $warehouse]) !!}\n\n                <!-- Activity Actions -->\n                <div class=\"flex flex-wrap gap-2\">\n                    {!! view_render_event('admin.settings.warehouses.view.left.actions.file.before', ['warehouse' => $warehouse]) !!}\n\n                    <!-- File Activity Action -->\n                    <x-admin::activities.actions.file\n                        :entity=\"$warehouse\"\n                        entity-control-name=\"warehouse_id\"\n                    />\n\n                    {!! view_render_event('admin.settings.warehouses.view.left.actions.file.after', ['warehouse' => $warehouse]) !!}\n\n                    {!! view_render_event('admin.settings.warehouses.view.left.actions.note.before', ['warehouse' => $warehouse]) !!}\n\n                    <!-- Note Activity Action -->\n                    <x-admin::activities.actions.note\n                        :entity=\"$warehouse\"\n                        entity-control-name=\"warehouse_id\"\n                    />\n\n                    {!! view_render_event('admin.settings.warehouses.view.left.actions.note.after', ['warehouse' => $warehouse]) !!}\n\n                    {!! view_render_event('admin.settings.warehouses.view.left.actions.activity.before', ['warehouse' => $warehouse]) !!}\n\n                    <!-- Activity Action -->\n                    <x-admin::activities.actions.activity\n                        :entity=\"$warehouse\"\n                        entity-control-name=\"warehouse_id\"\n                    />\n\n                    {!! view_render_event('admin.settings.warehouses.view.left.actions.activity.after', ['warehouse' => $warehouse]) !!}\n                </div>\n\n                {!! view_render_event('admin.settings.warehouses.view.left.actions.after', ['warehouse' => $warehouse]) !!}\n            </div>\n            \n            <!-- General Information -->\n            @include ('admin::settings.warehouses.view.general-information')\n\n            <!-- Contact Information -->\n            @include ('admin::settings.warehouses.view.contact-information')\n        </div>\n\n        {!! view_render_event('admin.settings.warehouses.view.left.after', ['warehouse' => $warehouse]) !!}\n\n        {!! view_render_event('admin.settings.warehouses.view.right.before', ['warehouse' => $warehouse]) !!}\n        \n        <!-- Right Panel -->\n        <div class=\"flex w-full flex-col gap-4 rounded-lg\">\n            {!! view_render_event('admin.settings.warehouses.view.right.attributes.before', ['warehouse' => $warehouse]) !!}\n\n            <!-- Activity Navigation -->\n            <x-admin::activities\n                :endpoint=\"route('admin.settings.warehouse.activities.index', $warehouse->id)\" \n                :types=\"[\n                    ['name' => 'all', 'label' => trans('admin::app.settings.warehouses.view.all')],\n                    ['name' => 'note', 'label' => trans('admin::app.settings.warehouses.view.notes')],\n                    ['name' => 'file', 'label' => trans('admin::app.settings.warehouses.view.files')],\n                    ['name' => 'system', 'label' => trans('admin::app.settings.warehouses.view.change-logs')],\n                ]\"\n                :extra-types=\"[\n                    ['name' => 'location', 'label' => trans('admin::app.settings.warehouses.view.location')],\n                ]\"\n            >\n                <x-slot:location>\n                    @include ('admin::settings.warehouses.view.locations')\n                </x-slot>\n            </x-admin::activities>\n\n            {!! view_render_event('admin.settings.warehouses.view.right.attributes.after', ['warehouse' => $warehouse]) !!}\n        </div>\n\n        {!! view_render_event('admin.warehouse.view.right.after', ['warehouse' => $warehouse]) !!}\n    </div>    \n</x-admin::layouts>"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/web-forms/create.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.webforms.create.title')\n    </x-slot>\n\n    <x-admin::form :action=\"route('admin.settings.web_forms.store')\">\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.webform.create.breadcrumbs.before') !!}\n\n                    <!-- Breadcrumbs -->\n                    <x-admin::breadcrumbs name=\"settings.web_forms.create\" />\n\n                    {!! view_render_event('admin.settings.webform.create.breadcrumbs.after') !!}\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.settings.webforms.create.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.webform.create.save_button.before') !!}\n\n                        <!-- Create Button -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.webforms.create.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.settings.webform.create.save_button.after') !!}\n                    </div>\n                </div>\n            </div>\n\n            <v-webform></v-webform>\n        </div>\n    </x-admin::form>\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-webform-template\"\n        >\n            <div class=\"flex gap-2.5 max-xl:flex-wrap\">\n                {!! view_render_event('admin.settings.webform.create.left.before') !!}\n\n                <!-- Left Sub Component -->\n                <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                    <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                        <div class=\"mb-4 flex items-center justify-between gap-4\">\n                            <div class=\"flex flex-col gap-1\">\n                                <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.webforms.create.title')\n                                </p>\n                            </div>\n                        </div>\n\n                        {!! view_render_event('admin.settings.webform.create.form_controls.before') !!}\n\n                        <!-- Submit Success Actions -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.webforms.create.submit-success-action')\n                            </x-admin::form.control-group.label>\n\n                            <div class=\"flex\">\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    name=\"submit_success_action\"\n                                    id=\"submit_success_action\"\n                                    value=\"message\"\n                                    class=\"!w-1/4 rounded-r-none\"\n                                    :label=\"trans('admin::app.settings.webforms.create.submit-success-action')\"\n                                    v-model=\"submitSuccessAction.value\"\n                                >\n                                    <template\n                                        v-for=\"(option, index) in submitSuccessAction.options\"\n                                        :key=\"index\"\n                                    >\n                                        <option\n                                            :value=\"option.value\"\n                                            :text=\"option.label\"\n                                        ></option>\n                                    </template>\n                                </x-admin::form.control-group.control>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"submit_success_content\"\n                                    id=\"submit_success_content\"\n                                    class=\"rounded-l-none\"\n                                    rules=\"required\"\n                                    :value=\"old('submit_success_content')\"\n                                    :label=\"trans('admin::app.settings.webforms.create.submit-success-action')\"\n                                    ::placeholder=\"placeholder\"\n                                />\n                            </div>\n\n                            <x-admin::form.control-group.error control-name=\"submit_success_content\"/>\n                        </x-admin::form.control-group>\n\n                        <!-- Create Leads -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label for=\"create_lead\">\n                                @lang('admin::app.settings.webforms.create.create-lead')\n                            </x-admin::form.control-group.label>\n\n                            <input\n                                type=\"hidden\"\n                                name=\"create_lead\"\n                                :value=\"0\"\n                            />\n\n                            <x-admin::form.control-group.control\n                                type=\"switch\"\n                                name=\"create_lead\"\n                                value=\"1\"\n                                :label=\"trans('admin::app.settings.webforms.create.create-lead')\"\n                                :checked=\"false\"\n                            />\n\n                        </x-admin::form.control-group>\n\n                        <!-- Customize Web-form -->\n                        <div class=\"mb-4 flex items-center justify-between gap-4\">\n                            <div class=\"flex flex-col gap-1\">\n                                <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.webforms.create.customize-webform')\n                                </p>\n\n                                <p class=\"text-sm text-gray-600 dark:text-white\">\n                                    @lang('admin::app.settings.webforms.create.customize-webform-info')\n                                </p>\n                            </div>\n                        </div>\n\n                        <!-- Background Color Picker -->\n                        <v-color-picker\n                            name=\"background_color\"\n                            title=\"@lang('admin::app.settings.webforms.create.background-color')\"\n                            value=\"{{ old('background_color') ?? '#F7F8F9' }}\"\n                            class=\"w-1/5\"\n                        >\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"\">\n                                    @lang('admin::app.settings.webforms.create.background-color')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"background_color\"\n                                    id=\"background_color\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"background_color\"/>\n                            </x-admin::form.control-group>\n                        </v-color-picker>\n\n                        <!-- Background Color Picker -->\n                        <v-color-picker\n                            name=\"form_background_color\"\n                            title=\"@lang('admin::app.settings.webforms.create.form-background-color')\"\n                            value=\"{{ old('form_background_color') ?? '#FFFFFF' }}\"\n                            class=\"w-1/5\"\n                        >\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"\">\n                                    @lang('admin::app.settings.webforms.create.form-background-color')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"form_background_color\"\n                                    id=\"form_background_color\"\n                                    :label=\"trans('admin::app.settings.webforms.create.form-background-color')\"\n                                    :placeholder=\"trans('admin::app.settings.webforms.create.form-background-color')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"form_background_color\"/>\n                            </x-admin::form.control-group>\n                        </v-color-picker>\n\n                        <!-- Background Color Picker -->\n                        <v-color-picker\n                            name=\"form_title_color\"\n                            title=\"@lang('admin::app.settings.webforms.create.form-title-color')\"\n                            value=\"{{ old('form_title_color') ?? '#263238' }}\"\n                            class=\"w-1/5\"\n                        >\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"\">\n                                    @lang('admin::app.settings.webforms.create.form-title-color')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"form_title_color\"\n                                    id=\"form_title_color\"\n                                    :label=\"trans('admin::app.settings.webforms.create.form-title-color')\"\n                                    :placeholder=\"trans('admin::app.settings.webforms.create.form-title-color')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"form_title_color\"/>\n                            </x-admin::form.control-group>\n                        </v-color-picker>\n\n                        <!-- Form Submit Button Picker -->\n                        <v-color-picker\n                            name=\"form_submit_button_color\"\n                            title=\"@lang('admin::app.settings.webforms.create.form-submit-btn-color')\"\n                            value=\"{{ old('form_submit_button_color') ?? '#0E90D9' }}\"\n                            class=\"w-1/5\"\n                        >\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label>\n                                    @lang('admin::app.settings.webforms.create.form-submit-btn-color')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"form_submit_button_color\"\n                                    id=\"form_submit_button_color\"\n                                    :label=\"trans('admin::app.settings.webforms.create.form-submit-btn-color')\"\n                                    :placeholder=\"trans('admin::app.settings.webforms.create.form-submit-btn-color')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"form_submit_button_color\"/>\n                            </x-admin::form.control-group>\n                        </v-color-picker>\n\n                        <!-- Attribute Label Color Picker -->\n                        <v-color-picker\n                            name=\"attribute_label_color\"\n                            title=\"@lang('admin::app.settings.webforms.create.attribute-label-color')\"\n                            value=\"{{ old('attribute_label_color') ?? '#546E7A' }}\"\n                            class=\"w-1/5\"\n                        >\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"\">\n                                    @lang('admin::app.settings.webforms.create.attribute-label-color')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"attribute_label_color\"\n                                    id=\"attribute_label_color\"\n                                    :label=\"trans('admin::app.settings.webforms.create.attribute-label-color')\"\n                                    :placeholder=\"trans('admin::app.settings.webforms.create.attribute-label-color')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"attribute_label_color\"/>\n                            </x-admin::form.control-group>\n                        </v-color-picker>\n\n\n                         <!-- Attributes -->\n                        <div class=\"mb-4 flex items-center justify-between gap-4\">\n                            <div class=\"flex flex-col gap-1\">\n                                <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.webforms.create.attributes')\n                                </p>\n\n                                <p class=\"text-sm text-gray-600 dark:text-white\">\n                                    @lang('admin::app.settings.webforms.create.attributes-info')\n                                </p>\n                            </div>\n                        </div>\n\n                        <div class= \"flex flex-col gap-4\">\n                            <x-admin::dropdown class=\"w-1/5 rounded-lg group-hover:visible dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\">\n                                <x-slot:toggle>\n                                    <button\n                                        type=\"button\"\n                                        class=\"primary-button\"\n                                    >\n                                        @lang('admin::app.settings.webforms.create.add-attribute-btn')\n                                    </button>\n                                </x-slot>\n\n                                <x-slot:menu class=\"max-h-80 overflow-y-auto !p-0 dark:border-gray-800\">\n                                    <template v-if=\"createLead\">\n                                        <div class=\"m-2 text-lg font-bold\">@lang('admin::app.settings.webforms.create.leads')</div>\n\n                                        <span\n                                            v-for=\"attribute in groupedAttributes.leads\"\n                                            class=\"whitespace-no-wrap flex cursor-pointer items-center justify-between gap-1.5 rounded-t px-2 py-2 text-sm text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950\"\n                                            @click=\"addAttribute(attribute)\"\n                                        >\n                                            <div class=\"items flex items-center gap-1.5\">\n                                                @{{ attribute.name }}\n                                            </div>\n                                        </span>\n                                    </template>\n\n                                    <template v-else>\n                                        <div class=\"m-2 text-lg font-bold\">@lang('admin::app.settings.webforms.create.person')</div>\n\n                                        <span\n                                            v-for=\"attribute in groupedAttributes.persons\"\n                                            class=\"whitespace-no-wrap flex cursor-pointer items-center justify-between gap-1.5 rounded-t px-2 py-2 text-sm text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950\"\n                                            @click=\"addAttribute(attribute)\"\n                                        >\n                                            <div class=\"items flex items-center gap-1.5\">\n                                                @{{ attribute.name }}\n                                            </div>\n                                        </span>\n                                    </template>\n                                </x-slot>\n                            </x-admin::dropdown>\n\n                            <!-- Attributes -->\n                            <draggable\n                                tag=\"tbody\"\n                                ghost-class=\"draggable-ghost\"\n                                handle=\".icon-move\"\n                                v-bind=\"{animation: 200}\"\n                                item-key=\"id\"\n                                :list=\"addedAttributes\"z\n                            >\n                                <template #item=\"{ element, index }\">\n                                    <x-admin::table.thead.tr class=\"hover:bg-gray-50 dark:hover:bg-gray-950\">\n                                        <!-- Draggable Icon -->\n                                        <x-admin::table.td class=\"text-center\">\n                                            <i class=\"icon-move cursor-grab rounded-md text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"></i>\n\n                                            <input\n                                                type=\"hidden\"\n                                                :value=\"element['attribute']['id']\"\n                                                :name=\"'attributes[' + element.id + '][attribute_id]'\"\n                                            />\n                                        </x-admin::table.td>\n\n                                        <!-- Attribute Name -->\n                                        <x-admin::table.td>\n                                            <x-admin::form.control-group>\n                                                <x-admin::form.control-group.label class=\"\">\n                                                    @{{ element?.name + ' (' + element?.attribute?.entity_type + ')' }}\n                                                </x-admin::form.control-group.label>\n\n                                                <x-admin::form.control-group.control\n                                                    type=\"text\"\n                                                    ::name=\"'attributes[' + element.id + '][name]'\"\n                                                    v-model=\"element.name\"\n                                                />\n\n                                                <x-admin::form.control-group.error ::name=\"'attributes[' + element.id + '][name]'\"/>\n                                            </x-admin::form.control-group>\n\n                                        </x-admin::table.td>\n\n                                        <!-- Placeholder -->\n                                        <x-admin::table.td>\n                                            <x-admin::form.control-group class=\"!mt-6\">\n                                                <x-admin::form.control-group.control\n                                                    type=\"text\"\n                                                    ::name=\"'attributes[' + element.id + '][placeholder]'\"\n                                                    ::rules=\"element.attribute.validation\"\n                                                    ::label=\"element?.name + ' (' + element?.attribute?.entity_type + ')'\"\n                                                    ::placeholder=\"getPlaceholderValue(element)\"\n                                                />\n\n                                                <x-admin::form.control-group.error ::name=\"'attributes[' + element.id + '][placeholder]'\"/>\n                                            </x-admin::form.control-group>\n                                        </x-admin::table.td>\n\n                                        <!-- Required Or Not -->\n                                        <x-admin::table.td>\n                                            <x-admin::form.control-group class=\"!mt-6\">\n                                                <label :for=\"'attributes[' + element.id + '][is_required]'\">\n                                                    <!--\n                                                        When the checkbox is disabled for name and email, we will set a hidden value\n                                                        because the form will not send the value of disabled input fields.\n                                                    -->\n                                                    <input\n                                                        type=\"hidden\"\n                                                        :name=\"'attributes[' + element.id + '][is_required]'\"\n                                                        :value=\"1\"\n                                                        v-if=\"['name', 'emails'].includes(element['attribute']['code'])\"\n                                                    >\n\n                                                    <!--\n                                                        Only the name and email fields are required, so we will disable the checkbox and\n                                                        force the user to provide them.\n                                                    -->\n                                                    <input\n                                                        type=\"checkbox\"\n                                                        :name=\"'attributes[' + element.id + '][is_required]'\"\n                                                        :id=\"'attributes[' + element.id + '][is_required]'\"\n                                                        :value=\"1\"\n                                                        class=\"peer hidden\"\n                                                        :checked=\"element.is_required\"\n                                                        :disabled=\"['name', 'emails'].includes(element['attribute']['code'])\"\n                                                    >\n\n                                                    <!--\n                                                        We will display a disabled checkbox for the name and email fields.\n                                                    -->\n                                                    <span\n                                                        class='icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl peer-checked:text-brandColor'\n                                                        :class=\"{'opacity-50' : ['name', 'emails'].includes(element['attribute']['code'])}\"\n                                                    ></span>\n                                                </label>\n                                            </x-admin::form.control-group>\n                                        </x-admin::table.td>\n\n                                        <!-- Actions -->\n                                        <x-admin::table.td>\n                                            <x-admin::form.control-group class=\"!mt-6\">\n                                                <i\n                                                    class=\"icon-delete cursor-pointer text-2xl\"\n                                                    v-if=\"! ['name', 'emails'].includes(element['attribute']['code'])\"\n                                                    @click=\"removeAttribute(element)\"\n                                                ></i>\n                                            </x-admin::form.control-group>\n                                        </x-admin::table.td>\n                                    </x-admin::table.thead.tr>\n                                </template>\n                            </draggable>\n                        </div>\n\n                        {!! view_render_event('admin.settings.webform.create.form_controls.after') !!}\n                    </div>\n                </div>\n\n                {!! view_render_event('admin.settings.webform.create.left.after') !!}\n\n                {!! view_render_event('admin.settings.webform.create.right.before') !!}\n\n                <!-- Right Sub Component -->\n                <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                    <x-admin::accordion class=\"rounded-lg\">\n                        <x-slot:header>\n                            <div class=\"flex items-center justify-between\">\n                                <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.webforms.create.general')\n                                </p>\n                            </div>\n                        </x-slot>\n\n                        <x-slot:content>\n                            <!-- Title -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.webforms.create.title')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"title\"\n                                    name=\"title\"\n                                    rules=\"required\"\n                                    :value=\"old('title')\"\n                                    :label=\"trans('admin::app.settings.webforms.create.title')\"\n                                    :placeholder=\"trans('admin::app.settings.webforms.create.title')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"title\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Description -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"\">\n                                    @lang('admin::app.settings.webforms.create.description')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"textarea\"\n                                    id=\"description\"\n                                    name=\"description\"\n                                    :value=\"old('description')\"\n                                    :label=\"trans('admin::app.settings.webforms.create.description')\"\n                                    :placeholder=\"trans('admin::app.settings.webforms.create.description')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"description\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Submit Button Label -->\n                            <x-admin::form.control-group class=\"!mb-0\">\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.webforms.create.submit-button-label')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"submit_button_label\"\n                                    name=\"submit_button_label\"\n                                    rules=\"required\"\n                                    :value=\"old('submit_button_label')\"\n                                    :label=\"trans('admin::app.settings.webforms.create.submit-button-label')\"\n                                    :placeholder=\"trans('admin::app.settings.webforms.create.submit-button-label')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"submit_button_label\" />\n                            </x-admin::form.control-group>\n                        </x-slot>\n                    </x-admin::accordion>\n                </div>\n\n                {!! view_render_event('admin.settings.webform.create.right.after') !!}\n            </div>\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-color-picker-template\"\n        >\n            <x-admin::form.control-group>\n                <x-admin::form.control-group.label class=\"required\">\n                    @{{ title }}\n                </x-admin::form.control-group.label>\n\n                <div class=\"flex\">\n                    <x-admin::form.control-group.control\n                        type=\"text\"\n                        ::name=\"name\"\n                        ::id=\"name\"\n                        class=\"rounded-r-none\"\n                        rules=\"required\"\n                        ::label=\"title\"\n                        v-model=\"color\"\n                    />\n\n                    <x-admin::form.control-group.control\n                        type=\"color\"\n                        class=\"!h-10 !w-12 rounded-l-none p-1 dark:border-gray-800 dark:bg-gray-900\"\n                        name=\"color\"\n                        :label=\"trans('Submit Success Action')\"\n                        ::value=\"color\"\n                        @input=\"color = $event.target.value\"\n                    />\n                </div>\n\n                <x-admin::form.control-group.error ::name=\"name\"/>\n            </x-admin::form.control-group>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-webform', {\n                template: '#v-webform-template',\n\n                data() {\n                    return {\n                        submitSuccessAction: {\n                            value: '{{ old('submit_success_action', 'message') }}',\n\n                            options: [\n                                { value: 'message', label: '@lang('admin::app.settings.webforms.create.display-custom-message')' },\n                                { value: 'redirect', label: '@lang('admin::app.settings.webforms.create.redirect-to-url')' },\n                            ],\n                        },\n\n                        createLead: false,\n\n                        attributes: @json($attributes['other']),\n\n                        addedAttributes: [],\n\n                        attributeCount: 0,\n                    }\n                },\n\n                watch: {\n                    /**\n                     * Watch for the createLead value and remove the added attributes if the value is true.\n                     *\n                     * @param {Boolean} newValue\n                     * @param {Boolean} oldValue\n                     *\n                     * @return {void}\n                     */\n                    createLead(newValue, oldValue) {\n                        if (newValue) {\n                            return;\n                        }\n\n                        this.addedAttributes = this.addedAttributes.filter(attribute => attribute.attribute.entity_type != 'leads');\n                    },\n                },\n\n                computed:{\n                    /**\n                     * Get the placeholder value based on the submit success action value.\n                     *\n                     * @return {String}\n                     */\n                    placeholder() {\n                        return this.submitSuccessAction.value === 'message' ? '@lang('Enter message to display')' : '@lang('Enter url to redirect')';\n                    },\n\n                    /**\n                     * Get the grouped attributes based on the entity type.\n                     *\n                     * @return {Object}\n                     */\n                    groupedAttributes() {\n                        return this.attributes.reduce((r, a) => {\n                            r[a.entity_type] = [...r[a.entity_type] || [], a];\n                            return r;\n                        }, {});\n                    },\n                },\n\n                created () {\n                    @json($attributes['default']).forEach(function (attribute, key) {\n                        this.addedAttributes.push({\n                            'id': 'attribute_' + this.attributeCount++,\n                            'name': attribute.name,\n                            'is_required': attribute.is_required,\n                            'attribute': attribute,\n                        });\n                    }, this);\n                },\n\n                methods: {\n                    /**\n                     * Add the attribute to the added attributes list.\n                     *\n                     * @param {Object} attribute\n                     *\n                     * @return {void}\n                     */\n                    addAttribute(attribute) {\n                        this.addedAttributes.push({\n                            id: 'attribute_' + this.attributeCount++,\n                            name: attribute.name,\n                            is_required: attribute.is_required,\n                            attribute: attribute,\n                        });\n\n                        const index = this.attributes.indexOf(attribute);\n                        if (index > -1) {\n                            this.attributes.splice(index, 1);\n                        }\n                    },\n\n                    /**\n                     * Remove the attribute from the added attributes list.\n                     *\n                     * @param {Object} attribute\n                     *\n                     * @return {void}\n                     */\n                    removeAttribute(attribute) {\n                        this.attributes.push(attribute.attribute);\n\n                        const index = this.addedAttributes.indexOf(attribute);\n                        if (index > -1) {\n                            this.addedAttributes.splice(index, 1);\n                        }\n                    },\n\n                    /**\n                     * Get the placeholder value based on the attribute type.\n                     *\n                     * @param {Object} attribute\n                     *\n                     * @return {String}\n                     */\n                    getPlaceholderValue(attribute) {\n                        if (attribute.type == 'select'\n                            || attribute.type == 'multiselect'\n                            || attribute.type == 'checkbox'\n                            || attribute.type == 'boolean'\n                            || attribute.type == 'lookup'\n                            || attribute.type == 'datetime'\n                            || attribute.type == 'date'\n                        ) {\n                            return \"@lang('admin::app.settings.webforms.create.choose-value')\";\n                        } else if (attribute.type == 'file') {\n                            return \"@lang('admin::app.settings.webforms.create.select-file')\";\n                        } else if (attribute.type == 'image') {\n                            return \"@lang('admin::app.settings.webforms.create.select-image')\";\n                        } else {\n                            return \"@lang('admin::app.settings.webforms.create.enter-value')\";\n                        }\n                    },\n                },\n            });\n        </script>\n\n        <script type=\"module\">\n            app.component('v-color-picker', {\n                template: '#v-color-picker-template',\n\n                props: {\n                    name: {\n                        type: String,\n                        required: true,\n                    },\n\n                    value: {\n                        type: String,\n                        required: true,\n                        default: '#ffffff',\n                    },\n\n                    title: {\n                        type: String,\n                        required: true,\n                    },\n                },\n\n                data() {\n                    return {\n                        color: this.value,\n                    };\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/web-forms/edit.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.webforms.edit.title')\n    </x-slot>\n\n    <x-admin::form\n        :action=\"route('admin.settings.web_forms.update', $webForm->id)\"\n        method=\"PUT\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.webform.edit.breadcrumbs.before', ['webform' => $webForm]) !!}\n\n                    <!-- Breadcurmbs -->\n                    <x-admin::breadcrumbs\n                        name=\"settings.web_forms.edit\"\n                        :entity=\"$webForm\"\n                    />\n\n                    {!! view_render_event('admin.settings.webform.edit.breadcrumbs.after', ['webform' => $webForm]) !!}\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.settings.webforms.edit.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.webform.edit.embed_button.before', ['webform' => $webForm]) !!}\n\n                        <!-- Edit Button For Person -->\n                        <button\n                            type=\"button\"\n                            class=\"secondary-button\"\n                            @click=\"$refs.embed.openModal()\"\n                        >\n                            @lang('admin::app.settings.webforms.edit.embed')\n                        </button>\n\n                        {!! view_render_event('admin.settings.webform.edit.embed_button.after', ['webform' => $webForm]) !!}\n\n                        {!! view_render_event('admin.settings.webform.edit.preview_button.before', ['webform' => $webForm]) !!}\n\n                        <a\n                            href=\"{{ route('admin.settings.web_forms.preview', $webForm->form_id) }}\"\n                            target=\"_blank\"\n                            class=\"secondary-button\"\n                        >\n                            @lang('admin::app.settings.webforms.edit.preview')\n                        </a>\n\n                        {!! view_render_event('admin.settings.webform.edit.preview_button.after', ['webform' => $webForm]) !!}\n\n                        {!! view_render_event('admin.settings.webform.edit.save_button.before', ['webform' => $webForm]) !!}\n\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.webforms.edit.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.settings.webform.edit.save_button.after', ['webform' => $webForm]) !!}\n                    </div>\n                </div>\n            </div>\n\n            <!-- Webform View Component -->\n            <v-webform ref=\"embed\"></v-webform>\n        </div>\n    </x-admin::form>\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-webform-template\"\n        >\n            <div class=\"flex gap-2.5 max-xl:flex-wrap\">\n                {!! view_render_event('admin.settings.webform.edit.left.before', ['webform' => $webForm]) !!}\n\n                <!-- Left sub-component -->\n                <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                    <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                        <div class=\"mb-4 flex items-center justify-between gap-4\">\n                            <div class=\"flex flex-col gap-1\">\n                                <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.webforms.edit.title')\n                                </p>\n                            </div>\n                        </div>\n\n                        {!! view_render_event('admin.settings.webform.edit.form_controls.before', ['webform' => $webForm]) !!}\n\n                        <!-- Submit Success Actions -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.webforms.edit.submit-success-action')\n                            </x-admin::form.control-group.label>\n\n                            <div class=\"flex\">\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    name=\"submit_success_action\"\n                                    id=\"submit_success_action\"\n                                    value=\"message\"\n                                    class=\"!w-1/4 rounded-r-none\"\n                                    :label=\"trans('admin::app.settings.webforms.edit.submit-success-action')\"\n                                    v-model=\"submitSuccessAction.value\"\n                                >\n                                    <template\n                                        v-for=\"(option, index) in submitSuccessAction.options\"\n                                        :key=\"index\"\n                                    >\n                                        <option\n                                            :value=\"option.value\"\n                                            :text=\"option.label\"\n                                        ></option>\n                                    </template>\n                                </x-admin::form.control-group.control>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"submit_success_content\"\n                                    id=\"submit_success_content\"\n                                    :value=\"old('submit_success_content') ?? $webForm->submit_success_content\"\n                                    class=\"rounded-l-none\"\n                                    rules=\"required\"\n                                    label=\"Submit Success Content\"\n                                    ::placeholder=\"placeholder\"\n                                />\n                            </div>\n\n                            <x-admin::form.control-group.error control-name=\"submit_success_content\"/>\n                        </x-admin::form.control-group>\n\n                        <!-- Create Leads -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label\n                                class=\"required\"\n                                for=\"create_lead\"\n                            >\n                                @lang('admin::app.settings.webforms.edit.create-lead')\n                            </x-admin::form.control-group.label>\n\n                            <input\n                                type=\"hidden\"\n                                name=\"create_lead\"\n                                :value=\"0\"\n                            />\n\n                            <x-admin::form.control-group.control\n                                type=\"switch\"\n                                name=\"create_lead\"\n                                value=\"1\"\n                                :label=\"trans('admin::app.settings.webforms.edit.create-lead')\"\n                                :checked=\"(bool) $webForm->create_lead\"\n                            />\n\n                        </x-admin::form.control-group>\n\n                        <!-- Customize webform -->\n                        <div class=\"mb-4 flex items-center justify-between gap-4\">\n                            <div class=\"flex flex-col gap-1\">\n                                <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.webforms.edit.customize-webform')\n                                </p>\n\n                                <p class=\"text-sm text-gray-600 dark:text-white\">\n                                    @lang('admin::app.settings.webforms.edit.customize-webform-info')\n                                </p>\n                            </div>\n                        </div>\n\n                        <!-- Background Color Picker -->\n                        <v-color-picker\n                            name=\"background_color\"\n                            title=\"@lang('admin::app.settings.webforms.edit.background-color')\"\n                            value=\"{{ old('background_color') ?? $webForm->background_color }}\"\n                            class=\"w-1/5\"\n                        >\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"\">\n                                    @lang('admin::app.settings.webforms.edit.background-color')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"background_color\"\n                                    id=\"background_color\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"background_color\"/>\n                            </x-admin::form.control-group>\n                        </v-color-picker>\n\n                        <!-- Backgroud Color Picker -->\n                        <v-color-picker\n                            name=\"form_background_color\"\n                            title=\"@lang('admin::app.settings.webforms.edit.form-background-color')\"\n                            value=\"{{ old('form_background_color') ?? $webForm->form_background_color }}\"\n                            class=\"w-1/5\"\n                        >\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"\">\n                                    @lang('admin::app.settings.webforms.edit.form-background-color')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"form_background_color\"\n                                    id=\"form_background_color\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"form_background_color\"/>\n                            </x-admin::form.control-group>\n                        </v-color-picker>\n\n                        <!-- Backgroud Color Picker -->\n                        <v-color-picker\n                            name=\"form_title_color\"\n                            title=\"@lang('admin::app.settings.webforms.edit.form-title-color')\"\n                            value=\"{{ old('form_title_color') ?? $webForm->form_title_color }}\"\n                            class=\"w-1/5\"\n                        >\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"\">\n                                    @lang('admin::app.settings.webforms.edit.form-title-color')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"form_title_color\"\n                                    id=\"form_title_color\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"form_title_color\"/>\n                            </x-admin::form.control-group>\n                        </v-color-picker>\n\n                        <!-- Form Submit Button Picker -->\n                        <v-color-picker\n                            name=\"form_submit_button_color\"\n                            title=\"@lang('admin::app.settings.webforms.edit.form-submit-button-color')\"\n                            value=\"{{ old('form_submit_button_color') ?? $webForm->form_submit_button_color }}\"\n                            class=\"w-1/5\"\n                        >\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"\">\n                                    @lang('admin::app.settings.webforms.edit.form-submit-button-color')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"form_submit_button_color\"\n                                    id=\"form_submit_button_color\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"form_submit_button_color\"/>\n                            </x-admin::form.control-group>\n                        </v-color-picker>\n\n                        <!-- Attribute Label Color Picker -->\n                        <v-color-picker\n                            name=\"attribute_label_color\"\n                            title=\"@lang('admin::app.settings.webforms.edit.attribute-label-color')\"\n                            value=\"{{ old('attribute_label_color') ?? $webForm->attribute_label_color }}\"\n                            class=\"w-1/5\"\n                        >\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"\">\n                                    @lang('admin::app.settings.webforms.edit.attribute-label-color')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"attribute_label_color\"\n                                    id=\"attribute_label_color\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"attribute_label_color\"/>\n                            </x-admin::form.control-group>\n                        </v-color-picker>\n\n                         <!-- Attributes -->\n                        <div class=\"mb-4 flex items-center justify-between gap-4\">\n                            <div class=\"flex flex-col gap-1\">\n                                <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.webforms.edit.attributes')\n                                </p>\n\n                                <p class=\"text-sm text-gray-600 dark:text-white\">\n                                    @lang('admin::app.settings.webforms.edit.attributes-info')\n                                </p>\n                            </div>\n                        </div>\n\n                        <div class=\"flex flex-col gap-4\">\n                            <x-admin::dropdown class=\"w-1/5 rounded-lg group-hover:visible dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\">\n                                <x-slot:toggle>\n                                    <button\n                                        type=\"button\"\n                                        class=\"primary-button\"\n                                    >\n                                        @lang('admin::app.settings.webforms.edit.add-attribute-btn')\n                                    </button>\n                                </x-slot>\n\n                                <x-slot:menu class=\"max-h-80 overflow-y-auto !p-0 dark:border-gray-800\">\n                                    <template v-if=\"createLead\">\n                                        <div class=\"m-2 text-lg font-bold\">\n                                            @lang('admin::app.settings.webforms.edit.leads')\n                                        </div>\n\n                                        <span\n                                            v-for=\"attribute in groupedAttributes.leads\"\n                                            class=\"whitespace-no-wrap flex cursor-pointer items-center justify-between gap-1.5 rounded-t px-2 py-2 text-sm text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950\"\n                                            @click=\"addAttribute(attribute)\"\n                                        >\n                                            <div class=\"items flex items-center gap-1.5\">\n                                                @{{ attribute.name }}\n                                            </div>\n                                        </span>\n                                    </template>\n\n                                    <template v-else>\n                                        <div class=\"m-2 text-lg font-bold\">\n                                            @lang('admin::app.settings.webforms.edit.person')\n                                        </div>\n\n                                        <span\n                                            v-for=\"attribute in groupedAttributes.persons\"\n                                            class=\"whitespace-no-wrap flex cursor-pointer items-center justify-between gap-1.5 rounded-t px-2 py-2 text-sm text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950\"\n                                            @click=\"addAttribute(attribute)\"\n                                        >\n                                            <div class=\"items flex items-center gap-1.5\">\n                                                @{{ attribute.name }}\n                                            </div>\n                                        </span>\n                                    </template>\n                                </x-slot>\n                            </x-admin::dropdown>\n\n                            <!-- Attributes -->\n                            <draggable\n                                tag=\"tbody\"\n                                ghost-class=\"draggable-ghost\"\n                                handle=\".icon-move\"\n                                v-bind=\"{animation: 200}\"\n                                item-key=\"id\"\n                                :list=\"addedAttributes\"\n                            >\n                                <template #item=\"{ element, index }\">\n                                    <x-admin::table.thead.tr class=\"!rounded-lg hover:bg-gray-50 dark:hover:bg-gray-950\">\n                                        <!-- Draggable Icon -->\n                                        <x-admin::table.td class=\"text-center\">\n                                            <i class=\"icon-move cursor-grab rounded-md text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"></i>\n\n                                            <input\n                                                type=\"hidden\"\n                                                :value=\"element['attribute']['id']\"\n                                                :name=\"'attributes[' + element.id + '][attribute_id]'\"\n                                            />\n                                        </x-admin::table.td>\n\n                                        <!-- Attribute Name -->\n                                        <x-admin::table.td>\n                                            <x-admin::form.control-group>\n                                                <x-admin::form.control-group.label class=\"\">\n                                                    @{{ element?.name + ' (' + element?.attribute?.entity_type + ')' }}\n                                                </x-admin::form.control-group.label>\n\n                                                <x-admin::form.control-group.control\n                                                    type=\"text\"\n                                                    ::name=\"'attributes[' + element.id + '][name]'\"\n                                                    v-model=\"element.name\"\n                                                />\n\n                                                <x-admin::form.control-group.error ::name=\"'attributes[' + element.id + '][name]'\"/>\n                                            </x-admin::form.control-group>\n                                        </x-admin::table.td>\n\n                                        <!-- Placeholder -->\n                                        <x-admin::table.td>\n                                            <x-admin::form.control-group class=\"!mt-6\">\n                                                <x-admin::form.control-group.control\n                                                    type=\"text\"\n                                                    ::name=\"'attributes[' + element.id + '][placeholder]'\"\n                                                    ::rules=\"element.attribute.validation\"\n                                                    ::label=\"element?.name + ' (' + element?.attribute?.entity_type + ')'\"\n                                                    ::placeholder=\"getPlaceholderValue(element)\"\n                                                    v-model=\"element.placeholder\"\n                                                />\n\n                                                <x-admin::form.control-group.error ::name=\"'attributes[' + element.id + '][placeholder]'\"/>\n                                            </x-admin::form.control-group>\n                                        </x-admin::table.td>\n\n                                        <!-- Required Or Not -->\n                                        <x-admin::table.td>\n                                            <x-admin::form.control-group class=\"!mt-6\">\n                                                <label :for=\"'attributes[' + element.id + '][is_required]'\">\n                                                    <!--\n                                                        When the checkbox is disabled for name and email, we will set a hidden value\n                                                        because the form will not send the value of disabled input fields.\n                                                    -->\n                                                    <input\n                                                        type=\"hidden\"\n                                                        :name=\"'attributes[' + element.id + '][is_required]'\"\n                                                        :value=\"1\"\n                                                        v-if=\"['name', 'emails'].includes(element['attribute']['code'])\"\n                                                    >\n\n                                                    <!--\n                                                        Only the name and email fields are required, so we will disable the checkbox and\n                                                        force the user to provide them.\n                                                    -->\n                                                    <input\n                                                        type=\"checkbox\"\n                                                        :name=\"'attributes[' + element.id + '][is_required]'\"\n                                                        :id=\"'attributes[' + element.id + '][is_required]'\"\n                                                        :value=\"1\"\n                                                        class=\"peer hidden\"\n                                                        :checked=\"element.is_required\"\n                                                        :disabled=\"['name', 'emails'].includes(element['attribute']['code'])\"\n                                                    >\n\n                                                    <!--\n                                                        We will display a disabled checkbox for the name and email fields.\n                                                    -->\n                                                    <span\n                                                        class='icon-checkbox-outline peer-checked:icon-checkbox-select cursor-pointer rounded-md text-2xl peer-checked:text-brandColor'\n                                                        :class=\"{'opacity-50' : ['name', 'emails'].includes(element['attribute']['code'])}\"\n                                                    ></span>\n                                                </label>\n                                            </x-admin::form.control-group>\n                                        </x-admin::table.td>\n\n                                        <!-- Actions -->\n                                        <x-admin::table.td>\n                                            <x-admin::form.control-group class=\"!mt-6\">\n                                                <i\n                                                    class=\"icon-delete cursor-pointer text-2xl\"\n                                                    v-if=\"! ['name', 'emails'].includes(element['attribute']['code'])\"\n                                                    @click=\"removeAttribute(element)\"\n                                                ></i>\n                                            </x-admin::form.control-group>\n                                        </x-admin::table.td>\n                                    </x-admin::table.thead.tr>\n                                </template>\n                            </draggable>\n                        </div>\n\n                        {!! view_render_event('admin.settings.webform.edit.form_controls.before', ['webform' => $webForm]) !!}\n                    </div>\n                </div>\n\n                {!! view_render_event('admin.settings.webform.edit.left.after', ['webform' => $webForm]) !!}\n\n                {!! view_render_event('admin.settings.webform.edit.right.before', ['webform' => $webForm]) !!}\n\n                <!-- Right Sub Component -->\n                <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                    <x-admin::accordion>\n                        <x-slot:header>\n                            <div class=\"flex items-center justify-between\">\n                                <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.webforms.edit.general')\n                                </p>\n                            </div>\n                        </x-slot>\n\n                        <x-slot:content>\n                            <!-- Title -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.webforms.edit.title')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"title\"\n                                    name=\"title\"\n                                    rules=\"required\"\n                                    :value=\"old('title') ?? $webForm->title\"\n                                    :label=\"trans('admin::app.settings.webforms.edit.title')\"\n                                    :placeholder=\"trans('admin::app.settings.webforms.edit.title')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"title\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Description -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"\">\n                                    @lang('admin::app.settings.webforms.edit.description')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"textarea\"\n                                    id=\"description\"\n                                    name=\"description\"\n                                    :value=\"old('description') ?? $webForm->description\"\n                                    :label=\"trans('admin::app.settings.webforms.edit.description')\"\n                                    :placeholder=\"trans('admin::app.settings.webforms.edit.description')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"description\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Submit Button Label -->\n                            <x-admin::form.control-group class=\"!mb-0\">\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.webforms.edit.submit-button-label')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"submit_button_label\"\n                                    name=\"submit_button_label\"\n                                    :value=\"old('submit_button_label') ?? $webForm->submit_button_label\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.webforms.edit.submit-button-label')\"\n                                    :placeholder=\"trans('admin::app.settings.webforms.edit.submit-button-label')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"submit_button_label\" />\n                            </x-admin::form.control-group>\n                        </x-slot>\n                    </x-admin::accordion>\n                </div>\n\n                {!! view_render_event('admin.settings.webform.edit.right.after', ['webform' => $webForm]) !!}\n\n                <x-admin::modal ref=\"embed\">\n                    <!-- Modal Header -->\n                    <x-slot:header>\n                        <p class=\"text-lg font-bold text-gray-800 dark:text-white\">\n                            @lang('admin::app.settings.webforms.edit.preview')\n                        </p>\n                    </x-slot>\n\n                    <!-- Modal Content -->\n                    <x-slot:content class=\"!border-b-0\">\n                        {!! view_render_event('admin.settings.webform.edit.modal.form_controls.before', ['webform' => $webForm]) !!}\n\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.webforms.edit.public-url')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"text\"\n                                id=\"publicUrl\"\n                                name=\"publicUrl\"\n                                rules=\"required\"\n                                :value=\"route('admin.settings.web_forms.preview', $webForm->form_id)\"\n                                :label=\"trans('admin::app.settings.webforms.edit.public-url')\"\n                                :placeholder=\"trans('admin::app.settings.webforms.edit.public-url')\"\n                            />\n\n                            <span\n                                id=\"publicUrlBtn\"\n                                class=\"cursor-pointer text-xs font-normal text-brandColor hover:text-sky-600 hover:underline\"\n                                @click=\"copyToClipboard('#publicUrl','#publicUrlBtn')\"\n                            >\n                                @lang('admin::app.settings.webforms.edit.copy')\n                            </span>\n                        </x-admin::form.control-group>\n\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.settings.webforms.edit.code-snippet')\n                            </x-admin::form.control-group.label>\n\n                            <input\n                                type=\"text\"\n                                id=\"codeSnippet\"\n                                name=\"codeSnippet\"\n                                class=\"w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                value=\"{{ '<script src=\"'.route('admin.settings.web_forms.form_js', $webForm->form_id).'\"></script>' }}\"\n                            />\n\n                            <span\n                                id=\"coeSnippt\"\n                                class=\"cursor-pointer text-xs font-normal text-brandColor hover:text-sky-600 hover:underline\"\n                                @click=\"copyToClipboard('#codeSnippet','#coeSnippt')\"\n                            >\n                                @lang('admin::app.settings.webforms.edit.copy')\n                            </span>\n                        </x-admin::form.control-group>\n\n                        {!! view_render_event('admin.settings.webform.edit.modal.form_controls.after', ['webform' => $webForm]) !!}\n                    </x-slot>\n                </x-admin::modal>\n            </div>\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-color-picker-template\"\n        >\n            <x-admin::form.control-group>\n                <x-admin::form.control-group.label class=\"required\">\n                    @{{ title }}\n                </x-admin::form.control-group.label>\n\n                <div class=\"flex\">\n                    <x-admin::form.control-group.control\n                        type=\"text\"\n                        ::name=\"name\"\n                        ::id=\"name\"\n                        class=\"rounded-r-none\"\n                        rules=\"required\"\n                        ::label=\"title\"\n                        v-model=\"color\"\n                    />\n\n                    <x-admin::form.control-group.control\n                        type=\"color\"\n                        class=\"!h-10 !w-12 rounded-l-none p-1 dark:border-gray-800 dark:bg-gray-900\"\n                        name=\"color\"\n                        :label=\"trans('Submit Success Action')\"\n                        ::value=\"color\"\n                        @input=\"color = $event.target.value\"\n                    />\n                </div>\n\n                <x-admin::form.control-group.error ::name=\"name\"/>\n            </x-admin::form.control-group>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-webform', {\n                template: '#v-webform-template',\n\n                data() {\n                    return {\n                        submitSuccessAction: {\n                            value: \"{{ old('submit_success_action') ?? $webForm->submit_success_action }}\",\n\n                            options: [\n                                { value: 'message', label: '@lang('admin::app.settings.webforms.edit.display-custom-message')' },\n                                { value: 'redirect', label: '@lang('admin::app.settings.webforms.edit.redirect-to-url')' },\n                            ],\n                        },\n\n                        createLead: {{ (old('create_lead') ?? $webForm->create_lead) ?? false }},\n\n                        attributes: @json($attributes),\n\n                        addedAttributes: @json($webForm->attributes()->with('attribute')->get()),\n\n                        attributeCount: 0,\n                    }\n                },\n\n                watch: {\n                    /**\n                     * Watch for the createLead value and remove the added attributes if the value is true.\n                     *\n                     * @param {Boolean} newValue\n                     * @param {Boolean} oldValue\n                     *\n                     * @return {void}\n                     */\n                    createLead(newValue, oldValue) {\n                        if (newValue) {\n                            return;\n                        }\n\n                        this.addedAttributes = this.addedAttributes.filter(attribute => attribute.attribute.entity_type != 'leads');\n                    },\n                },\n\n                computed:{\n                    /**\n                     * Get the placeholder value based on the submit success action value.\n                     *\n                     * @return {String}\n                     */\n                    placeholder() {\n                        return this.submitSuccessAction.value === 'message' ? '@lang('Enter message to display')' : '@lang('Enter url to redirect')';\n                    },\n\n                    /**\n                     * Get the grouped attributes based on the entity type.\n                     *\n                     * @return {Object}\n                     */\n                    groupedAttributes() {\n                        return this.attributes.reduce((r, a) => {\n                            r[a.entity_type] = [...r[a.entity_type] || [], a];\n                            return r;\n                        }, {});\n                    },\n                },\n\n                methods: {\n                    /**\n                     * Copy the value to the clipboard.\n                     *\n                     * @param {String} ref\n                     * @param {String} btn\n                     *\n                     * @return {void}\n                     */\n                    copyToClipboard(ref, btn) {\n                        const element = document.querySelector(ref);\n\n                        const btnElement = document.querySelector(btn);\n\n                        element.select();\n\n                        document.execCommand('copy');\n\n                        btnElement.textContent = \"@lang('admin::app.settings.webforms.edit.copied')!\";\n\n                        setTimeout(() => btnElement.textContent = \"Copy\", 1000);\n                    },\n\n                    /**\n                     * Open the modal based on the type.\n                     *\n                     * @param {String} type\n                     *\n                     * @return {void}\n                     */\n                    openModal() {\n                        this.$refs.embed.toggle();\n                    },\n\n                    /**\n                     * Add the attribute to the added attributes list.\n                     *\n                     * @param {Object} attribute\n                     *\n                     * @return {void}\n                     */\n                    addAttribute(attribute) {\n                        this.addedAttributes.push({\n                            id: 'attribute_' + this.attributeCount++,\n                            name: attribute.name,\n                            is_required: attribute.is_required,\n                            attribute: attribute,\n                        });\n\n                        const index = this.attributes.indexOf(attribute);\n\n                        if (index > -1) {\n                            this.attributes.splice(index, 1);\n                        }\n                    },\n\n                    /**\n                     * Remove the attribute from the added attributes list.\n                     *\n                     * @param {Object} attribute\n                     *\n                     * @return {void}\n                     */\n                    removeAttribute(attribute) {\n                        this.attributes.push(attribute.attribute);\n\n                        const index = this.addedAttributes.indexOf(attribute);\n\n                        if (index > -1) {\n                            this.addedAttributes.splice(index, 1);\n                        }\n                    },\n\n                    /**\n                     * Get the placeholder value based on the attribute type.\n                     *\n                     * @param {Object} attribute\n                     *\n                     * @return {String}\n                     */\n                    getPlaceholderValue(attribute) {\n                        if (attribute.type == 'select'\n                            || attribute.type == 'multiselect'\n                            || attribute.type == 'checkbox'\n                            || attribute.type == 'boolean'\n                            || attribute.type == 'lookup'\n                            || attribute.type == 'datetime'\n                            || attribute.type == 'date'\n                        ) {\n                            return \"@lang('admin::app.settings.webforms.edit.choose-value')\";\n                        } else if (attribute.type == 'file') {\n                            return \"@lang('admin::app.settings.webforms.edit.select-file')\";\n                        } else if (attribute.type == 'image') {\n                            return \"@lang('admin::app.settings.webforms.edit.select-image')\";\n                        } else {\n                            return \"@lang('admin::app.settings.webforms.edit.enter-value')\";\n                        }\n                    },\n                },\n            });\n        </script>\n\n        <script type=\"module\">\n            app.component('v-color-picker', {\n                template: '#v-color-picker-template',\n\n                props: {\n                    name: {\n                        type: String,\n                        required: true,\n                    },\n\n                    value: {\n                        type: String,\n                        required: true,\n                        default: '#ffffff',\n                    },\n\n                    title: {\n                        type: String,\n                        required: true,\n                    },\n                },\n\n                data() {\n                    return {\n                        color: this.value,\n                    };\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/web-forms/index.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.settings.webforms.index.title')\n    </x-slot>\n\n    <v-webform>\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    <!-- Bredcrumbs -->\n                    <x-admin::breadcrumbs name=\"settings.web_forms\" />\n        \n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.settings.webforms.index.title')\n                    </div>\n                </div>\n        \n                <div class=\"flex items-center gap-x-2.5\">\n                    <!-- Create button for person -->\n                    <div class=\"flex items-center gap-x-2.5\">\n                        @if (bouncer()->hasPermission('admin.settings.web_forms.create'))\n                            <button\n                                type=\"button\"\n                                class=\"primary-button\"\n                            >\n                                @lang('admin::app.settings.webforms.index.create-btn')\n                            </button>\n                        @endif\n                    </div>\n                </div>\n            </div>\n        \n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.settings.web-forms />\n        </div>\n    </v-webform>\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-webform-template\"\n        >\n            <div class=\"flex flex-col gap-4\">\n                <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                    <div class=\"flex flex-col gap-2\">\n                        <!-- Bredcrumbs -->\n                        <x-admin::breadcrumbs name=\"settings.web_forms\" />\n            \n                        <div class=\"text-xl font-bold dark:text-white\">\n                            @lang('admin::app.settings.webforms.index.title')\n                        </div>\n                    </div>\n\n                    <div class=\"flex items-center gap-x-2.5\">\n                        <!-- Create button for person -->\n                        <div class=\"flex items-center gap-x-2.5\">\n                            {!! view_render_event('admin.settings.web_forms.index.create_button.before') !!}\n            \n                            @if (bouncer()->hasPermission('admin.settings.web_forms.create'))\n                                <a\n                                    href=\"{{ route('admin.settings.web_forms.create') }}\"\n                                    class=\"primary-button\"\n                                >\n                                    @lang('admin::app.settings.webforms.index.create-btn')\n                                </a>\n                            @endif\n\n                            {!! view_render_event('admin.settings.web_forms.index.create_button.after') !!}\n                        </div>\n                    </div>\n                </div>\n            \n                {!! view_render_event('admin.settings.web_forms.index.datagrid.before') !!}\n\n                <!-- Datagrid -->\n                <x-admin::datagrid\n                    :src=\"route('admin.settings.web_forms.index')\"\n                    ref=\"datagrid\"\n                >\n                    <template #header=\"{\n                        isLoading,\n                        available,\n                        applied,\n                        selectAll,\n                        sort,\n                        performAction\n                    }\">\n                        <template v-if=\"isLoading\">\n                            <x-admin::shimmer.settings.web-forms.head />\n                        </template>\n                    </template>\n\n                    <template #body=\"{\n                        isLoading,\n                        available,\n                        applied,\n                        selectAll,\n                        sort,\n                        performAction\n                    }\">\n                        <template v-if=\"isLoading\">\n                            <x-admin::shimmer.settings.web-forms.body />\n                        </template>\n                    </template>\n                </x-admin::datagrid>\n\n                {!! view_render_event('admin.settings.web_forms.index.datagrid.after') !!}\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-webform', {\n                template: '#v-webform-template',\n                data() {\n                    return {};\n                },\n            });\n        </script>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/webhook/create.blade.php",
    "content": "@php($placeholders = app('\\Webkul\\Automation\\Helpers\\Entity')->getEmailTemplatePlaceholders())\n\n<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.webhooks.create.title')\n    </x-slot>\n\n    {!! view_render_event('admin.settings.webhook.edit.form.before') !!}\n\n    <x-admin::form :action=\"route('admin.settings.webhooks.store')\">\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.webhook.edit.breadrumbs.before') !!}\n\n                    <!-- Breadcrumbs -->\n                    <x-admin::breadcrumbs name=\"settings.webhooks.create\" />\n\n                    {!! view_render_event('admin.settings.webhook.edit.breadrumbs.after') !!}\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.settings.webhooks.create.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.webhook.edit.save_button.before') !!}\n\n                        <!-- Create button for person -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.webhooks.create.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.settings.webhook.edit.save_button.after') !!}\n                    </div>\n                </div>\n            </div>\n\n            <v-webhooks :errors=\"errors\"></v-webhooks>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.settings.webhook.edit.form.after') !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-webhooks-template\"\n        >\n            <div class=\"flex gap-2.5 max-xl:flex-wrap\">\n                {!! view_render_event('admin.settings.webhook.edit.left.before') !!}\n\n                <!-- Left sub-component -->\n                <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                    <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                        <div class=\"mb-4 flex items-center justify-between gap-4\">\n                            <div class=\"flex flex-col gap-1\">\n                                <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.webhooks.create.title')\n                                </p>\n\n                                <p class=\"text-sm text-gray-600 dark:text-white\">\n                                    @lang('admin::app.settings.webhooks.create.info')\n                                </p>\n                            </div>\n                        </div>\n\n                        <!-- Basic Details -->\n                        <div class=\"flex flex-col gap-4\">\n                            <div>\n                                <!-- Method and URL endpoint -->\n                                <x-admin::form.control-group>\n                                    <x-admin::form.control-group.label class=\"required\">\n                                        @lang('admin::app.settings.webhooks.create.url-and-parameters')\n                                    </x-admin::form.control-group.label>\n\n                                    <div class=\"flex\">\n                                        <x-admin::form.control-group.control\n                                            type=\"select\"\n                                            name=\"method\"\n                                            id=\"method\"\n                                            value=\"post\"\n                                            class=\"!w-1/6 rounded-r-none\"\n                                            :label=\"trans('admin::app.settings.webhooks.create.method')\"\n                                        >\n                                            <option value=\"post\">@lang('admin::app.settings.webhooks.create.post')</option>\n\n                                            <option value=\"put\">@lang('admin::app.settings.webhooks.create.put')</option>\n                                        </x-admin::form.control-group.control>\n\n                                        <x-admin::form.control-group.control\n                                            type=\"text\"\n                                            name=\"end_point\"\n                                            id=\"end_point\"\n                                            class=\"rounded-l-none\"\n                                            :value=\"old('end_point')\"\n                                            rules=\"required|url\"\n                                            :label=\"trans('admin::app.settings.webhooks.create.url-endpoint')\"\n                                            :placeholder=\"trans('admin::app.settings.webhooks.create.url-endpoint')\"\n                                            v-debounce=\"500\"\n                                            v-model.lazy=\"baseUrl\"\n                                        />\n                                    </div>\n                                    <x-admin::form.control-group.error control-name=\"end_point\"/>\n                                </x-admin::form.control-group>\n\n                                <!-- Parameters -->\n                                <v-key-and-value\n                                    title=\"@lang('admin::app.settings.webhooks.create.parameters')\"\n                                    name=\"query_params\"\n                                    :add-btn-title=\"'@lang('admin::app.settings.webhooks.create.add-new-parameter')'\"\n                                    :fields=\"parameters\"\n                                    :placeholders=\"placeholders\"\n                                ></v-key-and-value>\n\n                                <!-- URL Preview -->\n                                <div class=\"flex w-full items-center justify-between rounded-sm border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                                    <div class=\"my-2 flex gap-3\">\n                                        <div class=\"font-sm text-xs dark:text-gray-300\">\n                                            @lang('admin::app.settings.webhooks.create.url-preview')\n\n                                            <span class=\"text-sm font-medium text-gray-800 dark:text-gray-300\">@{{ urlEndPoint() }}</span>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n\n                            <!-- Headers -->\n                            <div class=\"border-y border-gray-200 dark:border-gray-800\">\n                                <v-key-and-value\n                                    title=\"@lang('admin::app.settings.webhooks.create.headers')\"\n                                    name=\"headers\"\n                                    :add-btn-title=\"'@lang('admin::app.settings.webhooks.create.add-new-header')'\"\n                                    :fields=\"headers\"\n                                    :placeholders=\"placeholders\"\n                                ></v-key-and-value>\n                            </div>\n\n                            <!-- Content -->\n                            <x-admin::form.control-group class=\"!mb-0\">\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.webhooks.create.body')\n                                </x-admin::form.control-group.label>\n\n                                <div class=\"mb-4 flex items-center gap-2\">\n                                    <div class=\"flex cursor-pointer items-center justify-center\">\n                                        <input\n                                            id=\"default\"\n                                            type=\"radio\"\n                                            v-model=\"contentType\"\n                                            value=\"default\"\n                                            name=\"payload_type\"\n                                            class=\"h-4 w-4 cursor-pointer border-gray-300 bg-gray-100 text-blue-600 dark:border-gray-600 dark:bg-gray-700 dark:ring-offset-gray-800\"\n                                        >\n                                        <label\n                                            for=\"default\"\n                                            class=\"ms-2 cursor-pointer text-xs font-normal text-gray-900 dark:text-gray-300\"\n                                        >\n                                            @lang('admin::app.settings.webhooks.create.default')\n                                        </label>\n                                    </div>\n\n                                    <div class=\"flex cursor-pointer items-center justify-center\">\n                                        <input\n                                            id=\"x-www-form-urlencoded\"\n                                            type=\"radio\"\n                                            v-model=\"contentType\"\n                                            value=\"x-www-form-urlencoded\"\n                                            name=\"payload_type\"\n                                            class=\"h-4 w-4 cursor-pointer border-gray-300 bg-gray-100 text-blue-600 dark:border-gray-600 dark:bg-gray-700 dark:ring-offset-gray-800\"\n                                        >\n                                        <label\n                                            for=\"x-www-form-urlencoded\"\n                                            class=\"ms-2 cursor-pointer text-xs font-normal text-gray-900 dark:text-gray-300\"\n                                        >\n                                            @lang('admin::app.settings.webhooks.create.x-www-form-urlencoded')\n                                        </label>\n                                    </div>\n\n                                    <div class=\"flex items-center justify-center gap-5\">\n                                        <div class=\"flex cursor-pointer items-center justify-center\">\n                                            <input\n                                                id=\"raw\"\n                                                type=\"radio\"\n                                                v-model=\"contentType\"\n                                                value=\"raw\"\n                                                name=\"payload_type\"\n                                                class=\"h-4 w-4 cursor-pointer border-gray-300 bg-gray-100 text-blue-600 dark:border-gray-600 dark:bg-gray-700 dark:ring-offset-gray-800\"\n                                                @click=\"contentType = 'raw'\"\n                                            >\n\n                                            <label\n                                                for=\"raw\"\n                                                class=\"ms-2 cursor-pointer text-xs font-normal text-gray-900 dark:text-gray-300\"\n                                                @click=\"contentType = 'raw'\"\n                                            >\n                                                @lang('admin::app.settings.webhooks.create.raw')\n                                            </label>\n                                        </div>\n\n                                        <template v-if=\"contentType == 'raw'\">\n                                            <x-admin::dropdown class=\"rounded-lg dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\">\n                                                <x-slot:toggle>\n                                                    <div class=\"flex items-center justify-center\">\n                                                        <span class=\"cursor-pointer text-xs font-normal text-brandColor dark:text-gray-300\">@{{ rawType }}</span>\n\n                                                        <i class=\"icon-down-arrow -mt-px text-xs text-brandColor\"></i>\n                                                    </div>\n                                                </x-slot>\n\n                                                <x-slot:menu class=\"!p-0 dark:border-gray-800\">\n                                                    <input\n                                                        type=\"hidden\"\n                                                        name=\"raw_payload_type\"\n                                                        v-model=\"rawType\"\n                                                    >\n\n                                                    <span\n                                                        class=\"whitespace-no-wrap flex cursor-pointer items-center justify-between gap-1.5 rounded-t px-2 py-2 text-sm text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950\"\n                                                        @click=\"rawType = 'json'\"\n                                                    >\n                                                        <div class=\"items flex items-center gap-1.5\">\n                                                            @lang('admin::app.settings.webhooks.create.json')\n                                                        </div>\n                                                    </span>\n\n                                                    <span\n                                                        class=\"whitespace-no-wrap flex cursor-pointer items-center justify-between gap-1.5 rounded-t px-2 py-2 text-sm text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950\"\n                                                        @click=\"rawType = 'text'\"\n                                                    >\n                                                        <div class=\"items flex items-center gap-1.5\">\n                                                            @lang('admin::app.settings.webhooks.create.text')\n                                                        </div>\n                                                    </span>\n                                                </x-slot>\n                                            </x-admin::dropdown>\n                                        </template>\n                                    </div>\n                                </div>\n\n                                <template v-if=\"showEditor\">\n                                    <textarea\n                                        ref=\"payload\"\n                                        id=\"payload\"\n                                        name=\"payload\"\n                                    >@{{ payload }}</textarea>\n                                </template>\n\n                                <template v-else>\n                                    <v-key-and-value\n                                        title=\"@lang('admin::app.settings.webhooks.create.key-and-value')\"\n                                        name=\"payload\"\n                                        :add-btn-title=\"'@lang('admin::app.settings.webhooks.create.add-new-payload')'\"\n                                        :fields=\"tempPayload\"\n                                        :placeholders=\"placeholders\"\n                                    ></v-key-and-value>\n                                </template>\n\n                                <x-admin::form.control-group.error control-name=\"payload\" />\n                            </x-admin::form.control-group>\n                        </div>\n                    </div>\n                </div>\n\n                {!! view_render_event('admin.settings.webhook.edit.left.after') !!}\n\n                {!! view_render_event('admin.settings.webhook.edit.right.before') !!}\n\n                <!-- Right sub-component -->\n                <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                    <x-admin::accordion>\n                        <x-slot:header>\n                            <div class=\"flex items-center justify-between\">\n                                <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.webhooks.create.general')\n                                </p>\n                            </div>\n                        </x-slot>\n\n                        <x-slot:content>\n                            <!-- Name -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.webhooks.create.name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"name\"\n                                    name=\"name\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.webhooks.create.name')\"\n                                    :placeholder=\"trans('admin::app.settings.webhooks.create.name')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Entity Type -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.webhooks.create.entity-type')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    id=\"entity_type\"\n                                    name=\"entity_type\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.webhooks.create.entity-type')\"\n                                    :placeholder=\"trans('admin::app.settings.webhooks.create.entity-type')\"\n                                >\n                                    @foreach (app('\\Webkul\\Automation\\Helpers\\Entity')->getEvents() as $item)\n                                        <option value=\"{{ $item['id'] }}\">\n                                            {{ $item['name'] }}\n                                        </option>\n                                    @endforeach\n                                </x-admin::form.control-group.control>\n\n                                <x-admin::form.control-group.error control-name=\"entity_type\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Description -->\n                            <x-admin::form.control-group class=\"!mb-0\">\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.webhooks.create.description')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"textarea\"\n                                    id=\"description\"\n                                    name=\"description\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.webhooks.create.description')\"\n                                    :placeholder=\"trans('admin::app.settings.webhooks.create.description')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"description\" />\n                            </x-admin::form.control-group>\n                        </x-slot>\n                    </x-admin::accordion>\n                </div>\n\n                {!! view_render_event('admin.settings.webhook.edit.right.after') !!}\n            </div>\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-key-and-value-template\"\n        >\n            <x-admin::form.control-group class=\"my-2\">\n                <x-admin::form.control-group.label class=\"required\">\n                    @{{ title }}\n                </x-admin::form.control-group.label>\n\n                <div class=\"flex flex-col\">\n                    <div\n                        class=\"group my-2 flex items-center justify-between gap-3\"\n                        v-for=\"(field, index) in fields\"\n                        :key=\"index\"\n                    >\n                        <div class=\"w-1/2\">\n                            <x-admin::form.control-group.control\n                                type=\"text\"\n                                ::id=\"`${name}[${index}][key]`\"\n                                ::name=\"`${name}[${index}][key]`\"\n                                v-model=\"field.key\"\n                                rules=\"required\"\n                                :label=\"trans('Key')\"\n                                :placeholder=\"trans('Key')\"\n                            />\n                            <x-admin::form.control-group.error ::name=\"`${name}[${index}][key]`\" />\n                        </div>\n\n                        <div class=\"w-full\">\n                            <x-admin::form.control-group.control\n                                type=\"text\"\n                                ::id=\"`${name}[${index}][value]`\"\n                                ::name=\"`${name}[${index}][value]`\"\n                                v-model=\"field.value\"\n                                rules=\"required\"\n                                :label=\"trans('Value')\"\n                                :placeholder=\"trans('Value')\"\n                            />\n                            <x-admin::form.control-group.error ::name=\"`${name}[${index}][value]`\" />\n                        </div>\n\n                        <i\n                            class=\"icon-delete ml-1 cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                            @click=\"remove(index)\"\n                            v-if=\"fields.length > 1\"\n                        ></i>\n\n                        <div class=\"w-1/5\">\n                            <x-admin::dropdown class=\"rounded-lg group-hover:visible dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\">\n                                <x-slot:toggle>\n                                    <span\n                                        class=\"invisible cursor-pointer py-2 text-xs text-brandColor hover:text-brandColor hover:underline group-hover:visible\"\n                                    >\n                                        @lang('admin::app.settings.webhooks.create.insert-placeholder')\n                                    </span>\n                                </x-slot>\n\n                                <x-slot:menu class=\"max-h-80 overflow-y-auto !p-0 dark:border-gray-800\">\n                                    <div\n                                        v-for=\"entity in placeholders\"\n                                        :key=\"entity.text\"\n                                        class=\"mb-4\"\n                                    >\n                                        <div class=\"m-2 text-lg font-bold\">@{{ entity.text }}</div>\n\n                                        <span\n                                            v-for=\"placeholder in entity.menu\"\n                                            :key=\"placeholder.value\"\n                                            class=\"whitespace-no-wrap flex cursor-pointer items-center justify-between gap-1.5 rounded-t px-2 py-2 text-sm text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950\"\n                                            @click=\"insertPlaceholder(index, placeholder.value)\"\n                                        >\n                                            <div class=\"items flex items-center gap-1.5\">\n                                                @{{ placeholder.text }}\n                                            </div>\n                                        </span>\n                                    </div>\n                                </x-slot>\n                            </x-admin::dropdown>\n                        </div>\n                    </div>\n\n                    <div class=\"inline-block\">\n                        <button\n                            type=\"button\"\n                            class=\"flex max-w-max items-center gap-2 text-brandColor\"\n                            @click=\"add(index)\"\n                        >\n                            <i class=\"icon-add text-md !text-brandColor\"></i>\n\n                            @{{ addBtnTitle }}\n                        </button>\n                    </div>\n                </div>\n            </x-admin::form.control-group>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-webhooks', {\n                template: '#v-webhooks-template',\n\n                props: ['errors'],\n\n                data() {\n                    return {\n                        baseUrl: '',\n\n                        payload: '',\n\n                        contentType: 'default',\n\n                        rawType: 'Json',\n\n                        parameters: [{ key: '', value: ''}],\n\n                        tempPayload: [{ key: '', value: ''}],\n\n                        headers: [{ key: 'Content-Type', value: 'text/plain;charset=UTF', readOnly: true }],\n\n                        placeholders: @json($placeholders),\n                    };\n                },\n\n                created() {\n                    this.initiateEditor();\n\n                    if (Array.isArray(this.payload)) {\n                        this.tempPayload = this.payload;\n                    }\n\n                    this.$emitter.on('change-theme', (theme) => this.handleEditorDisplay());\n                },\n\n                watch: {\n                    /**\n                     * Watch the raw type and update the tempPayload.\n                     *\n                     * @return {void}\n                     */\n                    rawType(newValue, oldValue) {\n                        this.handleEditorDisplay();\n                    },\n\n                    /**\n                     * Watch the content type and update the tempPayload.\n                     *\n                     * @return {void}\n                     */\n                    contentType(newValue, oldValue) {\n                        this.handleEditorDisplay();\n                    },\n\n                    baseUrl() {\n                        this.urlEndPoint();\n                    },\n                },\n\n                computed: {\n                    /**\n                     * Check if the editor should be displayed.\n                     * @returns {boolean}\n                     */\n                    showEditor() {\n                        return (\n                            this.contentType === 'default'\n                            || this.contentType === 'raw'\n                        ) && this.contentType !== 'application/x-www-form-urlencoded';\n                    },\n                },\n\n                methods: {\n                    /**\n                     * Handle editor display.\n                     *\n                     * @returns {void}\n                     */\n                    handleEditorDisplay() {\n                        if (this.codeMirrorInstance) {\n                            this.codeMirrorInstance.toTextArea();\n\n                            this.codeMirrorInstance = null;\n                        }\n\n                        if (this.showEditor) {\n                            this.initiateEditor();\n                        }\n                    },\n\n                    /**\n                     * Initiate Editor.\n                     *\n                     * @param {string} rawType\n                     * @return {void}\n                     */\n                    initiateEditor() {\n                        this.$nextTick(() => {\n                            const mode = this.rawType === 'json' ? 'application/json' : 'text/plain';\n\n                            if (! this.codeMirrorInstance && this.showEditor) {\n                                this.codeMirrorInstance = CodeMirror.fromTextArea(this.$refs.payload, {\n                                    lineNumbers: true,\n                                    mode: this.contentType === 'default' ? 'application/json' : mode,\n                                    styleActiveLine: true,\n                                    lint: true,\n                                    theme: document.documentElement.classList.contains('dark') ? 'ayu-dark' : 'eclipse',\n                                });\n\n                                this.codeMirrorInstance.on('changes', () => this.payload = this.codeMirrorInstance.getValue());\n\n                                return;\n                            }\n\n                            this.codeMirrorInstance?.setOption('mode', mode);\n                        }, 0);\n                    },\n\n                    /**\n                     * Get the URL endpoint with the parameters\n                     *\n                     * @returns {string}\n                     */\n                    urlEndPoint() {\n                        if (\n                            this.baseUrl === ''\n                            || this.errors.hasOwnProperty('end_point')\n                        ) {\n                            return this.baseUrl;\n                        }\n\n                        try {\n                            const url = new URL(this.baseUrl);\n\n                            url.search = '';\n\n                            this.parameters.forEach(param => {\n                                if (\n                                    param.key\n                                    && param.value\n                                ) {\n                                    url.searchParams.append(param.key, param.value);\n                                }\n                            });\n\n                            return decodeURI(url.toString());\n                        } catch (error) {\n                            return this.baseUrl;\n                        }\n                    },\n                },\n            });\n\n            app.component('v-key-and-value', {\n                template: '#v-key-and-value-template',\n\n                props: ['title', 'name', 'addBtnTitle', 'fields', 'placeholders'],\n\n                data() {\n                    return {\n                        selectedPlaceholder: '',\n\n                        cursorPosition: 0,\n                    };\n                },\n\n                methods: {\n                    /**\n                     * Add a new fields.\n                     *\n                     * @returns {void}\n                     */\n                    add() {\n                        this.fields.push({ key: '', value: '' });\n                    },\n\n                    /**\n                     * Remove a fields.\n                     *\n                     * @returns {void}\n                     */\n                    remove(index) {\n                        this.fields.splice(index, 1);\n                    },\n\n                    /**\n                     * Save the cursor position when the input is focused.\n                     *\n                     * @param {Event} event\n                     * @returns {void}\n                     */\n                    saveCursorPosition(event) {\n                        this.cursorPosition = event.target.selectionStart;\n                    },\n\n                    /**\n                     * Insert the selected placeholder into the subject.\n                     *\n                     * @returns {void}\n                     */\n                    insertPlaceholder(index, value) {\n                        if (this.cursorPosition >= 0) {\n                            const before = this.fields[index].value.substring(0, this.cursorPosition);\n\n                            const after = this.fields[index].value.substring(this.cursorPosition);\n\n                            this.fields[index].value = `${before}${value}${after}`;\n\n                            this.cursorPosition += value.length;\n                        } else if (value) {\n                            this.fields[index].value += value;\n                        }\n\n                        this.selectedPlaceholder = '';\n                    },\n                },\n            });\n        </script>\n\n\n        <!-- Code mirror script CDN -->\n        <script\n            type=\"text/javascript\"\n            src=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.30.0/codemirror.js\"\n        ></script>\n\n        <!--\n            Html mixed and xml cnd both are dependent\n            Used for html and css theme\n        -->\n        <script\n            type=\"text/javascript\"\n            src=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.30.0/mode/javascript/javascript.js\"\n        ></script>\n    @endPushOnce\n\n    @pushOnce('styles')\n        <!-- Code mirror style cdn -->\n        <link\n            rel=\"stylesheet\"\n            href=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.13.4/codemirror.css\"\n        ></link>\n\n        <!-- Dark theme css -->\n        <link\n            rel=\"stylesheet\"\n            href=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.63.3/theme/ayu-dark.min.css\"\n        >\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/webhook/edit.blade.php",
    "content": "@php($placeholders = app('\\Webkul\\Automation\\Helpers\\Entity')->getEmailTemplatePlaceholders())\n\n<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.webhooks.edit.title')\n    </x-slot>\n\n    {!! view_render_event('admin.settings.webhook.edit.form.before', ['webhook' => $webhook]) !!}\n\n    <x-admin::form\n        :action=\"route('admin.settings.webhooks.update', $webhook->id)\"\n        method=\"PUT\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.webhook.edit.breadcrumbs.before', ['webhook' => $webhook]) !!}\n\n                    <!-- Breadcrumbs -->\n                    <x-admin::breadcrumbs\n                        name=\"settings.webhooks.edit\"\n                        :entity=\"$webhook\"\n                    />\n\n                    {!! view_render_event('admin.settings.webhook.edit.breadcrumbs.after', ['webhook' => $webhook]) !!}\n        \n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.settings.webhooks.edit.title')\n                    </div>\n                </div>\n        \n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.webhook.edit.save_button.before', ['webhook' => $webhook]) !!}\n\n                        <!-- Create button for person -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.webhooks.edit.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.settings.webhook.edit.save_button.after', ['webhook' => $webhook]) !!}\n                    </div>\n                </div>\n            </div>\n\n            <v-webhooks :errors=\"errors\"></v-webhooks>\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.settings.webhook.edit.form.after', ['webhook' => $webhook]) !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-webhooks-template\"\n        >\n            <div class=\"flex gap-2.5 max-xl:flex-wrap\">\n                {!! view_render_event('admin.settings.webhook.edit.left.before', ['webhook' => $webhook]) !!}\n\n                <!-- Left sub-component -->\n                <div class=\"flex flex-1 flex-col gap-2 max-xl:flex-auto\">\n                    <div class=\"box-shadow rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-900\">\n                        <div class=\"mb-4 flex items-center justify-between gap-4\">\n                            <div class=\"flex flex-col gap-1\">\n                                <p class=\"text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.webhooks.edit.title')\n                                </p>\n\n                                <p class=\"text-sm text-gray-600 dark:text-white\">\n                                    @lang('admin::app.settings.webhooks.edit.info')\n                                </p>\n                            </div>\n                        </div>\n\n                        <!-- Basic Details -->\n                        <div class=\"flex flex-col gap-4\">\n                            <div>\n                                <!-- Method and URL endpoint -->\n                                <x-admin::form.control-group>\n                                    <x-admin::form.control-group.label class=\"required\">\n                                        @lang('admin::app.settings.webhooks.edit.url-and-parameters')\n                                    </x-admin::form.control-group.label>\n\n                                    <div class=\"flex\">\n                                        <x-admin::form.control-group.control\n                                            type=\"select\"\n                                            name=\"method\"\n                                            id=\"method\"\n                                            :value=\"old('method') ?? $webhook->method\"\n                                            class=\"!w-1/6 rounded-r-none\"\n                                            :label=\"trans('admin::app.settings.webhooks.edit.method')\"\n                                        >\n                                            <option value=\"post\">@lang('admin::app.settings.webhooks.edit.post')</option>\n                                            <option value=\"put\">@lang('admin::app.settings.webhooks.edit.put')</option>\n                                        </x-admin::form.control-group.control>\n\n                                        <x-admin::form.control-group.control\n                                            type=\"text\"\n                                            name=\"end_point\"\n                                            id=\"end_point\"\n                                            class=\"rounded-l-none\"\n                                            :value=\"old('end_point') ?? $webhook->end_point\"\n                                            rules=\"required|url\"\n                                            :label=\"trans('admin::app.settings.webhooks.edit.url-endpoint')\"\n                                            :placeholder=\"trans('admin::app.settings.webhooks.edit.url-endpoint')\"\n                                            v-debounce=\"500\"\n                                            v-model.lazy=\"baseUrl\"\n                                        />\n                                    </div>\n                                    <x-admin::form.control-group.error control-name=\"end_point\"/>\n                                </x-admin::form.control-group>\n\n                                <!-- Parameters -->\n                                <v-key-and-value\n                                    title=\"@lang('admin::app.settings.webhooks.edit.parameters')\"\n                                    name=\"query_params\"\n                                    :add-btn-title=\"'@lang('admin::app.settings.webhooks.edit.add-new-parameter')'\"\n                                    :fields=\"parameters\"\n                                    :placeholders=\"placeholders\"\n                                ></v-key-and-value>\n                                \n                                <!-- URL Preview -->\n                                <div class=\"flex w-full items-center justify-between rounded-sm border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                                    <div class=\"my-2 flex gap-3\">\n                                        <div class=\"font-sm text-xs dark:text-gray-300\">\n                                            @lang('admin::app.settings.webhooks.edit.url-preview')\n\n                                            <span class=\"text-sm font-medium text-gray-800 dark:text-gray-300\">@{{ urlEndPoint() }}</span>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n\n                            <!-- Headers -->\n                            <div class=\"border-y border-gray-200 dark:border-gray-800\">\n                                <v-key-and-value\n                                    title=\"@lang('admin::app.settings.webhooks.edit.headers')\"\n                                    name=\"headers\"\n                                    :add-btn-title=\"'@lang('admin::app.settings.webhooks.edit.add-new-header')'\"\n                                    :fields=\"headers\"\n                                    :placeholders=\"placeholders\"\n                                ></v-key-and-value>\n                            </div>\n\n                            <!-- Content -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.webhooks.edit.body')\n                                </x-admin::form.control-group.label>\n\n                                <div class=\"mb-4 flex items-center gap-2\">\n                                    <div class=\"flex cursor-pointer items-center justify-center\">\n                                        <input\n                                            id=\"default\"\n                                            type=\"radio\"\n                                            v-model=\"contentType\"\n                                            value=\"default\"\n                                            name=\"payload_type\"\n                                            class=\"h-4 w-4 cursor-pointer border-gray-300 bg-gray-100 text-blue-600 dark:border-gray-600 dark:bg-gray-700 dark:ring-offset-gray-800\"\n                                        >\n                                        <label\n                                            for=\"default\"\n                                            class=\"ms-2 cursor-pointer text-xs font-normal text-gray-900 dark:text-gray-300\"\n                                        >\n                                            @lang('admin::app.settings.webhooks.edit.default')\n                                        </label>\n                                    </div>\n                                    \n                                    <div class=\"flex cursor-pointer items-center justify-center\">\n                                        <input\n                                            id=\"x-www-form-urlencoded\"\n                                            type=\"radio\"\n                                            v-model=\"contentType\"\n                                            value=\"x-www-form-urlencoded\"\n                                            name=\"payload_type\"\n                                            class=\"h-4 w-4 cursor-pointer border-gray-300 bg-gray-100 text-blue-600 dark:border-gray-600 dark:bg-gray-700 dark:ring-offset-gray-800\"\n                                        >\n                                        <label\n                                            for=\"x-www-form-urlencoded\"\n                                            class=\"ms-2 cursor-pointer text-xs font-normal text-gray-900 dark:text-gray-300\"\n                                        >\n                                            @lang('admin::app.settings.webhooks.edit.x-www-form-urlencoded')\n                                        </label>\n                                    </div>\n\n                                    <div class=\"flex items-center justify-center gap-5\">\n                                        <div class=\"flex cursor-pointer items-center justify-center\">\n                                            <input\n                                                id=\"raw\"\n                                                type=\"radio\"\n                                                v-model=\"contentType\"\n                                                value=\"raw\"\n                                                name=\"payload_type\"\n                                                class=\"h-4 w-4 cursor-pointer border-gray-300 bg-gray-100 text-blue-600 dark:border-gray-600 dark:bg-gray-700 dark:ring-offset-gray-800\"\n                                                @click=\"contentType = 'raw'\"\n                                            >\n\n                                            <label\n                                                for=\"raw\"\n                                                class=\"ms-2 cursor-pointer text-xs font-normal text-gray-900 dark:text-gray-300\"\n                                                @click=\"contentType = 'raw';rawType = 'json'\"\n                                            >\n                                                @lang('admin::app.settings.webhooks.edit.raw')\n                                            </label>\n                                        </div>\n\n                                        <template v-if=\"contentType == 'raw'\">\n                                            <x-admin::dropdown class=\"rounded-lg dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\">\n                                                <x-slot:toggle>\n                                                    <div class=\"flex items-center justify-center\">\n                                                        <span class=\"cursor-pointer text-xs font-normal text-brandColor dark:text-gray-300\">@{{ rawType }}</span>\n\n                                                        <i class=\"icon-down-arrow -mt-px text-xs text-brandColor\"></i>\n                                                    </div>\n                                                </x-slot>\n                            \n                                                <x-slot:menu class=\"!p-0 dark:border-gray-800\">\n                                                    <input\n                                                        type=\"hidden\"\n                                                        name=\"raw_payload_type\"\n                                                        v-model=\"rawType\"\n                                                    >\n\n                                                    <span\n                                                        class=\"whitespace-no-wrap flex cursor-pointer items-center justify-between gap-1.5 rounded-t px-2 py-2 text-sm text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950\"\n                                                        :class=\"{'bg-gray-100 dark:bg-gray-950': rawType === 'json'}\"\n                                                        @click=\"rawType = 'json'\"\n                                                    >\n                                                        <div class=\"items flex items-center gap-1.5\">\n                                                            @lang('admin::app.settings.webhooks.edit.json')\n                                                        </div>\n                                                    </span>\n\n                                                    <span\n                                                        class=\"whitespace-no-wrap flex cursor-pointer items-center justify-between gap-1.5 rounded-t px-2 py-2 text-sm text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950\"\n                                                        :class=\"{'bg-gray-100 dark:bg-gray-950': rawType === 'text'}\"\n                                                        @click=\"rawType = 'text'\"\n                                                    >\n                                                        <div class=\"items flex items-center gap-1.5\">\n                                                            @lang('admin::app.settings.webhooks.edit.text')\n                                                        </div>\n                                                    </span>\n                                                </x-slot>\n                                            </x-admin::dropdown>\n                                        </template>\n                                    </div>\n                                </div>\n                            \n                                <template v-if=\"showEditor\">\n                                    <textarea\n                                        ref=\"payload\"\n                                        id=\"payload\"\n                                        name=\"payload\"\n                                    >@{{ payload }}</textarea>\n                                </template>\n\n                                <template v-else>\n                                    <v-key-and-value\n                                        title=\"@lang('admin::app.settings.webhooks.edit.key-and-value')\"\n                                        name=\"payload\"\n                                        :add-btn-title=\"'@lang('admin::app.settings.webhooks.edit.add-new-payload')'\"\n                                        :fields=\"tempPayload\"\n                                        :placeholders=\"placeholders\"\n                                    ></v-key-and-value>\n                                </template>\n\n                                <x-admin::form.control-group.error control-name=\"payload\" />\n                            </x-admin::form.control-group>\n                        </div>\n                    </div>\n                </div>\n\n                {!! view_render_event('admin.settings.webhook.edit.left.after', ['webhook' => $webhook]) !!}\n\n                {!! view_render_event('admin.settings.webhook.edit.right.before', ['webhook' => $webhook]) !!}\n\n                <!-- Right sub-component -->\n                <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-sm:w-full\">\n                    <x-admin::accordion>\n                        <x-slot:header>\n                            <div class=\"flex items-center justify-between\">\n                                <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                                    @lang('admin::app.settings.webhooks.edit.general')\n                                </p>\n                            </div>\n                        </x-slot>\n    \n                        <x-slot:content>\n                            <!-- Name -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.webhooks.edit.name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    id=\"name\"\n                                    name=\"name\"\n                                    rules=\"required\"\n                                    :value=\"old('admin::app.settings.webhooks.edit.name') ?? $webhook->name\"\n                                    :label=\"trans('Admin::app.settings.webhooks.edit.name')\"\n                                    :placeholder=\"trans('Admin::app.settings.webhooks.edit.name')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Entity Type -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.webhooks.edit.entity-type')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    id=\"entity_type\"\n                                    name=\"entity_type\"\n                                    :value=\"old('entity_type') ?? $webhook->entity_type\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.webhooks.edit.entity-type')\"\n                                    :placeholder=\"trans('admin::app.settings.webhooks.edit.entity-type')\"\n                                >\n                                    @foreach (app('\\Webkul\\Automation\\Helpers\\Entity')->getEvents() as $item)\n                                        <option value=\"{{ $item['id'] }}\">\n                                            {{ $item['name'] }}\n                                        </option>\n                                    @endforeach\n                                </x-admin::form.control-group.control>\n                            <x-admin::form.control-group.error control-name=\"entity_type\" />\n\n                            </x-admin::form.control-group>\n\n                            <!-- Description -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.webhooks.edit.description')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"textarea\"\n                                    id=\"description\"\n                                    name=\"description\"\n                                    :value=\"old('description') ?? $webhook->description\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.webhooks.edit.description')\"\n                                    :placeholder=\"trans('admin::app.settings.webhooks.edit.description')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"description\" />\n                            </x-admin::form.control-group>\n                        </x-slot>\n                    </x-admin::accordion>\n                </div>\n\n                {!! view_render_event('admin.settings.webhook.edit.right.before', ['webhook' => $webhook]) !!}\n            </div>\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-key-and-value-template\"\n        >\n            <x-admin::form.control-group class=\"my-2\">\n                <x-admin::form.control-group.label class=\"required\">\n                    @{{ title }}\n                </x-admin::form.control-group.label>\n            \n                <div class=\"flex flex-col\">\n                    <div \n                        class=\"group my-2 flex items-center justify-between gap-3\"\n                        v-for=\"(field, index) in fields\"\n                        :key=\"index\"\n                    >\n                        <div class=\"w-1/2\">\n                            <x-admin::form.control-group.control\n                                type=\"text\"\n                                ::id=\"`${name}[${index}][key]`\"\n                                ::name=\"`${name}[${index}][key]`\"\n                                v-model=\"field.key\"\n                                rules=\"required\"\n                                :label=\"trans('Key')\"\n                                :placeholder=\"trans('Key')\"\n                            />\n                            <x-admin::form.control-group.error ::name=\"`${name}[${index}][key]`\" />\n                        </div>\n\n                        <div class=\"w-full\">\n                            <x-admin::form.control-group.control\n                                type=\"text\"\n                                ::id=\"`${name}[${index}][value]`\"\n                                ::name=\"`${name}[${index}][value]`\"\n                                v-model=\"field.value\"\n                                rules=\"required\"\n                                :label=\"trans('Value')\"\n                                :placeholder=\"trans('Value')\"\n                            />\n                            <x-admin::form.control-group.error ::name=\"`${name}[${index}][value]`\" />\n                        </div>\n\n                        <i \n                            class=\"icon-delete ml-1 cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                            @click=\"remove(index)\"\n                            v-if=\"fields.length > 1\"\n                        ></i>\n\n                        <div class=\"w-1/5\">\n                            <x-admin::dropdown class=\"rounded-lg group-hover:visible dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\">\n                                <x-slot:toggle>\n                                    <span\n                                        class=\"invisible cursor-pointer py-2 text-xs text-brandColor hover:text-brandColor hover:underline group-hover:visible\"\n                                    >\n                                        @lang('admin::app.settings.webhooks.edit.insert-placeholder')\n                                    </span>\n                                </x-slot>\n            \n                                <x-slot:menu class=\"max-h-80 overflow-y-auto !p-0 dark:border-gray-800\">\n                                    <div\n                                        v-for=\"entity in placeholders\"\n                                        :key=\"entity.text\"\n                                        class=\"mb-4\"\n                                    >\n                                        <div class=\"m-2 text-lg font-bold\">@{{ entity.text }}</div>\n\n                                        <span\n                                            v-for=\"placeholder in entity.menu\"\n                                            :key=\"placeholder.value\"\n                                            class=\"whitespace-no-wrap flex cursor-pointer items-center justify-between gap-1.5 rounded-t px-2 py-2 text-sm text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-950\"\n                                            @click=\"insertPlaceholder(index, placeholder.value)\"\n                                        >\n                                            <div class=\"items flex items-center gap-1.5\">\n                                                @{{ placeholder.text }}\n                                            </div>\n                                        </span>\n                                    </div>\n                                </x-slot>\n                            </x-admin::dropdown>\n                        </div>\n                    </div>\n            \n                    <div class=\"inline-block\">\n                        <button\n                            type=\"button\"\n                            class=\"flex max-w-max items-center gap-2 text-brandColor\"\n                            @click=\"add(index)\" \n                        >\n                            <i class=\"icon-add text-md !text-brandColor\"></i>\n\n                            @{{ addBtnTitle }}\n                        </button>\n                    </div>\n                </div>\n            </x-admin::form.control-group>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-webhooks', {\n                template: '#v-webhooks-template',\n\n                props: ['errors'],\n\n                data() {\n                    return {\n                        baseUrl: '{{ $webhook->end_point ?? '' }}',\n                        \n                        codeMirrorInstance: null,\n                        \n                        tempPayload: [],\n                        \n                        payload: @json($webhook->payload),\n\n                        parameters: @json($webhook->query_params),\n\n                        headers: @json($webhook->headers),\n\n                        placeholders: @json($placeholders),\n\n                        contentType: '{{ $webhook->payload_type ?? 'default' }}',\n\n                        rawType: '{{ $webhook->raw_payload_type !== \"\" ? $webhook->raw_payload_type : 'json' }}',\n                    };\n                },\n\n                created() {\n                    this.initiateEditor();\n\n                    if (Array.isArray(this.payload)) {\n                        this.tempPayload = this.payload;\n                    }\n\n                    this.$emitter.on('change-theme', (theme) => this.handleEditorDisplay());\n                },\n\n                watch: {\n                    /**\n                     * Watch the raw type and update the tempPayload.\n                     * \n                     * @return {void}\n                     */\n                    rawType(newValue, oldValue) {\n                        this.handleEditorDisplay();\n                    },\n\n                    /**\n                     * Watch the content type and update the tempPayload.\n                     * \n                     * @return {void}\n                     */\n                    contentType(newValue, oldValue) {\n                        this.handleEditorDisplay();\n                    },\n\n                    baseUrl() {\n                        this.urlEndPoint();\n                    },\n                },\n\n                computed: {\n                    /**\n                     * Check if the editor should be displayed.\n                     * \n                     * @returns {boolean}\n                     */\n                    showEditor() {\n                        return (\n                            this.contentType === 'default'\n                            || this.contentType === 'raw'\n                        ) && this.contentType !== 'application/x-www-form-urlencoded';\n                    },\n                },\n\n                methods: {\n                    /**\n                     * Handle editor display.\n                     * \n                     * @returns {void}\n                     */\n                    handleEditorDisplay() {\n                        if (this.codeMirrorInstance) {\n                            this.codeMirrorInstance.toTextArea();\n\n                            this.codeMirrorInstance = null;\n                        }\n\n                        if (this.showEditor) {\n                            this.initiateEditor();\n                        }\n                    },\n\n                    /**\n                     * Initiate Editor.\n                     * \n                     * @param {string} rawType\n                     * \n                     * @return {void}\n                     */\n                    initiateEditor() {\n                        this.$nextTick(() => {\n                            const mode = this.rawType === 'json' ? 'application/json' : 'text/plain';\n\n                            if (! this.codeMirrorInstance && this.showEditor) {\n                                this.codeMirrorInstance = CodeMirror.fromTextArea(this.$refs.payload, {\n                                    lineNumbers: true,\n                                    mode: this.contentType === 'default' ? 'application/json' : mode,\n                                    styleActiveLine: true,\n                                    lint: true,\n                                    theme: document.documentElement.classList.contains('dark') ? 'ayu-dark' : 'default',\n                                });\n\n                                this.codeMirrorInstance.on('changes', () => this.payload = this.codeMirrorInstance.getValue());\n\n                                return;\n                            }\n\n                            this.codeMirrorInstance?.setOption('mode', mode);\n                        }, 0);\n                    },\n\n                    /**\n                     * Get the URL endpoint with the parameters\n                     * \n                     * @returns {string}\n                     */\n                    urlEndPoint() {\n                        if (\n                            this.baseUrl === ''\n                            || this.errors.hasOwnProperty('end_point')\n                        ) {\n                            return this.baseUrl;\n                        }\n\n                        try {\n                            const url = new URL(this.baseUrl);\n\n                            url.search = '';\n\n                            this.parameters.forEach(param => {\n                                if (\n                                    param.key \n                                    && param.value\n                                ) {\n                                    url.searchParams.append(param.key, param.value);\n                                }\n                            });\n\n                            return decodeURI(url.toString());\n                        } catch (error) {\n                            return this.baseUrl;\n                        }\n                    },\n                },\n            });\n\n            app.component('v-key-and-value', {\n                template: '#v-key-and-value-template',\n\n                props: ['title', 'name', 'addBtnTitle', 'fields', 'placeholders'],\n\n                data() {\n                    return {\n                        selectedPlaceholder: '',\n\n                        cursorPosition: 0,\n                    };\n                },\n\n                methods: {\n                    /**\n                     * Add a new fields.\n                     * \n                     * @returns {void}\n                     */\n                    add() {\n                        this.fields.push({ key: '', value: '' });\n                    },\n\n                    /**\n                     * Remove a fields.\n                     * \n                     * @returns {void}\n                     */\n                    remove(index) {\n                        this.fields.splice(index, 1);\n                    },\n\n                    /**\n                     * Save the cursor position when the input is focused.\n                     * \n                     * @param {Event} event\n                     * @returns {void}\n                     */\n                    saveCursorPosition(event) {\n                        this.cursorPosition = event.target.selectionStart;\n                    },\n\n                    /**\n                     * Insert the selected placeholder into the subject.\n                     * \n                     * @returns {void}\n                     */\n                    insertPlaceholder(index, value) {\n                        if (this.cursorPosition >= 0) {\n                            const before = this.fields[index].value.substring(0, this.cursorPosition);\n\n                            const after = this.fields[index].value.substring(this.cursorPosition);\n\n                            this.fields[index].value = `${before}${value}${after}`;\n\n                            this.cursorPosition += value.length;\n                        } else if (value) {\n                            this.fields[index].value += value;\n                        }\n\n                        this.selectedPlaceholder = '';\n                    },\n                },\n            });\n        </script>\n\n        <!-- Code mirror script CDN -->\n        <script\n            type=\"text/javascript\"\n            src=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.30.0/codemirror.js\"\n        ></script>\n\n        <!-- \n            Html mixed and xml cnd both are dependent \n            Used for html and css theme\n        -->\n        <script\n            type=\"text/javascript\"\n            src=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.30.0/mode/javascript/javascript.js\"\n        ></script>\n    @endPushOnce\n\n    @pushOnce('styles')\n        <!-- Code mirror style cdn -->\n        <link \n            rel=\"stylesheet\"\n            href=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.13.4/codemirror.css\"\n        ></link>\n\n        <!-- Dark theme css -->\n        <link\n            rel=\"stylesheet\"\n            href=\"https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.63.3/theme/ayu-dark.min.css\"\n        >\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/webhook/index.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.settings.webhooks.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.settings.webhooks.breadcrumbs.datagrid.before') !!}\n\n                <x-admin::breadcrumbs name=\"settings.webhooks\" />\n\n                {!! view_render_event('admin.settings.webhooks.breadcrumbs.datagrid.after') !!}\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    @lang('admin::app.settings.webhooks.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.settings.webhooks.create_button.datagrid.before') !!}\n\n                    <!-- Create button for person -->\n                    <a\n                        href=\"{{ route('admin.settings.webhooks.create') }}\"\n                        class=\"primary-button\"\n                    >\n                        @lang('admin::app.settings.webhooks.index.create-btn')\n                    </a>\n\n                    {!! view_render_event('admin.settings.webhooks.create_button.datagrid.after') !!}\n                </div>\n            </div>\n        </div>\n\n        {!! view_render_event('admin.settings.webhooks.index.datagrid.before') !!}\n\n        <x-admin::datagrid :src=\"route('admin.settings.webhooks.index')\">\n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </x-admin::datagrid>\n\n        {!! view_render_event('admin.settings.webhooks.index.datagrid.after') !!}\n    </div>\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/workflows/create.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.settings.workflows.create.title')\n    </x-slot>\n\n    {!! view_render_event('admin.settings.workflow.form.before') !!}\n\n    <x-admin::form :action=\"route('admin.settings.workflows.store')\">\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.workflow.breadcrumbs.before') !!}\n\n                    <x-admin::breadcrumbs name=\"settings.workflows.create\" />\n\n                    {!! view_render_event('admin.settings.webhooks.breadcrumbs.after') !!}\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.settings.workflows.create.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.workflow.save_button.before') !!}\n\n                        <!-- Save button for person -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.workflows.create.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.settings.workflow.save_button.after') !!}\n                    </div>\n                </div>\n            </div>\n\n            <!-- Workflow Vue Component -->\n            <v-workflow></v-workflow>\n\n            <x-admin::attributes.edit.lookup />\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.settings.workflow.form.after') !!}\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-workflow-template\"\n        >\n            <div class=\"box-shadow flex flex-col gap-4 rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                {!! view_render_event('admin.settings.workflows.create.form_controls.before') !!}\n\n                <!-- Tab Switcher -->\n                <div class=\"flex w-full gap-2 border-b border-gray-200 dark:border-gray-800\">\n                    <!-- Tabs -->\n                    <template\n                        v-for=\"tab in tabs\"\n                        :key=\"tab.id\"\n                    >\n                        <a\n                            :href=\"'#' + tab.id\"\n                            :class=\"[\n                                'inline-block px-3 py-2.5 border-b-2  text-sm font-medium ',\n                                activeTab === tab.id\n                                ? 'text-brandColor border-brandColor dark:brandColor dark:brandColor'\n                                : 'text-gray-600 dark:text-gray-300  border-transparent hover:text-gray-800 hover:border-gray-400 dark:hover:border-gray-400  dark:hover:text-white'\n                            ]\"\n                            @click=\"scrollToSection(tab.id)\"\n                            :text=\"tab.label\"\n                        ></a>\n                    </template>\n                </div>\n\n                <div class=\"flex flex-col gap-4 px-4 py-2\">\n                    {!! view_render_event('admin.settings.workflows.create.basic_details.before') !!}\n\n                    <!-- Basic Details -->\n                    <div\n                        class=\"flex flex-col gap-4\"\n                        id=\"basic-details\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.settings.workflows.create.basic-details')\n                            </p>\n\n                            <p class=\"text-gray-600 dark:text-white\">\n                                @lang('admin::app.settings.workflows.create.basic-details-info')\n                            </p>\n                        </div>\n\n                        <div class=\"w-1/2 max-md:w-full\">\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.workflows.create.name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"name\"\n                                    id=\"name\"\n                                    :value=\"old('name')\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.workflows.create.name')\"\n                                    :placeholder=\"trans('admin::app.settings.workflows.create.name')\"\n                                />\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label>\n                                    @lang('admin::app.settings.workflows.create.description')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"textarea\"\n                                    name=\"description\"\n                                    id=\"description\"\n                                    rows=\"5\"\n                                    :value=\"old('description')\"\n                                    :label=\"trans('admin::app.settings.workflows.create.description')\"\n                                    :placeholder=\"trans('admin::app.settings.workflows.create.description')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"description\" />\n                            </x-admin::form.control-group>\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.settings.workflows.create.basic_details.after') !!}\n\n                    {!! view_render_event('admin.settings.workflows.create.event.before') !!}\n\n                    <!-- Event -->\n                    <div\n                        class=\"flex flex-col gap-4\"\n                        id=\"event\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.settings.workflows.create.event')\n                            </p>\n\n                            <p class=\"text-gray-600 dark:text-white\">\n                                @lang('admin::app.settings.workflows.create.event-info')\n                            </p>\n                        </div>\n\n                        <!-- Hidden Entity Type -->\n                        <input\n                            type=\"hidden\"\n                            name=\"entity_type\"\n                            :value=\"entityType\"\n                        />\n\n                        <div class=\"w-1/2 max-md:w-full\">\n                            <!-- Event -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.workflows.create.event')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    id=\"event\"\n                                    name=\"event\"\n                                    ::value=\"event\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.workflows.create.event')\"\n                                    :placeholder=\"trans('admin::app.settings.workflows.create.event')\"\n                                    v-model=\"event\"\n                                >\n                                    <optgroup\n                                        v-for='entity in events'\n                                        :label=\"entity.name\"\n                                    >\n                                        <option\n                                            v-for='event in entity.events'\n                                            :value=\"event.event\"\n                                            :text=\"event.name\"\n                                        ></option>\n                                    </optgroup>\n                                </x-admin::form.control-group.control>\n\n                                <x-admin::form.control-group.error control-name=\"event\" />\n                            </x-admin::form.control-group>\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.settings.workflows.create.event.after') !!}\n\n                    {!! view_render_event('admin.settings.workflows.create.condition.before') !!}\n\n                    <!-- Conditions -->\n                    <div\n                        class=\"flex flex-col gap-4\"\n                        id=\"conditions\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.settings.workflows.create.conditions')\n                            </p>\n\n                            <p class=\"text-gray-600 dark:text-white\">\n                                @lang('admin::app.settings.workflows.create.conditions-info')\n                            </p>\n                        </div>\n\n                        <div class=\"flex w-1/2 flex-col gap-2 max-md:w-full\">\n                            <!-- Condition Type -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label>\n                                    @lang('admin::app.settings.workflows.create.condition-type')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    class=\"ltr:pr-10 rtl:pl-10\"\n                                    id=\"condition_type\"\n                                    name=\"condition_type\"\n                                    v-model=\"conditionType\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.workflows.create.condition-type')\"\n                                    :placeholder=\"trans('admin::app.settings.workflows.create.condition-type')\"\n                                >\n                                    <option value=\"and\">\n                                        @lang('admin::app.settings.workflows.create.all-condition-are-true')\n                                    </option>\n\n                                    <option value=\"or\">\n                                        @lang('admin::app.settings.workflows.create.any-condition-are-true')\n                                    </option>\n                                </x-admin::form.control-group.control>\n\n                                <x-admin::form.control-group.error control-name=\"condition_type\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Workflow Condition Vue Component. -->\n                            <template\n                                v-for='(condition, index) in conditions'\n                                :key=\"index\"\n                            >\n                                <v-workflow-condition-item\n                                    :entityType=\"entityType\"\n                                    :condition=\"condition\"\n                                    :index=\"index\"\n                                    @onRemoveCondition=\"removeCondition($event)\"\n                                ></v-workflow-condition-item>\n                            </template>\n\n                            <button\n                                type=\"button\"\n                                class=\"flex max-w-max items-center gap-2 text-brandColor\"\n                                @click=\"addCondition\"\n                            >\n                                <i class=\"icon-add text-md !text-brandColor\"></i>\n\n                                @lang('admin::app.settings.workflows.create.add-condition')\n                            </button>\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.settings.workflows.create.condition.after') !!}\n\n                    {!! view_render_event('admin.settings.workflows.create.action.before') !!}\n\n                    <!-- Actions -->\n                    <div\n                        class=\"flex flex-col gap-4\"\n                        id=\"actions\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.settings.workflows.create.actions')\n                            </p>\n\n                            <p class=\"text-gray-600 dark:text-white\">\n                                @lang('admin::app.settings.workflows.create.actions-info')\n                            </p>\n                        </div>\n\n                        <div class=\"block w-full\">\n                            <x-admin::table class=\"!w-1/2 !table-auto\">\n                                <!-- Table Head -->\n                                <x-admin::table.thead>\n                                    <x-admin::table.thead.tr>\n                                        <x-admin::table.th class=\"text-center\">\n                                            @lang('admin::app.settings.workflows.create.type')\n                                        </x-admin::table.th>\n\n                                        <x-admin::table.th class=\"text-center\">\n                                            @lang('admin::app.settings.workflows.create.name')\n                                        </x-admin::table.th>\n\n                                        <x-admin::table.th></x-admin::table.th>\n                                    </x-admin::table.thead.tr>\n                                </x-admin::table.thead>\n\n                                <!-- Table Body -->\n                                <x-admin::table.tbody>\n                                    <template\n                                        v-for='(action, index) in actions'\n                                        :key=\"index\"\n                                    >\n                                        <v-workflow-action-item\n                                            :entityType=\"entityType\"\n                                            :action=\"action\"\n                                            :index=\"index\"\n                                            @onRemoveAction=\"removeAction($event)\"\n                                        ></v-workflow-action-item>\n                                    </template>\n                                </x-admin::table.tbody>\n                            </x-admin::table>\n                        </div>\n\n                        <button\n                            type=\"button\"\n                            class=\"text-md flex max-w-max items-center gap-2 text-brandColor\"\n                            @click=\"addAction\"\n                        >\n                            <i class=\"icon-add\"></i>\n\n                            @lang('admin::app.settings.workflows.create.add-action')\n                        </button>\n                    </div>\n\n                    {!! view_render_event('admin.settings.workflows.create.action.after') !!}\n                </div>\n\n                {!! view_render_event('admin.settings.workflows.create.form_controls.after') !!}\n            </div>\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-workflow-condition-item-template\"\n        >\n            <div class=\"flex items-center justify-between gap-4\">\n                <div class=\"flex flex-1 gap-4 max-sm:flex-1 max-sm:flex-wrap\">\n                    <!-- Select main condition. -->\n                    <select\n                        :name=\"['conditions[' + index + '][attribute]']\"\n                        :id=\"['conditions[' + index + '][attribute]']\"\n                        class=\"custom-select min:w-1/3 flex h-10 w-1/3 rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 max-sm:max-w-full max-sm:flex-auto\"\n                        v-model=\"condition.attribute\"\n                    >\n                        <option\n                            v-for=\"attribute in conditions[entityType]\"\n                            :value=\"attribute.id\"\n                            :text=\"attribute.name\"\n                        ></option>\n                    </select>\n\n                    <template v-if=\"matchedAttribute\">\n                        <select\n                            :name=\"['conditions[' + index + '][operator]']\"\n                            :id=\"['conditions[' + index + '][operator]']\"\n                            class=\"custom-select min:w-1/3 inline-flex h-10 w-1/3 items-center justify-between gap-x-1 rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 max-sm:max-w-full max-sm:flex-auto\"\n                            v-model=\"condition.operator\"\n                        >\n                            <option\n                                v-for='operator in conditionOperators[matchedAttribute.type]'\n                                :value=\"operator.operator\"\n                                :text=\"operator.name\"\n                            ></option>\n                        </select>\n                    </template>\n\n                    <template v-if=\"matchedAttribute\">\n                        <!-- Text, Price, Decimal, Integer, Email, Phone -->\n                        <input\n                            type=\"hidden\"\n                            :name=\"['conditions[' + index + '][attribute_type]']\"\n                            v-model=\"matchedAttribute.type\"\n                        >\n\n                        <template\n                            v-if=\"\n                                matchedAttribute.type == 'text'\n                                || matchedAttribute.type == 'price'\n                                || matchedAttribute.type == 'decimal'\n                                || matchedAttribute.type == 'integer'\n                                || matchedAttribute.type == 'email'\n                                || matchedAttribute.type == 'phone'\n                            \"\n                        >\n                            <v-field\n                                :name=\"`conditions[${index}][value]`\"\n                                v-slot=\"{ field, errorMessage }\"\n                                label=\"@lang('admin::app.settings.workflows.create.value')\"\n                                :id=\"`conditions[${index}][value]`\"\n                                :rules=\"\n                                    matchedAttribute.type == 'price' ? 'regex:^[0-9]+(\\\\.[0-9]+)?$' : ''\n                                    || matchedAttribute.type == 'decimal' ? 'regex:^[0-9]+(\\\\.[0-9]+)?$' : ''\n                                    || matchedAttribute.type == 'integer' ? 'regex:^[0-9]+$' : ''\n                                    || matchedAttribute.type == 'text' ? 'regex:^.*$' : ''\n                                    || matchedAttribute.type == 'email' ? 'email' : ''\n                                \"\n                                v-model=\"condition.value\"\n                            >\n                                <input\n                                    type=\"text\"\n                                    v-bind=\"field\"\n                                    :class=\"{ 'border border-red-500': errorMessage }\"\n                                    class=\"min:w-1/3 flex h-10 w-1/3 rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                />\n                            </v-field>\n\n                            <v-error-message\n                                :name=\"`conditions[${index}][value]`\"\n                                class=\"mt-1 text-xs italic text-red-500\"\n                                as=\"p\"\n                            >\n                            </v-error-message>\n                        </template>\n\n                        <!-- Date -->\n                        <template v-if=\"matchedAttribute.type == 'date'\">\n                            <x-admin::flat-picker.date\n                                class=\"!w-1/3\"\n                                ::allow-input=\"false\"\n                            >\n                                <input\n                                    type=\"date\"\n                                    class=\"min:w-1/3 flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                    :name=\"['conditions[' + index + '][value]']\"\n                                    v-model=\"condition.value\"\n                                />\n                            </x-admin::flat-picker.date>\n                        </template>\n\n                        <!-- Datetime -->\n                        <template v-if=\"matchedAttribute.type == 'datetime'\">\n                            <x-admin::flat-picker.date\n                                class=\"!w-1/3\"\n                                ::allow-input=\"false\"\n                            >\n                                <input\n                                    type=\"datetime\"\n                                    class=\"min:w-1/3 flex w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                    :name=\"['conditions[' + index + '][value]']\"\n                                    v-model=\"condition.value\"\n                                />\n                            </x-admin::flat-picker.date>\n                        </template>\n\n                        <!-- Boolean -->\n                        <template v-if=\"matchedAttribute.type == 'boolean'\">\n                            <select\n                                :name=\"['conditions[' + index + '][value]']\"\n                                class=\"custom-select inline-flex h-10 w-1/3 items-center justify-between gap-x-1 rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 max-sm:max-w-full max-sm:flex-auto\"\n                                v-model=\"condition.value\"\n                            >\n                                <option value=\"1\">\n                                    @lang('admin::app.settings.workflows.create.yes')\n                                </option>\n\n                                <option value=\"0\">\n                                    @lang('admin::app.settings.workflows.create.no')\n                                </option>\n                            </select>\n                        </template>\n\n                        <!-- Lookup Type -->\n                        <template\n                            v-if=\"\n                                matchedAttribute.type == 'select'\n                                || matchedAttribute.type == 'radio'\n                                || matchedAttribute.type == 'lookup'\n                            \"\n                        >\n                            <template v-if=\"! matchedAttribute.lookup_type\">\n                                <select\n                                    :name=\"['conditions[' + index + '][value]']\"\n                                    class=\"custom-select inline-flex h-10 w-1/3 items-center justify-between gap-x-1 rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                    v-model=\"condition.value\"\n                                >\n                                    <option\n                                        v-for='option in matchedAttribute.options'\n                                        :value=\"option.id\"\n                                        :text=\"option.name\"\n                                    ></option>\n                                </select>\n                            </template>\n\n                            <template v-else>\n                                <div class=\"w-1/3\">\n                                    <v-lookup-component\n                                        :attribute=\"{'code': 'conditions[' + index + '][value]', 'name': matchedAttribute?.name, 'lookup_type': matchedAttribute.lookup_type}\"\n                                        validations=\"required\"\n                                        :value=\"{\n                                            id: condition.value\n                                        }\"\n                                        can-add-new=\"true\"\n                                    ></v-lookup-component>\n\n                                    <x-admin::form.control-group.error ::name=\"`conditions[${index}][value]`\"/>\n                                </div>\n                            </template>\n                        </template>\n\n                        <!-- Multiselect and Checkbox -->\n                        <template\n                            v-if=\"matchedAttribute.type == 'multiselect'\n                            || matchedAttribute.type == 'checkbox'\"\n                        >\n                            <select\n                                :name=\"['conditions[' + index + '][value][]']\"\n                                class=\"min:w-1/3 inline-flex h-20 w-1/3 items-center justify-between gap-x-1 rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                v-model=\"condition.value\"\n                                multiple\n                            >\n                                <option\n                                    v-for='option in matchedAttribute.options'\n                                    :value=\"option.id\"\n                                    :text=\"option.name\"\n                                ></option>\n                            </select>\n                        </template>\n\n                        <!-- Textarea -->\n                        <template v-if=\"matchedAttribute.type == 'textarea'\">\n                            <textarea\n                                :name=\"['conditions[' + index + '][value]']\"\n                                :id=\"['conditions[' + index + '][value]']\"\n                                v-model=\"condition.value\"\n                                class=\"min:w-1/3 w-1/3 rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                            ></textarea>\n                        </template>\n                    </template>\n                </div>\n\n                <!-- Remove Conditions -->\n                <span\n                    class=\"icon-delete max-h-9 max-w-9 cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950 max-sm:place-self-center\"\n                    @click=\"removeCondition\"\n                ></span>\n            </div>\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-workflow-action-item-template\"\n        >\n            <!-- Table Body -->\n            <x-admin::table.thead.tr>\n                <x-admin::table.td>\n                    <select\n                        :name=\"['actions[' + index + '][id]']\"\n                        :id=\"['actions[' + index + '][id]']\"\n                        class=\"custom-select flex h-10 w-full rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 max-sm:max-w-full max-sm:flex-auto\"\n                        v-model=\"action.id\"\n                    >\n                        <option\n                            v-for='action in actions[entityType]'\n                            :value=\"action.id\"\n                            :text=\"action.name\"\n                        ></option>\n                    </select>\n                </x-admin::table.td>\n\n                <x-admin::table.td >\n                    <div class=\"flex w-full justify-between gap-4\">\n                        <template v-if=\"matchedAction && matchedAction.attributes\">\n                            <!-- Mattched Attribute -->\n                            <select\n                                :name=\"['actions[' + index + '][attribute]']\"\n                                :id=\"['actions[' + index + '][attribute]']\"\n                                class=\"custom-select inline-flex h-10 w-full items-center justify-between gap-x-1 rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 max-sm:max-w-full max-sm:flex-auto\"\n                                v-model=\"action.attribute\"\n                            >\n                                <option\n                                    v-for='attribute in matchedAction.attributes'\n                                    :value=\"attribute.id\"\n                                    :text=\"attribute.name\"\n                                ></option>\n                            </select>\n\n                            <template v-if=\"matchedAttribute\">\n                                <input\n                                    type=\"hidden\"\n                                    :name=\"['actions[' + index + '][attribute_type]']\"\n                                    v-model=\"matchedAttribute.type\"\n                                >\n\n                                <!-- Text, Price, Decimal and Integer -->\n                                <template\n                                    v-if=\"\n                                        matchedAttribute.type == 'text'\n                                        || matchedAttribute.type == 'price'\n                                        || matchedAttribute.type == 'decimal'\n                                        || matchedAttribute.type == 'integer'\n                                    \"\n                                >\n                                    <v-field\n                                        :name=\"`actions[${index}][value]`\"\n                                        v-slot=\"{ field, errorMessage }\"\n                                        :id=\"`actions[${index}][value]`\"\n                                        :rules=\"\n                                            matchedAttribute.type == 'price' ? 'regex:^[0-9]+(\\\\.[0-9]+)?$' : ''\n                                            || matchedAttribute.type == 'decimal' ? 'regex:^[0-9]+(\\\\.[0-9]+)?$' : ''\n                                            || matchedAttribute.type == 'integer' ? 'regex:^[0-9]+$' : ''\n                                            || matchedAttribute.type == 'text' ? 'regex:^.*$' : ''\n                                        \"\n                                        v-model=\"action.value\"\n                                    >\n                                        <input\n                                            type=\"text\"\n                                            v-bind=\"field\"\n                                            :class=\"{ 'border border-red-500': errorMessage }\"\n                                            class=\"flex h-10 w-full rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                        />\n                                    </v-field>\n\n                                    <v-error-message\n                                        :name=\"`actions[${index}][value]`\"\n                                        class=\"mt-1 text-xs italic text-red-500\"\n                                        as=\"p\"\n                                    >\n                                    </v-error-message>\n                                </template>\n\n                                <!-- Email and Phone -->\n                                <template\n                                    v-if=\"\n                                        matchedAttribute.type == 'email'\n                                        || matchedAttribute.type == 'phone'\n                                    \"\n                                >\n                                    <input\n                                        type=\"hidden\"\n                                        :name=\"['actions[' + index + '][value][0][value]']\"\n                                        value=\"work\"\n                                    />\n\n                                    <input\n                                        type=\"email\"\n                                        :name=\"`actions[${index}][value][0][value]`\"\n                                        :id=\"`actions[${index}][value][0][value]`\"\n                                        class=\"flex h-10 w-full rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                        v-model=\"action.value[0].value\"\n                                    />\n                                </template>\n\n                                <!-- Textarea -->\n                                <template v-if=\"matchedAttribute.type == 'textarea'\">\n                                    <textarea\n                                        :name=\"['actions[' + index + '][value]']\"\n                                        :id=\"['actions[' + index + '][value]']\"\n                                        v-model=\"action.value\"\n                                        class=\"w-full rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                    ></textarea>\n                                </template>\n\n                                <!-- Date Picker -->\n                                <template v-if=\"matchedAttribute.type == 'date'\">\n                                    <x-admin::flat-picker.date\n                                        class=\"!w-full\"\n                                        ::allow-input=\"false\"\n                                    >\n                                        <input\n                                            type=\"date\"\n                                            class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                            :name=\"['actions[' + index + '][value]']\"\n                                            v-model=\"action.value\"\n                                        />\n                                    </x-admin::flat-picker.date>\n                                </template>\n\n                                <!-- Date Time Picker -->\n                                <template v-if=\"matchedAttribute.type == 'datetime'\">\n                                    <x-admin::flat-picker.date\n                                        class=\"!w-full\"\n                                        ::allow-input=\"false\"\n                                    >\n                                        <input\n                                            type=\"datetime\"\n                                            class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                            :name=\"['actions[' + index + '][value]']\"\n                                            v-model=\"action.value\"\n                                        />\n                                    </x-admin::flat-picker.date>\n                                </template>\n\n                                <!-- Boolean -->\n                                <template v-if=\"matchedAttribute.type == 'boolean'\">\n                                    <select\n                                        :name=\"['actions[' + index + '][value]']\"\n                                        class=\"custom-select inline-flex h-10 w-full items-center justify-between gap-x-1 rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 max-sm:max-w-full max-sm:flex-auto\"\n                                        v-model=\"action.value\"\n                                    >\n                                        <option value=\"1\">\n                                            @lang('admin::app.settings.workflows.create.yes')\n                                        </option>\n\n                                        <option value=\"0\">\n                                            @lang('admin::app.settings.workflows.create.no')\n                                        </option>\n                                    </select>\n                                </template>\n\n                                <!-- Select, Radio and Lookup -->\n                                <template\n                                    v-if=\"\n                                        matchedAttribute.type == 'select'\n                                        || matchedAttribute.type == 'radio'\n                                        || matchedAttribute.type == 'lookup'\n                                    \"\n                                >\n                                    <!-- Attribute Options -->\n                                    <template v-if=\"! matchedAttribute.lookup_type\">\n                                        <select\n                                            :name=\"['actions[' + index + '][value]']\"\n                                            class=\"custom-select inline-flex h-10 w-full items-center justify-between gap-x-1 rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                            v-model=\"action.value\"\n                                        >\n                                            <option\n                                                v-for='option in matchedAttribute.options'\n                                                :value=\"option.id\"\n                                                :text=\"option.name\"\n                                            ></option>\n                                        </select>\n                                    </template>\n\n                                    <!-- Look vue component -->\n                                    <template v-else>\n                                        <div class=\"w-full\">\n                                            <v-lookup-component\n                                                :attribute=\"{'code': 'actions[' + index + '][value]', 'name': matchedAttribute?.name, 'lookup_type': matchedAttribute.lookup_type}\"\n                                                validations=\"required\"\n                                                :value=\"{\n                                                    id: action.value\n                                                }\"\n                                                can-add-new=\"true\"\n                                            ></v-lookup-component>\n\n                                            <x-admin::form.control-group.error ::name=\"`actions[${index}][value]`\"/>\n                                        </div>\n                                    </template>\n                                </template>\n\n                                <!-- Attribute Options -->\n                                <template v-if=\"this.matchedAttribute.type === 'multiselect' || this.matchedAttribute.type === 'checkbox'\">\n                                    <select\n                                        :name=\"`actions[${index}][value][]`\"\n                                        class=\"inline-flex h-20 w-full items-center justify-between gap-x-1 rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                        v-model=\"action.value\"\n                                        multiple\n                                    >\n                                        <option\n                                            v-for=\"option in matchedAttribute.options\"\n                                            :key=\"option.id\"\n                                            :value=\"option.id\"\n                                            :text=\"option.name\"\n                                        ></option>\n                                    </select>\n                                </template>\n                            </template>\n                        </template>\n\n                        <template v-if=\"matchedAction && matchedAction.options\">\n                            <select\n                                :name=\"`actions[${index}][value]`\"\n                                class=\"custom-select flex h-10 w-full rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 max-sm:max-w-full max-sm:flex-auto\"\n                                v-model=\"action.value\"\n                            >\n                                <option\n                                    v-for='option in matchedAction.options'\n                                    :value=\"option.id\"\n                                    :text=\"option.name\"\n                                ></option>\n                            </select>\n                        </template>\n\n                        <template\n                            v-if=\"\n                                matchedAction\n                                && ! matchedAction.attributes\n                                && ! matchedAction.options\n                                && ! matchedAction.request_methods\n                            \"\n                        >\n                            <v-field\n                                :name=\"`actions[${index}][value]`\"\n                                :id=\"`actions[${index}][value]`\"\n                                v-slot=\"{ field, errorMessage }\"\n                                v-model=\"action.value\"\n                            >\n                                <input\n                                    type=\"text\"\n                                    v-bind=\"field\"\n                                    :class=\"{ 'border border-red-500': errorMessage }\"\n                                    class=\"flex h-10 w-full rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                />\n                            </v-field>\n\n                            <v-error-message\n                                :name=\"`actions[${index}][value]`\"\n                                class=\"mt-1 text-xs italic text-red-500\"\n                                as=\"p\"\n                            >\n                            </v-error-message>\n                        </template>\n                    </div>\n                </x-admin::table.td>\n\n                <x-admin::table.td class=\"text-right\">\n                    <span\n                        class=\"icon-delete cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                        @click=\"removeAction\"\n                    ></span>\n                </x-admin::table.td>\n            </x-admin::table.thead.tr>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-workflow', {\n                template: '#v-workflow-template',\n\n                data() {\n                    return {\n                        events: @json(app('\\Webkul\\Automation\\Helpers\\Entity')->getEvents()),\n\n                        event: '',\n\n                        conditionType: '1',\n\n                        conditions: [],\n\n                        actions: [],\n\n                        activeTab: 'basic-details',\n\n                        tabs: [\n                            { id: 'basic-details', label: '@lang('admin::app.settings.workflows.create.basic-details')' },\n                            { id: 'event', label: '@lang('admin::app.settings.workflows.create.event')' },\n                            { id: 'conditions', label: '@lang('admin::app.settings.workflows.create.conditions')' },\n                            { id: 'actions', label: '@lang('admin::app.settings.workflows.create.actions')' }\n                        ],\n                    };\n                },\n\n                computed: {\n                    /**\n                     * Get the entity type.\n                     *\n                     * @return {String}\n                     */\n                     entityType: function () {\n                        if (this.event == '') {\n                            return '';\n                        }\n\n                        var entityType = '';\n\n                        for (let id in this.events) {\n                            this.events[id].events.forEach((eventTemp) => {\n                                if (eventTemp.event == this.event) {\n                                    entityType = id;\n                                }\n                            });\n                        }\n\n                        return entityType;\n                    }\n                },\n\n                watch: {\n                    /**\n                     * Watch the entity Type.\n                     *\n                     * @return {void}\n                     */\n                    entityType(newValue, oldValue) {\n                        this.conditions = [];\n\n                        this.actions = [];\n                    }\n                },\n\n                methods: {\n                    /**\n                     * Add the condition.\n                     *\n                     * @returns {void}\n                     */\n                    addCondition() {\n                        this.conditions.push({\n                            'attribute': '',\n                            'operator': '==',\n                            'value': '',\n                        });\n                    },\n\n                    /**\n                     * Remove the condition.\n                     *\n                     * @param {Object} condition\n                     * @returns {void}\n                     */\n                    removeCondition(condition) {\n                        let index = this.conditions.indexOf(condition);\n\n                        this.conditions.splice(index, 1);\n                    },\n\n                    /**\n                     * Add the action.\n                     *\n                     * @returns {void}\n                     */\n                    addAction() {\n                        this.actions.push({\n                            'id': '',\n                            'attribute': '',\n                            'value': '',\n                        });\n                    },\n\n                    /**\n                     * Remove the action.\n                     *\n                     * @param {Object} action\n                     * @returns {void}\n                     */\n                    removeAction(action) {\n                        let index = this.actions.indexOf(action)\n\n                        this.actions.splice(index, 1);\n                    },\n\n                    /**\n                     * Scroll to the section.\n                     *\n                     * @param {String} tabId\n                     *\n                     * @returns {void}\n                     */\n                     scrollToSection(tabId) {\n                        const section = document.getElementById(tabId);\n\n                        if (section) {\n                            section.scrollIntoView({ behavior: 'smooth' });\n                        }\n                    },\n                },\n            });\n        </script>\n\n        <script type=\"module\">\n            app.component('v-workflow-condition-item', {\n                template: '#v-workflow-condition-item-template',\n\n                props: ['index', 'entityType', 'condition'],\n\n                emits: ['onRemoveCondition'],\n\n                data() {\n                    return {\n                        conditions: @json(app('\\Webkul\\Automation\\Helpers\\Entity')->getConditions()),\n\n                        conditionOperators: {\n                            'price': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-not-equal-to')'\n                                }, {\n                                    'operator': '>=',\n                                    'name': '@lang('admin::app.settings.workflows.create.equals-or-greater-than')'\n                                }, {\n                                    'operator': '<=',\n                                    'name': '@lang('admin::app.settings.workflows.create.equals-or-less-than')'\n                                }, {\n                                    'operator': '>',\n                                    'name': '@lang('admin::app.settings.workflows.create.greater-than')'\n                                }, {\n                                    'operator': '<',\n                                    'name': '@lang('admin::app.settings.workflows.create.less-than')'\n                                }],\n                            'decimal': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-not-equal-to')'\n                                }, {\n                                    'operator': '>=',\n                                    'name': '@lang('admin::app.settings.workflows.create.equals-or-greater-than')'\n                                }, {\n                                    'operator': '<=',\n                                    'name': '@lang('admin::app.settings.workflows.create.equals-or-less-than')'\n                                }, {\n                                    'operator': '>',\n                                    'name': '@lang('admin::app.settings.workflows.create.greater-than')'\n                                }, {\n                                    'operator': '<',\n                                    'name': '@lang('admin::app.settings.workflows.create.less-than')'\n                                }],\n                            'integer': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-not-equal-to')'\n                                }, {\n                                    'operator': '>=',\n                                    'name': '@lang('admin::app.settings.workflows.create.equals-or-greater-than')'\n                                }, {\n                                    'operator': '<=',\n                                    'name': '@lang('admin::app.settings.workflows.create.equals-or-less-than')'\n                                }, {\n                                    'operator': '>',\n                                    'name': '@lang('admin::app.settings.workflows.create.greater-than')'\n                                }, {\n                                    'operator': '<',\n                                    'name': '@lang('admin::app.settings.workflows.create.less-than')'\n                                }],\n                            'text': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-not-equal-to')'\n                                }, {\n                                    'operator': '{}',\n                                    'name': '@lang('admin::app.settings.workflows.create.contain')'\n                                }, {\n                                    'operator': '!{}',\n                                    'name': '@lang('admin::app.settings.workflows.create.does-not-contain')'\n                                }],\n                            'boolean': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-not-equal-to')'\n                                }],\n                            'date': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-not-equal-to')'\n                                }, {\n                                    'operator': '>=',\n                                    'name': '@lang('admin::app.settings.workflows.create.equals-or-greater-than')'\n                                }, {\n                                    'operator': '<=',\n                                    'name': '@lang('admin::app.settings.workflows.create.equals-or-less-than')'\n                                }, {\n                                    'operator': '>',\n                                    'name': '@lang('admin::app.settings.workflows.create.greater-than')'\n                                }, {\n                                    'operator': '<',\n                                    'name': '@lang('admin::app.settings.workflows.create.less-than')'\n                                }],\n                            'datetime': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-not-equal-to')'\n                                }, {\n                                    'operator': '>=',\n                                    'name': '@lang('admin::app.settings.workflows.create.equals-or-greater-than')'\n                                }, {\n                                    'operator': '<=',\n                                    'name': '@lang('admin::app.settings.workflows.create.equals-or-less-than')'\n                                }, {\n                                    'operator': '>',\n                                    'name': '@lang('admin::app.settings.workflows.create.greater-than')'\n                                }, {\n                                    'operator': '<',\n                                    'name': '@lang('admin::app.settings.workflows.create.less-than')'\n                                }],\n                            'select': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-not-equal-to')'\n                                }],\n                            'radio': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-not-equal-to')'\n                                }],\n                            'multiselect': [{\n                                    'operator': '{}',\n                                    'name': '@lang('admin::app.settings.workflows.create.contains')'\n                                }, {\n                                    'operator': '!{}',\n                                    'name': '@lang('admin::app.settings.workflows.create.does-not-contain')'\n                                }],\n                            'checkbox': [{\n                                    'operator': '{}',\n                                    'name': '@lang('admin::app.settings.workflows.create.contains')'\n                                }, {\n                                    'operator': '!{}',\n                                    'name': '@lang('admin::app.settings.workflows.create.does-not-contain')'\n                                }],\n                            'email': [{\n                                    'operator': '{}',\n                                    'name': '@lang('admin::app.settings.workflows.create.contains')'\n                                }, {\n                                    'operator': '!{}',\n                                    'name': '@lang('admin::app.settings.workflows.create.does-not-contain')'\n                                }],\n                            'phone': [{\n                                    'operator': '{}',\n                                    'name': '@lang('admin::app.settings.workflows.create.contains')'\n                                }, {\n                                    'operator': '!{}',\n                                    'name': '@lang('admin::app.settings.workflows.create.does-not-contain')'\n                                }],\n                            'lookup': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.create.is-not-equal-to')'\n                                }],\n                        }\n                    };\n                },\n\n                computed: {\n                    /**\n                     * Get the matched attribute.\n                     *\n                     * @returns {Object}\n                     */\n                    matchedAttribute: function () {\n                        if (this.condition.attribute == '') {\n                            return;\n                        }\n\n                        var self = this;\n\n                        let matchedAttribute = this.conditions[this.entityType].filter(function (attribute) {\n                            return attribute.id == self.condition.attribute;\n                        });\n\n                        if (matchedAttribute[0]['type'] == 'multiselect' || matchedAttribute[0]['type'] == 'checkbox') {\n                            this.condition.operator = '{}';\n\n                            this.condition.value = [];\n                        } else if (matchedAttribute[0]['type'] == 'email' || matchedAttribute[0]['type'] == 'phone') {\n                            this.condition.operator = '{}';\n                        }\n\n                        return matchedAttribute[0];\n                    }\n                },\n\n                methods: {\n                    /**\n                     * Remove the condition.\n                     *\n                     * @returns {void}\n                     */\n                    removeCondition() {\n                        this.$emit('onRemoveCondition', this.condition);\n                    },\n                }\n            });\n        </script>\n\n        <script type=\"module\">\n            app.component('v-workflow-action-item', {\n                template: '#v-workflow-action-item-template',\n\n                props: ['index', 'entityType', 'action'],\n\n                data() {\n                    return {\n                        actions: @json(app('\\Webkul\\Automation\\Helpers\\Entity')->getActions()),\n                    };\n                },\n\n                computed: {\n                    /**\n                     * Get the matched action.\n                     *\n                     * @returns {Object}\n                     */\n                    matchedAction () {\n                        if (this.entityType == '') {\n                            return;\n                        }\n\n                        return this.actions[this.entityType].find(action => action.id == this.action.id);\n                    },\n\n                    /**\n                     * Get the matched attribute.\n                     *\n                     * @return {void}\n                     */\n                    matchedAttribute() {\n                        if (! this.matchedAction) {\n                            return;\n                        }\n\n                        let matchedAttribute = this.matchedAction.attributes.find(attribute => attribute.id == this.action.attribute);\n\n                        if (! matchedAttribute) {\n                            return;\n                        }\n\n                        if (\n                            matchedAttribute['type'] == 'multiselect'\n                            || matchedAttribute['type'] == 'checkbox'\n                        ) {\n                            this.action.value = [];\n                        } else if (\n                            matchedAttribute['type'] == 'email'\n                            || matchedAttribute['type'] == 'phone'\n                        ) {\n                            this.action.value = [{\n                                'label': 'work',\n                                'value': ''\n                            }];\n                        } else if (matchedAttribute['type'] == 'text') {\n                            this.action.value = '';\n                        }\n\n                        return matchedAttribute;\n                    },\n                },\n\n                methods: {\n                    /**\n                     * Remove the action.\n                     *\n                     * @returns {void}\n                     */\n                    removeAction() {\n                        this.$emit('onRemoveAction', this.action);\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n\n    @pushOnce('styles')\n        <style>\n            html {\n                scroll-behavior: smooth;\n            }\n        </style>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/workflows/edit.blade.php",
    "content": "<x-admin::layouts>\n    <x-slot:title>\n        @lang('admin::app.settings.workflows.edit.title')\n    </x-slot>\n\n    {!! view_render_event('admin.activities.edit.form.before') !!}\n\n    <x-admin::form\n        :action=\"route('admin.settings.workflows.update', $workflow->id)\"\n        method=\"PUT\"\n    >\n        <div class=\"flex flex-col gap-4\">\n            <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n                <div class=\"flex flex-col gap-2\">\n                    {!! view_render_event('admin.settings.workflows.edit.breadcrumbs.before', ['workflow' => $workflow]) !!}\n\n                    <x-admin::breadcrumbs\n                        name=\"settings.workflows.edit\"\n                        :entity=\"$workflow\"\n                    />\n\n                    {!! view_render_event('admin.settings.workflows.edit.breadcrumbs.after', ['workflow' => $workflow]) !!}\n\n                    <div class=\"text-xl font-bold dark:text-white\">\n                        @lang('admin::app.settings.workflows.edit.title')\n                    </div>\n                </div>\n\n                <div class=\"flex items-center gap-x-2.5\">\n                    <div class=\"flex items-center gap-x-2.5\">\n                        {!! view_render_event('admin.settings.workflows.edit.save_button.before', ['workflow' => $workflow]) !!}\n\n                        <!-- Save button for person -->\n                        <button\n                            type=\"submit\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.workflows.edit.save-btn')\n                        </button>\n\n                        {!! view_render_event('admin.settings.workflows.edit.save_button.after', ['workflow' => $workflow]) !!}\n                    </div>\n                </div>\n            </div>\n\n            <!-- Workflow Vue Component -->\n            <v-workflow></v-workflow>\n\n            <x-admin::attributes.edit.lookup />\n        </div>\n    </x-admin::form>\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/x-template\"\n            id=\"v-workflow-template\"\n        >\n            <div class=\"box-shadow flex flex-col gap-4 rounded-lg border border-gray-200 bg-white dark:border-gray-800 dark:bg-gray-900\">\n                {!! view_render_event('admin.settings.workflows.edit.form_controls.before') !!}\n\n                <!-- Tab Switcher -->\n                <div class=\"flex w-full gap-2 border-b border-gray-200 dark:border-gray-800\">\n                    <!-- Tabs -->\n                    <template\n                        v-for=\"tab in tabs\"\n                        :key=\"tab.id\"\n                    >\n                        <a\n                            :href=\"'#' + tab.id\"\n                            :class=\"[\n                                'inline-block px-3 py-2.5 border-b-2  text-sm font-medium ',\n                                activeTab === tab.id\n                                ? 'text-brandColor border-brandColor dark:brandColor dark:brandColor'\n                                : 'text-gray-600 dark:text-gray-300  border-transparent hover:text-gray-800 hover:border-gray-400 dark:hover:border-gray-400  dark:hover:text-white'\n                            ]\"\n                            @click=\"scrollToSection(tab.id)\"\n                            :text=\"tab.label\"\n                        ></a>\n                    </template>\n                </div>\n\n                <div class=\"flex flex-col gap-4 px-4 py-2\">\n                    {!! view_render_event('admin.settings.workflows.edit.basic_details.before', ['workflow' => $workflow]) !!}\n\n                    <!-- Basic Details -->\n                    <div\n                        class=\"flex flex-col gap-4\"\n                        id=\"basic-details\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.settings.workflows.edit.basic-details')\n                            </p>\n\n                            <p class=\"text-gray-600 dark:text-white\">\n                                @lang('admin::app.settings.workflows.edit.basic-details-info')\n                            </p>\n                        </div>\n\n                        <div class=\"w-1/2 max-md:w-full\">\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.workflows.edit.name')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"text\"\n                                    name=\"name\"\n                                    id=\"name\"\n                                    :value=\"old('name') ?? $workflow->name\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.workflows.edit.name')\"\n                                    :placeholder=\"trans('admin::app.settings.workflows.edit.name')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"name\" />\n                            </x-admin::form.control-group>\n\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label>\n                                    @lang('admin::app.settings.workflows.edit.description')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"textarea\"\n                                    name=\"description\"\n                                    id=\"description\"\n                                    rows=\"5\"\n                                    :value=\"old('description') ?? $workflow->description\"\n                                    :label=\"trans('admin::app.settings.workflows.edit.description')\"\n                                    :placeholder=\"trans('admin::app.settings.workflows.edit.description')\"\n                                />\n\n                                <x-admin::form.control-group.error control-name=\"description\" />\n                            </x-admin::form.control-group>\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.settings.workflows.edit.basic_details.after', ['workflow' => $workflow]) !!}\n\n                    {!! view_render_event('admin.settings.workflows.edit.event.before', ['workflow' => $workflow]) !!}\n\n                    <!-- Event -->\n                    <div\n                        class=\"flex flex-col gap-4\"\n                        id=\"event\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.settings.workflows.edit.event')\n                            </p>\n\n                            <p class=\"text-gray-600 dark:text-white\">\n                                @lang('admin::app.settings.workflows.edit.event-info')\n                            </p>\n                        </div>\n\n                        <!-- Hidden Entity Type -->\n                        <input\n                            type=\"hidden\"\n                            name=\"entity_type\"\n                            :value=\"entityType\"\n                        />\n\n                        <div class=\"w-1/2 max-md:w-full\">\n                            <!-- Event -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label class=\"required\">\n                                    @lang('admin::app.settings.workflows.edit.event')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    id=\"event\"\n                                    name=\"event\"\n                                    ::value=\"event\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.workflows.edit.event')\"\n                                    :placeholder=\"trans('admin::app.settings.workflows.edit.event')\"\n                                    v-model=\"event\"\n                                >\n                                    <optgroup\n                                        v-for='entity in events'\n                                        :label=\"entity.name\"\n                                    >\n                                        <option\n                                            v-for='event in entity.events'\n                                            :value=\"event.event\"\n                                            :text=\"event.name\"\n                                        ></option>\n                                    </optgroup>\n                                </x-admin::form.control-group.control>\n\n                                <x-admin::form.control-group.error control-name=\"event\" />\n                            </x-admin::form.control-group>\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.settings.workflows.edit.event.after', ['workflow' => $workflow]) !!}\n\n                    {!! view_render_event('admin.settings.workflows.edit.condition.before', ['workflow' => $workflow]) !!}\n\n                    <!-- Conditions -->\n                    <div\n                        class=\"flex flex-col gap-4\"\n                        id=\"conditions\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.settings.workflows.edit.conditions')\n                            </p>\n\n                            <p class=\"text-gray-600 dark:text-white\">\n                                @lang('admin::app.settings.workflows.edit.conditions-info')\n                            </p>\n                        </div>\n\n                        <div class=\"flex w-1/2 flex-col gap-2 max-md:w-full\">\n                            <!-- Condition Type -->\n                            <x-admin::form.control-group>\n                                <x-admin::form.control-group.label>\n                                    @lang('admin::app.settings.workflows.edit.condition-type')\n                                </x-admin::form.control-group.label>\n\n                                <x-admin::form.control-group.control\n                                    type=\"select\"\n                                    class=\"ltr:pr-10 rtl:pl-10\"\n                                    id=\"condition_type\"\n                                    name=\"condition_type\"\n                                    v-model=\"conditionType\"\n                                    rules=\"required\"\n                                    :label=\"trans('admin::app.settings.workflows.edit.condition-type')\"\n                                    :placeholder=\"trans('admin::app.settings.workflows.edit.condition-type')\"\n                                >\n                                    <option value=\"and\">\n                                        @lang('admin::app.settings.workflows.edit.all-condition-are-true')\n                                    </option>\n\n                                    <option value=\"or\">\n                                        @lang('admin::app.settings.workflows.edit.any-condition-are-true')\n                                    </option>\n                                </x-admin::form.control-group.control>\n\n                                <x-admin::form.control-group.error control-name=\"condition_type\" />\n                            </x-admin::form.control-group>\n\n                            <!-- Workflow Condition Vue Component. -->\n                            <template\n                                v-for='(condition, index) in conditions'\n                                :key=\"index\"\n                            >\n                                <v-workflow-condition-item\n                                    :entityType=\"entityType\"\n                                    :condition=\"condition\"\n                                    :index=\"index\"\n                                    @onRemoveCondition=\"removeCondition($event)\"\n                                ></v-workflow-condition-item>\n                            </template>\n\n                            <button\n                                type=\"button\"\n                                class=\"flex max-w-max items-center gap-2 text-brandColor\"\n                                @click=\"addCondition\"\n                            >\n                                <i class=\"icon-add text-md !text-brandColor\"></i>\n\n                                @lang('admin::app.settings.workflows.edit.add-condition')\n                            </button>\n                        </div>\n                    </div>\n\n                    {!! view_render_event('admin.settings.workflows.edit.condition.after', ['workflow' => $workflow]) !!}\n\n                    {!! view_render_event('admin.settings.workflows.edit.action.before', ['workflow' => $workflow]) !!}\n\n                    <!-- Actions -->\n                    <div\n                        class=\"flex flex-col gap-4\"\n                        id=\"actions\"\n                    >\n                        <div class=\"flex flex-col gap-1\">\n                            <p class=\"text-base font-semibold dark:text-white\">\n                                @lang('admin::app.settings.workflows.edit.actions')\n                            </p>\n\n                            <p class=\"text-gray-600 dark:text-white\">\n                                @lang('admin::app.settings.workflows.edit.actions-info')\n                            </p>\n                        </div>\n\n                        <div class=\"block w-full\">\n                            <x-admin::table class=\"!w-1/2 !table-auto\">\n                                <!-- Table Head -->\n                                <x-admin::table.thead>\n                                    <x-admin::table.thead.tr>\n                                        <x-admin::table.th class=\"text-center\">\n                                            @lang('admin::app.settings.workflows.edit.type')\n                                        </x-admin::table.th>\n\n                                        <x-admin::table.th class=\"text-center\">\n                                            @lang('admin::app.settings.workflows.edit.name')\n                                        </x-admin::table.th>\n\n                                        <x-admin::table.th></x-admin::table.th>\n                                    </x-admin::table.thead.tr>\n                                </x-admin::table.thead>\n\n                                <!-- Table Body -->\n                                <x-admin::table.tbody>\n                                    <template\n                                        v-for='(action, index) in actions'\n                                        :key=\"index\"\n                                    >\n                                        <v-workflow-action-item\n                                            :entityType=\"entityType\"\n                                            :action=\"action\"\n                                            :index=\"index\"\n                                            @onRemoveAction=\"removeAction($event)\"\n                                        ></v-workflow-action-item>\n                                    </template>\n                                </x-admin::table.tbody>\n                            </x-admin::table>\n                        </div>\n\n                        <button\n                            type=\"button\"\n                            class=\"first-line:text-md flex max-w-max items-center gap-2 text-brandColor\"\n                            @click=\"addAction\"\n                        >\n                            <i class=\"icon-add\"></i>\n\n                            @lang('admin::app.settings.workflows.edit.add-action')\n                        </button>\n                    </div>\n\n                    {!! view_render_event('admin.settings.workflows.edit.action.after', ['workflow' => $workflow]) !!}\n                </div>\n\n                {!! view_render_event('admin.settings.workflows.edit.form_controls.after') !!}\n            </div>\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-workflow-condition-item-template\"\n        >\n            <div class=\"flex items-center justify-between gap-4\">\n                <div class=\"flex flex-1 gap-4 max-sm:flex-1 max-sm:flex-wrap\">\n                    <!-- Select main condition. -->\n                    <select\n                        :name=\"['conditions[' + index + '][attribute]']\"\n                        :id=\"['conditions[' + index + '][attribute]']\"\n                        class=\"custom-select min:w-1/3 flex h-10 w-1/3 rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 max-sm:max-w-full max-sm:flex-auto\"\n                        v-model=\"condition.attribute\"\n                    >\n                        <option\n                            v-for=\"attribute in conditions[entityType]\"\n                            :value=\"attribute.id\"\n                            :text=\"attribute.name\"\n                        ></option>\n                    </select>\n\n                    <template v-if=\"matchedAttribute\">\n                        <select\n                            :name=\"['conditions[' + index + '][operator]']\"\n                            :id=\"['conditions[' + index + '][operator]']\"\n                            class=\"custom-select min:w-1/3 inline-flex h-10 w-1/3 items-center justify-between gap-x-1 rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 max-sm:max-w-full max-sm:flex-auto\"\n                            v-model=\"condition.operator\"\n                        >\n                            <option\n                                v-for='operator in conditionOperators[matchedAttribute.type]'\n                                :value=\"operator.operator\"\n                                :text=\"operator.name\"\n                            ></option>\n                        </select>\n                    </template>\n\n                    <template v-if=\"matchedAttribute\">\n                        <!-- Text, Price, Decimal, Integer, Email, Phone -->\n                        <input\n                            type=\"hidden\"\n                            :name=\"['conditions[' + index + '][attribute_type]']\"\n                            v-model=\"matchedAttribute.type\"\n                        >\n\n                        <template\n                            v-if=\"\n                                matchedAttribute.type == 'text'\n                                || matchedAttribute.type == 'price'\n                                || matchedAttribute.type == 'decimal'\n                                || matchedAttribute.type == 'integer'\n                                || matchedAttribute.type == 'email'\n                                || matchedAttribute.type == 'phone'\n                            \"\n                        >\n                            <v-field\n                                :name=\"`conditions[${index}][value]`\"\n                                v-slot=\"{ field, errorMessage }\"\n                                label=\"@lang('admin::app.settings.workflows.edit.value')\"\n                                :id=\"`conditions[${index}][value]`\"\n                                :rules=\"\n                                    matchedAttribute.type == 'price' ? 'regex:^[0-9]+(\\\\.[0-9]+)?$' : ''\n                                    || matchedAttribute.type == 'decimal' ? 'regex:^[0-9]+(\\\\.[0-9]+)?$' : ''\n                                    || matchedAttribute.type == 'integer' ? 'regex:^[0-9]+$' : ''\n                                    || matchedAttribute.type == 'text' ? 'regex:^.*$' : ''\n                                    || matchedAttribute.type == 'email' ? 'email' : ''\n                                \"\n                                v-model=\"condition.value\"\n                            >\n                                <input\n                                    type=\"text\"\n                                    v-bind=\"field\"\n                                    :class=\"{ 'border border-red-500': errorMessage }\"\n                                    class=\"min:w-1/3 flex h-10 w-1/3 rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                />\n                            </v-field>\n\n                            <v-error-message\n                                :name=\"`conditions[${index}][value]`\"\n                                class=\"mt-1 text-xs italic text-red-500\"\n                                as=\"p\"\n                            >\n                            </v-error-message>\n                        </template>\n\n                        <!-- Date -->\n                        <template v-if=\"matchedAttribute.type == 'date'\">\n                            <x-admin::flat-picker.date\n                                class=\"!w-1/3\"\n                                ::allow-input=\"false\"\n                            >\n                                <input\n                                    type=\"date\"\n                                    class=\"min:w-1/3 flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                    :name=\"['conditions[' + index + '][value]']\"\n                                    v-model=\"condition.value\"\n                                />\n                            </x-admin::flat-picker.date>\n                        </template>\n\n                        <!-- Datetime -->\n                        <template v-if=\"matchedAttribute.type == 'datetime'\">\n                            <x-admin::flat-picker.date\n                                class=\"!w-1/3\"\n                                ::allow-input=\"false\"\n                            >\n                                <input\n                                    type=\"datetime\"\n                                    class=\"min:w-1/3 flex w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                    :name=\"['conditions[' + index + '][value]']\"\n                                    v-model=\"condition.value\"\n                                />\n                            </x-admin::flat-picker.date>\n                        </template>\n\n                        <!-- Boolean -->\n                        <template v-if=\"matchedAttribute.type == 'boolean'\">\n                            <select\n                                :name=\"['conditions[' + index + '][value]']\"\n                                class=\"custom-select inline-flex h-10 w-1/3 items-center justify-between gap-x-1 rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 max-sm:max-w-full max-sm:flex-auto\"\n                                v-model=\"condition.value\"\n                            >\n                                <option value=\"1\">\n                                    @lang('admin::app.settings.workflows.edit.yes')\n                                </option>\n\n                                <option value=\"0\">\n                                    @lang('admin::app.settings.workflows.edit.no')\n                                </option>\n                            </select>\n                        </template>\n\n                        <!-- Lookup Type -->\n                        <template\n                            v-if=\"\n                                matchedAttribute.type == 'select'\n                                || matchedAttribute.type == 'radio'\n                                || matchedAttribute.type == 'lookup'\n                            \"\n                        >\n                            <template v-if=\"! matchedAttribute.lookup_type\">\n                                <select\n                                    :name=\"['conditions[' + index + '][value]']\"\n                                    class=\"custom-select inline-flex h-10 w-1/3 items-center justify-between gap-x-1 rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                    v-model=\"condition.value\"\n                                >\n                                    <option\n                                        v-for='option in matchedAttribute.options'\n                                        :value=\"option.id\"\n                                        :text=\"option.name\"\n                                    ></option>\n                                </select>\n                            </template>\n\n                            <template v-else>\n                                <div class=\"w-1/3\">\n                                    <v-lookup-component\n                                        :attribute=\"{'code': 'conditions[' + index + '][value]', 'name': matchedAttribute?.name, 'lookup_type': matchedAttribute.lookup_type}\"\n                                        validations=\"required\"\n                                        :value=\"{\n                                            id: condition.value\n                                        }\"\n                                        can-add-new=\"true\"\n                                    ></v-lookup-component>\n\n                                    <x-admin::form.control-group.error ::name=\"`conditions[${index}][value]`\"/>\n                                </div>\n                            </template>\n                        </template>\n\n                        <!-- Multiselect and Checkbox -->\n                        <template\n                            v-if=\"matchedAttribute.type == 'multiselect'\n                            || matchedAttribute.type == 'checkbox'\"\n                        >\n                            <select\n                                :name=\"['conditions[' + index + '][value][]']\"\n                                class=\"min:w-1/3 inline-flex h-20 w-1/3 items-center justify-between gap-x-1 rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                v-model=\"condition.value\"\n                                multiple\n                            >\n                                <option\n                                    v-for='option in matchedAttribute.options'\n                                    :value=\"option.id\"\n                                    :text=\"option.name\"\n                                ></option>\n                            </select>\n                        </template>\n\n                        <!-- Textarea -->\n                        <template v-if=\"matchedAttribute.type == 'textarea'\">\n                            <textarea\n                                :name=\"['conditions[' + index + '][value]']\"\n                                :id=\"['conditions[' + index + '][value]']\"\n                                v-model=\"condition.value\"\n                                class=\"min:w-1/3 w-1/3 rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                            ></textarea>\n                        </template>\n                    </template>\n                </div>\n\n                <!-- Remove Conditions -->\n                <span\n                    class=\"icon-delete max-h-9 max-w-9 cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950 max-sm:place-self-center\"\n                    @click=\"removeCondition\"\n                ></span>\n            </div>\n        </script>\n\n        <script\n            type=\"text/x-template\"\n            id=\"v-workflow-action-item-template\"\n        >\n            <!-- Table Body -->\n            <x-admin::table.thead.tr>\n                <x-admin::table.td>\n                    <select\n                        :name=\"['actions[' + index + '][id]']\"\n                        :id=\"['actions[' + index + '][id]']\"\n                        class=\"custom-select flex h-10 w-full rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 max-sm:max-w-full max-sm:flex-auto\"\n                        v-model=\"action.id\"\n                    >\n                        <option\n                            v-for='action in actions[entityType]'\n                            :value=\"action.id\"\n                            :text=\"action.name\"\n                        ></option>\n                    </select>\n                </x-admin::table.td>\n\n                <x-admin::table.td>\n                    <div class=\"flex items-center justify-between gap-4\">\n                        <div class=\"flex w-full items-center justify-between gap-4\">\n                            <template v-if=\"matchedAction && matchedAction.attributes\">\n                                <!-- Mattched Attribute -->\n                                <select\n                                    :name=\"['actions[' + index + '][attribute]']\"\n                                    :id=\"['actions[' + index + '][attribute]']\"\n                                    class=\"custom-select inline-flex h-10 w-full items-center justify-between gap-x-1 rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 max-sm:max-w-full max-sm:flex-auto\"\n                                    v-model=\"action.attribute\"\n                                >\n                                    <option\n                                        v-for='attribute in matchedAction.attributes'\n                                        :value=\"attribute.id\"\n                                        :text=\"attribute.name\"\n                                    ></option>\n                                </select>\n\n                                <template v-if=\"matchedAttribute\">\n                                    <input\n                                        type=\"hidden\"\n                                        :name=\"['actions[' + index + '][attribute_type]']\"\n                                        v-model=\"matchedAttribute.type\"\n                                    >\n\n                                    <!-- Text, Price, Decimal and Integer -->\n                                    <template\n                                        v-if=\"\n                                            matchedAttribute.type == 'text'\n                                            || matchedAttribute.type == 'price'\n                                            || matchedAttribute.type == 'decimal'\n                                            || matchedAttribute.type == 'integer'\n                                        \"\n                                    >\n                                        <v-field\n                                            :name=\"`actions[${index}][value]`\"\n                                            v-slot=\"{ field, errorMessage }\"\n                                            :id=\"`actions[${index}][value]`\"\n                                            :rules=\"\n                                                matchedAttribute.type == 'price' ? 'regex:^[0-9]+(\\\\.[0-9]+)?$' : ''\n                                                || matchedAttribute.type == 'decimal' ? 'regex:^[0-9]+(\\\\.[0-9]+)?$' : ''\n                                                || matchedAttribute.type == 'integer' ? 'regex:^[0-9]+$' : ''\n                                                || matchedAttribute.type == 'text' ? 'regex:^.*$' : ''\n                                            \"\n                                            v-model=\"action.value\"\n                                        >\n                                            <input\n                                                type=\"text\"\n                                                v-bind=\"field\"\n                                                :class=\"{ 'border border-red-500': errorMessage }\"\n                                                class=\"flex h-10 w-full rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                            />\n                                        </v-field>\n\n                                        <v-error-message\n                                            :name=\"`actions[${index}][value]`\"\n                                            class=\"mt-1 text-xs italic text-red-500\"\n                                            as=\"p\"\n                                        >\n                                        </v-error-message>\n                                    </template>\n\n                                    <!-- Email and Phone -->\n                                    <template\n                                        v-if=\"\n                                            matchedAttribute.type == 'email'\n                                            || matchedAttribute.type == 'phone'\n                                        \"\n                                    >\n                                        <input\n                                            type=\"hidden\"\n                                            :name=\"['actions[' + index + '][value][0][value]']\"\n                                            value=\"work\"\n                                        />\n\n                                        <input\n                                            type=\"email\"\n                                            :name=\"`actions[${index}][value][0][value]`\"\n                                            :id=\"`actions[${index}][value][0][value]`\"\n                                            class=\"flex h-10 w-full rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                            v-model=\"action.value[0].value\"\n                                        />\n                                    </template>\n\n                                    <!-- Textarea -->\n                                    <template v-if=\"matchedAttribute.type == 'textarea'\">\n                                        <textarea\n                                            :name=\"['actions[' + index + '][value]']\"\n                                            :id=\"['actions[' + index + '][value]']\"\n                                            v-model=\"action.value\"\n                                            class=\"w-full rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                        ></textarea>\n                                    </template>\n\n                                    <!-- Date Picker -->\n                                    <template v-if=\"matchedAttribute.type == 'date'\">\n                                        <x-admin::flat-picker.date\n                                            class=\"!w-full\"\n                                            ::allow-input=\"false\"\n                                        >\n                                            <input\n                                                type=\"date\"\n                                                class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                                :name=\"['actions[' + index + '][value]']\"\n                                                v-model=\"action.value\"\n                                            />\n                                        </x-admin::flat-picker.date>\n                                    </template>\n\n                                    <!-- Date Time Picker -->\n                                    <template v-if=\"matchedAttribute.type == 'datetime'\">\n                                        <x-admin::flat-picker.date\n                                            class=\"!w-full\"\n                                            ::allow-input=\"false\"\n                                        >\n                                            <input\n                                                type=\"datetime\"\n                                                class=\"flex min-h-[39px] w-full rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                                :name=\"['actions[' + index + '][value]']\"\n                                                v-model=\"action.value\"\n                                            />\n                                        </x-admin::flat-picker.date>\n                                    </template>\n\n                                    <!-- Boolean -->\n                                    <template v-if=\"matchedAttribute.type == 'boolean'\">\n                                        <select\n                                            :name=\"['actions[' + index + '][value]']\"\n                                            class=\"custom-select inline-flex h-10 w-full items-center justify-between gap-x-1 rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 max-sm:max-w-full max-sm:flex-auto\"\n                                            v-model=\"action.value\"\n                                        >\n                                            <option value=\"1\">\n                                                @lang('admin::app.settings.workflows.edit.yes')\n                                            </option>\n\n                                            <option value=\"0\">\n                                                @lang('admin::app.settings.workflows.edit.no')\n                                            </option>\n                                        </select>\n                                    </template>\n\n                                    <!-- Select, Radio and Lookup -->\n                                    <template\n                                        v-if=\"\n                                            matchedAttribute.type == 'select'\n                                            || matchedAttribute.type == 'radio'\n                                            || matchedAttribute.type == 'lookup'\n                                        \"\n                                    >\n                                        <!-- Attribute Options -->\n                                        <template v-if=\"! matchedAttribute.lookup_type\">\n                                            <select\n                                                :name=\"['actions[' + index + '][value]']\"\n                                                class=\"custom-select inline-flex h-10 w-full items-center justify-between gap-x-1 rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400\"\n                                                v-model=\"action.value\"\n                                            >\n                                                <option\n                                                    v-for='option in matchedAttribute.options'\n                                                    :value=\"option.id\"\n                                                    :text=\"option.name\"\n                                                ></option>\n                                            </select>\n                                        </template>\n\n                                        <!-- Look vue component -->\n                                        <template v-else>\n                                            <div class=\"w-full\">\n                                                <v-lookup-component\n                                                    :attribute=\"{'code': 'actions[' + index + '][value]', 'name': matchedAttribute?.name, 'lookup_type': matchedAttribute.lookup_type}\"\n                                                    validations=\"required\"\n                                                    :value=\"{\n                                                        id: action.value\n                                                    }\"\n                                                    can-add-new=\"true\"\n                                                ></v-lookup-component>\n\n                                                <x-admin::form.control-group.error ::name=\"`actions[${index}][value]`\"/>\n                                            </div>\n                                        </template>\n                                    </template>\n\n                                    <!-- Attribute Options -->\n                                    <template v-if=\"this.matchedAttribute.type === 'multiselect' || this.matchedAttribute.type === 'checkbox'\">\n                                        <select\n                                            :name=\"`actions[${index}][value][]`\"\n                                            class=\"inline-flex h-20 w-full items-center justify-between gap-x-1 rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                            v-model=\"action.value\"\n                                            multiple\n                                        >\n                                            <option\n                                                v-for=\"option in matchedAttribute.options\"\n                                                :key=\"option.id\"\n                                                :value=\"option.id\"\n                                                :text=\"option.name\"\n                                            ></option>\n                                        </select>\n                                    </template>\n                                </template>\n                            </template>\n\n                            <template v-if=\"matchedAction && matchedAction.options\">\n                                <select\n                                    :name=\"`actions[${index}][value]`\"\n                                    class=\"custom-select flex h-10 w-full rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 max-sm:max-w-full max-sm:flex-auto\"\n                                    v-model=\"action.value\"\n                                >\n                                    <option\n                                        v-for='option in matchedAction.options'\n                                        :value=\"option.id\"\n                                        :text=\"option.name\"\n                                    ></option>\n                                </select>\n                            </template>\n\n                            <template\n                                v-if=\"\n                                    matchedAction\n                                    && ! matchedAction.attributes\n                                    && ! matchedAction.options\n                                    && ! matchedAction.request_methods\n                                \"\n                            >\n                                <v-field\n                                    :name=\"`actions[${index}][value]`\"\n                                    :id=\"`actions[${index}][value]`\"\n                                    v-slot=\"{ field, errorMessage }\"\n                                    v-model=\"action.value\"\n                                >\n                                    <input\n                                        type=\"text\"\n                                        v-bind=\"field\"\n                                        :class=\"{ 'border border-red-500': errorMessage }\"\n                                        class=\"flex h-10 w-full rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                                    />\n                                </v-field>\n\n                                <v-error-message\n                                    :name=\"`actions[${index}][value]`\"\n                                    class=\"mt-1 text-xs italic text-red-500\"\n                                    as=\"p\"\n                                >\n                                </v-error-message>\n                            </template>\n                        </div>\n                    </div>\n                </x-admin::table.td>\n\n                <x-admin::table.td class=\"text-right\">\n                    <span\n                        class=\"icon-delete cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-100 dark:hover:bg-gray-950\"\n                        @click=\"removeAction\"\n                    ></span>\n                </x-admin::table.td>\n            </x-admin::table.thead.tr>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-workflow', {\n                template: '#v-workflow-template',\n\n                data() {\n                    return {\n                        events: @json(app('\\Webkul\\Automation\\Helpers\\Entity')->getEvents()),\n\n                        event: '{{ $workflow->event }}',\n\n                        conditionType: '{{ $workflow->condition_type }}',\n\n                        conditions: @json($workflow->conditions ?: []),\n\n                        actions: @json($workflow->actions ?: []),\n\n                        activeTab: 'basic-details',\n\n                        tabs: [\n                            { id: 'basic-details', label: '@lang('admin::app.settings.workflows.create.basic-details')' },\n                            { id: 'event', label: '@lang('admin::app.settings.workflows.create.event')' },\n                            { id: 'conditions', label: '@lang('admin::app.settings.workflows.create.conditions')' },\n                            { id: 'actions', label: '@lang('admin::app.settings.workflows.create.actions')' }\n                        ],\n                    };\n                },\n\n                computed: {\n                    /**\n                     * Get the entity type.\n                     *\n                     * @return {String}\n                     */\n                     entityType: function () {\n                        if (this.event == '') {\n                            return '';\n                        }\n\n                        var entityType = '';\n\n                        for (let id in this.events) {\n                            this.events[id].events.forEach((eventTemp) => {\n                                if (eventTemp.event == this.event) {\n                                    entityType = id;\n                                }\n                            });\n                        }\n\n                        return entityType;\n                    }\n                },\n\n                watch: {\n                    /**\n                     * Watch the entity Type.\n                     *\n                     * @return {void}\n                     */\n                    entityType(newValue, oldValue) {\n                        this.conditions = [];\n\n                        this.actions = [];\n                    }\n                },\n\n                methods: {\n                    /**\n                     * Add the condition.\n                     *\n                     * @returns {void}\n                     */\n                    addCondition() {\n                        this.conditions.push({\n                            'attribute': '',\n                            'operator': '==',\n                            'value': '',\n                        });\n                    },\n\n                    /**\n                     * Remove the condition.\n                     *\n                     * @param {Object} condition\n                     * @returns {void}\n                     */\n                    removeCondition(condition) {\n                        let index = this.conditions.indexOf(condition);\n\n                        this.conditions.splice(index, 1);\n                    },\n\n                    /**\n                     * Add the action.\n                     *\n                     * @returns {void}\n                     */\n                    addAction() {\n                        this.actions.push({\n                            'id': '',\n                            'attribute': '',\n                            'value': '',\n                        });\n                    },\n\n                    /**\n                     * Remove the action.\n                     *\n                     * @param {Object} action\n                     * @returns {void}\n                     */\n                    removeAction(action) {\n                        let index = this.actions.indexOf(action)\n\n                        this.actions.splice(index, 1);\n                    },\n\n                    /**\n                     * Scroll to the section.\n                     *\n                     * @param {String} tabId\n                     *\n                     * @returns {void}\n                     */\n                     scrollToSection(tabId) {\n                        const section = document.getElementById(tabId);\n\n                        if (section) {\n                            section.scrollIntoView({ behavior: 'smooth' });\n                        }\n                    },\n                },\n            });\n        </script>\n\n        <script type=\"module\">\n            app.component('v-workflow-condition-item', {\n                template: '#v-workflow-condition-item-template',\n\n                props: ['index', 'entityType', 'condition'],\n\n                emits: ['onRemoveCondition'],\n\n                data() {\n                    return {\n                        conditions: @json(app('\\Webkul\\Automation\\Helpers\\Entity')->getConditions()),\n\n                        conditionOperators: {\n                            'price': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-not-equal-to')'\n                                }, {\n                                    'operator': '>=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.equals-or-greater-than')'\n                                }, {\n                                    'operator': '<=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.equals-or-less-than')'\n                                }, {\n                                    'operator': '>',\n                                    'name': '@lang('admin::app.settings.workflows.edit.greater-than')'\n                                }, {\n                                    'operator': '<',\n                                    'name': '@lang('admin::app.settings.workflows.edit.less-than')'\n                                }],\n                            'decimal': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-not-equal-to')'\n                                }, {\n                                    'operator': '>=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.equals-or-greater-than')'\n                                }, {\n                                    'operator': '<=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.equals-or-less-than')'\n                                }, {\n                                    'operator': '>',\n                                    'name': '@lang('admin::app.settings.workflows.edit.greater-than')'\n                                }, {\n                                    'operator': '<',\n                                    'name': '@lang('admin::app.settings.workflows.edit.less-than')'\n                                }],\n                            'integer': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-not-equal-to')'\n                                }, {\n                                    'operator': '>=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.equals-or-greater-than')'\n                                }, {\n                                    'operator': '<=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.equals-or-less-than')'\n                                }, {\n                                    'operator': '>',\n                                    'name': '@lang('admin::app.settings.workflows.edit.greater-than')'\n                                }, {\n                                    'operator': '<',\n                                    'name': '@lang('admin::app.settings.workflows.edit.less-than')'\n                                }],\n                            'text': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-not-equal-to')'\n                                }, {\n                                    'operator': '{}',\n                                    'name': '@lang('admin::app.settings.workflows.edit.contain')'\n                                }, {\n                                    'operator': '!{}',\n                                    'name': '@lang('admin::app.settings.workflows.edit.does-not-contain')'\n                                }],\n                            'boolean': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-not-equal-to')'\n                                }],\n                            'date': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-not-equal-to')'\n                                }, {\n                                    'operator': '>=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.equals-or-greater-than')'\n                                }, {\n                                    'operator': '<=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.equals-or-less-than')'\n                                }, {\n                                    'operator': '>',\n                                    'name': '@lang('admin::app.settings.workflows.edit.greater-than')'\n                                }, {\n                                    'operator': '<',\n                                    'name': '@lang('admin::app.settings.workflows.edit.less-than')'\n                                }],\n                            'datetime': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-not-equal-to')'\n                                }, {\n                                    'operator': '>=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.equals-or-greater-than')'\n                                }, {\n                                    'operator': '<=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.equals-or-less-than')'\n                                }, {\n                                    'operator': '>',\n                                    'name': '@lang('admin::app.settings.workflows.edit.greater-than')'\n                                }, {\n                                    'operator': '<',\n                                    'name': '@lang('admin::app.settings.workflows.edit.less-than')'\n                                }],\n                            'select': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-not-equal-to')'\n                                }],\n                            'radio': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-not-equal-to')'\n                                }],\n                            'multiselect': [{\n                                    'operator': '{}',\n                                    'name': '@lang('admin::app.settings.workflows.edit.contains')'\n                                }, {\n                                    'operator': '!{}',\n                                    'name': '@lang('admin::app.settings.workflows.edit.does-not-contain')'\n                                }],\n                            'checkbox': [{\n                                    'operator': '{}',\n                                    'name': '@lang('admin::app.settings.workflows.edit.contains')'\n                                }, {\n                                    'operator': '!{}',\n                                    'name': '@lang('admin::app.settings.workflows.edit.does-not-contain')'\n                                }],\n                            'email': [{\n                                    'operator': '{}',\n                                    'name': '@lang('admin::app.settings.workflows.edit.contains')'\n                                }, {\n                                    'operator': '!{}',\n                                    'name': '@lang('admin::app.settings.workflows.edit.does-not-contain')'\n                                }],\n                            'phone': [{\n                                    'operator': '{}',\n                                    'name': '@lang('admin::app.settings.workflows.edit.contains')'\n                                }, {\n                                    'operator': '!{}',\n                                    'name': '@lang('admin::app.settings.workflows.edit.does-not-contain')'\n                                }],\n                            'lookup': [{\n                                    'operator': '==',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-equal-to')'\n                                }, {\n                                    'operator': '!=',\n                                    'name': '@lang('admin::app.settings.workflows.edit.is-not-equal-to')'\n                                }],\n                        }\n                    };\n                },\n\n                computed: {\n                    /**\n                     * Get the matched attribute.\n                     *\n                     * @returns {Object}\n                     */\n                    matchedAttribute() {\n                        if (this.condition.attribute == '') {\n                            return;\n                        }\n\n                        let matchedAttribute = this.conditions[this.entityType].find(attribute => attribute.id == this.condition.attribute);\n\n                        if (\n                            matchedAttribute['type'] == 'multiselect'\n                            || matchedAttribute['type'] == 'checkbox'\n                        ) {\n                            if (! this.condition.operator) {\n                                this.condition.operator = '{}';\n                            }\n\n                            if (! this.condition.value) {\n                                this.condition.value = [];\n                            }\n                        } else if (\n                            matchedAttribute['type'] == 'email'\n                            || matchedAttribute['type'] == 'phone'\n                        ) {\n                            this.condition.operator = '{}';\n                        }\n\n                        return matchedAttribute;\n                    },\n                },\n\n                methods: {\n                    /**\n                     * Remove the condition.\n                     *\n                     * @returns {void}\n                     */\n                    removeCondition() {\n                        this.$emit('onRemoveCondition', this.condition);\n                    },\n                }\n            });\n        </script>\n\n        <script type=\"module\">\n            app.component('v-workflow-action-item', {\n                template: '#v-workflow-action-item-template',\n\n                props: ['index', 'entityType', 'action'],\n\n                data() {\n                    return {\n                        actions: @json(app('\\Webkul\\Automation\\Helpers\\Entity')->getActions()),\n                    };\n                },\n\n                computed: {\n                    /**\n                     * Get the matched action.\n                     *\n                     * @returns {Object}\n                     */\n                    matchedAction () {\n                        if (this.entityType == '') {\n                            return;\n                        }\n\n                        return this.actions[this.entityType].find(action => action.id == this.action.id);\n                    },\n\n                    /**\n                     * Get the matched attribute.\n                     *\n                     * @return {void}\n                     */\n                    matchedAttribute() {\n                        if (! this.matchedAction) {\n                            return;\n                        }\n\n                        let matchedAttribute = this.matchedAction.attributes.find(attribute => attribute.id == this.action.attribute);\n\n                        if (! matchedAttribute) {\n                            return;\n                        }\n\n                        if (\n                            matchedAttribute['type'] == 'multiselect'\n                            || matchedAttribute['type'] == 'checkbox'\n                        ) {\n                            if (! this.action.value) {\n                                this.action.value = [];\n                            }\n                        } else if (\n                            matchedAttribute['type'] == 'email'\n                            || matchedAttribute['type'] == 'phone'\n                        ) {\n                            if (! this.action.value) {\n                                this.action.value = [{\n                                    'label': 'work',\n                                    'value': ''\n                                }];\n                            }\n                        } else if (matchedAttribute['type'] == 'text') {\n                            if (! this.action.value) {\n                                this.action.value = '';\n                            }\n                        }\n\n                        return matchedAttribute;\n                    },\n                },\n\n                methods: {\n                    /**\n                     * Remove the action.\n                     *\n                     * @returns {void}\n                     */\n                    removeAction() {\n                        this.$emit('onRemoveAction', this.action);\n                    },\n                },\n            });\n        </script>\n    @endPushOnce\n\n    @pushOnce('styles')\n        <style>\n            html {\n                scroll-behavior: smooth;\n            }\n        </style>\n    @endPushOnce\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/settings/workflows/index.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page Title -->\n    <x-slot:title>\n        @lang('admin::app.settings.workflows.index.title')\n    </x-slot>\n\n    <div class=\"flex flex-col gap-4\">\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.settings.workflows.index.breadcrumbs.before') !!}\n\n                <!-- Breadcrumbs -->\n                <x-admin::breadcrumbs name=\"settings.workflows\" />\n\n                {!! view_render_event('admin.settings.workflows.index.breadcrumbs.after') !!}\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    @lang('admin::app.settings.workflows.index.title')\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <!-- Create button for person -->\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.settings.workflows.index.create_button.before') !!}\n                    \n                    @if (bouncer()->hasPermission('settings.automation.workflows.create'))\n                        <a\n                            href=\"{{ route('admin.settings.workflows.create') }}\"\n                            class=\"primary-button\"\n                        >\n                            @lang('admin::app.settings.workflows.index.create-btn')\n                        </a>\n                    @endif\n\n                    {!! view_render_event('admin.settings.workflows.index.create_button.after') !!}\n                </div>\n            </div>\n        </div>\n\n        {!! view_render_event('admin.settings.workflows.index.datagrid.before') !!}\n\n        <x-admin::datagrid :src=\"route('admin.settings.workflows.index')\">\n            <!-- DataGrid Shimmer -->\n            <x-admin::shimmer.datagrid />\n        </x-admin::datagrid>\n\n        {!! view_render_event('admin.settings.workflows.index.datagrid.after') !!}\n    </div>\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Resources/views/user/account/edit.blade.php",
    "content": "<x-admin::layouts>\n    <!-- Page title -->\n    <x-slot:title>\n        @lang('admin::app.account.edit.title')\n    </x-slot>\n\n    {!! view_render_event('admin.user.account.form.before', ['user' => $user]) !!}\n\n    <!-- Input Form -->\n    <x-admin::form\n        :action=\"route('admin.user.account.update')\"\n        enctype=\"multipart/form-data\"\n        method=\"PUT\"\n    >\n        <div class=\"flex items-center justify-between rounded-lg border border-gray-200 bg-white px-4 py-2 text-sm dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300\">\n            <div class=\"flex flex-col gap-2\">\n                {!! view_render_event('admin.user.account.breadcrumbs.before', ['user' => $user]) !!}\n\n                <!-- Breadcrumbs -->\n                <x-admin::breadcrumbs \n                    name=\"dashboard.account.edit\" \n                    :entity=\"$user\"\n                />\n\n                {!! view_render_event('admin.user.account.breadcrumbs.after', ['user' => $user]) !!}\n\n                <div class=\"text-xl font-bold dark:text-white\">\n                    {!! view_render_event('admin.user.account.title.before', ['user' => $user]) !!}\n\n                    @lang('admin::app.account.edit.title')\n\n                    {!! view_render_event('admin.user.account.title.after', ['user' => $user]) !!}\n                </div>\n            </div>\n\n            <div class=\"flex items-center gap-x-2.5\">\n                <!-- Create button for Roles -->\n                <div class=\"flex items-center gap-x-2.5\">\n                    {!! view_render_event('admin.user.account.save_btn.before', ['user' => $user]) !!}\n\n                    <button\n                        type=\"submit\"\n                        class=\"primary-button\"\n                    >\n                        @lang('admin::app.account.edit.save-btn')\n                    </button>\n\n                    {!! view_render_event('admin.user.account.save_btn.after', ['user' => $user]) !!}\n                </div>\n            </div>\n        </div>\n        \n        <!-- Full Panel -->\n        <div class=\"mt-3.5 flex gap-2.5 max-xl:flex-wrap\">\n            {!! view_render_event('admin.user.account.left.before', ['user' => $user]) !!}\n\n            <!-- Left sub Component -->\n            <div class=\"flex flex-1 flex-col gap-2\">\n                <!-- General -->\n                <div class=\"box-shadow rounded bg-white p-4 dark:bg-gray-900\">\n                    <p class=\"mb-4 text-base font-semibold text-gray-800 dark:text-white\">\n                        @lang('admin::app.account.edit.general')\n                    </p>\n\n                    <!-- Image -->\n                    <x-admin::form.control-group>\n                        <x-admin::media.images\n                            name=\"image\"\n                            :uploaded-images=\"$user->image ? [['id' => 'image', 'url' => $user->image_url]] : []\"\n                        />\n                    </x-admin::form.control-group>\n\n                    <p class=\"mb-4 text-xs text-gray-600 dark:text-gray-300\">\n                        @lang('admin::app.account.edit.upload-image-info')\n                    </p>\n\n                    <!-- Name -->\n                    <x-admin::form.control-group>\n                        <x-admin::form.control-group.label class=\"required\">\n                            @lang('admin::app.account.edit.name')\n                        </x-admin::form.control-group.label>\n\n                        <x-admin::form.control-group.control\n                            type=\"text\"\n                            name=\"name\"\n                            rules=\"required\"\n                            :value=\"old('name') ?: $user->name\"\n                            :label=\"trans('admin::app.account.edit.name')\"\n                            :placeholder=\"trans('admin::app.account.edit.name')\"\n                        />\n\n                        <x-admin::form.control-group.error control-name=\"name\" />\n                    </x-admin::form.control-group>\n\n                    <!-- Email -->\n                    <x-admin::form.control-group class=\"!mb-0\">\n                        <x-admin::form.control-group.label class=\"required\">\n                            @lang('admin::app.account.edit.email')\n                        </x-admin::form.control-group.label>\n\n                        <x-admin::form.control-group.control\n                            type=\"email\"\n                            name=\"email\"\n                            id=\"email\"\n                            rules=\"required\"\n                            :value=\"old('email') ?: $user->email\"\n                            :label=\"trans('admin::app.account.edit.email')\"\n                        />\n\n                        <x-admin::form.control-group.error control-name=\"email\" />\n                    </x-admin::form.control-group>\n                </div>\n            </div>\n\n            {!! view_render_event('admin.user.account.left.after', ['user' => $user]) !!}\n\n            {!! view_render_event('admin.user.account.right.before', ['user' => $user]) !!}\n\n            <!-- Right sub-component -->\n            <div class=\"flex w-[360px] max-w-full flex-col gap-2 max-md:w-full\">\n                <x-admin::accordion>\n                    <x-slot:header>\n                        <p class=\"p-2.5 text-base font-semibold text-gray-800 dark:text-white\">\n                            @lang('admin::app.account.edit.change-password')\n                        </p>\n                    </x-slot>\n\n                     <!-- Change Account Password -->\n                    <x-slot:content>\n                        {!! view_render_event('admin.user.current_password.before', ['user' => $user]) !!}\n\n                        <!-- Current Password -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label class=\"required\">\n                                @lang('admin::app.account.edit.current-password')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"password\"\n                                name=\"current_password\"\n                                rules=\"required|min:6\"\n                                :label=\"trans('admin::app.account.edit.current-password')\"\n                                :placeholder=\"trans('admin::app.account.edit.current-password')\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"current_password\" />\n                        </x-admin::form.control-group>\n\n                        {!! view_render_event('admin.user.current_password.after', ['user' => $user]) !!}\n\n                        {!! view_render_event('admin.user.password.before', ['user' => $user]) !!}\n\n                        <!-- Password -->\n                        <x-admin::form.control-group>\n                            <x-admin::form.control-group.label>\n                                @lang('admin::app.account.edit.password')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"password\"\n                                name=\"password\"\n                                rules=\"min:6\"\n                                :placeholder=\"trans('admin::app.account.edit.password')\"\n                                ref=\"password\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"password\" />\n                        </x-admin::form.control-group>\n\n                        {!! view_render_event('admin.user.password.after', ['user' => $user]) !!}\n\n                        {!! view_render_event('admin.user.confirm-password.before', ['user' => $user]) !!}\n\n                        <!-- Confirm Password -->\n                        <x-admin::form.control-group class=\"!mb-0\">\n                            <x-admin::form.control-group.label>\n                                @lang('admin::app.account.edit.confirm-password')\n                            </x-admin::form.control-group.label>\n\n                            <x-admin::form.control-group.control\n                                type=\"password\"\n                                name=\"password_confirmation\"\n                                rules=\"confirmed:@password\"\n                                :label=\"trans('admin::app.account.edit.confirm-password')\"\n                                :placeholder=\"trans('admin::app.account.edit.confirm-password')\"\n                            />\n\n                            <x-admin::form.control-group.error control-name=\"password_confirmation\" />\n                        </x-admin::form.control-group>\n\n                        {!! view_render_event('admin.user.confirm-password.after', ['user' => $user]) !!}\n                    </x-slot>\n                </x-admin::accordion>\n            </div>\n\n            {!! view_render_event('admin.user.account.right.after', ['user' => $user]) !!}\n        </div>\n    </x-admin::form>\n\n    {!! view_render_event('admin.user.account.form.after') !!}\n</x-admin::layouts>\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Routes/Admin/activities-routes.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Route;\nuse Webkul\\Admin\\Http\\Controllers\\Activity\\ActivityController;\n\nRoute::controller(ActivityController::class)->prefix('activities')->group(function () {\n    Route::get('', 'index')->name('admin.activities.index');\n\n    Route::get('get', 'get')->name('admin.activities.get');\n\n    Route::post('create', 'store')->name('admin.activities.store');\n\n    Route::get('edit/{id}', 'edit')->name('admin.activities.edit');\n\n    Route::put('edit/{id}', 'update')->name('admin.activities.update');\n\n    Route::get('download/{id}', 'download')->name('admin.activities.file_download');\n\n    Route::delete('{id}', 'destroy')->name('admin.activities.delete');\n\n    Route::post('mass-update', 'massUpdate')->name('admin.activities.mass_update');\n\n    Route::post('mass-destroy', 'massDestroy')->name('admin.activities.mass_delete');\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Routes/Admin/auth-routes.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Route;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\nuse Webkul\\Admin\\Http\\Controllers\\User\\ForgotPasswordController;\nuse Webkul\\Admin\\Http\\Controllers\\User\\ResetPasswordController;\nuse Webkul\\Admin\\Http\\Controllers\\User\\SessionController;\n\nRoute::withoutMiddleware(['user'])->group(function () {\n    /**\n     * Redirect route.\n     */\n    Route::get('/', [Controller::class, 'redirectToLogin']);\n\n    /**\n     * Session routes.\n     */\n    Route::controller(SessionController::class)->group(function () {\n        Route::prefix('login')->group(function () {\n            Route::get('', 'create')->name('admin.session.create');\n\n            Route::post('', 'store')->name('admin.session.store');\n        });\n\n        Route::middleware(['user'])->group(function () {\n            Route::delete('logout', 'destroy')->name('admin.session.destroy');\n        });\n    });\n\n    /**\n     * Forgot password routes.\n     */\n    Route::controller(ForgotPasswordController::class)->prefix('forget-password')->group(function () {\n        Route::get('', 'create')->name('admin.forgot_password.create');\n\n        Route::post('', 'store')->name('admin.forgot_password.store');\n    });\n\n    /**\n     * Reset password routes.\n     */\n    Route::controller(ResetPasswordController::class)->prefix('reset-password')->group(function () {\n        Route::get('{token}', 'create')->name('admin.reset_password.create');\n\n        Route::post('', 'store')->name('admin.reset_password.store');\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Routes/Admin/configuration-routes.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Route;\nuse Webkul\\Admin\\Http\\Controllers\\Configuration\\ConfigurationController;\n\nRoute::controller(ConfigurationController::class)->prefix('configuration')->group(function () {\n    Route::get('search', 'search')->name('admin.configuration.search');\n\n    Route::prefix('{slug?}/{slug2?}')->group(function () {\n        Route::get('', 'index')->name('admin.configuration.index');\n\n        Route::post('', 'store')->name('admin.configuration.store');\n\n        Route::get('{path}', 'download')->name('admin.configuration.download');\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Routes/Admin/contacts-routes.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Route;\nuse Webkul\\Admin\\Http\\Controllers\\Contact\\OrganizationController;\nuse Webkul\\Admin\\Http\\Controllers\\Contact\\Persons\\ActivityController;\nuse Webkul\\Admin\\Http\\Controllers\\Contact\\Persons\\PersonController;\nuse Webkul\\Admin\\Http\\Controllers\\Contact\\Persons\\TagController;\n\nRoute::prefix('contacts')->group(function () {\n    /**\n     * Persons routes.\n     */\n    Route::controller(PersonController::class)->prefix('persons')->group(function () {\n        Route::get('', 'index')->name('admin.contacts.persons.index');\n\n        Route::get('create', 'create')->name('admin.contacts.persons.create');\n\n        Route::post('create', 'store')->name('admin.contacts.persons.store');\n\n        Route::get('view/{id}', 'show')->name('admin.contacts.persons.view');\n\n        Route::get('edit/{id}', 'edit')->name('admin.contacts.persons.edit');\n\n        Route::put('edit/{id}', 'update')->name('admin.contacts.persons.update');\n\n        Route::get('search', 'search')->name('admin.contacts.persons.search');\n\n        Route::middleware(['throttle:100,60'])->delete('{id}', 'destroy')->name('admin.contacts.persons.delete');\n\n        Route::post('mass-destroy', 'massDestroy')->name('admin.contacts.persons.mass_delete');\n\n        /**\n         * Tag routes.\n         */\n        Route::controller(TagController::class)->prefix('{id}/tags')->group(function () {\n            Route::post('', 'attach')->name('admin.contacts.persons.tags.attach');\n\n            Route::delete('', 'detach')->name('admin.contacts.persons.tags.detach');\n        });\n\n        /**\n         * Activity routes.\n         */\n        Route::controller(ActivityController::class)->prefix('{id}/activities')->group(function () {\n            Route::get('', 'index')->name('admin.contacts.persons.activities.index');\n        });\n    });\n\n    /**\n     * Organization routes.\n     */\n    Route::controller(OrganizationController::class)->prefix('organizations')->group(function () {\n        Route::get('', 'index')->name('admin.contacts.organizations.index');\n\n        Route::get('create', 'create')->name('admin.contacts.organizations.create');\n\n        Route::post('create', 'store')->name('admin.contacts.organizations.store');\n\n        Route::get('edit/{id?}', 'edit')->name('admin.contacts.organizations.edit');\n\n        Route::put('edit/{id}', 'update')->name('admin.contacts.organizations.update');\n\n        Route::delete('{id}', 'destroy')->name('admin.contacts.organizations.delete');\n\n        Route::put('mass-destroy', 'massDestroy')->name('admin.contacts.organizations.mass_delete');\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Routes/Admin/leads-routes.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Route;\nuse Webkul\\Admin\\Http\\Controllers\\Lead\\ActivityController;\nuse Webkul\\Admin\\Http\\Controllers\\Lead\\EmailController;\nuse Webkul\\Admin\\Http\\Controllers\\Lead\\LeadController;\nuse Webkul\\Admin\\Http\\Controllers\\Lead\\QuoteController;\nuse Webkul\\Admin\\Http\\Controllers\\Lead\\TagController;\n\nRoute::controller(LeadController::class)->prefix('leads')->group(function () {\n    Route::get('', 'index')->name('admin.leads.index');\n\n    Route::get('create', 'create')->name('admin.leads.create');\n\n    Route::post('create', 'store')->name('admin.leads.store');\n\n    Route::post('create-by-ai', 'createByAI')->name('admin.leads.create_by_ai');\n\n    Route::get('view/{id}', 'view')->name('admin.leads.view');\n\n    Route::get('edit/{id}', 'edit')->name('admin.leads.edit');\n\n    Route::put('edit/{id}', 'update')->name('admin.leads.update');\n\n    Route::put('attributes/edit/{id}', 'updateAttributes')->name('admin.leads.attributes.update');\n\n    Route::put('stage/edit/{id}', 'updateStage')->name('admin.leads.stage.update');\n\n    Route::get('search', 'search')->name('admin.leads.search');\n\n    Route::delete('{id}', 'destroy')->name('admin.leads.delete');\n\n    Route::post('mass-update', 'massUpdate')->name('admin.leads.mass_update');\n\n    Route::post('mass-destroy', 'massDestroy')->name('admin.leads.mass_delete');\n\n    Route::get('get/{pipeline_id?}', 'get')->name('admin.leads.get');\n\n    Route::delete('product/{lead_id}', 'removeProduct')->name('admin.leads.product.remove');\n\n    Route::put('product/{lead_id}', 'addProduct')->name('admin.leads.product.add');\n\n    Route::get('kanban/look-up', [LeadController::class, 'kanbanLookup'])->name('admin.leads.kanban.look_up');\n\n    Route::controller(ActivityController::class)->prefix('{id}/activities')->group(function () {\n        Route::get('', 'index')->name('admin.leads.activities.index');\n    });\n\n    Route::controller(TagController::class)->prefix('{id}/tags')->group(function () {\n        Route::post('', 'attach')->name('admin.leads.tags.attach');\n\n        Route::delete('', 'detach')->name('admin.leads.tags.detach');\n    });\n\n    Route::controller(EmailController::class)->prefix('{id}/emails')->group(function () {\n        Route::post('', 'store')->name('admin.leads.emails.store');\n\n        Route::delete('', 'detach')->name('admin.leads.emails.detach');\n    });\n\n    Route::controller(QuoteController::class)->prefix('{id}/quotes')->group(function () {\n        Route::delete('{quote_id?}', 'delete')->name('admin.leads.quotes.delete');\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Routes/Admin/mail-routes.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Route;\nuse Webkul\\Admin\\Http\\Controllers\\Mail\\EmailController;\nuse Webkul\\Admin\\Http\\Controllers\\Mail\\TagController;\n\nRoute::prefix('mail')->middleware('sanitize_url')->group(function () {\n    Route::controller(EmailController::class)->group(function () {\n        Route::post('create', 'store')->name('admin.mail.store');\n\n        Route::put('edit/{id}', 'update')->name('admin.mail.update');\n\n        Route::get('attachment-download/{id?}', 'download')->name('admin.mail.attachment_download');\n\n        Route::get('{route?}', 'index')->name('admin.mail.index');\n\n        Route::get('{route}/{id}', 'view')->name('admin.mail.view');\n\n        Route::delete('{id}', 'destroy')->name('admin.mail.delete');\n\n        Route::post('mass-update', 'massUpdate')->name('admin.mail.mass_update');\n\n        Route::post('mass-destroy', 'massDestroy')->name('admin.mail.mass_delete');\n\n        Route::post('inbound-parse', 'inboundParse')->name('admin.mail.inbound_parse')->withoutMiddleware('user');\n    });\n\n    Route::controller(TagController::class)->prefix('{id}/tags')->group(function () {\n        Route::post('', 'attach')->name('admin.mail.tags.attach');\n\n        Route::delete('', 'detach')->name('admin.mail.tags.detach');\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Routes/Admin/products-routes.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Route;\nuse Webkul\\Admin\\Http\\Controllers\\Products\\ActivityController;\nuse Webkul\\Admin\\Http\\Controllers\\Products\\ProductController;\nuse Webkul\\Admin\\Http\\Controllers\\Products\\TagController;\n\nRoute::group(['middleware' => ['user']], function () {\n    Route::controller(ProductController::class)->prefix('products')->group(function () {\n        Route::get('', 'index')->name('admin.products.index');\n\n        Route::get('create', 'create')->name('admin.products.create');\n\n        Route::post('create', 'store')->name('admin.products.store');\n\n        Route::get('view/{id}', 'view')->name('admin.products.view');\n\n        Route::get('edit/{id}', 'edit')->name('admin.products.edit');\n\n        Route::put('edit/{id}', 'update')->name('admin.products.update');\n\n        Route::get('search', 'search')->name('admin.products.search');\n\n        Route::get('{id}/warehouses', 'warehouses')->name('admin.products.warehouses');\n\n        Route::post('{id}/inventories/{warehouseId?}', 'storeInventories')->name('admin.products.inventories.store');\n\n        Route::delete('{id}', 'destroy')->name('admin.products.delete');\n\n        Route::post('mass-destroy', 'massDestroy')->name('admin.products.mass_delete');\n\n        Route::controller(ActivityController::class)->prefix('{id}/activities')->group(function () {\n            Route::get('', 'index')->name('admin.products.activities.index');\n        });\n\n        Route::controller(TagController::class)->prefix('{id}/tags')->group(function () {\n            Route::post('', 'attach')->name('admin.products.tags.attach');\n\n            Route::delete('', 'detach')->name('admin.products.tags.detach');\n        });\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Routes/Admin/quote-routes.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Route;\nuse Webkul\\Admin\\Http\\Controllers\\Quote\\QuoteController;\n\nRoute::controller(QuoteController::class)->prefix('quotes')->group(function () {\n    Route::get('', 'index')->name('admin.quotes.index');\n\n    Route::get('create/{lead_id?}', 'create')->name('admin.quotes.create');\n\n    Route::post('create', 'store')->name('admin.quotes.store');\n\n    Route::get('edit/{id?}', 'edit')->name('admin.quotes.edit');\n\n    Route::put('edit/{id}', 'update')->name('admin.quotes.update');\n\n    Route::get('print/{id?}', 'print')->name('admin.quotes.print');\n\n    Route::delete('{id}', 'destroy')->name('admin.quotes.delete');\n\n    Route::get('search', 'search')->name('admin.quotes.search');\n\n    Route::post('mass-destroy', 'massDestroy')->name('admin.quotes.mass_delete');\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Routes/Admin/rest-routes.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Route;\nuse Webkul\\Admin\\Http\\Controllers\\DashboardController;\nuse Webkul\\Admin\\Http\\Controllers\\DataGrid\\SavedFilterController;\nuse Webkul\\Admin\\Http\\Controllers\\DataGridController;\nuse Webkul\\Admin\\Http\\Controllers\\TinyMCEController;\nuse Webkul\\Admin\\Http\\Controllers\\User\\AccountController;\n\n/**\n * Dashboard routes.\n */\nRoute::controller(DashboardController::class)->prefix('dashboard')->group(function () {\n    Route::get('', 'index')->name('admin.dashboard.index');\n\n    Route::get('stats', 'stats')->name('admin.dashboard.stats');\n});\n\n/**\n * DataGrid routes.\n */\nRoute::prefix('datagrid')->group(function () {\n    /**\n     * Saved filter routes.\n     */\n    Route::controller(SavedFilterController::class)->prefix('datagrid/saved-filters')->group(function () {\n        Route::post('', 'store')->name('admin.datagrid.saved_filters.store');\n\n        Route::get('', 'get')->name('admin.datagrid.saved_filters.index');\n\n        Route::put('{id}', 'update')->name('admin.datagrid.saved_filters.update');\n\n        Route::delete('{id}', 'destroy')->name('admin.datagrid.saved_filters.destroy');\n    });\n\n    /**\n     * Lookup routes.\n     */\n    Route::get('datagrid/look-up', [DataGridController::class, 'lookUp'])->name('admin.datagrid.look_up');\n});\n\n/**\n * Tinymce file upload handler.\n */\nRoute::post('tinymce/upload', [TinyMCEController::class, 'upload'])->name('admin.tinymce.upload');\n\n/**\n * User profile routes.\n */\nRoute::controller(AccountController::class)->prefix('account')->group(function () {\n    Route::get('', 'edit')->name('admin.user.account.edit');\n\n    Route::put('update', 'update')->name('admin.user.account.update');\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Routes/Admin/settings-routes.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Route;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\AttributeController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\DataTransfer\\ImportController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\EmailTemplateController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\GroupController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\LocationController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\Marketing\\CampaignsController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\Marketing\\EventController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\PipelineController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\RoleController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\SettingController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\SourceController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\TagController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\TypeController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\UserController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\Warehouse\\ActivityController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\Warehouse\\TagController as WarehouseTagController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\Warehouse\\WarehouseController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\WebFormController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\WebhookController;\nuse Webkul\\Admin\\Http\\Controllers\\Settings\\WorkflowController;\n\n/**\n * Settings group routes.\n */\nRoute::prefix('settings')->group(function () {\n    /**\n     * Settings routes.\n     */\n    Route::controller(SettingController::class)->prefix('settings')->group(function () {\n        Route::get('', 'index')->name('admin.settings.index');\n\n        Route::get('search', 'search')->name('admin.settings.search');\n    });\n\n    /**\n     * Groups routes.\n     */\n    Route::controller(GroupController::class)->prefix('groups')->group(function () {\n        Route::get('', 'index')->name('admin.settings.groups.index');\n\n        Route::post('create', 'store')->name('admin.settings.groups.store');\n\n        Route::get('edit/{id}', 'edit')->name('admin.settings.groups.edit');\n\n        Route::put('edit/{id}', 'update')->name('admin.settings.groups.update');\n\n        Route::delete('{id}', 'destroy')->name('admin.settings.groups.delete');\n    });\n\n    /**\n     * Type routes.\n     */\n    Route::controller(TypeController::class)->prefix('types')->group(function () {\n        Route::get('', 'index')->name('admin.settings.types.index');\n\n        Route::post('create', 'store')->name('admin.settings.types.store');\n\n        Route::get('edit/{id?}', 'edit')->name('admin.settings.types.edit');\n\n        Route::put('edit/{id}', 'update')->name('admin.settings.types.update');\n\n        Route::delete('{id}', 'destroy')->name('admin.settings.types.delete');\n    });\n\n    /**\n     * Roles routes.\n     */\n    Route::controller(RoleController::class)->prefix('roles')->group(function () {\n        Route::get('', 'index')->name('admin.settings.roles.index');\n\n        Route::get('create', 'create')->name('admin.settings.roles.create');\n\n        Route::post('create', 'store')->name('admin.settings.roles.store');\n\n        Route::get('edit/{id}', 'edit')->name('admin.settings.roles.edit');\n\n        Route::put('edit/{id}', 'update')->name('admin.settings.roles.update');\n\n        Route::delete('{id}', 'destroy')->name('admin.settings.roles.delete');\n    });\n\n    /**\n     * WebForms Routes.\n     */\n    Route::controller(WebFormController::class)->prefix('web-forms')->group(function () {\n        Route::group(['middleware' => ['user']], function () {\n            Route::get('', 'index')->name('admin.settings.web_forms.index');\n\n            Route::get('create', 'create')->name('admin.settings.web_forms.create');\n\n            Route::post('create', 'store')->name('admin.settings.web_forms.store');\n\n            Route::get('edit/{id?}', 'edit')->name('admin.settings.web_forms.edit');\n\n            Route::put('edit/{id}', 'update')->name('admin.settings.web_forms.update');\n\n            Route::delete('{id}', 'destroy')->name('admin.settings.web_forms.delete');\n        });\n    });\n\n    /**\n     * Workflows Routes.\n     */\n    Route::controller(WorkflowController::class)->prefix('workflows')->group(function () {\n        Route::get('', 'index')->name('admin.settings.workflows.index');\n\n        Route::get('create', 'create')->name('admin.settings.workflows.create');\n\n        Route::post('create', 'store')->name('admin.settings.workflows.store');\n\n        Route::get('edit/{id?}', 'edit')->name('admin.settings.workflows.edit');\n\n        Route::put('edit/{id}', 'update')->name('admin.settings.workflows.update');\n\n        Route::delete('{id}', 'destroy')->name('admin.settings.workflows.delete');\n    });\n\n    /**\n     * Webhook Routes.\n     */\n    Route::controller(WebhookController::class)->prefix('webhooks')->group(function () {\n        Route::get('', 'index')->name('admin.settings.webhooks.index');\n\n        Route::get('create', 'create')->name('admin.settings.webhooks.create');\n\n        Route::post('create', 'store')->name('admin.settings.webhooks.store');\n\n        Route::get('edit/{id?}', 'edit')->name('admin.settings.webhooks.edit');\n\n        Route::put('edit/{id}', 'update')->name('admin.settings.webhooks.update');\n\n        Route::delete('{id}', 'destroy')->name('admin.settings.webhooks.delete');\n    });\n\n    /**\n     * Tags Routes.\n     */\n    Route::controller(TagController::class)->prefix('tags')->group(function () {\n        Route::get('', 'index')->name('admin.settings.tags.index');\n\n        Route::post('create', 'store')->name('admin.settings.tags.store');\n\n        Route::get('edit/{id}', 'edit')->name('admin.settings.tags.edit');\n\n        Route::put('edit/{id}', 'update')->name('admin.settings.tags.update');\n\n        Route::get('search', 'search')->name('admin.settings.tags.search');\n\n        Route::delete('{id}', 'destroy')->name('admin.settings.tags.delete');\n\n        Route::post('mass-destroy', 'massDestroy')->name('admin.settings.tags.mass_delete');\n    });\n\n    /**\n     * Users Routes.\n     */\n    Route::controller(UserController::class)->prefix('users')->group(function () {\n        Route::get('', 'index')->name('admin.settings.users.index');\n\n        Route::post('create', 'store')->name('admin.settings.users.store');\n\n        Route::get('edit/{id?}', 'edit')->name('admin.settings.users.edit');\n\n        Route::put('edit/{id}', 'update')->name('admin.settings.users.update');\n\n        Route::get('search', 'search')->name('admin.settings.users.search');\n\n        Route::delete('{id}', 'destroy')->name('admin.settings.users.delete');\n\n        Route::post('mass-update', 'massUpdate')->name('admin.settings.users.mass_update');\n\n        Route::post('mass-destroy', 'massDestroy')->name('admin.settings.users.mass_delete');\n    });\n\n    /**\n     * Pipelines Routes.\n     */\n    Route::controller(PipelineController::class)->prefix('pipelines')->group(function () {\n        Route::get('', 'index')->name('admin.settings.pipelines.index');\n\n        Route::get('create', 'create')->name('admin.settings.pipelines.create');\n\n        Route::post('create', 'store')->name('admin.settings.pipelines.store');\n\n        Route::get('edit/{id?}', 'edit')->name('admin.settings.pipelines.edit');\n\n        Route::post('edit/{id}', 'update')->name('admin.settings.pipelines.update');\n\n        Route::delete('{id}', 'destroy')->name('admin.settings.pipelines.delete');\n    });\n\n    /**\n     * Sources Routes.\n     */\n    Route::controller(SourceController::class)->prefix('sources')->group(function () {\n        Route::get('', 'index')->name('admin.settings.sources.index');\n\n        Route::post('create', 'store')->name('admin.settings.sources.store');\n\n        Route::get('edit/{id?}', 'edit')->name('admin.settings.sources.edit');\n\n        Route::put('edit/{id}', 'update')->name('admin.settings.sources.update');\n\n        Route::delete('{id}', 'destroy')->name('admin.settings.sources.delete');\n    });\n\n    /**\n     * Attributes Routes.\n     */\n    Route::controller(AttributeController::class)->prefix('attributes')->group(function () {\n        Route::get('', 'index')->name('admin.settings.attributes.index');\n\n        Route::get('check-unique-validation', 'checkUniqueValidation')->name('admin.settings.attributes.check_unique_validation');\n\n        Route::get('create', 'create')->name('admin.settings.attributes.create');\n\n        Route::post('create', 'store')->name('admin.settings.attributes.store');\n\n        Route::get('edit/{id}', 'edit')->name('admin.settings.attributes.edit');\n\n        Route::put('edit/{id}', 'update')->name('admin.settings.attributes.update');\n\n        Route::get('lookup/{lookup?}', 'lookup')->name('admin.settings.attributes.lookup');\n\n        Route::get('lookup-entity/{lookup?}', 'lookupEntity')->name('admin.settings.attributes.lookup_entity');\n\n        Route::delete('{id}', 'destroy')->name('admin.settings.attributes.delete');\n\n        Route::get('{id}/options', 'getAttributeOptions')->name('admin.settings.attributes.options');\n\n        Route::post('mass-update', 'massUpdate')->name('admin.settings.attributes.mass_update');\n\n        Route::post('mass-destroy', 'massDestroy')->name('admin.settings.attributes.mass_delete');\n\n        Route::get('download', 'download')->name('admin.settings.attributes.download');\n    });\n\n    /**\n     * Warehouses Routes.\n     */\n    Route::controller(WarehouseController::class)->prefix('warehouses')->group(function () {\n        Route::put('edit/{id}', 'update')->name('admin.settings.warehouses.update');\n\n        Route::get('', 'index')->name('admin.settings.warehouses.index');\n\n        Route::get('search', 'search')->name('admin.settings.warehouses.search');\n\n        Route::get('{id}/products', 'products')->name('admin.settings.warehouses.products.index');\n\n        Route::get('create', 'create')->name('admin.settings.warehouses.create');\n\n        Route::post('create', 'store')->name('admin.settings.warehouses.store');\n\n        Route::get('view/{id}', 'view')->name('admin.settings.warehouses.view');\n\n        Route::get('edit/{id?}', 'edit')->name('admin.settings.warehouses.edit');\n\n        Route::delete('{id}', 'destroy')->name('admin.settings.warehouses.delete');\n\n        Route::controller(WarehouseTagController::class)->prefix('{id}/tags')->group(function () {\n            Route::post('', 'attach')->name('admin.settings.warehouses.tags.attach');\n\n            Route::delete('', 'detach')->name('admin.settings.warehouses.tags.detach');\n        });\n\n        Route::controller(ActivityController::class)->prefix('{id}/activities')->group(function () {\n            Route::get('', 'index')->name('admin.settings.warehouse.activities.index');\n        });\n    });\n\n    /**\n     * Warehouses Location Routes.\n     */\n    Route::controller(LocationController::class)->prefix('locations')->group(function () {\n        Route::get('search', 'search')->name('admin.settings.locations.search');\n\n        Route::post('create', 'store')->name('admin.settings.locations.store');\n\n        Route::put('edit/{id}', 'update')->name('admin.settings.locations.update');\n\n        Route::delete('{id}', 'destroy')->name('admin.settings.locations.delete');\n    });\n\n    /**\n     * Email Templates Routes.\n     */\n    Route::controller(EmailTemplateController::class)->prefix('email-templates')->group(function () {\n        Route::get('', 'index')->name('admin.settings.email_templates.index');\n\n        Route::get('create', 'create')->name('admin.settings.email_templates.create');\n\n        Route::post('create', 'store')->name('admin.settings.email_templates.store');\n\n        Route::get('edit/{id?}', 'edit')->name('admin.settings.email_templates.edit');\n\n        Route::put('edit/{id}', 'update')->name('admin.settings.email_templates.update');\n\n        Route::delete('{id}', 'destroy')->name('admin.settings.email_templates.delete');\n    });\n\n    /**\n     * Events Routes.\n     */\n    Route::group(['prefix' => 'marketing'], function () {\n        Route::controller(EventController::class)->prefix('events')->group(function () {\n            Route::get('', 'index')->name('admin.settings.marketing.events.index');\n\n            Route::post('create', 'store')->name('admin.settings.marketing.events.store');\n\n            Route::get('edit/{id?}', 'edit')->name('admin.settings.marketing.events.edit');\n\n            Route::put('edit/{id}', 'update')->name('admin.settings.marketing.events.update');\n\n            Route::delete('{id}', 'destroy')->name('admin.settings.marketing.events.delete');\n\n            Route::post('mass-destroy', 'massDestroy')->name('admin.settings.marketing.events.mass_delete');\n        });\n\n        Route::controller(CampaignsController::class)->prefix('campaigns')->group(function () {\n            Route::get('', 'index')->name('admin.settings.marketing.campaigns.index');\n\n            Route::get('events', 'getEvents')->name('admin.settings.marketing.campaigns.events');\n\n            Route::get('email-templates', 'getEmailTemplates')->name('admin.settings.marketing.campaigns.email-templates');\n\n            Route::post('', 'store')->name('admin.settings.marketing.campaigns.store');\n\n            Route::get('{id}', 'show')->name('admin.settings.marketing.campaigns.edit');\n\n            Route::put('{id}', 'update')->name('admin.settings.marketing.campaigns.update');\n\n            Route::delete('{id}', 'destroy')->name('admin.settings.marketing.campaigns.delete');\n\n            Route::post('mass-destroy', 'massDestroy')->name('admin.settings.marketing.campaigns.mass_delete');\n        });\n    });\n\n    Route::prefix('data-transfer')->group(function () {\n        /**\n         * Import routes.\n         */\n        Route::controller(ImportController::class)->prefix('imports')->group(function () {\n            Route::get('', 'index')->name('admin.settings.data_transfer.imports.index');\n\n            Route::get('create', 'create')->name('admin.settings.data_transfer.imports.create');\n\n            Route::post('create', 'store')->name('admin.settings.data_transfer.imports.store');\n\n            Route::get('edit/{id}', 'edit')->name('admin.settings.data_transfer.imports.edit');\n\n            Route::put('update/{id}', 'update')->name('admin.settings.data_transfer.imports.update');\n\n            Route::delete('destroy/{id}', 'destroy')->name('admin.settings.data_transfer.imports.delete');\n\n            Route::get('import/{id}', 'import')->name('admin.settings.data_transfer.imports.import');\n\n            Route::get('validate/{id}', 'validateImport')->name('admin.settings.data_transfer.imports.validate');\n\n            Route::get('start/{id}', 'start')->name('admin.settings.data_transfer.imports.start');\n\n            Route::get('link/{id}', 'link')->name('admin.settings.data_transfer.imports.link');\n\n            Route::get('index/{id}', 'indexData')->name('admin.settings.data_transfer.imports.index_data');\n\n            Route::get('stats/{id}/{state?}', 'stats')->name('admin.settings.data_transfer.imports.stats');\n\n            Route::get('download-sample/{sample?}', 'downloadSample')->name('admin.settings.data_transfer.imports.download_sample');\n\n            Route::get('download/{id}', 'download')->name('admin.settings.data_transfer.imports.download');\n\n            Route::get('download-error-report/{id}', 'downloadErrorReport')->name('admin.settings.data_transfer.imports.download_error_report');\n        });\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Routes/Admin/web.php",
    "content": "<?php\n\n/**\n * Auth routes.\n */\nrequire 'auth-routes.php';\n\n/**\n * Leads routes.\n */\nrequire 'leads-routes.php';\n\n/**\n * Email routes.\n */\nrequire 'mail-routes.php';\n\n/**\n * Settings routes.\n */\nrequire 'settings-routes.php';\n\n/**\n * Products routes.\n */\nrequire 'products-routes.php';\n\n/**\n * Contacts routes.\n */\nrequire 'contacts-routes.php';\n\n/**\n * Activities routes.\n */\nrequire 'activities-routes.php';\n\n/**\n * Quotes routes.\n */\nrequire 'quote-routes.php';\n\n/**\n * Configuration routes.\n */\nrequire 'configuration-routes.php';\n\n/**\n * Rest routes.\n */\nrequire 'rest-routes.php';\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Routes/Front/web.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Route;\nuse Webkul\\Admin\\Http\\Controllers\\Controller;\n\n/**\n * Home routes.\n */\nRoute::get('/', [Controller::class, 'redirectToLogin'])->name('krayin.home');\n"
  },
  {
    "path": "packages/Webkul/Admin/src/Traits/ProvideDropdownOptions.php",
    "content": "<?php\n\nnamespace Webkul\\Admin\\Traits;\n\nuse Webkul\\Contact\\Repositories\\OrganizationRepository;\nuse Webkul\\Lead\\Repositories\\SourceRepository;\nuse Webkul\\User\\Repositories\\UserRepository;\nuse Webkul\\Warehouse\\Repositories\\WarehouseRepository;\n\n/**\n * Single place for all dropdown options. Sets of sorted dropdown\n * options methods. Use as per your need.\n */\ntrait ProvideDropdownOptions\n{\n    /**\n     * Dropdown choices.\n     *\n     * @var array\n     */\n    public $booleanDropdownChoices = [\n        'active_inactive',\n        'yes_no',\n    ];\n\n    /**\n     * Is boolean dropdown choice exists.\n     *\n     * @param  string  $choice\n     */\n    public function isBooleanDropdownChoiceExists($choice): bool\n    {\n        return in_array($choice, $this->booleanDropdownChoices);\n    }\n\n    /**\n     * Get boolean dropdown options.\n     *\n     * @param  string  $choice\n     */\n    public function getBooleanDropdownOptions($choice = 'active_inactive'): array\n    {\n        return $this->isBooleanDropdownChoiceExists($choice) && $choice == 'active_inactive'\n            ? $this->getActiveInactiveDropdownOptions()\n            : $this->getYesNoDropdownOptions();\n    }\n\n    /**\n     * Get active/inactive dropdown options.\n     */\n    public function getActiveInactiveDropdownOptions(): array\n    {\n        return [\n            [\n                'value' => '',\n                'label' => trans('admin::app.common.select-options'),\n                'disabled' => true,\n                'selected' => true,\n            ],\n            [\n                'label' => trans('admin::app.datagrid.active'),\n                'value' => 1,\n                'disabled' => false,\n                'selected' => false,\n            ], [\n                'label' => trans('admin::app.datagrid.inactive'),\n                'value' => 0,\n                'disabled' => false,\n                'selected' => false,\n            ],\n        ];\n    }\n\n    /**\n     * Get yes/no dropdown options.\n     */\n    public function getYesNoDropdownOptions(): array\n    {\n        return [\n            [\n                'value' => '',\n                'label' => trans('admin::app.common.select-options'),\n                'disabled' => true,\n                'selected' => true,\n            ],\n            [\n                'value' => 0,\n                'label' => trans('admin::app.common.no'),\n                'disabled' => false,\n                'selected' => false,\n            ], [\n                'value' => 1,\n                'label' => trans('admin::app.common.yes'),\n                'disabled' => false,\n                'selected' => false,\n            ],\n        ];\n    }\n\n    /**\n     * Get user dropdown options.\n     */\n    public function getUserDropdownOptions(): array\n    {\n        $options = app(UserRepository::class)\n            ->get(['id as value', 'name as label'])\n            ->map(function ($item, $key) {\n                $item->disabled = false;\n\n                $item->selected = false;\n\n                return $item;\n            })\n            ->toArray();\n\n        return [\n            [\n                'label' => trans('admin::app.common.select-users'),\n                'value' => '',\n                'disabled' => true,\n                'selected' => true,\n            ],\n            ...$options,\n        ];\n    }\n\n    /**\n     * Get lead source options.\n     */\n    public function getLeadSourcesOptions(): array\n    {\n        $options = app(SourceRepository::class)\n            ->get(['id as value', 'name as label'])\n            ->map(function ($item, $key) {\n                $item->disabled = false;\n\n                $item->selected = false;\n\n                return $item;\n            })\n            ->toArray();\n\n        return [\n            [\n                'label' => trans('admin::app.common.select-users'),\n                'value' => '',\n                'disabled' => true,\n                'selected' => true,\n            ],\n            ...$options,\n        ];\n    }\n\n    /**\n     * Get organization dropdown options.\n     */\n    public function getOrganizationDropdownOptions(): array\n    {\n        $options = app(OrganizationRepository::class)\n            ->get(['id as value', 'name as label'])\n            ->map(function ($item, $key) {\n                $item->disabled = false;\n\n                $item->selected = false;\n\n                return $item;\n            })\n            ->toArray();\n\n        return [\n            [\n                'label' => trans('admin::app.common.select-organization'),\n                'value' => '',\n                'disabled' => true,\n                'selected' => true,\n            ],\n            ...$options,\n        ];\n    }\n\n    /**\n     * Get role dropdown options.\n     */\n    public function getRoleDropdownOptions(): array\n    {\n        return [\n            [\n                'label' => trans('admin::app.settings.roles.all'),\n                'value' => 'all',\n                'disabled' => false,\n                'selected' => false,\n            ], [\n                'label' => trans('admin::app.settings.roles.custom'),\n                'value' => 'custom',\n                'disabled' => false,\n                'selected' => false,\n            ],\n        ];\n    }\n\n    /**\n     * Get activity type dropdown options.\n     */\n    public function getActivityTypeDropdownOptions(): array\n    {\n        return [\n            [\n                'label' => trans('admin::app.common.select-type'),\n                'value' => '',\n                'disabled' => true,\n                'selected' => true,\n            ], [\n                'label' => trans('admin::app.common.select-call'),\n                'value' => 'call',\n                'disabled' => false,\n                'selected' => false,\n            ], [\n                'label' => trans('admin::app.common.select-meeting'),\n                'value' => 'meeting',\n                'disabled' => false,\n                'selected' => false,\n            ], [\n                'label' => trans('admin::app.common.select-lunch'),\n                'value' => 'lunch',\n                'disabled' => false,\n                'selected' => false,\n            ],\n        ];\n    }\n\n    /**\n     * Get attribute type dropdown options.\n     */\n    public function getAttributeTypeDropdownOptions(): array\n    {\n        return [\n            [\n                'label' => trans('admin::app.common.select-options'),\n                'value' => '',\n                'disabled' => true,\n                'selected' => true,\n            ],\n            [\n                'label' => trans('admin::app.common.system_attribute'),\n                'value' => '0',\n                'disabled' => false,\n                'selected' => false,\n            ],\n            [\n                'label' => trans('admin::app.common.custom_attribute'),\n                'value' => '1',\n                'disabled' => false,\n                'selected' => false,\n            ],\n        ];\n    }\n\n    /**\n     * Get organization dropdown options.\n     */\n    public function getWarehouseDropdownOptions(): array\n    {\n        $options = app(WarehouseRepository::class)\n            ->get(['id as value', 'name as label'])\n            ->map(function ($item, $key) {\n                $item->disabled = false;\n\n                $item->selected = false;\n\n                return $item;\n            })\n            ->toArray();\n\n        return [\n            [\n                'label' => trans('admin::app.common.select-warehouse'),\n                'value' => '',\n                'disabled' => true,\n                'selected' => true,\n            ],\n            ...$options,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Admin/tailwind.config.js",
    "content": "/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n    content: [\"./src/Resources/**/*.blade.php\", \"./src/Resources/**/*.js\"],\n\n    theme: {\n        container: {\n            center: true,\n\n            screens: {\n                \"4xl\": \"1920px\",\n            },\n\n            padding: {\n                DEFAULT: \"16px\",\n            },\n        },\n\n        screens: {\n            sm: \"525px\",\n            md: \"768px\",\n            lg: \"1024px\",\n            xl: \"1240px\",\n            \"2xl\": \"1440px\",\n            \"3xl\": \"1680px\",\n            \"4xl\": \"1920px\",\n        },\n\n        extend: {\n            colors: {\n                brandColor: \"var(--brand-color)\",\n            },\n\n            fontFamily: {\n                inter: ['Inter'],\n                icon: ['icomoon']\n            }\n        },\n    },\n    \n    darkMode: 'class',\n\n    plugins: [],\n\n    safelist: [\n        {\n            pattern: /icon-/,\n        }\n    ]\n};"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/.gitignore",
    "content": "/playwright-report\n/test-results\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/playwright.config.ts",
    "content": "import { defineConfig, devices } from \"@playwright/test\";\nimport dotenv from \"dotenv\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport const TESTS_ROOT_PATH = __dirname;\nexport const STATE_DIR_PATH = `${ TESTS_ROOT_PATH }/.state/`;\nexport const ADMIN_AUTH_STATE_PATH = `${ STATE_DIR_PATH }/admin-auth.json`;\n\ndotenv.config({ path: path.resolve(__dirname, \"../../../../../.env\") });\n\nexport default defineConfig({\n    testDir: \"./tests\",\n\n    timeout: 30 * 1000,\n\n    expect: { timeout: 20 * 1000 },\n\n    outputDir: \"./test-results\",\n\n    fullyParallel: false,\n\n    workers: 1,\n\n    forbidOnly: !!process.env.CI,\n\n    retries: 0,\n\n    reportSlowTests: null,\n\n    reporter: [\n        [\n            \"html\",\n            {\n                outputFolder: \"./playwright-report\",\n            },\n        ],\n    ],\n\n    use: {\n        baseURL: `${process.env.APP_URL}/`.replace(/\\/+$/, \"/\"),\n        screenshot: { mode: \"only-on-failure\", fullPage: true },\n        video: \"retain-on-failure\",\n        trace: \"retain-on-failure\",\n    },\n\n    projects: [\n        {\n            name: \"chromium\",\n            use: { ...devices[\"Desktop Chrome\"] },\n        },\n    ],\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/setup.ts",
    "content": "import { test as base, expect, type Page } from \"@playwright/test\";\n\ntype AdminFixtures = {\n    adminPage: Page;\n};\n\nexport const test = base.extend<AdminFixtures>({\n    adminPage: async ({ page }, use) => {\n        const adminCredentials = {\n            email: \"admin@example.com\",\n            password: \"admin123\",\n        };\n\n        await page.goto(\"admin/login\");\n        await page.fill('input[name=\"email\"]', adminCredentials.email);\n        await page.fill('input[name=\"password\"]', adminCredentials.password);\n        await page.press('input[name=\"password\"]', \"Enter\");\n\n        await page.waitForURL(\"**/admin/dashboard\");\n\n        await use(page);\n    },\n});\n\nexport { expect };\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/auth.spec.ts",
    "content": "import { test, expect } from \"../setup\";\n\nconst adminCredentials = {\n    email: \"admin@example.com\",\n    password: \"admin123\",\n};\n\ntest(\"should be able to login\", async ({ page }) => {\n    /**\n     * Login as admin.\n     */\n    await page.goto(\"admin/login\");\n    await page.getByPlaceholder(\"Email Address\").click();\n    await page.getByPlaceholder(\"Email Address\").fill(adminCredentials.email);\n    await page.getByPlaceholder(\"Password\").click();\n    await page.getByPlaceholder(\"Password\").fill(adminCredentials.password);\n    await page.getByRole(\"button\", { name: \"Sign In\" }).click();\n\n    await expect(page).toHaveURL(/\\/admin\\/dashboard/);\n    await expect(page.getByPlaceholder(\"Mega Search\").first()).toBeVisible();\n});\n\ntest(\"should be able to logout\", async ({ adminPage }) => {\n    await expect(adminPage).toHaveURL(/\\/admin\\/dashboard/);\n\n    const profileToggle = adminPage.getByRole(\"banner\").getByRole(\"button\").last();\n\n    await expect(profileToggle).toBeVisible();\n    await profileToggle.click();\n\n    const signOutLink = adminPage.getByRole(\"link\", { name: \"Sign Out\" });\n\n    await expect(signOutLink).toBeVisible();\n    await signOutLink.click();\n\n    await expect(adminPage).toHaveURL(/\\/admin\\/login/);\n    await expect(adminPage.locator('input[name=\"password\"]')).toBeVisible();\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/contacts/organization.spec.ts",
    "content": "import { test, expect } from '../../setup';\nimport {generateCompanyName, createOrganization} from \"../../utils/faker\"\n\ntest.describe(\"organization management\", () => {\n    test('should be able to create organization', async ({ adminPage }) => {\n        /**\n         * Create Organization.\n         */\n        await createOrganization(adminPage);\n    });\n\n    test('should be able to edit detail of organization', async ({ adminPage }) => {\n        /**\n         * Create Organization.\n         */\n        const companyName = await createOrganization(adminPage);\n\n        /**\n         * Edit Organization detail.\n         */\n        await adminPage.locator('div').filter({ hasText: companyName }).locator('span.icon-edit').first().click();\n        await adminPage.getByRole('textbox', { name: 'City' }).click();\n        await adminPage.getByRole('textbox', { name: 'City' }).fill('Gurugram');\n        await adminPage.getByRole('button', { name: 'Save Organization' }).click();\n\n        /**\n         * Check detail are Edit\n         */\n        await adminPage.locator('div').filter({ hasText: companyName }).locator('span.icon-edit').first().click();\n        await expect(adminPage.getByRole('textbox', { name: 'City' })).toHaveValue('Gurugram');\n    });\n\n    test('should be able to delete organization', async ({ adminPage }) => {\n        await adminPage.goto('admin/contacts/organizations');\n\n        /**\n         * Delete Organization.\n         */\n        await adminPage.locator('div')\n        .locator('span.icon-delete')\n        .first()\n        .click();  \n\n        await adminPage.getByRole('button', { name: 'Agree', exact: true }).click();\n        await expect(adminPage.locator('#app')).toContainText('Success');\n    });\n\n    test('should be able to mass delete organization', async ({ adminPage }) => {\n        /**\n         * Create Multiple Organizations.\n         */\n        await createOrganization(adminPage);\n        await createOrganization(adminPage);\n        await createOrganization(adminPage);\n        await createOrganization(adminPage);\n        await createOrganization(adminPage);\n    \n        /**\n         * Check if any organization has value greater than 0.\n         */\n        const organizationCount = await adminPage.locator('#app').getByText('1', { exact: true }).count();\n        \n        /**\n         * Mass Delete Organization.\n         */\n        await adminPage.locator('.icon-checkbox-outline').first().click();\n        await adminPage.getByRole('button', { name: 'Delete' }).click();\n        await adminPage.getByRole('button', { name: 'Agree', exact: true }).click();\n        \n        if (organizationCount > 0) {\n            await expect(adminPage.getByText('Error')).toBeVisible();\n        }\n        else{\n            await expect(adminPage.locator('#app')).toContainText('Success');\n        }\n    });\n\n\n    test('should not be able to create same name organization', async ({ adminPage }) => {\n        /**\n         * Create Organization.\n         */\n        const companyName = await createOrganization(adminPage);\n        await adminPage.getByRole('link', { name: 'Create Organization' }).click();\n\n        /**\n         * Fill in organization details\n         */\n        await adminPage.getByRole('textbox', { name: 'Name *' }).fill(companyName);\n        await adminPage.locator('textarea[name=\"address\\\\[address\\\\]\"]').fill('ARV Park');\n        await adminPage.getByRole('combobox').selectOption('IN');\n        await adminPage.locator('select[name=\"address\\\\[state\\\\]\"]').selectOption('DL');\n        await adminPage.getByRole('textbox', { name: 'City' }).fill('Delhi');\n        await adminPage.getByRole('textbox', { name: 'Postcode' }).fill('123456');\n\n        /** \n         * Click to add extra details\n         */\n        await adminPage.locator('div').filter({ hasText: /^Click to add$/ }).nth(2).click();\n        await adminPage.getByRole('textbox', { name: 'Search...' }).fill('exampl');\n        await adminPage.getByRole('listitem').filter({ hasText: 'Example' }).click();\n\n        /** \n         * Click on \"Save Organization\"\n         */\n        await adminPage.getByRole('button', { name: 'Save Organization' }).click();\n\n        /** \n         * Expect Error message\n         */\n        await expect(adminPage.locator('#app')).toContainText('The value has already been taken.');\n    });\n});"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/contacts/person.spec.ts",
    "content": "import { test, expect } from \"../../setup\";\nimport { createPerson, generateCompanyName } from \"../../utils/faker\";\n\ntest(\"should be able to create person\", async ({ adminPage }) => {\n    /**\n     * Create person.\n     */\n    await adminPage.goto(\"admin/contacts/persons\");\n    await createPerson(adminPage);\n});\n\ntest(\"should be able to assign a company to person\", async ({ adminPage }) => {\n    /**\n     * Create person.\n     */\n    await adminPage.goto(\"admin/contacts/persons\");\n    await createPerson(adminPage);\n    const editButton = adminPage.locator(\"span.icon-edit\").first();\n\n    await expect(editButton).toBeVisible();\n    await editButton.click();\n\n    const addCompanyField = adminPage\n        .locator(\"div\")\n        .filter({ hasText: /^Click to add$/ })\n        .nth(2);\n\n    await expect(addCompanyField).toBeVisible();\n    await addCompanyField.click();\n    await adminPage.getByRole(\"textbox\", { name: \"Search...\" }).click();\n    await adminPage\n        .getByRole(\"textbox\", { name: \"Search...\" })\n        .fill(generateCompanyName());\n    await adminPage.getByText(\"Add as New\").click();\n    await adminPage.getByRole(\"button\", { name: \"Save Person\" }).click();\n});\n\ntest(\"should be able to delete person\", async ({ adminPage }) => {\n    /**\n     * Delete person.\n     */\n    await adminPage.goto(\"admin/contacts/persons\");\n    await adminPage.locator(\"span.icon-delete\").nth(1).click();\n    await adminPage.getByRole(\"button\", { name: \"Agree\", exact: true }).click();\n    await expect(adminPage.locator(\"#app\")).toContainText(\"Success\", { timeout: 10000 });\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/lang/lang.spec.ts",
    "content": "import { expect, test } from '@playwright/test';\nimport { execSync } from 'child_process';\nimport fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\n// Resolve file paths relative to this test file\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\n// Absolute path to /lang directory\nconst LANG_DIR = path.resolve(\n  __dirname,\n  '../../../../src/Resources/lang'\n);\n\nconst BASE_LANG = 'en';\n\n// Helper to extract just the keys from app.php\nfunction getNormalizedKeys(filePath: string): string[] {\n  // PHP one-liner to output the array as JSON\n  const phpCode = `echo json_encode(include '${filePath}');`;\n  const json = execSync(`php -r \"${phpCode.replace(/\"/g, '\\\\\"')}\"`).toString();\n  const obj = JSON.parse(json);\n\n  function flattenKeys(obj: any, prefix = ''): string[] {\n    return Object.keys(obj).flatMap(key => {\n      const fullKey = prefix ? `${prefix}.${key}` : key;\n      if (typeof obj[key] === 'object' && obj[key] !== null) {\n        return flattenKeys(obj[key], fullKey);\n      }\n      return [fullKey];\n    });\n  }\n\n  return flattenKeys(obj);\n}\ntest('All language files must match number of keys and key names with English app.php', () => {\n  const baseFile = path.join(LANG_DIR, BASE_LANG, 'app.php');\n  const baseKeys = getNormalizedKeys(baseFile);\n// All locales except the base one\n  const locales = fs\n    .readdirSync(LANG_DIR)\n    .filter(locale => locale !== BASE_LANG && fs.existsSync(path.join(LANG_DIR, locale, 'app.php')));\n\n// Array to collect any locales that have issues\n  let failedLocales: { locale: string; missingKeys: string[]; extraKeys: string[] }[] = [];\n\n  for (const locale of locales) {\n    const filePath = path.join(LANG_DIR, locale, 'app.php');\n    const keys = getNormalizedKeys(filePath);\n    \n    const missingKeys = baseKeys.filter(key => !keys.includes(key));\n    const extraKeys = keys.filter(key => !baseKeys.includes(key));\n\n    if (missingKeys.length > 0 || extraKeys.length > 0) {\n      failedLocales.push({ locale, missingKeys, extraKeys });\n    }\n  }\n\n  if (failedLocales.length > 0) {\n    for (const { locale, missingKeys, extraKeys } of failedLocales) {\n      console.error(` ${locale}/app.php has issues:`);\n\n      if (missingKeys.length) {\n        console.error(`  Missing keys (${missingKeys.length}):`);\n        for (const key of missingKeys) console.error(`    - ${key}`);\n      }\n\n      if (extraKeys.length) {\n        console.error(`  Extra keys (${extraKeys.length}):`);\n        for (const key of extraKeys) console.error(`    + ${key}`);\n      }\n    }\n\n    // Fail the test\n    expect(failedLocales).toEqual([]);\n  } else {\n    console.log('All language files have matching keys and counts with en/app.php');\n  }\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/lead.spec.ts",
    "content": "import { test, expect } from \"../setup\";\nimport fs from \"fs\";\nimport { generateName, getRandomDateTime, generateDescription, generateDate, generateEmail, generatePhoneNumber,generateEmailSubject } from '../utils/faker';\n\nasync function generateLead(adminPage) {\n    /**\n     * Go to the lead listing page.\n     */\n    await adminPage.goto(\"admin/leads\");\n    await adminPage.getByRole('link', { name: 'Create Lead' }).click();\n\n    /**\n     * Fill the lead form.\n     */\n    const leadTitle = `${generateName()}-${Date.now()}`;\n    const leadDescription = generateDescription();\n    const leadDate = generateDate();\n    const leadEmail = generateEmail();\n    const leadPhoneNumber = generatePhoneNumber();\n\n    await adminPage.fill('input[name=\"title\"]', leadTitle);\n    await adminPage.fill('textarea[name=\"description\"]', leadDescription);\n    await adminPage.locator('select[name=\"lead_source_id\"]').selectOption(\"1\");\n    await adminPage.fill('input[name=\"expected_close_date\"]', leadDate);\n    await adminPage.locator('select[name=\"lead_type_id\"]').selectOption(\"1\");\n    await adminPage.locator('select[name=\"user_id\"]').selectOption(\"1\");\n    await adminPage.fill('input[name=\"lead_value\"]', '1000');\n\n    /**\n     * Add a new person.\n     */\n    await adminPage.locator('div').filter({ hasText: /^Click to Add$/ }).nth(1).click();\n    await adminPage.getByRole('textbox', { name: 'Search...' }).fill(leadTitle);\n    await adminPage.getByText('Add as New').click();\n\n    await adminPage.fill('input[name=\"person[emails][0][value]\"]', leadEmail);\n    await adminPage.fill('input[name=\"person[contact_numbers][0][value]\"]', leadPhoneNumber);\n\n    /**\n     * Associate an organization.\n     */\n    await adminPage.locator('div').filter({ hasText: /^Click to add$/ }).nth(2).click();\n    await adminPage.getByRole('textbox', { name: 'Search...' }).fill(leadTitle);\n    await adminPage.getByText('Add as New').click();\n\n    /**\n     * Save the lead.\n     */\n    await adminPage.getByRole('button', { name: 'Save' }).click();\n\n    /**\n     * Assertion to confirm lead creation.\n     */\n    await expect(adminPage.getByText('Success', { exact: true })).toBeVisible();\n\n    return { leadTitle, leadDescription, leadDate, leadEmail, leadPhoneNumber };\n} \n\nfunction generateFile(fileName, content) {\n    fs.writeFileSync(fileName, content);\n    return fileName;\n}\n\nasync function openLeadByTitle(adminPage, leadTitle) {\n  await adminPage.goto(\"admin/leads\");\n  const searchInput = adminPage.getByRole(\"textbox\", { name: \"Search by Title\" });\n  await searchInput.fill(leadTitle);\n  await searchInput.press(\"Enter\");\n\n  const leadLink = adminPage\n    .locator('a[href*=\"/admin/leads/view/\"]')\n    .filter({ hasText: leadTitle })\n    .first();\n\n  await expect(leadLink).toBeVisible();\n  await leadLink.click();\n}\n\ntest.describe(\"lead management\", () => {\n    \n    test(\"should create a new lead\", async ({ adminPage }) => {\n    /**\n     * Create a new lead.\n     */\n        await generateLead(adminPage);\n    });\n\n    test(\"should able to update lead\", async ({ adminPage }) => {\n       /**\n        * Create a new lead.\n        */\n       const lead = await generateLead(adminPage);\n\n       /**\n        * Update the lead.\n        */\n      await openLeadByTitle(adminPage, lead.leadTitle);\n       const page1Promise = adminPage.waitForEvent('popup');\n       await adminPage.getByRole('link', { name: '' }).first().click();\n       const page1 = await page1Promise;\n       await page1.fill('textarea[name=\"description\"]', generateDescription());\n       await page1.fill('input[name=\"title\"]', generateName());\n       await page1.getByLabel('Source').selectOption('3');\n       await page1.fill('input[name=\"lead_value\"]', '30000');\n       await page1.getByRole('button', { name: 'Save' }).click();\n       await page1.getByText('Success', { exact: true }).click();\n    });\n\n    test(\"should able to delete lead\", async ({ adminPage }) => {\n       /**\n        * Create a new lead.\n        */\n       const lead = await generateLead(adminPage);\n\n       /**\n        * Delete the lead.\n        */\n       await adminPage.getByRole('link', { name: '' }).click();\n       await adminPage.locator('div:nth-child(4) > .flex > span:nth-child(2)').click();\n       await adminPage.getByRole('button', { name: 'Agree', exact: true }).click();\n       await expect(adminPage.getByText('Success', { exact: true })).toBeVisible();\n       await expect(adminPage.locator('#app')).toContainText('Lead deleted successfully.');\n      });\n\n    test(\"should sent a mail\", async ({ adminPage }) => {\n       /**\n        * Create a new lead.\n        */\n       const lead = await generateLead(adminPage);\n\n       /**\n        * fill mail detail.\n        */\n       await openLeadByTitle(adminPage, lead.leadTitle);\n       await adminPage.getByRole('button', { name: ' Mail' }).click();\n       await adminPage.fill('input[name=\"temp-reply_to\"]', generateEmail());\n       await adminPage.fill('input[name=\"subject\"]', generateEmailSubject());\n       await adminPage.fill('textarea[name=\"reply\"]', generateDescription());\n   \n       /**\n        * Sending mail and closing the modal.\n        */\n       await adminPage.getByRole('button', { name: 'Send' }).click();\n   \n       await expect(adminPage.getByText('Email sent successfully.')).toBeVisible();\n   });\n\n   test(\"should able to upload file in  lead\", async ({ adminPage }) => {\n    /**\n     * Create a new lead.\n     */\n    const lead = await generateLead(adminPage);\n\n    /**\n     * fill the file detail or upload a file.\n     */\n    await openLeadByTitle(adminPage, lead.leadTitle);\n    await adminPage.getByRole('button', { name: ' File' }).click();\n    await adminPage.locator('input[name=\"title\"]').fill(lead.leadTitle);\n    await adminPage.locator('textarea[name=\"comment\"]').fill(generateDescription());\n    await adminPage.locator('input[name=\"name\"]').fill(generateName());\n    await adminPage.locator('#file').setInputFiles(generateFile('example.txt', 'Hello, this is a generated file!'));\n    await adminPage.getByRole('button', { name: 'Save File' }).click();\n   });\n\n   test(\"should able to write a note in lead\", async ({ adminPage }) => {\n    /**\n     * Create a new lead.\n     */\n    const lead = await generateLead(adminPage);\n\n    /**\n     * write a notes \n     */\n    await openLeadByTitle(adminPage, lead.leadTitle);\n    await adminPage.getByRole('button', { name: ' Note' }).click();\n    await adminPage.locator('textarea[name=\"comment\"]').fill(generateDescription());\n    await adminPage.getByRole('button', { name: 'Save Note' }).click();\n   });\n\n   test(\"should able to add call activity in lead\", async ({ adminPage }) => {\n     /**\n     * Create a new lead.\n     */\n     const lead = await generateLead(adminPage);\n\n     /**\n      * write a call activity detail \n      */\n     await openLeadByTitle(adminPage, lead.leadTitle);\n     await adminPage.getByRole('button', { name: ' Activity' }).click();\n     await adminPage.getByRole('heading', { name: 'Add Activity - Call ' }).locator('span').click();\n     await adminPage.getByText('Call', { exact: true }).click();\n     await adminPage.locator('input[name=\"title\"]').fill(lead.leadTitle);\n     await adminPage.locator('textarea[name=\"comment\"]').fill(generateDescription());\n     await adminPage.locator('input[name=\"schedule_from\"]').click();\n     await adminPage.locator('input[name=\"schedule_from\"]').fill(getRandomDateTime());\n     await adminPage.locator('input[name=\"schedule_to\"]').click();\n     await adminPage.locator('input[name=\"schedule_to\"]').fill(getRandomDateTime());\n     await adminPage.locator('input[name=\"location\"]').fill('call');\n     await adminPage.getByRole('button', { name: 'Save Activity' }).click();\n\n   });\n\n   test(\"should able to add meeting activity in lead\", async ({ adminPage }) => {\n    /**\n    * Create a new lead.\n    */\n    const lead = await generateLead(adminPage);\n\n    /**\n     * write a call activity detail \n     */\n    await openLeadByTitle(adminPage, lead.leadTitle);\n    await adminPage.getByRole('button', { name: ' Activity' }).click();\n    await adminPage.getByRole('heading', { name: 'Add Activity' }).locator('span').click();\n    await adminPage.getByText('Meeting', { exact: true }).click();\n    await adminPage.locator('input[name=\"title\"]').fill(lead.leadTitle);\n    await adminPage.locator('textarea[name=\"comment\"]').fill(generateDescription());\n    await adminPage.locator('input[name=\"schedule_from\"]').click();\n    await adminPage.locator('input[name=\"schedule_from\"]').fill(getRandomDateTime());\n    await adminPage.locator('input[name=\"schedule_to\"]').click();\n    await adminPage.locator('input[name=\"schedule_to\"]').fill(getRandomDateTime());\n    await adminPage.locator('input[name=\"location\"]').fill('Google meet');\n    await adminPage.getByRole('button', { name: 'Save Activity' }).click();\n  });\n\n  test(\"should able to add lunch activity in lead\", async ({ adminPage }) => {\n    /**\n    * Create a new lead.\n    */\n    const lead = await generateLead(adminPage);\n\n    /**\n     * write a call activity detail \n     */\n    await openLeadByTitle(adminPage, lead.leadTitle);\n    await adminPage.getByRole('button', { name: ' Activity' }).click();\n    await adminPage.getByRole('heading', { name: 'Add Activity' }).locator('span').click();\n    await adminPage.getByText('Lunch', { exact: true }).click();\n    await adminPage.locator('input[name=\"title\"]').fill(lead.leadTitle);\n    await adminPage.locator('textarea[name=\"comment\"]').fill(generateDescription());\n    await adminPage.locator('input[name=\"schedule_from\"]').click();\n    await adminPage.locator('input[name=\"schedule_from\"]').fill(getRandomDateTime());\n    await adminPage.locator('input[name=\"schedule_to\"]').click();\n    await adminPage.locator('input[name=\"schedule_to\"]').fill(getRandomDateTime());\n    await adminPage.locator('input[name=\"location\"]').fill('Restraunt');\n    await adminPage.getByRole('button', { name: 'Save Activity' }).click();\n  });\n});"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/mail/draft.spec.ts",
    "content": "import { test, expect } from \"../../setup\";\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/mail/inbox.spec.ts",
    "content": "import { test, expect } from '../../setup';\nimport { generateEmail, generateEmailSubject, generateDescription } from '../../utils/faker';\n\nasync function composeMail(adminPage, ccMail = false, bccMail = false) {\n    /**\n     * Reaching to the mail listing page.\n     */\n    await adminPage.goto(\"admin/mail/inbox\");\n\n    /**\n     * Opening compose mail in modal.\n     */\n    await adminPage.getByRole('button', { name: 'Compose Mail' }).click();\n    await adminPage.fill('input[name=\"temp-reply_to\"]', generateEmail());\n    await adminPage.fill('input[name=\"subject\"]', generateEmailSubject());\n    const frameElementHandle = await adminPage.waitForSelector(\n        \"iframe.tox-edit-area__iframe\"\n    );\n\n    const frame = await frameElementHandle.contentFrame();\n\n    await frame.waitForSelector(\"body\");\n    await frame.fill(\"body\", generateDescription());\n\n    /**\n     * Sending mail and closing the modal.\n     */\n    await adminPage.getByRole(\"button\", { name: \"Send\" }).click();\n\n    await expect(adminPage.getByText(\"Email sent successfully.\")).toBeVisible();\n}\n\ntest.describe(\"mail management\", () => {\n    /**\n     * Should be able to compose a mail.\n     */\n    test(\"should compose a mail\", async ({ adminPage }) => {\n        await composeMail(adminPage);\n    });\n\n    /**\n     * Should be able to compose a mail with CC.\n     */\n    test(\"should compose a mail with CC\", async ({ adminPage }) => {\n        const ccMail = true;\n\n        await composeMail(adminPage, ccMail);\n    });\n\n    /**\n     * Should be able to compose a mail with BCC.\n     */\n    test(\"should compose a mail with BCC\", async ({ adminPage }) => {\n        const bccMail = true;\n\n        await composeMail(adminPage, bccMail);\n    });\n\n    /**\n     * Should be able to compose a mail with CC & BCC.\n     */\n    test(\"should compose a mail with CC & BCC\", async ({ adminPage }) => {\n        const ccMail = true;\n\n        const bccMail = true;\n\n        await composeMail(adminPage, ccMail, bccMail);\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/mail/outbox.spec.ts",
    "content": "import { test, expect } from \"../../setup\";\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/mail/sent.spec.ts",
    "content": "import { test, expect } from \"../../setup\";\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/mail/trash.spec.ts",
    "content": "import { test, expect } from \"../../setup\";\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/product.spec.ts",
    "content": "import { test, expect } from \"../setup\";\nimport { generateName, generateSKU, generateDescription } from \"../utils/faker\";\n\ntest.describe(\"product management\", () => {\n    test(\"should create a product\", async ({ adminPage }) => {\n        /**\n         * Go to the product listing page.\n         */\n        await adminPage.goto(\"admin/products\");\n\n        /**\n         * Create Product.\n         */\n        await adminPage.getByRole(\"link\", { name: \"Create Product\" }).click();\n\n        /**\n         * Fill the product form.\n         */\n        const name = generateName();\n        const description = generateDescription();\n        await adminPage.waitForSelector('input[name=\"name\"]', { state: 'visible' });\n        await adminPage.getByRole('textbox', { name: 'Name *' }).click();\n        await adminPage.locator('#name').clear();\n        await adminPage.getByRole('textbox', { name: 'Name *' }).fill(name);\n        await adminPage.locator('textarea[name=\"description\"]').clear();\n        await adminPage\n            .locator('textarea[name=\"description\"]')\n            .type(description);\n        await adminPage.fill('input[name=\"sku\"]', generateSKU());\n        await adminPage.waitForSelector('input[name=\"price\"]', {\n            state: \"visible\",\n        });\n        await adminPage.fill('input[name=\"price\"]', \"100\");\n\n        await adminPage.waitForSelector('input[name=\"quantity\"]', {\n            state: \"visible\",\n        });\n        await adminPage.fill('input[name=\"quantity\"]', \"50\");\n\n        /**\n         * Save Product.\n         */\n        await adminPage.getByRole(\"button\", { name: \"Save Products\" }).click();\n\n        /**\n         * sucess message appear.\n         */\n        await expect(adminPage.locator(\"#app\")).toContainText(\n            \"Product created successfully.\"\n        );\n    });\n\n  test(\"should edit a product\", async ({ adminPage }) => {\n        /**\n         * Go to the product listing page.\n         */\n        await adminPage.goto(\"admin/products\");\n        await adminPage.waitForSelector(\"a.primary-button\", {\n            state: \"visible\",\n        });\n\n        /**\n         * Clicking on the edit icon.\n         */\n        await adminPage.locator(\"span.icon-edit\").first().click();\n        await adminPage.waitForSelector('form[action*=\"/admin/products/edit\"]');\n\n        /**\n         * Edit the product Detail\n         */\n        await adminPage.fill('input[name=\"name\"]', generateName());\n        await adminPage.fill('input[name=\"price\"]', \"1000\");\n        await adminPage.fill('input[name=\"quantity\"]', \"500\");\n        await adminPage.click('button:has-text(\"Save Products\")');\n        await expect(adminPage.locator(\"#app\")).toContainText(\n            \"Product updated successfully.\" );\n    });\n\n    test(\"should delete a product\", async ({ adminPage }) => {\n        /**\n         * Go to the product listing page.\n         */\n        await adminPage.goto(\"admin/products\");\n        await adminPage.waitForSelector(\"a.primary-button\", {\n            state: \"visible\",\n        });\n\n        /**\n         * Clicking on the delete icon.\n         */\n        await adminPage.waitForSelector(\"span.cursor-pointer.icon-delete\", {\n            state: \"visible\",\n        });\n        await adminPage.locator(\"span.icon-delete\").first().click();\n        await adminPage.click(\n            \"button.transparent-button + button.primary-button:visible\"\n        );\n        await expect(adminPage.locator(\"#app\")).toContainText(\n            \"Product deleted successfully.\"\n        );\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/quotes.spec.ts",
    "content": "import { test, expect } from \"../setup\";\nimport {\n    generateEmailSubject,\n    createPerson,\n    generateDate,\n    generateName,\n    createProduct\n} from \"../utils/faker\";\n\ntest.describe(\"quotes management\", () => {\n    test(\"should create a quotes\", async ({ adminPage }) => {\n        /**\n         * Create person.\n         */\n        await adminPage.goto(\"admin/contacts/persons\");\n        const Person = await createPerson(adminPage);\n        /**\n         * Create Product.\n         */\n        await adminPage.goto(\"admin/products\");\n        const Product = await createProduct(adminPage);\n        /**\n         * Create quote.\n         */\n        await adminPage.goto(\"admin/quotes\");\n        await adminPage.getByRole(\"link\", { name: \"Create Quote\" }).click();\n        await adminPage.getByRole(\"textbox\", { name: \"Subject *\" }).click();\n        await adminPage\n            .getByRole(\"textbox\", { name: \"Subject *\" })\n            .fill(generateEmailSubject());\n        await adminPage.getByRole(\"textbox\", { name: \"Description\" }).click();\n        await adminPage\n            .getByRole(\"textbox\", { name: \"Description\" })\n            .fill(generateEmailSubject());\n        await adminPage.getByLabel(\"Sales Owner\").selectOption(\"1\");\n        await adminPage.getByRole(\"textbox\", { name: \"Expired At *\" }).click();\n        await adminPage\n            .getByRole(\"textbox\", { name: \"Expired At *\" })\n            .fill(generateDate());\n        await adminPage.locator(\".relative > div > .relative\").first().click();\n        await adminPage.getByRole(\"textbox\", { name: \"Search...\" }).click();\n        await adminPage\n            .getByRole(\"textbox\", { name: \"Search...\" })\n            .fill(Person.Name);\n        await adminPage\n            .getByRole(\"listitem\")\n            .filter({ hasText: Person.Name })\n            .click();\n\n        /**\n         * Fill billing address.\n         */\n        await adminPage\n            .locator('textarea[name=\"billing_address\\\\[address\\\\]\"]')\n            .click();\n        await adminPage\n            .locator('textarea[name=\"billing_address\\\\[address\\\\]\"]')\n            .fill(\"ARV Park\");\n        await adminPage\n            .locator('select[name=\"billing_address\\\\[country\\\\]\"]')\n            .selectOption(\"IN\");\n        await adminPage\n            .locator('select[name=\"billing_address\\\\[state\\\\]\"]')\n            .selectOption(\"UP\");\n        await adminPage\n            .locator('input[name=\"billing_address\\\\[city\\\\]\"]')\n            .click();\n        await adminPage\n            .locator('input[name=\"billing_address\\\\[city\\\\]\"]')\n            .fill(\"Noida\");\n        await adminPage\n            .locator('input[name=\"billing_address\\\\[postcode\\\\]\"]')\n            .click();\n        await adminPage\n            .locator('input[name=\"billing_address\\\\[postcode\\\\]\"]')\n            .fill(\"201301\");\n\n        /**\n         * Fill shipping address.\n         */\n        await adminPage\n            .locator('textarea[name=\"shipping_address\\\\[address\\\\]\"]')\n            .click();\n        await adminPage\n            .locator('textarea[name=\"shipping_address\\\\[address\\\\]\"]')\n            .fill(\"ARV Park\");\n        await adminPage\n            .locator('select[name=\"shipping_address\\\\[country\\\\]\"]')\n            .selectOption(\"IN\");\n        await adminPage\n            .locator('select[name=\"shipping_address\\\\[state\\\\]\"]')\n            .selectOption(\"UP\");\n        await adminPage\n            .locator('input[name=\"shipping_address\\\\[city\\\\]\"]')\n            .click();\n        await adminPage\n            .locator('input[name=\"shipping_address\\\\[city\\\\]\"]')\n            .fill(\"Noida\");\n        await adminPage\n            .locator('input[name=\"shipping_address\\\\[postcode\\\\]\"]')\n            .click();\n        await adminPage\n            .locator('input[name=\"shipping_address\\\\[postcode\\\\]\"]')\n            .fill(\"201301\");\n\n         await adminPage.locator('.relative.flex.cursor-pointer.items-center.justify-between.rounded.border.p-2').first().click();\n\n        await adminPage.getByRole(\"textbox\", { name: \"Search...\" }).click();\n        await adminPage.getByRole(\"textbox\", { name: \"Search...\" }).fill(Product.name);\n\n        await adminPage.getByRole(\"listitem\").filter({ hasText: Product.name }).first().click();\n\n        await adminPage.getByRole(\"button\", { name: \"Save Quote\" }).click();\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/settings/automation/events.spec.ts",
    "content": "import { test, expect } from \"../../../setup\";\nimport { generateFullName, generateDescription, generateDate } from \"../../../utils/faker\";\nimport { confirmModal } from \"../../../utils/components\";\n\ntest.describe(\"event management\", () => {\n    test(\"should create a event\", async ({ adminPage }) => {\n        /**\n         * Reaching to the events listing page.\n         */\n        await adminPage.goto(\"admin/settings/marketing/events\");\n\n        /**\n         * Opening create event form in modal.\n         */\n        await adminPage.getByRole(\"button\", { name: \"Create Event\" }).click();\n\n        /**\n         * Filling the form with event details.\n         */\n        await adminPage\n            .locator('input[name=\"name\"]')\n            .fill(generateFullName());\n        await adminPage\n            .locator('textarea[name=\"description\"]')\n            .fill(generateDescription());\n        await adminPage\n            .locator('input[name=\"date\"]')\n            .fill(generateDate());\n        await adminPage.getByRole('textbox', { name: 'Date *' }).press('Enter');\n\n        /**\n         * Save event and close the modal.\n         */\n         await adminPage.getByRole('button', { name: 'Save Event' }).click();\n\n        await expect(\n            adminPage.getByText(\"Event created successfully.\")\n        ).toBeVisible();\n    });\n\n    test(\"should edit a event\", async ({ adminPage }) => {\n        /**\n         * Reaching to the events listing page.\n         */\n        await adminPage.goto(\"admin/settings/marketing/events\");\n\n        /**\n         * Clicking on the edit button for the first event opens the modal.\n         */\n        await adminPage.locator('.row > div:nth-child(6) > a').first().click();\n\n        /**\n         * Fill the form with the event details.\n         */\n        await adminPage\n            .locator('input[name=\"name\"]')\n            .fill(generateFullName());\n        await adminPage\n            .locator('textarea[name=\"description\"]')\n            .fill(generateDescription());\n        await adminPage\n            .locator('input[name=\"date\"]')\n            .fill(generateDate());\n\n        /**\n         * Saving event and closing the modal.\n         */\n        await adminPage.getByRole('button', { name: 'Save Event' }).click();\n        await expect(\n            adminPage.getByText(\"Event updated successfully.\")\n        ).toBeVisible();\n    });\n\n    test(\"should delete a event\", async ({ adminPage }) => {\n        /**\n         * Reaching to the event listing page.\n         */\n        await adminPage.goto(\"admin/settings/marketing/events\");\n\n        /**\n         * Delete the first event.\n         */\n        await adminPage.locator('div:nth-child(6) > a:nth-child(2)').first().click();\n\n        /**\n         * Delete confirmation modal.\n         */\n        await adminPage.getByRole('button', { name: 'Agree', exact: true }).click();\n\n        await expect(\n            adminPage.getByText(\"Event deleted successfully.\")\n        ).toBeVisible();\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/settings/lead/types.spec.ts",
    "content": "import { test, expect } from \"../../../setup\";\nimport { generateFullName } from \"../../../utils/faker\";\nimport { confirmModal } from \"../../../utils/components\";\n\ntest.describe(\"type management\", () => {\n    test(\"should create a type\", async ({ adminPage }) => {\n        /**\n         * Reaching to the types listing page.\n         */\n        await adminPage.goto(\"admin/settings/types\");\n\n        /**\n         * Opening create type form in modal.\n         */\n        await adminPage.getByRole(\"button\", { name: \"Create Type\" }).click();\n\n        /**\n         * Filling the form with type details.\n         */\n        await adminPage\n            .locator('input[name=\"name\"]')\n            .fill(generateFullName());\n\n        /**\n         * Save type and close the modal.\n         */\n        await adminPage.getByRole(\"button\", { name: \"Save Type\" }).click();\n\n        await expect(\n            adminPage.getByText(\"Type created successfully.\")\n        ).toBeVisible();\n    });\n\n    test(\"should edit a type\", async ({ adminPage }) => {\n        /**\n         * Generating new name and email for the type.\n         */\n        const updatedName = generateFullName();\n\n        /**\n         * Reaching to the types listing page.\n         */\n        await adminPage.goto(\"admin/settings/types\");\n\n        /**\n         * Clicking on the edit button for the first type opens the modal.\n         */\n        await adminPage.waitForSelector(\"span.cursor-pointer.icon-edit\", {\n            state: \"visible\",\n        });\n        const iconEdit = await adminPage.$$(\"span.cursor-pointer.icon-edit\");\n        await iconEdit[0].click();\n\n        await adminPage.locator('input[name=\"name\"]').fill(updatedName);\n\n        /**\n         * Saving type and closing the modal.\n         */\n        await adminPage.getByRole(\"button\", { name: \"Save Type\" }).click();\n\n        await expect(\n            adminPage.getByText(\"Type updated successfully.\")\n        ).toBeVisible();\n    });\n\n    test(\"should delete a type\", async ({ adminPage }) => {\n        /**\n         * Reaching to the type listing page.\n         */\n        await adminPage.goto(\"admin/settings/types\");\n\n        /**\n         * Delete the first type.\n         */\n        await adminPage.waitForSelector(\"span.cursor-pointer.icon-delete\");\n        const iconDelete = await adminPage.$$(\n            \"span.cursor-pointer.icon-delete\"\n        );\n        await iconDelete[0].click();\n\n        /**\n         * Delete confirmation modal.\n         */\n        await confirmModal(\"Are you sure\", adminPage);\n\n        await expect(\n            adminPage.getByText(\"Type deleted successfully.\")\n        ).toBeVisible();\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/groups.spec.ts",
    "content": "import { test, expect } from \"../../../setup\";\nimport { generateFullName, generateDescription } from \"../../../utils/faker\";\n\ntest.describe(\"group management\", () => {\n    test(\"should create a group\", async ({ adminPage }) => {\n        /**\n         * Reaching to the group listing page.\n         */\n        await adminPage.goto(\"admin/settings/groups\");\n\n        /**\n         * Opening create group form in modal.\n         */\n        await adminPage.getByRole(\"button\", { name: \"Create group\" }).click();\n\n\n        /**\n         * Filling the form with group details.\n         */\n        await adminPage\n            .locator('input[name=\"name\"]')\n            .fill(generateFullName());\n        await adminPage\n            .locator('textarea[name=\"description\"]')\n            .fill(generateDescription(240));\n\n        /**\n         * Save group and close the modal.\n         */\n        await adminPage.getByRole(\"button\", { name: \"Save Group\" }).click();\n\n        await expect(\n            adminPage.getByText(\"Group created successfully.\")\n        ).toBeVisible();\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/settings/user/users.spec.ts",
    "content": "import { test, expect } from \"../../../setup\";\nimport {\n    generateFullName,\n    generateEmail,\n    generateDescription,\n} from \"../../../utils/faker\";\nimport { confirmModal } from \"../../../utils/components\";\n\nasync function createGroup(adminPage) {\n    /**\n     * Navigate to the group listing page.\n     */\n    await adminPage.goto(\"admin/settings/groups\");\n\n    /**\n     * Open the create group form in modal.\n     */\n    await adminPage.getByRole(\"button\", { name: \"Create group\" }).click();\n\n    /**\n     * Generate group name and fill in the form with group details.\n     */\n    const groupName = generateFullName();\n    await adminPage.locator('input[name=\"name\"]').fill(groupName);\n    await adminPage\n        .locator('textarea[name=\"description\"]')\n        .fill(generateDescription(240));\n\n    /**\n     * Save the group and close the modal.\n     */\n    await adminPage.getByRole(\"button\", { name: \"Save Group\" }).click();\n\n    /**\n     * Validate successful creation.\n     */\n    await expect(\n        adminPage.getByText(\"Group created successfully.\")\n    ).toBeVisible();\n\n    return { groupName };\n}\n\ntest.describe(\"user management\", () => {\n    test(\"should create a user with global permission\", async ({ adminPage }) => {\n        /**\n         * Reaching to the user listing page.\n         */\n        await adminPage.goto(\"admin/settings/users\");\n\n        /**\n         * Opening create user form in modal.\n         */\n        await adminPage.getByRole(\"button\", { name: \"Create User\" }).click();\n\n        /**\n         * Filling the form with user details.\n         */\n        await adminPage.locator('input[name=\"name\"]').fill(generateFullName());\n        await adminPage.locator('input[name=\"email\"]').fill(generateEmail());\n        await adminPage.locator('input[name=\"password\"]').fill(\"admin123\");\n        await adminPage\n            .locator('input[name=\"confirm_password\"]')\n            .fill(\"admin123\");\n        await adminPage.locator('select[name=\"role_id\"]').selectOption(\"1\");\n        await adminPage\n            .locator('select[name=\"view_permission\"]')\n            .selectOption(\"global\");\n\n        /**\n         *  Clicking on the status toggler to make the user active.\n         */\n        await adminPage.click('label[for=\"status\"]');\n\n        /**\n         * Save user and close the modal.\n         */\n        await adminPage.getByRole(\"button\", { name: \"Save User\" }).click();\n\n        await expect(\n            adminPage.getByText(\"User created successfully.\")\n        ).toBeVisible();\n    });\n\n    test(\"should create a user with group permission\", async ({ adminPage }) => {\n        /**\n         * Creating a group to assign to the user.\n         */\n        const name = await createGroup(adminPage);\n\n        /**\n         * Reaching to the user listing page.\n         */\n        await adminPage.goto(\"admin/settings/users\");\n\n        /**\n         * Opening create user form in modal.\n         */\n        await adminPage.getByRole(\"button\", { name: \"Create User\" }).click();\n\n        /**\n         * Filling the form with user details.\n         */\n        await adminPage.locator('input[name=\"name\"]').fill(generateFullName());\n        await adminPage.locator('input[name=\"email\"]').fill(generateEmail());\n        await adminPage.locator('input[name=\"password\"]').fill(\"admin123\");\n        await adminPage\n            .locator('input[name=\"confirm_password\"]')\n            .fill(\"admin123\");\n        await adminPage.locator('select[name=\"role_id\"]').selectOption(\"1\");\n        await adminPage\n            .locator('select[name=\"view_permission\"]')\n            .selectOption(\"group\");\n        await adminPage.getByRole('listbox').selectOption({ label: name.groupName });\n\n        /**\n         *  Clicking on the status toggler to make the user active.\n         */\n        await adminPage.click('label[for=\"status\"]');\n\n        /**\n         * Save user and close the modal.\n         */\n        await adminPage.getByRole(\"button\", { name: \"Save User\" }).click();\n\n        await expect(\n            adminPage.getByText(\"User created successfully.\")\n        ).toBeVisible();\n    });\n\n    test(\"should create a user with individual permission\", async ({ adminPage }) => {\n        /**\n         * Reaching to the user listing page.\n         */\n        await adminPage.goto(\"admin/settings/users\");\n\n        /**\n         * Opening create user form in modal.\n         */\n        await adminPage.getByRole(\"button\", { name: \"Create User\" }).click();\n\n        /**\n         * Filling the form with user details.\n         */\n        await adminPage.locator('input[name=\"name\"]').fill(generateFullName());\n        await adminPage.locator('input[name=\"email\"]').fill(generateEmail());\n        await adminPage.locator('input[name=\"password\"]').fill(\"admin123\");\n        await adminPage\n            .locator('input[name=\"confirm_password\"]')\n            .fill(\"admin123\");\n        await adminPage.locator('select[name=\"role_id\"]').selectOption(\"1\");\n        await adminPage\n            .locator('select[name=\"view_permission\"]')\n            .selectOption(\"individual\");\n\n        /**\n         *  Clicking on the status toggler to make the user active.\n         */\n        await adminPage.click('label[for=\"status\"]');\n\n        /**\n         * Save user and close the modal.\n         */\n        await adminPage.getByRole(\"button\", { name: \"Save User\" }).click();\n\n        await expect(\n            adminPage.getByText(\"User created successfully.\")\n        ).toBeVisible();\n    });\n\n    test(\"should edit a users\", async ({ adminPage }) => {\n        /**\n         * Generating new name and email for the user.\n         */\n        const updatedName = generateFullName();\n        const updatedEmail = generateEmail();\n\n        /**\n         * Reaching to the user listing page.\n         */\n        await adminPage.goto(\"admin/settings/users\");\n\n        /**\n         * Clicking on the edit button for the first user opens the modal.\n         */\n        await adminPage.waitForSelector(\"span.cursor-pointer.icon-edit\", {\n            state: \"visible\",\n        });\n        const iconEdit = await adminPage.$$(\"span.cursor-pointer.icon-edit\");\n        await iconEdit[0].click();\n\n        await adminPage.locator('input[name=\"name\"]').fill(updatedName);\n        await adminPage.locator('input[name=\"email\"]').fill(updatedEmail);\n\n        /**\n         * Saving user and closing the modal.\n         */\n        await adminPage.getByRole(\"button\", { name: \"Save User\" }).click();\n        await expect(adminPage.locator('#app')).toContainText(\"User updated successfully.\");\n        await expect(adminPage.locator(\"#app\")).toContainText(updatedName);\n        await expect(\n            adminPage.getByRole(\"paragraph\").filter({ hasText: updatedEmail })\n        ).toBeVisible();\n    });\n\n    test(\"should delete a user\", async ({ adminPage }) => {\n        /**\n         * Reaching to the user listing page.\n         */\n        await adminPage.goto(\"admin/settings/users\");\n\n        /**\n         * Delete the first user.\n         */\n        await adminPage.waitForSelector(\"span.cursor-pointer.icon-delete\");\n        const iconDelete = await adminPage.$$(\n            \"span.cursor-pointer.icon-delete\"\n        );\n        await iconDelete[0].click();\n\n        /**\n         * Delete confirmation modal.\n         */\n        await confirmModal(\"Are you sure\", adminPage);\n        await expect(adminPage.locator('#app')).toContainText(\"User deleted successfully.\");\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/tests/settings/warehouses/warehouse.spec.ts",
    "content": "import { test, expect } from \"../../../setup\";\nimport { confirmModal } from \"../../../utils/components\";\n\ntest.describe(\"warehouse management\", () => {\n    test(\"should create a warehouse\", async ({ adminPage }) => {\n        /**\n         * Reaching to the warehouses listing page.\n         */\n        await adminPage.goto(\"admin/settings/warehouses\");\n\n        // Add code for creating a warehouse.\n\n    });\n\n    test(\"should edit a warehouse\", async ({ adminPage }) => {\n        /**\n         * Reaching to the warehouses listing page.\n         */\n        await adminPage.goto(\"admin/settings/warehouses\");\n\n        /**\n         * Clicking on the edit button for the first warehouse opens the modal.\n         */\n        // await adminPage.waitForSelector(\"span.cursor-pointer.icon-edit\", {\n        //     state: \"visible\",\n        // });\n        // const iconEdit = await adminPage.$$(\"span.cursor-pointer.icon-edit\");\n        // await iconEdit[0].click();\n\n        // Add code to edit the warehouse.\n    });\n\n    test(\"should delete a warehouse\", async ({ adminPage }) => {\n        /**\n         * Reaching to the warehouse listing page.\n         */\n        await adminPage.goto(\"admin/settings/warehouses\");\n\n        /**\n         * Delete the first warehouse.\n         */\n        // await adminPage.waitForSelector(\"span.cursor-pointer.icon-delete\");\n        // const iconDelete = await adminPage.$$(\n        //     \"span.cursor-pointer.icon-delete\"\n        // );\n        // await iconDelete[0].click();\n\n        // /**\n        //  * Delete confirmation modal.\n        //  */\n        // await confirmModal(\"Are you sure\", adminPage);\n\n        // await expect(\n        //     adminPage.getByText(\"Warehouse deleted successfully.\")\n        // ).toBeVisible();\n    });\n}); "
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/utils/components.ts",
    "content": "/**\n * Confirm the modal dialog.\n */\nexport function confirmModal(message, page) {\n    return new Promise(async (resolve, reject) => {\n        await page.waitForSelector(\"text=\" + message);\n        const agreeButton = await page.locator(\n            'button.primary-button:has-text(\"Agree\")'\n        );\n\n        if (await agreeButton.isVisible()) {\n            await agreeButton.click();\n            resolve(true);\n        } else {\n            reject(\"Agree button not found or not visible.\");\n        }\n    });\n}"
  },
  {
    "path": "packages/Webkul/Admin/tests/e2e-pw/utils/faker.ts",
    "content": "import fs from \"fs\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nconst usedNames = new Set();\nconst usedEmails = new Set();\nconst usedNumbers = new Set();\nconst usedSlugs = new Set();\n\n/**\n * Generate a random name.\n */\nfunction generateName() {\n    const adjectives = [\n        \"Cool\", \"Smart\", \"Fast\", \"Sleek\", \"Innovative\", \"Shiny\", \"Bold\",\n        \"Elegant\", \"Epic\", \"Mystic\", \"Brilliant\", \"Luminous\", \"Radiant\",\n        \"Majestic\", \"Vivid\", \"Glowing\", \"Dynamic\", \"Fearless\", \"Silent\",\n        \"Electric\", \"Golden\", \"Blazing\", \"Timeless\", \"Noble\", \"Eternal\"\n      ];\n\n      const nouns = [\n        \"Star\", \"Vision\", \"Echo\", \"Spark\", \"Horizon\", \"Nova\", \"Shadow\",\n        \"Wave\", \"Pulse\", \"Vortex\", \"Zenith\", \"Element\", \"Flare\", \"Comet\",\n        \"Galaxy\", \"Ember\", \"Crystal\", \"Sky\", \"Stone\", \"Blaze\", \"Eclipse\",\n        \"Storm\", \"Orbit\", \"Phantom\", \"Mirage\"\n      ];\n\n    let name = \"\";\n\n    do {\n        const adj = adjectives[Math.floor(Math.random() * adjectives.length)];\n        const noun = nouns[Math.floor(Math.random() * nouns.length)];\n\n        name = `${adj} ${noun}`;\n    } while (usedNames.has(name));\n\n    usedNames.add(name);\n\n    return name;\n}\n\n/**\n * Generate the first Name.\n */\nfunction generateFirstName() {\n    const firstNames = [\n        \"James\",\n        \"Emma\",\n        \"Liam\",\n        \"Olivia\",\n        \"Noah\",\n        \"Ava\",\n        \"William\",\n        \"Sophia\",\n        \"Benjamin\",\n        \"Isabella\",\n        \"Lucas\",\n        \"Mia\",\n    ];\n\n    return firstNames[Math.floor(Math.random() * firstNames.length)];\n}\n\n/**\n * Generate the last name.\n */\nfunction generateLastName() {\n    const lastNames = [\n        \"Smith\",\n        \"Johnson\",\n        \"Brown\",\n        \"Williams\",\n        \"Jones\",\n        \"Garcia\",\n        \"Miller\",\n        \"Davis\",\n        \"Rodriguez\",\n        \"Martinez\",\n        \"Hernandez\",\n        \"Lopez\",\n    ];\n\n    return lastNames[Math.floor(Math.random() * lastNames.length)];\n}\n\n/**\n * Generate the full name.\n */\nfunction generateFullName() {\n    return `${generateFirstName()} ${generateLastName()}`;\n}\n\n/**\n * Generate the email address.\n */\nfunction generateEmail() {\n    const adjectives = [\n        \"Cool\",\n        \"Smart\",\n        \"Fast\",\n        \"Sleek\",\n        \"Innovative\",\n        \"Shiny\",\n        \"Bold\",\n        \"Elegant\",\n        \"Epic\",\n        \"Mystic\",\n        \"Brilliant\",\n        \"Luminous\",\n    ];\n\n    const nouns = [\n        \"Star\",\n        \"Vision\",\n        \"Echo\",\n        \"Spark\",\n        \"Horizon\",\n        \"Nova\",\n        \"Shadow\",\n        \"Wave\",\n        \"Pulse\",\n        \"Vortex\",\n        \"Zenith\",\n        \"Element\",\n    ];\n\n    let email = \"\";\n\n    do {\n        const adj = adjectives[Math.floor(Math.random() * adjectives.length)];\n        const noun = nouns[Math.floor(Math.random() * nouns.length)];\n        const number = Math.floor(1000 + Math.random() * 9000);\n\n        email = `${adj}${noun}${number}@example.com`.toLowerCase();\n    } while (usedEmails.has(email));\n\n    usedEmails.add(email);\n\n    return email;\n}\n\n/**\n * Generate the phone number.\n */\nfunction generatePhoneNumber() {\n    let phoneNumber;\n\n    do {\n        phoneNumber = Math.floor(6000000000 + Math.random() * 4000000000);\n    } while (usedNumbers.has(phoneNumber));\n\n    usedNumbers.add(phoneNumber);\n\n    return `${phoneNumber}`;\n}\n\n/**\n * Generate a random SKU.\n */\nfunction generateSKU() {\n    const letters = Array.from({ length: 3 }, () =>\n        String.fromCharCode(65 + Math.floor(Math.random() * 26))\n    ).join(\"\");\n\n    const numbers = Math.floor(1000 + Math.random() * 9000);\n\n    return `${letters}${numbers}`;\n}\n\n/**\n * Generate a random URL.\n */\nfunction generateSlug(delimiter = \"-\") {\n    let slug;\n\n    do {\n        const name = generateName();\n\n        const randomStr = Math.random().toString(36).substring(2, 8);\n\n        slug = `${name\n            .toLowerCase()\n            .replace(/\\s+/g, delimiter)}${delimiter}${randomStr}`;\n    } while (usedSlugs.has(slug));\n\n    usedSlugs.add(slug);\n\n    return slug;\n}\n\n/**\n * Generate a random email subject.\n */\nfunction generateEmailSubject() {\n    const subjects = [\n        \"Exciting news just for you!\",\n        \"Don't miss out on this opportunity!\",\n        \"Limited time offer – act now!\",\n        \"An exclusive deal awaits you!\",\n        \"Your next big opportunity is here!\",\n        \"Something special just for you!\",\n        \"Unlock amazing benefits today!\",\n        \"Surprise! A special gift inside!\",\n        \"This could change everything for you!\",\n        \"You're invited to something amazing!\",\n        \"Get ready for a game-changing experience!\",\n        \"Hurry! This offer won't last long!\",\n        \"A deal you simply can’t resist!\",\n        \"Exclusive access – only for you!\",\n        \"We’ve got something exciting for you!\",\n        \"Your perfect opportunity is here!\",\n        \"Important update – check this out!\",\n        \"Discover what’s waiting for you!\",\n        \"A limited-time surprise for you!\",\n        \"Special invitation – don’t miss out!\",\n    ];\n\n    return subjects[Math.floor(Math.random() * subjects.length)];\n}\n\n\n/**\n * Generate the description.\n */\nfunction generateDescription(length = 255) {\n    const phrases = [\n        \"An innovative and sleek design.\",\n        \"Built for speed and efficiency.\",\n        \"Experience the future today.\",\n        \"A perfect blend of style and power.\",\n        \"Engineered to perfection.\",\n        \"Designed for those who dream big.\",\n        \"Unleash creativity with this masterpiece.\",\n        \"A game-changer in every way.\",\n        \"Smart, fast, and reliable.\",\n        \"The perfect companion for your journey.\",\n        \"Crafted with precision and excellence.\",\n        \"Innovation that redefines possibilities.\",\n        \"Enhancing your experience like never before.\",\n        \"Where technology meets elegance.\",\n        \"Power, performance, and perfection combined.\",\n        \"Redefining the way you experience the world.\",\n        \"A masterpiece of engineering and design.\",\n        \"Unmatched quality and exceptional performance.\",\n        \"Designed to elevate your lifestyle.\",\n        \"Beyond expectations, beyond limits.\",\n    ];\n\n    let description = \"\";\n\n    while (length > 0) {\n        let phrase = phrases[Math.floor(Math.random() * phrases.length)];\n\n        if (phrase.length <= length) {\n            description += (description ? \" \" : \"\") + phrase;\n            length -= phrase.length;\n        } else {\n            description += \" \" + phrase.substring(0, length);\n            break;\n        }\n    }\n\n    return description.trim();\n}\n\n/**\n * Generate the host name.\n */\nfunction generateHostname() {\n    const words = [\n        \"tech\",\n        \"cloud\",\n        \"byte\",\n        \"stream\",\n        \"nexus\",\n        \"core\",\n        \"pulse\",\n        \"data\",\n        \"sync\",\n        \"wave\",\n        \"hub\",\n        \"zone\",\n    ];\n\n    const domains = [\".com\", \".net\", \".io\", \".ai\", \".xyz\", \".co\"];\n\n    const part1 = words[Math.floor(Math.random() * words.length)];\n    const part2 = words[Math.floor(Math.random() * words.length)];\n    const domain = domains[Math.floor(Math.random() * domains.length)];\n\n    return `https://${part1}${part2}${domain}`;\n}\n\n/**\n * Generate a random element from the array.\n */\nfunction randomElement(array) {\n    return array[Math.floor(Math.random() * array.length)];\n}\n\n/**\n * Get a random image file from the directory.\n */\nfunction getImageFile(\n    directory = path.resolve(__dirname, \"../data/images/\")\n) {\n    if (!fs.existsSync(directory)) {\n        throw new Error(`Directory does not exist: ${directory}`);\n    }\n\n    const files = fs.readdirSync(directory);\n    const imageFiles = files.filter((file) =>\n        /\\.(gif|jpeg|jpg|png|svg|webp)$/i.test(file)\n    );\n\n    if (!imageFiles.length) {\n        throw new Error(\"No image files found in the directory.\");\n    }\n\n    const randomIndex = Math.floor(Math.random() * imageFiles.length);\n\n    return path.join(directory, imageFiles[randomIndex]);\n}\n\n/**\n * Generate a random date from today onwards in YYYY-MM-DD format.\n */\nfunction generateDate(): string {\n    const today = new Date().getTime();\n    const futureEnd = new Date(2030, 11, 31).getTime();\n    const randomDate = new Date(today + Math.random() * (futureEnd - today));\n\n    return randomDate.toISOString().split('T')[0];\n}\n\n/**\n * Function to generate a random company name\n */\nfunction generateCompanyName() {\n    const prefixes = [\n        \"Tech\", \"Software\", \"Innovate\", \"NextGen\", \"Cloud\", \"AI\", \"Cyber\", \"Digital\",\n        \"Technical\", \"Product\", \"Organization\", \"Vendor\", \"Rock-on\", \"Super\", \"Quantum\",\n        \"Neural\", \"Hyper\", \"Ultra\", \"Smart\", \"Future\", \"Mega\", \"Omni\", \"Virtual\", \"Dynamic\",\n        \"Secure\", \"Data\", \"Meta\", \"Nano\", \"Robo\", \"Infinity\", \"Vision\", \"Intelli\", \"Strato\",\n        \"Blue\", \"Green\", \"Red\", \"White\", \"Black\", \"Deep\", \"Elite\", \"Prime\", \"Titan\", \"Nova\",\n        \"Storm\", \"Lightning\", \"Vertex\", \"Pioneer\", \"Omnis\", \"Synergy\", \"Core\", \"Nexus\"\n    ];\n    const suffixes = [\n        \"Solutions\", \"Systems\", \"Pvt Ltd\", \"Technologies\", \"Enterprises\", \"Labs\", \"Networks\",\n        \"Corporation\", \"Group\", \"Ventures\", \"Holdings\", \"Consulting\", \"Industries\", \"Analytics\",\n        \"Innovations\", \"Services\", \"Softwares\", \"Developers\", \"AI\", \"Cloud\", \"Security\", \"Dynamics\",\n        \"Technica\", \"Data\", \"Infotech\", \"Research\", \"Automation\", \"Synergy\", \"Strategies\", \"Platform\",\n        \"Operations\", \"Logistics\", \"Infrastructure\", \"Management\", \"Digital\", \"Interactive\",\n        \"Vision\", \"Connect\", \"Smart\", \"Solutions Inc\", \"Partners\", \"Tech Ltd\", \"Info Systems\",\n        \"Growth\", \"Intelligence\", \"RoboCorp\", \"Edge\", \"Enterprise\", \"Global\", \"Power\", \"NextGen\",\n        \"Creative\"\n    ];\n    return `${prefixes[Math.floor(Math.random() * prefixes.length)]} ${suffixes[Math.floor(Math.random() * suffixes.length)]}`;\n}\n\nfunction generateProductName() {\n    const adjectives = ['Awesome', 'Portable', 'Eco', 'Smart', 'Compact'];\n    const items = ['Phone', 'Laptop', 'Bottle', 'Bag', 'Watch'];\n    return (\n        adjectives[Math.floor(Math.random() * adjectives.length)] +\n        ' ' +\n        items[Math.floor(Math.random() * items.length)]\n    );\n}\n\nfunction generatePrice() {\n    return (Math.random() * (999 - 10) + 10).toFixed(2);\n}\n\nfunction generateQuantity() {\n    return Math.floor(Math.random() * 100 + 1).toString();\n}\n/**\n * Function to automate organization creation\n */\nasync function createOrganization(page) {\n    const companyName = generateCompanyName();\n\n    /**\n     * Click on \"Create Organization\" button\n     */\n    await page.goto('admin/contacts/organizations');\n    await page.getByRole('link', { name: 'Create Organization' }).click();\n\n    /**\n     * Fill in organization details\n     */\n    await page.getByRole('textbox', { name: 'Name *' }).fill(companyName);\n    await page.locator('textarea[name=\"address\\\\[address\\\\]\"]').fill('ARV Park');\n    await page.getByRole('combobox').selectOption('IN');\n    await page.locator('select[name=\"address\\\\[state\\\\]\"]').selectOption('DL');\n    await page.getByRole('textbox', { name: 'City' }).fill('Delhi');\n    await page.getByRole('textbox', { name: 'Postcode' }).fill('123456');\n\n    /**\n     * Click to add extra details\n     */\n    await page.locator('div').filter({ hasText: /^Click to add$/ }).nth(2).click();\n    await page.getByRole('textbox', { name: 'Search...' }).fill('exampl');\n    await page.getByRole('listitem').filter({ hasText: 'Example' }).click();\n\n    /**\n     * Click on \"Save Organization\"\n     */\n    await page.getByRole('button', { name: 'Save Organization' }).click();\n    // await expect(page.getByText(companyName)).toBeVisible();\n    return companyName;\n}\n\nfunction generateJobProfile() {\n    const jobProfiles = [\n        \"Playwright Automation Tester\",\n        \"Software Engineer\",\n        \"Data Analyst\",\n        \"Project Manager\",\n        \"DevOps Engineer\",\n        \"QA Engineer\",\n        \"UI/UX Designer\",\n        \"Product Manager\",\n        \"Cybersecurity Analyst\",\n        \"Cloud Architect\"\n    ];\n    const randomIndex = Math.floor(Math.random() * jobProfiles.length);\n    return jobProfiles[randomIndex];\n}\n\nasync function createPerson(page) {\n    const Name = generateFullName();\n    const email = generateEmail();\n    const phone = generatePhoneNumber();\n    const Job = generateJobProfile();\n\n    await page.getByRole('link', { name: 'Create Person' }).click();\n\n    await page.getByRole('textbox', { name: 'Name *' }).fill(Name);\n    await page.getByRole('textbox', { name: 'Emails *' }).fill(email);\n    await page.getByRole('textbox', { name: 'Contact Numbers' }).fill(phone);\n    await page.getByRole('textbox', { name: 'Job Title' }).fill(Job);\n\n    // Select an organization\n    await page.locator('.relative > div > .relative').first().click();\n    await page.getByRole('textbox', { name: 'Search...' }).fill('examp');\n    await page.getByRole('listitem').filter({ hasText: 'Example' }).click();\n\n    // Save person\n    await page.getByRole('button', { name: 'Save Person' }).click();\n\n    return { Name, email, phone };\n}\n\nasync function createProduct(page) {\n    const name = generateProductName();\n    const description = generateDescription();\n    const sku = generateSKU();\n    const price = generatePrice();\n    const quantity = generateQuantity();\n\n    await page.getByRole('link', { name: 'Create Product' }).click();\n\n    await page.getByRole('textbox', { name: 'Name *' }).fill(name);\n    await page.getByRole('textbox', { name: 'Description' }).fill(description);\n    await page.getByRole('textbox', { name: 'SKU *' }).fill(sku);\n    await page.getByRole('textbox', { name: /price/i }).fill(price);\n    await page.getByRole('textbox', { name: 'Quantity *' }).fill(quantity);\n    await page.getByRole('button', { name: 'Save Products' }).click();\n\n    return { name };\n}\n\nfunction getRandomDateTime() {\n    const year = Math.floor(Math.random() * (2030 - 2020 + 1)) + 2020;\n    const month = String(Math.floor(Math.random() * 12) + 1).padStart(2, '0');\n    const day = String(Math.floor(Math.random() * 28) + 1).padStart(2, '0');\n    const hours = String(Math.floor(Math.random() * 24)).padStart(2, '0');\n    const minutes = String(Math.floor(Math.random() * 60)).padStart(2, '0');\n    const seconds = String(Math.floor(Math.random() * 60)).padStart(2, '0');\n\n    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n  }\n\nexport {\n    generateName,\n    generateFirstName,\n    generateLastName,\n    generateFullName,\n    generateEmail,\n    generatePhoneNumber,\n    generateSKU,\n    generateSlug,\n    generateEmailSubject,\n    generateDescription,\n    generateHostname,\n    randomElement,\n    getImageFile,\n    generateDate,\n    createOrganization,\n    generateCompanyName,\n    createPerson,\n    getRandomDateTime,\n    createProduct\n};\n"
  },
  {
    "path": "packages/Webkul/Admin/vite.config.js",
    "content": "import { defineConfig, loadEnv } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\nimport laravel from \"laravel-vite-plugin\";\nimport path from \"path\";\n\nexport default defineConfig(({ mode }) => {\n    const envDir = \"../../../\";\n\n    Object.assign(process.env, loadEnv(mode, envDir));\n\n    return {\n        build: {\n            emptyOutDir: true,\n        },\n\n        envDir,\n\n        server: {\n            host: process.env.VITE_HOST || \"localhost\",\n            port: process.env.VITE_PORT || 5173,\n            cors: true,\n        },\n\n        plugins: [\n            vue(),\n\n            laravel({\n                hotFile: \"../../../public/admin-vite.hot\",\n                publicDirectory: \"../../../public\",\n                buildDirectory: \"admin/build\",\n                input: [\n                    \"src/Resources/assets/css/app.css\",\n                    \"src/Resources/assets/js/app.js\",\n                    \"src/Resources/assets/js/chart.js\",\n                ],\n                refresh: true,\n            }),\n        ],\n\n        experimental: {\n            renderBuiltUrl(filename, { hostId, hostType, type }) {\n                if (hostType === \"css\") {\n                    return path.basename(filename);\n                }\n            },\n        },\n    };\n});\n"
  },
  {
    "path": "packages/Webkul/Attribute/composer.json",
    "content": "{\n    \"name\": \"krayin/laravel-attribute\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Jitendra Singh\",\n            \"email\": \"jitendra@webkul.com\"\n        }\n    ],\n    \"require\": {\n        \"krayin/laravel-core\": \"^1.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Webkul\\\\Attribute\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"laravel\": {\n            \"providers\": [\n                \"Webkul\\\\Attribute\\\\Providers\\\\AttributeServiceProvider\"\n            ],\n            \"aliases\": {}\n        }\n    },\n    \"minimum-stability\": \"dev\"\n}"
  },
  {
    "path": "packages/Webkul/Attribute/src/Config/attribute_lookups.php",
    "content": "<?php\n\nreturn [\n\n];\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Contracts/Attribute.php",
    "content": "<?php\n\nnamespace Webkul\\Attribute\\Contracts;\n\ninterface Attribute {}\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Contracts/AttributeOption.php",
    "content": "<?php\n\nnamespace Webkul\\Attribute\\Contracts;\n\ninterface AttributeOption {}\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Contracts/AttributeValue.php",
    "content": "<?php\n\nnamespace Webkul\\Attribute\\Contracts;\n\ninterface AttributeValue {}\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Database/Migrations/2021_04_02_080709_create_attributes_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('attributes', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('code');\n            $table->string('name');\n            $table->string('type');\n            $table->string('lookup_type')->nullable();\n            $table->string('entity_type');\n            $table->integer('sort_order')->nullable();\n            $table->string('validation')->nullable();\n            $table->boolean('is_required')->default(0);\n            $table->boolean('is_unique')->default(0);\n            $table->boolean('quick_add')->default(0);\n            $table->boolean('is_user_defined')->default(1);\n            $table->unique(['code', 'entity_type']);\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('attributes');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Database/Migrations/2021_04_02_080837_create_attribute_options_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('attribute_options', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name')->nullable();\n            $table->integer('sort_order')->nullable();\n            $table->integer('attribute_id')->unsigned();\n            $table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('attribute_options');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Database/Migrations/2021_04_06_122751_create_attribute_values_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('attribute_values', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('entity_type')->default('leads');\n            $table->text('text_value')->nullable();\n            $table->boolean('boolean_value')->nullable();\n            $table->integer('integer_value')->nullable();\n            $table->double('float_value')->nullable();\n            $table->datetime('datetime_value')->nullable();\n            $table->date('date_value')->nullable();\n            $table->json('json_value')->nullable();\n\n            $table->integer('entity_id')->unsigned();\n            $table->integer('attribute_id')->unsigned();\n\n            $table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade');\n            $table->unique(['entity_type', 'entity_id', 'attribute_id'], 'entity_type_attribute_value_index_unique');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('attribute_values');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Database/Migrations/2025_07_02_191710_alter_attribute_values_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::table('attribute_values', function (Blueprint $table) {\n            $table->string('unique_id')->nullable();\n        });\n\n        $tablePrefix = DB::getTablePrefix();\n\n        DB::statement('UPDATE '.$tablePrefix.\"attribute_values SET unique_id = CONCAT(entity_id, '|', attribute_id)\");\n\n        Schema::table('attribute_values', function (Blueprint $table) {\n            $table->unique('unique_id');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::table('attribute_values', function (Blueprint $table) {\n            $table->dropUnique(['unique_id']);\n\n            $table->dropColumn('unique_id');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Models/Attribute.php",
    "content": "<?php\n\nnamespace Webkul\\Attribute\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Attribute\\Contracts\\Attribute as AttributeContract;\n\nclass Attribute extends Model implements AttributeContract\n{\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'code',\n        'name',\n        'type',\n        'entity_type',\n        'lookup_type',\n        'is_required',\n        'is_unique',\n        'quick_add',\n        'validation',\n        'is_user_defined',\n    ];\n\n    /**\n     * Get the options.\n     */\n    public function options()\n    {\n        return $this->hasMany(AttributeOptionProxy::modelClass());\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Models/AttributeOption.php",
    "content": "<?php\n\nnamespace Webkul\\Attribute\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Attribute\\Contracts\\AttributeOption as AttributeOptionContract;\n\nclass AttributeOption extends Model implements AttributeOptionContract\n{\n    public $timestamps = false;\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'sort_order',\n        'attribute_id',\n    ];\n\n    /**\n     * Get the attribute that owns the attribute option.\n     */\n    public function attribute()\n    {\n        return $this->belongsTo(AttributeProxy::modelClass());\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Models/AttributeOptionProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Attribute\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass AttributeOptionProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Models/AttributeProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Attribute\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass AttributeProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Models/AttributeValue.php",
    "content": "<?php\n\nnamespace Webkul\\Attribute\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Activity\\Traits\\LogsActivity;\nuse Webkul\\Attribute\\Contracts\\AttributeValue as AttributeValueContract;\n\nclass AttributeValue extends Model implements AttributeValueContract\n{\n    use LogsActivity;\n\n    /**\n     * Disable the default timestamps.\n     *\n     * @var bool\n     */\n    public $timestamps = false;\n\n    /**\n     * Cast the attributes to their respective types.\n     *\n     * @var array\n     */\n    protected $casts = [\n        'json_value' => 'array',\n    ];\n\n    /**\n     * The attributes that are fillable for the model.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'attribute_id',\n        'text_value',\n        'boolean_value',\n        'integer_value',\n        'float_value',\n        'datetime_value',\n        'date_value',\n        'json_value',\n        'entity_id',\n        'entity_type',\n    ];\n\n    /**\n     * The attributes that are used for logging activity.\n     *\n     * @var array\n     */\n    public static $attributeTypeFields = [\n        'text' => 'text_value',\n        'textarea' => 'text_value',\n        'price' => 'float_value',\n        'boolean' => 'boolean_value',\n        'select' => 'integer_value',\n        'multiselect' => 'text_value',\n        'checkbox' => 'text_value',\n        'email' => 'json_value',\n        'address' => 'json_value',\n        'phone' => 'json_value',\n        'lookup' => 'integer_value',\n        'datetime' => 'datetime_value',\n        'date' => 'date_value',\n        'file' => 'text_value',\n        'image' => 'text_value',\n    ];\n\n    /**\n     * Get the attribute that owns the attribute value.\n     */\n    public function attribute()\n    {\n        return $this->belongsTo(AttributeProxy::modelClass());\n    }\n\n    /**\n     * Get the parent entity model (leads, products, persons or organizations).\n     */\n    public function entity()\n    {\n        return $this->morphTo();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Models/AttributeValueProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Attribute\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass AttributeValueProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Providers/AttributeServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Attribute\\Providers;\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\ServiceProvider;\n\nclass AttributeServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap services.\n     *\n     * @return void\n     */\n    public function boot(Router $router)\n    {\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n    }\n\n    /**\n     * Register services.\n     *\n     * @return void\n     */\n    public function register()\n    {\n        $this->registerConfig();\n    }\n\n    /**\n     * Register package config.\n     *\n     * @return void\n     */\n    protected function registerConfig()\n    {\n        $this->mergeConfigFrom(\n            dirname(__DIR__).'/Config/attribute_lookups.php', 'attribute_lookups'\n        );\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Attribute\\Providers;\n\nuse Webkul\\Attribute\\Models\\Attribute;\nuse Webkul\\Attribute\\Models\\AttributeOption;\nuse Webkul\\Attribute\\Models\\AttributeValue;\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    /**\n     * @var array{\n     *  0: class-string<Attribute>,\n     *  1: class-string<AttributeOption>,\n     *  2: class-string<AttributeValue>\n     * }\n     */\n    protected $models = [\n        Attribute::class,\n        AttributeOption::class,\n        AttributeValue::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Repositories/AttributeOptionRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Attribute\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass AttributeOptionRepository extends Repository\n{\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\Attribute\\Contracts\\AttributeOption';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Repositories/AttributeRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Attribute\\Repositories;\n\nuse Illuminate\\Container\\Container;\nuse Illuminate\\Support\\Str;\nuse Webkul\\Attribute\\Contracts\\Attribute;\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass AttributeRepository extends Repository\n{\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeOptionRepository $attributeOptionRepository,\n        Container $container\n    ) {\n        parent::__construct($container);\n    }\n\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\Attribute\\Contracts\\Attribute';\n    }\n\n    /**\n     * @return Attribute\n     */\n    public function create(array $data)\n    {\n        $options = isset($data['options']) ? $data['options'] : [];\n\n        $attribute = $this->model->create($data);\n\n        if (in_array($attribute->type, ['select', 'multiselect', 'checkbox']) && count($options)) {\n            $sortOrder = 1;\n\n            foreach ($options as $optionInputs) {\n                $this->attributeOptionRepository->create(array_merge([\n                    'attribute_id' => $attribute->id,\n                    'sort_order' => $sortOrder++,\n                ], $optionInputs));\n            }\n        }\n\n        return $attribute;\n    }\n\n    /**\n     * @param  int  $id\n     * @param  string  $attribute\n     * @return Attribute\n     */\n    public function update(array $data, $id, $attribute = 'id')\n    {\n        $attribute = $this->find($id);\n\n        $attribute->update($data);\n\n        if (! in_array($attribute->type, ['select', 'multiselect', 'checkbox'])) {\n            return $attribute;\n        }\n\n        if (! isset($data['options'])) {\n            return $attribute;\n        }\n\n        foreach ($data['options'] as $optionId => $optionInputs) {\n            $isNew = $optionInputs['isNew'] == 'true';\n\n            if ($isNew) {\n                $this->attributeOptionRepository->create(array_merge([\n                    'attribute_id' => $attribute->id,\n                ], $optionInputs));\n            } else {\n                $isDelete = $optionInputs['isDelete'] == 'true';\n\n                if ($isDelete) {\n                    $this->attributeOptionRepository->delete($optionId);\n                } else {\n                    $this->attributeOptionRepository->update($optionInputs, $optionId);\n                }\n            }\n        }\n\n        return $attribute;\n    }\n\n    /**\n     * @param  string  $code\n     * @return Attribute\n     */\n    public function getAttributeByCode($code)\n    {\n        static $attributes = [];\n\n        if (array_key_exists($code, $attributes)) {\n            return $attributes[$code];\n        }\n\n        return $attributes[$code] = $this->findOneByField('code', $code);\n    }\n\n    /**\n     * @param  int  $lookup\n     * @param  string  $query\n     * @param  array  $columns\n     * @return array\n     */\n    public function getLookUpOptions($lookup, $query = '', $columns = [])\n    {\n        $lookup = config('attribute_lookups.'.$lookup);\n\n        if (! count($columns)) {\n            $columns = [($lookup['value_column'] ?? 'id').' as id', ($lookup['label_column'] ?? 'name').' as name'];\n        }\n\n        if (Str::contains($lookup['repository'], 'UserRepository')) {\n            $userRepository = app($lookup['repository'])->where('status', 1);\n\n            $currentUser = auth()->guard('user')->user();\n\n            if ($currentUser?->view_permission === 'group') {\n                $query = urldecode($query);\n\n                $userIds = bouncer()->getAuthorizedUserIds();\n\n                return $userRepository\n                    ->when(! empty($userIds), fn ($queryBuilder) => $queryBuilder->whereIn('users.id', $userIds))\n                    ->when(! empty($query), fn ($queryBuilder) => $queryBuilder->where('users.name', 'like', \"%{$query}%\"))\n                    ->get();\n            } elseif ($currentUser?->view_permission === 'individual') {\n                return $userRepository->where('users.id', $currentUser->id)->get();\n            }\n\n            return $userRepository->where('users.name', 'like', '%'.urldecode($query).'%')->get();\n        }\n\n        return app($lookup['repository'])->findWhere([\n            [$lookup['label_column'] ?? 'name', 'like', '%'.urldecode($query).'%'],\n        ], $columns);\n    }\n\n    /**\n     * @param  string  $lookup\n     * @param  int|array  $entityId\n     * @param  array  $columns\n     * @return mixed\n     */\n    public function getLookUpEntity($lookup, $entityId = null, $columns = [])\n    {\n        if (! $entityId) {\n            return;\n        }\n\n        $lookup = config('attribute_lookups.'.$lookup);\n\n        if (! count($columns)) {\n            $columns = [($lookup['value_column'] ?? 'id').' as id', ($lookup['label_column'] ?? 'name').' as name'];\n        }\n\n        if (is_array($entityId)) {\n            return app($lookup['repository'])->findWhereIn(\n                'id',\n                $entityId,\n                $columns\n            );\n        } else {\n            return app($lookup['repository'])->find($entityId, $columns);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Repositories/AttributeValueRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Attribute\\Repositories;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Container\\Container;\nuse Illuminate\\Http\\UploadedFile;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Webkul\\Attribute\\Contracts\\Attribute;\nuse Webkul\\Attribute\\Contracts\\AttributeValue;\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass AttributeValueRepository extends Repository\n{\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        Container $container\n    ) {\n        parent::__construct($container);\n    }\n\n    /**\n     * Specify model class name.\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return AttributeValue::class;\n    }\n\n    /**\n     * Save attribute value.\n     */\n    public function save(array $data, $attributes = []): void\n    {\n        if (empty($attributes)) {\n            $conditions = ['entity_type' => $data['entity_type']];\n\n            if (isset($data['quick_add'])) {\n                $conditions['quick_add'] = 1;\n            }\n\n            $attributes = $this->attributeRepository->where($conditions)->get();\n        }\n\n        foreach ($attributes as $attribute) {\n            $typeColumn = $this->model::$attributeTypeFields[$attribute->type];\n\n            if ($attribute->type === 'boolean') {\n                $data[$attribute->code] = isset($data[$attribute->code]) && $data[$attribute->code] ? 1 : 0;\n            }\n\n            if (! array_key_exists($attribute->code, $data)) {\n                continue;\n            }\n\n            if ($attribute->type === 'price'\n                && isset($data[$attribute->code])\n                && $data[$attribute->code] === ''\n            ) {\n                $data[$attribute->code] = null;\n            }\n\n            if ($attribute->type === 'date' && $data[$attribute->code] === '') {\n                $data[$attribute->code] = null;\n            }\n\n            if ($attribute->type === 'multiselect' || $attribute->type === 'checkbox') {\n                $data[$attribute->code] = implode(',', $data[$attribute->code]);\n            }\n\n            if ($attribute->type === 'email' || $attribute->type === 'phone') {\n                $data[$attribute->code] = $this->sanitizeEmailAndPhone($data[$attribute->code]);\n            }\n\n            if ($attribute->type === 'image' || $attribute->type === 'file') {\n                $data[$attribute->code] = $data[$attribute->code] instanceof UploadedFile\n                    ? $data[$attribute->code]->store($data['entity_type'].'/'.$data['entity_id'])\n                    : null;\n            }\n\n            $attributeValue = $this->findOneWhere([\n                'entity_type' => $data['entity_type'],\n                'entity_id' => $data['entity_id'],\n                'attribute_id' => $attribute->id,\n            ]);\n\n            if (! $attributeValue) {\n                $this->create([\n                    'entity_type' => $data['entity_type'],\n                    'entity_id' => $data['entity_id'],\n                    'attribute_id' => $attribute->id,\n                    $typeColumn => $data[$attribute->code],\n                ]);\n            } else {\n                $this->update([\n                    $typeColumn => $data[$attribute->code],\n                ], $attributeValue->id);\n\n                if ($attribute->type == 'image' || $attribute->type == 'file') {\n                    if ($attributeValue->text_value) {\n                        Storage::delete($attributeValue->text_value);\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Is value unique.\n     *\n     * @param  int  $entityId\n     * @param  string  $entityType\n     * @param  Attribute  $attribute\n     * @param  string  $value\n     * @return bool\n     */\n    public function isValueUnique($entityId, $entityType, $attribute, $value)\n    {\n        $query = $this->resetScope()->model\n            ->where('attribute_id', $attribute->id)\n            ->where('entity_type', $entityType)\n            ->where('entity_id', '!=', $entityId);\n\n        /**\n         * If the attribute type is email or phone, check the JSON value.\n         */\n        if (in_array($attribute->type, ['email', 'phone'])) {\n            $query->whereJsonContains($this->model::$attributeTypeFields[$attribute->type], [['value' => $value]]);\n        } else {\n            $query->where($this->model::$attributeTypeFields[$attribute->type], $value);\n        }\n\n        return $query->get()->count() ? false : true;\n    }\n\n    /**\n     * Removed null values from email and phone fields.\n     *\n     * @param  array  $data\n     * @return array\n     */\n    public function sanitizeEmailAndPhone($data)\n    {\n        foreach ($data as $key => $row) {\n            if (is_null($row['value'])) {\n                unset($data[$key]);\n            }\n        }\n\n        return $data;\n    }\n\n    /**\n     * Replace placeholders with values\n     */\n    public function getAttributeLabel(mixed $value, mixed $attribute)\n    {\n        switch ($attribute?->type) {\n            case 'price':\n                $label = core()->formatBasePrice($value);\n\n                break;\n\n            case 'boolean':\n                $label = $value ? 'Yes' : 'No';\n\n                break;\n\n            case 'select':\n            case 'radio':\n            case 'lookup':\n                if ($attribute->lookup_type) {\n                    $option = $this->attributeRepository->getLookUpEntity($attribute->lookup_type, $value);\n                } else {\n                    $option = $attribute->options->where('id', $value)->first();\n                }\n\n                $label = $option?->name;\n\n                break;\n\n            case 'multiselect':\n            case 'checkbox':\n                if ($attribute->lookup_type) {\n                    $options = $this->attributeRepository->getLookUpEntity($attribute->lookup_type, explode(',', $value));\n                } else {\n                    $options = $attribute->options->whereIn('id', explode(',', $value));\n                }\n\n                $optionsLabels = [];\n\n                foreach ($options as $key => $option) {\n                    $optionsLabels[] = $option->name;\n                }\n\n                $label = implode(', ', $optionsLabels);\n\n                break;\n\n            case 'email':\n            case 'phone':\n                if (! is_array($value)) {\n                    break;\n                }\n\n                $optionsLabels = [];\n\n                foreach ($value as $item) {\n                    $optionsLabels[] = $item['value'].' ('.$item['label'].')';\n                }\n\n                $label = implode(', ', $optionsLabels);\n\n                break;\n\n            case 'address':\n                if (\n                    ! $value\n                    || ! count(array_filter($value))\n                ) {\n                    break;\n                }\n\n                $label = $value['address'].'<br>'\n                    .$value['postcode'].'  '.$value['city'].'<br>'\n                    .core()->state_name($value['state']).'<br>'\n                    .core()->country_name($value['country']).'<br>';\n\n                break;\n\n            case 'date':\n                if ($value) {\n                    $label = Carbon::parse($value)->format('D M d, Y');\n                } else {\n                    $label = null;\n                }\n\n                break;\n\n            case 'datetime':\n                if ($value) {\n                    $label = Carbon::parse($value)->format('D M d, Y H:i A');\n                } else {\n                    $label = null;\n                }\n\n                break;\n\n            default:\n                if ($value instanceof Carbon) {\n                    $label = $value->format('D M d, Y H:i A');\n                } else {\n                    $label = $value;\n                }\n\n                break;\n        }\n\n        return $label ?? null;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Attribute/src/Traits/CustomAttribute.php",
    "content": "<?php\n\nnamespace Webkul\\Attribute\\Traits;\n\nuse Illuminate\\Database\\Eloquent\\MassAssignmentException;\nuse Webkul\\Attribute\\Models\\AttributeValueProxy;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\n\ntrait CustomAttribute\n{\n    /**\n     * @var array\n     */\n    public static $attributeTypeFields = [\n        'text' => 'text_value',\n        'textarea' => 'text_value',\n        'price' => 'float_value',\n        'boolean' => 'boolean_value',\n        'select' => 'integer_value',\n        'multiselect' => 'text_value',\n        'checkbox' => 'text_value',\n        'email' => 'json_value',\n        'address' => 'json_value',\n        'phone' => 'json_value',\n        'lookup' => 'integer_value',\n        'datetime' => 'datetime_value',\n        'date' => 'date_value',\n        'file' => 'text_value',\n        'image' => 'text_value',\n    ];\n\n    /**\n     * Get the attribute values that owns the entity.\n     */\n    public function attribute_values()\n    {\n        return $this->morphMany(AttributeValueProxy::modelClass(), 'entity');\n    }\n\n    /**\n     * Get an attribute from the model.\n     *\n     * @param  string  $key\n     * @return mixed\n     */\n    public function getAttribute($key)\n    {\n        if (! method_exists(static::class, $key) && ! isset($this->attributes[$key])) {\n            if (isset($this->id)) {\n                $this->attributes[$key] = '';\n\n                $attribute = app(AttributeRepository::class)->getAttributeByCode($key);\n\n                $this->attributes[$key] = $this->getCustomAttributeValue($attribute);\n\n                return $this->getAttributeValue($key);\n            }\n        }\n\n        return parent::getAttribute($key);\n    }\n\n    /**\n     * @return array\n     */\n    public function attributesToArray()\n    {\n        $attributes = parent::attributesToArray();\n\n        $hiddenAttributes = $this->getHidden();\n\n        if (isset($this->id)) {\n            $customAttributes = $this->getCustomAttributes();\n\n            foreach ($customAttributes as $attribute) {\n                if (in_array($attribute->code, $hiddenAttributes) && isset($this->attributes[$attribute->code])) {\n                    continue;\n                }\n\n                $attributes[$attribute->code] = $this->getCustomAttributeValue($attribute);\n            }\n        }\n\n        return $attributes;\n    }\n\n    /**\n     * Check in loaded family attributes.\n     *\n     * @return object\n     */\n    public function getCustomAttributes()\n    {\n        static $attributes;\n\n        if ($attributes) {\n            return $attributes;\n        }\n\n        return $attributes = app(AttributeRepository::class)->where('entity_type', $this->getTable())->get();\n    }\n\n    /**\n     * Get an product attribute value.\n     *\n     * @return mixed\n     */\n    public function getCustomAttributeValue($attribute)\n    {\n        if (! $attribute) {\n            return;\n        }\n\n        $attributeValue = $this->attribute_values->where('attribute_id', $attribute->id)->first();\n\n        return $attributeValue[self::$attributeTypeFields[$attribute->type]] ?? null;\n    }\n\n    /**\n     * Create a new instance of the given model.\n     *\n     * @param  array  $attributes\n     * @return Collection\n     */\n    public function getLookUpAttributes($attributes)\n    {\n        $attributes = app(AttributeRepository::class)->scopeQuery(function ($query) use ($attributes) {\n            return $query->distinct()\n                ->where('type', 'lookup')\n                ->where('entity_type', request('entity_type'))\n                ->whereIn('code', array_keys($attributes, '', false));\n        })->get();\n\n        return $attributes;\n    }\n\n    /**\n     * Create a new instance of the given model.\n     *\n     * @param  array  $attributes\n     * @param  bool  $exists\n     * @return static\n     */\n    public function newInstance($attributes = [], $exists = false)\n    {\n        // $attributes = $this->getLookUpAttributes($attributes);\n\n        // Play with data here\n\n        return parent::newInstance($attributes, $exists);\n    }\n\n    /**\n     * Fill the model with an array of attributes.\n     *\n     * @return $this\n     *\n     * @throws MassAssignmentException\n     */\n    public function fill(array $attributes)\n    {\n        // Play with data here\n\n        return parent::fill($attributes);\n    }\n\n    // Delete model's attribute values\n    public static function boot()\n    {\n        parent::boot();\n\n        static::deleting(function ($entity) {\n            $entity->attribute_values()->delete();\n        });\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Config/workflows.php",
    "content": "<?php\n\nreturn [\n    'trigger_entities' => [\n\n        'leads' => [\n            'name' => 'Leads',\n            'class' => 'Webkul\\Automation\\Helpers\\Entity\\Lead',\n            'events' => [\n                [\n                    'event' => 'lead.create.after',\n                    'name' => 'Created',\n                ], [\n                    'event' => 'lead.update.after',\n                    'name' => 'Updated',\n                ], [\n                    'event' => 'lead.delete.before',\n                    'name' => 'Deleted',\n                ],\n            ],\n        ],\n\n        'activities' => [\n            'name' => 'Activities',\n            'class' => 'Webkul\\Automation\\Helpers\\Entity\\Activity',\n            'events' => [\n                [\n                    'event' => 'activity.create.after',\n                    'name' => 'Created',\n                ], [\n                    'event' => 'activity.update.after',\n                    'name' => 'Updated',\n                ], [\n                    'event' => 'activity.delete.before',\n                    'name' => 'Deleted',\n                ],\n            ],\n        ],\n\n        'persons' => [\n            'name' => 'Persons',\n            'class' => 'Webkul\\Automation\\Helpers\\Entity\\Person',\n            'events' => [\n                [\n                    'event' => 'contacts.person.create.after',\n                    'name' => 'Created',\n                ], [\n                    'event' => 'contacts.person.update.after',\n                    'name' => 'Updated',\n                ], [\n                    'event' => 'contacts.person.delete.before',\n                    'name' => 'Deleted',\n                ],\n            ],\n        ],\n\n        'quotes' => [\n            'name' => 'Quotes',\n            'class' => 'Webkul\\Automation\\Helpers\\Entity\\Quote',\n            'events' => [\n                [\n                    'event' => 'quote.create.after',\n                    'name' => 'Created',\n                ], [\n                    'event' => 'quote.update.after',\n                    'name' => 'Updated',\n                ], [\n                    'event' => 'quote.delete.before',\n                    'name' => 'Deleted',\n                ],\n            ],\n        ],\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Contracts/Webhook.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Contracts;\n\ninterface Webhook {}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Contracts/Workflow.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Contracts;\n\ninterface Workflow {}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Database/Migrations/2021_08_26_133538_create_workflows_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('workflows', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->string('description')->nullable();\n            $table->string('entity_type');\n            $table->string('event');\n            $table->string('condition_type')->default('and');\n            $table->json('conditions')->nullable();\n            $table->json('actions')->nullable();\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('workflows');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Database/Migrations/2024_07_24_150821_create_webhooks_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('webhooks', function (Blueprint $table) {\n            $table->id();\n            $table->string('name');\n            $table->string('entity_type');\n            $table->string('description')->nullable();\n            $table->string('method');\n            $table->string('end_point');\n            $table->json('query_params')->nullable();\n            $table->json('headers')->nullable();\n            $table->string('payload_type');\n            $table->string('raw_payload_type');\n            $table->json('payload')->nullable();\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::dropIfExists('webhooks');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Helpers/Entity/AbstractEntity.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Helpers\\Entity;\n\nuse Carbon\\Carbon;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Automation\\Repositories\\WebhookRepository;\nuse Webkul\\Automation\\Services\\WebhookService;\n\nabstract class AbstractEntity\n{\n    /**\n     * Attribute repository instance.\n     */\n    protected AttributeRepository $attributeRepository;\n\n    /**\n     * Create a new repository instance.\n     */\n    public function __construct(\n        protected WebhookService $webhookService,\n        protected WebhookRepository $webhookRepository,\n    ) {}\n\n    /**\n     * Listing of the entities.\n     */\n    abstract public function getEntity(mixed $entity);\n\n    /**\n     * Returns workflow actions.\n     */\n    abstract public function getActions();\n\n    /**\n     * Execute workflow actions.\n     */\n    abstract public function executeActions(mixed $workflow, mixed $entity): void;\n\n    /**\n     * Returns attributes for workflow conditions.\n     */\n    public function getConditions(): array\n    {\n        return $this->getAttributes($this->entityType);\n    }\n\n    /**\n     * Get attributes for entity.\n     */\n    public function getAttributes(string $entityType, array $skipAttributes = ['textarea', 'image', 'file', 'address']): array\n    {\n        $attributes = [];\n\n        foreach ($this->attributeRepository->findByField('entity_type', $entityType) as $attribute) {\n            if (in_array($attribute->type, $skipAttributes)) {\n                continue;\n            }\n\n            if ($attribute->lookup_type) {\n                $options = [];\n            } else {\n                $options = $attribute->options;\n            }\n\n            $attributes[] = [\n                'id' => $attribute->code,\n                'type' => $attribute->type,\n                'name' => $attribute->name,\n                'lookup_type' => $attribute->lookup_type,\n                'options' => $options,\n            ];\n        }\n\n        return $attributes;\n    }\n\n    /**\n     * Returns placeholders for email templates.\n     */\n    public function getEmailTemplatePlaceholders(array $entity): array\n    {\n        $menuItems = [];\n\n        foreach ($this->getAttributes($this->entityType) as $attribute) {\n            $menuItems[] = [\n                'text' => $attribute['name'],\n                'value' => '{%'.$this->entityType.'.'.$attribute['id'].'%}',\n            ];\n        }\n\n        return [\n            'text' => $entity['name'],\n            'menu' => $menuItems,\n        ];\n    }\n\n    /**\n     * Replace placeholders with values.\n     */\n    public function replacePlaceholders(mixed $entity, string $content): string\n    {\n        foreach ($this->getAttributes($this->entityType, []) as $attribute) {\n            $value = '';\n\n            switch ($attribute['type']) {\n                case 'price':\n                    $value = core()->formatBasePrice($entity->{$attribute['id']});\n\n                    break;\n\n                case 'boolean':\n                    $value = $entity->{$attribute['id']} ? trans('admin::app.common.yes') : trans('admin::app.common.no');\n\n                    break;\n\n                case 'select':\n                case 'radio':\n                case 'lookup':\n                    if ($attribute['lookup_type']) {\n                        $option = $this->attributeRepository->getLookUpEntity($attribute['lookup_type'], $entity->{$attribute['id']});\n                    } else {\n                        $option = $attribute['options']->where('id', $entity->{$attribute['id']})->first();\n                    }\n\n                    $value = $option ? $option->name : '';\n\n                    break;\n\n                case 'multiselect':\n                case 'checkbox':\n                    if ($attribute['lookup_type']) {\n                        $options = $this->attributeRepository->getLookUpEntity($attribute['lookup_type'], explode(',', $entity->{$attribute['id']}));\n                    } else {\n                        $options = $attribute['options']->whereIn('id', explode(',', $entity->{$attribute['id']}));\n                    }\n\n                    $optionsLabels = [];\n\n                    foreach ($options as $key => $option) {\n                        $optionsLabels[] = $option->name;\n                    }\n\n                    $value = implode(', ', $optionsLabels);\n\n                    break;\n\n                case 'email':\n                case 'phone':\n                    if (! is_array($entity->{$attribute['id']})) {\n                        break;\n                    }\n\n                    $optionsLabels = [];\n\n                    foreach ($entity->{$attribute['id']} as $item) {\n                        $optionsLabels[] = $item['value'].' ('.$item['label'].')';\n                    }\n\n                    $value = implode(', ', $optionsLabels);\n\n                    break;\n\n                case 'address':\n                    if (! $entity->{$attribute['id']} || ! count(array_filter($entity->{$attribute['id']}))) {\n                        break;\n                    }\n\n                    $value = $entity->{$attribute['id']}['address'].'<br>'\n                             .$entity->{$attribute['id']}['postcode'].'  '.$entity->{$attribute['id']}['city'].'<br>'\n                             .core()->state_name($entity->{$attribute['id']}['state']).'<br>'\n                             .core()->country_name($entity->{$attribute['id']}['country']).'<br>';\n\n                    break;\n\n                case 'date':\n                    if ($entity->{$attribute['id']}) {\n                        $value = ! is_object($entity->{$attribute['id']})\n                            ? Carbon::parse($entity->{$attribute['id']})\n                            : $entity->{$attribute['id']}->format('D M d, Y');\n                    } else {\n                        $value = 'N/A';\n                    }\n\n                    break;\n\n                case 'datetime':\n                    if ($entity->{$attribute['id']}) {\n                        $value = ! is_object($entity->{$attribute['id']})\n                            ? Carbon::parse($entity->{$attribute['id']})\n                            : $entity->{$attribute['id']}->format('D M d, Y H:i A');\n                    } else {\n                        $value = 'N/A';\n                    }\n\n                    break;\n\n                default:\n                    $value = $entity->{$attribute['id']};\n\n                    break;\n            }\n\n            $content = strtr($content, [\n                '{%'.$this->entityType.'.'.$attribute['id'].'%}' => $value,\n                '{% '.$this->entityType.'.'.$attribute['id'].' %}' => $value,\n            ]);\n        }\n\n        return $content;\n    }\n\n    /**\n     * Trigger webhook.\n     *\n     * @return void\n     */\n    public function triggerWebhook(int $webhookId, mixed $entity)\n    {\n        $webhook = $this->webhookRepository->findOrFail($webhookId);\n\n        $payload = [\n            'method' => $webhook->method,\n            'query_params' => $this->replacePlaceholders($entity, json_encode($webhook->query_params)),\n            'end_point' => $this->replacePlaceholders($entity, $webhook->end_point),\n            'payload' => $this->replacePlaceholders($entity, json_encode($webhook->payload)),\n            'headers' => $this->replacePlaceholders($entity, json_encode($webhook->headers)),\n        ];\n\n        $this->webhookService->triggerWebhook($payload);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Helpers/Entity/Activity.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Helpers\\Entity;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Support\\Facades\\Mail;\nuse Webkul\\Activity\\Contracts\\Activity as ContractsActivity;\nuse Webkul\\Activity\\Repositories\\ActivityRepository;\nuse Webkul\\Admin\\Notifications\\Common;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Automation\\Repositories\\WebhookRepository;\nuse Webkul\\Automation\\Services\\WebhookService;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\nuse Webkul\\EmailTemplate\\Repositories\\EmailTemplateRepository;\nuse Webkul\\Lead\\Repositories\\LeadRepository;\n\nclass Activity extends AbstractEntity\n{\n    /**\n     * Define the entity type.\n     *\n     * @var string\n     */\n    protected $entityType = 'activities';\n\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected EmailTemplateRepository $emailTemplateRepository,\n        protected LeadRepository $leadRepository,\n        protected PersonRepository $personRepository,\n        protected ActivityRepository $activityRepository,\n        protected WebhookRepository $webhookRepository,\n        protected WebhookService $webhookService\n    ) {}\n\n    /**\n     * Get the attributes for workflow conditions.\n     */\n    public function getAttributes(string $entityType, array $skipAttributes = []): array\n    {\n        $attributes = [\n            [\n                'id' => 'title',\n                'type' => 'text',\n                'name' => 'Title',\n                'lookup_type' => null,\n                'options' => collect(),\n            ], [\n                'id' => 'type',\n                'type' => 'multiselect',\n                'name' => 'Type',\n                'lookup_type' => null,\n                'options' => collect([\n                    (object) [\n                        'id' => 'note',\n                        'name' => 'Note',\n                    ], (object) [\n                        'id' => 'call',\n                        'name' => 'Call',\n                    ], (object) [\n                        'id' => 'meeting',\n                        'name' => 'Meeting',\n                    ], (object) [\n                        'id' => 'lunch',\n                        'name' => 'Lunch',\n                    ], (object) [\n                        'id' => 'file',\n                        'name' => 'File',\n                    ],\n                ]),\n            ], [\n                'id' => 'location',\n                'type' => 'text',\n                'name' => 'Location',\n                'lookup_type' => null,\n                'options' => collect(),\n            ], [\n                'id' => 'comment',\n                'type' => 'textarea',\n                'name' => 'Comment',\n                'lookup_type' => null,\n                'options' => collect(),\n            ], [\n                'id' => 'schedule_from',\n                'type' => 'datetime',\n                'name' => 'Schedule From',\n                'lookup_type' => null,\n                'options' => collect(),\n            ], [\n                'id' => 'schedule_to',\n                'type' => 'datetime',\n                'name' => 'Schedule To',\n                'lookup_type' => null,\n                'options' => collect(),\n            ], [\n                'id' => 'user_id',\n                'type' => 'select',\n                'name' => 'User',\n                'lookup_type' => 'users',\n                'options' => $this->attributeRepository->getLookUpOptions('users'),\n            ],\n        ];\n\n        return $attributes;\n    }\n\n    /**\n     * Returns placeholders for email templates.\n     */\n    public function getEmailTemplatePlaceholders(array $entity): array\n    {\n        $emailTemplates = parent::getEmailTemplatePlaceholders($entity);\n\n        $emailTemplates['menu'][] = [\n            'text' => 'Participants',\n            'value' => '{%activities.participants%}',\n        ];\n\n        return $emailTemplates;\n    }\n\n    /**\n     * Replace placeholders with values.\n     */\n    public function replacePlaceholders(mixed $entity, string $content): string\n    {\n        $content = parent::replacePlaceholders($entity, $content);\n\n        $value = '<ul style=\"padding-left: 18px;margin: 0;\">';\n\n        foreach ($entity->participants as $participant) {\n            $value .= '<li>'.($participant->user ? $participant->user->name : $participant->person->name).'</li>';\n        }\n\n        $value .= '</ul>';\n\n        return strtr($content, [\n            '{%'.$this->entityType.'.participants%}' => $value,\n            '{% '.$this->entityType.'.participants %}' => $value,\n        ]);\n    }\n\n    /**\n     * Listing of the entities.\n     */\n    public function getEntity(mixed $entity): mixed\n    {\n        if (! $entity instanceof ContractsActivity) {\n            $entity = $this->activityRepository->find($entity);\n        }\n\n        return $entity;\n    }\n\n    /**\n     * Returns workflow actions.\n     */\n    public function getActions(): array\n    {\n        $emailTemplates = $this->emailTemplateRepository->all(['id', 'name']);\n\n        $webhooksOptions = $this->webhookRepository->all(['id', 'name']);\n\n        return [\n            [\n                'id' => 'update_related_leads',\n                'name' => trans('admin::app.settings.workflows.helpers.update-related-leads'),\n                'attributes' => $this->getAttributes('leads'),\n            ], [\n                'id' => 'send_email_to_sales_owner',\n                'name' => trans('admin::app.settings.workflows.helpers.send-email-to-sales-owner'),\n                'options' => $emailTemplates,\n            ], [\n                'id' => 'send_email_to_participants',\n                'name' => trans('admin::app.settings.workflows.helpers.send-email-to-participants'),\n                'options' => $emailTemplates,\n            ], [\n                'id' => 'trigger_webhook',\n                'name' => trans('admin::app.settings.workflows.helpers.add-webhook'),\n                'options' => $webhooksOptions,\n            ],\n        ];\n    }\n\n    /**\n     * Execute workflow actions.\n     */\n    public function executeActions(mixed $workflow, mixed $activity): void\n    {\n        foreach ($workflow->actions as $action) {\n            switch ($action['id']) {\n                case 'update_related_leads':\n                    $leadIds = $this->activityRepository->getModel()\n                        ->leftJoin('lead_activities', 'activities.id', 'lead_activities.activity_id')\n                        ->leftJoin('leads', 'lead_activities.lead_id', 'leads.id')\n                        ->addSelect('leads.id')\n                        ->where('activities.id', $activity->id)\n                        ->pluck('id');\n\n                    foreach ($leadIds as $leadId) {\n                        $this->leadRepository->update(\n                            [\n                                'entity_type' => 'leads',\n                                $action['attribute'] => $action['value'],\n                            ],\n                            $leadId,\n                            [$action['attribute']]\n                        );\n                    }\n\n                    break;\n\n                case 'send_email_to_sales_owner':\n                    $emailTemplate = $this->emailTemplateRepository->find($action['value']);\n\n                    if (! $emailTemplate) {\n                        break;\n                    }\n\n                    try {\n                        Mail::queue(new Common([\n                            'to' => $activity->user->email,\n                            'subject' => $this->replacePlaceholders($activity, $emailTemplate->subject),\n                            'body' => $this->replacePlaceholders($activity, $emailTemplate->content),\n                            'attachments' => [\n                                [\n                                    'name' => 'invite.ics',\n                                    'mime' => 'text/calendar',\n                                    'content' => $this->getICSContent($activity),\n                                ],\n                            ],\n                        ]));\n                    } catch (\\Exception $e) {\n                    }\n\n                    break;\n\n                case 'send_email_to_participants':\n                    $emailTemplate = $this->emailTemplateRepository->find($action['value']);\n\n                    if (! $emailTemplate) {\n                        break;\n                    }\n\n                    try {\n                        foreach ($activity->participants as $participant) {\n                            Mail::queue(new Common([\n                                'to' => $participant->user\n                                    ? $participant->user->email\n                                    : data_get($participant->person->emails, '*.value'),\n                                'subject' => $this->replacePlaceholders($activity, $emailTemplate->subject),\n                                'body' => $this->replacePlaceholders($activity, $emailTemplate->content),\n                                'attachments' => [\n                                    [\n                                        'name' => 'invite.ics',\n                                        'mime' => 'text/calendar',\n                                        'content' => $this->getICSContent($activity),\n                                    ],\n                                ],\n                            ]));\n                        }\n                    } catch (\\Exception $e) {\n                    }\n\n                    break;\n\n                case 'trigger_webhook':\n                    try {\n                        $this->triggerWebhook($action['value'], $activity);\n                    } catch (\\Exception $e) {\n                        report($e);\n                    }\n\n                    break;\n            }\n        }\n    }\n\n    /**\n     * Returns .ics file for attachments.\n     */\n    public function getICSContent(ContractsActivity $activity): string\n    {\n        $content = [\n            'BEGIN:VCALENDAR',\n            'VERSION:2.0',\n            'PRODID:-//Krayincrm//Krayincrm//EN',\n            'BEGIN:VEVENT',\n            'UID:'.time().'-'.$activity->id,\n            'DTSTAMP:'.Carbon::now()->format('YmdTHis'),\n            'CREATED:'.$activity->created_at->format('YmdTHis'),\n            'SEQUENCE:1',\n            'ORGANIZER;CN='.$activity->user->name.':MAILTO:'.$activity->user->email,\n        ];\n\n        foreach ($activity->participants as $participant) {\n            if ($participant->user) {\n                $content[] = 'ATTENDEE;ROLE=REQ-PARTICIPANT;CN='.$participant->user->name.';PARTSTAT=NEEDS-ACTION:MAILTO:'.$participant->user->email;\n            } else {\n                foreach (data_get($participant->person->emails, '*.value') as $email) {\n                    $content[] = 'ATTENDEE;ROLE=REQ-PARTICIPANT;CN='.$participant->person->name.';PARTSTAT=NEEDS-ACTION:MAILTO:'.$email;\n                }\n            }\n        }\n\n        $content = array_merge($content, [\n            'DTSTART:'.$activity->schedule_from->format('YmdTHis'),\n            'DTEND:'.$activity->schedule_to->format('YmdTHis'),\n            'SUMMARY:'.$activity->title,\n            'LOCATION:'.$activity->location,\n            'DESCRIPTION:'.$activity->comment,\n            'END:VEVENT',\n            'END:VCALENDAR',\n        ]);\n\n        return implode(\"\\r\\n\", $content);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Helpers/Entity/Lead.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Helpers\\Entity;\n\nuse Illuminate\\Support\\Facades\\Mail;\nuse Webkul\\Activity\\Repositories\\ActivityRepository;\nuse Webkul\\Admin\\Notifications\\Common;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Automation\\Repositories\\WebhookRepository;\nuse Webkul\\Automation\\Services\\WebhookService;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\nuse Webkul\\EmailTemplate\\Repositories\\EmailTemplateRepository;\nuse Webkul\\Lead\\Contracts\\Lead as ContractsLead;\nuse Webkul\\Lead\\Repositories\\LeadRepository;\nuse Webkul\\Tag\\Repositories\\TagRepository;\n\nclass Lead extends AbstractEntity\n{\n    /**\n     * Define the entity type.\n     */\n    protected string $entityType = 'leads';\n\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected EmailTemplateRepository $emailTemplateRepository,\n        protected LeadRepository $leadRepository,\n        protected ActivityRepository $activityRepository,\n        protected PersonRepository $personRepository,\n        protected TagRepository $tagRepository,\n        protected WebhookRepository $webhookRepository,\n        protected WebhookService $webhookService\n    ) {}\n\n    /**\n     * Listing of the entities.\n     */\n    public function getEntity(mixed $entity)\n    {\n        if (! $entity instanceof ContractsLead) {\n            $entity = $this->leadRepository->find($entity);\n        }\n\n        return $entity;\n    }\n\n    /**\n     * Returns attributes.\n     */\n    public function getAttributes(string $entityType, array $skipAttributes = ['textarea', 'image', 'file', 'address']): array\n    {\n        return parent::getAttributes($entityType, $skipAttributes);\n    }\n\n    /**\n     * Returns workflow actions.\n     */\n    public function getActions(): array\n    {\n        $emailTemplates = $this->emailTemplateRepository->all(['id', 'name']);\n\n        $webhooksOptions = $this->webhookRepository->all(['id', 'name']);\n\n        return [\n            [\n                'id' => 'update_lead',\n                'name' => trans('admin::app.settings.workflows.helpers.update-lead'),\n                'attributes' => $this->getAttributes('leads'),\n            ], [\n                'id' => 'update_person',\n                'name' => trans('admin::app.settings.workflows.helpers.update-person'),\n                'attributes' => $this->getAttributes('persons'),\n            ], [\n                'id' => 'send_email_to_person',\n                'name' => trans('admin::app.settings.workflows.helpers.send-email-to-person'),\n                'options' => $emailTemplates,\n            ], [\n                'id' => 'send_email_to_sales_owner',\n                'name' => trans('admin::app.settings.workflows.helpers.send-email-to-sales-owner'),\n                'options' => $emailTemplates,\n            ], [\n                'id' => 'add_tag',\n                'name' => trans('admin::app.settings.workflows.helpers.add-tag'),\n            ], [\n                'id' => 'add_note_as_activity',\n                'name' => trans('admin::app.settings.workflows.helpers.add-note-as-activity'),\n            ], [\n                'id' => 'trigger_webhook',\n                'name' => trans('admin::app.settings.workflows.helpers.add-webhook'),\n                'options' => $webhooksOptions,\n            ],\n        ];\n    }\n\n    /**\n     * Execute workflow actions.\n     */\n    public function executeActions(mixed $workflow, mixed $lead): void\n    {\n        foreach ($workflow->actions as $action) {\n            switch ($action['id']) {\n                case 'update_lead':\n                    $this->leadRepository->update(\n                        [\n                            'entity_type' => 'leads',\n                            $action['attribute'] => $action['value'],\n                        ],\n                        $lead->id,\n                        [$action['attribute']]\n                    );\n\n                    break;\n\n                case 'update_person':\n                    $this->personRepository->update([\n                        'entity_type' => 'persons',\n                        $action['attribute'] => $action['value'],\n                    ], $lead->person_id);\n\n                    break;\n\n                case 'send_email_to_person':\n                    $emailTemplate = $this->emailTemplateRepository->find($action['value']);\n\n                    if (! $emailTemplate) {\n                        break;\n                    }\n\n                    try {\n                        Mail::queue(new Common([\n                            'to' => data_get($lead->person->emails, '*.value'),\n                            'subject' => $this->replacePlaceholders($lead, $emailTemplate->subject),\n                            'body' => $this->replacePlaceholders($lead, $emailTemplate->content),\n                        ]));\n                    } catch (\\Exception $e) {\n                    }\n\n                    break;\n\n                case 'send_email_to_sales_owner':\n                    $emailTemplate = $this->emailTemplateRepository->find($action['value']);\n\n                    if (! $emailTemplate) {\n                        break;\n                    }\n\n                    try {\n                        Mail::queue(new Common([\n                            'to' => $lead->user->email,\n                            'subject' => $this->replacePlaceholders($lead, $emailTemplate->subject),\n                            'body' => $this->replacePlaceholders($lead, $emailTemplate->content),\n                        ]));\n                    } catch (\\Exception $e) {\n                    }\n\n                    break;\n\n                case 'add_tag':\n                    $colors = [\n                        '#337CFF',\n                        '#FEBF00',\n                        '#E5549F',\n                        '#27B6BB',\n                        '#FB8A3F',\n                        '#43AF52',\n                    ];\n\n                    if (! $tag = $this->tagRepository->findOneByField('name', $action['value'])) {\n                        $tag = $this->tagRepository->create([\n                            'name' => $action['value'],\n                            'color' => $colors[rand(0, 5)],\n                            'user_id' => auth()->guard('user')->user()->id,\n                        ]);\n                    }\n\n                    if (! $lead->tags->contains($tag->id)) {\n                        $lead->tags()->attach($tag->id);\n                    }\n\n                    break;\n\n                case 'add_note_as_activity':\n                    $activity = $this->activityRepository->create([\n                        'type' => 'note',\n                        'comment' => $action['value'],\n                        'is_done' => 1,\n                        'user_id' => auth()->guard('user')->user()->id,\n                    ]);\n\n                    $lead->activities()->attach($activity->id);\n\n                    break;\n\n                case 'trigger_webhook':\n                    try {\n                        $this->triggerWebhook($action['value'], $lead);\n                    } catch (\\Exception $e) {\n                        report($e);\n                    }\n\n                    break;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Helpers/Entity/Person.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Helpers\\Entity;\n\nuse Illuminate\\Support\\Facades\\Mail;\nuse Webkul\\Admin\\Notifications\\Common;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Automation\\Contracts\\Workflow;\nuse Webkul\\Automation\\Repositories\\WebhookRepository;\nuse Webkul\\Automation\\Services\\WebhookService;\nuse Webkul\\Contact\\Contracts\\Person as PersonContract;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\nuse Webkul\\EmailTemplate\\Repositories\\EmailTemplateRepository;\nuse Webkul\\Lead\\Repositories\\LeadRepository;\n\nclass Person extends AbstractEntity\n{\n    /**\n     * Define the entity type.\n     */\n    protected string $entityType = 'persons';\n\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected EmailTemplateRepository $emailTemplateRepository,\n        protected LeadRepository $leadRepository,\n        protected PersonRepository $personRepository,\n        protected WebhookRepository $webhookRepository,\n        protected WebhookService $webhookService\n    ) {}\n\n    /**\n     * Listing of the entities.\n     */\n    public function getEntity(mixed $entity): mixed\n    {\n        if (! $entity instanceof PersonContract) {\n            $entity = $this->personRepository->find($entity);\n        }\n\n        return $entity;\n    }\n\n    /**\n     * Returns workflow actions.\n     */\n    public function getActions(): array\n    {\n        $emailTemplates = $this->emailTemplateRepository->all(['id', 'name']);\n\n        $webhooksOptions = $this->webhookRepository->all(['id', 'name']);\n\n        return [\n            [\n                'id' => 'update_person',\n                'name' => trans('admin::app.settings.workflows.helpers.update-person'),\n                'attributes' => $this->getAttributes('persons'),\n            ], [\n                'id' => 'update_related_leads',\n                'name' => trans('admin::app.settings.workflows.helpers.update-related-leads'),\n                'attributes' => $this->getAttributes('leads'),\n            ], [\n                'id' => 'send_email_to_person',\n                'name' => trans('admin::app.settings.workflows.helpers.send-email-to-person'),\n                'options' => $emailTemplates,\n            ], [\n                'id' => 'trigger_webhook',\n                'name' => trans('admin::app.settings.workflows.helpers.add-webhook'),\n                'options' => $webhooksOptions,\n            ],\n        ];\n    }\n\n    /**\n     * Execute workflow actions.\n     */\n    public function executeActions(mixed $workflow, mixed $person): void\n    {\n        foreach ($workflow->actions as $action) {\n            switch ($action['id']) {\n                case 'update_person':\n                    $this->personRepository->update([\n                        'entity_type' => 'persons',\n                        $action['attribute'] => $action['value'],\n                    ], $person->id);\n\n                    break;\n\n                case 'update_related_leads':\n                    $leads = $this->leadRepository->findByField('person_id', $person->id);\n\n                    foreach ($leads as $lead) {\n                        $this->leadRepository->update(\n                            [\n                                'entity_type' => 'leads',\n                                $action['attribute'] => $action['value'],\n                            ],\n                            $lead->id,\n                            [$action['attribute']]\n                        );\n                    }\n\n                    break;\n\n                case 'send_email_to_person':\n                    $emailTemplate = $this->emailTemplateRepository->find($action['value']);\n\n                    if (! $emailTemplate) {\n                        break;\n                    }\n\n                    try {\n                        Mail::queue(new Common([\n                            'to' => data_get($person->emails, '*.value'),\n                            'subject' => $this->replacePlaceholders($person, $emailTemplate->subject),\n                            'body' => $this->replacePlaceholders($person, $emailTemplate->content),\n                        ]));\n                    } catch (\\Exception $e) {\n                        report($e);\n                    }\n\n                    break;\n\n                case 'trigger_webhook':\n                    try {\n                        $this->triggerWebhook($action['value'], $person);\n                    } catch (\\Exception $e) {\n                        report($e);\n                    }\n\n                    break;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Helpers/Entity/Quote.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Helpers\\Entity;\n\nuse Illuminate\\Support\\Facades\\Mail;\nuse Webkul\\Admin\\Notifications\\Common;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Automation\\Repositories\\WebhookRepository;\nuse Webkul\\Automation\\Services\\WebhookService;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\nuse Webkul\\EmailTemplate\\Repositories\\EmailTemplateRepository;\nuse Webkul\\Lead\\Repositories\\LeadRepository;\nuse Webkul\\Quote\\Contracts\\Quote as ContractsQuote;\nuse Webkul\\Quote\\Repositories\\QuoteRepository;\n\nclass Quote extends AbstractEntity\n{\n    /**\n     * Define the entity type.\n     */\n    protected string $entityType = 'quotes';\n\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected EmailTemplateRepository $emailTemplateRepository,\n        protected QuoteRepository $quoteRepository,\n        protected LeadRepository $leadRepository,\n        protected PersonRepository $personRepository,\n        protected WebhookRepository $webhookRepository,\n        protected WebhookService $webhookService\n    ) {}\n\n    /**\n     * Listing of the entities.\n     */\n    public function getEntity(mixed $entity): mixed\n    {\n        if (! $entity instanceof ContractsQuote) {\n            $entity = $this->quoteRepository->find($entity);\n        }\n\n        return $entity;\n    }\n\n    /**\n     * Returns workflow actions.\n     */\n    public function getActions(): array\n    {\n        $emailTemplates = $this->emailTemplateRepository->all(['id', 'name']);\n\n        $webhookOptions = $this->webhookRepository->all(['id', 'name']);\n\n        return [\n            [\n                'id' => 'update_quote',\n                'name' => trans('admin::app.settings.workflows.helpers.update-quote'),\n                'attributes' => $this->getAttributes('quotes'),\n            ], [\n                'id' => 'update_person',\n                'name' => trans('admin::app.settings.workflows.helpers.update-person'),\n                'attributes' => $this->getAttributes('persons'),\n            ], [\n                'id' => 'update_related_leads',\n                'name' => trans('admin::app.settings.workflows.helpers.update-related-leads'),\n                'attributes' => $this->getAttributes('leads'),\n            ], [\n                'id' => 'send_email_to_person',\n                'name' => trans('admin::app.settings.workflows.helpers.send-email-to-person'),\n                'options' => $emailTemplates,\n            ], [\n                'id' => 'send_email_to_sales_owner',\n                'name' => trans('admin::app.settings.workflows.helpers.send-email-to-sales-owner'),\n                'options' => $emailTemplates,\n            ], [\n                'id' => 'trigger_webhook',\n                'name' => trans('admin::app.settings.workflows.helpers.add-webhook'),\n                'options' => $webhookOptions,\n            ],\n        ];\n    }\n\n    /**\n     * Execute workflow actions.\n     */\n    public function executeActions(mixed $workflow, mixed $quote): void\n    {\n        foreach ($workflow->actions as $action) {\n            switch ($action['id']) {\n                case 'update_quote':\n                    $this->quoteRepository->update([\n                        'entity_type' => 'quotes',\n                        $action['attribute'] => $action['value'],\n                    ], $quote->id);\n\n                    break;\n\n                case 'update_person':\n                    $this->personRepository->update([\n                        'entity_type' => 'persons',\n                        $action['attribute'] => $action['value'],\n                    ], $quote->person_id);\n\n                    break;\n\n                case 'update_related_leads':\n                    foreach ($quote->leads as $lead) {\n                        $this->leadRepository->update(\n                            [\n                                'entity_type' => 'leads',\n                                $action['attribute'] => $action['value'],\n                            ],\n                            $lead->id,\n                            [$action['attribute']]\n                        );\n                    }\n\n                    break;\n\n                case 'send_email_to_person':\n                    $emailTemplate = $this->emailTemplateRepository->find($action['value']);\n\n                    if (! $emailTemplate) {\n                        break;\n                    }\n\n                    try {\n                        Mail::queue(new Common([\n                            'to' => data_get($quote->person->emails, '*.value'),\n                            'subject' => $this->replacePlaceholders($quote, $emailTemplate->subject),\n                            'body' => $this->replacePlaceholders($quote, $emailTemplate->content),\n                        ]));\n                    } catch (\\Exception $e) {\n                    }\n\n                    break;\n\n                case 'send_email_to_sales_owner':\n                    $emailTemplate = $this->emailTemplateRepository->find($action['value']);\n\n                    if (! $emailTemplate) {\n                        break;\n                    }\n\n                    try {\n                        Mail::queue(new Common([\n                            'to' => $quote->user->email,\n                            'subject' => $this->replacePlaceholders($quote, $emailTemplate->subject),\n                            'body' => $this->replacePlaceholders($quote, $emailTemplate->content),\n                        ]));\n                    } catch (\\Exception $e) {\n                    }\n\n                    break;\n\n                case 'trigger_webhook':\n                    try {\n                        $this->triggerWebhook($action['value'], $quote);\n                    } catch (\\Exception $e) {\n                        report($e);\n                    }\n\n                    break;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Helpers/Entity.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Helpers;\n\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\EmailTemplate\\Repositories\\EmailTemplateRepository;\n\nclass Entity\n{\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected EmailTemplateRepository $emailTemplateRepository\n    ) {}\n\n    /**\n     * Returns events to match for the entity\n     *\n     * @return array\n     */\n    public function getEvents()\n    {\n        $entities = config('workflows.trigger_entities');\n\n        $events = [];\n\n        foreach ($entities as $key => $entity) {\n            $object = app($entity['class']);\n\n            $events[$key] = [\n                'id' => $key,\n                'name' => $entity['name'],\n                'events' => $entity['events'],\n            ];\n        }\n\n        return $events;\n    }\n\n    /**\n     * Returns conditions to match for the entity\n     *\n     * @return array\n     */\n    public function getConditions()\n    {\n        $entities = config('workflows.trigger_entities');\n\n        $conditions = [];\n\n        foreach ($entities as $key => $entity) {\n            $object = app($entity['class']);\n\n            $conditions[$key] = $object->getConditions();\n        }\n\n        return $conditions;\n    }\n\n    /**\n     * Returns workflow actions\n     *\n     * @return array\n     */\n    public function getActions()\n    {\n        $entities = config('workflows.trigger_entities');\n\n        $conditions = [];\n\n        foreach ($entities as $key => $entity) {\n            $object = app($entity['class']);\n\n            $conditions[$key] = $object->getActions();\n        }\n\n        return $conditions;\n    }\n\n    /**\n     * Returns placeholders for email templates\n     *\n     * @return array\n     */\n    public function getEmailTemplatePlaceholders()\n    {\n        $entities = config('workflows.trigger_entities');\n\n        $placeholders = [];\n\n        foreach ($entities as $key => $entity) {\n            $object = app($entity['class']);\n\n            $placeholders[] = $object->getEmailTemplatePlaceholders($entity);\n        }\n\n        return $placeholders;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Helpers/Validator.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Helpers;\n\nuse Webkul\\Automation\\Contracts\\Workflow;\n\nclass Validator\n{\n    /**\n     * Validate workflow for condition\n     *\n     * @param  Workflow  $workflow\n     * @param  mixed  $entity\n     * @return bool\n     */\n    public function validate($workflow, $entity)\n    {\n        if (! $workflow->conditions) {\n            return true;\n        }\n\n        $validConditionCount = $totalConditionCount = 0;\n\n        foreach ($workflow->conditions as $condition) {\n            if (! $condition['attribute']\n                || ! isset($condition['value'])\n                || is_null($condition['value'])\n                || $condition['value'] == ''\n            ) {\n                continue;\n            }\n\n            $totalConditionCount++;\n\n            if ($workflow->condition_type == 'and') {\n                if (! $this->validateEntity($condition, $entity)) {\n                    return false;\n                } else {\n                    $validConditionCount++;\n                }\n            } else {\n                if ($this->validateEntity($condition, $entity)) {\n                    return true;\n                }\n            }\n        }\n\n        return $validConditionCount == $totalConditionCount ? true : false;\n    }\n\n    /**\n     * Validate object\n     *\n     * @param  array  $condition\n     * @param  mixed  $entity\n     * @return bool\n     */\n    private function validateEntity($condition, $entity)\n    {\n        return $this->validateAttribute(\n            $condition,\n            $this->getAttributeValue($condition, $entity)\n        );\n    }\n\n    /**\n     * Return value for the attribute\n     *\n     * @param  array  $condition\n     * @param  mixed  $entity\n     * @return bool\n     */\n    public function getAttributeValue($condition, $entity)\n    {\n        $value = $entity->{$condition['attribute']};\n\n        if (! in_array($condition['attribute_type'], ['multiselect', 'checkbox'])) {\n            return $value;\n        }\n\n        return $value ? explode(',', $value) : [];\n    }\n\n    /**\n     * Validate attribute value for condition\n     *\n     * @param  array  $condition\n     * @param  mixed  $attributeValue\n     * @return bool\n     */\n    public function validateAttribute($condition, $attributeValue)\n    {\n        switch ($condition['operator']) {\n            case '==': case '!=':\n                if (is_array($condition['value'])) {\n                    if (! is_array($attributeValue)) {\n                        return false;\n                    }\n\n                    $result = ! empty(array_intersect($condition['value'], $attributeValue));\n                } elseif (is_object($attributeValue)) {\n                    $result = $attributeValue->value == $condition['value'];\n                } else {\n                    if (is_array($attributeValue)) {\n                        $result = count($attributeValue) == 1 && array_shift($attributeValue) == $condition['value'];\n                    } else {\n                        $result = $attributeValue == $condition['value'];\n                    }\n                }\n\n                break;\n\n            case '<=': case '>':\n                if (! is_scalar($attributeValue)) {\n                    return false;\n                }\n\n                $result = $attributeValue <= $condition['value'];\n\n                break;\n\n            case '>=': case '<':\n                if (! is_scalar($attributeValue)) {\n                    return false;\n                }\n\n                $result = $attributeValue >= $condition['value'];\n\n                break;\n\n            case '{}': case '!{}':\n                if (is_scalar($attributeValue) && is_array($condition['value'])) {\n                    foreach ($condition['value'] as $item) {\n                        if (stripos($attributeValue, $item) !== false) {\n                            $result = true;\n\n                            break;\n                        }\n                    }\n                } elseif (is_array($condition['value'])) {\n                    if (! is_array($attributeValue)) {\n                        return false;\n                    }\n\n                    $result = ! empty(array_intersect($condition['value'], $attributeValue));\n                } else {\n                    if (is_array($attributeValue)) {\n                        $result = self::validateArrayValues($attributeValue, $condition['value']);\n                    } else {\n                        $result = strpos($attributeValue, $condition['value']) !== false;\n                    }\n                }\n\n                break;\n        }\n\n        if (in_array($condition['operator'], ['!=', '>', '<', '!{}'])) {\n            $result = ! $result;\n        }\n\n        return $result;\n    }\n\n    /**\n     * Validate the condition value against a multi dimensional array recursively\n     */\n    private static function validateArrayValues(array $attributeValue, string $conditionValue): bool\n    {\n        if (in_array($conditionValue, $attributeValue, true) === true) {\n            return true;\n        }\n\n        foreach ($attributeValue as $subValue) {\n            if (! is_array($subValue)) {\n                continue;\n            }\n\n            if (self::validateArrayValues($subValue, $conditionValue) === true) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Listeners/Entity.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Listeners;\n\nuse Webkul\\Automation\\Helpers\\Validator;\nuse Webkul\\Automation\\Repositories\\WorkflowRepository;\n\nclass Entity\n{\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected WorkflowRepository $workflowRepository,\n        protected Validator $validator\n    ) {}\n\n    /**\n     * @param  string  $eventName\n     * @param  mixed  $entity\n     * @return void\n     */\n    public function process($eventName, $entity)\n    {\n        $workflows = $this->workflowRepository->findByField('event', $eventName);\n\n        foreach ($workflows as $workflow) {\n            $workflowEntity = app(config('workflows.trigger_entities.'.$workflow->entity_type.'.class'));\n\n            $entity = $workflowEntity->getEntity($entity);\n\n            if (! $this->validator->validate($workflow, $entity)) {\n                continue;\n            }\n\n            try {\n                $workflowEntity->executeActions($workflow, $entity);\n            } catch (\\Exception $e) {\n                logger()->error($e->getMessage());\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Models/Webhook.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Automation\\Contracts\\Webhook as ContractsWebhook;\n\nclass Webhook extends Model implements ContractsWebhook\n{\n    use HasFactory;\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array<int, string>\n     */\n    protected $fillable = [\n        'name',\n        'entity_type',\n        'description',\n        'method',\n        'end_point',\n        'query_params',\n        'headers',\n        'payload_type',\n        'raw_payload_type',\n        'payload',\n    ];\n\n    /**\n     * The attributes that should be cast to native types.\n     *\n     * @var array<string, string>\n     */\n    protected $casts = [\n        'query_params' => 'array',\n        'headers' => 'array',\n        'payload' => 'array',\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Models/WebhookProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass WebhookProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Models/Workflow.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Automation\\Contracts\\Workflow as WorkflowContract;\n\nclass Workflow extends Model implements WorkflowContract\n{\n    protected $casts = [\n        'conditions' => 'array',\n        'actions' => 'array',\n    ];\n\n    protected $fillable = [\n        'name',\n        'description',\n        'entity_type',\n        'event',\n        'condition_type',\n        'conditions',\n        'actions',\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Models/WorkflowProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass WorkflowProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Providers;\n\nuse Webkul\\Automation\\Models\\Webhook;\nuse Webkul\\Automation\\Models\\Workflow;\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    /**\n     * Define the modals to map with this module.\n     *\n     * @var array\n     */\n    protected $models = [\n        Workflow::class,\n        Webhook::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Providers/WorkflowServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Providers;\n\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\ServiceProvider;\nuse Webkul\\Automation\\Listeners\\Entity;\n\nclass WorkflowServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap services.\n     *\n     * @return void\n     */\n    public function boot()\n    {\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n\n        Event::listen('*', function ($eventName, array $data) {\n            if (! in_array($eventName, data_get(config('workflows.trigger_entities'), '*.events.*.event'))) {\n                return;\n            }\n\n            app(Entity::class)->process($eventName, current($data));\n        });\n    }\n\n    /**\n     * Register services.\n     *\n     * @return void\n     */\n    public function register()\n    {\n        $this->registerConfig();\n    }\n\n    /**\n     * Register package config.\n     *\n     * @return void\n     */\n    protected function registerConfig()\n    {\n        $this->mergeConfigFrom(dirname(__DIR__).'/Config/workflows.php', 'workflows');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Repositories/WebhookRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Repositories;\n\nuse Webkul\\Automation\\Contracts\\Webhook;\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass WebhookRepository extends Repository\n{\n    /**\n     * Specify Model class name.\n     */\n    public function model(): string\n    {\n        return Webhook::class;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Repositories/WorkflowRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Repositories;\n\nuse Webkul\\Automation\\Contracts\\Workflow;\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass WorkflowRepository extends Repository\n{\n    /**\n     * Specify Model class name.\n     */\n    public function model(): string\n    {\n        return Workflow::class;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Automation/src/Services/WebhookService.php",
    "content": "<?php\n\nnamespace Webkul\\Automation\\Services;\n\nuse GuzzleHttp\\Client;\nuse GuzzleHttp\\Exception\\RequestException;\nuse GuzzleHttp\\Psr7\\Message;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\n\nclass WebhookService\n{\n    /**\n     * The GuzzleHttp client instance.\n     */\n    protected Client $client;\n\n    /**\n     * Create a new webhook service instance.\n     */\n    public function __construct(protected PersonRepository $personRepository)\n    {\n        $this->client = new Client([\n            'timeout' => 30,\n            'connect_timeout' => 10,\n            'verify' => true,\n            'http_errors' => false,\n        ]);\n    }\n\n    /**\n     * Trigger the webhook.\n     */\n    public function triggerWebhook(mixed $data): array\n    {\n        if (\n            ! isset($data['method'])\n            || ! isset($data['end_point'])\n        ) {\n            return [\n                'status' => 'error',\n                'response' => 'Missing required fields: method or end_point',\n            ];\n        }\n\n        $headers = isset($data['headers']) ? $this->parseJsonField($data['headers']) : [];\n        $payload = isset($data['payload']) ? $data['payload'] : null;\n        $data['end_point'] = $this->appendQueryParams($data['end_point'], $data['query_params'] ?? '');\n\n        $formattedHeaders = $this->formatHeaders($headers);\n\n        $options = $this->buildRequestOptions($data['method'], $formattedHeaders, $payload);\n\n        try {\n            $response = $this->client->request(\n                strtoupper($data['method']),\n                $data['end_point'],\n                $options,\n            );\n\n            return [\n                'status' => 'success',\n                'response' => $response->getBody()->getContents(),\n                'status_code' => $response->getStatusCode(),\n                'headers' => $response->getHeaders(),\n            ];\n        } catch (RequestException $e) {\n            return [\n                'status' => 'error',\n                'response' => $e->hasResponse() ? Message::toString($e->getResponse()) : $e->getMessage(),\n                'status_code' => $e->hasResponse() ? $e->getResponse()->getStatusCode() : null,\n            ];\n        }\n    }\n\n    /**\n     * Parse JSON field safely.\n     */\n    protected function parseJsonField(mixed $field): array\n    {\n        if (is_array($field)) {\n            return $field;\n        }\n\n        if (is_string($field)) {\n            $decoded = json_decode($field, true);\n\n            if (\n                json_last_error() === JSON_ERROR_NONE\n                && is_array($decoded)\n            ) {\n                return $decoded;\n            }\n        }\n\n        return [];\n    }\n\n    /**\n     * Build request options based on method and content type.\n     */\n    protected function buildRequestOptions(string $method, array $headers, mixed $payload): array\n    {\n        $options = [];\n\n        if (! empty($headers)) {\n            $options['headers'] = $headers;\n        }\n\n        if (\n            $payload !== null\n            && ! in_array(strtoupper($method), ['GET', 'HEAD'])\n        ) {\n            $contentType = $this->getContentType($headers);\n\n            switch ($contentType) {\n                case 'application/json':\n                    $options['json'] = $this->prepareJsonPayload($payload);\n\n                    break;\n\n                case 'application/x-www-form-urlencoded':\n                    $options['form_params'] = $this->prepareFormPayload($payload);\n\n                    break;\n\n                case 'multipart/form-data':\n                    $options['multipart'] = $this->prepareMultipartPayload($payload);\n\n                    break;\n\n                case 'text/plain':\n                case 'text/xml':\n                case 'application/xml':\n                    $options['body'] = $this->prepareRawPayload($payload);\n\n                    break;\n\n                default:\n                    $options = array_merge($options, $this->autoDetectPayloadFormat($payload));\n\n                    break;\n            }\n        }\n\n        return $options;\n    }\n\n    /**\n     * Prepare JSON payload.\n     */\n    protected function prepareJsonPayload(mixed $payload): mixed\n    {\n        if (is_string($payload)) {\n            $decoded = json_decode($payload, true);\n\n            if (json_last_error() === JSON_ERROR_NONE) {\n                return $decoded;\n            }\n\n            return $payload;\n        }\n\n        if (is_array($payload)) {\n            return $this->formatPayload($payload);\n        }\n\n        return $payload;\n    }\n\n    /**\n     * Prepare form payload.\n     */\n    protected function prepareFormPayload(mixed $payload): array\n    {\n        if (is_string($payload)) {\n            $decoded = json_decode($payload, true);\n\n            if (\n                json_last_error() === JSON_ERROR_NONE\n                && is_array($decoded)\n            ) {\n                return $this->formatPayload($decoded);\n            }\n\n            parse_str($payload, $parsed);\n\n            return $parsed ?: [];\n        }\n\n        if (is_array($payload)) {\n            return $this->formatPayload($payload);\n        }\n\n        return [];\n    }\n\n    /**\n     * Prepare multipart payload.\n     */\n    protected function prepareMultipartPayload(mixed $payload): array\n    {\n        $formattedPayload = $this->prepareFormPayload($payload);\n\n        return $this->buildMultipartData($formattedPayload);\n    }\n\n    /**\n     * Prepare raw payload.\n     */\n    protected function prepareRawPayload(mixed $payload): string\n    {\n        if (is_string($payload)) {\n            return $payload;\n        }\n\n        if (is_array($payload)) {\n            return json_encode($payload);\n        }\n\n        return (string) $payload;\n    }\n\n    /**\n     * Auto-detect payload format when no content-type is specified.\n     */\n    protected function autoDetectPayloadFormat(mixed $payload): array\n    {\n        if (is_string($payload)) {\n            $decoded = json_decode($payload, true);\n\n            if (json_last_error() === JSON_ERROR_NONE) {\n                return ['json' => $decoded];\n            }\n\n            if (\n                strpos($payload, '=') !== false\n                && strpos($payload, '&') !== false\n            ) {\n                parse_str($payload, $parsed);\n\n                return ['form_params' => $parsed];\n            }\n\n            return ['body' => $payload];\n        }\n\n        if (is_array($payload)) {\n            $formatted = $this->formatPayload($payload);\n\n            return ['json' => $formatted];\n        }\n\n        return ['body' => (string) $payload];\n    }\n\n    /**\n     * Get content type from headers.\n     */\n    protected function getContentType(array $headers): string\n    {\n        foreach ($headers as $key => $value) {\n            if (strtolower($key) === 'content-type') {\n                $contentType = strtolower(trim(explode(';', $value)[0]));\n\n                return $contentType;\n            }\n        }\n\n        return '';\n    }\n\n    /**\n     * Build multipart data array.\n     */\n    protected function buildMultipartData(array $payload): array\n    {\n        $multipart = [];\n\n        foreach ($payload as $key => $value) {\n            $multipart[] = [\n                'name' => $key,\n                'contents' => is_array($value) ? json_encode($value) : (string) $value,\n            ];\n        }\n\n        return $multipart;\n    }\n\n    /**\n     * Format headers array.\n     */\n    protected function formatHeaders(array $headers): array\n    {\n        if (empty($headers)) {\n            return [];\n        }\n\n        $formattedHeaders = [];\n\n        if ($this->isKeyValuePairArray($headers)) {\n            foreach ($headers as $header) {\n                if (\n                    isset($header['key'])\n                    && array_key_exists('value', $header)\n                ) {\n                    if (\n                        isset($header['disabled'])\n                        && $header['disabled']\n                    ) {\n                        continue;\n                    }\n\n                    if (\n                        isset($header['enabled'])\n                        && ! $header['enabled']\n                    ) {\n                        continue;\n                    }\n\n                    $formattedHeaders[$header['key']] = $header['value'];\n                }\n            }\n        } else {\n            $formattedHeaders = $headers;\n        }\n\n        return $formattedHeaders;\n    }\n\n    /**\n     * Format any incoming payload into a clean associative array.\n     */\n    protected function formatPayload(mixed $payload): array\n    {\n        if (empty($payload)) {\n            return [];\n        }\n\n        if (\n            is_array($payload)\n            && isset($payload['key'])\n            && array_key_exists('value', $payload)\n        ) {\n            return [$payload['key'] => $payload['value']];\n        }\n\n        if (\n            is_array($payload)\n            && array_is_list($payload)\n            && $this->isKeyValuePairArray($payload)\n        ) {\n            $formatted = [];\n\n            foreach ($payload as $item) {\n                if (\n                    isset($item['key'])\n                    && array_key_exists('value', $item)\n                ) {\n                    if (\n                        isset($item['disabled'])\n                        && $item['disabled']\n                    ) {\n                        continue;\n                    }\n\n                    if (\n                        isset($item['enabled'])\n                        && ! $item['enabled']\n                    ) {\n                        continue;\n                    }\n\n                    $formatted[$item['key']] = $item['value'];\n                }\n            }\n\n            return $formatted;\n        }\n\n        return is_array($payload) ? $payload : [];\n    }\n\n    /**\n     * Check if array is a key-value pair array.\n     */\n    protected function isKeyValuePairArray(array $array): bool\n    {\n        if (empty($array)) {\n            return false;\n        }\n\n        if (\n            isset($array['key'])\n            && array_key_exists('value', $array)\n        ) {\n            return true;\n        }\n\n        if (array_is_list($array)) {\n            return collect($array)->every(fn ($item) => is_array($item) && isset($item['key']) && array_key_exists('value', $item)\n            );\n        }\n\n        return false;\n    }\n\n    /**\n     * Append query parameters to the endpoint URL.\n     */\n    protected function appendQueryParams(string $endPoint, string $queryParamsJson): string\n    {\n        $queryParams = json_decode($queryParamsJson, true);\n\n        if (\n            json_last_error() !== JSON_ERROR_NONE\n            || ! is_array($queryParams)\n        ) {\n            return $endPoint;\n        }\n\n        $queryArray = [];\n\n        foreach ($queryParams as $param) {\n            if (\n                isset($param['key'])\n                && array_key_exists('value', $param)\n            ) {\n                $queryArray[$param['key']] = $param['value'];\n            }\n        }\n\n        $queryString = http_build_query($queryArray);\n\n        $glue = str_contains($endPoint, '?') ? '&' : '?';\n\n        return $endPoint.($queryString ? $glue.$queryString : '');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Contact/composer.json",
    "content": "{\n    \"name\": \"krayin/laravel-contact\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Jitendra Singh\",\n            \"email\": \"jitendra@webkul.com\"\n        }\n    ],\n    \"require\": {\n        \"krayin/laravel-attribute\": \"^1.0\",\n        \"krayin/laravel-core\": \"^1.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Webkul\\\\Contact\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"laravel\": {\n            \"providers\": [\n                \"Webkul\\\\Contact\\\\Providers\\\\ContactServiceProvider\"\n            ],\n            \"aliases\": {}\n        }\n    },\n    \"minimum-stability\": \"dev\"\n}"
  },
  {
    "path": "packages/Webkul/Contact/src/Contracts/Organization.php",
    "content": "<?php\n\nnamespace Webkul\\Contact\\Contracts;\n\ninterface Organization {}\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Contracts/Person.php",
    "content": "<?php\n\nnamespace Webkul\\Contact\\Contracts;\n\ninterface Person {}\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Database/Factories/PersonFactory.php",
    "content": "<?php\n\nnamespace Webkul\\Contact\\Database\\Factories;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\nuse Webkul\\Contact\\Models\\Person;\n\nclass PersonFactory extends Factory\n{\n    /**\n     * The name of the factory's corresponding model.\n     *\n     * @var string\n     */\n    protected $model = Person::class;\n\n    /**\n     * Define the model's default state.\n     *\n     * @return array\n     */\n    public function definition()\n    {\n        return [\n            'name' => $this->faker->name(),\n            'emails' => [$this->faker->unique()->safeEmail()],\n            'contact_numbers' => [$this->faker->randomNumber(9)],\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Database/Migrations/2021_04_09_051326_create_organizations_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('organizations', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->json('address')->nullable();\n\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('organizations');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Database/Migrations/2021_04_09_065617_create_persons_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('persons', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->json('emails');\n            $table->json('contact_numbers')->nullable();\n\n            $table->integer('organization_id')->unsigned()->nullable();\n            $table->foreign('organization_id')->references('id')->on('organizations')->onDelete('cascade');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('persons');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Database/Migrations/2021_09_22_194103_add_unique_index_to_name_in_organizations_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::table('organizations', function (Blueprint $table) {\n            $table->unique('name');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::table('organizations', function (Blueprint $table) {\n            $table->dropUnique('organizations_name_unique');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Database/Migrations/2024_07_31_092951_add_job_title_in_persons_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::table('persons', function (Blueprint $table) {\n            $table->string('job_title')->nullable();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::table('persons', function (Blueprint $table) {\n            $table->dropColumn('job_title');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Database/Migrations/2024_08_06_145943_create_person_tags_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('person_tags', function (Blueprint $table) {\n            $table->integer('tag_id')->unsigned();\n            $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');\n\n            $table->integer('person_id')->unsigned();\n            $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::dropIfExists('person_tags');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Database/Migrations/2024_08_06_161212_create_person_activities_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('person_activities', function (Blueprint $table) {\n            $table->integer('activity_id')->unsigned();\n            $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade');\n\n            $table->integer('person_id')->unsigned();\n            $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::dropIfExists('lead_activities');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102116_add_user_id_column_in_persons_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::table('persons', function (Blueprint $table) {\n            $table->integer('user_id')->unsigned()->nullable();\n            $table->foreign('user_id')->references('id')->on('users')->onDelete('set null');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::table('persons', function (Blueprint $table) {\n            $table->dropForeign(['user_id']);\n            $table->dropColumn('user_id');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Database/Migrations/2024_08_14_102136_add_user_id_column_in_organizations_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::table('organizations', function (Blueprint $table) {\n            $table->integer('user_id')->unsigned()->nullable();\n            $table->foreign('user_id')->references('id')->on('users')->onDelete('set null');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::table('organizations', function (Blueprint $table) {\n            $table->dropForeign(['user_id']);\n            $table->dropColumn('user_id');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Database/Migrations/2024_09_09_112201_add_unique_id_to_person_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::table('persons', function (Blueprint $table) {\n            $table->string('unique_id')->nullable()->unique();\n        });\n\n        $tableName = DB::getTablePrefix().'persons';\n\n        DB::statement(\"\n            UPDATE {$tableName}\n            SET unique_id = CONCAT(\n                user_id, '|', \n                organization_id, '|', \n                JSON_UNQUOTE(JSON_EXTRACT(emails, '$[0].value')), '|',\n                JSON_UNQUOTE(JSON_EXTRACT(contact_numbers, '$[0].value'))\n            )\n        \");\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::table('persons', function (Blueprint $table) {\n            $table->dropColumn('unique_id');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Database/Migrations/2025_03_19_132236_update_organization_id_column_in_persons_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::table('persons', function (Blueprint $table) {\n            $table->dropForeign(['organization_id']);\n\n            $table->foreign('organization_id')->references('id')->on('organizations')->onDelete('set null');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::table('persons', function (Blueprint $table) {\n            $table->dropForeign(['organization_id']);\n\n            $table->foreign('organization_id')->references('id')->on('organizations')->onDelete('cascade');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Models/Organization.php",
    "content": "<?php\n\nnamespace Webkul\\Contact\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Illuminate\\Database\\Eloquent\\Relations\\HasMany;\nuse Webkul\\Attribute\\Traits\\CustomAttribute;\nuse Webkul\\Contact\\Contracts\\Organization as OrganizationContract;\nuse Webkul\\User\\Models\\UserProxy;\n\nclass Organization extends Model implements OrganizationContract\n{\n    use CustomAttribute;\n\n    protected $casts = [\n        'address' => 'array',\n    ];\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'address',\n        'user_id',\n    ];\n\n    /**\n     * Get persons.\n     *\n     * @return HasMany\n     */\n    public function persons()\n    {\n        return $this->hasMany(PersonProxy::modelClass());\n    }\n\n    /**\n     * Get the user that owns the lead.\n     */\n    public function user()\n    {\n        return $this->belongsTo(UserProxy::modelClass());\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Models/OrganizationProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Contact\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass OrganizationProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Models/Person.php",
    "content": "<?php\n\nnamespace Webkul\\Contact\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Illuminate\\Database\\Eloquent\\Relations\\BelongsTo;\nuse Illuminate\\Database\\Eloquent\\Relations\\BelongsToMany;\nuse Illuminate\\Database\\Eloquent\\Relations\\HasMany;\nuse Webkul\\Activity\\Models\\ActivityProxy;\nuse Webkul\\Activity\\Traits\\LogsActivity;\nuse Webkul\\Attribute\\Traits\\CustomAttribute;\nuse Webkul\\Contact\\Contracts\\Person as PersonContract;\nuse Webkul\\Contact\\Database\\Factories\\PersonFactory;\nuse Webkul\\Lead\\Models\\LeadProxy;\nuse Webkul\\Tag\\Models\\TagProxy;\nuse Webkul\\User\\Models\\UserProxy;\n\nclass Person extends Model implements PersonContract\n{\n    use CustomAttribute, HasFactory, LogsActivity;\n\n    /**\n     * Table name.\n     *\n     * @var string\n     */\n    protected $table = 'persons';\n\n    /**\n     * Eager loading.\n     *\n     * @var string\n     */\n    protected $with = 'organization';\n\n    /**\n     * The attributes that are castable.\n     *\n     * @var array\n     */\n    protected $casts = [\n        'emails' => 'array',\n        'contact_numbers' => 'array',\n    ];\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'emails',\n        'contact_numbers',\n        'job_title',\n        'user_id',\n        'organization_id',\n        'unique_id',\n    ];\n\n    /**\n     * Get the user that owns the lead.\n     */\n    public function user(): BelongsTo\n    {\n        return $this->belongsTo(UserProxy::modelClass());\n    }\n\n    /**\n     * Get the organization that owns the person.\n     */\n    public function organization(): BelongsTo\n    {\n        return $this->belongsTo(OrganizationProxy::modelClass());\n    }\n\n    /**\n     * Get the activities.\n     */\n    public function activities(): BelongsToMany\n    {\n        return $this->belongsToMany(ActivityProxy::modelClass(), 'person_activities');\n    }\n\n    /**\n     * The tags that belong to the person.\n     */\n    public function tags(): BelongsToMany\n    {\n        return $this->belongsToMany(TagProxy::modelClass(), 'person_tags');\n    }\n\n    /**\n     * Get the leads for the person.\n     */\n    public function leads(): HasMany\n    {\n        return $this->hasMany(LeadProxy::modelClass(), 'person_id');\n    }\n\n    /**\n     * Create a new factory instance for the model.\n     */\n    protected static function newFactory(): PersonFactory\n    {\n        return PersonFactory::new();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Models/PersonProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Contact\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass PersonProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Providers/ContactServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Contact\\Providers;\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\ServiceProvider;\n\nclass ContactServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap services.\n     *\n     * @return void\n     */\n    public function boot(Router $router)\n    {\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n    }\n\n    /**\n     * Register services.\n     *\n     * @return void\n     */\n    public function register() {}\n}\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Contact\\Providers;\n\nuse Webkul\\Contact\\Models\\Organization;\nuse Webkul\\Contact\\Models\\Person;\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    protected $models = [\n        Person::class,\n        Organization::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Repositories/OrganizationRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Contact\\Repositories;\n\nuse Illuminate\\Container\\Container;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Attribute\\Repositories\\AttributeValueRepository;\nuse Webkul\\Contact\\Contracts\\Organization;\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass OrganizationRepository extends Repository\n{\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected AttributeValueRepository $attributeValueRepository,\n        Container $container\n    ) {\n        parent::__construct($container);\n    }\n\n    /**\n     * Specify model class name.\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return Organization::class;\n    }\n\n    /**\n     * Create.\n     *\n     * @return Organization\n     */\n    public function create(array $data)\n    {\n        if (isset($data['user_id'])) {\n            $data['user_id'] = $data['user_id'] ?: null;\n        }\n\n        $organization = parent::create($data);\n\n        $this->attributeValueRepository->save(array_merge($data, [\n            'entity_id' => $organization->id,\n        ]));\n\n        return $organization;\n    }\n\n    /**\n     * Update.\n     *\n     * @param  int  $id\n     * @param  array  $attribute\n     * @return Organization\n     */\n    public function update(array $data, $id, $attributes = [])\n    {\n        if (isset($data['user_id'])) {\n            $data['user_id'] = $data['user_id'] ?: null;\n        }\n\n        $organization = parent::update($data, $id);\n\n        /**\n         * If attributes are provided then only save the provided attributes and return.\n         */\n        if (! empty($attributes)) {\n            $conditions = ['entity_type' => $data['entity_type']];\n\n            if (isset($data['quick_add'])) {\n                $conditions['quick_add'] = 1;\n            }\n\n            $attributes = $this->attributeRepository->where($conditions)\n                ->whereIn('code', $attributes)\n                ->get();\n\n            $this->attributeValueRepository->save(array_merge($data, [\n                'entity_id' => $organization->id,\n            ]), $attributes);\n\n            return $organization;\n        }\n\n        $this->attributeValueRepository->save(array_merge($data, [\n            'entity_id' => $organization->id,\n        ]));\n\n        return $organization;\n    }\n\n    /**\n     * Delete organization and it's persons.\n     *\n     * @param  int  $id\n     * @return @void\n     */\n    public function delete($id)\n    {\n        $organization = $this->findOrFail($id);\n\n        DB::transaction(function () use ($organization, $id) {\n            $this->attributeValueRepository->deleteWhere([\n                'entity_id' => $id,\n                'entity_type' => 'organizations',\n            ]);\n\n            $organization->delete();\n        });\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Contact/src/Repositories/PersonRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Contact\\Repositories;\n\nuse Illuminate\\Container\\Container;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Attribute\\Repositories\\AttributeValueRepository;\nuse Webkul\\Contact\\Contracts\\Person;\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass PersonRepository extends Repository\n{\n    /**\n     * Searchable fields.\n     */\n    protected $fieldSearchable = [\n        'name',\n        'emails',\n        'contact_numbers',\n        'organization_id',\n        'job_title',\n        'organization.name',\n        'user_id',\n        'user.name',\n    ];\n\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected AttributeValueRepository $attributeValueRepository,\n        protected OrganizationRepository $organizationRepository,\n        Container $container\n    ) {\n        parent::__construct($container);\n    }\n\n    /**\n     * Specify model class name.\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return Person::class;\n    }\n\n    /**\n     * Create.\n     *\n     * @return Person\n     */\n    public function create(array $data)\n    {\n        $data = $this->sanitizeRequestedPersonData($data);\n\n        if (! empty($data['organization_name'])) {\n            $organization = $this->fetchOrCreateOrganizationByName($data['organization_name']);\n\n            $data['organization_id'] = $organization->id;\n        }\n\n        if (isset($data['user_id'])) {\n            $data['user_id'] = $data['user_id'] ?: null;\n        }\n\n        $person = parent::create($data);\n\n        $this->attributeValueRepository->save(array_merge($data, [\n            'entity_id' => $person->id,\n        ]));\n\n        return $person;\n    }\n\n    /**\n     * Update.\n     *\n     * @return Person\n     */\n    public function update(array $data, $id, $attributes = [])\n    {\n        $data = $this->sanitizeRequestedPersonData($data);\n\n        $data['user_id'] = empty($data['user_id']) ? null : $data['user_id'];\n\n        if (! empty($data['organization_name'])) {\n            $organization = $this->fetchOrCreateOrganizationByName($data['organization_name']);\n\n            $data['organization_id'] = $organization->id;\n\n            unset($data['organization_name']);\n        }\n\n        $person = parent::update($data, $id);\n\n        /**\n         * If attributes are provided then only save the provided attributes and return.\n         */\n        if (! empty($attributes)) {\n            $conditions = ['entity_type' => $data['entity_type']];\n\n            if (isset($data['quick_add'])) {\n                $conditions['quick_add'] = 1;\n            }\n\n            $attributes = $this->attributeRepository->where($conditions)\n                ->whereIn('code', $attributes)\n                ->get();\n\n            $this->attributeValueRepository->save(array_merge($data, [\n                'entity_id' => $person->id,\n            ]), $attributes);\n\n            return $person;\n        }\n\n        $this->attributeValueRepository->save(array_merge($data, [\n            'entity_id' => $person->id,\n        ]));\n\n        return $person;\n    }\n\n    /**\n     * Retrieves customers count based on date.\n     *\n     * @return int\n     */\n    public function getCustomerCount($startDate, $endDate)\n    {\n        return $this\n            ->whereBetween('created_at', [$startDate, $endDate])\n            ->get()\n            ->count();\n    }\n\n    /**\n     * Fetch or create an organization.\n     */\n    public function fetchOrCreateOrganizationByName(string $organizationName)\n    {\n        $organization = $this->organizationRepository->findOneWhere([\n            'name' => $organizationName,\n        ]);\n\n        return $organization ?: $this->organizationRepository->create([\n            'entity_type' => 'organizations',\n            'name' => $organizationName,\n        ]);\n    }\n\n    /**\n     * Sanitize requested person data and return the clean array.\n     */\n    private function sanitizeRequestedPersonData(array $data): array\n    {\n        if (\n            array_key_exists('organization_id', $data)\n            && empty($data['organization_id'])\n        ) {\n            $data['organization_id'] = null;\n        }\n\n        $uniqueIdParts = array_filter([\n            $data['user_id'] ?? null,\n            $data['organization_id'] ?? null,\n            $data['emails'][0]['value'] ?? null,\n        ]);\n\n        $data['unique_id'] = implode('|', $uniqueIdParts);\n\n        if (isset($data['contact_numbers'])) {\n            $data['contact_numbers'] = collect($data['contact_numbers'])->filter(fn ($number) => ! is_null($number['value']))->toArray();\n\n            $data['unique_id'] .= '|'.$data['contact_numbers'][0]['value'];\n        }\n\n        return $data;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/composer.json",
    "content": "{\n    \"name\": \"krayin/laravel-core\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Jitendra Singh\",\n            \"email\": \"jitendra@webkul.com\"\n        }\n    ],\n    \"require\": {\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Webkul\\\\Core\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"laravel\": {\n            \"providers\": [\n                \"Webkul\\\\Core\\\\Providers\\\\CoreServiceProvider\"\n            ],\n            \"aliases\": {}\n        }\n    },\n    \"minimum-stability\": \"dev\"\n}"
  },
  {
    "path": "packages/Webkul/Core/src/Acl/AclItem.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Acl;\n\nuse Illuminate\\Support\\Collection;\n\nclass AclItem\n{\n    /**\n     * Create a new AclItem instance.\n     */\n    public function __construct(\n        public string $key,\n        public string $name,\n        public array|string $route,\n        public int $sort,\n        public Collection $children,\n    ) {}\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Acl.php",
    "content": "<?php\n\nnamespace Webkul\\Core;\n\nuse Illuminate\\Support\\Arr;\nuse Illuminate\\Support\\Collection;\nuse Webkul\\Core\\Acl\\AclItem;\n\nclass Acl\n{\n    /**\n     * acl items.\n     */\n    protected array $items = [];\n\n    /**\n     * Add a new acl item.\n     */\n    public function addItem(AclItem $aclItem): void\n    {\n        $this->items[] = $aclItem;\n    }\n\n    /**\n     * Get all acl items.\n     */\n    public function getItems(): Collection\n    {\n        if (! $this->items) {\n            $this->prepareAclItems();\n        }\n\n        return collect($this->items)\n            ->sortBy('sort')\n            ->values();\n    }\n\n    /**\n     * Acl Config.\n     */\n    private function getAclConfig(): array\n    {\n        static $aclConfig;\n\n        if ($aclConfig) {\n            return $aclConfig;\n        }\n\n        $aclConfig = config('acl');\n\n        return $aclConfig;\n    }\n\n    /**\n     * Get all roles.\n     */\n    public function getRoles(): Collection\n    {\n        static $roles;\n\n        if ($roles) {\n            return $roles;\n        }\n\n        $roles = collect($this->getAclConfig())\n            ->mapWithKeys(function ($role) {\n                if (is_array($role['route'])) {\n                    return collect($role['route'])->mapWithKeys(function ($route) use ($role) {\n                        return [$route => $role['key']];\n                    });\n                } else {\n                    return [$role['route'] => $role['key']];\n                }\n            });\n\n        return $roles;\n    }\n\n    /**\n     * Prepare acl items.\n     */\n    private function prepareAclItems(): void\n    {\n        $aclWithDotNotation = [];\n\n        foreach ($this->getAclConfig() as $item) {\n            $aclWithDotNotation[$item['key']] = $item;\n        }\n\n        $acl = Arr::undot(Arr::dot($aclWithDotNotation));\n\n        foreach ($acl as $aclItemKey => $aclItem) {\n            $subAclItems = $this->processSubAclItems($aclItem);\n\n            $this->addItem(new AclItem(\n                key: $aclItemKey,\n                name: trans($aclItem['name']),\n                route: $aclItem['route'],\n                sort: $aclItem['sort'],\n                children: $subAclItems,\n            ));\n        }\n    }\n\n    /**\n     * Process sub acl items.\n     */\n    private function processSubAclItems($aclItem): Collection\n    {\n        return collect($aclItem)\n            ->sortBy('sort')\n            ->filter(fn ($value, $key) => is_array($value) && $key !== 'route')\n            ->map(function ($subAclItem) {\n                $subSubAclItems = $this->processSubAclItems($subAclItem);\n\n                return new AclItem(\n                    key: $subAclItem['key'],\n                    name: trans($subAclItem['name']),\n                    route: $subAclItem['route'],\n                    sort: $subAclItem['sort'],\n                    children: $subSubAclItems,\n                );\n            });\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Config/concord.php",
    "content": "<?php\n\nuse Webkul\\Admin\\Providers\\ModuleServiceProvider as AdminModuleServiceProvider;\nuse Webkul\\Attribute\\Providers\\ModuleServiceProvider as AttributeModuleServiceProvider;\nuse Webkul\\Automation\\Providers\\ModuleServiceProvider as AutomationModuleServiceProvider;\nuse Webkul\\Contact\\Providers\\ModuleServiceProvider as ContactModuleServiceProvider;\nuse Webkul\\Core\\Providers\\ModuleServiceProvider as CoreModuleServiceProvider;\nuse Webkul\\DataGrid\\Providers\\ModuleServiceProvider as DataGridModuleServiceProvider;\nuse Webkul\\DataTransfer\\Providers\\ModuleServiceProvider as DataTransferModuleServiceProvider;\nuse Webkul\\Email\\Providers\\ModuleServiceProvider as EmailModuleServiceProvider;\nuse Webkul\\EmailTemplate\\Providers\\ModuleServiceProvider as EmailTemplateModuleServiceProvider;\nuse Webkul\\Lead\\Providers\\ModuleServiceProvider as LeadModuleServiceProvider;\nuse Webkul\\Product\\Providers\\ModuleServiceProvider as ProductModuleServiceProvider;\nuse Webkul\\Quote\\Providers\\ModuleServiceProvider as QuoteModuleServiceProvider;\nuse Webkul\\Tag\\Providers\\ModuleServiceProvider as TagModuleServiceProvider;\nuse Webkul\\User\\Providers\\ModuleServiceProvider as UserModuleServiceProvider;\nuse Webkul\\Warehouse\\Providers\\ModuleServiceProvider as WarehouseModuleServiceProvider;\nuse Webkul\\WebForm\\Providers\\ModuleServiceProvider as WebFormModuleServiceProvider;\n\nreturn [\n    'modules' => [\n        DataTransferModuleServiceProvider::class,\n        AdminModuleServiceProvider::class,\n        AttributeModuleServiceProvider::class,\n        AutomationModuleServiceProvider::class,\n        ContactModuleServiceProvider::class,\n        CoreModuleServiceProvider::class,\n        DataGridModuleServiceProvider::class,\n        EmailTemplateModuleServiceProvider::class,\n        EmailModuleServiceProvider::class,\n        LeadModuleServiceProvider::class,\n        ProductModuleServiceProvider::class,\n        QuoteModuleServiceProvider::class,\n        TagModuleServiceProvider::class,\n        UserModuleServiceProvider::class,\n        WarehouseModuleServiceProvider::class,\n        WebFormModuleServiceProvider::class,\n        DataTransferModuleServiceProvider::class,\n    ],\n\n    'register_route_models' => true,\n];\n"
  },
  {
    "path": "packages/Webkul/Core/src/Config/cors.php",
    "content": "<?php\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Laravel CORS Options\n    |--------------------------------------------------------------------------\n    |\n    | The allowed_methods and allowed_headers options are case-insensitive.\n    |\n    | You don't need to provide both allowed_origins and allowed_origins_patterns.\n    | If one of the strings passed matches, it is considered a valid origin.\n    |\n    | If ['*'] is provided to allowed_methods, allowed_origins or allowed_headers\n    | all methods / origins / headers are allowed.\n    |\n    */\n\n    /*\n     * You can enable CORS for 1 or multiple paths.\n     * Example: ['api/*']\n     */\n    'paths' => [\n        'admin/web-forms/forms/*',\n    ],\n\n    /*\n    * Matches the request method. `['*']` allows all methods.\n    */\n    'allowed_methods' => ['*'],\n\n    /*\n     * Matches the request origin. `['*']` allows all origins. Wildcards can be used, eg `*.mydomain.com`\n     */\n    'allowed_origins' => ['*'],\n\n    /*\n     * Patterns that can be used with `preg_match` to match the origin.\n     */\n    'allowed_origins_patterns' => [],\n\n    /*\n     * Sets the Access-Control-Allow-Headers response header. `['*']` allows all headers.\n     */\n    'allowed_headers' => ['*'],\n\n    /*\n     * Sets the Access-Control-Expose-Headers response header with these headers.\n     */\n    'exposed_headers' => [],\n\n    /*\n     * Sets the Access-Control-Max-Age response header when > 0.\n     */\n    'max_age' => 0,\n\n    /*\n     * Sets the Access-Control-Allow-Credentials header.\n     */\n    'supports_credentials' => false,\n];\n"
  },
  {
    "path": "packages/Webkul/Core/src/Config/sanctum.php",
    "content": "<?php\n\nuse Illuminate\\Cookie\\Middleware\\EncryptCookies;\nuse Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken;\n\nreturn [\n\n    /*\n    |--------------------------------------------------------------------------\n    | Stateful Domains\n    |--------------------------------------------------------------------------\n    |\n    | Requests from the following domains / hosts will receive stateful API\n    | authentication cookies. Typically, these should include your local\n    | and production domains which access your API via a frontend SPA.\n    |\n    */\n\n    'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(\n        '%s%s',\n        'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',\n        env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''\n    ))),\n\n    /*\n    |--------------------------------------------------------------------------\n    | Sanctum Guards\n    |--------------------------------------------------------------------------\n    |\n    | This array contains the authentication guards that will be checked when\n    | Sanctum is trying to authenticate a request. If none of these guards\n    | are able to authenticate the request, Sanctum will use the bearer\n    | token that's present on an incoming request for authentication.\n    |\n    */\n\n    'guard' => ['user'],\n\n    /*\n    |--------------------------------------------------------------------------\n    | Expiration Minutes\n    |--------------------------------------------------------------------------\n    |\n    | This value controls the number of minutes until an issued token will be\n    | considered expired. If this value is null, personal access tokens do\n    | not expire. This won't tweak the lifetime of first-party sessions.\n    |\n    */\n\n    'expiration' => null,\n\n    /*\n    |--------------------------------------------------------------------------\n    | Sanctum Middleware\n    |--------------------------------------------------------------------------\n    |\n    | When authenticating your first-party SPA with Sanctum you may need to\n    | customize some of the middleware Sanctum uses while processing the\n    | request. You may change the middleware listed below as required.\n    |\n    */\n\n    'middleware' => [\n        'verify_csrf_token' => VerifyCsrfToken::class,\n        'encrypt_cookies' => EncryptCookies::class,\n    ],\n\n];\n"
  },
  {
    "path": "packages/Webkul/Core/src/Console/Commands/Version.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Console\\Commands;\n\nuse Illuminate\\Console\\Command;\n\nclass Version extends Command\n{\n    /**\n     * The name and signature of the console command.\n     *\n     * @var string\n     */\n    protected $signature = 'krayin-crm:version';\n\n    /**\n     * The console command description.\n     *\n     * @var string\n     */\n    protected $description = 'Displays current version of Krayin CRM installed';\n\n    /**\n     * Create a new command instance.\n     *\n     * @return void\n     */\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    /**\n     * Execute the console command.\n     *\n     * @return mixed\n     */\n    public function handle()\n    {\n        $this->comment('v'.core()->version());\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Contracts/CoreConfig.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Contracts;\n\ninterface CoreConfig {}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Contracts/Country.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Contracts;\n\ninterface Country {}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Contracts/CountryState.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Contracts;\n\ninterface CountryState {}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Contracts/Validations/Code.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Contracts\\Validations;\n\nuse Illuminate\\Contracts\\Validation\\Rule;\n\nclass Code implements Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     * @param  string  $attribute\n     * @param  mixed  $value\n     * @return bool\n     */\n    public function passes($attribute, $value)\n    {\n        return preg_match('/^[a-zA-Z]+[a-zA-Z0-9_]+$/', $value);\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     * @return string\n     */\n    public function message()\n    {\n        return trans('core::app.validations.code');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Contracts/Validations/Decimal.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Contracts\\Validations;\n\nuse Closure;\nuse Illuminate\\Contracts\\Validation\\ValidationRule;\nuse Illuminate\\Translation\\PotentiallyTranslatedString;\n\nclass Decimal implements ValidationRule\n{\n    /**\n     * Run the validation rule.\n     *\n     * @param  Closure(string): PotentiallyTranslatedString  $fail\n     */\n    public function validate(string $attribute, mixed $value, Closure $fail): void\n    {\n        if (! preg_match('/^\\d*(\\.\\d{1,4})?$/', $value)) {\n            $fail(trans('admin::app.validations.message.decimal', ['attribute' => $attribute]));\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Core.php",
    "content": "<?php\n\nnamespace Webkul\\Core;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Support\\Collection;\nuse Webkul\\Core\\Repositories\\CoreConfigRepository;\nuse Webkul\\Core\\Repositories\\CountryRepository;\nuse Webkul\\Core\\Repositories\\CountryStateRepository;\n\nclass Core\n{\n    /**\n     * The Krayin version.\n     *\n     * @var string\n     */\n    const KRAYIN_VERSION = '2.2.0';\n\n    /**\n     * Create a new instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected CountryRepository $countryRepository,\n        protected CoreConfigRepository $coreConfigRepository,\n        protected CountryStateRepository $countryStateRepository\n    ) {}\n\n    /**\n     * Get the version number of the Krayin.\n     *\n     * @return string\n     */\n    public function version()\n    {\n        return static::KRAYIN_VERSION;\n    }\n\n    /**\n     * Retrieve all timezones.\n     */\n    public function timezones(): array\n    {\n        $timezones = [];\n\n        foreach (timezone_identifiers_list() as $timezone) {\n            $timezones[$timezone] = $timezone;\n        }\n\n        return $timezones;\n    }\n\n    /**\n     * Retrieve all locales.\n     */\n    public function locales(): array\n    {\n        $options = [];\n\n        foreach (config('app.available_locales') as $key => $title) {\n            $options[] = [\n                'title' => $title,\n                'value' => $key,\n            ];\n        }\n\n        return $options;\n    }\n\n    /**\n     * Retrieve all countries.\n     *\n     * @return Collection\n     */\n    public function countries()\n    {\n        return $this->countryRepository->all();\n    }\n\n    /**\n     * Returns country name by code.\n     */\n    public function country_name(string $code): string\n    {\n        $country = $this->countryRepository->findOneByField('code', $code);\n\n        return $country ? $country->name : '';\n    }\n\n    /**\n     * Returns state name by code.\n     */\n    public function state_name(string $code): string\n    {\n        $state = $this->countryStateRepository->findOneByField('code', $code);\n\n        return $state ? $state->name : $code;\n    }\n\n    /**\n     * Retrieve all country states.\n     *\n     * @return Collection\n     */\n    public function states(string $countryCode)\n    {\n        return $this->countryStateRepository->findByField('country_code', $countryCode);\n    }\n\n    /**\n     * Retrieve all grouped states by country code.\n     *\n     * @return Collection\n     */\n    public function groupedStatesByCountries()\n    {\n        $collection = [];\n\n        foreach ($this->countryStateRepository->all() as $state) {\n            $collection[$state->country_code][] = $state->toArray();\n        }\n\n        return $collection;\n    }\n\n    /**\n     * Retrieve all grouped states by country code.\n     *\n     * @return Collection\n     */\n    public function findStateByCountryCode($countryCode = null, $stateCode = null)\n    {\n        $collection = [];\n\n        $collection = $this->countryStateRepository->findByField([\n            'country_code' => $countryCode,\n            'code' => $stateCode,\n        ]);\n\n        if (count($collection)) {\n            return $collection->first();\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * Create singleton object through single facade.\n     *\n     * @param  string  $className\n     * @return mixed\n     */\n    public function getSingletonInstance($className)\n    {\n        static $instances = [];\n\n        if (array_key_exists($className, $instances)) {\n            return $instances[$className];\n        }\n\n        return $instances[$className] = app($className);\n    }\n\n    /**\n     * Format date\n     *\n     * @return string\n     */\n    public function formatDate($date, $format = 'd M Y h:iA')\n    {\n        return Carbon::parse($date)->format($format);\n    }\n\n    /**\n     * Week range.\n     *\n     * @param  string  $date\n     * @param  int  $day\n     * @return string\n     */\n    public function xWeekRange($date, $day)\n    {\n        $ts = strtotime($date);\n\n        if (! $day) {\n            $start = (date('D', $ts) == 'Sun') ? $ts : strtotime('last sunday', $ts);\n\n            return date('Y-m-d', $start);\n        } else {\n            $end = (date('D', $ts) == 'Sat') ? $ts : strtotime('next saturday', $ts);\n\n            return date('Y-m-d', $end);\n        }\n    }\n\n    /**\n     * Return currency symbol from currency code.\n     *\n     * @param  float  $price\n     * @return string\n     */\n    public function currencySymbol($code)\n    {\n        $formatter = new \\NumberFormatter(app()->getLocale().'@currency='.$code, \\NumberFormatter::CURRENCY);\n\n        return $formatter->getSymbol(\\NumberFormatter::CURRENCY_SYMBOL);\n    }\n\n    /**\n     * Format price with base currency symbol. This method also give ability to encode\n     * the base currency symbol and its optional.\n     *\n     * @param  float  $price\n     * @return string\n     */\n    public function formatBasePrice($price)\n    {\n        if (is_null($price)) {\n            $price = 0;\n        }\n\n        $formatter = new \\NumberFormatter(app()->getLocale(), \\NumberFormatter::CURRENCY);\n\n        return $formatter->formatCurrency($price, config('app.currency'));\n    }\n\n    /**\n     * Get the config field.\n     */\n    public function getConfigField(string $fieldName): ?array\n    {\n        return system_config()->getConfigField($fieldName);\n    }\n\n    /**\n     * Retrieve information for configuration.\n     */\n    public function getConfigData(string $field): mixed\n    {\n        return system_config()->getConfigData($field);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Database/Migrations/2021_03_12_060658_create_core_config_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('core_config', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('code');\n            $table->string('value');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('core_config');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Core/src/Database/Migrations/2021_04_12_173232_create_countries_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('countries', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('code');\n            $table->string('name');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('countries');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Core/src/Database/Migrations/2021_04_12_173344_create_country_states_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('country_states', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('country_code');\n            $table->string('code');\n            $table->string('name');\n\n            $table->integer('country_id')->unsigned();\n            $table->foreign('country_id')->references('id')->on('countries')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('country_states');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Core/src/Database/Migrations/2025_01_29_133500_update_text_column_type_in_core_config_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::table('core_config', function (Blueprint $table) {\n            $table->text('value')->change();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::table('core_config', function (Blueprint $table) {\n            $table->string('value')->change();\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Core/src/Eloquent/Repository.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Eloquent;\n\nuse Prettus\\Repository\\Contracts\\CacheableInterface;\nuse Prettus\\Repository\\Eloquent\\BaseRepository;\nuse Prettus\\Repository\\Traits\\CacheableRepository;\n\nabstract class Repository extends BaseRepository implements CacheableInterface\n{\n    use CacheableRepository;\n\n    /**\n     * Find data by field and value\n     *\n     * @param  string  $field\n     * @param  string  $value\n     * @param  array  $columns\n     * @return mixed\n     */\n    public function findOneByField($field, $value = null, $columns = ['*'])\n    {\n        $model = $this->findByField($field, $value, $columns = ['*']);\n\n        return $model->first();\n    }\n\n    /**\n     * Find data by field and value\n     *\n     * @param  string  $field\n     * @param  string  $value\n     * @param  array  $columns\n     * @return mixed\n     */\n    public function findOneWhere(array $where, $columns = ['*'])\n    {\n        $model = $this->findWhere($where, $columns);\n\n        return $model->first();\n    }\n\n    /**\n     * Find data by id\n     *\n     * @param  int  $id\n     * @param  array  $columns\n     * @return mixed\n     */\n    public function find($id, $columns = ['*'])\n    {\n        $this->applyCriteria();\n        $this->applyScope();\n        $model = $this->model->find($id, $columns);\n        $this->resetModel();\n\n        return $this->parserResult($model);\n    }\n\n    /**\n     * Find data by id\n     *\n     * @param  int  $id\n     * @param  array  $columns\n     * @return mixed\n     */\n    public function findOrFail($id, $columns = ['*'])\n    {\n        $this->applyCriteria();\n        $this->applyScope();\n        $model = $this->model->findOrFail($id, $columns);\n        $this->resetModel();\n\n        return $this->parserResult($model);\n    }\n\n    /**\n     * Count results of repository\n     *\n     * @param  string  $columns\n     * @return int\n     */\n    public function count(array $where = [], $columns = '*')\n    {\n        $this->applyCriteria();\n        $this->applyScope();\n\n        if ($where) {\n            $this->applyConditions($where);\n        }\n\n        $result = $this->model->count($columns);\n        $this->resetModel();\n        $this->resetScope();\n\n        return $result;\n    }\n\n    /**\n     * @param  string  $columns\n     * @return mixed\n     */\n    public function sum($columns)\n    {\n        $this->applyCriteria();\n        $this->applyScope();\n\n        $sum = $this->model->sum($columns);\n        $this->resetModel();\n\n        return $sum;\n    }\n\n    /**\n     * @param  string  $columns\n     * @return mixed\n     */\n    public function avg($columns)\n    {\n        $this->applyCriteria();\n        $this->applyScope();\n\n        $avg = $this->model->avg($columns);\n        $this->resetModel();\n\n        return $avg;\n    }\n\n    /**\n     * @return mixed\n     */\n    public function getModel($data = [])\n    {\n        return $this->model;\n    }\n\n    /**\n     * @throws RepositoryException\n     */\n    public function resetModel()\n    {\n        $this->makeModel();\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Eloquent/TranslatableModel.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Eloquent;\n\nuse Astrotomic\\Translatable\\Translatable;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass TranslatableModel extends Model\n{\n    use Translatable;\n\n    /**\n     * @return string\n     */\n    protected function locale()\n    {\n        if ($this->defaultLocale) {\n            return $this->defaultLocale;\n        }\n\n        return config('translatable.locale') ?: app()->make('translator')->getLocale();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Exceptions/ViterNotFound.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Exceptions;\n\nclass ViterNotFound extends \\Exception\n{\n    /**\n     * Create an instance.\n     *\n     * @param  string  $theme\n     * @return void\n     */\n    public function __construct($namespace)\n    {\n        parent::__construct(\"Viter with `$namespace` namespace not found. Please add `$namespace` namespace in the `config/krayin-vite.php` file.\", 1);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Facades/Acl.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Facades;\n\nuse Illuminate\\Support\\Facades\\Facade;\n\nclass Acl extends Facade\n{\n    /**\n     * Get the registered name of the component.\n     *\n     * @return string\n     */\n    protected static function getFacadeAccessor()\n    {\n        return 'acl';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Facades/Core.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Facades;\n\nuse Illuminate\\Support\\Facades\\Facade;\n\nclass Core extends Facade\n{\n    /**\n     * Get the registered name of the component.\n     *\n     * @return string\n     */\n    protected static function getFacadeAccessor()\n    {\n        return 'core';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Facades/Menu.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Facades;\n\nuse Illuminate\\Support\\Facades\\Facade;\n\nclass Menu extends Facade\n{\n    /**\n     * Get the registered name of the component.\n     *\n     * @return string\n     */\n    protected static function getFacadeAccessor()\n    {\n        return 'menu';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Facades/SystemConfig.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Facades;\n\nuse Illuminate\\Support\\Facades\\Facade;\n\nclass SystemConfig extends Facade\n{\n    /**\n     * Get the registered name of the component.\n     *\n     * @return string\n     */\n    protected static function getFacadeAccessor()\n    {\n        return 'system_config';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Helpers/Helper.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Helpers;\n\nclass Helper\n{\n    /**\n     * @param  string  $packageName\n     * @return array\n     */\n    public function jsonTranslations($packageName)\n    {\n        $currentLocale = app()->getLocale();\n\n        $path = __DIR__.\"/../../../$packageName/src/Resources/lang/$currentLocale/app.php\";\n\n        if (is_string($path) && is_readable($path)) {\n            return include $path;\n        } else {\n            $currentLocale = 'en';\n\n            $path = __DIR__.\"/../../../$packageName/src/Resources/lang/$currentLocale/app.php\";\n\n            return include $path;\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Http/helpers.php",
    "content": "<?php\n\nuse Webkul\\Core\\Acl;\nuse Webkul\\Core\\Core;\nuse Webkul\\Core\\Menu;\nuse Webkul\\Core\\SystemConfig;\nuse Webkul\\Core\\ViewRenderEventManager;\nuse Webkul\\Core\\Vite;\n\nif (! function_exists('core')) {\n    /**\n     * Core helper.\n     */\n    function core(): Core\n    {\n        return app('core');\n    }\n}\n\nif (! function_exists('menu')) {\n    /**\n     * Menu helper.\n     */\n    function menu(): Menu\n    {\n        return app('menu');\n    }\n}\n\nif (! function_exists('acl')) {\n    /**\n     * Acl helper.\n     */\n    function acl(): Acl\n    {\n        return app('acl');\n    }\n}\n\nif (! function_exists('system_config')) {\n    /**\n     * System Config helper.\n     */\n    function system_config(): SystemConfig\n    {\n        return app('system_config');\n    }\n}\n\nif (! function_exists('view_render_event')) {\n    /**\n     * View render event helper.\n     */\n    function view_render_event($eventName, $params = null)\n    {\n        app()->singleton(ViewRenderEventManager::class);\n\n        $viewEventManager = app()->make(ViewRenderEventManager::class);\n\n        $viewEventManager->handleRenderEvent($eventName, $params);\n\n        return $viewEventManager->render();\n    }\n}\n\nif (! function_exists('vite')) {\n    /**\n     * Vite helper.\n     */\n    function vite(): Vite\n    {\n        return app(Vite::class);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Menu/MenuItem.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Menu;\n\nuse Illuminate\\Support\\Collection;\n\nclass MenuItem\n{\n    /**\n     * Create a new MenuItem instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        private string $key,\n        private string $name,\n        private string $route,\n        private string $url,\n        private int $sort,\n        private string $icon,\n        private string $info,\n        private Collection $children,\n    ) {}\n\n    /**\n     * Set name of menu item.\n     */\n    public function setName(string $name): self\n    {\n        $this->name = $name;\n\n        return $this;\n    }\n\n    /**\n     * Get name of menu item.\n     */\n    public function getName(): string\n    {\n        return $this->name;\n    }\n\n    /**\n     * Set position of menu item.\n     */\n    public function setPosition(int $sort): self\n    {\n        $this->sort = $sort;\n\n        return $this;\n    }\n\n    /**\n     * Get position of menu item.\n     */\n    public function getPosition()\n    {\n        return $this->sort;\n    }\n\n    /**\n     * Set icon of menu item.\n     */\n    public function setIcon(string $icon): self\n    {\n        $this->icon = $icon;\n\n        return $this;\n    }\n\n    /**\n     * Get the icon of menu item.\n     */\n    public function getIcon(): string\n    {\n        return $this->icon;\n    }\n\n    /**\n     * Set info of menu item.\n     */\n    public function setInfo(string $info): self\n    {\n        $this->info = $info;\n\n        return $this;\n    }\n\n    /**\n     * Get info of menu item.\n     */\n    public function getInfo(): string\n    {\n        return $this->info;\n    }\n\n    /**\n     * Set route of menu item.\n     */\n    public function setRoute(string $route): self\n    {\n        $this->route = $route;\n\n        return $this;\n    }\n\n    /**\n     * Get current route.\n     */\n    public function getRoute(): string\n    {\n        return $this->route;\n    }\n\n    /**\n     * Set url of menu item.\n     */\n    public function setUrl(string $url): self\n    {\n        $this->url = $url;\n\n        return $this;\n    }\n\n    /**\n     * Get the url of the menu item.\n     */\n    public function getUrl(): string\n    {\n        return $this->url;\n    }\n\n    /**\n     * Set the key of the menu item.\n     */\n    public function setKey(string $key): self\n    {\n        $this->key = $key;\n\n        return $this;\n    }\n\n    /**\n     * Get the key of the menu item.\n     */\n    public function getKey(): string\n    {\n        return $this->key;\n    }\n\n    /**\n     * Set children of menu item.\n     */\n    public function setChildren(Collection $children): self\n    {\n        $this->children = $children;\n\n        return $this;\n    }\n\n    /**\n     * Check weather menu item have children or not.\n     */\n    public function haveChildren(): bool\n    {\n        return $this->children->isNotEmpty();\n    }\n\n    /**\n     * Get children of menu item.\n     */\n    public function getChildren(): Collection\n    {\n        if (! $this->haveChildren()) {\n            return collect();\n        }\n\n        return $this->children;\n    }\n\n    /**\n     * Check weather menu item is active or not.\n     */\n    public function isActive(): bool\n    {\n        if (request()->fullUrlIs($this->getUrl().'*')) {\n            return true;\n        }\n\n        if ($this->haveChildren()) {\n            foreach ($this->getChildren() as $child) {\n                if ($child->isActive()) {\n                    return true;\n                }\n            }\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Menu.php",
    "content": "<?php\n\nnamespace Webkul\\Core;\n\nuse Illuminate\\Support\\Arr;\nuse Illuminate\\Support\\Collection;\nuse Webkul\\Core\\Menu\\MenuItem;\n\nclass Menu\n{\n    /**\n     * Menu items.\n     */\n    private array $items = [];\n\n    /**\n     * Config menu.\n     */\n    private array $configMenu = [];\n\n    /**\n     * Contains current item key.\n     */\n    private string $currentKey = '';\n\n    /**\n     * Menu area for admin.\n     */\n    const ADMIN = 'admin';\n\n    /**\n     * Menu area for customer.\n     */\n    const CUSTOMER = 'customer';\n\n    /**\n     * Add a new menu item.\n     */\n    public function addItem(MenuItem $menuItem): void\n    {\n        $this->items[] = $menuItem;\n    }\n\n    /**\n     * Get all menu items.\n     */\n    public function getItems(?string $area = null, string $key = ''): Collection\n    {\n        if (! $area) {\n            throw new \\Exception('Area must be provided to get menu items.');\n        }\n\n        static $items;\n\n        if ($items) {\n            return $items;\n        }\n\n        $configMenu = collect(config(\"menu.$area\"))->map(function ($item) {\n            return Arr::except([\n                ...$item,\n                'url' => route($item['route'], $item['params'] ?? []),\n            ], ['params']);\n        });\n\n        switch ($area) {\n            case self::ADMIN:\n                $this->configMenu = $configMenu\n                    ->filter(fn ($item) => bouncer()->hasPermission($item['key']))\n                    ->toArray();\n                break;\n\n            default:\n                $this->configMenu = $configMenu->toArray();\n\n                break;\n        }\n\n        if (! $this->items) {\n            $this->prepareMenuItems();\n        }\n\n        $items = collect($this->items)->sortBy(fn ($item) => $item->getPosition());\n\n        return $items;\n    }\n\n    /**\n     * Get admin menu by key or keys.\n     */\n    public function getAdminMenuByKey(array|string $keys): mixed\n    {\n        $items = $this->getItems('admin');\n\n        $keysArray = (array) $keys;\n\n        $filteredItems = $items->filter(fn ($item) => in_array($item->getKey(), $keysArray));\n\n        return is_array($keys) ? $filteredItems : $filteredItems->first();\n    }\n\n    /**\n     * Prepare menu items.\n     */\n    private function prepareMenuItems(): void\n    {\n        $menuWithDotNotation = [];\n\n        foreach ($this->configMenu as $item) {\n            if (strpos(request()->url(), route($item['route'])) !== false) {\n                $this->currentKey = $item['key'];\n            }\n\n            $menuWithDotNotation[$item['key']] = $item;\n        }\n\n        $menu = Arr::undot(Arr::dot($menuWithDotNotation));\n\n        foreach ($menu as $menuItemKey => $menuItem) {\n            $this->addItem(new MenuItem(\n                key: $menuItemKey,\n                name: trans($menuItem['name']),\n                route: $menuItem['route'],\n                url: $menuItem['url'],\n                sort: $menuItem['sort'],\n                icon: $menuItem['icon-class'],\n                info: trans($menuItem['info'] ?? ''),\n                children: $this->processSubMenuItems($menuItem),\n            ));\n        }\n    }\n\n    /**\n     * Process sub menu items.\n     */\n    private function processSubMenuItems($menuItem): Collection\n    {\n        return collect($menuItem)\n            ->sortBy('sort')\n            ->filter(fn ($value) => is_array($value))\n            ->map(function ($subMenuItem) {\n                $subSubMenuItems = $this->processSubMenuItems($subMenuItem);\n\n                return new MenuItem(\n                    key: $subMenuItem['key'],\n                    name: trans($subMenuItem['name']),\n                    route: $subMenuItem['route'],\n                    url: $subMenuItem['url'],\n                    sort: $subMenuItem['sort'],\n                    icon: $subMenuItem['icon-class'],\n                    info: trans($subMenuItem['info'] ?? ''),\n                    children: $subSubMenuItems,\n                );\n            });\n    }\n\n    /**\n     * Get current active menu.\n     */\n    public function getCurrentActiveMenu(?string $area = null): ?MenuItem\n    {\n        $currentKey = implode('.', array_slice(explode('.', $this->currentKey), 0, 2));\n\n        return $this->findMatchingItem($this->getItems($area), $currentKey);\n    }\n\n    /**\n     * Finding the matching item.\n     */\n    private function findMatchingItem($items, $currentKey): ?MenuItem\n    {\n        foreach ($items as $item) {\n            if ($item->key == $currentKey) {\n                return $item;\n            }\n\n            if ($item->haveChildren()) {\n                $matchingChild = $this->findMatchingItem($item->getChildren(), $currentKey);\n\n                if ($matchingChild) {\n                    return $matchingChild;\n                }\n            }\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Models/CoreConfig.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Core\\Contracts\\CoreConfig as CoreConfigContract;\n\nclass CoreConfig extends Model implements CoreConfigContract\n{\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $table = 'core_config';\n\n    protected $fillable = [\n        'code',\n        'value',\n        'locale',\n    ];\n\n    protected $hidden = ['token'];\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Models/CoreConfigProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass CoreConfigProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Models/Country.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Core\\Contracts\\Country as CountryContract;\n\nclass Country extends Model implements CountryContract\n{\n    public $timestamps = false;\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Models/CountryProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass CountryProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Models/CountryState.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Core\\Contracts\\CountryState as CountryStateContract;\n\nclass CountryState extends Model implements CountryStateContract\n{\n    public $timestamps = false;\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Models/CountryStateProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass CountryStateProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Providers/BaseModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Providers;\n\nuse Konekt\\Concord\\BaseModuleServiceProvider as ConcordBaseModuleServiceProvider;\n\nclass BaseModuleServiceProvider extends ConcordBaseModuleServiceProvider\n{\n    /**\n     * {@inheritdoc}\n     */\n    public function boot()\n    {\n        if ($this->areMigrationsEnabled()) {\n            $this->registerMigrations();\n        }\n\n        if ($this->areModelsEnabled()) {\n            $this->registerModels();\n            $this->registerEnums();\n            $this->registerRequestTypes();\n        }\n\n        if ($this->areViewsEnabled()) {\n            $this->registerViews();\n        }\n\n        if ($routes = $this->config('routes', true)) {\n            $this->registerRoutes($routes);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Providers/CoreServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Providers;\n\nuse Illuminate\\Contracts\\Container\\BindingResolutionException;\nuse Illuminate\\Foundation\\AliasLoader;\nuse Illuminate\\Support\\ServiceProvider;\nuse Webkul\\Core\\Acl;\nuse Webkul\\Core\\Console\\Commands\\Version;\nuse Webkul\\Core\\Core;\nuse Webkul\\Core\\Facades\\Acl as AclFacade;\nuse Webkul\\Core\\Facades\\Core as CoreFacade;\nuse Webkul\\Core\\Facades\\Menu as MenuFacade;\nuse Webkul\\Core\\Facades\\SystemConfig as SystemConfigFacade;\nuse Webkul\\Core\\Menu;\nuse Webkul\\Core\\SystemConfig;\n\nclass CoreServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap services.\n     *\n     * @return void\n     *\n     * @throws BindingResolutionException\n     */\n    public function boot()\n    {\n        include __DIR__.'/../Http/helpers.php';\n\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n\n        $this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'core');\n\n        $this->publishes([\n            dirname(__DIR__).'/Config/concord.php' => config_path('concord.php'),\n            dirname(__DIR__).'/Config/cors.php' => config_path('cors.php'),\n            dirname(__DIR__).'/Config/sanctum.php' => config_path('sanctum.php'),\n        ]);\n    }\n\n    /**\n     * Register services.\n     *\n     * @return void\n     */\n    public function register()\n    {\n        $this->registerCommands();\n\n        $this->registerFacades();\n    }\n\n    /**\n     * Register Bouncer as a singleton.\n     *\n     * @return void\n     */\n    protected function registerFacades()\n    {\n        $loader = AliasLoader::getInstance();\n\n        $loader->alias('acl', AclFacade::class);\n\n        $loader->alias('core', CoreFacade::class);\n\n        $loader->alias('system_config', SystemConfigFacade::class);\n\n        $loader->alias('menu', MenuFacade::class);\n\n        $this->app->singleton('acl', fn () => app(Acl::class));\n\n        $this->app->singleton('core', fn () => app(Core::class));\n\n        $this->app->singleton('system_config', fn () => app()->make(SystemConfig::class));\n\n        $this->app->singleton('menu', fn () => app()->make(Menu::class));\n    }\n\n    /**\n     * Register the console commands of this package.\n     */\n    protected function registerCommands(): void\n    {\n        if ($this->app->runningInConsole()) {\n            $this->commands([\n                Version::class,\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Providers;\n\nuse Webkul\\Core\\Models\\CoreConfig;\nuse Webkul\\Core\\Models\\Country;\nuse Webkul\\Core\\Models\\CountryState;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    protected $models = [\n        CoreConfig::class,\n        Country::class,\n        CountryState::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Repositories/CoreConfigRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Repositories;\n\nuse Illuminate\\Support\\Arr;\nuse Illuminate\\Support\\Collection;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Illuminate\\Support\\Str;\nuse Webkul\\Core\\Contracts\\CoreConfig;\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass CoreConfigRepository extends Repository\n{\n    /**\n     * Specify model class name.\n     */\n    public function model(): string\n    {\n        return CoreConfig::class;\n    }\n\n    /**\n     * Get the configuration title.\n     */\n    protected function getTranslatedTitle(mixed $configuration): string\n    {\n        if (\n            method_exists($configuration, 'getTitle')\n            && ! is_null($configuration->getTitle())\n        ) {\n            return trans($configuration->getTitle());\n        }\n\n        if (\n            method_exists($configuration, 'getName')\n            && ! is_null($configuration->getName())\n        ) {\n            return trans($configuration->getName());\n        }\n\n        return '';\n    }\n\n    /**\n     * Get children and fields.\n     */\n    protected function getChildrenAndFields(mixed $configuration, string $searchTerm, array $path, array &$results): void\n    {\n        if (\n            method_exists($configuration, 'getChildren')\n            || method_exists($configuration, 'getFields')\n        ) {\n            $children = $configuration->haveChildren()\n                ? $configuration->getChildren()\n                : $configuration->getFields();\n\n            $tempPath = array_merge($path, [[\n                'key' => $configuration->getKey() ?? null,\n                'title' => $this->getTranslatedTitle($configuration),\n            ]]);\n\n            $results = array_merge($results, $this->search($children, $searchTerm, $tempPath));\n        }\n    }\n\n    /**\n     * Search configuration.\n     *\n     * @param  array  $items\n     */\n    public function search(Collection $items, string $searchTerm, array $path = []): array\n    {\n        $results = [];\n\n        foreach ($items as $configuration) {\n            $title = $this->getTranslatedTitle($configuration);\n\n            if (\n                stripos($title, $searchTerm) !== false\n                && count($path)\n            ) {\n                $queryParam = $path[1]['key'] ?? $configuration->getKey();\n\n                $results[] = [\n                    'title' => implode(' > ', [...Arr::pluck($path, 'title'), $title]),\n                    'url' => route('admin.configuration.index', Str::replace('.', '/', $queryParam)),\n                ];\n            }\n\n            $this->getChildrenAndFields($configuration, $searchTerm, $path, $results);\n        }\n\n        return $results;\n    }\n\n    /**\n     * Create core configuration.\n     */\n    public function create(array $data): void\n    {\n        unset($data['_token']);\n\n        $preparedData = [];\n\n        foreach ($data as $method => $fieldData) {\n            $recursiveData = $this->recursiveArray($fieldData, $method);\n\n            foreach ($recursiveData as $fieldName => $value) {\n                if (\n                    is_array($value)\n                    && isset($value['delete'])\n                ) {\n                    $coreConfigValues = $this->model->where('code', $fieldName)->get();\n\n                    if ($coreConfigValues->isNotEmpty()) {\n                        foreach ($coreConfigValues as $coreConfig) {\n                            if (! empty($coreConfig['value'])) {\n                                Storage::delete($coreConfig['value']);\n                            }\n\n                            parent::delete($coreConfig['id']);\n                        }\n                    }\n\n                    continue;\n                }\n            }\n\n            foreach ($recursiveData as $fieldName => $value) {\n                if (is_array($value)) {\n                    foreach ($value as $key => $val) {\n                        $fieldNameWithKey = $fieldName.'.'.$key;\n\n                        $coreConfigValues = $this->model->where('code', $fieldNameWithKey)->get();\n\n                        if (request()->hasFile($fieldNameWithKey)) {\n                            $val = request()->file($fieldNameWithKey)->store('configuration');\n                        }\n\n                        if ($coreConfigValues->isNotEmpty()) {\n                            foreach ($coreConfigValues as $coreConfig) {\n                                if (request()->hasFile($fieldNameWithKey)) {\n                                    Storage::delete($coreConfig['value']);\n                                }\n\n                                parent::update(['code' => $fieldNameWithKey, 'value' => $val], $coreConfig->id);\n                            }\n                        } else {\n                            parent::create(['code' => $fieldNameWithKey, 'value' => $val]);\n                        }\n                    }\n                } else {\n                    if (request()->hasFile($fieldName)) {\n                        $value = request()->file($fieldName)->store('configuration');\n                    }\n\n                    $preparedData[] = [\n                        'code' => $fieldName,\n                        'value' => $value,\n                    ];\n                }\n            }\n        }\n\n        if (! empty($preparedData)) {\n            foreach ($preparedData as $dataItem) {\n                $coreConfigValues = $this->model->where('code', $dataItem['code'])->get();\n\n                if ($coreConfigValues->isNotEmpty()) {\n                    foreach ($coreConfigValues as $coreConfig) {\n                        parent::update($dataItem, $coreConfig->id);\n                    }\n                } else {\n                    parent::create($dataItem);\n                }\n            }\n        }\n\n        Event::dispatch('core.configuration.save.after');\n    }\n\n    /**\n     * Recursive array.\n     */\n    public function recursiveArray(array $formData, string $method): array\n    {\n        static $data = [];\n\n        static $recursiveArrayData = [];\n\n        foreach ($formData as $form => $formValue) {\n            $value = $method.'.'.$form;\n\n            if (is_array($formValue)) {\n                $dim = $this->countDim($formValue);\n\n                if ($dim > 1) {\n                    $this->recursiveArray($formValue, $value);\n                } elseif ($dim == 1) {\n                    $data[$value] = $formValue;\n                }\n            }\n        }\n\n        foreach ($data as $key => $value) {\n            $field = core()->getConfigField($key);\n\n            if ($field) {\n                $recursiveArrayData[$key] = $value;\n            } else {\n                foreach ($value as $key1 => $val) {\n                    $recursiveArrayData[$key.'.'.$key1] = $val;\n                }\n            }\n        }\n\n        return $recursiveArrayData;\n    }\n\n    /**\n     * Return dimension of the array.\n     */\n    public function countDim(array|string $array): int\n    {\n        if (is_array(reset($array))) {\n            $return = $this->countDim(reset($array)) + 1;\n        } else {\n            $return = 1;\n        }\n\n        return $return;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Repositories/CountryRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Repositories;\n\nuse Prettus\\Repository\\Traits\\CacheableRepository;\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass CountryRepository extends Repository\n{\n    use CacheableRepository;\n\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\Core\\Contracts\\Country';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Repositories/CountryStateRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Repositories;\n\nuse Prettus\\Repository\\Traits\\CacheableRepository;\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass CountryStateRepository extends Repository\n{\n    use CacheableRepository;\n\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\Core\\Contracts\\CountryState';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Resources/lang/ar/app.php",
    "content": "<?php\n\nreturn [\n    'validations' => [\n        'code' => 'يجب أن يكون الحقل رمزًا صالحًا.',\n        'decimal' => 'يجب أن يكون الحقل رقمًا عشريًا.',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Core/src/Resources/lang/en/app.php",
    "content": "<?php\n\nreturn [\n    'validations' => [\n        'code' => 'The field must be a valid code.',\n        'decimal' => 'The field must be a decimal number.',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Core/src/Resources/lang/es/app.php",
    "content": "<?php\n\nreturn [\n    'validations' => [\n        'code' => 'El campo debe ser un código válido.',\n        'decimal' => 'El campo debe ser un número decimal.',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Core/src/Resources/lang/fa/app.php",
    "content": "<?php\n\nreturn [\n    'validations' => [\n        'code' => 'این فیلد باید یک کد معتبر باشد.',\n        'decimal' => 'این فیلد باید یک عدد اعشاری باشد.',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Core/src/Resources/lang/pt_BR/app.php",
    "content": "<?php\n\nreturn [\n    'validations' => [\n        'code' => 'O campo deve ser um código válido.',\n        'decimal' => 'O campo deve ser um número decimal.',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Core/src/Resources/lang/tr/app.php",
    "content": "<?php\n\nreturn [\n    'validations' => [\n        'code' => 'Alan geçerli bir kod olmalıdır.',\n        'decimal' => 'Alan ondalık bir sayı olmalıdır.',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Core/src/Resources/lang/vi/app.php",
    "content": "<?php\n\nreturn [\n    'validations' => [\n        'code' => 'Trường phải là một mã hợp lệ.',\n        'decimal' => 'Trường phải là một số thập phân.',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Core/src/SystemConfig/Item.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\SystemConfig;\n\nuse Illuminate\\Support\\Collection;\n\nclass Item\n{\n    /**\n     * Create a new Item instance.\n     */\n    public function __construct(\n        public Collection $children,\n        public ?array $fields,\n        public ?string $icon,\n        public ?string $info,\n        public string $key,\n        public string $name,\n        public ?string $route = null,\n        public ?int $sort = null\n    ) {}\n\n    /**\n     * Get name of config item.\n     */\n    public function getName(): string\n    {\n        return $this->name ?? '';\n    }\n\n    /**\n     * Format options.\n     */\n    private function formatOptions($options)\n    {\n        return is_array($options) ? $options : (is_string($options) ? $options : []);\n    }\n\n    /**\n     * Get fields of config item.\n     */\n    public function getFields(): Collection\n    {\n        return collect($this->fields)->map(function ($field) {\n            return new ItemField(\n                item_key: $this->key,\n                name: $field['name'],\n                title: $field['title'],\n                info: $field['info'] ?? null,\n                type: $field['type'],\n                depends: $field['depends'] ?? null,\n                path: $field['path'] ?? null,\n                validation: $field['validation'] ?? null,\n                default: $field['default'] ?? null,\n                channel_based: $field['channel_based'] ?? null,\n                locale_based: $field['locale_based'] ?? null,\n                options: $this->formatOptions($field['options'] ?? null),\n                tinymce: $field['tinymce'] ?? false,\n                is_visible: true,\n            );\n        });\n    }\n\n    /**\n     * Get name of config item.\n     */\n    public function getInfo(): ?string\n    {\n        return $this->info;\n    }\n\n    /**\n     * Get current route.\n     */\n    public function getRoute(): string\n    {\n        return $this->route;\n    }\n\n    /**\n     * Get the url of the config item.\n     */\n    public function getUrl(): string\n    {\n        return route($this->getRoute());\n    }\n\n    /**\n     * Get the key of the config item.\n     */\n    public function getKey(): string\n    {\n        return $this->key;\n    }\n\n    /**\n     * Get Icon.\n     */\n    public function getIcon(): ?string\n    {\n        return $this->icon;\n    }\n\n    /**\n     * Check weather config item have children or not.\n     */\n    public function haveChildren(): bool\n    {\n        return $this->children->isNotEmpty();\n    }\n\n    /**\n     * Get children of config item.\n     */\n    public function getChildren(): Collection\n    {\n        if (! $this->haveChildren()) {\n            return collect();\n        }\n\n        return $this->children;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/SystemConfig/ItemField.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\SystemConfig;\n\nuse Illuminate\\Support\\Str;\n\nclass ItemField\n{\n    /**\n     * Laravel to Vee Validation mappings.\n     *\n     * @var array\n     */\n    protected $veeValidateMappings = [\n        'min' => 'min_value',\n    ];\n\n    /**\n     * Create a new ItemField instance.\n     */\n    public function __construct(\n        public string $item_key,\n        public string $name,\n        public string $title,\n        public ?string $info,\n        public string $type,\n        public ?string $path,\n        public ?string $validation,\n        public ?string $depends,\n        public ?string $default,\n        public ?bool $channel_based,\n        public ?bool $locale_based,\n        public array|string $options,\n        public bool $is_visible = true,\n        public bool $tinymce = false,\n    ) {\n        $this->options = $this->getOptions();\n    }\n\n    /**\n     * Get name of config item.\n     */\n    public function getName(): ?string\n    {\n        return $this->name;\n    }\n\n    /**\n     * Get info of config item.\n     */\n    public function getInfo(): ?string\n    {\n        return $this->info ?? '';\n    }\n\n    /**\n     * Get title of config item.\n     */\n    public function getTitle(): ?string\n    {\n        return $this->title ?? '';\n    }\n\n    /**\n     * Determine if the field should use TinyMCE.\n     */\n    public function getTinymce(): bool\n    {\n        return $this->tinymce;\n    }\n\n    /**\n     * Get type of config item.\n     */\n    public function getType(): string\n    {\n        return $this->type;\n    }\n\n    /**\n     * Get path of config item.\n     */\n    public function getPath(): ?string\n    {\n        return $this->path;\n    }\n\n    /**\n     * Get item key of config item.\n     */\n    public function getItemKey(): string\n    {\n        return $this->item_key;\n    }\n\n    /**\n     * Get validation of config item.\n     */\n    public function getValidations(): ?string\n    {\n        if (empty($this->validation)) {\n            return '';\n        }\n\n        foreach ($this->veeValidateMappings as $laravelRule => $veeValidateRule) {\n            $this->validation = str_replace($laravelRule, $veeValidateRule, $this->validation);\n        }\n\n        return $this->validation;\n    }\n\n    /**\n     * Get depends of config item.\n     */\n    public function getDepends(): ?string\n    {\n        return $this->depends;\n    }\n\n    /**\n     * Get default value of config item.\n     */\n    public function getDefault(): ?string\n    {\n        return $this->default;\n    }\n\n    /**\n     * Get channel based of config item.\n     */\n    public function getChannelBased(): ?bool\n    {\n        return $this->channel_based;\n    }\n\n    /**\n     * Get locale based of config item.\n     */\n    public function getLocaleBased(): ?bool\n    {\n        return $this->locale_based;\n    }\n\n    /**\n     * Get name field for forms in configuration page.\n     */\n    public function getNameKey(): string\n    {\n        return $this->item_key.'.'.$this->name;\n    }\n\n    /**\n     * Check if the field is required.\n     */\n    public function isRequired(): string\n    {\n        return Str::contains($this->getValidations(), 'required') ? 'required' : '';\n    }\n\n    /**\n     * Get options of config item.\n     */\n    public function getOptions(): array\n    {\n        if (is_array($this->options)) {\n            return collect($this->options)->map(fn ($option) => [\n                'title' => trans($option['title']),\n                'value' => $option['value'],\n            ])->toArray();\n        }\n\n        return collect($this->getFieldOptions($this->options))->map(fn ($option) => [\n            'title' => trans($option['title']),\n            'value' => $option['value'],\n        ])->toArray();\n    }\n\n    /**\n     * Convert the field to an array.\n     */\n    public function toArray()\n    {\n        return [\n            'name' => $this->getName(),\n            'title' => $this->getTitle(),\n            'info' => $this->getInfo(),\n            'type' => $this->getType(),\n            'path' => $this->getPath(),\n            'depends' => $this->getDepends(),\n            'validation' => $this->getValidations(),\n            'default' => $this->getDefault(),\n            'channel_based' => $this->getChannelBased(),\n            'locale_based' => $this->getLocaleBased(),\n            'options' => $this->getOptions(),\n            'item_key' => $this->getItemKey(),\n            'tinymce' => $this->getTinymce(),\n        ];\n    }\n\n    /**\n     * Get name field for forms in configuration page.\n     *\n     * @param  string  $key\n     * @return string\n     */\n    public function getNameField($key = null)\n    {\n        if (! $key) {\n            $key = $this->item_key.'.'.$this->name;\n        }\n\n        $nameField = '';\n\n        foreach (explode('.', $key) as $key => $field) {\n            $nameField .= $key === 0 ? $field : '['.$field.']';\n        }\n\n        return $nameField;\n    }\n\n    /**\n     * Get depend the field name.\n     */\n    public function getDependFieldName(): string\n    {\n        if (empty($depends = $this->getDepends())) {\n            return '';\n        }\n\n        $dependNameKey = $this->getItemKey().'.'.collect(explode(':', $depends))->first();\n\n        return $this->getNameField($dependNameKey);\n    }\n\n    /**\n     * Returns the select options for the field.\n     */\n    protected function getFieldOptions(string $options): array\n    {\n        [$class, $method] = Str::parseCallback($options);\n\n        return app($class)->$method();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/SystemConfig.php",
    "content": "<?php\n\nnamespace Webkul\\Core;\n\nuse Illuminate\\Support\\Arr;\nuse Illuminate\\Support\\Collection;\nuse Illuminate\\Support\\Facades\\Config;\nuse Webkul\\Core\\Repositories\\CoreConfigRepository;\nuse Webkul\\Core\\SystemConfig\\Item;\n\nclass SystemConfig\n{\n    /**\n     * Items array.\n     */\n    public array $items = [];\n\n    /**\n     * Create a new class instance.\n     *\n     * @return void\n     */\n    public function __construct(protected CoreConfigRepository $coreConfigRepository) {}\n\n    /**\n     * Add Item.\n     */\n    public function addItem(Item $item): void\n    {\n        $this->items[] = $item;\n    }\n\n    /**\n     * Get all configuration items.\n     */\n    public function getItems(): Collection\n    {\n        if (! $this->items) {\n            $this->prepareConfigurationItems();\n        }\n\n        return collect($this->items)\n            ->sortBy('sort');\n    }\n\n    /**\n     * Retrieve Core Config\n     */\n    private function retrieveCoreConfig(): array\n    {\n        static $items;\n\n        if ($items) {\n            return $items;\n        }\n\n        return $items = config('core_config');\n    }\n\n    /**\n     * Prepare configuration items.\n     */\n    public function prepareConfigurationItems()\n    {\n        $configWithDotNotation = [];\n\n        foreach ($this->retrieveCoreConfig() as $item) {\n            $configWithDotNotation[$item['key']] = $item;\n        }\n\n        $configs = Arr::undot(Arr::dot($configWithDotNotation));\n\n        foreach ($configs as $configItem) {\n            $subConfigItems = $this->processSubConfigItems($configItem);\n\n            $this->addItem(new Item(\n                children: $subConfigItems,\n                fields: $configItem['fields'] ?? null,\n                icon: $configItem['icon'] ?? null,\n                key: $configItem['key'],\n                name: trans($configItem['name']),\n                route: $configItem['route'] ?? null,\n                info: trans($configItem['info']) ?? null,\n                sort: $configItem['sort'],\n            ));\n        }\n    }\n\n    /**\n     * Process sub config items.\n     */\n    private function processSubConfigItems($configItem): Collection\n    {\n        return collect($configItem)\n            ->sortBy('sort')\n            ->filter(fn ($value) => is_array($value) && isset($value['name']))\n            ->map(function ($subConfigItem) {\n                $configItemChildren = $this->processSubConfigItems($subConfigItem);\n\n                return new Item(\n                    children: $configItemChildren,\n                    fields: $subConfigItem['fields'] ?? null,\n                    icon: $subConfigItem['icon'] ?? null,\n                    key: $subConfigItem['key'],\n                    name: trans($subConfigItem['name']),\n                    info: trans($subConfigItem['info']) ?? null,\n                    route: $subConfigItem['route'] ?? null,\n                    sort: $subConfigItem['sort'] ?? null,\n                );\n            });\n    }\n\n    /**\n     * Get active configuration item.\n     */\n    public function getActiveConfigurationItem(): ?Item\n    {\n        if (! $slug = request()->route('slug')) {\n            return null;\n        }\n\n        $activeItem = $this->getItems()->where('key', $slug)->first() ?? null;\n\n        if (! $activeItem) {\n            return null;\n        }\n\n        if ($slug2 = request()->route('slug2')) {\n            $activeItem = $activeItem->getChildren()[$slug2];\n        }\n\n        return $activeItem;\n    }\n\n    /**\n     * Get config field.\n     */\n    public function getConfigField(string $fieldName): ?array\n    {\n        foreach ($this->retrieveCoreConfig() as $coreData) {\n            if (! isset($coreData['fields'])) {\n                continue;\n            }\n\n            foreach ($coreData['fields'] as $field) {\n                $name = $coreData['key'].'.'.$field['name'];\n\n                if ($name == $fieldName) {\n                    return $field;\n                }\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Get default config.\n     */\n    private function getDefaultConfig(string $field): mixed\n    {\n        $configFieldInfo = $this->getConfigField($field);\n\n        $fields = explode('.', $field);\n\n        array_shift($fields);\n\n        $field = implode('.', $fields);\n\n        return Config::get($field, $configFieldInfo['default'] ?? null);\n    }\n\n    /**\n     * Retrieve information for configuration\n     */\n    public function getConfigData(string $field): mixed\n    {\n        $coreConfigValue = $this->coreConfigRepository->findOneWhere([\n            'code' => $field,\n        ]);\n\n        if (! $coreConfigValue) {\n            return $this->getDefaultConfig($field);\n        }\n\n        return $coreConfigValue->value;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Traits/PDFHandler.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Traits;\n\nuse ArPHP\\I18N\\Arabic;\nuse Barryvdh\\DomPDF\\Facade\\Pdf;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Str;\nuse Mpdf\\Mpdf;\n\ntrait PDFHandler\n{\n    /**\n     * Download PDF.\n     *\n     * @return Response\n     */\n    protected function downloadPDF(string $html, ?string $fileName = null)\n    {\n        if (is_null($fileName)) {\n            $fileName = Str::random(32);\n        }\n\n        $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');\n\n        if (in_array($direction = app()->getLocale(), ['ar', 'he'])) {\n            $mPDF = new Mpdf([\n                'margin_left' => 0,\n                'margin_right' => 0,\n                'margin_top' => 0,\n                'margin_bottom' => 0,\n            ]);\n\n            $mPDF->SetDirectionality($direction);\n\n            $mPDF->SetDisplayMode('fullpage');\n\n            $mPDF->WriteHTML($this->adjustArabicAndPersianContent($html));\n\n            return response()->streamDownload(fn () => print ($mPDF->Output('', 'S')), $fileName.'.pdf');\n        }\n\n        return Pdf::loadHTML($this->adjustArabicAndPersianContent($html))\n            ->setPaper('A4', 'portrait')\n            ->set_option('defaultFont', 'Courier')\n            ->download($fileName.'.pdf');\n    }\n\n    /**\n     * Adjust arabic and persian content.\n     *\n     * @return string\n     */\n    protected function adjustArabicAndPersianContent(string $html)\n    {\n        $arabic = new Arabic;\n\n        $p = $arabic->arIdentify($html);\n\n        for ($i = count($p) - 1; $i >= 0; $i -= 2) {\n            $utf8ar = $arabic->utf8Glyphs(substr($html, $p[$i - 1], $p[$i] - $p[$i - 1]));\n            $html = substr_replace($html, $utf8ar, $p[$i - 1], $p[$i] - $p[$i - 1]);\n        }\n\n        return $html;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Traits/Sanitizer.php",
    "content": "<?php\n\nnamespace Webkul\\Core\\Traits;\n\nuse enshrined\\svgSanitize\\data\\AllowedAttributes;\nuse enshrined\\svgSanitize\\data\\AllowedTags;\nuse enshrined\\svgSanitize\\Sanitizer as MainSanitizer;\nuse Exception;\nuse Illuminate\\Http\\UploadedFile;\nuse Illuminate\\Support\\Facades\\Storage;\n\n/**\n * Trait for sanitizing SVG uploads to prevent security vulnerabilities.\n */\ntrait Sanitizer\n{\n    /**\n     * Sanitize an SVG file to remove potentially malicious content.\n     */\n    public function sanitizeSvg(string $path, UploadedFile $file): void\n    {\n        if (! $this->isSvgFile($file)) {\n            return;\n        }\n\n        try {\n            $svgContent = Storage::get($path);\n\n            if (! $svgContent) {\n                return;\n            }\n\n            $sanitizer = new MainSanitizer;\n            $sanitizer->setAllowedAttrs(new AllowedAttributes);\n            $sanitizer->setAllowedTags(new AllowedTags);\n\n            $sanitizer->minify(true);\n            $sanitizer->removeRemoteReferences(true);\n            $sanitizer->removeXMLTag(true);\n\n            $sanitizer->setXMLOptions(LIBXML_NONET | LIBXML_NOBLANKS);\n\n            $sanitizedContent = $sanitizer->sanitize($svgContent);\n\n            if ($sanitizedContent === false) {\n                $patterns = [\n                    '/<script\\b[^>]*>(.*?)<\\/script>/is',\n                    '/\\bon\\w+\\s*=\\s*[\"\\'][^\"\\']*[\"\\']/i',\n                    '/javascript\\s*:/i',\n                    '/data\\s*:[^,]*base64/i',\n                ];\n\n                $sanitizedContent = $svgContent;\n\n                foreach ($patterns as $pattern) {\n                    $sanitizedContent = preg_replace($pattern, '', $sanitizedContent);\n                }\n\n                Storage::put($path, $sanitizedContent);\n\n                return;\n            }\n\n            $sanitizedContent = preg_replace('/(<script.*?>.*?<\\/script>)|(\\son\\w+\\s*=\\s*[\"\\'][^\"\\']*[\"\\'])/is', '', $sanitizedContent);\n\n            Storage::put($path, $sanitizedContent);\n        } catch (Exception $e) {\n            report($e->getMessage());\n\n            Storage::delete($path);\n        }\n    }\n\n    /**\n     * Check if the uploaded file is an SVG based on both extension and mime type.\n     */\n    public function isSvgFile(UploadedFile $file): bool\n    {\n        return str_contains(strtolower($file->getClientOriginalExtension()), 'svg');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/ViewRenderEventManager.php",
    "content": "<?php\n\nnamespace Webkul\\Core;\n\nuse Illuminate\\Support\\Facades\\Event;\n\nclass ViewRenderEventManager\n{\n    /**\n     * Contains all templates\n     *\n     * @var array\n     */\n    protected $templates = [];\n\n    /**\n     * Parameters passed with event\n     *\n     * @var array\n     */\n    protected $params;\n\n    /**\n     * Fires event for rendering template\n     *\n     * @param  string  $eventName\n     * @param  array|null  $params\n     * @return string\n     */\n    public function handleRenderEvent($eventName, $params = null)\n    {\n        $this->params = $params ?? [];\n\n        Event::dispatch($eventName, $this);\n\n        return $this->templates;\n    }\n\n    /**\n     *  get params\n     *\n     * @return array\n     */\n    public function getParams()\n    {\n        return $this->params;\n    }\n\n    /**\n     *  get param\n     *\n     * @return mixed\n     */\n    public function getParam($name)\n    {\n        return optional($this->params)[$name];\n    }\n\n    /**\n     * Add templates for render\n     *\n     * @param  string  $template\n     * @return void\n     */\n    public function addTemplate($template)\n    {\n        array_push($this->templates, $template);\n    }\n\n    /**\n     * Renders templates\n     *\n     * @return string\n     */\n    public function render()\n    {\n        $string = '';\n\n        foreach ($this->templates as $template) {\n            if (view()->exists($template)) {\n                $string .= view($template, $this->params)->render();\n            } elseif (is_string($template)) {\n                $string .= $template;\n            }\n        }\n\n        return $string;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Core/src/Vite.php",
    "content": "<?php\n\nnamespace Webkul\\Core;\n\nuse Illuminate\\Support\\Facades\\Vite as BaseVite;\nuse Webkul\\Core\\Exceptions\\ViterNotFound;\n\nclass Vite\n{\n    /**\n     * Return the asset URL.\n     *\n     * @return string\n     */\n    public function asset(string $filename, string $namespace = 'admin')\n    {\n        $viters = config('krayin-vite.viters');\n\n        if (empty($viters[$namespace])) {\n            throw new ViterNotFound($namespace);\n        }\n\n        $url = trim($filename, '/');\n\n        $viteUrl = trim($viters[$namespace]['package_assets_directory'], '/').'/'.$url;\n\n        return BaseVite::useHotFile($viters[$namespace]['hot_file'])\n            ->useBuildDirectory($viters[$namespace]['build_directory'])\n            ->asset($viteUrl);\n    }\n\n    /**\n     * Set krayin vite.\n     *\n     * @return mixed\n     */\n    public function set(mixed $entryPoints, string $namespace = 'admin')\n    {\n        $viters = config('krayin-vite.viters');\n\n        if (empty($viters[$namespace])) {\n            throw new ViterNotFound($namespace);\n        }\n\n        return BaseVite::useHotFile($viters[$namespace]['hot_file'])\n            ->useBuildDirectory($viters[$namespace]['build_directory'])\n            ->withEntryPoints($entryPoints);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Action.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid;\n\n/**\n * Initial implementation of the action class. Stay tuned for more features coming soon.\n */\nclass Action\n{\n    /**\n     * Create a column instance.\n     */\n    public function __construct(\n        public string $index,\n        public string $icon,\n        public string $title,\n        public string $method,\n        public mixed $url,\n    ) {}\n\n    /**\n     * Convert to an array.\n     */\n    public function toArray()\n    {\n        return [\n            'index' => $this->index,\n            'icon' => $this->icon,\n            'title' => $this->title,\n            'method' => $this->method,\n            'url' => $this->url,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Column.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid;\n\nuse Webkul\\DataGrid\\Enums\\ColumnTypeEnum;\nuse Webkul\\DataGrid\\Exceptions\\InvalidColumnException;\n\nclass Column\n{\n    /**\n     * Column's index.\n     */\n    protected string $index;\n\n    /**\n     * Column's label.\n     */\n    protected string $label;\n\n    /**\n     * Column's type.\n     */\n    protected string $type;\n\n    /**\n     * Column's searchability.\n     */\n    protected bool $searchable = false;\n\n    /**\n     * Column's filterability.\n     */\n    protected bool $filterable = false;\n\n    /**\n     * Column's filterable type.\n     */\n    protected ?string $filterableType = null;\n\n    /**\n     * Column's filterable options.\n     */\n    protected array $filterableOptions = [];\n\n    /**\n     * Column's allow multiple values.\n     */\n    protected bool $allowMultipleValues = true;\n\n    /**\n     * Column's sortability.\n     */\n    protected bool $sortable = false;\n\n    /**\n     * Column's exportability.\n     */\n    protected bool $exportable = true;\n\n    /**\n     * Column's visibility.\n     */\n    protected bool $visibility = true;\n\n    /**\n     * Column's closure.\n     */\n    protected mixed $closure = null;\n\n    /**\n     * Fully qualified table's column name.\n     */\n    protected $columnName;\n\n    /**\n     * Create a column instance.\n     */\n    public function __construct(array $column)\n    {\n        $this->init($column);\n    }\n\n    /**\n     * Initialize all necessary settings for the columns.\n     */\n    public function init(array $column): void\n    {\n        $this->setIndex($column['index']);\n\n        $this->setLabel($column['label']);\n\n        $this->setType($column['type']);\n\n        $this->setSearchable($column['searchable'] ?? $this->searchable);\n\n        $this->setFilterable($column['filterable'] ?? $this->filterable);\n\n        $this->setFilterableType($column['filterable_type'] ?? $this->filterableType);\n\n        $this->setFilterableOptions($column['filterable_options'] ?? $this->filterableOptions);\n\n        $this->setAllowMultipleValues($column['allow_multiple_values'] ?? $this->allowMultipleValues);\n\n        $this->setSortable($column['sortable'] ?? $this->sortable);\n\n        $this->setVisibility($column['visibility'] ?? $this->visibility);\n\n        $this->setClosure($column['closure'] ?? $this->closure);\n\n        $this->setColumnName($this->index);\n    }\n\n    /**\n     * Set index.\n     */\n    public function setIndex(string $index): void\n    {\n        $this->index = $index;\n    }\n\n    /**\n     * Get index.\n     */\n    public function getIndex(): string\n    {\n        return $this->index;\n    }\n\n    /**\n     * Set label.\n     */\n    public function setLabel(string $label): void\n    {\n        $this->label = $label;\n    }\n\n    /**\n     * Get label.\n     */\n    public function getLabel(): string\n    {\n        return $this->label;\n    }\n\n    /**\n     * Set type.\n     */\n    public function setType(string $type): void\n    {\n        $this->type = $type;\n    }\n\n    /**\n     * Get type.\n     */\n    public function getType(): string\n    {\n        return $this->type;\n    }\n\n    /**\n     * Set searchable.\n     */\n    public function setSearchable(bool $searchable): void\n    {\n        $this->searchable = $searchable;\n    }\n\n    /**\n     * Get searchable.\n     */\n    public function getSearchable(): bool\n    {\n        return $this->searchable;\n    }\n\n    /**\n     * Set filterable.\n     */\n    public function setFilterable(bool $filterable): void\n    {\n        $this->filterable = $filterable;\n    }\n\n    /**\n     * Get filterable.\n     */\n    public function getFilterable(): bool\n    {\n        return $this->filterable;\n    }\n\n    /**\n     * Set filterable type.\n     */\n    public function setFilterableType(?string $filterableType): void\n    {\n        $this->filterableType = $filterableType;\n    }\n\n    /**\n     * Get filterable type.\n     */\n    public function getFilterableType(): ?string\n    {\n        return $this->filterableType;\n    }\n\n    /**\n     * Set filterable options.\n     */\n    public function setFilterableOptions(mixed $filterableOptions): void\n    {\n        if ($filterableOptions instanceof \\Closure) {\n            $filterableOptions = $filterableOptions();\n        }\n\n        $this->filterableOptions = $filterableOptions;\n    }\n\n    /**\n     * Get filterable options.\n     */\n    public function getFilterableOptions(): array\n    {\n        return $this->filterableOptions;\n    }\n\n    /**\n     * Set allow multiple values.\n     */\n    public function setAllowMultipleValues(bool $allowMultipleValues): void\n    {\n        $this->allowMultipleValues = $allowMultipleValues;\n    }\n\n    /**\n     * Get allow multiple values.\n     */\n    public function getAllowMultipleValues(): bool\n    {\n        return $this->allowMultipleValues;\n    }\n\n    /**\n     * Set sortable.\n     */\n    public function setSortable(?bool $sortable = null): void\n    {\n        $this->sortable = $sortable;\n    }\n\n    /**\n     * Get sortable.\n     */\n    public function getSortable(): bool\n    {\n        return $this->sortable;\n    }\n\n    /**\n     * Set exportable.\n     */\n    public function setExportable(bool $exportable): void\n    {\n        $this->exportable = $exportable;\n    }\n\n    /**\n     * Get exportable.\n     */\n    public function getExportable(): bool\n    {\n        return $this->exportable;\n    }\n\n    /**\n     * Set visibility.\n     */\n    public function setVisibility(bool $visibility): void\n    {\n        $this->visibility = $visibility;\n    }\n\n    /**\n     * Get visibility.\n     */\n    public function getVisibility(): bool\n    {\n        return $this->visibility;\n    }\n\n    /**\n     * Set closure.\n     */\n    public function setClosure(mixed $closure): void\n    {\n        $this->closure = $closure;\n    }\n\n    /**\n     * Get closure.\n     */\n    public function getClosure(): mixed\n    {\n        return $this->closure;\n    }\n\n    /**\n     * Define the table's column name. Initially, it will match the index. However, after adding an alias,\n     * the column name may change.\n     */\n    public function setColumnName(mixed $columnName): void\n    {\n        $this->columnName = $columnName;\n    }\n\n    /**\n     * Get the table's column name.\n     */\n    public function getColumnName(): mixed\n    {\n        return $this->columnName;\n    }\n\n    /**\n     * To array.\n     */\n    public function toArray(): array\n    {\n        return [\n            'index' => $this->index,\n            'label' => $this->label,\n            'type' => $this->type,\n            'searchable' => $this->searchable,\n            'filterable' => $this->filterable,\n            'filterable_type' => $this->filterableType,\n            'filterable_options' => $this->filterableOptions,\n            'allow_multiple_values' => $this->allowMultipleValues,\n            'sortable' => $this->sortable,\n            'visibility' => $this->visibility,\n        ];\n    }\n\n    /**\n     * Validate the column.\n     */\n    public static function validate(array $column): void\n    {\n        if (empty($column['index'])) {\n            throw new InvalidColumnException('The `index` key is required. Ensure that the `index` key is present in all calls to the `addColumn` method.');\n        }\n\n        if (empty($column['label'])) {\n            throw new InvalidColumnException('The `label` key is required. Ensure that the `label` key is present in all calls to the `addColumn` method.');\n        }\n\n        if (empty($column['type'])) {\n            throw new InvalidColumnException('The `type` key is required. Ensure that the `type` key is present in all calls to the `addColumn` method.');\n        }\n    }\n\n    /**\n     * Resolve the column type class.\n     */\n    public static function resolveType(array $column): self\n    {\n        self::validate($column);\n\n        $columnTypeClass = ColumnTypeEnum::getClassName($column['type']);\n\n        return new $columnTypeClass($column);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/ColumnTypes/Aggregate.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\ColumnTypes;\n\nuse Webkul\\DataGrid\\Column;\nuse Webkul\\DataGrid\\Enums\\FilterTypeEnum;\n\nclass Aggregate extends Column\n{\n    /**\n     * Process filter.\n     */\n    public function processFilter($queryBuilder, $requestedValues)\n    {\n        if ($this->filterableType === FilterTypeEnum::DROPDOWN->value) {\n            return $queryBuilder->having(function ($scopeQueryBuilder) use ($requestedValues) {\n                if (is_string($requestedValues)) {\n                    $scopeQueryBuilder->orHaving($this->columnName, $requestedValues);\n\n                    return;\n                }\n\n                foreach ($requestedValues as $value) {\n                    $scopeQueryBuilder->orHaving($this->columnName, $value);\n                }\n            });\n        }\n\n        return $queryBuilder->having(function ($scopeQueryBuilder) use ($requestedValues) {\n            if (is_string($requestedValues)) {\n                $scopeQueryBuilder->orHaving($this->columnName, 'LIKE', '%'.$requestedValues.'%');\n\n                return;\n            }\n\n            foreach ($requestedValues as $value) {\n                $scopeQueryBuilder->orHaving($this->columnName, 'LIKE', '%'.$value.'%');\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/ColumnTypes/Boolean.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\ColumnTypes;\n\nuse Webkul\\DataGrid\\Column;\nuse Webkul\\DataGrid\\Enums\\FilterTypeEnum;\nuse Webkul\\DataGrid\\Exceptions\\InvalidColumnException;\n\nclass Boolean extends Column\n{\n    /**\n     * Set filterable type.\n     */\n    public function setFilterableType(?string $filterableType): void\n    {\n        if (\n            $filterableType\n            && ($filterableType !== FilterTypeEnum::DROPDOWN->value)\n        ) {\n            throw new InvalidColumnException('Boolean filters will only work with `dropdown` type. Either remove the `filterable_type` or set it to `dropdown`.');\n        }\n\n        if (! $filterableType) {\n            $filterableType = FilterTypeEnum::DROPDOWN->value;\n        }\n\n        parent::setFilterableType($filterableType);\n    }\n\n    /**\n     * Set filterable options.\n     */\n    public function setFilterableOptions(mixed $filterableOptions): void\n    {\n        if (empty($filterableOptions)) {\n            $filterableOptions = [\n                [\n                    'label' => trans('admin::app.components.datagrid.filters.boolean-options.true'),\n                    'value' => 1,\n                ],\n                [\n                    'label' => trans('admin::app.components.datagrid.filters.boolean-options.false'),\n                    'value' => 0,\n                ],\n            ];\n        }\n\n        parent::setFilterableOptions($filterableOptions);\n    }\n\n    /**\n     * Process filter.\n     */\n    public function processFilter($queryBuilder, $requestedValues): mixed\n    {\n        return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedValues) {\n            if (is_string($requestedValues)) {\n                $scopeQueryBuilder->orWhere($this->columnName, $requestedValues);\n\n                return;\n            }\n\n            foreach ($requestedValues as $value) {\n                $scopeQueryBuilder->orWhere($this->columnName, $value);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/ColumnTypes/Date.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\ColumnTypes;\n\nuse Webkul\\DataGrid\\Column;\nuse Webkul\\DataGrid\\Enums\\DateRangeOptionEnum;\nuse Webkul\\DataGrid\\Enums\\FilterTypeEnum;\nuse Webkul\\DataGrid\\Exceptions\\InvalidColumnException;\n\nclass Date extends Column\n{\n    /**\n     * Set filterable type.\n     */\n    public function setFilterableType(?string $filterableType): void\n    {\n        if (\n            $filterableType\n            && ($filterableType !== FilterTypeEnum::DATE_RANGE->value)\n        ) {\n            throw new InvalidColumnException('Date filters will only work with `date_range` type. Either remove the `filterable_type` or set it to `date_range`.');\n        }\n\n        parent::setFilterableType($filterableType);\n    }\n\n    /**\n     * Set filterable options.\n     */\n    public function setFilterableOptions(mixed $filterableOptions): void\n    {\n        if (empty($filterableOptions)) {\n            $filterableOptions = DateRangeOptionEnum::options();\n        }\n\n        parent::setFilterableOptions($filterableOptions);\n    }\n\n    /**\n     * Process filter.\n     */\n    public function processFilter($queryBuilder, $requestedDates)\n    {\n        return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedDates) {\n            if (is_string($requestedDates)) {\n                $rangeOption = collect($this->filterableOptions)->firstWhere('name', $requestedDates);\n\n                $requestedDates = ! $rangeOption\n                    ? [[$requestedDates, $requestedDates]]\n                    : [[$rangeOption['from'], $rangeOption['to']]];\n            }\n\n            foreach ($requestedDates as $value) {\n                $scopeQueryBuilder->whereBetween($this->columnName, [\n                    ($value[0] ?? '').' 00:00:01',\n                    ($value[1] ?? '').' 23:59:59',\n                ]);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/ColumnTypes/Datetime.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\ColumnTypes;\n\nuse Webkul\\DataGrid\\Column;\nuse Webkul\\DataGrid\\Enums\\DateRangeOptionEnum;\nuse Webkul\\DataGrid\\Enums\\FilterTypeEnum;\nuse Webkul\\DataGrid\\Exceptions\\InvalidColumnException;\n\nclass Datetime extends Column\n{\n    /**\n     * Set filterable type.\n     */\n    public function setFilterableType(?string $filterableType): void\n    {\n        if (\n            $filterableType\n            && ($filterableType !== FilterTypeEnum::DATETIME_RANGE->value)\n        ) {\n            throw new InvalidColumnException('Datetime filters will only work with `datetime_range` type. Either remove the `filterable_type` or set it to `datetime_range`.');\n        }\n\n        parent::setFilterableType($filterableType);\n    }\n\n    /**\n     * Set filterable options.\n     */\n    public function setFilterableOptions(mixed $filterableOptions): void\n    {\n        if (empty($filterableOptions)) {\n            $filterableOptions = DateRangeOptionEnum::options();\n        }\n\n        parent::setFilterableOptions($filterableOptions);\n    }\n\n    /**\n     * Process filter.\n     */\n    public function processFilter($queryBuilder, $requestedDates)\n    {\n        return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedDates) {\n            if (is_string($requestedDates)) {\n                $rangeOption = collect($this->filterableOptions)->firstWhere('name', $requestedDates);\n\n                $requestedDates = ! $rangeOption\n                    ? [[$requestedDates, $requestedDates]]\n                    : [[$rangeOption['from'], $rangeOption['to']]];\n            }\n\n            foreach ($requestedDates as $value) {\n                $scopeQueryBuilder->whereBetween($this->columnName, [$value[0] ?? '', $value[1] ?? '']);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/ColumnTypes/Decimal.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\ColumnTypes;\n\nuse Webkul\\DataGrid\\Column;\n\nclass Decimal extends Column\n{\n    /**\n     * Process filter.\n     */\n    public function processFilter($queryBuilder, $requestedValues)\n    {\n        return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedValues) {\n            if (is_string($requestedValues)) {\n                $scopeQueryBuilder->orWhere($this->columnName, $requestedValues);\n\n                return;\n            }\n\n            foreach ($requestedValues as $value) {\n                $scopeQueryBuilder->orWhere($this->columnName, $value);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/ColumnTypes/Integer.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\ColumnTypes;\n\nuse Webkul\\DataGrid\\Column;\n\nclass Integer extends Column\n{\n    /**\n     * Process filter.\n     */\n    public function processFilter($queryBuilder, $requestedValues)\n    {\n        return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedValues) {\n            if (is_string($requestedValues)) {\n                $scopeQueryBuilder->orWhere($this->columnName, $requestedValues);\n\n                return;\n            }\n\n            foreach ($requestedValues as $value) {\n                $scopeQueryBuilder->orWhere($this->columnName, $value);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/ColumnTypes/Text.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\ColumnTypes;\n\nuse Webkul\\DataGrid\\Column;\nuse Webkul\\DataGrid\\Enums\\FilterTypeEnum;\n\nclass Text extends Column\n{\n    /**\n     * Process filter.\n     */\n    public function processFilter($queryBuilder, $requestedValues)\n    {\n        if ($this->filterableType === FilterTypeEnum::DROPDOWN->value) {\n            return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedValues) {\n                if (is_string($requestedValues)) {\n                    $scopeQueryBuilder->orWhere($this->columnName, $requestedValues);\n\n                    return;\n                }\n\n                foreach ($requestedValues as $value) {\n                    $scopeQueryBuilder->orWhere($this->columnName, $value);\n                }\n            });\n        }\n\n        return $queryBuilder->where(function ($scopeQueryBuilder) use ($requestedValues) {\n            if (is_string($requestedValues)) {\n                $scopeQueryBuilder->orWhere($this->columnName, 'LIKE', '%'.$requestedValues.'%');\n\n                return;\n            }\n\n            foreach ($requestedValues as $value) {\n                $scopeQueryBuilder->orWhere($this->columnName, 'LIKE', '%'.$value.'%');\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Contracts/SavedFilter.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\Contracts;\n\ninterface SavedFilter {}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/DataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid;\n\nuse Illuminate\\Database\\Query\\Builder;\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Pagination\\LengthAwarePaginator;\nuse Illuminate\\Support\\Facades\\Crypt;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Str;\nuse Maatwebsite\\Excel\\Facades\\Excel;\nuse Symfony\\Component\\HttpFoundation\\BinaryFileResponse;\nuse Webkul\\DataGrid\\Enums\\ColumnTypeEnum;\nuse Webkul\\DataGrid\\Exports\\DataGridExport;\n\nabstract class DataGrid\n{\n    /**\n     * Primary column.\n     *\n     * @var string\n     */\n    protected $primaryColumn = 'id';\n\n    /**\n     * Default sort column of datagrid.\n     *\n     * @var ?string\n     */\n    protected $sortColumn;\n\n    /**\n     * Default sort order of datagrid.\n     *\n     * @var string\n     */\n    protected $sortOrder = 'desc';\n\n    /**\n     * Default items per page.\n     *\n     * @var int\n     */\n    protected $itemsPerPage = 10;\n\n    /**\n     * Per page options.\n     *\n     * @var array\n     */\n    protected $perPageOptions = [10, 20, 30, 40, 50];\n\n    /**\n     * Columns.\n     *\n     * @var array\n     */\n    protected $columns = [];\n\n    /**\n     * Actions.\n     *\n     * @var array\n     */\n    protected $actions = [];\n\n    /**\n     * Mass action.\n     *\n     * @var array\n     */\n    protected $massActions = [];\n\n    /**\n     * Query builder instance.\n     *\n     * @var object\n     */\n    protected $queryBuilder;\n\n    /**\n     * Paginator instance.\n     */\n    protected LengthAwarePaginator $paginator;\n\n    /**\n     * Exportable.\n     */\n    protected bool $exportable = false;\n\n    /**\n     * Export meta information.\n     */\n    protected mixed $exportFile = null;\n\n    /**\n     * Prepare query builder.\n     */\n    abstract public function prepareQueryBuilder();\n\n    /**\n     * Prepare columns.\n     */\n    abstract public function prepareColumns();\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions() {}\n\n    /**\n     * Prepare mass actions.\n     */\n    public function prepareMassActions() {}\n\n    /**\n     * Get columns.\n     */\n    public function getColumns(): array\n    {\n        return $this->columns;\n    }\n\n    /**\n     * Get actions.\n     */\n    public function getActions(): array\n    {\n        return $this->actions;\n    }\n\n    /**\n     * Get mass actions.\n     */\n    public function getMassActions(): array\n    {\n        return $this->massActions;\n    }\n\n    /**\n     * Add column.\n     */\n    public function addColumn(array $column): void\n    {\n        $this->dispatchEvent('columns.add.before', [$this, $column]);\n\n        $this->columns[] = Column::resolveType($column);\n\n        $this->dispatchEvent('columns.add.after', [$this, $this->columns[count($this->columns) - 1]]);\n    }\n\n    /**\n     * Add action.\n     */\n    public function addAction(array $action): void\n    {\n        $this->dispatchEvent('actions.add.before', [$this, $action]);\n\n        $this->actions[] = new Action(\n            index: $action['index'] ?? '',\n            icon: $action['icon'] ?? '',\n            title: $action['title'],\n            method: $action['method'],\n            url: $action['url'],\n        );\n\n        $this->dispatchEvent('actions.add.after', [$this, $this->actions[count($this->actions) - 1]]);\n    }\n\n    /**\n     * Add mass action.\n     */\n    public function addMassAction(array $massAction): void\n    {\n        $this->dispatchEvent('mass_actions.add.before', [$this, $massAction]);\n\n        $this->massActions[] = new MassAction(\n            icon: $massAction['icon'] ?? '',\n            title: $massAction['title'],\n            method: $massAction['method'],\n            url: $massAction['url'],\n            options: $massAction['options'] ?? [],\n        );\n\n        $this->dispatchEvent('mass_actions.add.after', [$this, $this->massActions[count($this->massActions) - 1]]);\n    }\n\n    /**\n     * Set query builder.\n     *\n     * @param  mixed  $queryBuilder\n     */\n    public function setQueryBuilder($queryBuilder = null): void\n    {\n        $this->dispatchEvent('query_builder.set.before', [$this, $queryBuilder]);\n\n        $this->queryBuilder = $queryBuilder ?: $this->prepareQueryBuilder();\n\n        $this->dispatchEvent('query_builder.set.after', $this);\n    }\n\n    /**\n     * Get query builder.\n     */\n    public function getQueryBuilder(): mixed\n    {\n        return $this->queryBuilder;\n    }\n\n    /**\n     * Map your filter.\n     */\n    public function addFilter(string $datagridColumn, mixed $queryColumn): void\n    {\n        $this->dispatchEvent('filters.add.before', [$this, $datagridColumn, $queryColumn]);\n\n        foreach ($this->columns as $column) {\n            if ($column->getIndex() === $datagridColumn) {\n                $column->setColumnName($queryColumn);\n\n                break;\n            }\n        }\n\n        $this->dispatchEvent('filters.add.after', [$this, $datagridColumn, $queryColumn]);\n    }\n\n    /**\n     * Set exportable.\n     */\n    public function setExportable(bool $exportable): void\n    {\n        $this->dispatchEvent('exportable.set.before', [$this, $exportable]);\n\n        $this->exportable = $exportable;\n\n        $this->dispatchEvent('exportable.set.after', $this);\n    }\n\n    /**\n     * Get exportable.\n     */\n    public function getExportable(): bool\n    {\n        return $this->exportable;\n    }\n\n    /**\n     * Set export file.\n     *\n     * @param  string  $format\n     * @return void\n     */\n    public function setExportFile($format = 'csv')\n    {\n        $this->dispatchEvent('export_file.set.before', [$this, $format]);\n\n        $this->setExportable(true);\n\n        $this->exportFile = Excel::download(new DataGridExport($this), Str::random(36).'.'.$format);\n\n        $this->dispatchEvent('export_file.set.after', $this);\n    }\n\n    /**\n     * Download export file.\n     *\n     * @return BinaryFileResponse\n     */\n    public function downloadExportFile()\n    {\n        return $this->exportFile;\n    }\n\n    /**\n     * Process the datagrid.\n     *\n     * @return BinaryFileResponse|JsonResponse\n     */\n    public function process()\n    {\n        $this->prepare();\n\n        if ($this->getExportable()) {\n            return $this->downloadExportFile();\n        }\n\n        return response()->json($this->formatData());\n    }\n\n    /**\n     * To json. The reason for deprecation is that it is not an action returning JSON; instead,\n     * it is a process method which returns a download as well as a JSON response.\n     *\n     * @deprecated\n     *\n     * @return BinaryFileResponse|JsonResponse\n     */\n    public function toJson()\n    {\n        $this->prepare();\n\n        if ($this->getExportable()) {\n            return $this->downloadExportFile();\n        }\n\n        return response()->json($this->formatData());\n    }\n\n    /**\n     * Validated request.\n     */\n    protected function validatedRequest(): array\n    {\n        request()->validate([\n            'filters' => ['sometimes', 'required', 'array'],\n            'sort' => ['sometimes', 'required', 'array'],\n            'pagination' => ['sometimes', 'required', 'array'],\n            'export' => ['sometimes', 'required', 'boolean'],\n            'format' => ['sometimes', 'required', 'in:csv,xls,xlsx'],\n        ]);\n\n        return request()->only(['filters', 'sort', 'pagination', 'export', 'format']);\n    }\n\n    /**\n     * Process all requested filters.\n     *\n     * @return Builder\n     */\n    protected function processRequestedFilters(array $requestedFilters)\n    {\n        foreach ($requestedFilters as $requestedColumn => $requestedValues) {\n            if ($requestedColumn === 'all') {\n                $this->queryBuilder->where(function ($scopeQueryBuilder) use ($requestedValues) {\n                    foreach ($requestedValues as $value) {\n                        collect($this->columns)\n                            ->filter(fn ($column) => $column->getSearchable() && ! in_array($column->getType(), [\n                                ColumnTypeEnum::BOOLEAN->value,\n                                ColumnTypeEnum::AGGREGATE->value,\n                            ]))\n                            ->each(fn ($column) => $scopeQueryBuilder->orWhere($column->getColumnName(), 'LIKE', '%'.$value.'%'));\n                    }\n                });\n            } else {\n                collect($this->columns)\n                    ->first(fn ($column) => $column->getIndex() === $requestedColumn)\n                    ->processFilter($this->queryBuilder, $requestedValues);\n            }\n        }\n\n        return $this->queryBuilder;\n    }\n\n    /**\n     * Process requested sorting.\n     *\n     * @return Builder\n     */\n    protected function processRequestedSorting($requestedSort)\n    {\n        if (! $this->sortColumn) {\n            $this->sortColumn = $this->primaryColumn;\n        }\n\n        return $this->queryBuilder->orderBy($requestedSort['column'] ?? $this->sortColumn, $requestedSort['order'] ?? $this->sortOrder);\n    }\n\n    /**\n     * Process requested pagination.\n     */\n    protected function processRequestedPagination($requestedPagination): LengthAwarePaginator\n    {\n        return $this->queryBuilder->paginate(\n            $requestedPagination['per_page'] ?? $this->itemsPerPage,\n            ['*'],\n            'page',\n            $requestedPagination['page'] ?? 1\n        );\n    }\n\n    /**\n     * Process paginated request.\n     */\n    protected function processPaginatedRequest(array $requestedParams): void\n    {\n        $this->dispatchEvent('process_request.paginated.before', $this);\n\n        $this->paginator = $this->processRequestedPagination($requestedParams['pagination'] ?? []);\n\n        $this->dispatchEvent('process_request.paginated.after', $this);\n    }\n\n    /**\n     * Process export request.\n     */\n    protected function processExportRequest(array $requestedParams): void\n    {\n        $this->dispatchEvent('process_request.export.before', $this);\n\n        $this->setExportFile($requestedParams['format']);\n\n        $this->dispatchEvent('process_request.export.after', $this);\n    }\n\n    /**\n     * Process request.\n     */\n    protected function processRequest(): void\n    {\n        $this->dispatchEvent('process_request.before', $this);\n\n        /**\n         * Store all request parameters in this variable; avoid using direct request helpers afterward.\n         */\n        $requestedParams = $this->validatedRequest();\n\n        $this->queryBuilder = $this->processRequestedFilters($requestedParams['filters'] ?? []);\n\n        $this->queryBuilder = $this->processRequestedSorting($requestedParams['sort'] ?? []);\n\n        /**\n         * The `export` parameter is validated as a boolean in the `validatedRequest`. An `empty` function will not work,\n         * as it will always be treated as true because of \"0\" and \"1\".\n         */\n        isset($requestedParams['export']) && (bool) $requestedParams['export']\n            ? $this->processExportRequest($requestedParams)\n            : $this->processPaginatedRequest($requestedParams);\n\n        $this->dispatchEvent('process_request.after', $this);\n    }\n\n    /**\n     * Prepare all the setup for datagrid.\n     */\n    protected function sanitizeRow($row): \\stdClass\n    {\n        /**\n         * Convert stdClass to array.\n         */\n        $tempRow = json_decode(json_encode($row), true);\n\n        foreach ($tempRow as $column => $value) {\n            if (! is_string($tempRow[$column])) {\n                continue;\n            }\n\n            if (is_array($value)) {\n                return $this->sanitizeRow($tempRow[$column]);\n            } else {\n                $row->{$column} = strip_tags($value);\n            }\n        }\n\n        return $row;\n    }\n\n    /**\n     * Format columns.\n     */\n    protected function formatColumns(): array\n    {\n        return collect($this->columns)\n            ->map(fn ($column) => $column->toArray())\n            ->toArray();\n    }\n\n    /**\n     * Format actions.\n     */\n    protected function formatActions(): array\n    {\n        return collect($this->actions)\n            ->map(fn ($action) => $action->toArray())\n            ->toArray();\n    }\n\n    /**\n     * Format mass actions.\n     */\n    protected function formatMassActions(): array\n    {\n        return collect($this->massActions)\n            ->map(fn ($massAction) => $massAction->toArray())\n            ->toArray();\n    }\n\n    /**\n     * Format records.\n     */\n    protected function formatRecords($records): mixed\n    {\n        foreach ($records as $record) {\n            $record = $this->sanitizeRow($record);\n\n            foreach ($this->columns as $column) {\n                if ($closure = $column->getClosure()) {\n                    $record->{$column->getIndex()} = $closure($record);\n                }\n            }\n\n            $record->actions = [];\n\n            foreach ($this->actions as $index => $action) {\n                $getUrl = $action->url;\n\n                $record->actions[] = [\n                    'index' => ! empty($action->index) ? $action->index : 'action_'.$index + 1,\n                    'icon' => $action->icon,\n                    'title' => $action->title,\n                    'method' => $action->method,\n                    'url' => $getUrl($record),\n                ];\n            }\n        }\n\n        return $records;\n    }\n\n    /**\n     * Format data.\n     */\n    protected function formatData(): array\n    {\n        $paginator = $this->paginator->toArray();\n\n        return [\n            'id' => Crypt::encryptString(get_called_class()),\n            'columns' => $this->formatColumns(),\n            'actions' => $this->formatActions(),\n            'mass_actions' => $this->formatMassActions(),\n            'records' => $this->formatRecords($paginator['data']),\n            'meta' => [\n                'primary_column' => $this->primaryColumn,\n                'from' => $paginator['from'],\n                'to' => $paginator['to'],\n                'total' => $paginator['total'],\n                'per_page_options' => $this->perPageOptions,\n                'per_page' => $paginator['per_page'],\n                'current_page' => $paginator['current_page'],\n                'last_page' => $paginator['last_page'],\n            ],\n        ];\n    }\n\n    /**\n     * Dispatch event.\n     */\n    protected function dispatchEvent(string $eventName, mixed $payload): void\n    {\n        $reflection = new \\ReflectionClass($this);\n\n        $datagridName = Str::snake($reflection->getShortName());\n\n        Event::dispatch(\"datagrid.{$datagridName}.{$eventName}\", $payload);\n    }\n\n    /**\n     * Prepare all the setup for datagrid.\n     */\n    protected function prepare(): void\n    {\n        $this->dispatchEvent('prepare.before', $this);\n\n        $this->prepareColumns();\n\n        $this->dispatchEvent('columns.prepare.after', $this);\n\n        $this->prepareActions();\n\n        $this->dispatchEvent('actions.prepare.after', $this);\n\n        $this->prepareMassActions();\n\n        $this->dispatchEvent('mass_actions.prepare.after', $this);\n\n        $this->setQueryBuilder();\n\n        $this->dispatchEvent('query_builder.prepare.after', $this);\n\n        $this->processRequest();\n\n        $this->dispatchEvent('prepare.after', $this);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Database/Migrations/2024_05_10_152848_create_saved_filters_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('datagrid_saved_filters', function (Blueprint $table) {\n            $table->id();\n            $table->integer('user_id')->unsigned();\n            $table->string('name');\n            $table->string('src');\n            $table->json('applied');\n            $table->timestamps();\n\n            $table->unique(['user_id', 'name', 'src']);\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::dropIfExists('datagrid_saved_filters');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Enums/ColumnTypeEnum.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\Enums;\n\nuse Webkul\\DataGrid\\ColumnTypes\\Aggregate;\nuse Webkul\\DataGrid\\ColumnTypes\\Boolean;\nuse Webkul\\DataGrid\\ColumnTypes\\Date;\nuse Webkul\\DataGrid\\ColumnTypes\\Datetime;\nuse Webkul\\DataGrid\\ColumnTypes\\Decimal;\nuse Webkul\\DataGrid\\ColumnTypes\\Integer;\nuse Webkul\\DataGrid\\ColumnTypes\\Text;\nuse Webkul\\DataGrid\\Exceptions\\InvalidColumnTypeException;\n\nenum ColumnTypeEnum: string\n{\n    /**\n     * String.\n     */\n    case STRING = 'string';\n\n    /**\n     * Integer.\n     */\n    case INTEGER = 'integer';\n\n    /**\n     * Float.\n     */\n    case FLOAT = 'float';\n\n    /**\n     * Boolean.\n     */\n    case BOOLEAN = 'boolean';\n\n    /**\n     * Date.\n     */\n    case DATE = 'date';\n\n    /**\n     * Date time.\n     */\n    case DATETIME = 'datetime';\n\n    /**\n     * Aggregate.\n     */\n    case AGGREGATE = 'aggregate';\n\n    /**\n     * Get the corresponding class name for the column type.\n     */\n    public static function getClassName(string $type): string\n    {\n        return match ($type) {\n            self::STRING->value => Text::class,\n            self::INTEGER->value => Integer::class,\n            self::FLOAT->value => Decimal::class,\n            self::BOOLEAN->value => Boolean::class,\n            self::DATE->value => Date::class,\n            self::DATETIME->value => Datetime::class,\n            self::AGGREGATE->value => Aggregate::class,\n            default => throw new InvalidColumnTypeException(\"Invalid column type: {$type}\"),\n        };\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Enums/DateRangeOptionEnum.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\Enums;\n\nenum DateRangeOptionEnum: string\n{\n    /**\n     * Today.\n     */\n    case TODAY = 'today';\n\n    /**\n     * Yesterday.\n     */\n    case YESTERDAY = 'yesterday';\n\n    /**\n     * This week.\n     */\n    case THIS_WEEK = 'this_week';\n\n    /**\n     * This month.\n     */\n    case THIS_MONTH = 'this_month';\n\n    /**\n     * Last month.\n     */\n    case LAST_MONTH = 'last_month';\n\n    /**\n     * Last three months.\n     */\n    case LAST_THREE_MONTHS = 'last_three_months';\n\n    /**\n     * Last six months.\n     */\n    case LAST_SIX_MONTHS = 'last_six_months';\n\n    /**\n     * This year.\n     */\n    case THIS_YEAR = 'this_year';\n\n    /**\n     * Get options.\n     */\n    public static function options(string $format = 'Y-m-d H:i:s'): array\n    {\n        return [\n            [\n                'name' => self::TODAY->value,\n                'label' => trans('admin::app.components.datagrid.filters.date-options.today'),\n                'from' => now()->today()->format($format),\n                'to' => now()->endOfDay()->format($format),\n            ],\n            [\n                'name' => self::YESTERDAY->value,\n                'label' => trans('admin::app.components.datagrid.filters.date-options.yesterday'),\n                'from' => now()->yesterday()->format($format),\n                'to' => now()->today()->subSecond(1)->format($format),\n            ],\n            [\n                'name' => self::THIS_WEEK->value,\n                'label' => trans('admin::app.components.datagrid.filters.date-options.this-week'),\n                'from' => now()->startOfWeek()->format($format),\n                'to' => now()->endOfWeek()->format($format),\n            ],\n            [\n                'name' => self::THIS_MONTH->value,\n                'label' => trans('admin::app.components.datagrid.filters.date-options.this-month'),\n                'from' => now()->startOfMonth()->format($format),\n                'to' => now()->endOfMonth()->format($format),\n            ],\n            [\n                'name' => self::LAST_MONTH->value,\n                'label' => trans('admin::app.components.datagrid.filters.date-options.last-month'),\n                'from' => now()->subMonth(1)->startOfMonth()->format($format),\n                'to' => now()->subMonth(1)->endOfMonth()->format($format),\n            ],\n            [\n                'name' => self::LAST_THREE_MONTHS->value,\n                'label' => trans('admin::app.components.datagrid.filters.date-options.last-three-months'),\n                'from' => now()->subMonth(3)->startOfMonth()->format($format),\n                'to' => now()->subMonth(1)->endOfMonth()->format($format),\n            ],\n            [\n                'name' => self::LAST_SIX_MONTHS->value,\n                'label' => trans('admin::app.components.datagrid.filters.date-options.last-six-months'),\n                'from' => now()->subMonth(6)->startOfMonth()->format($format),\n                'to' => now()->subMonth(1)->endOfMonth()->format($format),\n            ],\n            [\n                'name' => self::THIS_YEAR->value,\n                'label' => trans('admin::app.components.datagrid.filters.date-options.this-year'),\n                'from' => now()->startOfYear()->format($format),\n                'to' => now()->endOfYear()->format($format),\n            ],\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Enums/FilterTypeEnum.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\Enums;\n\nenum FilterTypeEnum: string\n{\n    /**\n     * Dropdown.\n     */\n    case DROPDOWN = 'dropdown';\n\n    /**\n     * Date range.\n     */\n    case DATE_RANGE = 'date_range';\n\n    /**\n     * Date time range.\n     */\n    case DATETIME_RANGE = 'datetime_range';\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Exceptions/InvalidColumnException.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\Exceptions;\n\nuse Exception;\n\nclass InvalidColumnException extends Exception {}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Exceptions/InvalidColumnTypeException.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\Exceptions;\n\nuse Exception;\n\nclass InvalidColumnTypeException extends Exception {}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Exceptions/InvalidDataGridException.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\Exceptions;\n\nuse Exception;\n\nclass InvalidDataGridException extends Exception {}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Exports/DataGridExport.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\Exports;\n\nuse Maatwebsite\\Excel\\Concerns\\FromQuery;\nuse Maatwebsite\\Excel\\Concerns\\ShouldAutoSize;\nuse Maatwebsite\\Excel\\Concerns\\WithHeadings;\nuse Maatwebsite\\Excel\\Concerns\\WithMapping;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass DataGridExport implements FromQuery, ShouldAutoSize, WithHeadings, WithMapping\n{\n    /**\n     * Create a new instance.\n     *\n     * @return void\n     */\n    public function __construct(protected DataGrid $datagrid) {}\n\n    /**\n     * Query.\n     */\n    public function query(): mixed\n    {\n        return $this->datagrid->getQueryBuilder();\n    }\n\n    /**\n     * Headings.\n     */\n    public function headings(): array\n    {\n        return collect($this->datagrid->getColumns())\n            ->filter(fn ($column) => $column->getExportable())\n            ->map(fn ($column) => $column->getLabel())\n            ->toArray();\n    }\n\n    /**\n     * Map each row for export.\n     */\n    public function map(mixed $record): array\n    {\n        return collect($this->datagrid->getColumns())\n            ->filter(fn ($column) => $column->getExportable())\n            ->map(function ($column) use ($record) {\n                $index = $column->getIndex();\n                $value = $record->{$index};\n\n                if (\n                    in_array($index, ['emails', 'contact_numbers'])\n                    && is_string($value)\n                ) {\n                    return $this->extractValuesFromJson($value);\n                }\n\n                return $value;\n            })\n            ->toArray();\n    }\n\n    /**\n     * Extract 'value' fields from a JSON string.\n     */\n    protected function extractValuesFromJson(string $json): string\n    {\n        $items = json_decode($json, true);\n\n        if (\n            json_last_error() === JSON_ERROR_NONE\n            && is_array($items)\n        ) {\n            return collect($items)->map(fn ($item) => \"{$item['value']} ({$item['label']})\")->implode(', ');\n        }\n\n        return $json;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Http/helpers.php",
    "content": "<?php\n\nuse Webkul\\DataGrid\\DataGrid;\nuse Webkul\\DataGrid\\Exceptions\\InvalidDataGridException;\n\nif (! function_exists('datagrid')) {\n    /**\n     * Datagrid helper.\n     */\n    function datagrid(string $datagridClass): DataGrid\n    {\n        if (! is_subclass_of($datagridClass, DataGrid::class)) {\n            throw new InvalidDataGridException(\"'{$datagridClass}' must extend the '\".DataGrid::class.\"' class.\");\n        }\n\n        return app($datagridClass);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/MassAction.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid;\n\n/**\n * Initial implementation of the mass action class. Stay tuned for more features coming soon.\n */\nclass MassAction\n{\n    /**\n     * Create a column instance.\n     */\n    public function __construct(\n        public string $icon,\n        public string $title,\n        public string $method,\n        public mixed $url,\n        public array $options = [],\n    ) {}\n\n    /**\n     * Convert to an array.\n     */\n    public function toArray()\n    {\n        return [\n            'icon' => $this->icon,\n            'title' => $this->title,\n            'method' => $this->method,\n            'url' => $this->url,\n            'options' => $this->options,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Models/SavedFilter.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\DataGrid\\Contracts\\SavedFilter as SavedFilterContract;\n\nclass SavedFilter extends Model implements SavedFilterContract\n{\n    use HasFactory;\n\n    /**\n     * Deinfine model table name.\n     *\n     * @var string\n     */\n    protected $table = 'datagrid_saved_filters';\n\n    /**\n     * Fillable property for the model.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'user_id',\n        'src',\n        'name',\n        'applied',\n    ];\n\n    /**\n     * The attributes that should be cast.\n     *\n     * @var array\n     */\n    protected $casts = [\n        'applied' => 'json',\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Models/SavedFilterProxy.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass SavedFilterProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Providers/DataGridServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\Providers;\n\nuse Illuminate\\Support\\ServiceProvider;\n\nclass DataGridServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap any application services.\n     */\n    public function boot(): void\n    {\n        include __DIR__.'/../Http/helpers.php';\n\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n    }\n\n    /**\n     * Register any application services.\n     */\n    public function register(): void {}\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\Providers;\n\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\nuse Webkul\\DataGrid\\Models\\SavedFilter;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    protected $models = [\n        SavedFilter::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/DataGrid/src/Repositories/SavedFilterRepository.php",
    "content": "<?php\n\nnamespace Webkul\\DataGrid\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\nuse Webkul\\DataGrid\\Contracts\\SavedFilter;\n\nclass SavedFilterRepository extends Repository\n{\n    /**\n     * Specify model class name.\n     */\n    public function model(): string\n    {\n        return SavedFilter::class;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Config/importers.php",
    "content": "<?php\n\nreturn [\n    'persons' => [\n        'title' => 'data_transfer::app.importers.persons.title',\n        'importer' => 'Webkul\\DataTransfer\\Helpers\\Importers\\Persons\\Importer',\n        'sample_path' => 'data-transfer/samples/persons.csv',\n    ],\n\n    'products' => [\n        'title' => 'data_transfer::app.importers.products.title',\n        'importer' => 'Webkul\\DataTransfer\\Helpers\\Importers\\Products\\Importer',\n        'sample_path' => 'data-transfer/samples/products.csv',\n    ],\n\n    'leads' => [\n        'title' => 'data_transfer::app.importers.leads.title',\n        'importer' => 'Webkul\\DataTransfer\\Helpers\\Importers\\Leads\\Importer',\n        'sample_path' => 'data-transfer/samples/leads.csv',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Contracts/Import.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Contracts;\n\ninterface Import {}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Contracts/ImportBatch.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Contracts;\n\ninterface ImportBatch {}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Database/Migrations/2024_01_11_154640_create_imports_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('imports', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('state')->default('pending');\n            $table->boolean('process_in_queue')->default(1);\n            $table->string('type');\n            $table->string('action');\n            $table->string('validation_strategy');\n            $table->integer('allowed_errors')->default(0);\n            $table->integer('processed_rows_count')->default(0);\n            $table->integer('invalid_rows_count')->default(0);\n            $table->integer('errors_count')->default(0);\n            $table->json('errors')->nullable();\n            $table->string('field_separator');\n            $table->string('file_path');\n            $table->string('error_file_path')->nullable();\n            $table->json('summary')->nullable();\n\n            $table->datetime('started_at')->nullable();\n            $table->datetime('completed_at')->nullable();\n\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::dropIfExists('imports');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Database/Migrations/2024_01_11_154741_create_import_batches_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('import_batches', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('state')->default('pending');\n            $table->json('data');\n            $table->json('summary')->nullable();\n            $table->integer('import_id')->unsigned();\n\n            $table->foreign('import_id')->references('id')->on('imports')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::dropIfExists('import_batches');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Helpers/Error.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Helpers;\n\nclass Error\n{\n    /**\n     * Error Items.\n     */\n    protected array $items = [];\n\n    /**\n     * Invalid rows.\n     */\n    protected array $invalidRows = [];\n\n    /**\n     * Skipped rows.\n     */\n    protected array $skippedRows = [];\n\n    /**\n     * Errors count.\n     */\n    protected int $errorsCount = 0;\n\n    /**\n     * Error message template.\n     */\n    protected array $messageTemplate = [];\n\n    /**\n     * Add error message template.\n     */\n    public function addErrorMessage(string $code, string $template): self\n    {\n        $this->messageTemplate[$code] = $template;\n\n        return $this;\n    }\n\n    /**\n     * Add error message.\n     */\n    public function addError(string $code, ?int $rowNumber = null, ?string $columnName = null, ?string $message = null): self\n    {\n        if ($this->isErrorAlreadyAdded($rowNumber, $code, $columnName)) {\n            return $this;\n        }\n\n        $this->addRowToInvalid($rowNumber);\n\n        $message = $this->getErrorMessage($code, $message, $columnName);\n\n        $this->items[$rowNumber][] = [\n            'code' => $code,\n            'column' => $columnName,\n            'message' => $message,\n        ];\n\n        $this->errorsCount++;\n\n        return $this;\n    }\n\n    /**\n     * Check if error is already added for the row, code and column.\n     */\n    public function isErrorAlreadyAdded(?int $rowNumber, string $code, ?string $columnName): bool\n    {\n        return collect($this->items[$rowNumber] ?? [])\n            ->where('code', $code)\n            ->where('column', $columnName)\n            ->isNotEmpty();\n    }\n\n    /**\n     * Add specific row to invalid list via row number.\n     */\n    protected function addRowToInvalid(?int $rowNumber): self\n    {\n        if (is_null($rowNumber)) {\n            return $this;\n        }\n\n        if (! in_array($rowNumber, $this->invalidRows)) {\n            $this->invalidRows[] = $rowNumber;\n        }\n\n        return $this;\n    }\n\n    /**\n     * Add specific row to invalid list via row number.\n     */\n    public function addRowToSkip(?int $rowNumber): self\n    {\n        if (is_null($rowNumber)) {\n            return $this;\n        }\n\n        if (! in_array($rowNumber, $this->skippedRows)) {\n            $this->skippedRows[] = $rowNumber;\n        }\n\n        return $this;\n    }\n\n    /**\n     * Check if row is invalid by row number.\n     */\n    public function isRowInvalid(int $rowNumber): bool\n    {\n        return in_array($rowNumber, array_merge($this->invalidRows, $this->skippedRows));\n    }\n\n    /**\n     * Build an error message via code, message and column name.\n     */\n    protected function getErrorMessage(?string $code, ?string $message, ?string $columnName): string\n    {\n        if (\n            empty($message)\n            && isset($this->messageTemplate[$code])\n        ) {\n            $message = (string) $this->messageTemplate[$code];\n        }\n\n        if (\n            $columnName\n            && $message\n        ) {\n            $message = sprintf($message, $columnName);\n        }\n\n        if (! $message) {\n            $message = $code;\n        }\n\n        return $message;\n    }\n\n    /**\n     * Get number of invalid rows.\n     */\n    public function getInvalidRowsCount(): int\n    {\n        return count($this->invalidRows);\n    }\n\n    /**\n     * Get current error count.\n     */\n    public function getErrorsCount(): int\n    {\n        return $this->errorsCount;\n    }\n\n    /**\n     * Get all errors from an import process.\n     */\n    public function getAllErrors(): array\n    {\n        return $this->items;\n    }\n\n    /**\n     * Return all errors grouped by code.\n     */\n    public function getAllErrorsGroupedByCode(): array\n    {\n        $errors = [];\n\n        foreach ($this->items as $rowNumber => $rowErrors) {\n            foreach ($rowErrors as $error) {\n                if ($rowNumber === '') {\n                    $errors[$error['code']][$error['message']] = null;\n                } else {\n                    $errors[$error['code']][$error['message']][] = $rowNumber;\n                }\n            }\n        }\n\n        return $errors;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Helpers/Import.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Helpers;\n\nuse Illuminate\\Support\\Arr;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Illuminate\\Support\\Str;\nuse PhpOffice\\PhpSpreadsheet\\Spreadsheet;\nuse PhpOffice\\PhpSpreadsheet\\Writer\\Csv;\nuse PhpOffice\\PhpSpreadsheet\\Writer\\Xls;\nuse PhpOffice\\PhpSpreadsheet\\Writer\\Xlsx;\nuse Webkul\\DataTransfer\\Contracts\\Import as ImportContract;\nuse Webkul\\DataTransfer\\Contracts\\ImportBatch as ImportBatchContract;\nuse Webkul\\DataTransfer\\Helpers\\Importers\\AbstractImporter;\nuse Webkul\\DataTransfer\\Helpers\\Sources\\AbstractSource;\nuse Webkul\\DataTransfer\\Helpers\\Sources\\CSV as CSVSource;\nuse Webkul\\DataTransfer\\Helpers\\Sources\\Excel as ExcelSource;\nuse Webkul\\DataTransfer\\Repositories\\ImportBatchRepository;\nuse Webkul\\DataTransfer\\Repositories\\ImportRepository;\n\nclass Import\n{\n    /**\n     * Import state for pending import.\n     */\n    public const STATE_PENDING = 'pending';\n\n    /**\n     * Import state for validated import.\n     */\n    public const STATE_VALIDATED = 'validated';\n\n    /**\n     * Import state for processing import.\n     */\n    public const STATE_PROCESSING = 'processing';\n\n    /**\n     * Import state for processed import.\n     */\n    public const STATE_PROCESSED = 'processed';\n\n    /**\n     * Import state for linking import.\n     */\n    public const STATE_LINKING = 'linking';\n\n    /**\n     * Import state for linked import.\n     */\n    public const STATE_LINKED = 'linked';\n\n    /**\n     * Import state for indexing import.\n     */\n    public const STATE_INDEXING = 'indexing';\n\n    /**\n     * Import state for indexed import.\n     */\n    public const STATE_INDEXED = 'indexed';\n\n    /**\n     * Import state for completed import.\n     */\n    public const STATE_COMPLETED = 'completed';\n\n    /**\n     * Validation strategy for skipping the error during the import process.\n     */\n    public const VALIDATION_STRATEGY_SKIP_ERRORS = 'skip-errors';\n\n    /**\n     * Validation strategy for stopping the import process on error.\n     */\n    public const VALIDATION_STRATEGY_STOP_ON_ERROR = 'stop-on-errors';\n\n    /**\n     * Action constant for updating/creating for the resource.\n     */\n    public const ACTION_APPEND = 'append';\n\n    /**\n     * Action constant for deleting the resource.\n     */\n    public const ACTION_DELETE = 'delete';\n\n    /**\n     * Import instance.\n     */\n    protected ImportContract $import;\n\n    /**\n     * Error helper instance.\n     *\n     * @var Error\n     */\n    protected $typeImporter;\n\n    /**\n     * Create a new helper instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected ImportRepository $importRepository,\n        protected ImportBatchRepository $importBatchRepository,\n        protected Error $errorHelper\n    ) {}\n\n    /**\n     * Set import instance.\n     */\n    public function setImport(ImportContract $import): self\n    {\n        $this->import = $import;\n\n        return $this;\n    }\n\n    /**\n     * Returns import instance.\n     */\n    public function getImport(): ImportContract\n    {\n        return $this->import;\n    }\n\n    /**\n     * Returns error helper instance.\n     *\n     * @return Error\n     */\n    public function getErrorHelper()\n    {\n        return $this->errorHelper;\n    }\n\n    /**\n     * Returns source helper instance.\n     */\n    public function getSource(): AbstractSource\n    {\n        if (Str::contains($this->import->file_path, '.csv')) {\n            $source = new CSVSource(\n                $this->import->file_path,\n                $this->import->field_separator,\n            );\n        } else {\n            $source = new ExcelSource(\n                $this->import->file_path,\n                $this->import->field_separator,\n            );\n        }\n\n        return $source;\n    }\n\n    /**\n     * Validates import and returns validation result.\n     */\n    public function validate(): bool\n    {\n        try {\n            $source = $this->getSource();\n\n            $typeImporter = $this->getTypeImporter()->setSource($source);\n\n            $typeImporter->validateData();\n        } catch (\\Exception $e) {\n            $this->errorHelper->addError(\n                AbstractImporter::ERROR_CODE_SYSTEM_EXCEPTION,\n                null,\n                null,\n                $e->getMessage()\n            );\n        }\n\n        $import = $this->importRepository->update([\n            'state' => self::STATE_VALIDATED,\n            'processed_rows_count' => $this->getProcessedRowsCount(),\n            'invalid_rows_count' => $this->errorHelper->getInvalidRowsCount(),\n            'errors_count' => $this->errorHelper->getErrorsCount(),\n            'errors' => $this->getFormattedErrors(),\n            'error_file_path' => $this->uploadErrorReport(),\n        ], $this->import->id);\n\n        $this->setImport($import);\n\n        return $this->isValid();\n    }\n\n    /**\n     * Starts import process.\n     */\n    public function isValid(): bool\n    {\n        if ($this->isErrorLimitExceeded()) {\n            return false;\n        }\n\n        if ($this->import->processed_rows_count <= $this->import->invalid_rows_count) {\n            return false;\n        }\n\n        return true;\n    }\n\n    /**\n     * Check if error limit has been exceeded.\n     */\n    public function isErrorLimitExceeded(): bool\n    {\n        if (\n            $this->import->validation_strategy == self::VALIDATION_STRATEGY_STOP_ON_ERROR\n            && $this->import->errors_count > $this->import->allowed_errors\n        ) {\n            return true;\n        }\n\n        return false;\n    }\n\n    /**\n     * Starts import process.\n     */\n    public function start(?ImportBatchContract $importBatch = null): bool\n    {\n        DB::beginTransaction();\n\n        try {\n            $typeImporter = $this->getTypeImporter();\n\n            $typeImporter->importData($importBatch);\n        } catch (\\Exception $e) {\n            /**\n             * Rollback transaction.\n             */\n            DB::rollBack();\n\n            throw $e;\n        } finally {\n            /**\n             * Commit transaction.\n             */\n            DB::commit();\n        }\n\n        return true;\n    }\n\n    /**\n     * Link import resources.\n     */\n    public function link(ImportBatchContract $importBatch): bool\n    {\n        DB::beginTransaction();\n\n        try {\n            $typeImporter = $this->getTypeImporter();\n\n            $typeImporter->linkData($importBatch);\n        } catch (\\Exception $e) {\n            /**\n             * Rollback transaction.\n             */\n            DB::rollBack();\n\n            throw $e;\n        } finally {\n            /**\n             * Commit transaction.\n             */\n            DB::commit();\n        }\n\n        return true;\n    }\n\n    /**\n     * Index import resources.\n     */\n    public function index(ImportBatchContract $importBatch): bool\n    {\n        DB::beginTransaction();\n\n        try {\n            $typeImporter = $this->getTypeImporter();\n\n            $typeImporter->indexData($importBatch);\n        } catch (\\Exception $e) {\n            /**\n             * Rollback transaction.\n             */\n            DB::rollBack();\n\n            throw $e;\n        } finally {\n            /**\n             * Commit transaction.\n             */\n            DB::commit();\n        }\n\n        return true;\n    }\n\n    /**\n     * Started the import process.\n     */\n    public function started(): void\n    {\n        $import = $this->importRepository->update([\n            'state' => self::STATE_PROCESSING,\n            'started_at' => now(),\n            'summary' => [],\n        ], $this->import->id);\n\n        $this->setImport($import);\n\n        Event::dispatch('data_transfer.imports.started', $import);\n    }\n\n    /**\n     * Started the import linking process.\n     */\n    public function linking(): void\n    {\n        $import = $this->importRepository->update([\n            'state' => self::STATE_LINKING,\n        ], $this->import->id);\n\n        $this->setImport($import);\n\n        Event::dispatch('data_transfer.imports.linking', $import);\n    }\n\n    /**\n     * Started the import indexing process.\n     */\n    public function indexing(): void\n    {\n        $import = $this->importRepository->update([\n            'state' => self::STATE_INDEXING,\n        ], $this->import->id);\n\n        $this->setImport($import);\n\n        Event::dispatch('data_transfer.imports.indexing', $import);\n    }\n\n    /**\n     * Start the import process.\n     */\n    public function completed(): void\n    {\n        $summary = $this->importBatchRepository\n            ->select(\n                DB::raw('SUM(json_unquote(json_extract(summary, \\'$.\"created\"\\'))) AS created'),\n                DB::raw('SUM(json_unquote(json_extract(summary, \\'$.\"updated\"\\'))) AS updated'),\n                DB::raw('SUM(json_unquote(json_extract(summary, \\'$.\"deleted\"\\'))) AS deleted'),\n            )\n            ->where('import_id', $this->import->id)\n            ->groupBy('import_id')\n            ->first()\n            ->toArray();\n\n        $import = $this->importRepository->update([\n            'state' => self::STATE_COMPLETED,\n            'summary' => $summary,\n            'completed_at' => now(),\n        ], $this->import->id);\n\n        $this->setImport($import);\n\n        Event::dispatch('data_transfer.imports.completed', $import);\n    }\n\n    /**\n     * Returns import stats.\n     */\n    public function stats(string $state): array\n    {\n        $total = $this->import->batches->count();\n\n        $completed = $this->import->batches->where('state', $state)->count();\n\n        $progress = $total\n            ? round($completed / $total * 100)\n            : 0;\n\n        $summary = $this->importBatchRepository\n            ->select(\n                DB::raw('SUM(json_unquote(json_extract(summary, \\'$.\"created\"\\'))) AS created'),\n                DB::raw('SUM(json_unquote(json_extract(summary, \\'$.\"updated\"\\'))) AS updated'),\n                DB::raw('SUM(json_unquote(json_extract(summary, \\'$.\"deleted\"\\'))) AS deleted'),\n            )\n            ->where('import_id', $this->import->id)\n            ->where('state', $state)\n            ->groupBy('import_id')\n            ->first()\n            ?->toArray();\n\n        return [\n            'batches' => [\n                'total' => $total,\n                'completed' => $completed,\n                'remaining' => $total - $completed,\n            ],\n            'progress' => $progress,\n            'summary' => $summary ?? [\n                'created' => 0,\n                'updated' => 0,\n                'deleted' => 0,\n            ],\n        ];\n    }\n\n    /**\n     * Return all error grouped by error code.\n     */\n    public function getFormattedErrors(): array\n    {\n        $errors = [];\n\n        foreach ($this->errorHelper->getAllErrorsGroupedByCode() as $groupedErrors) {\n            foreach ($groupedErrors as $errorMessage => $rowNumbers) {\n                if (! empty($rowNumbers)) {\n                    $errors[] = 'Row(s) '.implode(', ', $rowNumbers).': '.$errorMessage;\n                } else {\n                    $errors[] = $errorMessage;\n                }\n            }\n        }\n\n        return $errors;\n    }\n\n    /**\n     * Uploads error report and save the path to the database.\n     */\n    public function uploadErrorReport(): ?string\n    {\n        /**\n         * Return null if there are no errors.\n         */\n        if (! $this->errorHelper->getErrorsCount()) {\n            return null;\n        }\n\n        /**\n         * Return null if there are no invalid rows.\n         */\n        if (! $this->errorHelper->getInvalidRowsCount()) {\n            return null;\n        }\n\n        $errors = $this->errorHelper->getAllErrors();\n\n        $source = $this->getTypeImporter()->getSource();\n\n        $source->rewind();\n\n        $spreadsheet = new Spreadsheet;\n\n        $sheet = $spreadsheet->getActiveSheet();\n\n        /**\n         * Add headers with extra error column.\n         */\n        $sheet->fromArray(\n            [array_merge($source->getColumnNames(), [\n                'error',\n            ])],\n            null,\n            'A1'\n        );\n\n        $rowNumber = 2;\n\n        while ($source->valid()) {\n            try {\n                $rowData = $source->current();\n            } catch (\\InvalidArgumentException $e) {\n                $source->next();\n\n                continue;\n            }\n\n            $rowErrors = $errors[$source->getCurrentRowNumber()] ?? [];\n\n            if (! empty($rowErrors)) {\n                $rowErrors = Arr::pluck($rowErrors, 'message');\n            }\n\n            $rowData[] = implode('|', $rowErrors);\n\n            $sheet->fromArray([$rowData], null, 'A'.$rowNumber++);\n\n            $source->next();\n        }\n\n        $fileType = pathinfo($this->import->file_path, PATHINFO_EXTENSION);\n\n        switch ($fileType) {\n            case 'csv':\n                $writer = new Csv($spreadsheet);\n\n                $writer->setDelimiter($this->import->field_separator);\n\n                break;\n\n            case 'xls':\n                $writer = new Xls($spreadsheet);\n\n            case 'xlsx':\n                $writer = new Xlsx($spreadsheet);\n\n                break;\n\n            default:\n                throw new \\InvalidArgumentException(\"Unsupported file type: $fileType\");\n        }\n\n        $errorFilePath = 'imports/'.time().'-error-report.'.$fileType;\n\n        $writer->save(Storage::disk('public')->path($errorFilePath));\n\n        return $errorFilePath;\n    }\n\n    /**\n     * Validates source file and returns validation result.\n     */\n    public function getTypeImporter(): AbstractImporter\n    {\n        if (! $this->typeImporter) {\n            $importerConfig = config('importers.'.$this->import->type);\n\n            $this->typeImporter = app()->make($importerConfig['importer'])\n                ->setImport($this->import)\n                ->setErrorHelper($this->errorHelper);\n        }\n\n        return $this->typeImporter;\n    }\n\n    /**\n     * Returns number of checked rows.\n     */\n    public function getProcessedRowsCount(): int\n    {\n        return $this->getTypeImporter()->getProcessedRowsCount();\n    }\n\n    /**\n     * Is linking resource required for the import operation.\n     */\n    public function isLinkingRequired(): bool\n    {\n        return $this->getTypeImporter()->isLinkingRequired();\n    }\n\n    /**\n     * Is indexing resource required for the import operation.\n     */\n    public function isIndexingRequired(): bool\n    {\n        return $this->getTypeImporter()->isIndexingRequired();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Helpers/Importers/AbstractImporter.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Helpers\\Importers;\n\nuse Illuminate\\Support\\Facades\\Bus;\nuse Illuminate\\Support\\Facades\\Event;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Attribute\\Repositories\\AttributeValueRepository;\nuse Webkul\\Core\\Contracts\\Validations\\Decimal;\nuse Webkul\\DataTransfer\\Contracts\\Import as ImportContract;\nuse Webkul\\DataTransfer\\Contracts\\ImportBatch as ImportBatchContract;\nuse Webkul\\DataTransfer\\Helpers\\Error;\nuse Webkul\\DataTransfer\\Helpers\\Import;\nuse Webkul\\DataTransfer\\Helpers\\Source;\nuse Webkul\\DataTransfer\\Jobs\\Import\\Completed as CompletedJob;\nuse Webkul\\DataTransfer\\Jobs\\Import\\ImportBatch as ImportBatchJob;\nuse Webkul\\DataTransfer\\Jobs\\Import\\IndexBatch as IndexBatchJob;\nuse Webkul\\DataTransfer\\Jobs\\Import\\Indexing as IndexingJob;\nuse Webkul\\DataTransfer\\Jobs\\Import\\LinkBatch as LinkBatchJob;\nuse Webkul\\DataTransfer\\Jobs\\Import\\Linking as LinkingJob;\nuse Webkul\\DataTransfer\\Repositories\\ImportBatchRepository;\n\nabstract class AbstractImporter\n{\n    /**\n     * Error code for system exception.\n     */\n    public const ERROR_CODE_SYSTEM_EXCEPTION = 'system_exception';\n\n    /**\n     * Error code for column not found.\n     */\n    public const ERROR_CODE_COLUMN_NOT_FOUND = 'column_not_found';\n\n    /**\n     * Error code for column empty header.\n     */\n    public const ERROR_CODE_COLUMN_EMPTY_HEADER = 'column_empty_header';\n\n    /**\n     * Error code for column name invalid.\n     */\n    public const ERROR_CODE_COLUMN_NAME_INVALID = 'column_name_invalid';\n\n    /**\n     * Error code for invalid attribute.\n     */\n    public const ERROR_CODE_INVALID_ATTRIBUTE = 'invalid_attribute_name';\n\n    /**\n     * Error code for wrong quotes.\n     */\n    public const ERROR_CODE_WRONG_QUOTES = 'wrong_quotes';\n\n    /**\n     * Error code for wrong columns number.\n     */\n    public const ERROR_CODE_COLUMNS_NUMBER = 'wrong_columns_number';\n\n    /**\n     * Error message templates.\n     */\n    protected array $errorMessages = [\n        self::ERROR_CODE_SYSTEM_EXCEPTION => 'data_transfer::app.validation.errors.system',\n        self::ERROR_CODE_COLUMN_NOT_FOUND => 'data_transfer::app.validation.errors.column-not-found',\n        self::ERROR_CODE_COLUMN_EMPTY_HEADER => 'data_transfer::app.validation.errors.column-empty-headers',\n        self::ERROR_CODE_COLUMN_NAME_INVALID => 'data_transfer::app.validation.errors.column-name-invalid',\n        self::ERROR_CODE_INVALID_ATTRIBUTE => 'data_transfer::app.validation.errors.invalid-attribute',\n        self::ERROR_CODE_WRONG_QUOTES => 'data_transfer::app.validation.errors.wrong-quotes',\n        self::ERROR_CODE_COLUMNS_NUMBER => 'data_transfer::app.validation.errors.column-numbers',\n    ];\n\n    public const BATCH_SIZE = 100;\n\n    /**\n     * Is linking required.\n     */\n    protected bool $linkingRequired = false;\n\n    /**\n     * Is indexing required.\n     */\n    protected bool $indexingRequired = false;\n\n    /**\n     * Error helper instance.\n     *\n     * @var Error\n     */\n    protected $errorHelper;\n\n    /**\n     * Import instance.\n     */\n    protected ImportContract $import;\n\n    /**\n     * Source instance.\n     *\n     * @var Source\n     */\n    protected $source;\n\n    /**\n     * Valid column names.\n     */\n    protected array $validColumnNames = [];\n\n    /**\n     * Array of numbers of validated rows as keys and boolean TRUE as values.\n     */\n    protected array $validatedRows = [];\n\n    /**\n     * Number of rows processed by validation.\n     */\n    protected int $processedRowsCount = 0;\n\n    /**\n     * Number of created items.\n     */\n    protected int $createdItemsCount = 0;\n\n    /**\n     * Number of updated items.\n     */\n    protected int $updatedItemsCount = 0;\n\n    /**\n     * Number of deleted items.\n     */\n    protected int $deletedItemsCount = 0;\n\n    /**\n     * Create a new helper instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected ImportBatchRepository $importBatchRepository,\n        protected AttributeRepository $attributeRepository,\n        protected AttributeValueRepository $attributeValueRepository\n    ) {}\n\n    /**\n     * Validate data row.\n     */\n    abstract public function validateRow(array $rowData, int $rowNumber): bool;\n\n    /**\n     * Import data rows.\n     */\n    abstract public function importBatch(ImportBatchContract $importBatchContract): bool;\n\n    /**\n     * Initialize Product error messages.\n     */\n    protected function initErrorMessages(): void\n    {\n        foreach ($this->errorMessages as $errorCode => $message) {\n            $this->errorHelper->addErrorMessage($errorCode, trans($message));\n        }\n    }\n\n    /**\n     * Import instance.\n     */\n    public function setImport(ImportContract $import): self\n    {\n        $this->import = $import;\n\n        return $this;\n    }\n\n    /**\n     * Import instance.\n     *\n     * @param  Source  $errorHelper\n     */\n    public function setSource($source)\n    {\n        $this->source = $source;\n\n        return $this;\n    }\n\n    /**\n     * Import instance.\n     *\n     * @param  Error  $errorHelper\n     */\n    public function setErrorHelper($errorHelper): self\n    {\n        $this->errorHelper = $errorHelper;\n\n        $this->initErrorMessages();\n\n        return $this;\n    }\n\n    /**\n     * Import instance.\n     *\n     * @return Source\n     */\n    public function getSource()\n    {\n        return $this->source;\n    }\n\n    /**\n     * Retrieve valid column names.\n     */\n    public function getValidColumnNames(): array\n    {\n        return $this->validColumnNames;\n    }\n\n    /**\n     * Validate data.\n     */\n    public function validateData(): void\n    {\n        Event::dispatch('data_transfer.imports.validate.before', $this->import);\n\n        $errors = [];\n\n        $absentColumns = array_diff($this->permanentAttributes, $columns = $this->getSource()->getColumnNames());\n\n        if (! empty($absentColumns)) {\n            $errors[self::ERROR_CODE_COLUMN_NOT_FOUND] = $absentColumns;\n        }\n\n        foreach ($columns as $columnNumber => $columnName) {\n            if (empty($columnName)) {\n                $errors[self::ERROR_CODE_COLUMN_EMPTY_HEADER][] = $columnNumber + 1;\n            } elseif (! preg_match('/^[a-z][a-z0-9_]*$/', $columnName)) {\n                $errors[self::ERROR_CODE_COLUMN_NAME_INVALID][] = $columnName;\n            } elseif (! in_array($columnName, $this->getValidColumnNames())) {\n                $errors[self::ERROR_CODE_INVALID_ATTRIBUTE][] = $columnName;\n            }\n        }\n\n        /**\n         * Add Columns Errors.\n         */\n        foreach ($errors as $errorCode => $error) {\n            $this->addErrors($errorCode, $error);\n        }\n\n        if (! $this->errorHelper->getErrorsCount()) {\n            $this->saveValidatedBatches();\n        }\n\n        Event::dispatch('data_transfer.imports.validate.after', $this->import);\n    }\n\n    /**\n     * Save validated batches.\n     */\n    protected function saveValidatedBatches(): self\n    {\n        $source = $this->getSource();\n\n        $batchRows = [];\n\n        $source->rewind();\n\n        /**\n         * Clean previous saved batches.\n         */\n        $this->importBatchRepository->deleteWhere([\n            'import_id' => $this->import->id,\n        ]);\n\n        while (\n            $source->valid()\n            || count($batchRows)\n        ) {\n            if (\n                count($batchRows) == self::BATCH_SIZE\n                || ! $source->valid()\n            ) {\n                $this->importBatchRepository->create([\n                    'import_id' => $this->import->id,\n                    'data' => $batchRows,\n                ]);\n\n                $batchRows = [];\n            }\n\n            if ($source->valid()) {\n                $rowData = $source->current();\n\n                if ($this->validateRow($rowData, $source->getCurrentRowNumber())) {\n                    $batchRows[] = $this->prepareRowForDb($rowData);\n                }\n\n                $this->processedRowsCount++;\n\n                $source->next();\n            }\n        }\n\n        return $this;\n    }\n\n    /**\n     * Prepare validation rules.\n     */\n    public function getValidationRules(string $entityType, array $rowData): array\n    {\n        if (empty($entityType)) {\n            return [];\n        }\n\n        $rules = [];\n\n        $attributes = $this->attributeRepository->scopeQuery(fn ($query) => $query->whereIn('code', array_keys($rowData))->where('entity_type', $entityType))->get();\n\n        foreach ($attributes as $attribute) {\n            $validations = [];\n\n            if ($attribute->type == 'boolean') {\n                continue;\n            } elseif ($attribute->type == 'address') {\n                if (! $attribute->is_required) {\n                    continue;\n                }\n\n                $validations = [\n                    $attribute->code.'.address' => 'required',\n                    $attribute->code.'.country' => 'required',\n                    $attribute->code.'.state' => 'required',\n                    $attribute->code.'.city' => 'required',\n                    $attribute->code.'.postcode' => 'required',\n                ];\n            } elseif ($attribute->type == 'email') {\n                $validations = [\n                    $attribute->code => [$attribute->is_required ? 'required' : 'nullable'],\n                    $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable', 'email'],\n                    $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable',\n                ];\n            } elseif ($attribute->type == 'phone') {\n                $validations = [\n                    $attribute->code => [$attribute->is_required ? 'required' : 'nullable'],\n                    $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable'],\n                    $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable',\n                ];\n            } else {\n                $validations[$attribute->code] = [$attribute->is_required ? 'required' : 'nullable'];\n\n                if ($attribute->type == 'text' && $attribute->validation) {\n                    array_push($validations[$attribute->code],\n                        $attribute->validation == 'decimal'\n                        ? new Decimal\n                        : $attribute->validation\n                    );\n                }\n\n                if ($attribute->type == 'price') {\n                    array_push($validations[$attribute->code], new Decimal);\n                }\n            }\n\n            if ($attribute->is_unique) {\n                array_push($validations[in_array($attribute->type, ['email', 'phone'])\n                    ? $attribute->code.'.*.value'\n                    : $attribute->code\n                ], function ($field, $value, $fail) use ($attribute) {\n                    if (! $this->attributeValueRepository->isValueUnique(null, $attribute->entity_type, $attribute, $field)) {\n                        $fail(trans('data_transfer::app.validation.errors.already-exists', ['attribute' => $attribute->name]));\n                    }\n                });\n            }\n\n            $rules = [\n                ...$rules,\n                ...$validations,\n            ];\n        }\n\n        return $rules;\n    }\n\n    /**\n     * Start the import process.\n     */\n    public function importData(?ImportBatchContract $importBatch = null): bool\n    {\n        if ($importBatch) {\n            $this->importBatch($importBatch);\n\n            return true;\n        }\n\n        $typeBatches = [];\n\n        foreach ($this->import->batches as $batch) {\n            $typeBatches['import'][] = new ImportBatchJob($batch);\n\n            if ($this->isLinkingRequired()) {\n                $typeBatches['link'][] = new LinkBatchJob($batch);\n            }\n\n            if ($this->isIndexingRequired()) {\n                $typeBatches['index'][] = new IndexBatchJob($batch);\n            }\n        }\n\n        $chain[] = Bus::batch($typeBatches['import']);\n\n        if (! empty($typeBatches['link'])) {\n            $chain[] = new LinkingJob($this->import);\n\n            $chain[] = Bus::batch($typeBatches['link']);\n        }\n\n        if (! empty($typeBatches['index'])) {\n            $chain[] = new IndexingJob($this->import);\n\n            $chain[] = Bus::batch($typeBatches['index']);\n        }\n\n        $chain[] = new CompletedJob($this->import);\n\n        Bus::chain($chain)->dispatch();\n\n        return true;\n    }\n\n    /**\n     * Link resource data.\n     */\n    public function linkData(ImportBatchContract $importBatch): bool\n    {\n        $this->linkBatch($importBatch);\n\n        return true;\n    }\n\n    /**\n     * Index resource data.\n     */\n    public function indexData(ImportBatchContract $importBatch): bool\n    {\n        $this->indexBatch($importBatch);\n\n        return true;\n    }\n\n    /**\n     * Add errors to error aggregator.\n     */\n    protected function addErrors(string $code, mixed $errors): void\n    {\n        $this->errorHelper->addError(\n            $code,\n            null,\n            implode('\", \"', $errors)\n        );\n    }\n\n    /**\n     * Add row as skipped.\n     *\n     * @param  int|null  $rowNumber\n     * @param  string|null  $columnName\n     * @param  string|null  $errorMessage\n     * @return $this\n     */\n    protected function skipRow($rowNumber, string $errorCode, $columnName = null, $errorMessage = null): self\n    {\n        $this->errorHelper->addError(\n            $errorCode,\n            $rowNumber,\n            $columnName,\n            $errorMessage\n        );\n\n        $this->errorHelper->addRowToSkip($rowNumber);\n\n        return $this;\n    }\n\n    /**\n     * Prepare row data to save into the database.\n     */\n    protected function prepareRowForDb(array $rowData): array\n    {\n        $rowData = array_map(function ($value) {\n            return $value === '' ? null : $value;\n        }, $rowData);\n\n        return $rowData;\n    }\n\n    /**\n     * Returns number of checked rows.\n     */\n    public function getProcessedRowsCount(): int\n    {\n        return $this->processedRowsCount;\n    }\n\n    /**\n     * Returns number of created items count.\n     */\n    public function getCreatedItemsCount(): int\n    {\n        return $this->createdItemsCount;\n    }\n\n    /**\n     * Returns number of updated items count.\n     */\n    public function getUpdatedItemsCount(): int\n    {\n        return $this->updatedItemsCount;\n    }\n\n    /**\n     * Returns number of deleted items count.\n     */\n    public function getDeletedItemsCount(): int\n    {\n        return $this->deletedItemsCount;\n    }\n\n    /**\n     * Is linking resource required for the import operation.\n     */\n    public function isLinkingRequired(): bool\n    {\n        if ($this->import->action == Import::ACTION_DELETE) {\n            return false;\n        }\n\n        return $this->linkingRequired;\n    }\n\n    /**\n     * Is indexing resource required for the import operation.\n     */\n    public function isIndexingRequired(): bool\n    {\n        if ($this->import->action == Import::ACTION_DELETE) {\n            return false;\n        }\n\n        return $this->indexingRequired;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Importer.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Helpers\\Importers\\Leads;\n\nuse Illuminate\\Support\\Arr;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Validator;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Attribute\\Repositories\\AttributeValueRepository;\nuse Webkul\\Core\\Contracts\\Validations\\Decimal;\nuse Webkul\\DataTransfer\\Contracts\\ImportBatch as ImportBatchContract;\nuse Webkul\\DataTransfer\\Helpers\\Import;\nuse Webkul\\DataTransfer\\Helpers\\Importers\\AbstractImporter;\nuse Webkul\\DataTransfer\\Repositories\\ImportBatchRepository;\nuse Webkul\\Lead\\Repositories\\LeadRepository;\nuse Webkul\\Lead\\Repositories\\ProductRepository as LeadProductRepository;\n\nclass Importer extends AbstractImporter\n{\n    /**\n     * Error code for non existing id.\n     */\n    const ERROR_ID_NOT_FOUND_FOR_DELETE = 'id_not_found_to_delete';\n\n    /**\n     * Permanent entity columns.\n     */\n    protected array $validColumnNames = [\n        'id',\n        'title',\n        'description',\n        'lead_value',\n        'status',\n        'lost_reason',\n        'closed_at',\n        'user_id',\n        'person_id',\n        'lead_source_id',\n        'lead_type_id',\n        'lead_pipeline_id',\n        'lead_pipeline_stage_id',\n        'expected_close_date',\n        'product',\n    ];\n\n    /**\n     * Error message templates.\n     */\n    protected array $messages = [\n        self::ERROR_ID_NOT_FOUND_FOR_DELETE => 'data_transfer::app.importers.leads.validation.errors.id-not-found',\n    ];\n\n    /**\n     * Permanent entity columns.\n     *\n     * @var string[]\n     */\n    protected $permanentAttributes = ['title'];\n\n    /**\n     * Permanent entity column.\n     */\n    protected string $masterAttributeCode = 'id';\n\n    /**\n     * Is linking required\n     */\n    protected bool $linkingRequired = true;\n\n    /**\n     * Create a new helper instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected ImportBatchRepository $importBatchRepository,\n        protected LeadRepository $leadRepository,\n        protected LeadProductRepository $leadProductRepository,\n        protected AttributeRepository $attributeRepository,\n        protected AttributeValueRepository $attributeValueRepository,\n        protected Storage $leadsStorage,\n    ) {\n        parent::__construct(\n            $importBatchRepository,\n            $attributeRepository,\n            $attributeValueRepository,\n        );\n    }\n\n    /**\n     * Initialize leads error templates.\n     */\n    protected function initErrorMessages(): void\n    {\n        foreach ($this->messages as $errorCode => $message) {\n            $this->errorHelper->addErrorMessage($errorCode, trans($message));\n        }\n\n        parent::initErrorMessages();\n    }\n\n    /**\n     * Validate data.\n     */\n    public function validateData(): void\n    {\n        $this->leadsStorage->init();\n\n        parent::validateData();\n    }\n\n    /**\n     * Validates row.\n     */\n    public function validateRow(array $rowData, int $rowNumber): bool\n    {\n        /**\n         * If row is already validated than no need for further validation.\n         */\n        if (isset($this->validatedRows[$rowNumber])) {\n            return ! $this->errorHelper->isRowInvalid($rowNumber);\n        }\n\n        $this->validatedRows[$rowNumber] = true;\n\n        /**\n         * If import action is delete than no need for further validation.\n         */\n        if ($this->import->action == Import::ACTION_DELETE) {\n            if (! $this->isTitleExist($rowData['title'])) {\n                $this->skipRow($rowNumber, self::ERROR_ID_NOT_FOUND_FOR_DELETE, 'id');\n\n                return false;\n            }\n\n            return true;\n        }\n\n        if (! empty($rowData['product'])) {\n            $product = $this->parseProducts($rowData['product']);\n\n            $validator = Validator::make($product, [\n                'id' => 'required|exists:products,id',\n                'price' => 'required',\n                'quantity' => 'required',\n            ]);\n\n            if ($validator->fails()) {\n                $failedAttributes = $validator->failed();\n\n                foreach ($validator->errors()->getMessages() as $attributeCode => $message) {\n                    $errorCode = array_key_first($failedAttributes[$attributeCode] ?? []);\n\n                    $this->skipRow($rowNumber, $errorCode, $attributeCode, current($message));\n                }\n            }\n        }\n\n        /**\n         * Validate leads attributes.\n         */\n        $validator = Validator::make($rowData, [\n            ...$this->getValidationRules('leads|persons', $rowData),\n            'id' => 'numeric',\n            'status' => 'sometimes|required|in:0,1',\n            'user_id' => 'required|exists:users,id',\n            'person_id' => 'required|exists:persons,id',\n            'lead_source_id' => 'required|exists:lead_sources,id',\n            'lead_type_id' => 'required|exists:lead_types,id',\n            'lead_pipeline_id' => 'required|exists:lead_pipelines,id',\n            'lead_pipeline_stage_id' => 'required|exists:lead_pipeline_stages,id',\n        ]);\n\n        if ($validator->fails()) {\n            $failedAttributes = $validator->failed();\n\n            foreach ($validator->errors()->getMessages() as $attributeCode => $message) {\n                $errorCode = array_key_first($failedAttributes[$attributeCode] ?? []);\n\n                $this->skipRow($rowNumber, $errorCode, $attributeCode, current($message));\n            }\n        }\n\n        return ! $this->errorHelper->isRowInvalid($rowNumber);\n    }\n\n    /**\n     * Prepare row data for lead product.\n     */\n    protected function parseProducts(?string $products): array\n    {\n        $productData = [];\n\n        $productArray = explode(',', $products);\n\n        foreach ($productArray as $product) {\n            if (empty($product)) {\n                continue;\n            }\n\n            [$key, $value] = explode('=', $product);\n\n            $productData[$key] = $value;\n        }\n\n        if (\n            isset($productData['price'])\n            && isset($productData['quantity'])\n        ) {\n            $productData['amount'] = $productData['price'] * $productData['quantity'];\n        }\n\n        return $productData;\n    }\n\n    /**\n     * Get validation rules.\n     */\n    public function getValidationRules(string $entityTypes, array $rowData): array\n    {\n        $rules = [];\n\n        foreach (explode('|', $entityTypes) as $entityType) {\n            $attributes = $this->attributeRepository->scopeQuery(fn ($query) => $query->whereIn('code', array_keys($rowData))->where('entity_type', $entityType))->get();\n\n            foreach ($attributes as $attribute) {\n                if ($entityType == 'persons') {\n                    $attribute->code = 'person.'.$attribute->code;\n                }\n\n                $validations = [];\n\n                if ($attribute->type == 'boolean') {\n                    continue;\n                } elseif ($attribute->type == 'address') {\n                    if (! $attribute->is_required) {\n                        continue;\n                    }\n\n                    $validations = [\n                        $attribute->code.'.address' => 'required',\n                        $attribute->code.'.country' => 'required',\n                        $attribute->code.'.state' => 'required',\n                        $attribute->code.'.city' => 'required',\n                        $attribute->code.'.postcode' => 'required',\n                    ];\n                } elseif ($attribute->type == 'email') {\n                    $validations = [\n                        $attribute->code => [$attribute->is_required ? 'required' : 'nullable'],\n                        $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable', 'email'],\n                        $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable',\n                    ];\n                } elseif ($attribute->type == 'phone') {\n                    $validations = [\n                        $attribute->code => [$attribute->is_required ? 'required' : 'nullable'],\n                        $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable'],\n                        $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable',\n                    ];\n                } else {\n                    $validations[$attribute->code] = [$attribute->is_required ? 'required' : 'nullable'];\n\n                    if ($attribute->type == 'text' && $attribute->validation) {\n                        array_push($validations[$attribute->code],\n                            $attribute->validation == 'decimal'\n                            ? new Decimal\n                            : $attribute->validation\n                        );\n                    }\n\n                    if ($attribute->type == 'price') {\n                        array_push($validations[$attribute->code], new Decimal);\n                    }\n                }\n\n                if ($attribute->is_unique) {\n                    array_push($validations[in_array($attribute->type, ['email', 'phone'])\n                        ? $attribute->code.'.*.value'\n                        : $attribute->code\n                    ], function ($field, $value, $fail) use ($attribute) {\n                        if (! $this->attributeValueRepository->isValueUnique(\n                            null,\n                            $attribute->entity_type,\n                            $attribute,\n                            request($field)\n                        )\n                        ) {\n                            $fail(trans('data_transfer::app.validation.errors.already-exists', ['attribute' => $attribute->name]));\n                        }\n                    });\n                }\n\n                $rules = [\n                    ...$rules,\n                    ...$validations,\n                ];\n            }\n        }\n\n        return $rules;\n    }\n\n    /**\n     * Start the import process.\n     */\n    public function importBatch(ImportBatchContract $batch): bool\n    {\n        Event::dispatch('data_transfer.imports.batch.import.before', $batch);\n\n        if ($batch->import->action == Import::ACTION_DELETE) {\n            $this->deleteLeads($batch);\n        } else {\n            $this->saveLeads($batch);\n        }\n\n        /**\n         * Update import batch summary.\n         */\n        $batch = $this->importBatchRepository->update([\n            'state' => Import::STATE_PROCESSED,\n\n            'summary' => [\n                'created' => $this->getCreatedItemsCount(),\n                'updated' => $this->getUpdatedItemsCount(),\n                'deleted' => $this->getDeletedItemsCount(),\n            ],\n        ], $batch->id);\n\n        Event::dispatch('data_transfer.imports.batch.import.after', $batch);\n\n        return true;\n    }\n\n    /**\n     * Start the products linking process\n     */\n    public function linkBatch(ImportBatchContract $batch): bool\n    {\n        Event::dispatch('data_transfer.imports.batch.linking.before', $batch);\n\n        /**\n         * Load leads storage with batch ids.\n         */\n        $this->leadsStorage->load(Arr::pluck($batch->data, 'title'));\n\n        $products = [];\n\n        foreach ($batch->data as $rowData) {\n            /**\n             * Prepare products.\n             */\n            $this->prepareProducts($rowData, $products);\n        }\n\n        $this->saveProducts($products);\n\n        /**\n         * Update import batch summary\n         */\n        $this->importBatchRepository->update([\n            'state' => Import::STATE_LINKED,\n        ], $batch->id);\n\n        Event::dispatch('data_transfer.imports.batch.linking.after', $batch);\n\n        return true;\n    }\n\n    /**\n     * Prepare products.\n     */\n    public function prepareProducts($rowData, &$product): void\n    {\n        if (! empty($rowData['product'])) {\n            $product[$rowData['title']] = $this->parseProducts($rowData['product']);\n        }\n    }\n\n    /**\n     * Save products.\n     */\n    public function saveProducts(array $products): void\n    {\n        $leadProducts = [];\n\n        foreach ($products as $title => $product) {\n            $lead = $this->leadsStorage->get($title);\n\n            $leadProducts['insert'][] = [\n                'lead_id' => $lead['id'],\n                'product_id' => $product['id'],\n                'price' => $product['price'],\n                'quantity' => $product['quantity'],\n                'amount' => $product['amount'],\n            ];\n        }\n\n        foreach ($leadProducts['insert'] as $key => $leadProduct) {\n            $this->leadProductRepository->deleteWhere([\n                'lead_id' => $leadProduct['lead_id'],\n                'product_id' => $leadProduct['product_id'],\n            ]);\n        }\n\n        $this->leadProductRepository->upsert($leadProducts['insert'], ['lead_id', 'product_id']);\n    }\n\n    /**\n     * Delete leads from current batch.\n     */\n    protected function deleteLeads(ImportBatchContract $batch): bool\n    {\n        /**\n         * Load leads storage with batch ids.\n         */\n        $this->leadsStorage->load(Arr::pluck($batch->data, 'title'));\n\n        $idsToDelete = [];\n\n        foreach ($batch->data as $rowData) {\n            if (! $this->isTitleExist($rowData['title'])) {\n                continue;\n            }\n\n            $idsToDelete[] = $this->leadsStorage->get($rowData['title']);\n        }\n\n        $idsToDelete = array_unique($idsToDelete);\n\n        $this->deletedItemsCount = count($idsToDelete);\n\n        $this->leadRepository->deleteWhere([['id', 'IN', $idsToDelete]]);\n\n        return true;\n    }\n\n    /**\n     * Save leads from current batch.\n     */\n    protected function saveLeads(ImportBatchContract $batch): bool\n    {\n        /**\n         * Load lead storage with batch unique title.\n         */\n        $this->leadsStorage->load(Arr::pluck($batch->data, 'title'));\n\n        $leads = [];\n\n        /**\n         * Prepare leads for import.\n         */\n        foreach ($batch->data as $rowData) {\n            if (isset($rowData['id'])) {\n                $leads['update'][$rowData['id']] = Arr::except($rowData, ['product']);\n            } else {\n                $leads['insert'][$rowData['title']] = [\n                    ...Arr::except($rowData, ['id', 'product']),\n                    'created_at' => $rowData['created_at'] ?? now(),\n                    'updated_at' => $rowData['updated_at'] ?? now(),\n                ];\n            }\n        }\n\n        if (! empty($leads['update'])) {\n            $this->updatedItemsCount += count($leads['update']);\n\n            $this->leadRepository->upsert(\n                $leads['update'],\n                $this->masterAttributeCode\n            );\n        }\n\n        if (! empty($leads['insert'])) {\n            $this->createdItemsCount += count($leads['insert']);\n\n            $this->leadRepository->insert($leads['insert']);\n\n            /**\n             * Update the sku storage with newly created products\n             */\n            $newLeads = $this->leadRepository->findWhereIn(\n                'title',\n                array_keys($leads['insert']),\n                [\n                    'id',\n                    'title',\n                ]\n            );\n\n            foreach ($newLeads as $lead) {\n                $this->leadsStorage->set($lead->title, [\n                    'id' => $lead->id,\n                    'title' => $lead->title,\n                ]);\n            }\n        }\n\n        return true;\n    }\n\n    /**\n     * Check if title exists.\n     */\n    public function isTitleExist(string $title): bool\n    {\n        return $this->leadsStorage->has($title);\n    }\n\n    /**\n     * Prepare row data to save into the database.\n     */\n    protected function prepareRowForDb(array $rowData): array\n    {\n        return parent::prepareRowForDb($rowData);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Helpers/Importers/Leads/Storage.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Helpers\\Importers\\Leads;\n\nuse Webkul\\Lead\\Repositories\\LeadRepository;\n\nclass Storage\n{\n    /**\n     * Items contains identifier as key and product information as value.\n     */\n    protected array $items = [];\n\n    /**\n     * Columns which will be selected from database.\n     */\n    protected array $selectColumns = ['id', 'title'];\n\n    /**\n     * Create a new helper instance.\n     *\n     * @return void\n     */\n    public function __construct(protected LeadRepository $leadRepository) {}\n\n    /**\n     * Initialize storage.\n     */\n    public function init(): void\n    {\n        $this->items = [];\n\n        $this->load();\n    }\n\n    /**\n     * Load the leads.\n     */\n    public function load(array $titles = []): void\n    {\n        if (empty($titles)) {\n            $leads = $this->leadRepository->all($this->selectColumns);\n        } else {\n            $leads = $this->leadRepository->findWhereIn('title', $titles, $this->selectColumns);\n        }\n\n        foreach ($leads as $lead) {\n            $this->set($lead->title, [\n                'id' => $lead->id,\n                'title' => $lead->title,\n            ]);\n        }\n    }\n\n    /**\n     * Get Ids and Unique Id.\n     */\n    public function set(string $title, array $data): self\n    {\n        $this->items[$title] = $data;\n\n        return $this;\n    }\n\n    /**\n     * Check if unique id exists.\n     */\n    public function has(string $title): bool\n    {\n        return isset($this->items[$title]);\n    }\n\n    /**\n     * Get unique id information.\n     */\n    public function get(string $title): ?array\n    {\n        if (! $this->has($title)) {\n            return null;\n        }\n\n        return $this->items[$title];\n    }\n\n    public function getItems(): array\n    {\n        return $this->items;\n    }\n\n    /**\n     * Is storage is empty.\n     */\n    public function isEmpty(): bool\n    {\n        return empty($this->items);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Importer.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Helpers\\Importers\\Persons;\n\nuse Illuminate\\Support\\Arr;\nuse Illuminate\\Support\\Collection;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Validator;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Attribute\\Repositories\\AttributeValueRepository;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\nuse Webkul\\DataTransfer\\Contracts\\ImportBatch as ImportBatchContract;\nuse Webkul\\DataTransfer\\Helpers\\Import;\nuse Webkul\\DataTransfer\\Helpers\\Importers\\AbstractImporter;\nuse Webkul\\DataTransfer\\Repositories\\ImportBatchRepository;\n\nclass Importer extends AbstractImporter\n{\n    /**\n     * Error code for non existing email.\n     */\n    const ERROR_EMAIL_NOT_FOUND_FOR_DELETE = 'email_not_found_to_delete';\n\n    /**\n     * Error code for duplicated email.\n     */\n    const ERROR_DUPLICATE_EMAIL = 'duplicated_email';\n\n    /**\n     * Error code for duplicated phone.\n     */\n    const ERROR_DUPLICATE_PHONE = 'duplicated_phone';\n\n    /**\n     * Permanent entity columns.\n     */\n    protected array $validColumnNames = [\n        'contact_numbers',\n        'emails',\n        'job_title',\n        'name',\n        'organization_id',\n        'user_id',\n    ];\n\n    /**\n     * Error message templates.\n     */\n    protected array $messages = [\n        self::ERROR_EMAIL_NOT_FOUND_FOR_DELETE => 'data_transfer::app.importers.persons.validation.errors.email-not-found',\n        self::ERROR_DUPLICATE_EMAIL => 'data_transfer::app.importers.persons.validation.errors.duplicate-email',\n        self::ERROR_DUPLICATE_PHONE => 'data_transfer::app.importers.persons.validation.errors.duplicate-phone',\n    ];\n\n    /**\n     * Permanent entity columns.\n     *\n     * @var string[]\n     */\n    protected $permanentAttributes = ['emails'];\n\n    /**\n     * Permanent entity column.\n     */\n    protected string $masterAttributeCode = 'unique_id';\n\n    /**\n     * Emails storage.\n     */\n    protected array $emails = [];\n\n    /**\n     * Phones storage.\n     */\n    protected array $phones = [];\n\n    /**\n     * Create a new helper instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected ImportBatchRepository $importBatchRepository,\n        protected PersonRepository $personRepository,\n        protected AttributeRepository $attributeRepository,\n        protected AttributeValueRepository $attributeValueRepository,\n        protected Storage $personStorage,\n    ) {\n        parent::__construct(\n            $importBatchRepository,\n            $attributeRepository,\n            $attributeValueRepository,\n        );\n    }\n\n    /**\n     * Initialize Product error templates.\n     */\n    protected function initErrorMessages(): void\n    {\n        foreach ($this->messages as $errorCode => $message) {\n            $this->errorHelper->addErrorMessage($errorCode, trans($message));\n        }\n\n        parent::initErrorMessages();\n    }\n\n    /**\n     * Validate data.\n     */\n    public function validateData(): void\n    {\n        $this->personStorage->init();\n\n        parent::validateData();\n    }\n\n    /**\n     * Validates row.\n     */\n    public function validateRow(array $rowData, int $rowNumber): bool\n    {\n        $rowData = $this->parsedRowData($rowData);\n\n        /**\n         * If row is already validated than no need for further validation.\n         */\n        if (isset($this->validatedRows[$rowNumber])) {\n            return ! $this->errorHelper->isRowInvalid($rowNumber);\n        }\n\n        $this->validatedRows[$rowNumber] = true;\n\n        /**\n         * If import action is delete than no need for further validation.\n         */\n        if ($this->import->action == Import::ACTION_DELETE) {\n            foreach ($rowData['emails'] as $email) {\n                if (! $this->isEmailExist($email['value'])) {\n                    $this->skipRow($rowNumber, self::ERROR_EMAIL_NOT_FOUND_FOR_DELETE, 'email');\n\n                    return false;\n                }\n\n                return true;\n            }\n        }\n\n        /**\n         * Validate row data.\n         */\n        $validator = Validator::make($rowData, [\n            ...$this->getValidationRules('persons', $rowData),\n            'organization_id' => 'required|exists:organizations,id',\n            'user_id' => 'required|exists:users,id',\n            'contact_numbers' => 'required|array',\n            'contact_numbers.*.value' => 'required|numeric',\n            'contact_numbers.*.label' => 'required|in:home,work',\n            'emails' => 'required|array',\n            'emails.*.value' => 'required|email',\n            'emails.*.label' => 'required|in:home,work',\n        ]);\n\n        if ($validator->fails()) {\n            $failedAttributes = $validator->failed();\n\n            foreach ($validator->errors()->getMessages() as $attributeCode => $message) {\n                $errorCode = array_key_first($failedAttributes[$attributeCode] ?? []);\n\n                $this->skipRow($rowNumber, $errorCode, $attributeCode, current($message));\n            }\n        }\n\n        /**\n         * Check if email is unique.\n         */\n        if (! empty($emails = $rowData['emails'])) {\n            foreach ($emails as $email) {\n                if (! in_array($email['value'], $this->emails)) {\n                    $this->emails[] = $email['value'];\n                } else {\n                    $message = sprintf(\n                        trans($this->messages[self::ERROR_DUPLICATE_EMAIL]),\n                        $email['value']\n                    );\n\n                    $this->skipRow($rowNumber, self::ERROR_DUPLICATE_EMAIL, 'email', $message);\n                }\n            }\n        }\n\n        /**\n         * Check if phone(s) are unique.\n         */\n        if (! empty($rowData['contact_numbers'])) {\n            foreach ($rowData['contact_numbers'] as $phone) {\n                if (! in_array($phone['value'], $this->phones)) {\n                    if (! empty($phone['value'])) {\n                        $this->phones[] = $phone['value'];\n                    }\n                } else {\n                    $message = sprintf(\n                        trans($this->messages[self::ERROR_DUPLICATE_PHONE]),\n                        $phone['value']\n                    );\n\n                    $this->skipRow($rowNumber, self::ERROR_DUPLICATE_PHONE, 'phone', $message);\n                }\n            }\n        }\n\n        return ! $this->errorHelper->isRowInvalid($rowNumber);\n    }\n\n    /**\n     * Start the import process.\n     */\n    public function importBatch(ImportBatchContract $batch): bool\n    {\n        Event::dispatch('data_transfer.imports.batch.import.before', $batch);\n\n        if ($batch->import->action == Import::ACTION_DELETE) {\n            $this->deletePersons($batch);\n        } else {\n            $this->savePersonData($batch);\n        }\n\n        /**\n         * Update import batch summary.\n         */\n        $batch = $this->importBatchRepository->update([\n            'state' => Import::STATE_PROCESSED,\n\n            'summary' => [\n                'created' => $this->getCreatedItemsCount(),\n                'updated' => $this->getUpdatedItemsCount(),\n                'deleted' => $this->getDeletedItemsCount(),\n            ],\n        ], $batch->id);\n\n        Event::dispatch('data_transfer.imports.batch.import.after', $batch);\n\n        return true;\n    }\n\n    /**\n     * Delete persons from current batch.\n     */\n    protected function deletePersons(ImportBatchContract $batch): bool\n    {\n        /**\n         * Load person storage with batch emails.\n         */\n        $emails = collect(Arr::pluck($batch->data, 'emails'))\n            ->map(function ($emails) {\n                $emails = json_decode($emails, true);\n\n                foreach ($emails as $email) {\n                    return $email['value'];\n                }\n            });\n\n        $this->personStorage->load($emails->toArray());\n\n        $idsToDelete = [];\n\n        foreach ($batch->data as $rowData) {\n            $rowData = $this->parsedRowData($rowData);\n\n            foreach ($rowData['emails'] as $email) {\n                if (! $this->isEmailExist($email['value'])) {\n                    continue;\n                }\n\n                $idsToDelete[] = $this->personStorage->get($email['value']);\n            }\n        }\n\n        $idsToDelete = array_unique($idsToDelete);\n\n        $this->deletedItemsCount = count($idsToDelete);\n\n        $this->personRepository->deleteWhere([['id', 'IN', $idsToDelete]]);\n\n        return true;\n    }\n\n    /**\n     * Save person from current batch.\n     */\n    protected function savePersonData(ImportBatchContract $batch): bool\n    {\n        /**\n         * Load person storage with batch email.\n         */\n        $emails = collect(Arr::pluck($batch->data, 'emails'))\n            ->map(function ($emails) {\n                $emails = json_decode($emails, true);\n\n                foreach ($emails as $email) {\n                    return $email['value'];\n                }\n            });\n\n        $this->personStorage->load($emails->toArray());\n\n        $persons = [];\n\n        $attributeValues = [];\n\n        /**\n         * Prepare persons for import.\n         */\n        foreach ($batch->data as $rowData) {\n            $this->preparePersons($rowData, $persons);\n\n            $this->prepareAttributeValues($rowData, $attributeValues);\n        }\n\n        $this->savePersons($persons);\n\n        $this->saveAttributeValues($attributeValues);\n\n        return true;\n    }\n\n    /**\n     * Prepare persons from current batch.\n     */\n    public function preparePersons(array $rowData, array &$persons): void\n    {\n        $emails = $this->prepareEmail($rowData['emails']);\n\n        foreach ($emails as $email) {\n            $contactNumber = json_decode($rowData['contact_numbers'], true);\n\n            $rowData['unique_id'] = \"{$rowData['user_id']}|{$rowData['organization_id']}|{$email}|{$contactNumber[0]['value']}\";\n\n            if ($this->isEmailExist($email)) {\n                $persons['update'][$email] = $rowData;\n            } else {\n                $persons['insert'][$email] = [\n                    ...$rowData,\n                    'created_at' => $rowData['created_at'] ?? now(),\n                    'updated_at' => $rowData['updated_at'] ?? now(),\n                ];\n            }\n        }\n    }\n\n    /**\n     * Save persons from current batch.\n     */\n    public function savePersons(array $persons): void\n    {\n        if (! empty($persons['update'])) {\n            $this->updatedItemsCount += count($persons['update']);\n\n            $this->personRepository->upsert(\n                $persons['update'],\n                $this->masterAttributeCode,\n            );\n        }\n\n        if (! empty($persons['insert'])) {\n            $this->createdItemsCount += count($persons['insert']);\n\n            $this->personRepository->insert($persons['insert']);\n\n            /**\n             * Update the sku storage with newly created products\n             */\n            $emails = array_keys($persons['insert']);\n\n            $newPersons = $this->personRepository->where(function ($query) use ($emails) {\n                foreach ($emails as $email) {\n                    $query->orWhereJsonContains('emails', [['value' => $email]]);\n                }\n            })->get();\n\n            foreach ($newPersons as $person) {\n                $this->personStorage->set($person->emails[0]['value'], $person->id);\n            }\n        }\n    }\n\n    /**\n     * Save attribute values for the person.\n     */\n    public function saveAttributeValues(array $attributeValues): void\n    {\n        $personAttributeValues = [];\n\n        foreach ($attributeValues as $email => $attributeValue) {\n            foreach ($attributeValue as $attribute) {\n                $attribute['entity_id'] = (int) $this->personStorage->get($email);\n\n                $attribute['unique_id'] = implode('|', array_filter([\n                    $attribute['entity_id'],\n                    $attribute['attribute_id'],\n                ]));\n\n                $attribute['entity_type'] = 'persons';\n\n                $personAttributeValues[$attribute['unique_id']] = $attribute;\n            }\n        }\n\n        $this->attributeValueRepository->upsert($personAttributeValues, 'unique_id');\n    }\n\n    /**\n     * Check if email exists.\n     */\n    public function isEmailExist(string $email): bool\n    {\n        return $this->personStorage->has($email);\n    }\n\n    /**\n     * Prepare attribute values for the person.\n     */\n    public function prepareAttributeValues(array $rowData, array &$attributeValues): void\n    {\n        foreach ($rowData as $code => $value) {\n            if (is_null($value)) {\n                continue;\n            }\n\n            $where = ['code' => $code];\n\n            if ($code === 'name') {\n                $where['entity_type'] = 'persons';\n            }\n\n            $attribute = $this->attributeRepository->findOneWhere($where);\n\n            if (! $attribute) {\n                continue;\n            }\n\n            $typeFields = $this->personRepository->getModel()::$attributeTypeFields;\n\n            $attributeTypeValues = array_fill_keys(array_values($typeFields), null);\n\n            $emails = $this->prepareEmail($rowData['emails']);\n\n            foreach ($emails as $email) {\n                $attributeValues[$email][] = array_merge($attributeTypeValues, [\n                    'attribute_id' => $attribute->id,\n                    $typeFields[$attribute->type] => $value,\n                ]);\n            }\n        }\n    }\n\n    /**\n     * Get parsed email and phone.\n     */\n    private function parsedRowData(array $rowData): array\n    {\n        $rowData['emails'] = json_decode($rowData['emails'], true);\n\n        $rowData['contact_numbers'] = json_decode($rowData['contact_numbers'], true);\n\n        return $rowData;\n    }\n\n    /**\n     * Prepare email from row data.\n     */\n    private function prepareEmail(array|string $emails): Collection\n    {\n        static $cache = [];\n\n        return collect($emails)\n            ->map(function ($emailString) use (&$cache) {\n                if (isset($cache[$emailString])) {\n                    return $cache[$emailString];\n                }\n\n                $decoded = json_decode($emailString, true);\n\n                $emailValue = is_array($decoded)\n                    && isset($decoded[0]['value'])\n                    ? $decoded[0]['value']\n                    : null;\n\n                return $cache[$emailString] = $emailValue;\n            });\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Helpers/Importers/Persons/Storage.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Helpers\\Importers\\Persons;\n\nuse Webkul\\Contact\\Repositories\\PersonRepository;\n\nclass Storage\n{\n    /**\n     * Items contains email as key and product information as value.\n     */\n    protected array $items = [];\n\n    /**\n     * Columns which will be selected from database.\n     */\n    protected array $selectColumns = [\n        'id',\n        'emails',\n    ];\n\n    /**\n     * Create a new helper instance.\n     *\n     * @return void\n     */\n    public function __construct(protected PersonRepository $personRepository) {}\n\n    /**\n     * Initialize storage.\n     */\n    public function init(): void\n    {\n        $this->items = [];\n\n        $this->load();\n    }\n\n    /**\n     * Load the Emails.\n     */\n    public function load(array $emails = []): void\n    {\n        if (empty($emails)) {\n            $persons = $this->personRepository->all($this->selectColumns);\n        } else {\n            $persons = $this->personRepository->scopeQuery(function ($query) use ($emails) {\n                return $query->where(function ($subQuery) use ($emails) {\n                    foreach ($emails as $email) {\n                        $subQuery->orWhereJsonContains('emails', ['value' => $email]);\n                    }\n                });\n            })->all($this->selectColumns);\n        }\n\n        $persons->each(function ($person) {\n            collect($person->emails)\n                ->each(fn ($email) => $this->set($email['value'], $person->id));\n        });\n    }\n\n    /**\n     * Get email information.\n     */\n    public function set(string $email, int $id): self\n    {\n        $this->items[$email] = $id;\n\n        return $this;\n    }\n\n    /**\n     * Check if email exists.\n     */\n    public function has(string $email): bool\n    {\n        return isset($this->items[$email]);\n    }\n\n    /**\n     * Get email information.\n     */\n    public function get(string $email): ?int\n    {\n        if (! $this->has($email)) {\n            return null;\n        }\n\n        return $this->items[$email];\n    }\n\n    /**\n     * Is storage is empty.\n     */\n    public function isEmpty(): int\n    {\n        return empty($this->items);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Helpers/Importers/Products/Importer.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Helpers\\Importers\\Products;\n\nuse Illuminate\\Support\\Arr;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\Validator;\nuse Webkul\\Attribute\\Repositories\\AttributeOptionRepository;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Attribute\\Repositories\\AttributeValueRepository;\nuse Webkul\\DataTransfer\\Contracts\\ImportBatch as ImportBatchContract;\nuse Webkul\\DataTransfer\\Helpers\\Import;\nuse Webkul\\DataTransfer\\Helpers\\Importers\\AbstractImporter;\nuse Webkul\\DataTransfer\\Repositories\\ImportBatchRepository;\nuse Webkul\\Product\\Repositories\\ProductInventoryRepository;\nuse Webkul\\Product\\Repositories\\ProductRepository;\n\nclass Importer extends AbstractImporter\n{\n    /**\n     * Error code for non existing SKU.\n     */\n    const ERROR_SKU_NOT_FOUND_FOR_DELETE = 'sku_not_found_to_delete';\n\n    /**\n     * Error message templates.\n     */\n    protected array $messages = [\n        self::ERROR_SKU_NOT_FOUND_FOR_DELETE => 'data_transfer::app.importers.products.validation.errors.sku-not-found',\n    ];\n\n    /**\n     * Permanent entity columns.\n     */\n    protected array $permanentAttributes = ['sku'];\n\n    /**\n     * Permanent entity column.\n     */\n    protected string $masterAttributeCode = 'sku';\n\n    /**\n     * Cached attributes.\n     */\n    protected mixed $attributes = [];\n\n    /**\n     * Valid csv columns.\n     */\n    protected array $validColumnNames = [\n        'sku',\n        'name',\n        'description',\n        'quantity',\n        'price',\n    ];\n\n    /**\n     * Create a new helper instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected ImportBatchRepository $importBatchRepository,\n        protected AttributeRepository $attributeRepository,\n        protected AttributeOptionRepository $attributeOptionRepository,\n        protected ProductRepository $productRepository,\n        protected ProductInventoryRepository $productInventoryRepository,\n        protected AttributeValueRepository $attributeValueRepository,\n        protected SKUStorage $skuStorage\n    ) {\n        parent::__construct(\n            $importBatchRepository,\n            $attributeRepository,\n            $attributeValueRepository\n        );\n\n        $this->initAttributes();\n    }\n\n    /**\n     * Load all attributes and families to use later.\n     */\n    protected function initAttributes(): void\n    {\n        $this->attributes = $this->attributeRepository->all();\n\n        foreach ($this->attributes as $attribute) {\n            $this->validColumnNames[] = $attribute->code;\n        }\n    }\n\n    /**\n     * Initialize Product error templates.\n     */\n    protected function initErrorMessages(): void\n    {\n        foreach ($this->messages as $errorCode => $message) {\n            $this->errorHelper->addErrorMessage($errorCode, trans($message));\n        }\n\n        parent::initErrorMessages();\n    }\n\n    /**\n     * Save validated batches.\n     */\n    protected function saveValidatedBatches(): self\n    {\n        $source = $this->getSource();\n\n        $source->rewind();\n\n        $this->skuStorage->init();\n\n        while ($source->valid()) {\n            try {\n                $rowData = $source->current();\n            } catch (\\InvalidArgumentException $e) {\n                $source->next();\n\n                continue;\n            }\n\n            $this->validateRow($rowData, $source->getCurrentRowNumber());\n\n            $source->next();\n        }\n\n        parent::saveValidatedBatches();\n\n        return $this;\n    }\n\n    /**\n     * Validates row.\n     */\n    public function validateRow(array $rowData, int $rowNumber): bool\n    {\n        /**\n         * If row is already validated than no need for further validation.\n         */\n        if (isset($this->validatedRows[$rowNumber])) {\n            return ! $this->errorHelper->isRowInvalid($rowNumber);\n        }\n\n        $this->validatedRows[$rowNumber] = true;\n\n        /**\n         * If import action is delete than no need for further validation.\n         */\n        if ($this->import->action == Import::ACTION_DELETE) {\n            if (! $this->isSKUExist($rowData['sku'])) {\n                $this->skipRow($rowNumber, self::ERROR_SKU_NOT_FOUND_FOR_DELETE, 'sku');\n\n                return false;\n            }\n\n            return true;\n        }\n\n        /**\n         * Validate product attributes\n         */\n        $validator = Validator::make($rowData, $this->getValidationRules('products', $rowData));\n\n        if ($validator->fails()) {\n            foreach ($validator->errors()->getMessages() as $attributeCode => $message) {\n                $failedAttributes = $validator->failed();\n\n                $errorCode = array_key_first($failedAttributes[$attributeCode] ?? []);\n\n                $this->skipRow($rowNumber, $errorCode, $attributeCode, current($message));\n            }\n        }\n\n        return ! $this->errorHelper->isRowInvalid($rowNumber);\n    }\n\n    /**\n     * Start the import process.\n     */\n    public function importBatch(ImportBatchContract $batch): bool\n    {\n        Event::dispatch('data_transfer.imports.batch.import.before', $batch);\n\n        if ($batch->import->action == Import::ACTION_DELETE) {\n            $this->deleteProducts($batch);\n        } else {\n            $this->saveProductsData($batch);\n        }\n\n        /**\n         * Update import batch summary.\n         */\n        $batch = $this->importBatchRepository->update([\n            'state' => Import::STATE_PROCESSED,\n\n            'summary' => [\n                'created' => $this->getCreatedItemsCount(),\n                'updated' => $this->getUpdatedItemsCount(),\n                'deleted' => $this->getDeletedItemsCount(),\n            ],\n        ], $batch->id);\n\n        Event::dispatch('data_transfer.imports.batch.import.after', $batch);\n\n        return true;\n    }\n\n    /**\n     * Delete products from current batch.\n     */\n    protected function deleteProducts(ImportBatchContract $batch): bool\n    {\n        /**\n         * Load SKU storage with batch skus.\n         */\n        $this->skuStorage->load(Arr::pluck($batch->data, 'sku'));\n\n        $idsToDelete = [];\n\n        foreach ($batch->data as $rowData) {\n            if (! $this->isSKUExist($rowData['sku'])) {\n                continue;\n            }\n\n            $product = $this->skuStorage->get($rowData['sku']);\n\n            $idsToDelete[] = $product['id'];\n        }\n\n        $idsToDelete = array_unique($idsToDelete);\n\n        $this->deletedItemsCount = count($idsToDelete);\n\n        $this->productRepository->deleteWhere([['id', 'IN', $idsToDelete]]);\n\n        return true;\n    }\n\n    /**\n     * Save products from current batch.\n     */\n    protected function saveProductsData(ImportBatchContract $batch): bool\n    {\n        /**\n         * Load SKU storage with batch skus.\n         */\n        $this->skuStorage->load(Arr::pluck($batch->data, 'sku'));\n\n        $products = [];\n\n        /**\n         * Prepare products for import.\n         */\n        foreach ($batch->data as $rowData) {\n            $this->prepareProducts($rowData, $products);\n        }\n\n        $this->saveProducts($products);\n\n        return true;\n    }\n\n    /**\n     * Prepare products from current batch.\n     */\n    public function prepareProducts(array $rowData, array &$products): void\n    {\n        if ($this->isSKUExist($rowData['sku'])) {\n            $products['update'][$rowData['sku']] = $rowData;\n        } else {\n            $products['insert'][$rowData['sku']] = [\n                ...$rowData,\n                'created_at' => $rowData['created_at'] ?? now(),\n                'updated_at' => $rowData['updated_at'] ?? now(),\n            ];\n        }\n    }\n\n    /**\n     * Save products from current batch.\n     */\n    public function saveProducts(array $products): void\n    {\n        if (! empty($products['update'])) {\n            $this->updatedItemsCount += count($products['update']);\n\n            $this->productRepository->upsert(\n                $products['update'],\n                $this->masterAttributeCode\n            );\n        }\n\n        if (! empty($products['insert'])) {\n            $this->createdItemsCount += count($products['insert']);\n\n            $this->productRepository->insert($products['insert']);\n        }\n    }\n\n    /**\n     * Save channels from current batch.\n     */\n    public function saveChannels(array $channels): void\n    {\n        $productChannels = [];\n\n        foreach ($channels as $sku => $channelIds) {\n            $product = $this->skuStorage->get($sku);\n\n            foreach (array_unique($channelIds) as $channelId) {\n                $productChannels[] = [\n                    'product_id' => $product['id'],\n                    'channel_id' => $channelId,\n                ];\n            }\n        }\n\n        DB::table('product_channels')->upsert(\n            $productChannels,\n            [\n                'product_id',\n                'channel_id',\n            ],\n        );\n    }\n\n    /**\n     * Save links.\n     */\n    public function loadUnloadedSKUs(array $skus): void\n    {\n        $notLoadedSkus = [];\n\n        foreach ($skus as $sku) {\n            if ($this->skuStorage->has($sku)) {\n                continue;\n            }\n\n            $notLoadedSkus[] = $sku;\n        }\n\n        /**\n         * Load not loaded SKUs to the sku storage.\n         */\n        if (! empty($notLoadedSkus)) {\n            $this->skuStorage->load($notLoadedSkus);\n        }\n    }\n\n    /**\n     * Check if SKU exists.\n     */\n    public function isSKUExist(string $sku): bool\n    {\n        return $this->skuStorage->has($sku);\n    }\n\n    /**\n     * Prepare row data to save into the database.\n     */\n    protected function prepareRowForDb(array $rowData): array\n    {\n        return parent::prepareRowForDb($rowData);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Helpers/Importers/Products/SKUStorage.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Helpers\\Importers\\Products;\n\nuse Webkul\\Product\\Repositories\\ProductRepository;\n\nclass SKUStorage\n{\n    /**\n     * Delimiter for SKU information.\n     */\n    private const DELIMITER = '|';\n\n    /**\n     * Items contains SKU as key and product information as value.\n     */\n    protected array $items = [];\n\n    /**\n     * Columns which will be selected from database.\n     */\n    protected array $selectColumns = [\n        'id',\n        'sku',\n    ];\n\n    /**\n     * Create a new helper instance.\n     *\n     * @return void\n     */\n    public function __construct(protected ProductRepository $productRepository) {}\n\n    /**\n     * Initialize storage.\n     */\n    public function init(): void\n    {\n        $this->items = [];\n\n        $this->load();\n    }\n\n    /**\n     * Load the SKU.\n     */\n    public function load(array $skus = []): void\n    {\n        if (empty($skus)) {\n            $products = $this->productRepository->all($this->selectColumns);\n        } else {\n            $products = $this->productRepository->findWhereIn('sku', $skus, $this->selectColumns);\n        }\n\n        foreach ($products as $product) {\n            $this->set($product->sku, [\n                'id' => $product->id,\n                'sku' => $product->sku,\n            ]);\n        }\n    }\n\n    /**\n     * Get SKU information.\n     */\n    public function set(string $sku, array $data): self\n    {\n        $this->items[$sku] = implode(self::DELIMITER, [\n            $data['id'],\n            $data['sku'],\n        ]);\n\n        return $this;\n    }\n\n    /**\n     * Check if SKU exists.\n     */\n    public function has(string $sku): bool\n    {\n        return isset($this->items[$sku]);\n    }\n\n    /**\n     * Get SKU information.\n     */\n    public function get(string $sku): ?array\n    {\n        if (! $this->has($sku)) {\n            return null;\n        }\n\n        $data = explode(self::DELIMITER, $this->items[$sku]);\n\n        return [\n            'id' => $data[0],\n        ];\n    }\n\n    /**\n     * Is storage is empty.\n     */\n    public function isEmpty(): int\n    {\n        return empty($this->items);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Helpers/Sources/AbstractSource.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Helpers\\Sources;\n\nuse Webkul\\DataTransfer\\Helpers\\Importers\\AbstractImporter;\n\nabstract class AbstractSource\n{\n    /**\n     * Column names.\n     */\n    protected array $columnNames = [];\n\n    /**\n     * Quantity of columns.\n     */\n    protected int $totalColumns = 0;\n\n    /**\n     * Current row.\n     */\n    protected array $currentRowData = [];\n\n    /**\n     * Current row number.\n     */\n    protected int $currentRowNumber = -1;\n\n    /**\n     * Flag to indicate that wrong quote was found.\n     */\n    protected bool $foundWrongQuoteFlag = false;\n\n    /**\n     * Read next line from source.\n     */\n    abstract protected function getNextRow(): array|bool;\n\n    /**\n     * Return the key of the current row.\n     */\n    public function getCurrentRowNumber(): int\n    {\n        return $this->currentRowNumber;\n    }\n\n    /**\n     * Checks if current position is valid.\n     */\n    public function valid(): bool\n    {\n        return $this->currentRowNumber !== -1;\n    }\n\n    /**\n     * Read next line from source.\n     */\n    public function current(): array\n    {\n        $row = $this->currentRowData;\n\n        if (count($row) != $this->totalColumns) {\n            if ($this->foundWrongQuoteFlag) {\n                throw new \\InvalidArgumentException(AbstractImporter::ERROR_CODE_WRONG_QUOTES);\n            } else {\n                throw new \\InvalidArgumentException(AbstractImporter::ERROR_CODE_COLUMNS_NUMBER);\n            }\n        }\n\n        return array_combine($this->columnNames, $row);\n    }\n\n    /**\n     * Read next line from source.\n     */\n    public function next(): void\n    {\n        $this->currentRowNumber++;\n\n        $row = $this->getNextRow();\n\n        if ($row === false || $row === []) {\n            $this->currentRowData = [];\n\n            $this->currentRowNumber = -1;\n        } else {\n            $this->currentRowData = $row;\n        }\n    }\n\n    /**\n     * Rewind the iterator to the first row.\n     */\n    public function rewind(): void\n    {\n        $this->currentRowNumber = 0;\n\n        $this->currentRowData = [];\n\n        $this->getNextRow();\n\n        $this->next();\n    }\n\n    /**\n     * Column names getter.\n     */\n    public function getColumnNames(): array\n    {\n        return $this->columnNames;\n    }\n\n    /**\n     * Column names getter.\n     */\n    public function getTotalColumns(): int\n    {\n        return count($this->columnNames);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Helpers/Sources/CSV.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Helpers\\Sources;\n\nuse Illuminate\\Support\\Facades\\Storage;\n\nclass CSV extends AbstractSource\n{\n    /**\n     * CSV reader.\n     */\n    protected mixed $reader;\n\n    /**\n     * Create a new helper instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        string $filePath,\n        protected string $delimiter = ','\n    ) {\n        try {\n            $this->reader = fopen(Storage::disk('public')->path($filePath), 'r');\n\n            $this->columnNames = fgetcsv($this->reader, 4096, $delimiter);\n\n            $this->totalColumns = count($this->columnNames);\n        } catch (\\Exception $e) {\n            throw new \\LogicException(\"Unable to open file: '{$filePath}'\");\n        }\n    }\n\n    /**\n     * Close file handle.\n     *\n     * @return void\n     */\n    public function __destruct()\n    {\n        if (! is_object($this->reader)) {\n            return;\n        }\n\n        $this->reader->close();\n    }\n\n    /**\n     * Read next line from csv.\n     */\n    protected function getNextRow(): array\n    {\n        $parsed = fgetcsv($this->reader, 4096, $this->delimiter);\n\n        if (is_array($parsed) && count($parsed) != $this->totalColumns) {\n            foreach ($parsed as $element) {\n                if ($element && strpos($element, \"'\") !== false) {\n                    $this->foundWrongQuoteFlag = true;\n\n                    break;\n                }\n            }\n        } else {\n            $this->foundWrongQuoteFlag = false;\n        }\n\n        return is_array($parsed) ? $parsed : [];\n    }\n\n    /**\n     * Rewind the iterator to the first row.\n     */\n    public function rewind(): void\n    {\n        rewind($this->reader);\n\n        parent::rewind();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Helpers/Sources/Excel.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Helpers\\Sources;\n\nuse Illuminate\\Support\\Facades\\Storage;\nuse PhpOffice\\PhpSpreadsheet\\Cell\\Coordinate;\nuse PhpOffice\\PhpSpreadsheet\\IOFactory;\n\nclass Excel extends AbstractSource\n{\n    /**\n     * CSV reader.\n     */\n    protected mixed $reader;\n\n    /**\n     * Current row number.\n     */\n    protected int $currentRowNumber = 1;\n\n    /**\n     * Create a new helper instance.\n     *\n     * @return void\n     */\n    public function __construct(string $filePath)\n    {\n        try {\n            $factory = IOFactory::load(Storage::disk('public')->path($filePath));\n\n            $this->reader = $factory->getActiveSheet();\n\n            $highestColumn = $this->reader->getHighestColumn();\n\n            $this->totalColumns = Coordinate::columnIndexFromString($highestColumn);\n\n            $this->columnNames = $this->getNextRow();\n        } catch (\\Exception $e) {\n            throw new \\LogicException(\"Unable to open file: '{$filePath}'\");\n        }\n    }\n\n    /**\n     * Read next line from csv.\n     */\n    protected function getNextRow(): array|bool\n    {\n        for ($column = 1; $column <= $this->totalColumns; $column++) {\n            $rowData[] = $this->reader->getCellByColumnAndRow($column, $this->currentRowNumber)->getValue();\n        }\n\n        $filteredRowData = array_filter($rowData);\n\n        if (empty($filteredRowData)) {\n            return false;\n        }\n\n        return $rowData;\n    }\n\n    /**\n     * Rewind the iterator to the first row.\n     */\n    public function rewind(): void\n    {\n        $this->currentRowNumber = 1;\n\n        $this->next();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Jobs/Import/Completed.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Jobs\\Import;\n\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Foundation\\Bus\\Dispatchable;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Webkul\\DataTransfer\\Helpers\\Import as ImportHelper;\n\nclass Completed implements ShouldQueue\n{\n    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    /**\n     * Create a new job instance.\n     *\n     * @param  mixed  $import\n     * @return void\n     */\n    public function __construct(protected $import)\n    {\n        $this->import = $import;\n    }\n\n    /**\n     * Execute the job.\n     *\n     * @return void\n     */\n    public function handle()\n    {\n        app(ImportHelper::class)\n            ->setImport($this->import)\n            ->completed();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Jobs/Import/ImportBatch.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Jobs\\Import;\n\nuse Illuminate\\Bus\\Batchable;\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Foundation\\Bus\\Dispatchable;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Webkul\\DataTransfer\\Helpers\\Import as ImportHelper;\n\nclass ImportBatch implements ShouldQueue\n{\n    use Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    /**\n     * Create a new job instance.\n     *\n     * @param  mixed  $importBatch\n     * @return void\n     */\n    public function __construct(protected $importBatch)\n    {\n        $this->importBatch = $importBatch;\n    }\n\n    /**\n     * Execute the job.\n     *\n     * @return void\n     */\n    public function handle()\n    {\n        $typeImported = app(ImportHelper::class)\n            ->setImport($this->importBatch->import)\n            ->getTypeImporter();\n\n        $typeImported->importBatch($this->importBatch);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Jobs/Import/IndexBatch.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Jobs\\Import;\n\nuse Illuminate\\Bus\\Batchable;\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Foundation\\Bus\\Dispatchable;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Webkul\\DataTransfer\\Helpers\\Import as ImportHelper;\n\nclass IndexBatch implements ShouldQueue\n{\n    use Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    /**\n     * Create a new job instance.\n     *\n     * @param  mixed  $importBatch\n     * @return void\n     */\n    public function __construct(protected $importBatch)\n    {\n        $this->importBatch = $importBatch;\n    }\n\n    /**\n     * Execute the job.\n     *\n     * @return void\n     */\n    public function handle()\n    {\n        $typeImported = app(ImportHelper::class)\n            ->setImport($this->importBatch->import)\n            ->getTypeImporter();\n\n        $typeImported->indexBatch($this->importBatch);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Jobs/Import/Indexing.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Jobs\\Import;\n\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Foundation\\Bus\\Dispatchable;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Webkul\\DataTransfer\\Helpers\\Import as ImportHelper;\n\nclass Indexing implements ShouldQueue\n{\n    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    /**\n     * Create a new job instance.\n     *\n     * @param  mixed  $import\n     * @return void\n     */\n    public function __construct(protected $import)\n    {\n        $this->import = $import;\n    }\n\n    /**\n     * Execute the job.\n     *\n     * @return void\n     */\n    public function handle()\n    {\n        app(ImportHelper::class)\n            ->setImport($this->import)\n            ->indexing();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Jobs/Import/LinkBatch.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Jobs\\Import;\n\nuse Illuminate\\Bus\\Batchable;\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Foundation\\Bus\\Dispatchable;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Webkul\\DataTransfer\\Helpers\\Import as ImportHelper;\n\nclass LinkBatch implements ShouldQueue\n{\n    use Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    /**\n     * Create a new job instance.\n     *\n     * @param  mixed  $importBatch\n     * @return void\n     */\n    public function __construct(protected $importBatch)\n    {\n        $this->importBatch = $importBatch;\n    }\n\n    /**\n     * Execute the job.\n     *\n     * @return void\n     */\n    public function handle()\n    {\n        $typeImported = app(ImportHelper::class)\n            ->setImport($this->importBatch->import)\n            ->getTypeImporter();\n\n        $typeImported->linkBatch($this->importBatch);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Jobs/Import/Linking.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Jobs\\Import;\n\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nuse Illuminate\\Foundation\\Bus\\Dispatchable;\nuse Illuminate\\Queue\\InteractsWithQueue;\nuse Illuminate\\Queue\\SerializesModels;\nuse Webkul\\DataTransfer\\Helpers\\Import as ImportHelper;\n\nclass Linking implements ShouldQueue\n{\n    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    /**\n     * Create a new job instance.\n     *\n     * @param  mixed  $import\n     * @return void\n     */\n    public function __construct(protected $import)\n    {\n        $this->import = $import;\n    }\n\n    /**\n     * Execute the job.\n     *\n     * @return void\n     */\n    public function handle()\n    {\n        app(ImportHelper::class)\n            ->setImport($this->import)\n            ->linking();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Models/Import.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Illuminate\\Database\\Eloquent\\Relations\\HasMany;\nuse Webkul\\DataTransfer\\Contracts\\Import as ImportContract;\n\nclass Import extends Model implements ImportContract\n{\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'state',\n        'process_in_queue',\n        'type',\n        'action',\n        'validation_strategy',\n        'validation_strategy',\n        'allowed_errors',\n        'processed_rows_count',\n        'invalid_rows_count',\n        'errors_count',\n        'errors',\n        'field_separator',\n        'file_path',\n        'error_file_path',\n        'summary',\n        'started_at',\n        'completed_at',\n    ];\n\n    /**\n     * The attributes that should be cast.\n     *\n     * @var array\n     */\n    protected $casts = [\n        'summary' => 'array',\n        'errors' => 'array',\n        'started_at' => 'datetime',\n        'completed_at' => 'datetime',\n    ];\n\n    /**\n     * Get the options.\n     */\n    public function batches(): HasMany\n    {\n        return $this->hasMany(ImportBatchProxy::modelClass());\n    }\n\n    /**\n     * Get the file name.\n     */\n    public function getFileNameAttribute(): string\n    {\n        return preg_replace('/^.*?\\/\\d+-/', '', $this->file_path);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Models/ImportBatch.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Illuminate\\Database\\Eloquent\\Relations\\BelongsTo;\nuse Webkul\\DataTransfer\\Contracts\\ImportBatch as ImportBatchContract;\n\nclass ImportBatch extends Model implements ImportBatchContract\n{\n    /**\n     * Indicates if the model should be timestamped.\n     *\n     * @var bool\n     */\n    public $timestamps = false;\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'state',\n        'data',\n        'summary',\n        'import_id',\n    ];\n\n    /**\n     * The attributes that should be cast.\n     *\n     * @var array\n     */\n    protected $casts = [\n        'summary' => 'array',\n        'data' => 'array',\n    ];\n\n    /**\n     * Get the import that owns the import batch.\n     *\n     * @return BelongsTo\n     */\n    public function import()\n    {\n        return $this->belongsTo(ImportProxy::modelClass());\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Models/ImportBatchProxy.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass ImportBatchProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Models/ImportProxy.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass ImportProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Providers/DataTransferServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Providers;\n\nuse Illuminate\\Support\\ServiceProvider;\n\nclass DataTransferServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap any application services.\n     */\n    public function boot(): void\n    {\n        $this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'data_transfer');\n\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n    }\n\n    /**\n     * Register any application services.\n     */\n    public function register(): void\n    {\n        $this->mergeConfigFrom(dirname(__DIR__).'/Config/importers.php', 'importers');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Providers;\n\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\nuse Webkul\\DataTransfer\\Models\\Import;\nuse Webkul\\DataTransfer\\Models\\ImportBatch;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    /**\n     * Define models to map with repository interfaces.\n     *\n     * @var array\n     */\n    protected $models = [\n        Import::class,\n        ImportBatch::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Repositories/ImportBatchRepository.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\nuse Webkul\\DataTransfer\\Contracts\\ImportBatch;\n\nclass ImportBatchRepository extends Repository\n{\n    /**\n     * Specify model class name.\n     */\n    public function model(): string\n    {\n        return ImportBatch::class;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Repositories/ImportRepository.php",
    "content": "<?php\n\nnamespace Webkul\\DataTransfer\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\nuse Webkul\\DataTransfer\\Contracts\\Import;\n\nclass ImportRepository extends Repository\n{\n    /**\n     * Specify model class name.\n     */\n    public function model(): string\n    {\n        return Import::class;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Resources/lang/ar/ar.php",
    "content": "<?php\n\nreturn [\n    'importers' => [\n        'persons' => [\n            'title' => 'الأشخاص',\n\n            'validation' => [\n                'errors' => [\n                    'duplicate-email' => 'البريد الإلكتروني: \\'%s\\' تم العثور عليه أكثر من مرة في ملف الاستيراد.',\n                    'duplicate-phone' => 'الهاتف: \\'%s\\' تم العثور عليه أكثر من مرة في ملف الاستيراد.',\n                    'email-not-found' => 'البريد الإلكتروني: \\'%s\\' لم يتم العثور عليه في النظام.',\n                ],\n            ],\n        ],\n\n        'products' => [\n            'title' => 'المنتجات',\n\n            'validation' => [\n                'errors' => [\n                    'sku-not-found' => 'المنتج ذو الكود المحدد لم يتم العثور عليه.',\n                ],\n            ],\n        ],\n\n        'leads' => [\n            'title' => 'العملاء المحتملون',\n\n            'validation' => [\n                'errors' => [\n                    'id-not-found' => 'المعرف: \\'%s\\' غير موجود في النظام.',\n                ],\n            ],\n        ],\n    ],\n\n    'validation' => [\n        'errors' => [\n            'column-empty-headers' => 'الأعمدة رقم \"%s\" تحتوي على رؤوس فارغة.',\n            'column-name-invalid' => 'أسماء الأعمدة غير صالحة: \"%s\".',\n            'column-not-found' => 'الأعمدة المطلوبة غير موجودة: %s.',\n            'column-numbers' => 'عدد الأعمدة لا يتوافق مع عدد الصفوف في الرأس.',\n            'invalid-attribute' => 'الرأس يحتوي على سمة غير صالحة: \"%s\".',\n            'system' => 'حدث خطأ غير متوقع في النظام.',\n            'wrong-quotes' => 'تم استخدام علامات الاقتباس الملتوية بدلاً من الاقتباسات المستقيمة.',\n        ],\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Resources/lang/en/app.php",
    "content": "<?php\n\nreturn [\n    'importers' => [\n        'persons' => [\n            'title' => 'Persons',\n\n            'validation' => [\n                'errors' => [\n                    'duplicate-email' => 'Email : \\'%s\\' is found more than once in the import file.',\n                    'duplicate-phone' => 'Phone : \\'%s\\' is found more than once in the import file.',\n                    'email-not-found' => 'Email : \\'%s\\' not found in the system.',\n                ],\n            ],\n        ],\n\n        'products' => [\n            'title' => 'Products',\n\n            'validation' => [\n                'errors' => [\n                    'sku-not-found' => 'Product with specified SKU not found',\n                ],\n            ],\n        ],\n\n        'leads' => [\n            'title' => 'Leads',\n\n            'validation' => [\n                'errors' => [\n                    'id-not-found' => 'ID : \\'%s\\' not found in the system.',\n                ],\n            ],\n        ],\n    ],\n\n    'validation' => [\n        'errors' => [\n            'column-empty-headers' => 'Columns number \"%s\" have empty headers.',\n            'column-name-invalid' => 'Invalid column names: \"%s\".',\n            'column-not-found' => 'Required columns not found: %s.',\n            'column-numbers' => 'Number of columns does not correspond to the number of rows in the header.',\n            'invalid-attribute' => 'Header contains invalid attribute(s): \"%s\".',\n            'system' => 'An unexpected system error occurred.',\n            'wrong-quotes' => 'Curly quotes used instead of straight quotes.',\n            'already-exists' => 'The :attribute already exists.',\n        ],\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Resources/lang/es/app.php",
    "content": "<?php\n\nreturn [\n    'importers' => [\n        'persons' => [\n            'title' => 'Personas',\n\n            'validation' => [\n                'errors' => [\n                    'duplicate-email' => 'Correo electrónico: \\'%s\\' se encontró más de una vez en el archivo de importación.',\n                    'duplicate-phone' => 'Teléfono: \\'%s\\' se encontró más de una vez en el archivo de importación.',\n                    'email-not-found' => 'Correo electrónico: \\'%s\\' no se encontró en el sistema.',\n                ],\n            ],\n        ],\n\n        'products' => [\n            'title' => 'Productos',\n\n            'validation' => [\n                'errors' => [\n                    'sku-not-found' => 'Producto con el SKU especificado no encontrado.',\n                ],\n            ],\n        ],\n\n        'leads' => [\n            'title' => 'Clientes Potenciales',\n\n            'validation' => [\n                'errors' => [\n                    'id-not-found' => 'ID: \\'%s\\' no se encuentra en el sistema.',\n                ],\n            ],\n        ],\n    ],\n\n    'validation' => [\n        'errors' => [\n            'column-empty-headers' => 'Las columnas número \"%s\" tienen encabezados vacíos.',\n            'column-name-invalid' => 'Nombres de columnas no válidos: \"%s\".',\n            'column-not-found' => 'No se encontraron las columnas requeridas: %s.',\n            'column-numbers' => 'El número de columnas no corresponde al número de filas en el encabezado.',\n            'invalid-attribute' => 'El encabezado contiene atributos no válidos: \"%s\".',\n            'system' => 'Ocurrió un error inesperado en el sistema.',\n            'wrong-quotes' => 'Se usaron comillas curvas en lugar de comillas rectas.',\n        ],\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Resources/lang/fa/app.php",
    "content": "<?php\n\nreturn [\n    'importers' => [\n        'persons' => [\n            'title' => 'افراد',\n\n            'validation' => [\n                'errors' => [\n                    'duplicate-email' => 'ایمیل: \\'%s\\' بیش از یک بار در فایل واردات یافت شد.',\n                    'duplicate-phone' => 'تلفن: \\'%s\\' بیش از یک بار در فایل واردات یافت شد.',\n                    'email-not-found' => 'ایمیل: \\'%s\\' در سیستم یافت نشد.',\n                ],\n            ],\n        ],\n\n        'products' => [\n            'title' => 'محصولات',\n\n            'validation' => [\n                'errors' => [\n                    'sku-not-found' => 'محصول با کد SKU مشخص شده یافت نشد.',\n                ],\n            ],\n        ],\n\n        'leads' => [\n            'title' => 'سرنخ‌ها',\n\n            'validation' => [\n                'errors' => [\n                    'id-not-found' => 'شناسه: \\'%s\\' در سیستم یافت نشد.',\n                ],\n            ],\n        ],\n    ],\n\n    'validation' => [\n        'errors' => [\n            'column-empty-headers' => 'ستون‌های شماره \"%s\" دارای سرصفحه‌های خالی هستند.',\n            'column-name-invalid' => 'نام‌های ستون نامعتبر: \"%s\".',\n            'column-not-found' => 'ستون‌های مورد نیاز یافت نشد: %s.',\n            'column-numbers' => 'تعداد ستون‌ها با تعداد سطرهای سرصفحه مطابقت ندارد.',\n            'invalid-attribute' => 'سرصفحه شامل ویژگی‌های نامعتبر است: \"%s\".',\n            'system' => 'خطای غیرمنتظره‌ای در سیستم رخ داد.',\n            'wrong-quotes' => 'به جای گیومه‌های مستقیم از گیومه‌های خمیده استفاده شده است.',\n        ],\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Resources/lang/pt_BR/app.php",
    "content": "<?php\n\nreturn [\n    'importers' => [\n        'persons' => [\n            'title' => 'Pessoas',\n\n            'validation' => [\n                'errors' => [\n                    'duplicate-email' => 'E-mail : \\'%s\\' é encontrado mais de uma vez no arquivo de importação.',\n                    'duplicate-phone' => 'Telefone : \\'%s\\' é encontrado mais de uma vez no arquivo de importação.',\n                    'email-not-found' => 'E-mail : \\'%s\\' não foi encontrado no sistema.',\n                ],\n            ],\n        ],\n\n        'products' => [\n            'title' => 'Produtos',\n\n            'validation' => [\n                'errors' => [\n                    'sku-not-found' => 'Produto com este código não foi encontrado',\n                ],\n            ],\n        ],\n\n        'leads' => [\n            'title' => 'Oportunidades',\n\n            'validation' => [\n                'errors' => [\n                    'id-not-found' => 'ID : \\'%s\\' não foi encontrado no sistema.',\n                ],\n            ],\n        ],\n    ],\n\n    'validation' => [\n        'errors' => [\n            'column-empty-headers' => 'As colunas de número \"%s\" têm cabeçalhos vazios.',\n            'column-name-invalid' => 'Nomes de colunas inválidos: \"%s\".',\n            'column-not-found' => 'Colunas obrigatórias não encontradas: %s.',\n            'column-numbers' => 'O número de colunas não corresponde ao número de linhas no cabeçalho.',\n            'invalid-attribute' => 'O cabeçalho contém atributo(s) inválido(s): \"%s\".',\n            'system' => 'Ocorreu um erro inesperado no sistema.',\n            'wrong-quotes' => 'Aspas curvas usadas em vez de aspas retas.',\n            'already-exists' => 'O :attribute já existe.',\n        ],\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/DataTransfer/src/Resources/lang/tr/app.php",
    "content": "<?php\n\nreturn [\n    'importers' => [\n        'persons' => [\n            'title' => 'Kişiler',\n\n            'validation' => [\n                'errors' => [\n                    'duplicate-email' => 'E-posta: \\'%s\\' içe aktarma dosyasında birden fazla kez bulundu.',\n                    'duplicate-phone' => 'Telefon: \\'%s\\' içe aktarma dosyasında birden fazla kez bulundu.',\n                    'email-not-found' => 'E-posta: \\'%s\\' sistemde bulunamadı.',\n                ],\n            ],\n        ],\n\n        'products' => [\n            'title' => 'Ürünler',\n\n            'validation' => [\n                'errors' => [\n                    'sku-not-found' => 'Belirtilen SKU\\'ya sahip ürün bulunamadı.',\n                ],\n            ],\n        ],\n\n        'leads' => [\n            'title' => 'Müşteri Adayları',\n\n            'validation' => [\n                'errors' => [\n                    'id-not-found' => 'ID: \\'%s\\' sistemde bulunamadı.',\n                ],\n            ],\n        ],\n    ],\n\n    'validation' => [\n        'errors' => [\n            'column-empty-headers' => '\"%s\" numaralı sütunların başlıkları boş.',\n            'column-name-invalid' => 'Geçersiz sütun adları: \"%s\".',\n            'column-not-found' => 'Gerekli sütunlar bulunamadı: %s.',\n            'column-numbers' => 'Sütun sayısı başlıktaki satır sayısına karşılık gelmiyor.',\n            'invalid-attribute' => 'Başlık geçersiz öznitelikler içeriyor: \"%s\".',\n            'system' => 'Beklenmeyen bir sistem hatası oluştu.',\n            'wrong-quotes' => 'Doğru olmayan tırnak işaretleri kullanıldı.',\n        ],\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Email/composer.json",
    "content": "{\n    \"name\": \"krayin/laravel-email\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Jitendra Singh\",\n            \"email\": \"jitendra@webkul.com\"\n        }\n    ],\n    \"require\": {\n        \"krayin/laravel-contact\": \"^1.0\",\n        \"krayin/laravel-core\": \"^1.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Webkul\\\\Email\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"laravel\": {\n            \"providers\": [\n                \"Webkul\\\\Email\\\\Providers\\\\EmailServiceProvider\"\n            ],\n            \"aliases\": {}\n        }\n    },\n    \"minimum-stability\": \"dev\"\n}"
  },
  {
    "path": "packages/Webkul/Email/src/Console/Commands/ProcessInboundEmails.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Console\\Commands;\n\nuse Illuminate\\Console\\Command;\nuse Webkul\\Email\\InboundEmailProcessor\\Contracts\\InboundEmailProcessor;\n\nclass ProcessInboundEmails extends Command\n{\n    /**\n     * The name and signature of the console command.\n     *\n     * @var string\n     */\n    protected $signature = 'inbound-emails:process';\n\n    /**\n     * The console command description.\n     *\n     * @var string\n     */\n    protected $description = 'This command will process the incoming emails from the mail server.';\n\n    /**\n     * Create a new command instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected InboundEmailProcessor $inboundEmailProcessor\n    ) {\n        parent::__construct();\n    }\n\n    /**\n     * Handle.\n     *\n     * @return void\n     */\n    public function handle()\n    {\n        $this->info('Processing the incoming emails.');\n\n        $this->inboundEmailProcessor->processMessagesFromAllFolders();\n\n        $this->info('Incoming emails processed successfully.');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Contracts/Attachment.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Contracts;\n\ninterface Attachment {}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Contracts/Email.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Contracts;\n\ninterface Email {}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Database/Migrations/2021_05_24_075618_create_emails_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('emails', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('subject')->nullable();\n            $table->string('source');\n            $table->string('user_type');\n            $table->string('name')->nullable();\n            $table->text('reply')->nullable();\n            $table->boolean('is_read')->default(0);\n            $table->json('folders')->nullable();\n            $table->json('from')->nullable();\n            $table->json('sender')->nullable();\n            $table->json('reply_to')->nullable();\n            $table->json('cc')->nullable();\n            $table->json('bcc')->nullable();\n            $table->string('unique_id')->nullable()->unique();\n            $table->string('message_id')->unique();\n            $table->json('reference_ids')->nullable();\n\n            $table->integer('person_id')->unsigned()->nullable();\n            $table->foreign('person_id')->references('id')->on('persons')->onDelete('set null');\n\n            $table->integer('lead_id')->unsigned()->nullable();\n            $table->foreign('lead_id')->references('id')->on('leads')->onDelete('set null');\n\n            $table->timestamps();\n        });\n\n        Schema::table('emails', function (Blueprint $table) {\n            $table->integer('parent_id')->unsigned()->nullable();\n            $table->foreign('parent_id')->references('id')->on('emails')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('emails');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Email/src/Database/Migrations/2021_05_25_072700_create_email_attachments_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('email_attachments', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name')->nullable();\n            $table->string('path');\n            $table->integer('size')->nullable();\n            $table->string('content_type')->nullable();\n            $table->string('content_id')->nullable();\n\n            $table->integer('email_id')->unsigned();\n            $table->foreign('email_id')->references('id')->on('emails')->onDelete('cascade');\n\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('email_attachments');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Email/src/Database/Migrations/2024_08_27_091619_create_email_tags_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('email_tags', function (Blueprint $table) {\n            $table->integer('tag_id')->unsigned();\n            $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');\n\n            $table->integer('email_id')->unsigned();\n            $table->foreign('email_id')->references('id')->on('emails')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::dropIfExists('email_tags');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Email/src/Enums/SupportedFolderEnum.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Enums;\n\nenum SupportedFolderEnum: string\n{\n    /**\n     * Inbox.\n     */\n    case INBOX = 'inbox';\n\n    /**\n     * Important.\n     */\n    case IMPORTANT = 'important';\n\n    /**\n     * Starred.\n     */\n    case STARRED = 'starred';\n\n    /**\n     * Draft.\n     */\n    case DRAFT = 'draft';\n\n    /**\n     * Outbox.\n     */\n    case OUTBOX = 'outbox';\n\n    /**\n     * Sent.\n     */\n    case SENT = 'sent';\n\n    /**\n     * Spam.\n     */\n    case SPAM = 'spam';\n\n    /**\n     * Trash.\n     */\n    case TRASH = 'trash';\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Helpers/Attachment.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Helpers;\n\nclass Attachment\n{\n    /**\n     * Content.\n     *\n     * @var File Content\n     */\n    private $content = null;\n\n    /**\n     * Create an helper instance\n     */\n    public function __construct(\n        public $filename,\n        public $contentType,\n        public $stream,\n        public $contentDisposition = 'attachment',\n        public $contentId = '',\n        public $headers = []\n    ) {}\n\n    /**\n     * Retrieve the attachment filename.\n     *\n     * @return string\n     */\n    public function getFilename()\n    {\n        return $this->filename;\n    }\n\n    /**\n     * Retrieve the attachment content type.\n     *\n     * @return string\n     */\n    public function getContentType()\n    {\n        return $this->contentType;\n    }\n\n    /**\n     * Retrieve the attachment content disposition.\n     *\n     * @return string\n     */\n    public function getContentDisposition()\n    {\n        return $this->contentDisposition;\n    }\n\n    /**\n     * Retrieve the attachment content ID.\n     *\n     * @return string\n     */\n    public function getContentID()\n    {\n        return $this->contentId;\n    }\n\n    /**\n     * Retrieve the attachment headers.\n     *\n     * @return string\n     */\n    public function getHeaders()\n    {\n        return $this->headers;\n    }\n\n    /**\n     * Read the contents a few bytes at a time until completed.\n     *\n     * Once read to completion, it always returns false.\n     *\n     * @param  int  $bytes\n     * @return string\n     */\n    public function read($bytes = 2082)\n    {\n        return feof($this->stream) ? false : fread($this->stream, $bytes);\n    }\n\n    /**\n     * Retrieve the file content in one go.\n     *\n     * Once you retrieve the content you cannot use MimeMailParser_attachment::read().\n     *\n     * @return string\n     */\n    public function getContent()\n    {\n        if ($this->content === null) {\n            fseek($this->stream, 0);\n\n            while (($buf = $this->read()) !== false) {\n                $this->content .= $buf;\n            }\n        }\n\n        return $this->content;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Helpers/Charset.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Helpers;\n\nuse Webkul\\Email\\Helpers\\Contracts\\CharsetManager;\n\nclass Charset implements CharsetManager\n{\n    /**\n     * Charset aliases.\n     *\n     * @var array\n     */\n    private $charsetAlias = [\n        'ascii' => 'us-ascii',\n        'us-ascii' => 'us-ascii',\n        'ansi_x3.4-1968' => 'us-ascii',\n        '646' => 'us-ascii',\n        'iso-8859-1' => 'ISO-8859-1',\n        'iso-8859-2' => 'ISO-8859-2',\n        'iso-8859-3' => 'ISO-8859-3',\n        'iso-8859-4' => 'ISO-8859-4',\n        'iso-8859-5' => 'ISO-8859-5',\n        'iso-8859-6' => 'ISO-8859-6',\n        'iso-8859-6-i' => 'ISO-8859-6-I',\n        'iso-8859-6-e' => 'ISO-8859-6-E',\n        'iso-8859-7' => 'ISO-8859-7',\n        'iso-8859-8' => 'ISO-8859-8',\n        'iso-8859-8-i' => 'ISO-8859-8-I',\n        'iso-8859-8-e' => 'ISO-8859-8-E',\n        'iso-8859-9' => 'ISO-8859-9',\n        'iso-8859-10' => 'ISO-8859-10',\n        'iso-8859-11' => 'ISO-8859-11',\n        'iso-8859-13' => 'ISO-8859-13',\n        'iso-8859-14' => 'ISO-8859-14',\n        'iso-8859-15' => 'ISO-8859-15',\n        'iso-8859-16' => 'ISO-8859-16',\n        'iso-ir-111' => 'ISO-IR-111',\n        'iso-2022-cn' => 'ISO-2022-CN',\n        'iso-2022-cn-ext' => 'ISO-2022-CN',\n        'iso-2022-kr' => 'ISO-2022-KR',\n        'iso-2022-jp' => 'ISO-2022-JP',\n        'utf-16be' => 'UTF-16BE',\n        'utf-16le' => 'UTF-16LE',\n        'utf-16' => 'UTF-16',\n        'windows-1250' => 'windows-1250',\n        'windows-1251' => 'windows-1251',\n        'windows-1252' => 'windows-1252',\n        'windows-1253' => 'windows-1253',\n        'windows-1254' => 'windows-1254',\n        'windows-1255' => 'windows-1255',\n        'windows-1256' => 'windows-1256',\n        'windows-1257' => 'windows-1257',\n        'windows-1258' => 'windows-1258',\n        'ibm866' => 'IBM866',\n        'ibm850' => 'IBM850',\n        'ibm852' => 'IBM852',\n        'ibm855' => 'IBM855',\n        'ibm857' => 'IBM857',\n        'ibm862' => 'IBM862',\n        'ibm864' => 'IBM864',\n        'utf-8' => 'UTF-8',\n        'utf-7' => 'UTF-7',\n        'shift_jis' => 'Shift_JIS',\n        'big5' => 'Big5',\n        'euc-jp' => 'EUC-JP',\n        'euc-kr' => 'EUC-KR',\n        'gb2312' => 'GB2312',\n        'gb18030' => 'gb18030',\n        'viscii' => 'VISCII',\n        'koi8-r' => 'KOI8-R',\n        'koi8_r' => 'KOI8-R',\n        'cskoi8r' => 'KOI8-R',\n        'koi' => 'KOI8-R',\n        'koi8' => 'KOI8-R',\n        'koi8-u' => 'KOI8-U',\n        'tis-620' => 'TIS-620',\n        't.61-8bit' => 'T.61-8bit',\n        'hz-gb-2312' => 'HZ-GB-2312',\n        'big5-hkscs' => 'Big5-HKSCS',\n        'gbk' => 'gbk',\n        'cns11643' => 'x-euc-tw',\n        'x-imap4-modified-utf7' => 'x-imap4-modified-utf7',\n        'x-euc-tw' => 'x-euc-tw',\n        'x-mac-ce' => 'x-mac-ce',\n        'x-mac-turkish' => 'x-mac-turkish',\n        'x-mac-greek' => 'x-mac-greek',\n        'x-mac-icelandic' => 'x-mac-icelandic',\n        'x-mac-croatian' => 'x-mac-croatian',\n        'x-mac-romanian' => 'x-mac-romanian',\n        'x-mac-cyrillic' => 'x-mac-cyrillic',\n        'x-mac-ukrainian' => 'x-mac-cyrillic',\n        'x-mac-hebrew' => 'x-mac-hebrew',\n        'x-mac-arabic' => 'x-mac-arabic',\n        'x-mac-farsi' => 'x-mac-farsi',\n        'x-mac-devanagari' => 'x-mac-devanagari',\n        'x-mac-gujarati' => 'x-mac-gujarati',\n        'x-mac-gurmukhi' => 'x-mac-gurmukhi',\n        'armscii-8' => 'armscii-8',\n        'x-viet-tcvn5712' => 'x-viet-tcvn5712',\n        'x-viet-vps' => 'x-viet-vps',\n        'iso-10646-ucs-2' => 'UTF-16BE',\n        'x-iso-10646-ucs-2-be' => 'UTF-16BE',\n        'x-iso-10646-ucs-2-le' => 'UTF-16LE',\n        'x-user-defined' => 'x-user-defined',\n        'x-johab' => 'x-johab',\n        'latin1' => 'ISO-8859-1',\n        'iso_8859-1' => 'ISO-8859-1',\n        'iso8859-1' => 'ISO-8859-1',\n        'iso8859-2' => 'ISO-8859-2',\n        'iso8859-3' => 'ISO-8859-3',\n        'iso8859-4' => 'ISO-8859-4',\n        'iso8859-5' => 'ISO-8859-5',\n        'iso8859-6' => 'ISO-8859-6',\n        'iso8859-7' => 'ISO-8859-7',\n        'iso8859-8' => 'ISO-8859-8',\n        'iso8859-9' => 'ISO-8859-9',\n        'iso8859-10' => 'ISO-8859-10',\n        'iso8859-11' => 'ISO-8859-11',\n        'iso8859-13' => 'ISO-8859-13',\n        'iso8859-14' => 'ISO-8859-14',\n        'iso8859-15' => 'ISO-8859-15',\n        'iso_8859-1:1987' => 'ISO-8859-1',\n        'iso-ir-100' => 'ISO-8859-1',\n        'l1' => 'ISO-8859-1',\n        'ibm819' => 'ISO-8859-1',\n        'cp819' => 'ISO-8859-1',\n        'csisolatin1' => 'ISO-8859-1',\n        'latin2' => 'ISO-8859-2',\n        'iso_8859-2' => 'ISO-8859-2',\n        'iso_8859-2:1987' => 'ISO-8859-2',\n        'iso-ir-101' => 'ISO-8859-2',\n        'l2' => 'ISO-8859-2',\n        'csisolatin2' => 'ISO-8859-2',\n        'latin3' => 'ISO-8859-3',\n        'iso_8859-3' => 'ISO-8859-3',\n        'iso_8859-3:1988' => 'ISO-8859-3',\n        'iso-ir-109' => 'ISO-8859-3',\n        'l3' => 'ISO-8859-3',\n        'csisolatin3' => 'ISO-8859-3',\n        'latin4' => 'ISO-8859-4',\n        'iso_8859-4' => 'ISO-8859-4',\n        'iso_8859-4:1988' => 'ISO-8859-4',\n        'iso-ir-110' => 'ISO-8859-4',\n        'l4' => 'ISO-8859-4',\n        'csisolatin4' => 'ISO-8859-4',\n        'cyrillic' => 'ISO-8859-5',\n        'iso_8859-5' => 'ISO-8859-5',\n        'iso_8859-5:1988' => 'ISO-8859-5',\n        'iso-ir-144' => 'ISO-8859-5',\n        'csisolatincyrillic' => 'ISO-8859-5',\n        'arabic' => 'ISO-8859-6',\n        'iso_8859-6' => 'ISO-8859-6',\n        'iso_8859-6:1987' => 'ISO-8859-6',\n        'iso-ir-127' => 'ISO-8859-6',\n        'ecma-114' => 'ISO-8859-6',\n        'asmo-708' => 'ISO-8859-6',\n        'csisolatinarabic' => 'ISO-8859-6',\n        'csiso88596i' => 'ISO-8859-6-I',\n        'csiso88596e' => 'ISO-8859-6-E',\n        'greek' => 'ISO-8859-7',\n        'greek8' => 'ISO-8859-7',\n        'sun_eu_greek' => 'ISO-8859-7',\n        'iso_8859-7' => 'ISO-8859-7',\n        'iso_8859-7:1987' => 'ISO-8859-7',\n        'iso-ir-126' => 'ISO-8859-7',\n        'elot_928' => 'ISO-8859-7',\n        'ecma-118' => 'ISO-8859-7',\n        'csisolatingreek' => 'ISO-8859-7',\n        'hebrew' => 'ISO-8859-8',\n        'iso_8859-8' => 'ISO-8859-8',\n        'visual' => 'ISO-8859-8',\n        'iso_8859-8:1988' => 'ISO-8859-8',\n        'iso-ir-138' => 'ISO-8859-8',\n        'csisolatinhebrew' => 'ISO-8859-8',\n        'csiso88598i' => 'ISO-8859-8-I',\n        'iso-8859-8i' => 'ISO-8859-8-I',\n        'logical' => 'ISO-8859-8-I',\n        'csiso88598e' => 'ISO-8859-8-E',\n        'latin5' => 'ISO-8859-9',\n        'iso_8859-9' => 'ISO-8859-9',\n        'iso_8859-9:1989' => 'ISO-8859-9',\n        'iso-ir-148' => 'ISO-8859-9',\n        'l5' => 'ISO-8859-9',\n        'csisolatin5' => 'ISO-8859-9',\n        'unicode-1-1-utf-8' => 'UTF-8',\n        'utf8' => 'UTF-8',\n        'x-sjis' => 'Shift_JIS',\n        'shift-jis' => 'Shift_JIS',\n        'ms_kanji' => 'Shift_JIS',\n        'csshiftjis' => 'Shift_JIS',\n        'windows-31j' => 'Shift_JIS',\n        'cp932' => 'Shift_JIS',\n        'sjis' => 'Shift_JIS',\n        'cseucpkdfmtjapanese' => 'EUC-JP',\n        'x-euc-jp' => 'EUC-JP',\n        'csiso2022jp' => 'ISO-2022-JP',\n        'iso-2022-jp-2' => 'ISO-2022-JP',\n        'csiso2022jp2' => 'ISO-2022-JP',\n        'csbig5' => 'Big5',\n        'cn-big5' => 'Big5',\n        'x-x-big5' => 'Big5',\n        'zh_tw-big5' => 'Big5',\n        'cseuckr' => 'EUC-KR',\n        'ks_c_5601-1987' => 'EUC-KR',\n        'iso-ir-149' => 'EUC-KR',\n        'ks_c_5601-1989' => 'EUC-KR',\n        'ksc_5601' => 'EUC-KR',\n        'ksc5601' => 'EUC-KR',\n        'korean' => 'EUC-KR',\n        'csksc56011987' => 'EUC-KR',\n        '5601' => 'EUC-KR',\n        'windows-949' => 'EUC-KR',\n        'gb_2312-80' => 'GB2312',\n        'iso-ir-58' => 'GB2312',\n        'chinese' => 'GB2312',\n        'csiso58gb231280' => 'GB2312',\n        'csgb2312' => 'GB2312',\n        'zh_cn.euc' => 'GB2312',\n        'gb_2312' => 'GB2312',\n        'x-cp1250' => 'windows-1250',\n        'x-cp1251' => 'windows-1251',\n        'x-cp1252' => 'windows-1252',\n        'x-cp1253' => 'windows-1253',\n        'x-cp1254' => 'windows-1254',\n        'x-cp1255' => 'windows-1255',\n        'x-cp1256' => 'windows-1256',\n        'x-cp1257' => 'windows-1257',\n        'x-cp1258' => 'windows-1258',\n        'windows-874' => 'windows-874',\n        'ibm874' => 'windows-874',\n        'dos-874' => 'windows-874',\n        'macintosh' => 'macintosh',\n        'x-mac-roman' => 'macintosh',\n        'mac' => 'macintosh',\n        'csmacintosh' => 'macintosh',\n        'cp866' => 'IBM866',\n        'cp-866' => 'IBM866',\n        '866' => 'IBM866',\n        'csibm866' => 'IBM866',\n        'cp850' => 'IBM850',\n        '850' => 'IBM850',\n        'csibm850' => 'IBM850',\n        'cp852' => 'IBM852',\n        '852' => 'IBM852',\n        'csibm852' => 'IBM852',\n        'cp855' => 'IBM855',\n        '855' => 'IBM855',\n        'csibm855' => 'IBM855',\n        'cp857' => 'IBM857',\n        '857' => 'IBM857',\n        'csibm857' => 'IBM857',\n        'cp862' => 'IBM862',\n        '862' => 'IBM862',\n        'csibm862' => 'IBM862',\n        'cp864' => 'IBM864',\n        '864' => 'IBM864',\n        'csibm864' => 'IBM864',\n        'ibm-864' => 'IBM864',\n        't.61' => 'T.61-8bit',\n        'iso-ir-103' => 'T.61-8bit',\n        'csiso103t618bit' => 'T.61-8bit',\n        'x-unicode-2-0-utf-7' => 'UTF-7',\n        'unicode-2-0-utf-7' => 'UTF-7',\n        'unicode-1-1-utf-7' => 'UTF-7',\n        'csunicode11utf7' => 'UTF-7',\n        'csunicode' => 'UTF-16BE',\n        'csunicode11' => 'UTF-16BE',\n        'iso-10646-ucs-basic' => 'UTF-16BE',\n        'csunicodeascii' => 'UTF-16BE',\n        'iso-10646-unicode-latin1' => 'UTF-16BE',\n        'csunicodelatin1' => 'UTF-16BE',\n        'iso-10646' => 'UTF-16BE',\n        'iso-10646-j-1' => 'UTF-16BE',\n        'latin6' => 'ISO-8859-10',\n        'iso-ir-157' => 'ISO-8859-10',\n        'l6' => 'ISO-8859-10',\n        'csisolatin6' => 'ISO-8859-10',\n        'iso_8859-15' => 'ISO-8859-15',\n        'csisolatin9' => 'ISO-8859-15',\n        'l9' => 'ISO-8859-15',\n        'ecma-cyrillic' => 'ISO-IR-111',\n        'csiso111ecmacyrillic' => 'ISO-IR-111',\n        'csiso2022kr' => 'ISO-2022-KR',\n        'csviscii' => 'VISCII',\n        'zh_tw-euc' => 'x-euc-tw',\n        'iso88591' => 'ISO-8859-1',\n        'iso88592' => 'ISO-8859-2',\n        'iso88593' => 'ISO-8859-3',\n        'iso88594' => 'ISO-8859-4',\n        'iso88595' => 'ISO-8859-5',\n        'iso88596' => 'ISO-8859-6',\n        'iso88597' => 'ISO-8859-7',\n        'iso88598' => 'ISO-8859-8',\n        'iso88599' => 'ISO-8859-9',\n        'iso885910' => 'ISO-8859-10',\n        'iso885911' => 'ISO-8859-11',\n        'iso885912' => 'ISO-8859-12',\n        'iso885913' => 'ISO-8859-13',\n        'iso885914' => 'ISO-8859-14',\n        'iso885915' => 'ISO-8859-15',\n        'tis620' => 'TIS-620',\n        'cp1250' => 'windows-1250',\n        'cp1251' => 'windows-1251',\n        'cp1252' => 'windows-1252',\n        'cp1253' => 'windows-1253',\n        'cp1254' => 'windows-1254',\n        'cp1255' => 'windows-1255',\n        'cp1256' => 'windows-1256',\n        'cp1257' => 'windows-1257',\n        'cp1258' => 'windows-1258',\n        'x-gbk' => 'gbk',\n        'windows-936' => 'gbk',\n        'ansi-1251' => 'windows-1251',\n    ];\n\n    /**\n     * Decode the string from charset.\n     *\n     * @param  string  $encodedString\n     * @param  string  $charset\n     * @return string\n     */\n    public function decodeCharset($encodedString, $charset)\n    {\n        if (strtolower($charset) == 'utf-8' || strtolower($charset) == 'us-ascii') {\n            return $encodedString;\n        }\n\n        try {\n            return iconv($this->getCharsetAlias($charset), 'UTF-8//TRANSLIT', $encodedString);\n        } catch (\\Exception $e) {\n            return iconv($this->getCharsetAlias($charset), 'UTF-8//IGNORE', $encodedString);\n        }\n    }\n\n    /**\n     * Get charset alias.\n     *\n     * @param  string  $charset.\n     * @return string\n     */\n    public function getCharsetAlias($charset)\n    {\n        $charset = strtolower($charset);\n\n        if (array_key_exists($charset, $this->charsetAlias)) {\n            return $this->charsetAlias[$charset];\n        }\n\n        return null;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Helpers/Contracts/CharsetManager.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Helpers\\Contracts;\n\ninterface CharsetManager\n{\n    /**\n     * Decode the string from Charset.\n     *\n     * @return string\n     */\n    public function decodeCharset($encodedString, $charset);\n\n    /**\n     * Get charset alias.\n     *\n     * @return string\n     */\n    public function getCharsetAlias($charset);\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Helpers/HtmlFilter.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Helpers;\n\nclass HtmlFilter\n{\n    /**\n     * Tag print.\n     *\n     * @param  string  $tagname\n     * @param  array  $attary\n     * @param  int  $tagtype\n     * @return string\n     */\n    public function tln_tagprint($tagname, $attary, $tagtype)\n    {\n        if ($tagtype == 2) {\n            $fulltag = '</'.$tagname.'>';\n        } else {\n            $fulltag = '<'.$tagname;\n\n            if (is_array($attary) && count($attary)) {\n                $atts = [];\n\n                foreach ($attary as $attname => $attvalue) {\n                    array_push($atts, \"$attname=$attvalue\");\n                }\n\n                $fulltag .= ' '.implode(' ', $atts);\n            }\n\n            if ($tagtype == 3) {\n                $fulltag .= ' /';\n            }\n\n            $fulltag .= '>';\n        }\n\n        return $fulltag;\n    }\n\n    /**\n     * A small helper function to use with array_walk. Modifies a by-ref\n     * value and makes it lowercase.\n     *\n     * @param  string  $val\n     * @return void\n     */\n    public function tln_casenormalize(&$val)\n    {\n        $val = strtolower($val);\n    }\n\n    /**\n     * This function skips any whitespace from the current position within\n     * a string and to the next non-whitespace value.\n     *\n     * @param  string  $body\n     * @param  int  $offset\n     * @return int\n     */\n    public function tln_skipspace($body, $offset)\n    {\n        preg_match('/^(\\s*)/s', substr($body, $offset), $matches);\n\n        try {\n            if (! empty($matches[1])) {\n                $count = strlen($matches[1]);\n                $offset += $count;\n            }\n        } catch (\\Exception $e) {\n        }\n\n        return $offset;\n    }\n\n    /**\n     * This function looks for the next character within a string.  It's\n     * really just a glorified \"strpos\", except it catches the failures\n     * nicely.\n     *\n     * @param  string  $body\n     * @param  int  $offset\n     * @param  string  $needle\n     * @return int\n     */\n    public function tln_findnxstr($body, $offset, $needle)\n    {\n        $pos = strpos($body, $needle, $offset);\n\n        if ($pos === false) {\n            $pos = strlen($body);\n        }\n\n        return $pos;\n    }\n\n    /**\n     * This function takes a PCRE-style regexp and tries to match it\n     * within the string.\n     *\n     * @param  string  $body\n     * @param  int  $offset\n     * @param  string  $reg\n     * @return array|bool\n     */\n    public function tln_findnxreg($body, $offset, $reg)\n    {\n        $matches = $retarr = [];\n\n        $preg_rule = '%^(.*?)('.$reg.')%s';\n\n        preg_match($preg_rule, substr($body, $offset), $matches);\n\n        if (! isset($matches[0]) || ! $matches[0]) {\n            $retarr = false;\n        } else {\n            $retarr[0] = $offset + strlen($matches[1]);\n\n            $retarr[1] = $matches[1];\n\n            $retarr[2] = $matches[2];\n        }\n\n        return $retarr;\n    }\n\n    /**\n     * This function looks for the next tag.\n     *\n     * @param  string  $body\n     * @param  int  $offset\n     * @return array|bool\n     */\n    public function tln_getnxtag($body, $offset)\n    {\n        if ($offset > strlen($body)) {\n            return false;\n        }\n\n        $lt = $this->tln_findnxstr($body, $offset, '<');\n\n        if ($lt == strlen($body)) {\n            return false;\n        }\n\n        /**\n         * We are here:\n         * blah blah <tag attribute=\"value\">\n         * \\---------^\n         */\n        $pos = $this->tln_skipspace($body, $lt + 1);\n\n        if ($pos >= strlen($body)) {\n            return [false, false, false, $lt, strlen($body)];\n        }\n\n        /**\n         * There are 3 kinds of tags:\n         * 1. Opening tag, e.g.:\n         *    <a href=\"blah\">\n         * 2. Closing tag, e.g.:\n         *    </a>\n         * 3. XHTML-style content-less tag, e.g.:\n         *    <img src=\"blah\"/>\n         */\n        switch (substr($body, $pos, 1)) {\n            case '/':\n                $tagtype = 2;\n\n                $pos++;\n                break;\n\n            case '!':\n                /**\n                 * A comment or an SGML declaration.\n                 */\n                if (substr($body, $pos + 1, 2) == '--') {\n                    $gt = strpos($body, '-->', $pos);\n\n                    if ($gt === false) {\n                        $gt = strlen($body);\n                    } else {\n                        $gt += 2;\n                    }\n\n                    return [false, false, false, $lt, $gt];\n                } else {\n                    $gt = $this->tln_findnxstr($body, $pos, '>');\n\n                    return [false, false, false, $lt, $gt];\n                }\n                break;\n\n            default:\n                $tagtype = 1;\n                break;\n\n        }\n\n        /**\n         * Look for next [\\W-_], which will indicate the end of the tag name.\n         */\n        $regary = $this->tln_findnxreg($body, $pos, '[^\\w\\-_]');\n\n        if ($regary == false) {\n            return [false, false, false, $lt, strlen($body)];\n        }\n\n        [$pos, $tagname, $match] = $regary;\n\n        $tagname = strtolower($tagname);\n\n        /**\n         * $match can be either of these:\n         * '>'  indicating the end of the tag entirely.\n         * '\\s' indicating the end of the tag name.\n         * '/'  indicating that this is type-3 xhtml tag.\n         *\n         * Whatever else we find there indicates an invalid tag.\n         */\n        switch ($match) {\n            case '/':\n                /**\n                 * This is an xhtml-style tag with a closing / at the\n                 * end, like so: <img src=\"blah\"/>. Check if it's followed\n                 * by the closing bracket. If not, then this tag is invalid\n                 */\n                if (substr($body, $pos, 2) == '/>') {\n                    $pos++;\n\n                    $tagtype = 3;\n                } else {\n                    $gt = $this->tln_findnxstr($body, $pos, '>');\n\n                    $retary = [false, false, false, $lt, $gt];\n\n                    return $retary;\n                }\n\n                // intentional fall-through\n            case '>':\n                return [$tagname, false, $tagtype, $lt, $pos];\n\n            default:\n                /**\n                 * Check if it's whitespace.\n                 */\n                if (! preg_match('/\\s/', $match)) {\n                    /**\n                     * This is an invalid tag! Look for the next closing \">\".\n                     */\n                    $gt = $this->tln_findnxstr($body, $lt, '>');\n\n                    return [false, false, false, $lt, $gt];\n                }\n\n                break;\n        }\n\n        /**\n         * At this point we're here:\n         * <tagname  attribute='blah'>\n         * \\-------^\n         *\n         * At this point we loop in order to find all attributes.\n         */\n        $attary = [];\n\n        while ($pos <= strlen($body)) {\n            $pos = $this->tln_skipspace($body, $pos);\n\n            if ($pos == strlen($body)) {\n                /**\n                 * Non-closed tag.\n                 */\n                return [false, false, false, $lt, $pos];\n            }\n\n            /**\n             * See if we arrived at a \">\" or \"/>\", which means that we reached\n             * the end of the tag.\n             */\n            $matches = [];\n\n            if (preg_match('%^(\\s*)(>|/>)%s', substr($body, $pos), $matches)) {\n                /**\n                 * Yep. So we did.\n                 */\n                $pos += strlen($matches[1]);\n\n                if ($matches[2] == '/>') {\n                    $tagtype = 3;\n\n                    $pos++;\n                }\n\n                return [$tagname, $attary, $tagtype, $lt, $pos];\n            }\n\n            /**\n             * There are several types of attributes, with optional\n             * [:space:] between members.\n             * Type 1:\n             *   attrname[:space:]=[:space:]'CDATA'\n             * Type 2:\n             *   attrname[:space:]=[:space:]\"CDATA\"\n             * Type 3:\n             *   attr[:space:]=[:space:]CDATA\n             * Type 4:\n             *   attrname\n             *\n             * We leave types 1 and 2 the same, type 3 we check for\n             * '\"' and convert to \"&quot\" if needed, then wrap in\n             * double quotes. Type 4 we convert into:\n             * attrname=\"yes\".\n             */\n            $regary = $this->tln_findnxreg($body, $pos, '[^\\w\\-_]');\n\n            if ($regary == false) {\n                /**\n                 * Looks like body ended before the end of tag.\n                 */\n                return [false, false, false, $lt, strlen($body)];\n            }\n\n            [$pos, $attname, $match] = $regary;\n\n            $attname = strtolower($attname);\n\n            /**\n             * We arrived at the end of attribute name. Several things possible\n             * here:\n             * '>'  means the end of the tag and this is attribute type 4\n             * '/'  if followed by '>' means the same thing as above\n             * '\\s' means a lot of things -- look what it's followed by.\n             *      anything else means the attribute is invalid.\n             */\n            switch ($match) {\n                case '/':\n                    /**\n                     * This is an xhtml-style tag with a closing / at the\n                     * end, like so: <img src=\"blah\"/>. Check if it's followed\n                     * by the closing bracket. If not, then this tag is invalid\n                     */\n                    if (substr($body, $pos, 2) == '/>') {\n                        $pos++;\n                        $tagtype = 3;\n                    } else {\n                        $gt = $this->tln_findnxstr($body, $pos, '>');\n                        $retary = [false, false, false, $lt, $gt];\n\n                        return $retary;\n                    }\n\n                    // intentional fall-through\n                case '>':\n                    $attary[$attname] = '\"yes\"';\n\n                    return [$tagname, $attary, $tagtype, $lt, $pos];\n                    break;\n\n                default:\n                    /**\n                     * Skip whitespace and see what we arrive at.\n                     */\n                    $pos = $this->tln_skipspace($body, $pos);\n\n                    $char = substr($body, $pos, 1);\n                    /**\n                     * Two things are valid here:\n                     * '=' means this is attribute type 1 2 or 3.\n                     * \\w means this was attribute type 4.\n                     * anything else we ignore and re-loop. End of tag and\n                     * invalid stuff will be caught by our checks at the beginning\n                     * of the loop.\n                     */\n                    if ($char == '=') {\n                        $pos++;\n\n                        $pos = $this->tln_skipspace($body, $pos);\n                        /**\n                         * Here are 3 possibilities:\n                         * \"'\"  attribute type 1\n                         * '\"'  attribute type 2\n                         * everything else is the content of tag type 3\n                         */\n                        $quot = substr($body, $pos, 1);\n\n                        if ($quot == '\\'') {\n                            $regary = $this->tln_findnxreg($body, $pos + 1, '\\'');\n\n                            if ($regary == false) {\n                                return [false, false, false, $lt, strlen($body)];\n                            }\n\n                            [$pos, $attval, $match] = $regary;\n\n                            $pos++;\n\n                            $attary[$attname] = '\\''.$attval.'\\'';\n                        } elseif ($quot == '\"') {\n                            $regary = $this->tln_findnxreg($body, $pos + 1, '\\\"');\n\n                            if ($regary == false) {\n                                return [false, false, false, $lt, strlen($body)];\n                            }\n\n                            [$pos, $attval, $match] = $regary;\n\n                            $pos++;\n\n                            $attary[$attname] = '\"'.$attval.'\"';\n                        } else {\n                            /**\n                             * These are hateful. Look for \\s, or >.\n                             */\n                            $regary = $this->tln_findnxreg($body, $pos, '[\\s>]');\n\n                            if ($regary == false) {\n                                return [false, false, false, $lt, strlen($body)];\n                            }\n\n                            [$pos, $attval, $match] = $regary;\n\n                            $attval = preg_replace('/\\\"/s', '&quot;', $attval);\n\n                            $attary[$attname] = '\"'.$attval.'\"';\n                        }\n                    } elseif (preg_match('|[\\w/>]|', $char)) {\n                        $attary[$attname] = '\"yes\"';\n                    } else {\n                        $gt = $this->tln_findnxstr($body, $pos, '>');\n\n                        return [false, false, false, $lt, $gt];\n                    }\n                    break;\n            }\n        }\n\n        /**\n         * The fact that we got here indicates that the tag end was never\n         * found. Return invalid tag indication so it gets stripped.\n         */\n        return [false, false, false, $lt, strlen($body)];\n    }\n\n    /**\n     * Translates entities into literal values so they can be checked.\n     *\n     * @param  string  $attvalue\n     * @param  string  $regex\n     * @param  bool  $hex\n     * @return bool\n     */\n    public function tln_deent(&$attvalue, $regex, $hex = false)\n    {\n        preg_match_all($regex, $attvalue, $matches);\n\n        if (is_array($matches) && count($matches[0]) > 0) {\n            $repl = [];\n\n            for ($i = 0; $i < count($matches[0]); $i++) {\n                $numval = $matches[1][$i];\n\n                if ($hex) {\n                    $numval = hexdec($numval);\n                }\n\n                $repl[$matches[0][$i]] = chr($numval);\n            }\n\n            $attvalue = strtr($attvalue, $repl);\n\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * This function checks attribute values for entity-encoded values\n     * and returns them translated into 8-bit strings so we can run\n     * checks on them.\n     *\n     * @param  string  $attvalue\n     * @return void\n     */\n    public function tln_defang(&$attvalue)\n    {\n        /**\n         * Skip this if there aren't ampersands or backslashes.\n         */\n        if (strpos($attvalue, '&') === false\n            && strpos($attvalue, '\\\\') === false\n        ) {\n            return;\n        }\n\n        do {\n            $m = false;\n            $m = $m || $this->tln_deent($attvalue, '/\\&#0*(\\d+);*/s');\n            $m = $m || $this->tln_deent($attvalue, '/\\&#x0*((\\d|[a-f])+);*/si', true);\n            $m = $m || $this->tln_deent($attvalue, '/\\\\\\\\(\\d+)/s', true);\n        } while ($m == true);\n\n        $attvalue = stripslashes($attvalue);\n    }\n\n    /**\n     * Kill any tabs, newlines, or carriage returns. Our friends the\n     * makers of the browser with 95% market value decided that it'd\n     * be funny to make \"java[tab]script\" be just as good as \"javascript\".\n     *\n     * @param  string  $attvalue\n     * @return void\n     */\n    public function tln_unspace(&$attvalue)\n    {\n        if (strcspn($attvalue, \"\\t\\r\\n\\0 \") != strlen($attvalue)) {\n            $attvalue = str_replace(\n                [\"\\t\", \"\\r\", \"\\n\", \"\\0\", ' '],\n                ['', '', '', '', ''],\n                $attvalue\n            );\n        }\n    }\n\n    /**\n     * This function runs various checks against the attributes.\n     *\n     * @param  string  $tagname\n     * @param  array  $attary\n     * @param  array  $rm_attnames\n     * @param  array  $bad_attvals\n     * @param  array  $add_attr_to_tag\n     * @param  string  $trans_image_path\n     * @param  bool  $block_external_images\n     * @return array with modified attributes.\n     */\n    public function tln_fixatts(\n        $tagname,\n        $attary,\n        $rm_attnames,\n        $bad_attvals,\n        $add_attr_to_tag,\n        $trans_image_path,\n        $block_external_images\n    ) {\n        /**\n         * Convert to array if is not.\n         */\n        $attary = is_array($attary) ? $attary : [];\n\n        foreach ($attary as $attname => $attvalue) {\n            /**\n             * See if this attribute should be removed.\n             */\n            foreach ($rm_attnames as $matchtag => $matchattrs) {\n                if (preg_match($matchtag, $tagname)) {\n                    foreach ($matchattrs as $matchattr) {\n                        if (preg_match($matchattr, $attname)) {\n                            unset($attary[$attname]);\n\n                            continue 2;\n                        }\n                    }\n                }\n            }\n\n            $this->tln_defang($attvalue);\n\n            $this->tln_unspace($attvalue);\n\n            /**\n             * Now let's run checks on the attvalues.\n             * I don't expect anyone to comprehend this. If you do,\n             * get in touch with me so I can drive to where you live and\n             * shake your hand personally. :)\n             */\n            foreach ($bad_attvals as $matchtag => $matchattrs) {\n                if (preg_match($matchtag, $tagname)) {\n                    foreach ($matchattrs as $matchattr => $valary) {\n                        if (preg_match($matchattr, $attname)) {\n                            [$valmatch, $valrepl] = $valary;\n\n                            $newvalue = preg_replace($valmatch, $valrepl, $attvalue);\n\n                            if ($newvalue != $attvalue) {\n                                $attary[$attname] = $newvalue;\n                                $attvalue = $newvalue;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        /**\n         * See if we need to append any attributes to this tag.\n         */\n        foreach ($add_attr_to_tag as $matchtag => $addattary) {\n            if (preg_match($matchtag, $tagname)) {\n                $attary = array_merge($attary, $addattary);\n            }\n        }\n\n        return $attary;\n    }\n\n    /**\n     * Fix url.\n     *\n     * @return void\n     */\n    public function tln_fixurl($attname, &$attvalue, $trans_image_path, $block_external_images)\n    {\n        $sQuote = '\"';\n\n        $attvalue = trim($attvalue);\n\n        if ($attvalue && ($attvalue[0] == '\"' || $attvalue[0] == \"'\")) {\n            // remove the double quotes\n            $sQuote = $attvalue[0];\n\n            $attvalue = trim(substr($attvalue, 1, -1));\n        }\n\n        /**\n         * Replace empty src tags with the blank image.  src is only used\n         * for frames, images, and image inputs.  Doing a replace should\n         * not affect them working as should be, however it will stop\n         * IE from being kicked off when src for img tags are not set.\n         */\n        if ($attvalue == '') {\n            $attvalue = $sQuote.$trans_image_path.$sQuote;\n        } else {\n            // first, disallow 8 bit characters and control characters\n            if (preg_match('/[\\0-\\37\\200-\\377]+/', $attvalue)) {\n                switch ($attname) {\n                    case 'href':\n                        $attvalue = $sQuote.'http://invalid-stuff-detected.example.com'.$sQuote;\n                        break;\n\n                    default:\n                        $attvalue = $sQuote.$trans_image_path.$sQuote;\n                        break;\n\n                }\n            } else {\n                $aUrl = parse_url($attvalue);\n\n                if (isset($aUrl['scheme'])) {\n                    switch (strtolower($aUrl['scheme'])) {\n                        case 'mailto':\n                        case 'http':\n                        case 'https':\n                        case 'ftp':\n                            if ($attname != 'href') {\n                                if ($block_external_images == true) {\n                                    $attvalue = $sQuote.$trans_image_path.$sQuote;\n                                } else {\n                                    if (! isset($aUrl['path'])) {\n                                        $attvalue = $sQuote.$trans_image_path.$sQuote;\n                                    }\n                                }\n                            } else {\n                                $attvalue = $sQuote.$attvalue.$sQuote;\n                            }\n                            break;\n\n                        case 'outbind':\n                            $attvalue = $sQuote.$attvalue.$sQuote;\n                            break;\n\n                        case 'cid':\n                            $attvalue = $sQuote.$attvalue.$sQuote;\n                            break;\n\n                        default:\n                            $attvalue = $sQuote.$trans_image_path.$sQuote;\n                            break;\n                    }\n                } else {\n                    if (! isset($aUrl['path']) || $aUrl['path'] != $trans_image_path) {\n                        $$attvalue = $sQuote.$trans_image_path.$sQuote;\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Fix style.\n     *\n     * @return void\n     */\n    public function tln_fixstyle($body, $pos, $trans_image_path, $block_external_images)\n    {\n        $me = 'tln_fixstyle';\n\n        $content = '';\n\n        $sToken = '';\n\n        $bSucces = false;\n\n        $bEndTag = false;\n\n        for ($i = $pos,$iCount = strlen($body); $i < $iCount; $i++) {\n            $char = $body[$i];\n\n            switch ($char) {\n                case '<':\n                    $sToken = $char;\n                    break;\n                case '/':\n                    if ($sToken == '<') {\n                        $sToken .= $char;\n\n                        $bEndTag = true;\n                    } else {\n                        $content .= $char;\n                    }\n\n                    break;\n\n                case '>':\n                    if ($bEndTag) {\n                        $sToken .= $char;\n\n                        if (preg_match('/\\<\\/\\s*style\\s*\\>/i', $sToken, $aMatch)) {\n                            $newpos = $i + 1;\n\n                            $bSucces = true;\n\n                            break 2;\n\n                        } else {\n                            $content .= $sToken;\n                        }\n\n                        $bEndTag = false;\n                    } else {\n                        $content .= $char;\n                    }\n                    break;\n                case '!':\n                    if ($sToken == '<') {\n                        if (isset($body[$i + 2]) && substr($body, $i, 3) == '!--') {\n                            $i = strpos($body, '-->', $i + 3);\n\n                            if (! $i) {\n                                $i = strlen($body);\n                            }\n\n                            $sToken = '';\n                        }\n                    } else {\n                        $content .= $char;\n                    }\n                    break;\n                default:\n                    if ($bEndTag) {\n                        $sToken .= $char;\n                    } else {\n                        $content .= $char;\n                    }\n                    break;\n            }\n        }\n\n        if (! $bSucces) {\n            return [false, strlen($body)];\n        }\n\n        /**\n         * First look for general BODY style declaration, which would be\n         * like so:\n         * body {background: blah-blah}\n         * and change it to .bodyclass so we can just assign it to a <div>\n         */\n        $content = preg_replace(\"|body(\\s*\\{.*?\\})|si\", '.bodyclass\\\\1', $content);\n\n        $trans_image_path = $trans_image_path;\n\n        // first check for 8bit sequences and disallowed control characters\n        if (preg_match('/[\\16-\\37\\200-\\377]+/', $content)) {\n            $content = '<!-- style block removed by html filter due to presence of 8bit characters -->';\n\n            return [$content, $newpos];\n        }\n\n        // remove @import line\n        $content = preg_replace(\"/^\\s*(@import.*)$/mi\", \"\\n<!-- @import rules forbidden -->\\n\", $content);\n\n        $content = preg_replace('/(\\\\\\\\)?u(\\\\\\\\)?r(\\\\\\\\)?l(\\\\\\\\)?/i', 'url', $content);\n\n        preg_match_all(\"/url\\s*\\((.+)\\)/si\", $content, $aMatch);\n\n        if (count($aMatch)) {\n            $aValue = $aReplace = [];\n\n            foreach ($aMatch[1] as $sMatch) {\n                $urlvalue = $sMatch;\n                $this->tln_fixurl('style', $urlvalue, $trans_image_path, $block_external_images);\n                $aValue[] = $sMatch;\n                $aReplace[] = $urlvalue;\n            }\n\n            $content = str_replace($aValue, $aReplace, $content);\n        }\n\n        /**\n         * Remove any backslashes, entities, and extraneous whitespace.\n         */\n        $contentTemp = $content;\n        $this->tln_defang($contentTemp);\n        $this->tln_unspace($contentTemp);\n\n        $match = ['/\\/\\*.*\\*\\//',\n            '/expression/i',\n            '/behaviou*r/i',\n            '/binding/i',\n            '/include-source/i',\n            '/javascript/i',\n            '/script/i',\n            '/position/i'];\n\n        $replace = ['', 'idiocy', 'idiocy', 'idiocy', 'idiocy', 'idiocy', 'idiocy', ''];\n\n        $contentNew = preg_replace($match, $replace, $contentTemp);\n\n        if ($contentNew !== $contentTemp) {\n            $content = $contentNew;\n        }\n\n        return [$content, $newpos];\n    }\n\n    /**\n     * Body to div.\n     *\n     * @return void\n     */\n    public function tln_body2div($attary, $trans_image_path)\n    {\n        $me = 'tln_body2div';\n\n        $divattary = ['class' => \"'bodyclass'\"];\n\n        $has_bgc_stl = $has_txt_stl = false;\n\n        $styledef = '';\n\n        if (is_array($attary) && count($attary) > 0) {\n            foreach ($attary as $attname => $attvalue) {\n                $quotchar = substr($attvalue, 0, 1);\n\n                $attvalue = str_replace($quotchar, '', $attvalue);\n\n                switch ($attname) {\n                    case 'background':\n                        $styledef .= \"background-image: url('$trans_image_path'); \";\n                        break;\n\n                    case 'bgcolor':\n                        $has_bgc_stl = true;\n\n                        $styledef .= \"background-color: $attvalue; \";\n                        break;\n\n                    case 'text':\n                        $has_txt_stl = true;\n\n                        $styledef .= \"color: $attvalue; \";\n                        break;\n\n                }\n            }\n\n            // Outlook defines a white bgcolor and no text color. This can lead to white text on a white bg with certain themes.\n            if ($has_bgc_stl && ! $has_txt_stl) {\n                $styledef .= 'color: #000000; ';\n            }\n\n            if (strlen($styledef) > 0) {\n                $divattary['style'] = \"\\\"$styledef\\\"\";\n            }\n        }\n\n        return $divattary;\n    }\n\n    /**\n     * Sanitize.\n     *\n     * @param  string  $body\n     * @param  array  $tag_list\n     * @param  array  $rm_tags_with_content\n     * @param  array  $self_closing_tags\n     * @param  bool  $force_tag_closing\n     * @param  array  $rm_attnames\n     * @param  array  $bad_attvals\n     * @param  array  $add_attr_to_tag\n     * @param  string  $trans_image_path\n     * @param  bool  $block_external_images\n     * @return string\n     */\n    public function tln_sanitize(\n        $body,\n        $tag_list,\n        $rm_tags_with_content,\n        $self_closing_tags,\n        $force_tag_closing,\n        $rm_attnames,\n        $bad_attvals,\n        $add_attr_to_tag,\n        $trans_image_path,\n        $block_external_images\n    ) {\n        /**\n         * Normalize rm_tags and rm_tags_with_content.\n         */\n        $rm_tags = array_shift($tag_list);\n\n        @array_walk($tag_list, [$this, 'tln_casenormalize']);\n\n        @array_walk($rm_tags_with_content, [$this, 'tln_casenormalize']);\n\n        @array_walk($self_closing_tags, [$this, 'tln_casenormalize']);\n\n        /**\n         * See if tag_list is of tags to remove or tags to allow.\n         * false  means remove these tags\n         * true   means allow these tags\n         */\n        $curpos = 0;\n        $open_tags = [];\n        $trusted = '';\n        $skip_content = false;\n\n        /**\n         * Take care of netscape's stupid javascript entities like\n         * &{alert('boo')};\n         */\n        $body = preg_replace('/&(\\{.*?\\};)/si', '&amp;\\\\1', $body);\n\n        while (($curtag = $this->tln_getnxtag($body, $curpos)) != false) {\n            [$tagname, $attary, $tagtype, $lt, $gt] = $curtag;\n            $free_content = substr($body, $curpos, $lt - $curpos);\n\n            /**\n             * Take care of <style>.\n             */\n            if ($tagname == 'style' && $tagtype == 1) {\n                [$free_content, $curpos] =\n                    $this->tln_fixstyle($body, $gt + 1, $trans_image_path, $block_external_images);\n\n                if ($free_content != false) {\n                    if (! empty($attary)) {\n                        $attary = $this->tln_fixatts($tagname,\n                            $attary,\n                            $rm_attnames,\n                            $bad_attvals,\n                            $add_attr_to_tag,\n                            $trans_image_path,\n                            $block_external_images\n                        );\n                    }\n\n                    $trusted .= $this->tln_tagprint($tagname, $attary, $tagtype);\n\n                    if (isset($this->$free_content)) {\n                        $trusted .= $this->$free_content;\n                    }\n\n                    $trusted .= $this->tln_tagprint($tagname, false, 2);\n                }\n\n                continue;\n            }\n\n            if ($skip_content == false) {\n                $trusted .= $free_content;\n            }\n\n            if ($tagname != false) {\n                if ($tagtype == 2) {\n                    if ($skip_content == $tagname) {\n                        $tagname = false;\n\n                        $skip_content = false;\n                    } else {\n                        if ($skip_content == false) {\n                            if ($tagname == 'body') {\n                                $tagname = 'div';\n                            }\n\n                            if (isset($open_tags[$tagname]) &&\n                                $open_tags[$tagname] > 0\n                            ) {\n                                $open_tags[$tagname]--;\n                            } else {\n                                $tagname = false;\n                            }\n                        }\n                    }\n                } else {\n                    if (! $skip_content) {\n                        if (\n                            $tagtype == 1\n                            && in_array($tagname, $self_closing_tags)\n                        ) {\n                            $tagtype = 3;\n                        }\n\n                        /**\n                         * See if we should skip this tag and any content\n                         * inside it.\n                         */\n                        if (\n                            $tagtype == 1\n                            && in_array($tagname, $rm_tags_with_content)\n                        ) {\n                            $skip_content = $tagname;\n                        } else {\n                            if ((\n                                ! $rm_tags\n                                && in_array($tagname, $tag_list))\n                                || (\n                                    $rm_tags\n                                    && ! in_array($tagname, $tag_list)\n                                )\n                            ) {\n                                $tagname = false;\n                            } else {\n                                /**\n                                 * Convert body into div.\n                                 */\n                                if ($tagname == 'body') {\n                                    $tagname = 'div';\n                                    $attary = $this->tln_body2div($attary, $trans_image_path);\n                                }\n\n                                if ($tagtype == 1) {\n                                    if (isset($open_tags[$tagname])) {\n                                        $open_tags[$tagname]++;\n                                    } else {\n                                        $open_tags[$tagname] = 1;\n                                    }\n                                }\n\n                                /**\n                                 * This is where we run other checks.\n                                 */\n                                if (is_array($attary) && count($attary) > 0) {\n                                    $attary = $this->tln_fixatts(\n                                        $tagname,\n                                        $attary,\n                                        $rm_attnames,\n                                        $bad_attvals,\n                                        $add_attr_to_tag,\n                                        $trans_image_path,\n                                        $block_external_images\n                                    );\n                                }\n                            }\n                        }\n                    }\n                }\n\n                if ($tagname != false && $skip_content == false) {\n                    $trusted .= $this->tln_tagprint($tagname, $attary, $tagtype);\n                }\n            }\n\n            $curpos = $gt + 1;\n        }\n\n        $trusted .= substr($body, $curpos, strlen($body) - $curpos);\n\n        if ($force_tag_closing == true) {\n            foreach ($open_tags as $tagname => $opentimes) {\n                while ($opentimes > 0) {\n                    $trusted .= '</'.$tagname.'>';\n\n                    $opentimes--;\n                }\n            }\n            $trusted .= \"\\n\";\n        }\n\n        return $trusted;\n    }\n\n    /**\n     * HTML filter.\n     *\n     * @param  bool  $block_external_images\n     * @return void\n     */\n    public function process($body, $trans_image_path, $block_external_images = false)\n    {\n        $tag_list = [\n            false,\n            'object',\n            'meta',\n            'html',\n            'head',\n            'base',\n            'link',\n            'frame',\n            'iframe',\n            'plaintext',\n            'marquee',\n        ];\n\n        $rm_tags_with_content = [\n            'script',\n            'applet',\n            'embed',\n            'title',\n            'frameset',\n            'xmp',\n            'xml',\n        ];\n\n        $self_closing_tags = [\n            'img',\n            'br',\n            'hr',\n            'input',\n            'outbind',\n        ];\n\n        $force_tag_closing = true;\n\n        $rm_attnames = [\n            '/.*/' => [\n                '/^on.*/i',\n                '/^dynsrc/i',\n                '/^data.*/i',\n                '/^lowsrc.*/i',\n            ],\n        ];\n\n        $bad_attvals = [\n            '/.*/' => [\n                '/^src|background/i' => [\n                    [\n                        '/^([\\'\"])\\s*\\S+script\\s*:.*([\\'\"])/si',\n                        '/^([\\'\"])\\s*mocha\\s*:*.*([\\'\"])/si',\n                        '/^([\\'\"])\\s*about\\s*:.*([\\'\"])/si',\n                    ], [\n                        \"\\\\1$trans_image_path\\\\2\",\n                        \"\\\\1$trans_image_path\\\\2\",\n                        \"\\\\1$trans_image_path\\\\2\",\n                    ],\n                ],\n\n                '/^href|action/i' => [\n                    [\n                        '/^([\\'\"])\\s*\\S+script\\s*:.*([\\'\"])/si',\n                        '/^([\\'\"])\\s*mocha\\s*:*.*([\\'\"])/si',\n                        '/^([\\'\"])\\s*about\\s*:.*([\\'\"])/si',\n                    ], [\n                        '\\\\1#\\\\1',\n                        '\\\\1#\\\\1',\n                        '\\\\1#\\\\1',\n                    ],\n                ],\n            ],\n        ];\n\n        if ($block_external_images) {\n            array_push(\n                $bad_attvals['/.*/']['/^src|background/i'][0],\n                '/^([\\'\\\"])\\s*https*:.*([\\'\\\"])/si'\n            );\n\n            array_push(\n                $bad_attvals['/.*/']['/^src|background/i'][1],\n                \"\\\\1$trans_image_path\\\\1\"\n            );\n        }\n\n        $add_attr_to_tag = [\n            '/^a$/i' => ['target' => '\"_blank\"'],\n        ];\n\n        $trusted = $this->tln_sanitize(\n            $body,\n            $tag_list,\n            $rm_tags_with_content,\n            $self_closing_tags,\n            $force_tag_closing,\n            $rm_attnames,\n            $bad_attvals,\n            $add_attr_to_tag,\n            $trans_image_path,\n            $block_external_images\n        );\n\n        return $trusted;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Helpers/Parser.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Helpers;\n\nuse Webkul\\Email\\Helpers\\Contracts\\CharsetManager;\n\nclass Parser\n{\n    /**\n     * Resource.\n     */\n    public $resource;\n\n    /**\n     * A file pointer to email.\n     */\n    public $stream;\n\n    /**\n     * Data.\n     */\n    public $data;\n\n    /**\n     * Container.\n     */\n    public $container;\n\n    /**\n     * Entity.\n     */\n    public $entity;\n\n    /**\n     * Files.\n     */\n    public $files;\n\n    /**\n     * Parts of an email.\n     */\n    public $parts;\n\n    /**\n     * Charset manager object.\n     */\n    public $charset;\n\n    /**\n     * Create a new instance.\n     *\n     * @return void\n     */\n    public function __construct(?CharsetManager $charset = null)\n    {\n        if (is_null($charset)) {\n            $charset = new Charset;\n        }\n\n        $this->charset = $charset;\n    }\n\n    /**\n     * Free the held resouces.\n     *\n     * @return void\n     */\n    public function __destruct()\n    {\n        // clear the email file resource\n        if (is_resource($this->stream)) {\n            fclose($this->stream);\n        }\n\n        // clear the mail parse resource\n        if (is_resource($this->resource)) {\n            mailparse_msg_free($this->resource);\n        }\n    }\n\n    /**\n     * Set the file path we use to get the email text.\n     *\n     * @param  string  $path\n     * @return object\n     */\n    public function setPath($path)\n    {\n        $this->resource = mailparse_msg_parse_file($path);\n\n        $this->stream = fopen($path, 'r');\n\n        $this->parse();\n\n        return $this;\n    }\n\n    /**\n     * Set the stream resource we use to get the email text.\n     *\n     * @return object\n     */\n    public function setStream($stream)\n    {\n        // streams have to be cached to file first\n        $meta = @stream_get_meta_data($stream);\n\n        if (\n            ! $meta\n            || ! $meta['mode']\n            || $meta['mode'][0] != 'r'\n            || $meta['eof']\n        ) {\n            throw new \\Exception(\n                'setStream() expects parameter stream to be readable stream resource.'\n            );\n        }\n\n        $tmp_fp = tmpfile();\n\n        if ($tmp_fp) {\n            while (! feof($stream)) {\n                fwrite($tmp_fp, fread($stream, 2028));\n            }\n\n            fseek($tmp_fp, 0);\n\n            $this->stream = &$tmp_fp;\n        } else {\n            throw new \\Exception(\n                'Could not create temporary files for attachments. Your tmp directory may be un-writable by PHP.'\n            );\n        }\n\n        fclose($stream);\n\n        $this->resource = mailparse_msg_create();\n\n        // parses the message incrementally (low memory usage but slower)\n        while (! feof($this->stream)) {\n            mailparse_msg_parse($this->resource, fread($this->stream, 2082));\n        }\n\n        $this->parse();\n\n        return $this;\n    }\n\n    /**\n     * Set the email text.\n     *\n     * @return object\n     */\n    public function setText($data)\n    {\n        $this->resource = \\mailparse_msg_create();\n\n        // does not parse incrementally, fast memory hog might explode\n        mailparse_msg_parse($this->resource, $data);\n\n        $this->data = $data;\n\n        $this->parse();\n\n        return $this;\n    }\n\n    /**\n     * Parse the message into parts.\n     *\n     * @return void\n     */\n    private function parse()\n    {\n        $structure = mailparse_msg_get_structure($this->resource);\n\n        $headerType = (stripos($this->data, 'Content-Language:') !== false) ? 'Content-Language:' : 'Content-Type:';\n\n        if (count($structure) == 1) {\n            $tempParts = explode(PHP_EOL, $this->data);\n\n            foreach ($tempParts as $key => $part) {\n                if (stripos($part, $headerType) !== false) {\n                    break;\n                }\n\n                if (trim($part) == '') {\n                    unset($tempParts[$key]);\n                }\n            }\n\n            $data = implode(PHP_EOL, $tempParts);\n\n            $this->resource = \\mailparse_msg_create();\n\n            mailparse_msg_parse($this->resource, $data);\n\n            $this->data = $data;\n\n            $structure = mailparse_msg_get_structure($this->resource);\n        }\n\n        $this->parts = [];\n\n        foreach ($structure as $part_id) {\n            $part = mailparse_msg_get_part($this->resource, $part_id);\n\n            $this->parts[$part_id] = mailparse_msg_get_part_data($part);\n        }\n    }\n\n    /**\n     * Parse sender name.\n     *\n     * @return string\n     */\n    public function parseSenderName()\n    {\n        if (! $fromNameParts = mailparse_rfc822_parse_addresses($this->getHeader('from'))) {\n            $fromNameParts = mailparse_rfc822_parse_addresses($this->getHeader('sender'));\n        }\n\n        return $fromNameParts[0]['display'] == $fromNameParts[0]['address']\n            ? current(explode('@', $fromNameParts[0]['display']))\n            : $fromNameParts[0]['display'];\n    }\n\n    /**\n     * Parse email address.\n     *\n     * @param  string  $type\n     * @return array\n     */\n    public function parseEmailAddress($type)\n    {\n        $emails = [];\n\n        $addresses = mailparse_rfc822_parse_addresses($this->getHeader($type));\n\n        if (count($addresses) > 1) {\n            foreach ($addresses as $address) {\n                if (filter_var($address['address'], FILTER_VALIDATE_EMAIL)) {\n                    $emails[] = $address['address'];\n                }\n            }\n        } elseif ($addresses) {\n            $emails[] = $addresses[0]['address'];\n        }\n\n        return $emails;\n    }\n\n    /**\n     * Retrieve a specific email header, without charset conversion.\n     *\n     * @return string\n     */\n    public function getRawHeader($name)\n    {\n        if (isset($this->parts[1])) {\n            $headers = $this->getPart('headers', $this->parts[1]);\n\n            return (isset($headers[$name])) ? $headers[$name] : false;\n        } else {\n            throw new \\Exception(\n                'setPath() or setText() or setStream() must be called before retrieving email headers.'\n            );\n        }\n    }\n\n    /**\n     * Retrieve a specific email header.\n     *\n     * @return string\n     */\n    public function getHeader($name)\n    {\n        $rawHeader = $this->getRawHeader($name);\n\n        if ($rawHeader === false) {\n            return false;\n        }\n\n        return $this->decodeHeader($rawHeader);\n    }\n\n    /**\n     * Retrieve all mail headers.\n     *\n     * @return array\n     */\n    public function getHeaders()\n    {\n        if (isset($this->parts[1])) {\n            $headers = $this->getPart('headers', $this->parts[1]);\n\n            foreach ($headers as $name => &$value) {\n                if (is_array($value)) {\n                    foreach ($value as &$v) {\n                        $v = $this->decodeSingleHeader($v);\n                    }\n                } else {\n                    $value = $this->decodeSingleHeader($value);\n                }\n            }\n\n            return $headers;\n        } else {\n            throw new \\Exception(\n                'setPath() or setText() or setStream() must be called before retrieving email headers.'\n            );\n        }\n    }\n\n    /**\n     * Get from name.\n     *\n     * @return string\n     */\n    public function getFromName()\n    {\n        $headers = $this->getHeaders();\n\n        return $headers['from'];\n    }\n\n    /**\n     * Extract multipart MIME text.\n     *\n     * @return string\n     */\n    public function extractMultipartMIMEText($part, $source, $encodingType)\n    {\n        $boundary = trim($part['content-boundary']);\n        $boundary = substr($boundary, strpos($boundary, '----=') + strlen('----='));\n\n        preg_match_all('/------=(3D_.*)\\sContent-Type:\\s(.*)\\s*boundary=3D\"----=(3D_.*)\"/', $source, $matches);\n\n        $delimeter = array_shift($matches);\n        $content_delimeter = end($delimeter);\n\n        [$relations, $content_types, $boundaries] = $matches;\n\n        $messageToProcess = substr($source, stripos($source, (string) $content_delimeter) + strlen($content_delimeter));\n\n        array_unshift($boundaries, $boundary);\n\n        // Extract the text\n        foreach (array_reverse($boundaries) as $index => $boundary) {\n            $processedEmailSegments = [];\n            $emailSegments = explode('------='.$boundary, $messageToProcess);\n\n            // Remove empty parts\n            foreach ($emailSegments as $emailSegment) {\n                if (! empty(trim($emailSegment))) {\n                    $processedEmailSegments[] = trim($emailSegment);\n                }\n            }\n\n            // Remove unrelated parts\n            array_pop($processedEmailSegments);\n\n            for ($i = 0; $i < $index; $i++) {\n                if (count($processedEmailSegments) > 1) {\n                    array_shift($processedEmailSegments);\n                }\n            }\n\n            // Parse each parts for text|html content\n            foreach ($processedEmailSegments as $emailSegment) {\n                $emailSegment = quoted_printable_decode(quoted_printable_decode($emailSegment));\n\n                if (stripos($emailSegment, 'content-type: text/plain;') !== false\n                    || stripos($emailSegment, 'content-type: text/html;') !== false\n                ) {\n                    $search = 'content-transfer-encoding: '.$encodingType;\n\n                    return substr($emailSegment, stripos($emailSegment, $search) + strlen($search));\n                }\n            }\n        }\n\n        return '';\n    }\n\n    /**\n     * Returns the email message body in the specified format.\n     *\n     * @return mixed\n     */\n    public function getMessageBody($type = 'text')\n    {\n        $textBody = $htmlBody = $body = false;\n\n        $mime_types = [\n            'text' => 'text/plain',\n            'text' => 'text/plain; (error)',\n            'html' => 'text/html',\n        ];\n\n        if (in_array($type, array_keys($mime_types))) {\n            foreach ($this->parts as $key => $part) {\n                if (in_array($this->getPart('content-type', $part), $mime_types)\n                    && $this->getPart('content-disposition', $part) != 'attachment'\n                ) {\n                    $headers = $this->getPart('headers', $part);\n                    $encodingType = array_key_exists('content-transfer-encoding', $headers) ? $headers['content-transfer-encoding'] : '';\n\n                    if ($this->getPart('content-type', $part) == 'text/plain') {\n                        $textBody .= $this->decodeContentTransfer($this->getPartBody($part), $encodingType);\n                        $textBody = nl2br($this->charset->decodeCharset($textBody, $this->getPartCharset($part)));\n                    } elseif ($this->getPart('content-type', $part) == 'text/plain; (error)') {\n                        if (empty($part['headers']) || ! isset($part['headers']['from'])) {\n                            $parentKey = explode('.', $key)[0];\n                            if (isset($this->parts[$parentKey]) && isset($this->parts[$parentKey]['headers']['from'])) {\n                                $part_from_sender = is_array($this->parts[$parentKey]['headers']['from'])\n                                    ? $this->parts[$parentKey]['headers']['from'][0]\n                                    : $this->parts[$parentKey]['headers']['from'];\n                            } else {\n                                continue;\n                            }\n                        } else {\n                            $part_from_sender = is_array($part['headers']['from'])\n                                ? $part['headers']['from'][0]\n                                : $part['headers']['from'];\n                        }\n                        $mail_part_addresses = mailparse_rfc822_parse_addresses($part_from_sender);\n\n                        if (! empty($mail_part_addresses[0]['address'])\n                            && strrpos($mail_part_addresses[0]['address'], 'pcsms.com') !== false\n                        ) {\n                            $last_header = end($headers);\n                            $partMessage = substr($this->data, strrpos($this->data, $last_header) + strlen($last_header), $part['ending-pos-body']);\n                            $textBody .= $this->decodeContentTransfer($partMessage, $encodingType);\n                            $textBody = nl2br($this->charset->decodeCharset($textBody, $this->getPartCharset($part)));\n                        }\n                    } elseif ($this->getPart('content-type', $part) == 'multipart/mixed'\n                        || $this->getPart('content-type', $part) == 'multipart/related'\n                    ) {\n                        $emailContent = $this->extractMultipartMIMEText($part, $this->data, $encodingType);\n\n                        $textBody .= $this->decodeContentTransfer($emailContent, $encodingType);\n                        $textBody = nl2br($this->charset->decodeCharset($textBody, $this->getPartCharset($part)));\n                    } else {\n                        $htmlBody .= $this->decodeContentTransfer($this->getPartBody($part), $encodingType);\n                        $htmlBody = $this->charset->decodeCharset($htmlBody, $this->getPartCharset($part));\n                    }\n                }\n            }\n\n            $body = $htmlBody ?: $textBody;\n\n            if (is_array($this->files)) {\n                foreach ($this->files as $file) {\n                    if ($file['contentId']) {\n                        $body = str_replace('cid:'.preg_replace('/[<>]/', '', $file['contentId']), $file['path'], $body);\n                        $path = $file['path'];\n                    }\n                }\n            }\n        } else {\n            throw new \\Exception('Invalid type specified for getMessageBody(). \"type\" can either be text or html.');\n        }\n\n        return $body;\n    }\n\n    /**\n     * Get text message body.\n     *\n     * @return string\n     */\n    public function getTextMessageBody()\n    {\n        $textBody = null;\n\n        foreach ($this->parts as $key => $part) {\n            if ($this->getPart('content-disposition', $part) != 'attachment') {\n                $headers = $this->getPart('headers', $part);\n                $encodingType = array_key_exists('content-transfer-encoding', $headers) ? $headers['content-transfer-encoding'] : '';\n\n                if ($this->getPart('content-type', $part) == 'text/plain') {\n                    $textBody .= $this->decodeContentTransfer($this->getPartBody($part), $encodingType);\n                    $textBody = nl2br($this->charset->decodeCharset($textBody, $this->getPartCharset($part)));\n                } elseif ($this->getPart('content-type', $part) == 'text/plain; (error)') {\n                    $part_from_sender = is_array($part['headers']['from']) ? $part['headers']['from'][0] : $part['headers']['from'];\n                    $mail_part_addresses = mailparse_rfc822_parse_addresses($part_from_sender);\n\n                    if (! empty($mail_part_addresses[0]['address'])\n                        && strrpos($mail_part_addresses[0]['address'], 'pcsms.com') !== false\n                    ) {\n                        $last_header = end($headers);\n                        $partMessage = substr($this->data, strrpos($this->data, $last_header) + strlen($last_header), $part['ending-pos-body']);\n                        $textBody .= $this->decodeContentTransfer($partMessage, $encodingType);\n                        $textBody = nl2br($this->charset->decodeCharset($textBody, $this->getPartCharset($part)));\n                    }\n                } elseif ($this->getPart('content-type', $part) == 'multipart/mixed'\n                    || $this->getPart('content-type', $part) == 'multipart/related'\n                ) {\n                    $emailContent = $this->extractMultipartMIMEText($part, $this->data, $encodingType);\n\n                    $textBody .= $this->decodeContentTransfer($emailContent, $encodingType);\n                    $textBody = nl2br($this->charset->decodeCharset($textBody, $this->getPartCharset($part)));\n                }\n            }\n        }\n\n        return $textBody;\n    }\n\n    /**\n     * Returns the attachments contents in order of appearance.\n     *\n     * @return array\n     */\n    public function getAttachments()\n    {\n        $attachments = [];\n        $dispositions = ['attachment', 'inline'];\n        $non_attachment_types = ['text/plain', 'text/html', 'text/plain; (error)'];\n        $nonameIter = 0;\n\n        foreach ($this->parts as $part) {\n            $disposition = $this->getPart('content-disposition', $part);\n            $filename = 'noname';\n\n            if (isset($part['disposition-filename'])) {\n                $filename = $this->decodeHeader($part['disposition-filename']);\n            } elseif (isset($part['content-name'])) {\n                // if we have no disposition but we have a content-name, it's a valid attachment.\n                // we simulate the presence of an attachment disposition with a disposition filename\n                $filename = $this->decodeHeader($part['content-name']);\n                $disposition = 'attachment';\n            } elseif (! in_array($part['content-type'], $non_attachment_types, true)\n                && substr($part['content-type'], 0, 10) !== 'multipart/'\n            ) {\n                // if we cannot get it by getMessageBody(), we assume it is an attachment\n                $disposition = 'attachment';\n            }\n\n            if (in_array($disposition, $dispositions) === true && isset($filename) === true) {\n                if ($filename == 'noname') {\n                    $nonameIter++;\n                    $filename = 'noname'.$nonameIter;\n                }\n\n                $headersAttachments = $this->getPart('headers', $part);\n                $contentidAttachments = $this->getPart('content-id', $part);\n\n                if (! $contentidAttachments\n                    && $disposition == 'inline'\n                    && ! strpos($this->getPart('content-type', $part), 'image/')\n                    && ! stripos($filename, 'noname') == false\n                ) {\n                    // skip\n                } else {\n                    $attachments[] = new Attachment(\n                        $filename,\n                        $this->getPart('content-type', $part),\n                        $this->getAttachmentStream($part),\n                        $disposition,\n                        $contentidAttachments,\n                        $headersAttachments\n                    );\n                }\n            }\n        }\n\n        return ! empty($attachments) ? $attachments : $this->extractMultipartMIMEAttachments();\n    }\n\n    /**\n     * Extract attachments from multipart MIME.\n     *\n     * @return array\n     */\n    public function extractMultipartMIMEAttachments()\n    {\n        $attachmentCollection = $processedAttachmentCollection = [];\n\n        foreach ($this->parts as $part) {\n            $boundary = isset($part['content-boundary']) ? trim($part['content-boundary']) : '';\n            $boundary = substr($boundary, strpos($boundary, '----=') + strlen('----='));\n\n            preg_match_all('/------=(3D_.*)\\sContent-Type:\\s(.*)\\s*boundary=3D\"----=(3D_.*)\"/', $this->data, $matches);\n\n            $delimeter = array_shift($matches);\n            $content_delimeter = end($delimeter);\n\n            [$relations, $content_types, $boundaries] = $matches;\n            $messageToProcess = substr($this->data, stripos($this->data, (string) $content_delimeter) + strlen($content_delimeter));\n\n            array_unshift($boundaries, $boundary);\n\n            // Extract the text\n            foreach (array_reverse($boundaries) as $index => $boundary) {\n                $processedEmailSegments = [];\n                $emailSegments = explode('------='.$boundary, $messageToProcess);\n\n                // Remove empty parts\n                foreach ($emailSegments as $emailSegment) {\n                    if (! empty(trim($emailSegment))) {\n                        $processedEmailSegments[] = trim($emailSegment);\n                    }\n                }\n\n                // Remove unrelated parts\n                array_pop($processedEmailSegments);\n\n                for ($i = 0; $i < $index; $i++) {\n                    if (count($processedEmailSegments) > 1) {\n                        array_shift($processedEmailSegments);\n                    }\n                }\n\n                // Parse each parts for text|html content\n                foreach ($processedEmailSegments as $emailSegment) {\n                    $emailSegment = quoted_printable_decode(quoted_printable_decode($emailSegment));\n\n                    if (stripos($emailSegment, 'content-type: text/plain;') === false\n                        && stripos($emailSegment, 'content-type: text/html;') === false\n                    ) {\n                        $attachmentParts = explode(\"\\n\\n\", $emailSegment);\n\n                        if (! empty($attachmentParts) && count($attachmentParts) == 2) {\n                            $attachmentDetails = explode(\"\\n\", $attachmentParts[0]);\n\n                            $attachmentDetails = array_map(function ($item) {\n                                return trim($item);\n                            }, $attachmentDetails);\n\n                            $attachmentData = trim($attachmentParts[1]);\n\n                            $attachmentCollection[] = [\n                                'details' => $attachmentDetails,\n                                'data' => $attachmentData,\n                            ];\n                        }\n                    }\n                }\n            }\n        }\n\n        foreach ($attachmentCollection as $attachmentDetails) {\n            $stream = '';\n\n            $resourceDetails = [\n                'name' => '',\n                'fileName' => '',\n                'contentType' => '',\n                'encodingType' => 'base64',\n                'contentDisposition' => 'inline',\n                'contentId' => '',\n            ];\n\n            foreach ($attachmentDetails['details'] as $attachmentDetail) {\n                if (stripos($attachmentDetail, 'Content-Type: ') === 0) {\n                    $resourceDetails['contentType'] = substr($attachmentDetail, strlen('Content-Type: '));\n                } elseif (stripos($attachmentDetail, 'name=\"') === 0) {\n                    $resourceDetails['name'] = substr($attachmentDetail, strlen('name=\"'), -1);\n                } elseif (stripos($attachmentDetail, 'Content-Transfer-Encoding: ') === 0) {\n                    $resourceDetails['encodingType'] = substr($attachmentDetail, strlen('Content-Transfer-Encoding: '));\n                } elseif (stripos($attachmentDetail, 'Content-ID: ') === 0) {\n                    $resourceDetails['contentId'] = substr($attachmentDetail, strlen('Content-ID: '));\n                } elseif (stripos($attachmentDetail, 'filename=\"') === 0) {\n                    $resourceDetails['fileName'] = substr($attachmentDetail, strlen('filename=\"'), -1);\n                } elseif (stripos($attachmentDetail, 'Content-Disposition: ') === 0) {\n                    $resourceDetails['contentDisposition'] = substr($attachmentDetail, strlen('Content-Disposition: '), -1);\n                }\n            }\n\n            $resourceDetails['name'] = empty($resourceDetails['name']) ? $resourceDetails['fileName'] : $resourceDetails['name'];\n            $resourceDetails['fileName'] = empty($resourceDetails['fileName']) ? $resourceDetails['name'] : $resourceDetails['fileName'];\n\n            $temp_fp = tmpfile();\n\n            fwrite($temp_fp, base64_decode($attachmentDetails['data']), strlen($attachmentDetails['data']));\n            fseek($temp_fp, 0, SEEK_SET);\n\n            $processedAttachmentCollection[] = new Attachment(\n                $resourceDetails['fileName'],\n                $resourceDetails['contentType'],\n                $temp_fp,\n                $resourceDetails['contentDisposition'],\n                $resourceDetails['contentId'], []\n            );\n        }\n\n        return $processedAttachmentCollection;\n    }\n\n    /**\n     * Read the attachment body and save temporary file resource.\n     *\n     * @return string\n     */\n    private function getAttachmentStream(&$part)\n    {\n        $temp_fp = tmpfile();\n\n        $headers = $this->getPart('headers', $part);\n        $encodingType = array_key_exists('content-transfer-encoding', $headers)\n            ? $headers['content-transfer-encoding']\n            : '';\n\n        if ($temp_fp) {\n            if ($this->stream) {\n                $start = $part['starting-pos-body'];\n                $end = $part['ending-pos-body'];\n\n                fseek($this->stream, $start, SEEK_SET);\n\n                $len = $end - $start;\n                $written = 0;\n\n                while ($written < $len) {\n                    $write = $len;\n                    $part = fread($this->stream, $write);\n\n                    fwrite($temp_fp, $this->decodeContentTransfer($part, $encodingType));\n\n                    $written += $write;\n                }\n            } elseif ($this->data) {\n                $attachment = $this->decodeContentTransfer($this->getPartBodyFromText($part), $encodingType);\n\n                fwrite($temp_fp, $attachment, strlen($attachment));\n            }\n\n            fseek($temp_fp, 0, SEEK_SET);\n        } else {\n            throw new \\Exception(\n                'Could not create temporary files for attachments. Your tmp directory may be unwritable by PHP.'\n            );\n        }\n\n        return $temp_fp;\n    }\n\n    /**\n     * Decode the string from Content-Transfer-Encoding.\n     *\n     * @return string\n     */\n    private function decodeContentTransfer($encodedString, $encodingType)\n    {\n        $encodingType = strtolower($encodingType);\n\n        if ($encodingType == 'base64') {\n            return base64_decode($encodedString);\n        } elseif ($encodingType == 'quoted-printable') {\n            return quoted_printable_decode($encodedString);\n        } else {\n            return $encodedString; // 8bit, 7bit, binary\n        }\n    }\n\n    /**\n     * Decode header.\n     *\n     * @param  string|array  $input\n     * @return string\n     */\n    private function decodeHeader($input)\n    {\n        // sometimes we have 2 label From so we take only the first\n        if (is_array($input)) {\n            return $this->decodeSingleHeader($input[0]);\n        }\n\n        return $this->decodeSingleHeader($input);\n    }\n\n    /**\n     * Decodes a single header (= string).\n     *\n     * @param  string\n     * @return string\n     */\n    private function decodeSingleHeader($input)\n    {\n        // Remove white space between encoded-words\n        $input = preg_replace('/(=\\?[^?]+\\?(q|b)\\?[^?]*\\?=)(\\s)+=\\?/i', '\\1=?', $input);\n\n        // For each encoded-word...\n        while (preg_match('/(=\\?([^?]+)\\?(q|b)\\?([^?]*)\\?=)/i', $input, $matches)) {\n            $encoded = $matches[1];\n            $charset = $matches[2];\n            $encoding = $matches[3];\n            $text = $matches[4];\n\n            switch (strtolower($encoding)) {\n                case 'b':\n                    $text = $this->decodeContentTransfer($text, 'base64');\n                    break;\n\n                case 'q':\n                    $text = str_replace('_', ' ', $text);\n\n                    preg_match_all('/=([a-f0-9]{2})/i', $text, $matches);\n\n                    foreach ($matches[1] as $value) {\n                        $text = str_replace('='.$value, chr(hexdec($value)), $text);\n                    }\n\n                    break;\n            }\n\n            $text = $this->charset->decodeCharset($text, $this->charset->getCharsetAlias($charset));\n\n            $input = str_replace($encoded, $text, $input);\n        }\n\n        return $input;\n    }\n\n    /**\n     * Return the charset of the MIME part.\n     *\n     * @return string|false\n     */\n    private function getPartCharset($part)\n    {\n        if (isset($part['charset'])) {\n            return $charset = $this->charset->getCharsetAlias($part['charset']);\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * Retrieve a specified MIME part.\n     *\n     * @return string|array\n     */\n    private function getPart($type, $parts)\n    {\n        return (isset($parts[$type])) ? $parts[$type] : false;\n    }\n\n    /**\n     * Retrieve the Body of a MIME part.\n     *\n     * @return string\n     */\n    private function getPartBody(&$part)\n    {\n        $body = '';\n\n        if ($this->stream) {\n            $body = $this->getPartBodyFromFile($part);\n        } elseif ($this->data) {\n            $body = $this->getPartBodyFromText($part);\n        }\n\n        return $body;\n    }\n\n    /**\n     * Retrieve the Body from a MIME part from file.\n     *\n     * @return string\n     */\n    private function getPartBodyFromFile(&$part)\n    {\n        $start = $part['starting-pos-body'];\n\n        $end = $part['ending-pos-body'];\n\n        fseek($this->stream, $start, SEEK_SET);\n\n        return fread($this->stream, $end - $start);\n    }\n\n    /**\n     * Retrieve the Body from a MIME part from text.\n     *\n     * @return string\n     */\n    private function getPartBodyFromText(&$part)\n    {\n        $start = $part['starting-pos-body'];\n\n        $end = $part['ending-pos-body'];\n\n        return substr($this->data, $start, $end - $start);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/InboundEmailProcessor/Contracts/InboundEmailProcessor.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\InboundEmailProcessor\\Contracts;\n\ninterface InboundEmailProcessor\n{\n    /**\n     * Process messages from all folders.\n     *\n     * @return mixed\n     */\n    public function processMessagesFromAllFolders();\n\n    /**\n     * Process the inbound email.\n     *\n     * @param  mixed|null  $content\n     */\n    public function processMessage($content = null): void;\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/InboundEmailProcessor/SendgridEmailProcessor.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\InboundEmailProcessor;\n\nuse Webkul\\Email\\Helpers\\HtmlFilter;\nuse Webkul\\Email\\Helpers\\Parser;\nuse Webkul\\Email\\InboundEmailProcessor\\Contracts\\InboundEmailProcessor;\nuse Webkul\\Email\\Repositories\\AttachmentRepository;\nuse Webkul\\Email\\Repositories\\EmailRepository;\n\nclass SendgridEmailProcessor implements InboundEmailProcessor\n{\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected EmailRepository $emailRepository,\n        protected AttachmentRepository $attachmentRepository,\n        protected Parser $emailParser,\n        protected HtmlFilter $htmlFilter\n    ) {}\n\n    /**\n     * Process messages from all folders.\n     */\n    public function processMessagesFromAllFolders()\n    {\n        /**\n         * SendGrid's Inbound Parse is a specialized tool for developers to handle incoming emails in\n         * their applications, but it doesn't replace the full functionality of IMAP for typical\n         * email client usage. Thats why we can't process the messages.\n         */\n        throw new \\Exception('Currently bulk processing is not supported for Sendgrid.');\n    }\n\n    /**\n     * Process the inbound email.\n     */\n    public function processMessage($message = null): void\n    {\n        $this->emailParser->setText($message);\n\n        $email = $this->emailRepository->findOneWhere(['message_id' => $messageID = $this->emailParser->getHeader('message-id')]);\n\n        if ($email) {\n            return;\n        }\n\n        $headers = [\n            'from' => $this->emailParser->parseEmailAddress('from'),\n            'sender' => $this->emailParser->parseEmailAddress('sender'),\n            'reply_to' => $this->emailParser->parseEmailAddress('to'),\n            'cc' => $this->emailParser->parseEmailAddress('cc'),\n            'bcc' => $this->emailParser->parseEmailAddress('bcc'),\n            'subject' => $this->emailParser->getHeader('subject'),\n            'name' => $this->emailParser->parseSenderName(),\n            'source' => 'email',\n            'user_type' => 'person',\n            'message_id' => $messageID ?? time().'@'.config('mail.domain'),\n            'reference_ids' => htmlspecialchars_decode($this->emailParser->getHeader('references')),\n            'in_reply_to' => htmlspecialchars_decode($this->emailParser->getHeader('in-reply-to')),\n        ];\n\n        foreach ($headers['reply_to'] as $to) {\n            if ($email = $this->emailRepository->findOneWhere(['message_id' => $to])) {\n                break;\n            }\n        }\n\n        if (! isset($email) && $headers['in_reply_to']) {\n            $email = $this->emailRepository->findOneWhere(['message_id' => $headers['in_reply_to']]);\n\n            if (! $email) {\n                $email = $this->emailRepository->findOneWhere([['reference_ids', 'like',  '%'.$headers['in_reply_to'].'%']]);\n            }\n        }\n\n        if (! isset($email) && $headers['reference_ids']) {\n            $referenceIds = explode(' ', $headers['reference_ids']);\n\n            foreach ($referenceIds as $referenceId) {\n                if ($email = $this->emailRepository->findOneWhere([['reference_ids', 'like', '%'.$referenceId.'%']])) {\n                    break;\n                }\n            }\n        }\n\n        if (! $reply = $this->emailParser->getMessageBody('text')) {\n            $reply = $this->emailParser->getTextMessageBody();\n        }\n\n        if (! isset($email)) {\n            $email = $this->emailRepository->create(array_merge($headers, [\n                'folders' => ['inbox'],\n                'reply' => $reply,\n                'unique_id' => time().'@'.config('mail.domain'),\n                'reference_ids' => [$headers['message_id']],\n                'user_type' => 'person',\n            ]));\n\n            $this->attachmentRepository->uploadAttachments($email, [\n                'source' => 'email',\n                'attachments' => $this->emailParser->getAttachments(),\n            ]);\n        } else {\n            $parentEmail = $this->emailRepository->update([\n                'folders' => array_unique(array_merge($email->folders, ['inbox'])),\n                'reference_ids' => array_merge($email->reference_ids ?? [], [$headers['message_id']]),\n            ], $email->id);\n\n            $email = $this->emailRepository->create(array_merge($headers, [\n                'reply' => $this->htmlFilter->process($reply, ''),\n                'parent_id' => $parentEmail->id,\n                'user_type' => 'person',\n            ]));\n\n            $this->attachmentRepository->uploadAttachments($email, [\n                'source' => 'email',\n                'attachments' => $this->emailParser->getAttachments(),\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/InboundEmailProcessor/WebklexImapEmailProcessor.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\InboundEmailProcessor;\n\nuse Carbon\\Carbon;\nuse Webklex\\IMAP\\Facades\\Client;\nuse Webklex\\IMAP\\Support\\FolderCollection;\nuse Webklex\\PHPIMAP\\Message;\nuse Webkul\\Email\\Enums\\SupportedFolderEnum;\nuse Webkul\\Email\\InboundEmailProcessor\\Contracts\\InboundEmailProcessor;\nuse Webkul\\Email\\Repositories\\AttachmentRepository;\nuse Webkul\\Email\\Repositories\\EmailRepository;\n\nclass WebklexImapEmailProcessor implements InboundEmailProcessor\n{\n    /**\n     * The IMAP client instance.\n     */\n    protected $client;\n\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected EmailRepository $emailRepository,\n        protected AttachmentRepository $attachmentRepository\n    ) {\n        $this->client = Client::make($this->getDefaultConfigs());\n\n        $this->client->connect();\n\n        if (! $this->client->isConnected()) {\n            throw new \\Exception('Failed to connect to the mail server.');\n        }\n    }\n\n    /**\n     * Close the connection.\n     */\n    public function __destruct()\n    {\n        $this->client->disconnect();\n    }\n\n    /**\n     * Process messages from all folders.\n     */\n    public function processMessagesFromAllFolders()\n    {\n        try {\n            $rootFolders = $this->client->getFolders();\n\n            $this->processMessagesFromLeafFolders($rootFolders);\n        } catch (\\Exception $e) {\n            throw new \\Exception($e->getMessage());\n        }\n    }\n\n    /**\n     * Process the inbound email.\n     *\n     * @param  ?Message  $message\n     */\n    public function processMessage($message = null): void\n    {\n        $attributes = $message->getAttributes();\n\n        $messageId = $attributes['message_id']->first();\n\n        $email = $this->emailRepository->findOneByField('message_id', $messageId);\n\n        if ($email) {\n            return;\n        }\n\n        $replyToEmails = $this->getEmailsByAttributeCode($attributes, 'to');\n\n        foreach ($replyToEmails as $to) {\n            if ($email = $this->emailRepository->findOneWhere(['message_id' => $to])) {\n                break;\n            }\n        }\n\n        if (! isset($email) && isset($attributes['in_reply_to'])) {\n            $inReplyTo = $attributes['in_reply_to']->first();\n\n            $email = $this->emailRepository->findOneWhere(['message_id' => $inReplyTo]);\n\n            if (! $email) {\n                $email = $this->emailRepository->findOneWhere([['reference_ids', 'like',  '%'.$inReplyTo.'%']]);\n            }\n        }\n\n        $references = [$messageId];\n\n        if (! isset($email) && isset($attributes['references'])) {\n            array_push($references, ...$attributes['references']->all());\n\n            foreach ($references as $reference) {\n                if ($email = $this->emailRepository->findOneWhere([['reference_ids', 'like', '%'.$reference.'%']])) {\n                    break;\n                }\n            }\n        }\n\n        /**\n         * Maps the folder name to the supported folder in our application.\n         *\n         * To Do: Review this.\n         */\n        $folderName = match ($message->getFolder()->name) {\n            'INBOX' => SupportedFolderEnum::INBOX->value,\n            'Important' => SupportedFolderEnum::IMPORTANT->value,\n            'Starred' => SupportedFolderEnum::STARRED->value,\n            'Drafts' => SupportedFolderEnum::DRAFT->value,\n            'Sent Mail' => SupportedFolderEnum::SENT->value,\n            'Trash' => SupportedFolderEnum::TRASH->value,\n            default => '',\n        };\n\n        $parentEmail = null;\n\n        if ($email) {\n            $parentEmail = $this->emailRepository->update([\n                'folders' => array_unique(array_merge($email->folders, [$folderName])),\n                'reference_ids' => array_merge($email->reference_ids ?? [], [$references]),\n            ], $email->id);\n        }\n\n        $email = $this->emailRepository->create([\n            'from' => $attributes['from']->first()->mail,\n            'subject' => $attributes['subject']->first(),\n            'name' => $attributes['from']->first()->personal,\n            'reply' => $message->bodies['html'] ?? $message->bodies['text'],\n            'is_read' => (int) $message->flags()->has('seen'),\n            'folders' => [$folderName],\n            'reply_to' => $this->getEmailsByAttributeCode($attributes, 'to'),\n            'cc' => $this->getEmailsByAttributeCode($attributes, 'cc'),\n            'bcc' => $this->getEmailsByAttributeCode($attributes, 'bcc'),\n            'source' => 'email',\n            'user_type' => 'person',\n            'unique_id' => $messageId,\n            'message_id' => $messageId,\n            'reference_ids' => $references,\n            'created_at' => $this->convertToDesiredTimezone($message->date->toDate()),\n            'parent_id' => $parentEmail?->id,\n        ]);\n\n        if ($message->hasAttachments()) {\n            $this->attachmentRepository->uploadAttachments($email, [\n                'source' => 'email',\n                'attachments' => $message->getAttachments(),\n            ]);\n        }\n    }\n\n    /**\n     * Process the messages from all folders.\n     *\n     * @param  FolderCollection  $rootFoldersCollection\n     */\n    protected function processMessagesFromLeafFolders($rootFoldersCollection = null): void\n    {\n        $rootFoldersCollection->each(function ($folder) {\n            if (! $folder->children->isEmpty()) {\n                $this->processMessagesFromLeafFolders($folder->children);\n\n                return;\n            }\n\n            if (in_array($folder->name, ['All Mail'])) {\n                return;\n            }\n\n            return $folder->query()->since(now()->subDays(10))->get()->each(function ($message) {\n                $this->processMessage($message);\n            });\n        });\n    }\n\n    /**\n     * Get the emails by the attribute code.\n     */\n    protected function getEmailsByAttributeCode(array $attributes, string $attributeCode): array\n    {\n        $emails = [];\n\n        if (isset($attributes[$attributeCode])) {\n            $emails = collect($attributes[$attributeCode]->all())->map(fn ($attribute) => $attribute->mail)->toArray();\n        }\n\n        return $emails;\n    }\n\n    /**\n     * Convert the date to the desired timezone.\n     *\n     * @param  Carbon  $carbonDate\n     * @param  ?string  $targetTimezone\n     */\n    protected function convertToDesiredTimezone($carbonDate, $targetTimezone = null)\n    {\n        $targetTimezone = $targetTimezone ?: config('app.timezone');\n\n        return $carbonDate->clone()->setTimezone($targetTimezone);\n    }\n\n    /**\n     * Get the default configurations.\n     */\n    protected function getDefaultConfigs(): array\n    {\n        $defaultConfig = config('imap.accounts.default');\n\n        $defaultConfig['host'] = core()->getConfigData('email.imap.account.host') ?: $defaultConfig['host'];\n\n        $defaultConfig['port'] = core()->getConfigData('email.imap.account.port') ?: $defaultConfig['port'];\n\n        $defaultConfig['encryption'] = core()->getConfigData('email.imap.account.encryption') ?: $defaultConfig['encryption'];\n\n        $defaultConfig['validate_cert'] = (bool) core()->getConfigData('email.imap.account.validate_cert');\n\n        $defaultConfig['username'] = core()->getConfigData('email.imap.account.username') ?: $defaultConfig['username'];\n\n        $defaultConfig['password'] = core()->getConfigData('email.imap.account.password') ?: $defaultConfig['password'];\n\n        return $defaultConfig;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Mails/Email.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Mails;\n\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Mail\\Mailable;\nuse Illuminate\\Queue\\SerializesModels;\nuse Symfony\\Component\\Mime\\Email as MimeEmail;\n\nclass Email extends Mailable\n{\n    use Queueable, SerializesModels;\n\n    /**\n     * Create a new email instance.\n     *\n     * @return void\n     */\n    public function __construct(public $email) {}\n\n    /**\n     * Build the message.\n     *\n     * @return $this\n     */\n    public function build()\n    {\n        $this->from($this->email->from)\n            ->to($this->email->reply_to)\n            ->replyTo($this->email->parent_id ? $this->email->parent->unique_id : $this->email->unique_id)\n            ->cc($this->email->cc ?? [])\n            ->bcc($this->email->bcc ?? [])\n            ->subject($this->email->parent_id ? $this->email->parent->subject : $this->email->subject)\n            ->html($this->email->reply);\n\n        $this->withSymfonyMessage(function (MimeEmail $message) {\n            $message->getHeaders()->addIdHeader('Message-ID', $this->email->message_id);\n\n            $message->getHeaders()->addTextHeader('References', $this->email->parent_id\n                ? implode(' ', $this->email->parent->reference_ids)\n                : implode(' ', $this->email->reference_ids)\n            );\n        });\n\n        foreach ($this->email->attachments as $attachment) {\n            $this->attachFromStorage($attachment->path);\n        }\n\n        return $this;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Models/Attachment.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Webkul\\Email\\Contracts\\Attachment as AttachmentContract;\n\nclass Attachment extends Model implements AttachmentContract\n{\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var string\n     */\n    protected $table = 'email_attachments';\n\n    /**\n     * The attributes that are appended.\n     *\n     * @var array\n     */\n    protected $appends = ['url'];\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'path',\n        'size',\n        'content_type',\n        'content_id',\n        'email_id',\n    ];\n\n    /**\n     * Get the email.\n     */\n    public function email()\n    {\n        return $this->belongsTo(EmailProxy::modelClass());\n    }\n\n    /**\n     * Get image url for the product image.\n     */\n    public function url()\n    {\n        return Storage::url($this->path);\n    }\n\n    /**\n     * Accessor for the 'url' attribute.\n     */\n    public function getUrlAttribute()\n    {\n        return $this->url();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Models/AttachmentProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass AttachmentProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Models/Email.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Contact\\Models\\PersonProxy;\nuse Webkul\\Email\\Contracts\\Email as EmailContract;\nuse Webkul\\Lead\\Models\\LeadProxy;\nuse Webkul\\Tag\\Models\\TagProxy;\n\nclass Email extends Model implements EmailContract\n{\n    /**\n     * The table associated with the model.\n     *\n     * @var string\n     */\n    protected $table = 'emails';\n\n    /**\n     * The attributes that should be cast.\n     *\n     * @var array\n     */\n    protected $casts = [\n        'folders' => 'array',\n        'sender' => 'array',\n        'from' => 'array',\n        'reply_to' => 'array',\n        'cc' => 'array',\n        'bcc' => 'array',\n        'reference_ids' => 'array',\n    ];\n\n    /**\n     * The attributes that are appended.\n     *\n     * @var array\n     */\n    protected $appends = [\n        'time_ago',\n    ];\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'subject',\n        'source',\n        'name',\n        'user_type',\n        'is_read',\n        'folders',\n        'from',\n        'sender',\n        'reply_to',\n        'cc',\n        'bcc',\n        'unique_id',\n        'message_id',\n        'reference_ids',\n        'reply',\n        'person_id',\n        'parent_id',\n        'lead_id',\n        'created_at',\n        'updated_at',\n    ];\n\n    /**\n     * Get the parent email.\n     */\n    public function parent()\n    {\n        return $this->belongsTo(EmailProxy::modelClass(), 'parent_id');\n    }\n\n    /**\n     * Get the lead.\n     */\n    public function lead()\n    {\n        return $this->belongsTo(LeadProxy::modelClass());\n    }\n\n    /**\n     * Get the emails.\n     */\n    public function emails()\n    {\n        return $this->hasMany(EmailProxy::modelClass(), 'parent_id');\n    }\n\n    /**\n     * Get the person that owns the thread.\n     */\n    public function person()\n    {\n        return $this->belongsTo(PersonProxy::modelClass());\n    }\n\n    /**\n     * The tags that belong to the lead.\n     */\n    public function tags()\n    {\n        return $this->belongsToMany(TagProxy::modelClass(), 'email_tags');\n    }\n\n    /**\n     * Get the attachments.\n     */\n    public function attachments()\n    {\n        return $this->hasMany(AttachmentProxy::modelClass(), 'email_id');\n    }\n\n    /**\n     * Get the time ago.\n     */\n    public function getTimeAgoAttribute(): string\n    {\n        return $this->created_at->diffForHumans();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Models/EmailProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass EmailProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Providers/EmailServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Providers;\n\nuse Illuminate\\Support\\ServiceProvider;\nuse Webkul\\Email\\Console\\Commands\\ProcessInboundEmails;\nuse Webkul\\Email\\InboundEmailProcessor\\Contracts\\InboundEmailProcessor;\nuse Webkul\\Email\\InboundEmailProcessor\\SendgridEmailProcessor;\nuse Webkul\\Email\\InboundEmailProcessor\\WebklexImapEmailProcessor;\n\nclass EmailServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap services.\n     *\n     * @return void\n     */\n    public function boot()\n    {\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n\n        $this->app->bind(InboundEmailProcessor::class, function ($app) {\n            $driver = config('mail-receiver.default');\n\n            if ($driver === 'sendgrid') {\n                return $app->make(SendgridEmailProcessor::class);\n            }\n\n            if ($driver === 'webklex-imap') {\n                return $app->make(WebklexImapEmailProcessor::class);\n            }\n\n            throw new \\Exception(\"Unsupported mail receiver driver [{$driver}].\");\n        });\n    }\n\n    /**\n     * Register services.\n     *\n     * @return void\n     */\n    public function register()\n    {\n        $this->registerCommands();\n    }\n\n    /**\n     * Register the console commands of this package.\n     */\n    protected function registerCommands(): void\n    {\n        if ($this->app->runningInConsole()) {\n            $this->commands([\n                ProcessInboundEmails::class,\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Providers;\n\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\nuse Webkul\\Email\\Models\\Attachment;\nuse Webkul\\Email\\Models\\Email;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    protected $models = [\n        Email::class,\n        Attachment::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Repositories/AttachmentRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Repositories;\n\nuse Illuminate\\Http\\UploadedFile;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Webklex\\PHPIMAP\\Attachment as ImapAttachment;\nuse Webkul\\Core\\Eloquent\\Repository;\nuse Webkul\\Email\\Contracts\\Attachment;\nuse Webkul\\Email\\Contracts\\Email;\n\nclass AttachmentRepository extends Repository\n{\n    /**\n     * Specify model class name.\n     */\n    public function model(): string\n    {\n        return Attachment::class;\n    }\n\n    /**\n     * Upload attachments.\n     */\n    public function uploadAttachments(Email $email, array $data): void\n    {\n        if (\n            empty($data['attachments'])\n            || empty($data['source'])\n        ) {\n            return;\n        }\n\n        foreach ($data['attachments'] as $attachment) {\n            $attributes = $this->prepareData($email, $attachment);\n\n            if (\n                ! empty($attachment->contentId)\n                && $data['source'] === 'email'\n            ) {\n                $attributes['content_id'] = $attachment->contentId;\n            }\n\n            $this->create($attributes);\n        }\n    }\n\n    /**\n     * Get the path for the attachment.\n     */\n    private function prepareData(Email $email, UploadedFile|ImapAttachment $attachment): array\n    {\n        if ($attachment instanceof UploadedFile) {\n            $name = $attachment->getClientOriginalName();\n\n            $content = file_get_contents($attachment->getRealPath());\n\n            $mimeType = $attachment->getMimeType();\n        } else {\n            $name = $attachment->name;\n\n            $content = $attachment->content;\n\n            $mimeType = $attachment->mime;\n        }\n\n        $path = 'emails/'.$email->id.'/'.$name;\n\n        Storage::put($path, $content);\n\n        $attributes = [\n            'path' => $path,\n            'name' => $name,\n            'content_type' => $mimeType,\n            'size' => Storage::size($path),\n            'email_id' => $email->id,\n        ];\n\n        return $attributes;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Email/src/Repositories/EmailRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Email\\Repositories;\n\nuse Illuminate\\Container\\Container;\nuse Webkul\\Core\\Eloquent\\Repository;\nuse Webkul\\Email\\Contracts\\Email;\n\nclass EmailRepository extends Repository\n{\n    public function __construct(\n        protected AttachmentRepository $attachmentRepository,\n        Container $container\n    ) {\n        parent::__construct($container);\n    }\n\n    /**\n     * Specify model class name.\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return Email::class;\n    }\n\n    /**\n     * Create.\n     *\n     * @return Email\n     */\n    public function create(array $data)\n    {\n        $uniqueId = time().'@'.config('mail.domain');\n\n        $referenceIds = [];\n\n        if (isset($data['parent_id'])) {\n            $parent = parent::findOrFail($data['parent_id']);\n\n            $referenceIds = $parent->reference_ids ?? [];\n        }\n\n        $data = $this->sanitizeEmails(array_merge([\n            'source' => 'web',\n            'from' => config('mail.from.address'),\n            'user_type' => 'admin',\n            'folders' => isset($data['is_draft']) ? ['draft'] : ['outbox'],\n            'unique_id' => $uniqueId,\n            'message_id' => $uniqueId,\n            'reference_ids' => array_merge($referenceIds, [$uniqueId]),\n        ], $data));\n\n        $email = parent::create($data);\n\n        $this->attachmentRepository->uploadAttachments($email, $data);\n\n        return $email;\n    }\n\n    /**\n     * Update.\n     *\n     * @param  int  $id\n     * @param  string  $attribute\n     * @return Email\n     */\n    public function update(array $data, $id, $attribute = 'id')\n    {\n        return parent::update($this->sanitizeEmails($data), $id);\n    }\n\n    /**\n     * Sanitize emails.\n     *\n     * @return array\n     */\n    public function sanitizeEmails(array $data)\n    {\n        if (isset($data['reply_to'])) {\n            $data['reply_to'] = array_values(array_filter($data['reply_to']));\n        }\n\n        if (isset($data['cc'])) {\n            $data['cc'] = array_values(array_filter($data['cc']));\n        }\n\n        if (isset($data['bcc'])) {\n            $data['bcc'] = array_values(array_filter($data['bcc']));\n        }\n\n        return $data;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/EmailTemplate/src/Contracts/EmailTemplate.php",
    "content": "<?php\n\nnamespace Webkul\\EmailTemplate\\Contracts;\n\ninterface EmailTemplate {}\n"
  },
  {
    "path": "packages/Webkul/EmailTemplate/src/Database/Migrations/2021_09_03_172713_create_email_templates_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('email_templates', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->string('subject');\n            $table->text('content');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('email_templates');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/EmailTemplate/src/Database/Migrations/2025_07_09_133553_alter_email_templates_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::table('email_templates', function (Blueprint $table) {\n            $table->string('name')->unique()->change();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::table('email_templates', function (Blueprint $table) {\n            $table->dropUnique(['name']);\n\n            $table->string('name')->change();\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/EmailTemplate/src/Models/EmailTemplate.php",
    "content": "<?php\n\nnamespace Webkul\\EmailTemplate\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\EmailTemplate\\Contracts\\EmailTemplate as EmailTemplateContract;\n\nclass EmailTemplate extends Model implements EmailTemplateContract\n{\n    protected $fillable = [\n        'name',\n        'subject',\n        'content',\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/EmailTemplate/src/Models/EmailTemplateProxy.php",
    "content": "<?php\n\nnamespace Webkul\\EmailTemplate\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass EmailTemplateProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/EmailTemplate/src/Providers/EmailTemplateServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\EmailTemplate\\Providers;\n\nuse Illuminate\\Support\\ServiceProvider;\n\nclass EmailTemplateServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap services.\n     *\n     * @return void\n     */\n    public function boot()\n    {\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/EmailTemplate/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\EmailTemplate\\Providers;\n\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\nuse Webkul\\EmailTemplate\\Models\\EmailTemplate;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    protected $models = [\n        EmailTemplate::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/EmailTemplate/src/Repositories/EmailTemplateRepository.php",
    "content": "<?php\n\nnamespace Webkul\\EmailTemplate\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass EmailTemplateRepository extends Repository\n{\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\EmailTemplate\\Contracts\\EmailTemplate';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/.gitignore",
    "content": "/node_modules\n/npm-debug.log\n/package-lock.json\n"
  },
  {
    "path": "packages/Webkul/Installer/composer.json",
    "content": "{\n    \"name\": \"krayin/laravel-installer\",\n    \"license\": \"MIT\",\n    \"description\": \"Installer package\",\n    \"authors\": [\n        {\n            \"name\": \"krayin\",\n            \"email\": \"support@krayin.com\"\n        }\n    ],\n    \"require\": {},\n    \"autoload\": {\n        \"psr-4\": {\n            \"Webkul\\\\Installer\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"laravel\": {\n            \"providers\": [\n                \"Webkul\\\\Installer\\\\Providers\\\\InstallerServiceProvider\"\n            ],\n            \"aliases\": {}\n        }\n    },\n    \"minimum-stability\": \"dev\"\n}"
  },
  {
    "path": "packages/Webkul/Installer/package.json",
    "content": "{\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"vite\",\n    \"build\": \"vite build\"\n  },\n  \"devDependencies\": {\n    \"autoprefixer\": \"^10.4.16\",\n    \"axios\": \"^1.6.4\",\n    \"laravel-vite-plugin\": \"^0.7.2\",\n    \"postcss\": \"^8.4.23\",\n    \"tailwindcss\": \"^3.3.2\",\n    \"vite\": \"^4.0.0\",\n    \"vue\": \"^3.4.19\"\n  },\n  \"dependencies\": {\n    \"@vee-validate/i18n\": \"^4.9.1\",\n    \"@vee-validate/rules\": \"^4.9.1\",\n    \"@vitejs/plugin-vue\": \"^4.2.3\",\n    \"mitt\": \"^3.0.0\",\n    \"vee-validate\": \"^4.9.1\",\n    \"vue-flatpickr\": \"^2.3.0\"\n  }\n}"
  },
  {
    "path": "packages/Webkul/Installer/postcss.config.js",
    "content": "module.exports = {\n  plugins: {\n    tailwindcss: {},\n    autoprefixer: {},\n  },\n}"
  },
  {
    "path": "packages/Webkul/Installer/src/Console/Commands/Installer.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Console\\Commands;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\File;\nuse Webkul\\Core\\Providers\\CoreServiceProvider;\nuse Webkul\\Installer\\Database\\Seeders\\DatabaseSeeder as KrayinDatabaseSeeder;\nuse Webkul\\Installer\\Events\\ComposerEvents;\n\nuse function Laravel\\Prompts\\password;\nuse function Laravel\\Prompts\\select;\nuse function Laravel\\Prompts\\text;\n\nclass Installer extends Command\n{\n    /**\n     * The name and signature of the console command.\n     *\n     * @var string\n     */\n    protected $signature = 'krayin-crm:install\n        { --skip-env-check : Skip env check. }\n        { --skip-admin-creation : Skip admin creation. }';\n\n    /**\n     * The console command description.\n     *\n     * @var string\n     */\n    protected $description = 'krayin installer.';\n\n    /**\n     * Locales list.\n     *\n     * @var array\n     */\n    protected $locales = [\n        'ar' => 'Arabic',\n        'en' => 'English',\n        'tr' => 'Turkish',\n        'es' => 'Spanish',\n        'fa' => 'Persian',\n        'pt_BR' => 'Portuguese',\n    ];\n\n    /**\n     * Currencies list.\n     *\n     * @var array\n     */\n    protected $currencies = [\n        'AED' => 'United Arab Emirates Dirham',\n        'ARS' => 'Argentine Peso',\n        'AUD' => 'Australian Dollar',\n        'BDT' => 'Bangladeshi Taka',\n        'BRL' => 'Brazilian Real',\n        'CAD' => 'Canadian Dollar',\n        'CHF' => 'Swiss Franc',\n        'CLP' => 'Chilean Peso',\n        'CNY' => 'Chinese Yuan',\n        'COP' => 'Colombian Peso',\n        'CZK' => 'Czech Koruna',\n        'DKK' => 'Danish Krone',\n        'DZD' => 'Algerian Dinar',\n        'EGP' => 'Egyptian Pound',\n        'EUR' => 'Euro',\n        'FJD' => 'Fijian Dollar',\n        'GBP' => 'British Pound Sterling',\n        'HKD' => 'Hong Kong Dollar',\n        'HUF' => 'Hungarian Forint',\n        'IDR' => 'Indonesian Rupiah',\n        'ILS' => 'Israeli New Shekel',\n        'INR' => 'Indian Rupee',\n        'JOD' => 'Jordanian Dinar',\n        'JPY' => 'Japanese Yen',\n        'KRW' => 'South Korean Won',\n        'KWD' => 'Kuwaiti Dinar',\n        'KZT' => 'Kazakhstani Tenge',\n        'LBP' => 'Lebanese Pound',\n        'LKR' => 'Sri Lankan Rupee',\n        'LYD' => 'Libyan Dinar',\n        'MAD' => 'Moroccan Dirham',\n        'MUR' => 'Mauritian Rupee',\n        'MXN' => 'Mexican Peso',\n        'MYR' => 'Malaysian Ringgit',\n        'NGN' => 'Nigerian Naira',\n        'NOK' => 'Norwegian Krone',\n        'NPR' => 'Nepalese Rupee',\n        'NZD' => 'New Zealand Dollar',\n        'OMR' => 'Omani Rial',\n        'PAB' => 'Panamanian Balboa',\n        'PEN' => 'Peruvian Nuevo Sol',\n        'PHP' => 'Philippine Peso',\n        'PKR' => 'Pakistani Rupee',\n        'PLN' => 'Polish Zloty',\n        'PYG' => 'Paraguayan Guarani',\n        'QAR' => 'Qatari Rial',\n        'RON' => 'Romanian Leu',\n        'RUB' => 'Russian Ruble',\n        'SAR' => 'Saudi Riyal',\n        'SEK' => 'Swedish Krona',\n        'SGD' => 'Singapore Dollar',\n        'THB' => 'Thai Baht',\n        'TND' => 'Tunisian Dinar',\n        'TRY' => 'Turkish Lira',\n        'TWD' => 'New Taiwan Dollar',\n        'UAH' => 'Ukrainian Hryvnia',\n        'USD' => 'United States Dollar',\n        'UZS' => 'Uzbekistani Som',\n        'VEF' => 'Venezuelan Bolívar',\n        'VND' => 'Vietnamese Dong',\n        'XAF' => 'CFA Franc BEAC',\n        'XOF' => 'CFA Franc BCEAO',\n        'ZAR' => 'South African Rand',\n        'ZMW' => 'Zambian Kwacha',\n    ];\n\n    /**\n     * Install and configure krayin.\n     */\n    public function handle()\n    {\n        $applicationDetails = ! $this->option('skip-env-check')\n            ? $this->checkForEnvFile()\n            : [];\n\n        $this->loadEnvConfigAtRuntime();\n\n        $this->warn('Step: Generating key...');\n        $this->call('key:generate');\n\n        $this->warn('Step: Migrating all tables...');\n        $this->call('migrate:fresh');\n\n        $this->warn('Step: Seeding basic data for Krayin kickstart...');\n        $this->info(app(KrayinDatabaseSeeder::class)->run([\n            'locale' => $applicationDetails['locale'] ?? 'en',\n            'currency' => $applicationDetails['currency'] ?? 'USD',\n        ]));\n\n        $this->warn('Step: Publishing assets and configurations...');\n        $result = $this->call('vendor:publish', ['--provider' => CoreServiceProvider::class, '--force' => true]);\n        $this->info($result);\n\n        $this->warn('Step: Linking storage directory...');\n        $this->call('storage:link');\n\n        $this->warn('Step: Clearing cached bootstrap files...');\n        $this->call('optimize:clear');\n\n        if (! $this->option('skip-admin-creation')) {\n            $this->warn('Step: Create admin credentials...');\n\n            $this->createAdminCredentials();\n        }\n\n        ComposerEvents::postCreateProject();\n    }\n\n    /**\n     *  Checking .env file and if not found then create .env file\n     *\n     * @return ?array\n     */\n    protected function checkForEnvFile()\n    {\n        if (! file_exists(base_path('.env'))) {\n            $this->info('Creating the environment configuration file.');\n\n            File::copy('.env.example', '.env');\n        } else {\n            $this->info('Great! your environment configuration file already exists.');\n        }\n\n        return $this->createEnvFile();\n    }\n\n    /**\n     * Create a new .env file. Afterwards, request environment configuration details and set them\n     * in the .env file to facilitate the migration to our database.\n     *\n     * @return ?array\n     */\n    protected function createEnvFile()\n    {\n        try {\n            $applicationDetails = $this->askForApplicationDetails();\n\n            $this->askForDatabaseDetails();\n\n            return $applicationDetails;\n        } catch (\\Exception $e) {\n            $this->error('Error in creating .env file, please create it manually and then run `php artisan migrate` again.');\n        }\n    }\n\n    /**\n     * Ask for application details.\n     *\n     * @return void\n     */\n    protected function askForApplicationDetails()\n    {\n        $this->updateEnvVariable(\n            'APP_NAME',\n            'Please enter the application name',\n            env('APP_NAME', 'Krayin CRM')\n        );\n\n        $this->updateEnvVariable(\n            'APP_URL',\n            'Please enter the application URL',\n            env('APP_URL', 'http://localhost:8000')\n        );\n\n        $this->envUpdate(\n            'APP_TIMEZONE',\n            date_default_timezone_get()\n        );\n\n        $this->info('Your Default Timezone is '.date_default_timezone_get());\n\n        $locale = $this->updateEnvChoice(\n            'APP_LOCALE',\n            'Please select the default application locale',\n            $this->locales\n        );\n\n        $currency = $this->updateEnvChoice(\n            'APP_CURRENCY',\n            'Please select the default currency',\n            $this->currencies\n        );\n\n        return [\n            'locale' => $locale,\n            'currency' => $currency,\n        ];\n    }\n\n    /**\n     * Add the database credentials to the .env file.\n     */\n    protected function askForDatabaseDetails()\n    {\n        $databaseDetails = [\n            'DB_CONNECTION' => select(\n                'Please select the database connection',\n                ['mysql', 'pgsql', 'sqlsrv']\n            ),\n\n            'DB_HOST' => text(\n                label: 'Please enter the database host',\n                default: env('DB_HOST', '127.0.0.1'),\n                required: true\n            ),\n\n            'DB_PORT' => text(\n                label: 'Please enter the database port',\n                default: env('DB_PORT', '3306'),\n                required: true\n            ),\n\n            'DB_DATABASE' => text(\n                label: 'Please enter the database name',\n                default: env('DB_DATABASE', ''),\n                required: true\n            ),\n\n            'DB_PREFIX' => text(\n                label: 'Please enter the database prefix',\n                default: env('DB_PREFIX', ''),\n                hint: 'or press enter to continue',\n                validate: function ($value) {\n                    $input = strlen($value);\n\n                    if ($input\n                        && ($input < 1\n                        || $input > 6)\n                    ) {\n                        return 'The database prefix must be between 1 and 6 characters.';\n                    }\n\n                    if (preg_match('/[^a-zA-Z0-9_]/', $value)) {\n                        return 'The database prefix may only contain letters, numbers, and underscores.';\n                    }\n\n                    return null;\n                }\n            ),\n\n            'DB_USERNAME' => text(\n                label: 'Please enter your database username',\n                default: env('DB_USERNAME', ''),\n                required: true\n            ),\n\n            'DB_PASSWORD' => password(\n                label: 'Please enter your database password',\n                required: false\n            ),\n        ];\n\n        if (\n            ! $databaseDetails['DB_DATABASE']\n            || ! $databaseDetails['DB_USERNAME']\n            || ! $databaseDetails['DB_PASSWORD']\n        ) {\n            return $this->error('Please enter the database credentials.');\n        }\n\n        foreach ($databaseDetails as $key => $value) {\n            if ($value) {\n                $this->envUpdate($key, $value);\n            }\n        }\n    }\n\n    /**\n     * Create a admin credentials.\n     *\n     * @return mixed\n     */\n    protected function createAdminCredentials()\n    {\n        $adminName = text(\n            label: 'Enter the name of the admin user',\n            default: 'Example',\n            required: true\n        );\n\n        $adminEmail = text(\n            label: 'Enter the email address of the admin user',\n            default: 'admin@example.com',\n            validate: fn (string $value) => match (true) {\n                ! filter_var($value, FILTER_VALIDATE_EMAIL) => 'The email address you entered is not valid please try again.',\n                default => null\n            }\n        );\n\n        $adminPassword = text(\n            label: 'Configure the password for the admin user',\n            default: 'admin123',\n            required: true\n        );\n\n        $password = password_hash($adminPassword, PASSWORD_BCRYPT, ['cost' => 10]);\n\n        try {\n            DB::table('users')->updateOrInsert(\n                ['id' => 1],\n                [\n                    'name' => $adminName,\n                    'email' => $adminEmail,\n                    'password' => $password,\n                    'role_id' => 1,\n                    'status' => 1,\n                ]\n            );\n\n            $filePath = storage_path('installed');\n\n            File::put($filePath, 'Krayin is successfully installed');\n\n            $this->info('-----------------------------');\n            $this->info('Congratulations!');\n            $this->info('The installation has been finished and you can now use Krayin.');\n            $this->info('Go to '.env('APP_URL').'/admin/dashboard'.' and authenticate with:');\n            $this->info('Email: '.$adminEmail);\n            $this->info('Password: '.$adminPassword);\n            $this->info('Cheers!');\n\n            Event::dispatch('krayin.installed');\n        } catch (\\Exception $e) {\n            return $this->error($e->getMessage());\n        }\n    }\n\n    /**\n     * Loaded Env variables for config files.\n     */\n    protected function loadEnvConfigAtRuntime(): void\n    {\n        $this->warn('Loading configs...');\n\n        /**\n         * Setting application environment.\n         */\n        app()['env'] = $this->getEnvAtRuntime('APP_ENV');\n\n        /**\n         * Setting application configuration.\n         */\n        config([\n            'app.env' => $this->getEnvAtRuntime('APP_ENV'),\n            'app.name' => $this->getEnvAtRuntime('APP_NAME'),\n            'app.url' => $this->getEnvAtRuntime('APP_URL'),\n            'app.timezone' => $this->getEnvAtRuntime('APP_TIMEZONE'),\n            'app.locale' => $this->getEnvAtRuntime('APP_LOCALE'),\n            'app.currency' => $this->getEnvAtRuntime('APP_CURRENCY'),\n        ]);\n\n        /**\n         * Setting database configurations.\n         */\n        $databaseConnection = $this->getEnvAtRuntime('DB_CONNECTION');\n\n        config([\n            \"database.connections.{$databaseConnection}.host\" => $this->getEnvAtRuntime('DB_HOST'),\n            \"database.connections.{$databaseConnection}.port\" => $this->getEnvAtRuntime('DB_PORT'),\n            \"database.connections.{$databaseConnection}.database\" => $this->getEnvAtRuntime('DB_DATABASE'),\n            \"database.connections.{$databaseConnection}.username\" => $this->getEnvAtRuntime('DB_USERNAME'),\n            \"database.connections.{$databaseConnection}.password\" => $this->getEnvAtRuntime('DB_PASSWORD'),\n            \"database.connections.{$databaseConnection}.prefix\" => $this->getEnvAtRuntime('DB_PREFIX'),\n        ]);\n\n        DB::purge($databaseConnection);\n\n        $this->info('Configuration loaded...');\n    }\n\n    /**\n     * Method for asking the details of .env files\n     */\n    protected function updateEnvVariable(string $key, string $question, string $defaultValue): void\n    {\n        $input = text(\n            label: $question,\n            default: $defaultValue,\n            required: true\n        );\n\n        $this->envUpdate($key, $input ?: $defaultValue);\n    }\n\n    /**\n     * Method for asking choice based on the list of options.\n     *\n     * @return string\n     */\n    protected function updateEnvChoice(string $key, string $question, array $choices)\n    {\n        $choice = select(\n            label: $question,\n            options: $choices,\n            default: env($key)\n        );\n\n        $this->envUpdate($key, $choice);\n\n        return $choice;\n    }\n\n    /**\n     * Update the .env values.\n     */\n    protected function envUpdate(string $key, string $value): void\n    {\n        $data = file_get_contents(base_path('.env'));\n\n        // Check if $value contains spaces, and if so, add double quotes\n        if (preg_match('/\\s/', $value)) {\n            $value = '\"'.$value.'\"';\n        }\n\n        $data = preg_replace(\"/$key=(.*)/\", \"$key=$value\", $data);\n\n        file_put_contents(base_path('.env'), $data);\n    }\n\n    /**\n     * Check key in `.env` file because it will help to find values at runtime.\n     */\n    protected static function getEnvAtRuntime(string $key): string|bool\n    {\n        if ($data = file(base_path('.env'))) {\n            foreach ($data as $line) {\n                $line = preg_replace('/\\s+/', '', $line);\n\n                $rowValues = explode('=', $line);\n\n                if (strlen($line) !== 0) {\n                    if (strpos($key, $rowValues[0]) !== false) {\n                        return $rowValues[1];\n                    }\n                }\n            }\n        }\n\n        return false;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Data/countries.json",
    "content": "[  \n   {  \n      \"id\":1,\n      \"code\":\"AF\",\n      \"name\":\"Afghanistan\"\n   },\n   {  \n      \"id\":2,\n      \"code\":\"AX\",\n      \"name\":\"\\u00c5land Islands\"\n   },\n   {  \n      \"id\":3,\n      \"code\":\"AL\",\n      \"name\":\"Albania\"\n   },\n   {  \n      \"id\":4,\n      \"code\":\"DZ\",\n      \"name\":\"Algeria\"\n   },\n   {  \n      \"id\":5,\n      \"code\":\"AS\",\n      \"name\":\"American Samoa\"\n   },\n   {  \n      \"id\":6,\n      \"code\":\"AD\",\n      \"name\":\"Andorra\"\n   },\n   {  \n      \"id\":7,\n      \"code\":\"AO\",\n      \"name\":\"Angola\"\n   },\n   {  \n      \"id\":8,\n      \"code\":\"AI\",\n      \"name\":\"Anguilla\"\n   },\n   {  \n      \"id\":9,\n      \"code\":\"AQ\",\n      \"name\":\"Antarctica\"\n   },\n   {  \n      \"id\":10,\n      \"code\":\"AG\",\n      \"name\":\"Antigua & Barbuda\"\n   },\n   {  \n      \"id\":11,\n      \"code\":\"AR\",\n      \"name\":\"Argentina\"\n   },\n   {  \n      \"id\":12,\n      \"code\":\"AM\",\n      \"name\":\"Armenia\"\n   },\n   {  \n      \"id\":13,\n      \"code\":\"AW\",\n      \"name\":\"Aruba\"\n   },\n   {  \n      \"id\":14,\n      \"code\":\"AC\",\n      \"name\":\"Ascension Island\"\n   },\n   {  \n      \"id\":15,\n      \"code\":\"AU\",\n      \"name\":\"Australia\"\n   },\n   {  \n      \"id\":16,\n      \"code\":\"AT\",\n      \"name\":\"Austria\"\n   },\n   {  \n      \"id\":17,\n      \"code\":\"AZ\",\n      \"name\":\"Azerbaijan\"\n   },\n   {  \n      \"id\":18,\n      \"code\":\"BS\",\n      \"name\":\"Bahamas\"\n   },\n   {  \n      \"id\":19,\n      \"code\":\"BH\",\n      \"name\":\"Bahrain\"\n   },\n   {  \n      \"id\":20,\n      \"code\":\"BD\",\n      \"name\":\"Bangladesh\"\n   },\n   {  \n      \"id\":21,\n      \"code\":\"BB\",\n      \"name\":\"Barbados\"\n   },\n   {  \n      \"id\":22,\n      \"code\":\"BY\",\n      \"name\":\"Belarus\"\n   },\n   {  \n      \"id\":23,\n      \"code\":\"BE\",\n      \"name\":\"Belgium\"\n   },\n   {  \n      \"id\":24,\n      \"code\":\"BZ\",\n      \"name\":\"Belize\"\n   },\n   {  \n      \"id\":25,\n      \"code\":\"BJ\",\n      \"name\":\"Benin\"\n   },\n   {  \n      \"id\":26,\n      \"code\":\"BM\",\n      \"name\":\"Bermuda\"\n   },\n   {  \n      \"id\":27,\n      \"code\":\"BT\",\n      \"name\":\"Bhutan\"\n   },\n   {  \n      \"id\":28,\n      \"code\":\"BO\",\n      \"name\":\"Bolivia\"\n   },\n   {  \n      \"id\":29,\n      \"code\":\"BA\",\n      \"name\":\"Bosnia & Herzegovina\"\n   },\n   {  \n      \"id\":30,\n      \"code\":\"BW\",\n      \"name\":\"Botswana\"\n   },\n   {  \n      \"id\":31,\n      \"code\":\"BR\",\n      \"name\":\"Brazil\"\n   },\n   {  \n      \"id\":32,\n      \"code\":\"IO\",\n      \"name\":\"British Indian Ocean Territory\"\n   },\n   {  \n      \"id\":33,\n      \"code\":\"VG\",\n      \"name\":\"British Virgin Islands\"\n   },\n   {  \n      \"id\":34,\n      \"code\":\"BN\",\n      \"name\":\"Brunei\"\n   },\n   {  \n      \"id\":35,\n      \"code\":\"BG\",\n      \"name\":\"Bulgaria\"\n   },\n   {  \n      \"id\":36,\n      \"code\":\"BF\",\n      \"name\":\"Burkina Faso\"\n   },\n   {  \n      \"id\":37,\n      \"code\":\"BI\",\n      \"name\":\"Burundi\"\n   },\n   {  \n      \"id\":38,\n      \"code\":\"KH\",\n      \"name\":\"Cambodia\"\n   },\n   {  \n      \"id\":39,\n      \"code\":\"CM\",\n      \"name\":\"Cameroon\"\n   },\n   {  \n      \"id\":40,\n      \"code\":\"CA\",\n      \"name\":\"Canada\"\n   },\n   {  \n      \"id\":41,\n      \"code\":\"IC\",\n      \"name\":\"Canary Islands\"\n   },\n   {  \n      \"id\":42,\n      \"code\":\"CV\",\n      \"name\":\"Cape Verde\"\n   },\n   {  \n      \"id\":43,\n      \"code\":\"BQ\",\n      \"name\":\"Caribbean Netherlands\"\n   },\n   {  \n      \"id\":44,\n      \"code\":\"KY\",\n      \"name\":\"Cayman Islands\"\n   },\n   {  \n      \"id\":45,\n      \"code\":\"CF\",\n      \"name\":\"Central African Republic\"\n   },\n   {  \n      \"id\":46,\n      \"code\":\"EA\",\n      \"name\":\"Ceuta & Melilla\"\n   },\n   {  \n      \"id\":47,\n      \"code\":\"TD\",\n      \"name\":\"Chad\"\n   },\n   {  \n      \"id\":48,\n      \"code\":\"CL\",\n      \"name\":\"Chile\"\n   },\n   {  \n      \"id\":49,\n      \"code\":\"CN\",\n      \"name\":\"China\"\n   },\n   {  \n      \"id\":50,\n      \"code\":\"CX\",\n      \"name\":\"Christmas Island\"\n   },\n   {  \n      \"id\":51,\n      \"code\":\"CC\",\n      \"name\":\"Cocos (Keeling) Islands\"\n   },\n   {  \n      \"id\":52,\n      \"code\":\"CO\",\n      \"name\":\"Colombia\"\n   },\n   {  \n      \"id\":53,\n      \"code\":\"KM\",\n      \"name\":\"Comoros\"\n   },\n   {  \n      \"id\":54,\n      \"code\":\"CG\",\n      \"name\":\"Congo - Brazzaville\"\n   },\n   {  \n      \"id\":55,\n      \"code\":\"CD\",\n      \"name\":\"Congo - Kinshasa\"\n   },\n   {  \n      \"id\":56,\n      \"code\":\"CK\",\n      \"name\":\"Cook Islands\"\n   },\n   {  \n      \"id\":57,\n      \"code\":\"CR\",\n      \"name\":\"Costa Rica\"\n   },\n   {  \n      \"id\":58,\n      \"code\":\"CI\",\n      \"name\":\"C\\u00f4te d\\u2019Ivoire\"\n   },\n   {  \n      \"id\":59,\n      \"code\":\"HR\",\n      \"name\":\"Croatia\"\n   },\n   {  \n      \"id\":60,\n      \"code\":\"CU\",\n      \"name\":\"Cuba\"\n   },\n   {  \n      \"id\":61,\n      \"code\":\"CW\",\n      \"name\":\"Cura\\u00e7ao\"\n   },\n   {  \n      \"id\":62,\n      \"code\":\"CY\",\n      \"name\":\"Cyprus\"\n   },\n   {  \n      \"id\":63,\n      \"code\":\"CZ\",\n      \"name\":\"Czechia\"\n   },\n   {  \n      \"id\":64,\n      \"code\":\"DK\",\n      \"name\":\"Denmark\"\n   },\n   {  \n      \"id\":65,\n      \"code\":\"DG\",\n      \"name\":\"Diego Garcia\"\n   },\n   {  \n      \"id\":66,\n      \"code\":\"DJ\",\n      \"name\":\"Djibouti\"\n   },\n   {  \n      \"id\":67,\n      \"code\":\"DM\",\n      \"name\":\"Dominica\"\n   },\n   {  \n      \"id\":68,\n      \"code\":\"DO\",\n      \"name\":\"Dominican Republic\"\n   },\n   {  \n      \"id\":69,\n      \"code\":\"EC\",\n      \"name\":\"Ecuador\"\n   },\n   {  \n      \"id\":70,\n      \"code\":\"EG\",\n      \"name\":\"Egypt\"\n   },\n   {  \n      \"id\":71,\n      \"code\":\"SV\",\n      \"name\":\"El Salvador\"\n   },\n   {  \n      \"id\":72,\n      \"code\":\"GQ\",\n      \"name\":\"Equatorial Guinea\"\n   },\n   {  \n      \"id\":73,\n      \"code\":\"ER\",\n      \"name\":\"Eritrea\"\n   },\n   {  \n      \"id\":74,\n      \"code\":\"EE\",\n      \"name\":\"Estonia\"\n   },\n   {  \n      \"id\":75,\n      \"code\":\"ET\",\n      \"name\":\"Ethiopia\"\n   },\n   {  \n      \"id\":76,\n      \"code\":\"EZ\",\n      \"name\":\"Eurozone\"\n   },\n   {  \n      \"id\":77,\n      \"code\":\"FK\",\n      \"name\":\"Falkland Islands\"\n   },\n   {  \n      \"id\":78,\n      \"code\":\"FO\",\n      \"name\":\"Faroe Islands\"\n   },\n   {  \n      \"id\":79,\n      \"code\":\"FJ\",\n      \"name\":\"Fiji\"\n   },\n   {  \n      \"id\":80,\n      \"code\":\"FI\",\n      \"name\":\"Finland\"\n   },\n   {  \n      \"id\":81,\n      \"code\":\"FR\",\n      \"name\":\"France\"\n   },\n   {  \n      \"id\":82,\n      \"code\":\"GF\",\n      \"name\":\"French Guiana\"\n   },\n   {  \n      \"id\":83,\n      \"code\":\"PF\",\n      \"name\":\"French Polynesia\"\n   },\n   {  \n      \"id\":84,\n      \"code\":\"TF\",\n      \"name\":\"French Southern Territories\"\n   },\n   {  \n      \"id\":85,\n      \"code\":\"GA\",\n      \"name\":\"Gabon\"\n   },\n   {  \n      \"id\":86,\n      \"code\":\"GM\",\n      \"name\":\"Gambia\"\n   },\n   {  \n      \"id\":87,\n      \"code\":\"GE\",\n      \"name\":\"Georgia\"\n   },\n   {  \n      \"id\":88,\n      \"code\":\"DE\",\n      \"name\":\"Germany\"\n   },\n   {  \n      \"id\":89,\n      \"code\":\"GH\",\n      \"name\":\"Ghana\"\n   },\n   {  \n      \"id\":90,\n      \"code\":\"GI\",\n      \"name\":\"Gibraltar\"\n   },\n   {  \n      \"id\":91,\n      \"code\":\"GR\",\n      \"name\":\"Greece\"\n   },\n   {  \n      \"id\":92,\n      \"code\":\"GL\",\n      \"name\":\"Greenland\"\n   },\n   {  \n      \"id\":93,\n      \"code\":\"GD\",\n      \"name\":\"Grenada\"\n   },\n   {  \n      \"id\":94,\n      \"code\":\"GP\",\n      \"name\":\"Guadeloupe\"\n   },\n   {  \n      \"id\":95,\n      \"code\":\"GU\",\n      \"name\":\"Guam\"\n   },\n   {  \n      \"id\":96,\n      \"code\":\"GT\",\n      \"name\":\"Guatemala\"\n   },\n   {  \n      \"id\":97,\n      \"code\":\"GG\",\n      \"name\":\"Guernsey\"\n   },\n   {  \n      \"id\":98,\n      \"code\":\"GN\",\n      \"name\":\"Guinea\"\n   },\n   {  \n      \"id\":99,\n      \"code\":\"GW\",\n      \"name\":\"Guinea-Bissau\"\n   },\n   {  \n      \"id\":100,\n      \"code\":\"GY\",\n      \"name\":\"Guyana\"\n   },\n   {  \n      \"id\":101,\n      \"code\":\"HT\",\n      \"name\":\"Haiti\"\n   },\n   {  \n      \"id\":102,\n      \"code\":\"HN\",\n      \"name\":\"Honduras\"\n   },\n   {  \n      \"id\":103,\n      \"code\":\"HK\",\n      \"name\":\"Hong Kong SAR China\"\n   },\n   {  \n      \"id\":104,\n      \"code\":\"HU\",\n      \"name\":\"Hungary\"\n   },\n   {  \n      \"id\":105,\n      \"code\":\"IS\",\n      \"name\":\"Iceland\"\n   },\n   {  \n      \"id\":106,\n      \"code\":\"IN\",\n      \"name\":\"India\"\n   },\n   {  \n      \"id\":107,\n      \"code\":\"ID\",\n      \"name\":\"Indonesia\"\n   },\n   {  \n      \"id\":108,\n      \"code\":\"IR\",\n      \"name\":\"Iran\"\n   },\n   {  \n      \"id\":109,\n      \"code\":\"IQ\",\n      \"name\":\"Iraq\"\n   },\n   {  \n      \"id\":110,\n      \"code\":\"IE\",\n      \"name\":\"Ireland\"\n   },\n   {  \n      \"id\":111,\n      \"code\":\"IM\",\n      \"name\":\"Isle of Man\"\n   },\n   {  \n      \"id\":112,\n      \"code\":\"IL\",\n      \"name\":\"Israel\"\n   },\n   {  \n      \"id\":113,\n      \"code\":\"IT\",\n      \"name\":\"Italy\"\n   },\n   {  \n      \"id\":114,\n      \"code\":\"JM\",\n      \"name\":\"Jamaica\"\n   },\n   {  \n      \"id\":115,\n      \"code\":\"JP\",\n      \"name\":\"Japan\"\n   },\n   {  \n      \"id\":116,\n      \"code\":\"JE\",\n      \"name\":\"Jersey\"\n   },\n   {  \n      \"id\":117,\n      \"code\":\"JO\",\n      \"name\":\"Jordan\"\n   },\n   {  \n      \"id\":118,\n      \"code\":\"KZ\",\n      \"name\":\"Kazakhstan\"\n   },\n   {  \n      \"id\":119,\n      \"code\":\"KE\",\n      \"name\":\"Kenya\"\n   },\n   {  \n      \"id\":120,\n      \"code\":\"KI\",\n      \"name\":\"Kiribati\"\n   },\n   {  \n      \"id\":121,\n      \"code\":\"XK\",\n      \"name\":\"Kosovo\"\n   },\n   {  \n      \"id\":122,\n      \"code\":\"KW\",\n      \"name\":\"Kuwait\"\n   },\n   {  \n      \"id\":123,\n      \"code\":\"KG\",\n      \"name\":\"Kyrgyzstan\"\n   },\n   {  \n      \"id\":124,\n      \"code\":\"LA\",\n      \"name\":\"Laos\"\n   },\n   {  \n      \"id\":125,\n      \"code\":\"LV\",\n      \"name\":\"Latvia\"\n   },\n   {  \n      \"id\":126,\n      \"code\":\"LB\",\n      \"name\":\"Lebanon\"\n   },\n   {  \n      \"id\":127,\n      \"code\":\"LS\",\n      \"name\":\"Lesotho\"\n   },\n   {  \n      \"id\":128,\n      \"code\":\"LR\",\n      \"name\":\"Liberia\"\n   },\n   {  \n      \"id\":129,\n      \"code\":\"LY\",\n      \"name\":\"Libya\"\n   },\n   {  \n      \"id\":130,\n      \"code\":\"LI\",\n      \"name\":\"Liechtenstein\"\n   },\n   {  \n      \"id\":131,\n      \"code\":\"LT\",\n      \"name\":\"Lithuania\"\n   },\n   {  \n      \"id\":132,\n      \"code\":\"LU\",\n      \"name\":\"Luxembourg\"\n   },\n   {  \n      \"id\":133,\n      \"code\":\"MO\",\n      \"name\":\"Macau SAR China\"\n   },\n   {  \n      \"id\":134,\n      \"code\":\"MK\",\n      \"name\":\"Macedonia\"\n   },\n   {  \n      \"id\":135,\n      \"code\":\"MG\",\n      \"name\":\"Madagascar\"\n   },\n   {  \n      \"id\":136,\n      \"code\":\"MW\",\n      \"name\":\"Malawi\"\n   },\n   {  \n      \"id\":137,\n      \"code\":\"MY\",\n      \"name\":\"Malaysia\"\n   },\n   {  \n      \"id\":138,\n      \"code\":\"MV\",\n      \"name\":\"Maldives\"\n   },\n   {  \n      \"id\":139,\n      \"code\":\"ML\",\n      \"name\":\"Mali\"\n   },\n   {  \n      \"id\":140,\n      \"code\":\"MT\",\n      \"name\":\"Malta\"\n   },\n   {  \n      \"id\":141,\n      \"code\":\"MH\",\n      \"name\":\"Marshall Islands\"\n   },\n   {  \n      \"id\":142,\n      \"code\":\"MQ\",\n      \"name\":\"Martinique\"\n   },\n   {  \n      \"id\":143,\n      \"code\":\"MR\",\n      \"name\":\"Mauritania\"\n   },\n   {  \n      \"id\":144,\n      \"code\":\"MU\",\n      \"name\":\"Mauritius\"\n   },\n   {  \n      \"id\":145,\n      \"code\":\"YT\",\n      \"name\":\"Mayotte\"\n   },\n   {  \n      \"id\":146,\n      \"code\":\"MX\",\n      \"name\":\"Mexico\"\n   },\n   {  \n      \"id\":147,\n      \"code\":\"FM\",\n      \"name\":\"Micronesia\"\n   },\n   {  \n      \"id\":148,\n      \"code\":\"MD\",\n      \"name\":\"Moldova\"\n   },\n   {  \n      \"id\":149,\n      \"code\":\"MC\",\n      \"name\":\"Monaco\"\n   },\n   {  \n      \"id\":150,\n      \"code\":\"MN\",\n      \"name\":\"Mongolia\"\n   },\n   {  \n      \"id\":151,\n      \"code\":\"ME\",\n      \"name\":\"Montenegro\"\n   },\n   {  \n      \"id\":152,\n      \"code\":\"MS\",\n      \"name\":\"Montserrat\"\n   },\n   {  \n      \"id\":153,\n      \"code\":\"MA\",\n      \"name\":\"Morocco\"\n   },\n   {  \n      \"id\":154,\n      \"code\":\"MZ\",\n      \"name\":\"Mozambique\"\n   },\n   {  \n      \"id\":155,\n      \"code\":\"MM\",\n      \"name\":\"Myanmar (Burma)\"\n   },\n   {  \n      \"id\":156,\n      \"code\":\"NA\",\n      \"name\":\"Namibia\"\n   },\n   {  \n      \"id\":157,\n      \"code\":\"NR\",\n      \"name\":\"Nauru\"\n   },\n   {  \n      \"id\":158,\n      \"code\":\"NP\",\n      \"name\":\"Nepal\"\n   },\n   {  \n      \"id\":159,\n      \"code\":\"NL\",\n      \"name\":\"Netherlands\"\n   },\n   {  \n      \"id\":160,\n      \"code\":\"NC\",\n      \"name\":\"New Caledonia\"\n   },\n   {  \n      \"id\":161,\n      \"code\":\"NZ\",\n      \"name\":\"New Zealand\"\n   },\n   {  \n      \"id\":162,\n      \"code\":\"NI\",\n      \"name\":\"Nicaragua\"\n   },\n   {  \n      \"id\":163,\n      \"code\":\"NE\",\n      \"name\":\"Niger\"\n   },\n   {  \n      \"id\":164,\n      \"code\":\"NG\",\n      \"name\":\"Nigeria\"\n   },\n   {  \n      \"id\":165,\n      \"code\":\"NU\",\n      \"name\":\"Niue\"\n   },\n   {  \n      \"id\":166,\n      \"code\":\"NF\",\n      \"name\":\"Norfolk Island\"\n   },\n   {  \n      \"id\":167,\n      \"code\":\"KP\",\n      \"name\":\"North Korea\"\n   },\n   {  \n      \"id\":168,\n      \"code\":\"MP\",\n      \"name\":\"Northern Mariana Islands\"\n   },\n   {  \n      \"id\":169,\n      \"code\":\"NO\",\n      \"name\":\"Norway\"\n   },\n   {  \n      \"id\":170,\n      \"code\":\"OM\",\n      \"name\":\"Oman\"\n   },\n   {  \n      \"id\":171,\n      \"code\":\"PK\",\n      \"name\":\"Pakistan\"\n   },\n   {  \n      \"id\":172,\n      \"code\":\"PW\",\n      \"name\":\"Palau\"\n   },\n   {  \n      \"id\":173,\n      \"code\":\"PS\",\n      \"name\":\"Palestinian Territories\"\n   },\n   {  \n      \"id\":174,\n      \"code\":\"PA\",\n      \"name\":\"Panama\"\n   },\n   {  \n      \"id\":175,\n      \"code\":\"PG\",\n      \"name\":\"Papua New Guinea\"\n   },\n   {  \n      \"id\":176,\n      \"code\":\"PY\",\n      \"name\":\"Paraguay\"\n   },\n   {  \n      \"id\":177,\n      \"code\":\"PE\",\n      \"name\":\"Peru\"\n   },\n   {  \n      \"id\":178,\n      \"code\":\"PH\",\n      \"name\":\"Philippines\"\n   },\n   {  \n      \"id\":179,\n      \"code\":\"PN\",\n      \"name\":\"Pitcairn Islands\"\n   },\n   {  \n      \"id\":180,\n      \"code\":\"PL\",\n      \"name\":\"Poland\"\n   },\n   {  \n      \"id\":181,\n      \"code\":\"PT\",\n      \"name\":\"Portugal\"\n   },\n   {  \n      \"id\":182,\n      \"code\":\"PR\",\n      \"name\":\"Puerto Rico\"\n   },\n   {  \n      \"id\":183,\n      \"code\":\"QA\",\n      \"name\":\"Qatar\"\n   },\n   {  \n      \"id\":184,\n      \"code\":\"RE\",\n      \"name\":\"R\\u00e9union\"\n   },\n   {  \n      \"id\":185,\n      \"code\":\"RO\",\n      \"name\":\"Romania\"\n   },\n   {  \n      \"id\":186,\n      \"code\":\"RU\",\n      \"name\":\"Russia\"\n   },\n   {  \n      \"id\":187,\n      \"code\":\"RW\",\n      \"name\":\"Rwanda\"\n   },\n   {  \n      \"id\":188,\n      \"code\":\"WS\",\n      \"name\":\"Samoa\"\n   },\n   {  \n      \"id\":189,\n      \"code\":\"SM\",\n      \"name\":\"San Marino\"\n   },\n   {  \n      \"id\":190,\n      \"code\":\"ST\",\n      \"name\":\"S\\u00e3o Tom\\u00e9 & Pr\\u00edncipe\"\n   },\n   {  \n      \"id\":191,\n      \"code\":\"SA\",\n      \"name\":\"Saudi Arabia\"\n   },\n   {  \n      \"id\":192,\n      \"code\":\"SN\",\n      \"name\":\"Senegal\"\n   },\n   {  \n      \"id\":193,\n      \"code\":\"RS\",\n      \"name\":\"Serbia\"\n   },\n   {  \n      \"id\":194,\n      \"code\":\"SC\",\n      \"name\":\"Seychelles\"\n   },\n   {  \n      \"id\":195,\n      \"code\":\"SL\",\n      \"name\":\"Sierra Leone\"\n   },\n   {  \n      \"id\":196,\n      \"code\":\"SG\",\n      \"name\":\"Singapore\"\n   },\n   {  \n      \"id\":197,\n      \"code\":\"SX\",\n      \"name\":\"Sint Maarten\"\n   },\n   {  \n      \"id\":198,\n      \"code\":\"SK\",\n      \"name\":\"Slovakia\"\n   },\n   {  \n      \"id\":199,\n      \"code\":\"SI\",\n      \"name\":\"Slovenia\"\n   },\n   {  \n      \"id\":200,\n      \"code\":\"SB\",\n      \"name\":\"Solomon Islands\"\n   },\n   {  \n      \"id\":201,\n      \"code\":\"SO\",\n      \"name\":\"Somalia\"\n   },\n   {  \n      \"id\":202,\n      \"code\":\"ZA\",\n      \"name\":\"South Africa\"\n   },\n   {  \n      \"id\":203,\n      \"code\":\"GS\",\n      \"name\":\"South Georgia & South Sandwich Islands\"\n   },\n   {  \n      \"id\":204,\n      \"code\":\"KR\",\n      \"name\":\"South Korea\"\n   },\n   {  \n      \"id\":205,\n      \"code\":\"SS\",\n      \"name\":\"South Sudan\"\n   },\n   {  \n      \"id\":206,\n      \"code\":\"ES\",\n      \"name\":\"Spain\"\n   },\n   {  \n      \"id\":207,\n      \"code\":\"LK\",\n      \"name\":\"Sri Lanka\"\n   },\n   {  \n      \"id\":208,\n      \"code\":\"BL\",\n      \"name\":\"St. Barth\\u00e9lemy\"\n   },\n   {  \n      \"id\":209,\n      \"code\":\"SH\",\n      \"name\":\"St. Helena\"\n   },\n   {  \n      \"id\":210,\n      \"code\":\"KN\",\n      \"name\":\"St. Kitts & Nevis\"\n   },\n   {  \n      \"id\":211,\n      \"code\":\"LC\",\n      \"name\":\"St. Lucia\"\n   },\n   {  \n      \"id\":212,\n      \"code\":\"MF\",\n      \"name\":\"St. Martin\"\n   },\n   {  \n      \"id\":213,\n      \"code\":\"PM\",\n      \"name\":\"St. Pierre & Miquelon\"\n   },\n   {  \n      \"id\":214,\n      \"code\":\"VC\",\n      \"name\":\"St. Vincent & Grenadines\"\n   },\n   {  \n      \"id\":215,\n      \"code\":\"SD\",\n      \"name\":\"Sudan\"\n   },\n   {  \n      \"id\":216,\n      \"code\":\"SR\",\n      \"name\":\"Suriname\"\n   },\n   {  \n      \"id\":217,\n      \"code\":\"SJ\",\n      \"name\":\"Svalbard & Jan Mayen\"\n   },\n   {  \n      \"id\":218,\n      \"code\":\"SZ\",\n      \"name\":\"Swaziland\"\n   },\n   {  \n      \"id\":219,\n      \"code\":\"SE\",\n      \"name\":\"Sweden\"\n   },\n   {  \n      \"id\":220,\n      \"code\":\"CH\",\n      \"name\":\"Switzerland\"\n   },\n   {  \n      \"id\":221,\n      \"code\":\"SY\",\n      \"name\":\"Syria\"\n   },\n   {  \n      \"id\":222,\n      \"code\":\"TW\",\n      \"name\":\"Taiwan\"\n   },\n   {  \n      \"id\":223,\n      \"code\":\"TJ\",\n      \"name\":\"Tajikistan\"\n   },\n   {  \n      \"id\":224,\n      \"code\":\"TZ\",\n      \"name\":\"Tanzania\"\n   },\n   {  \n      \"id\":225,\n      \"code\":\"TH\",\n      \"name\":\"Thailand\"\n   },\n   {  \n      \"id\":226,\n      \"code\":\"TL\",\n      \"name\":\"Timor-Leste\"\n   },\n   {  \n      \"id\":227,\n      \"code\":\"TG\",\n      \"name\":\"Togo\"\n   },\n   {  \n      \"id\":228,\n      \"code\":\"TK\",\n      \"name\":\"Tokelau\"\n   },\n   {  \n      \"id\":229,\n      \"code\":\"TO\",\n      \"name\":\"Tonga\"\n   },\n   {  \n      \"id\":230,\n      \"code\":\"TT\",\n      \"name\":\"Trinidad & Tobago\"\n   },\n   {  \n      \"id\":231,\n      \"code\":\"TA\",\n      \"name\":\"Tristan da Cunha\"\n   },\n   {  \n      \"id\":232,\n      \"code\":\"TN\",\n      \"name\":\"Tunisia\"\n   },\n   {  \n      \"id\":233,\n      \"code\":\"TR\",\n      \"name\":\"Turkey\"\n   },\n   {  \n      \"id\":234,\n      \"code\":\"TM\",\n      \"name\":\"Turkmenistan\"\n   },\n   {  \n      \"id\":235,\n      \"code\":\"TC\",\n      \"name\":\"Turks & Caicos Islands\"\n   },\n   {  \n      \"id\":236,\n      \"code\":\"TV\",\n      \"name\":\"Tuvalu\"\n   },\n   {  \n      \"id\":237,\n      \"code\":\"UM\",\n      \"name\":\"U.S. Outlying Islands\"\n   },\n   {  \n      \"id\":238,\n      \"code\":\"VI\",\n      \"name\":\"U.S. Virgin Islands\"\n   },\n   {  \n      \"id\":239,\n      \"code\":\"UG\",\n      \"name\":\"Uganda\"\n   },\n   {  \n      \"id\":240,\n      \"code\":\"UA\",\n      \"name\":\"Ukraine\"\n   },\n   {  \n      \"id\":241,\n      \"code\":\"AE\",\n      \"name\":\"United Arab Emirates\"\n   },\n   {  \n      \"id\":242,\n      \"code\":\"GB\",\n      \"name\":\"United Kingdom\"\n   },\n   {  \n      \"id\":243,\n      \"code\":\"UN\",\n      \"name\":\"United Nations\"\n   },\n   {  \n      \"id\":244,\n      \"code\":\"US\",\n      \"name\":\"United States\"\n   },\n   {  \n      \"id\":245,\n      \"code\":\"UY\",\n      \"name\":\"Uruguay\"\n   },\n   {  \n      \"id\":246,\n      \"code\":\"UZ\",\n      \"name\":\"Uzbekistan\"\n   },\n   {  \n      \"id\":247,\n      \"code\":\"VU\",\n      \"name\":\"Vanuatu\"\n   },\n   {  \n      \"id\":248,\n      \"code\":\"VA\",\n      \"name\":\"Vatican City\"\n   },\n   {  \n      \"id\":249,\n      \"code\":\"VE\",\n      \"name\":\"Venezuela\"\n   },\n   {  \n      \"id\":250,\n      \"code\":\"VN\",\n      \"name\":\"Vietnam\"\n   },\n   {  \n      \"id\":251,\n      \"code\":\"WF\",\n      \"name\":\"Wallis & Futuna\"\n   },\n   {  \n      \"id\":252,\n      \"code\":\"EH\",\n      \"name\":\"Western Sahara\"\n   },\n   {  \n      \"id\":253,\n      \"code\":\"YE\",\n      \"name\":\"Yemen\"\n   },\n   {  \n      \"id\":254,\n      \"code\":\"ZM\",\n      \"name\":\"Zambia\"\n   },\n   {  \n      \"id\":255,\n      \"code\":\"ZW\",\n      \"name\":\"Zimbabwe\"\n   }\n]"
  },
  {
    "path": "packages/Webkul/Installer/src/Data/states.json",
    "content": "[  \n   {  \n      \"id\":1,\n      \"country_code\":\"US\",\n      \"code\":\"AL\",\n      \"name\":\"Alabama\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":2,\n      \"country_code\":\"US\",\n      \"code\":\"AK\",\n      \"name\":\"Alaska\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":3,\n      \"country_code\":\"US\",\n      \"code\":\"AS\",\n      \"name\":\"American Samoa\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":4,\n      \"country_code\":\"US\",\n      \"code\":\"AZ\",\n      \"name\":\"Arizona\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":5,\n      \"country_code\":\"US\",\n      \"code\":\"AR\",\n      \"name\":\"Arkansas\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":6,\n      \"country_code\":\"US\",\n      \"code\":\"AE\",\n      \"name\":\"Armed Forces Africa\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":7,\n      \"country_code\":\"US\",\n      \"code\":\"AA\",\n      \"name\":\"Armed Forces Americas\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":8,\n      \"country_code\":\"US\",\n      \"code\":\"AE\",\n      \"name\":\"Armed Forces Canada\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":9,\n      \"country_code\":\"US\",\n      \"code\":\"AE\",\n      \"name\":\"Armed Forces Europe\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":10,\n      \"country_code\":\"US\",\n      \"code\":\"AE\",\n      \"name\":\"Armed Forces Middle East\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":11,\n      \"country_code\":\"US\",\n      \"code\":\"AP\",\n      \"name\":\"Armed Forces Pacific\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":12,\n      \"country_code\":\"US\",\n      \"code\":\"CA\",\n      \"name\":\"California\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":13,\n      \"country_code\":\"US\",\n      \"code\":\"CO\",\n      \"name\":\"Colorado\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":14,\n      \"country_code\":\"US\",\n      \"code\":\"CT\",\n      \"name\":\"Connecticut\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":15,\n      \"country_code\":\"US\",\n      \"code\":\"DE\",\n      \"name\":\"Delaware\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":16,\n      \"country_code\":\"US\",\n      \"code\":\"DC\",\n      \"name\":\"District of Columbia\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":17,\n      \"country_code\":\"US\",\n      \"code\":\"FM\",\n      \"name\":\"Federated States Of Micronesia\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":18,\n      \"country_code\":\"US\",\n      \"code\":\"FL\",\n      \"name\":\"Florida\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":19,\n      \"country_code\":\"US\",\n      \"code\":\"GA\",\n      \"name\":\"Georgia\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":20,\n      \"country_code\":\"US\",\n      \"code\":\"GU\",\n      \"name\":\"Guam\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":21,\n      \"country_code\":\"US\",\n      \"code\":\"HI\",\n      \"name\":\"Hawaii\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":22,\n      \"country_code\":\"US\",\n      \"code\":\"ID\",\n      \"name\":\"Idaho\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":23,\n      \"country_code\":\"US\",\n      \"code\":\"IL\",\n      \"name\":\"Illinois\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":24,\n      \"country_code\":\"US\",\n      \"code\":\"IN\",\n      \"name\":\"Indiana\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":25,\n      \"country_code\":\"US\",\n      \"code\":\"IA\",\n      \"name\":\"Iowa\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":26,\n      \"country_code\":\"US\",\n      \"code\":\"KS\",\n      \"name\":\"Kansas\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":27,\n      \"country_code\":\"US\",\n      \"code\":\"KY\",\n      \"name\":\"Kentucky\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":28,\n      \"country_code\":\"US\",\n      \"code\":\"LA\",\n      \"name\":\"Louisiana\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":29,\n      \"country_code\":\"US\",\n      \"code\":\"ME\",\n      \"name\":\"Maine\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":30,\n      \"country_code\":\"US\",\n      \"code\":\"MH\",\n      \"name\":\"Marshall Islands\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":31,\n      \"country_code\":\"US\",\n      \"code\":\"MD\",\n      \"name\":\"Maryland\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":32,\n      \"country_code\":\"US\",\n      \"code\":\"MA\",\n      \"name\":\"Massachusetts\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":33,\n      \"country_code\":\"US\",\n      \"code\":\"MI\",\n      \"name\":\"Michigan\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":34,\n      \"country_code\":\"US\",\n      \"code\":\"MN\",\n      \"name\":\"Minnesota\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":35,\n      \"country_code\":\"US\",\n      \"code\":\"MS\",\n      \"name\":\"Mississippi\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":36,\n      \"country_code\":\"US\",\n      \"code\":\"MO\",\n      \"name\":\"Missouri\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":37,\n      \"country_code\":\"US\",\n      \"code\":\"MT\",\n      \"name\":\"Montana\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":38,\n      \"country_code\":\"US\",\n      \"code\":\"NE\",\n      \"name\":\"Nebraska\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":39,\n      \"country_code\":\"US\",\n      \"code\":\"NV\",\n      \"name\":\"Nevada\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":40,\n      \"country_code\":\"US\",\n      \"code\":\"NH\",\n      \"name\":\"New Hampshire\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":41,\n      \"country_code\":\"US\",\n      \"code\":\"NJ\",\n      \"name\":\"New Jersey\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":42,\n      \"country_code\":\"US\",\n      \"code\":\"NM\",\n      \"name\":\"New Mexico\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":43,\n      \"country_code\":\"US\",\n      \"code\":\"NY\",\n      \"name\":\"New York\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":44,\n      \"country_code\":\"US\",\n      \"code\":\"NC\",\n      \"name\":\"North Carolina\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":45,\n      \"country_code\":\"US\",\n      \"code\":\"ND\",\n      \"name\":\"North Dakota\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":46,\n      \"country_code\":\"US\",\n      \"code\":\"MP\",\n      \"name\":\"Northern Mariana Islands\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":47,\n      \"country_code\":\"US\",\n      \"code\":\"OH\",\n      \"name\":\"Ohio\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":48,\n      \"country_code\":\"US\",\n      \"code\":\"OK\",\n      \"name\":\"Oklahoma\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":49,\n      \"country_code\":\"US\",\n      \"code\":\"OR\",\n      \"name\":\"Oregon\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":50,\n      \"country_code\":\"US\",\n      \"code\":\"PW\",\n      \"name\":\"Palau\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":51,\n      \"country_code\":\"US\",\n      \"code\":\"PA\",\n      \"name\":\"Pennsylvania\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":52,\n      \"country_code\":\"US\",\n      \"code\":\"PR\",\n      \"name\":\"Puerto Rico\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":53,\n      \"country_code\":\"US\",\n      \"code\":\"RI\",\n      \"name\":\"Rhode Island\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":54,\n      \"country_code\":\"US\",\n      \"code\":\"SC\",\n      \"name\":\"South Carolina\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":55,\n      \"country_code\":\"US\",\n      \"code\":\"SD\",\n      \"name\":\"South Dakota\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":56,\n      \"country_code\":\"US\",\n      \"code\":\"TN\",\n      \"name\":\"Tennessee\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":57,\n      \"country_code\":\"US\",\n      \"code\":\"TX\",\n      \"name\":\"Texas\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":58,\n      \"country_code\":\"US\",\n      \"code\":\"UT\",\n      \"name\":\"Utah\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":59,\n      \"country_code\":\"US\",\n      \"code\":\"VT\",\n      \"name\":\"Vermont\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":60,\n      \"country_code\":\"US\",\n      \"code\":\"VI\",\n      \"name\":\"Virgin Islands\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":61,\n      \"country_code\":\"US\",\n      \"code\":\"VA\",\n      \"name\":\"Virginia\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":62,\n      \"country_code\":\"US\",\n      \"code\":\"WA\",\n      \"name\":\"Washington\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":63,\n      \"country_code\":\"US\",\n      \"code\":\"WV\",\n      \"name\":\"West Virginia\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":64,\n      \"country_code\":\"US\",\n      \"code\":\"WI\",\n      \"name\":\"Wisconsin\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":65,\n      \"country_code\":\"US\",\n      \"code\":\"WY\",\n      \"name\":\"Wyoming\",\n      \"country_id\":244\n   },\n   {  \n      \"id\":66,\n      \"country_code\":\"CA\",\n      \"code\":\"AB\",\n      \"name\":\"Alberta\",\n      \"country_id\":40\n   },\n   {  \n      \"id\":67,\n      \"country_code\":\"CA\",\n      \"code\":\"BC\",\n      \"name\":\"British Columbia\",\n      \"country_id\":40\n   },\n   {  \n      \"id\":68,\n      \"country_code\":\"CA\",\n      \"code\":\"MB\",\n      \"name\":\"Manitoba\",\n      \"country_id\":40\n   },\n   {  \n      \"id\":69,\n      \"country_code\":\"CA\",\n      \"code\":\"NL\",\n      \"name\":\"Newfoundland and Labrador\",\n      \"country_id\":40\n   },\n   {  \n      \"id\":70,\n      \"country_code\":\"CA\",\n      \"code\":\"NB\",\n      \"name\":\"New Brunswick\",\n      \"country_id\":40\n   },\n   {  \n      \"id\":71,\n      \"country_code\":\"CA\",\n      \"code\":\"NS\",\n      \"name\":\"Nova Scotia\",\n      \"country_id\":40\n   },\n   {  \n      \"id\":72,\n      \"country_code\":\"CA\",\n      \"code\":\"NT\",\n      \"name\":\"Northwest Territories\",\n      \"country_id\":40\n   },\n   {  \n      \"id\":73,\n      \"country_code\":\"CA\",\n      \"code\":\"NU\",\n      \"name\":\"Nunavut\",\n      \"country_id\":40\n   },\n   {  \n      \"id\":74,\n      \"country_code\":\"CA\",\n      \"code\":\"ON\",\n      \"name\":\"Ontario\",\n      \"country_id\":40\n   },\n   {  \n      \"id\":75,\n      \"country_code\":\"CA\",\n      \"code\":\"PE\",\n      \"name\":\"Prince Edward Island\",\n      \"country_id\":40\n   },\n   {  \n      \"id\":76,\n      \"country_code\":\"CA\",\n      \"code\":\"QC\",\n      \"name\":\"Quebec\",\n      \"country_id\":40\n   },\n   {  \n      \"id\":77,\n      \"country_code\":\"CA\",\n      \"code\":\"SK\",\n      \"name\":\"Saskatchewan\",\n      \"country_id\":40\n   },\n   {  \n      \"id\":78,\n      \"country_code\":\"CA\",\n      \"code\":\"YT\",\n      \"name\":\"Yukon Territory\",\n      \"country_id\":40\n   },\n   {  \n      \"id\":79,\n      \"country_code\":\"DE\",\n      \"code\":\"NDS\",\n      \"name\":\"Niedersachsen\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":80,\n      \"country_code\":\"DE\",\n      \"code\":\"BAW\",\n      \"name\":\"Baden-W\\u00fcrttemberg\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":81,\n      \"country_code\":\"DE\",\n      \"code\":\"BAY\",\n      \"name\":\"Bayern\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":82,\n      \"country_code\":\"DE\",\n      \"code\":\"BER\",\n      \"name\":\"Berlin\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":83,\n      \"country_code\":\"DE\",\n      \"code\":\"BRG\",\n      \"name\":\"Brandenburg\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":84,\n      \"country_code\":\"DE\",\n      \"code\":\"BRE\",\n      \"name\":\"Bremen\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":85,\n      \"country_code\":\"DE\",\n      \"code\":\"HAM\",\n      \"name\":\"Hamburg\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":86,\n      \"country_code\":\"DE\",\n      \"code\":\"HES\",\n      \"name\":\"Hessen\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":87,\n      \"country_code\":\"DE\",\n      \"code\":\"MEC\",\n      \"name\":\"Mecklenburg-Vorpommern\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":88,\n      \"country_code\":\"DE\",\n      \"code\":\"NRW\",\n      \"name\":\"Nordrhein-Westfalen\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":89,\n      \"country_code\":\"DE\",\n      \"code\":\"RHE\",\n      \"name\":\"Rheinland-Pfalz\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":90,\n      \"country_code\":\"DE\",\n      \"code\":\"SAR\",\n      \"name\":\"Saarland\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":91,\n      \"country_code\":\"DE\",\n      \"code\":\"SAS\",\n      \"name\":\"Sachsen\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":92,\n      \"country_code\":\"DE\",\n      \"code\":\"SAC\",\n      \"name\":\"Sachsen-Anhalt\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":93,\n      \"country_code\":\"DE\",\n      \"code\":\"SCN\",\n      \"name\":\"Schleswig-Holstein\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":94,\n      \"country_code\":\"DE\",\n      \"code\":\"THE\",\n      \"name\":\"Th\\u00fcringen\",\n      \"country_id\":88\n   },\n   {  \n      \"id\":95,\n      \"country_code\":\"AT\",\n      \"code\":\"WI\",\n      \"name\":\"Wien\",\n      \"country_id\":16\n   },\n   {  \n      \"id\":96,\n      \"country_code\":\"AT\",\n      \"code\":\"NO\",\n      \"name\":\"Nieder\\u00f6sterreich\",\n      \"country_id\":16\n   },\n   {  \n      \"id\":97,\n      \"country_code\":\"AT\",\n      \"code\":\"OO\",\n      \"name\":\"Ober\\u00f6sterreich\",\n      \"country_id\":16\n   },\n   {  \n      \"id\":98,\n      \"country_code\":\"AT\",\n      \"code\":\"SB\",\n      \"name\":\"Salzburg\",\n      \"country_id\":16\n   },\n   {  \n      \"id\":99,\n      \"country_code\":\"AT\",\n      \"code\":\"KN\",\n      \"name\":\"K\\u00e4rnten\",\n      \"country_id\":16\n   },\n   {  \n      \"id\":100,\n      \"country_code\":\"AT\",\n      \"code\":\"ST\",\n      \"name\":\"Steiermark\",\n      \"country_id\":16\n   },\n   {  \n      \"id\":101,\n      \"country_code\":\"AT\",\n      \"code\":\"TI\",\n      \"name\":\"Tirol\",\n      \"country_id\":16\n   },\n   {  \n      \"id\":102,\n      \"country_code\":\"AT\",\n      \"code\":\"BL\",\n      \"name\":\"Burgenland\",\n      \"country_id\":16\n   },\n   {  \n      \"id\":103,\n      \"country_code\":\"AT\",\n      \"code\":\"VB\",\n      \"name\":\"Vorarlberg\",\n      \"country_id\":16\n   },\n   {  \n      \"id\":104,\n      \"country_code\":\"CH\",\n      \"code\":\"AG\",\n      \"name\":\"Aargau\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":105,\n      \"country_code\":\"CH\",\n      \"code\":\"AI\",\n      \"name\":\"Appenzell Innerrhoden\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":106,\n      \"country_code\":\"CH\",\n      \"code\":\"AR\",\n      \"name\":\"Appenzell Ausserrhoden\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":107,\n      \"country_code\":\"CH\",\n      \"code\":\"BE\",\n      \"name\":\"Bern\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":108,\n      \"country_code\":\"CH\",\n      \"code\":\"BL\",\n      \"name\":\"Basel-Landschaft\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":109,\n      \"country_code\":\"CH\",\n      \"code\":\"BS\",\n      \"name\":\"Basel-Stadt\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":110,\n      \"country_code\":\"CH\",\n      \"code\":\"FR\",\n      \"name\":\"Freiburg\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":111,\n      \"country_code\":\"CH\",\n      \"code\":\"GE\",\n      \"name\":\"Genf\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":112,\n      \"country_code\":\"CH\",\n      \"code\":\"GL\",\n      \"name\":\"Glarus\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":113,\n      \"country_code\":\"CH\",\n      \"code\":\"GR\",\n      \"name\":\"Graub\\u00fcnden\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":114,\n      \"country_code\":\"CH\",\n      \"code\":\"JU\",\n      \"name\":\"Jura\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":115,\n      \"country_code\":\"CH\",\n      \"code\":\"LU\",\n      \"name\":\"Luzern\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":116,\n      \"country_code\":\"CH\",\n      \"code\":\"NE\",\n      \"name\":\"Neuenburg\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":117,\n      \"country_code\":\"CH\",\n      \"code\":\"NW\",\n      \"name\":\"Nidwalden\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":118,\n      \"country_code\":\"CH\",\n      \"code\":\"OW\",\n      \"name\":\"Obwalden\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":119,\n      \"country_code\":\"CH\",\n      \"code\":\"SG\",\n      \"name\":\"St. Gallen\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":120,\n      \"country_code\":\"CH\",\n      \"code\":\"SH\",\n      \"name\":\"Schaffhausen\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":121,\n      \"country_code\":\"CH\",\n      \"code\":\"SO\",\n      \"name\":\"Solothurn\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":122,\n      \"country_code\":\"CH\",\n      \"code\":\"SZ\",\n      \"name\":\"Schwyz\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":123,\n      \"country_code\":\"CH\",\n      \"code\":\"TG\",\n      \"name\":\"Thurgau\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":124,\n      \"country_code\":\"CH\",\n      \"code\":\"TI\",\n      \"name\":\"Tessin\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":125,\n      \"country_code\":\"CH\",\n      \"code\":\"UR\",\n      \"name\":\"Uri\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":126,\n      \"country_code\":\"CH\",\n      \"code\":\"VD\",\n      \"name\":\"Waadt\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":127,\n      \"country_code\":\"CH\",\n      \"code\":\"VS\",\n      \"name\":\"Wallis\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":128,\n      \"country_code\":\"CH\",\n      \"code\":\"ZG\",\n      \"name\":\"Zug\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":129,\n      \"country_code\":\"CH\",\n      \"code\":\"ZH\",\n      \"name\":\"Z\\u00fcrich\",\n      \"country_id\":220\n   },\n   {  \n      \"id\":130,\n      \"country_code\":\"ES\",\n      \"code\":\"A Coru\\u0441a\",\n      \"name\":\"A Coru\\u00f1a\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":131,\n      \"country_code\":\"ES\",\n      \"code\":\"Alava\",\n      \"name\":\"Alava\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":132,\n      \"country_code\":\"ES\",\n      \"code\":\"Albacete\",\n      \"name\":\"Albacete\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":133,\n      \"country_code\":\"ES\",\n      \"code\":\"Alicante\",\n      \"name\":\"Alicante\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":134,\n      \"country_code\":\"ES\",\n      \"code\":\"Almeria\",\n      \"name\":\"Almeria\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":135,\n      \"country_code\":\"ES\",\n      \"code\":\"Asturias\",\n      \"name\":\"Asturias\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":136,\n      \"country_code\":\"ES\",\n      \"code\":\"Avila\",\n      \"name\":\"Avila\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":137,\n      \"country_code\":\"ES\",\n      \"code\":\"Badajoz\",\n      \"name\":\"Badajoz\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":138,\n      \"country_code\":\"ES\",\n      \"code\":\"Baleares\",\n      \"name\":\"Baleares\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":139,\n      \"country_code\":\"ES\",\n      \"code\":\"Barcelona\",\n      \"name\":\"Barcelona\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":140,\n      \"country_code\":\"ES\",\n      \"code\":\"Burgos\",\n      \"name\":\"Burgos\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":141,\n      \"country_code\":\"ES\",\n      \"code\":\"Caceres\",\n      \"name\":\"Caceres\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":142,\n      \"country_code\":\"ES\",\n      \"code\":\"Cadiz\",\n      \"name\":\"Cadiz\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":143,\n      \"country_code\":\"ES\",\n      \"code\":\"Cantabria\",\n      \"name\":\"Cantabria\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":144,\n      \"country_code\":\"ES\",\n      \"code\":\"Castellon\",\n      \"name\":\"Castellon\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":145,\n      \"country_code\":\"ES\",\n      \"code\":\"Ceuta\",\n      \"name\":\"Ceuta\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":146,\n      \"country_code\":\"ES\",\n      \"code\":\"Ciudad Real\",\n      \"name\":\"Ciudad Real\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":147,\n      \"country_code\":\"ES\",\n      \"code\":\"Cordoba\",\n      \"name\":\"Cordoba\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":148,\n      \"country_code\":\"ES\",\n      \"code\":\"Cuenca\",\n      \"name\":\"Cuenca\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":149,\n      \"country_code\":\"ES\",\n      \"code\":\"Girona\",\n      \"name\":\"Girona\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":150,\n      \"country_code\":\"ES\",\n      \"code\":\"Granada\",\n      \"name\":\"Granada\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":151,\n      \"country_code\":\"ES\",\n      \"code\":\"Guadalajara\",\n      \"name\":\"Guadalajara\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":152,\n      \"country_code\":\"ES\",\n      \"code\":\"Guipuzcoa\",\n      \"name\":\"Guipuzcoa\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":153,\n      \"country_code\":\"ES\",\n      \"code\":\"Huelva\",\n      \"name\":\"Huelva\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":154,\n      \"country_code\":\"ES\",\n      \"code\":\"Huesca\",\n      \"name\":\"Huesca\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":155,\n      \"country_code\":\"ES\",\n      \"code\":\"Jaen\",\n      \"name\":\"Jaen\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":156,\n      \"country_code\":\"ES\",\n      \"code\":\"La Rioja\",\n      \"name\":\"La Rioja\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":157,\n      \"country_code\":\"ES\",\n      \"code\":\"Las Palmas\",\n      \"name\":\"Las Palmas\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":158,\n      \"country_code\":\"ES\",\n      \"code\":\"Leon\",\n      \"name\":\"Leon\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":159,\n      \"country_code\":\"ES\",\n      \"code\":\"Lleida\",\n      \"name\":\"Lleida\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":160,\n      \"country_code\":\"ES\",\n      \"code\":\"Lugo\",\n      \"name\":\"Lugo\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":161,\n      \"country_code\":\"ES\",\n      \"code\":\"Madrid\",\n      \"name\":\"Madrid\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":162,\n      \"country_code\":\"ES\",\n      \"code\":\"Malaga\",\n      \"name\":\"Malaga\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":163,\n      \"country_code\":\"ES\",\n      \"code\":\"Melilla\",\n      \"name\":\"Melilla\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":164,\n      \"country_code\":\"ES\",\n      \"code\":\"Murcia\",\n      \"name\":\"Murcia\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":165,\n      \"country_code\":\"ES\",\n      \"code\":\"Navarra\",\n      \"name\":\"Navarra\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":166,\n      \"country_code\":\"ES\",\n      \"code\":\"Ourense\",\n      \"name\":\"Ourense\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":167,\n      \"country_code\":\"ES\",\n      \"code\":\"Palencia\",\n      \"name\":\"Palencia\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":168,\n      \"country_code\":\"ES\",\n      \"code\":\"Pontevedra\",\n      \"name\":\"Pontevedra\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":169,\n      \"country_code\":\"ES\",\n      \"code\":\"Salamanca\",\n      \"name\":\"Salamanca\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":170,\n      \"country_code\":\"ES\",\n      \"code\":\"Santa Cruz de Tenerife\",\n      \"name\":\"Santa Cruz de Tenerife\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":171,\n      \"country_code\":\"ES\",\n      \"code\":\"Segovia\",\n      \"name\":\"Segovia\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":172,\n      \"country_code\":\"ES\",\n      \"code\":\"Sevilla\",\n      \"name\":\"Sevilla\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":173,\n      \"country_code\":\"ES\",\n      \"code\":\"Soria\",\n      \"name\":\"Soria\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":174,\n      \"country_code\":\"ES\",\n      \"code\":\"Tarragona\",\n      \"name\":\"Tarragona\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":175,\n      \"country_code\":\"ES\",\n      \"code\":\"Teruel\",\n      \"name\":\"Teruel\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":176,\n      \"country_code\":\"ES\",\n      \"code\":\"Toledo\",\n      \"name\":\"Toledo\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":177,\n      \"country_code\":\"ES\",\n      \"code\":\"Valencia\",\n      \"name\":\"Valencia\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":178,\n      \"country_code\":\"ES\",\n      \"code\":\"Valladolid\",\n      \"name\":\"Valladolid\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":179,\n      \"country_code\":\"ES\",\n      \"code\":\"Vizcaya\",\n      \"name\":\"Vizcaya\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":180,\n      \"country_code\":\"ES\",\n      \"code\":\"Zamora\",\n      \"name\":\"Zamora\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":181,\n      \"country_code\":\"ES\",\n      \"code\":\"Zaragoza\",\n      \"name\":\"Zaragoza\",\n      \"country_id\":206\n   },\n   {  \n      \"id\":182,\n      \"country_code\":\"FR\",\n      \"code\":\"1\",\n      \"name\":\"Ain\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":183,\n      \"country_code\":\"FR\",\n      \"code\":\"2\",\n      \"name\":\"Aisne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":184,\n      \"country_code\":\"FR\",\n      \"code\":\"3\",\n      \"name\":\"Allier\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":185,\n      \"country_code\":\"FR\",\n      \"code\":\"4\",\n      \"name\":\"Alpes-de-Haute-Provence\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":186,\n      \"country_code\":\"FR\",\n      \"code\":\"5\",\n      \"name\":\"Hautes-Alpes\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":187,\n      \"country_code\":\"FR\",\n      \"code\":\"6\",\n      \"name\":\"Alpes-Maritimes\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":188,\n      \"country_code\":\"FR\",\n      \"code\":\"7\",\n      \"name\":\"Ard\\u00e8che\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":189,\n      \"country_code\":\"FR\",\n      \"code\":\"8\",\n      \"name\":\"Ardennes\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":190,\n      \"country_code\":\"FR\",\n      \"code\":\"9\",\n      \"name\":\"Ari\\u00e8ge\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":191,\n      \"country_code\":\"FR\",\n      \"code\":\"10\",\n      \"name\":\"Aube\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":192,\n      \"country_code\":\"FR\",\n      \"code\":\"11\",\n      \"name\":\"Aude\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":193,\n      \"country_code\":\"FR\",\n      \"code\":\"12\",\n      \"name\":\"Aveyron\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":194,\n      \"country_code\":\"FR\",\n      \"code\":\"13\",\n      \"name\":\"Bouches-du-Rh\\u00f4ne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":195,\n      \"country_code\":\"FR\",\n      \"code\":\"14\",\n      \"name\":\"Calvados\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":196,\n      \"country_code\":\"FR\",\n      \"code\":\"15\",\n      \"name\":\"Cantal\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":197,\n      \"country_code\":\"FR\",\n      \"code\":\"16\",\n      \"name\":\"Charente\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":198,\n      \"country_code\":\"FR\",\n      \"code\":\"17\",\n      \"name\":\"Charente-Maritime\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":199,\n      \"country_code\":\"FR\",\n      \"code\":\"18\",\n      \"name\":\"Cher\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":200,\n      \"country_code\":\"FR\",\n      \"code\":\"19\",\n      \"name\":\"Corr\\u00e8ze\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":201,\n      \"country_code\":\"FR\",\n      \"code\":\"2A\",\n      \"name\":\"Corse-du-Sud\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":202,\n      \"country_code\":\"FR\",\n      \"code\":\"2B\",\n      \"name\":\"Haute-Corse\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":203,\n      \"country_code\":\"FR\",\n      \"code\":\"21\",\n      \"name\":\"C\\u00f4te-d'Or\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":204,\n      \"country_code\":\"FR\",\n      \"code\":\"22\",\n      \"name\":\"C\\u00f4tes-d'Armor\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":205,\n      \"country_code\":\"FR\",\n      \"code\":\"23\",\n      \"name\":\"Creuse\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":206,\n      \"country_code\":\"FR\",\n      \"code\":\"24\",\n      \"name\":\"Dordogne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":207,\n      \"country_code\":\"FR\",\n      \"code\":\"25\",\n      \"name\":\"Doubs\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":208,\n      \"country_code\":\"FR\",\n      \"code\":\"26\",\n      \"name\":\"Dr\\u00f4me\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":209,\n      \"country_code\":\"FR\",\n      \"code\":\"27\",\n      \"name\":\"Eure\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":210,\n      \"country_code\":\"FR\",\n      \"code\":\"28\",\n      \"name\":\"Eure-et-Loir\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":211,\n      \"country_code\":\"FR\",\n      \"code\":\"29\",\n      \"name\":\"Finist\\u00e8re\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":212,\n      \"country_code\":\"FR\",\n      \"code\":\"30\",\n      \"name\":\"Gard\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":213,\n      \"country_code\":\"FR\",\n      \"code\":\"31\",\n      \"name\":\"Haute-Garonne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":214,\n      \"country_code\":\"FR\",\n      \"code\":\"32\",\n      \"name\":\"Gers\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":215,\n      \"country_code\":\"FR\",\n      \"code\":\"33\",\n      \"name\":\"Gironde\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":216,\n      \"country_code\":\"FR\",\n      \"code\":\"34\",\n      \"name\":\"H\\u00e9rault\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":217,\n      \"country_code\":\"FR\",\n      \"code\":\"35\",\n      \"name\":\"Ille-et-Vilaine\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":218,\n      \"country_code\":\"FR\",\n      \"code\":\"36\",\n      \"name\":\"Indre\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":219,\n      \"country_code\":\"FR\",\n      \"code\":\"37\",\n      \"name\":\"Indre-et-Loire\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":220,\n      \"country_code\":\"FR\",\n      \"code\":\"38\",\n      \"name\":\"Is\\u00e8re\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":221,\n      \"country_code\":\"FR\",\n      \"code\":\"39\",\n      \"name\":\"Jura\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":222,\n      \"country_code\":\"FR\",\n      \"code\":\"40\",\n      \"name\":\"Landes\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":223,\n      \"country_code\":\"FR\",\n      \"code\":\"41\",\n      \"name\":\"Loir-et-Cher\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":224,\n      \"country_code\":\"FR\",\n      \"code\":\"42\",\n      \"name\":\"Loire\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":225,\n      \"country_code\":\"FR\",\n      \"code\":\"43\",\n      \"name\":\"Haute-Loire\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":226,\n      \"country_code\":\"FR\",\n      \"code\":\"44\",\n      \"name\":\"Loire-Atlantique\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":227,\n      \"country_code\":\"FR\",\n      \"code\":\"45\",\n      \"name\":\"Loiret\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":228,\n      \"country_code\":\"FR\",\n      \"code\":\"46\",\n      \"name\":\"Lot\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":229,\n      \"country_code\":\"FR\",\n      \"code\":\"47\",\n      \"name\":\"Lot-et-Garonne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":230,\n      \"country_code\":\"FR\",\n      \"code\":\"48\",\n      \"name\":\"Loz\\u00e8re\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":231,\n      \"country_code\":\"FR\",\n      \"code\":\"49\",\n      \"name\":\"Maine-et-Loire\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":232,\n      \"country_code\":\"FR\",\n      \"code\":\"50\",\n      \"name\":\"Manche\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":233,\n      \"country_code\":\"FR\",\n      \"code\":\"51\",\n      \"name\":\"Marne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":234,\n      \"country_code\":\"FR\",\n      \"code\":\"52\",\n      \"name\":\"Haute-Marne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":235,\n      \"country_code\":\"FR\",\n      \"code\":\"53\",\n      \"name\":\"Mayenne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":236,\n      \"country_code\":\"FR\",\n      \"code\":\"54\",\n      \"name\":\"Meurthe-et-Moselle\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":237,\n      \"country_code\":\"FR\",\n      \"code\":\"55\",\n      \"name\":\"Meuse\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":238,\n      \"country_code\":\"FR\",\n      \"code\":\"56\",\n      \"name\":\"Morbihan\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":239,\n      \"country_code\":\"FR\",\n      \"code\":\"57\",\n      \"name\":\"Moselle\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":240,\n      \"country_code\":\"FR\",\n      \"code\":\"58\",\n      \"name\":\"Ni\\u00e8vre\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":241,\n      \"country_code\":\"FR\",\n      \"code\":\"59\",\n      \"name\":\"Nord\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":242,\n      \"country_code\":\"FR\",\n      \"code\":\"60\",\n      \"name\":\"Oise\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":243,\n      \"country_code\":\"FR\",\n      \"code\":\"61\",\n      \"name\":\"Orne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":244,\n      \"country_code\":\"FR\",\n      \"code\":\"62\",\n      \"name\":\"Pas-de-Calais\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":245,\n      \"country_code\":\"FR\",\n      \"code\":\"63\",\n      \"name\":\"Puy-de-D\\u00f4me\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":246,\n      \"country_code\":\"FR\",\n      \"code\":\"64\",\n      \"name\":\"Pyr\\u00e9n\\u00e9es-Atlantiques\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":247,\n      \"country_code\":\"FR\",\n      \"code\":\"65\",\n      \"name\":\"Hautes-Pyr\\u00e9n\\u00e9es\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":248,\n      \"country_code\":\"FR\",\n      \"code\":\"66\",\n      \"name\":\"Pyr\\u00e9n\\u00e9es-Orientales\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":249,\n      \"country_code\":\"FR\",\n      \"code\":\"67\",\n      \"name\":\"Bas-Rhin\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":250,\n      \"country_code\":\"FR\",\n      \"code\":\"68\",\n      \"name\":\"Haut-Rhin\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":251,\n      \"country_code\":\"FR\",\n      \"code\":\"69\",\n      \"name\":\"Rh\\u00f4ne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":252,\n      \"country_code\":\"FR\",\n      \"code\":\"70\",\n      \"name\":\"Haute-Sa\\u00f4ne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":253,\n      \"country_code\":\"FR\",\n      \"code\":\"71\",\n      \"name\":\"Sa\\u00f4ne-et-Loire\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":254,\n      \"country_code\":\"FR\",\n      \"code\":\"72\",\n      \"name\":\"Sarthe\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":255,\n      \"country_code\":\"FR\",\n      \"code\":\"73\",\n      \"name\":\"Savoie\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":256,\n      \"country_code\":\"FR\",\n      \"code\":\"74\",\n      \"name\":\"Haute-Savoie\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":257,\n      \"country_code\":\"FR\",\n      \"code\":\"75\",\n      \"name\":\"Paris\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":258,\n      \"country_code\":\"FR\",\n      \"code\":\"76\",\n      \"name\":\"Seine-Maritime\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":259,\n      \"country_code\":\"FR\",\n      \"code\":\"77\",\n      \"name\":\"Seine-et-Marne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":260,\n      \"country_code\":\"FR\",\n      \"code\":\"78\",\n      \"name\":\"Yvelines\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":261,\n      \"country_code\":\"FR\",\n      \"code\":\"79\",\n      \"name\":\"Deux-S\\u00e8vres\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":262,\n      \"country_code\":\"FR\",\n      \"code\":\"80\",\n      \"name\":\"Somme\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":263,\n      \"country_code\":\"FR\",\n      \"code\":\"81\",\n      \"name\":\"Tarn\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":264,\n      \"country_code\":\"FR\",\n      \"code\":\"82\",\n      \"name\":\"Tarn-et-Garonne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":265,\n      \"country_code\":\"FR\",\n      \"code\":\"83\",\n      \"name\":\"Var\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":266,\n      \"country_code\":\"FR\",\n      \"code\":\"84\",\n      \"name\":\"Vaucluse\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":267,\n      \"country_code\":\"FR\",\n      \"code\":\"85\",\n      \"name\":\"Vend\\u00e9e\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":268,\n      \"country_code\":\"FR\",\n      \"code\":\"86\",\n      \"name\":\"Vienne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":269,\n      \"country_code\":\"FR\",\n      \"code\":\"87\",\n      \"name\":\"Haute-Vienne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":270,\n      \"country_code\":\"FR\",\n      \"code\":\"88\",\n      \"name\":\"Vosges\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":271,\n      \"country_code\":\"FR\",\n      \"code\":\"89\",\n      \"name\":\"Yonne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":272,\n      \"country_code\":\"FR\",\n      \"code\":\"90\",\n      \"name\":\"Territoire-de-Belfort\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":273,\n      \"country_code\":\"FR\",\n      \"code\":\"91\",\n      \"name\":\"Essonne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":274,\n      \"country_code\":\"FR\",\n      \"code\":\"92\",\n      \"name\":\"Hauts-de-Seine\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":275,\n      \"country_code\":\"FR\",\n      \"code\":\"93\",\n      \"name\":\"Seine-Saint-Denis\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":276,\n      \"country_code\":\"FR\",\n      \"code\":\"94\",\n      \"name\":\"Val-de-Marne\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":277,\n      \"country_code\":\"FR\",\n      \"code\":\"95\",\n      \"name\":\"Val-d'Oise\",\n      \"country_id\":81\n   },\n   {  \n      \"id\":278,\n      \"country_code\":\"RO\",\n      \"code\":\"AB\",\n      \"name\":\"Alba\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":279,\n      \"country_code\":\"RO\",\n      \"code\":\"AR\",\n      \"name\":\"Arad\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":280,\n      \"country_code\":\"RO\",\n      \"code\":\"AG\",\n      \"name\":\"Arge\\u015f\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":281,\n      \"country_code\":\"RO\",\n      \"code\":\"BC\",\n      \"name\":\"Bac\\u0103u\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":282,\n      \"country_code\":\"RO\",\n      \"code\":\"BH\",\n      \"name\":\"Bihor\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":283,\n      \"country_code\":\"RO\",\n      \"code\":\"BN\",\n      \"name\":\"Bistri\\u0163a-N\\u0103s\\u0103ud\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":284,\n      \"country_code\":\"RO\",\n      \"code\":\"BT\",\n      \"name\":\"Boto\\u015fani\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":285,\n      \"country_code\":\"RO\",\n      \"code\":\"BV\",\n      \"name\":\"Bra\\u015fov\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":286,\n      \"country_code\":\"RO\",\n      \"code\":\"BR\",\n      \"name\":\"Br\\u0103ila\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":287,\n      \"country_code\":\"RO\",\n      \"code\":\"B\",\n      \"name\":\"Bucure\\u015fti\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":288,\n      \"country_code\":\"RO\",\n      \"code\":\"BZ\",\n      \"name\":\"Buz\\u0103u\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":289,\n      \"country_code\":\"RO\",\n      \"code\":\"CS\",\n      \"name\":\"Cara\\u015f-Severin\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":290,\n      \"country_code\":\"RO\",\n      \"code\":\"CL\",\n      \"name\":\"C\\u0103l\\u0103ra\\u015fi\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":291,\n      \"country_code\":\"RO\",\n      \"code\":\"CJ\",\n      \"name\":\"Cluj\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":292,\n      \"country_code\":\"RO\",\n      \"code\":\"CT\",\n      \"name\":\"Constan\\u0163a\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":293,\n      \"country_code\":\"RO\",\n      \"code\":\"CV\",\n      \"name\":\"Covasna\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":294,\n      \"country_code\":\"RO\",\n      \"code\":\"DB\",\n      \"name\":\"D\\u00e2mbovi\\u0163a\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":295,\n      \"country_code\":\"RO\",\n      \"code\":\"DJ\",\n      \"name\":\"Dolj\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":296,\n      \"country_code\":\"RO\",\n      \"code\":\"GL\",\n      \"name\":\"Gala\\u0163i\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":297,\n      \"country_code\":\"RO\",\n      \"code\":\"GR\",\n      \"name\":\"Giurgiu\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":298,\n      \"country_code\":\"RO\",\n      \"code\":\"GJ\",\n      \"name\":\"Gorj\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":299,\n      \"country_code\":\"RO\",\n      \"code\":\"HR\",\n      \"name\":\"Harghita\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":300,\n      \"country_code\":\"RO\",\n      \"code\":\"HD\",\n      \"name\":\"Hunedoara\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":301,\n      \"country_code\":\"RO\",\n      \"code\":\"IL\",\n      \"name\":\"Ialomi\\u0163a\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":302,\n      \"country_code\":\"RO\",\n      \"code\":\"IS\",\n      \"name\":\"Ia\\u015fi\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":303,\n      \"country_code\":\"RO\",\n      \"code\":\"IF\",\n      \"name\":\"Ilfov\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":304,\n      \"country_code\":\"RO\",\n      \"code\":\"MM\",\n      \"name\":\"Maramure\\u015f\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":305,\n      \"country_code\":\"RO\",\n      \"code\":\"MH\",\n      \"name\":\"Mehedin\\u0163i\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":306,\n      \"country_code\":\"RO\",\n      \"code\":\"MS\",\n      \"name\":\"Mure\\u015f\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":307,\n      \"country_code\":\"RO\",\n      \"code\":\"NT\",\n      \"name\":\"Neam\\u0163\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":308,\n      \"country_code\":\"RO\",\n      \"code\":\"OT\",\n      \"name\":\"Olt\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":309,\n      \"country_code\":\"RO\",\n      \"code\":\"PH\",\n      \"name\":\"Prahova\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":310,\n      \"country_code\":\"RO\",\n      \"code\":\"SM\",\n      \"name\":\"Satu-Mare\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":311,\n      \"country_code\":\"RO\",\n      \"code\":\"SJ\",\n      \"name\":\"S\\u0103laj\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":312,\n      \"country_code\":\"RO\",\n      \"code\":\"SB\",\n      \"name\":\"Sibiu\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":313,\n      \"country_code\":\"RO\",\n      \"code\":\"SV\",\n      \"name\":\"Suceava\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":314,\n      \"country_code\":\"RO\",\n      \"code\":\"TR\",\n      \"name\":\"Teleorman\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":315,\n      \"country_code\":\"RO\",\n      \"code\":\"TM\",\n      \"name\":\"Timi\\u015f\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":316,\n      \"country_code\":\"RO\",\n      \"code\":\"TL\",\n      \"name\":\"Tulcea\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":317,\n      \"country_code\":\"RO\",\n      \"code\":\"VS\",\n      \"name\":\"Vaslui\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":318,\n      \"country_code\":\"RO\",\n      \"code\":\"VL\",\n      \"name\":\"V\\u00e2lcea\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":319,\n      \"country_code\":\"RO\",\n      \"code\":\"VN\",\n      \"name\":\"Vrancea\",\n      \"country_id\":185\n   },\n   {  \n      \"id\":320,\n      \"country_code\":\"FI\",\n      \"code\":\"Lappi\",\n      \"name\":\"Lappi\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":321,\n      \"country_code\":\"FI\",\n      \"code\":\"Pohjois-Pohjanmaa\",\n      \"name\":\"Pohjois-Pohjanmaa\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":322,\n      \"country_code\":\"FI\",\n      \"code\":\"Kainuu\",\n      \"name\":\"Kainuu\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":323,\n      \"country_code\":\"FI\",\n      \"code\":\"Pohjois-Karjala\",\n      \"name\":\"Pohjois-Karjala\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":324,\n      \"country_code\":\"FI\",\n      \"code\":\"Pohjois-Savo\",\n      \"name\":\"Pohjois-Savo\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":325,\n      \"country_code\":\"FI\",\n      \"code\":\"Etel\\u00e4-Savo\",\n      \"name\":\"Etel\\u00e4-Savo\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":326,\n      \"country_code\":\"FI\",\n      \"code\":\"Etel\\u00e4-Pohjanmaa\",\n      \"name\":\"Etel\\u00e4-Pohjanmaa\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":327,\n      \"country_code\":\"FI\",\n      \"code\":\"Pohjanmaa\",\n      \"name\":\"Pohjanmaa\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":328,\n      \"country_code\":\"FI\",\n      \"code\":\"Pirkanmaa\",\n      \"name\":\"Pirkanmaa\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":329,\n      \"country_code\":\"FI\",\n      \"code\":\"Satakunta\",\n      \"name\":\"Satakunta\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":330,\n      \"country_code\":\"FI\",\n      \"code\":\"Keski-Pohjanmaa\",\n      \"name\":\"Keski-Pohjanmaa\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":331,\n      \"country_code\":\"FI\",\n      \"code\":\"Keski-Suomi\",\n      \"name\":\"Keski-Suomi\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":332,\n      \"country_code\":\"FI\",\n      \"code\":\"Varsinais-Suomi\",\n      \"name\":\"Varsinais-Suomi\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":333,\n      \"country_code\":\"FI\",\n      \"code\":\"Etel\\u00e4-Karjala\",\n      \"name\":\"Etel\\u00e4-Karjala\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":334,\n      \"country_code\":\"FI\",\n      \"code\":\"P\\u00e4ij\\u00e4t-H\\u00e4me\",\n      \"name\":\"P\\u00e4ij\\u00e4t-H\\u00e4me\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":335,\n      \"country_code\":\"FI\",\n      \"code\":\"Kanta-H\\u00e4me\",\n      \"name\":\"Kanta-H\\u00e4me\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":336,\n      \"country_code\":\"FI\",\n      \"code\":\"Uusimaa\",\n      \"name\":\"Uusimaa\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":337,\n      \"country_code\":\"FI\",\n      \"code\":\"It\\u00e4-Uusimaa\",\n      \"name\":\"It\\u00e4-Uusimaa\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":338,\n      \"country_code\":\"FI\",\n      \"code\":\"Kymenlaakso\",\n      \"name\":\"Kymenlaakso\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":339,\n      \"country_code\":\"FI\",\n      \"code\":\"Ahvenanmaa\",\n      \"name\":\"Ahvenanmaa\",\n      \"country_id\":80\n   },\n   {  \n      \"id\":340,\n      \"country_code\":\"EE\",\n      \"code\":\"EE-37\",\n      \"name\":\"Harjumaa\",\n      \"country_id\":74\n   },\n   {  \n      \"id\":341,\n      \"country_code\":\"EE\",\n      \"code\":\"EE-39\",\n      \"name\":\"Hiiumaa\",\n      \"country_id\":74\n   },\n   {  \n      \"id\":342,\n      \"country_code\":\"EE\",\n      \"code\":\"EE-44\",\n      \"name\":\"Ida-Virumaa\",\n      \"country_id\":74\n   },\n   {  \n      \"id\":343,\n      \"country_code\":\"EE\",\n      \"code\":\"EE-49\",\n      \"name\":\"J\\u00f5gevamaa\",\n      \"country_id\":74\n   },\n   {  \n      \"id\":344,\n      \"country_code\":\"EE\",\n      \"code\":\"EE-51\",\n      \"name\":\"J\\u00e4rvamaa\",\n      \"country_id\":74\n   },\n   {  \n      \"id\":345,\n      \"country_code\":\"EE\",\n      \"code\":\"EE-57\",\n      \"name\":\"L\\u00e4\\u00e4nemaa\",\n      \"country_id\":74\n   },\n   {  \n      \"id\":346,\n      \"country_code\":\"EE\",\n      \"code\":\"EE-59\",\n      \"name\":\"L\\u00e4\\u00e4ne-Virumaa\",\n      \"country_id\":74\n   },\n   {  \n      \"id\":347,\n      \"country_code\":\"EE\",\n      \"code\":\"EE-65\",\n      \"name\":\"P\\u00f5lvamaa\",\n      \"country_id\":74\n   },\n   {  \n      \"id\":348,\n      \"country_code\":\"EE\",\n      \"code\":\"EE-67\",\n      \"name\":\"P\\u00e4rnumaa\",\n      \"country_id\":74\n   },\n   {  \n      \"id\":349,\n      \"country_code\":\"EE\",\n      \"code\":\"EE-70\",\n      \"name\":\"Raplamaa\",\n      \"country_id\":74\n   },\n   {  \n      \"id\":350,\n      \"country_code\":\"EE\",\n      \"code\":\"EE-74\",\n      \"name\":\"Saaremaa\",\n      \"country_id\":74\n   },\n   {  \n      \"id\":351,\n      \"country_code\":\"EE\",\n      \"code\":\"EE-78\",\n      \"name\":\"Tartumaa\",\n      \"country_id\":74\n   },\n   {  \n      \"id\":352,\n      \"country_code\":\"EE\",\n      \"code\":\"EE-82\",\n      \"name\":\"Valgamaa\",\n      \"country_id\":74\n   },\n   {  \n      \"id\":353,\n      \"country_code\":\"EE\",\n      \"code\":\"EE-84\",\n      \"name\":\"Viljandimaa\",\n      \"country_id\":74\n   },\n   {  \n      \"id\":354,\n      \"country_code\":\"EE\",\n      \"code\":\"EE-86\",\n      \"name\":\"V\\u00f5rumaa\",\n      \"country_id\":74\n   },\n   {  \n      \"id\":355,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-DGV\",\n      \"name\":\"Daugavpils\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":356,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-JEL\",\n      \"name\":\"Jelgava\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":357,\n      \"country_code\":\"LV\",\n      \"code\":\"J\\u0113kabpils\",\n      \"name\":\"J\\u0113kabpils\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":358,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-JUR\",\n      \"name\":\"J\\u016brmala\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":359,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-LPX\",\n      \"name\":\"Liep\\u0101ja\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":360,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-LE\",\n      \"name\":\"Liep\\u0101jas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":361,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-REZ\",\n      \"name\":\"R\\u0113zekne\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":362,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-RIX\",\n      \"name\":\"R\\u012bga\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":363,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-RI\",\n      \"name\":\"R\\u012bgas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":364,\n      \"country_code\":\"LV\",\n      \"code\":\"Valmiera\",\n      \"name\":\"Valmiera\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":365,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-VEN\",\n      \"name\":\"Ventspils\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":366,\n      \"country_code\":\"LV\",\n      \"code\":\"Aglonas novads\",\n      \"name\":\"Aglonas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":367,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-AI\",\n      \"name\":\"Aizkraukles novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":368,\n      \"country_code\":\"LV\",\n      \"code\":\"Aizputes novads\",\n      \"name\":\"Aizputes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":369,\n      \"country_code\":\"LV\",\n      \"code\":\"Akn\\u012bstes novads\",\n      \"name\":\"Akn\\u012bstes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":370,\n      \"country_code\":\"LV\",\n      \"code\":\"Alojas novads\",\n      \"name\":\"Alojas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":371,\n      \"country_code\":\"LV\",\n      \"code\":\"Alsungas novads\",\n      \"name\":\"Alsungas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":372,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-AL\",\n      \"name\":\"Al\\u016bksnes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":373,\n      \"country_code\":\"LV\",\n      \"code\":\"Amatas novads\",\n      \"name\":\"Amatas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":374,\n      \"country_code\":\"LV\",\n      \"code\":\"Apes novads\",\n      \"name\":\"Apes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":375,\n      \"country_code\":\"LV\",\n      \"code\":\"Auces novads\",\n      \"name\":\"Auces novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":376,\n      \"country_code\":\"LV\",\n      \"code\":\"Bab\\u012btes novads\",\n      \"name\":\"Bab\\u012btes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":377,\n      \"country_code\":\"LV\",\n      \"code\":\"Baldones novads\",\n      \"name\":\"Baldones novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":378,\n      \"country_code\":\"LV\",\n      \"code\":\"Baltinavas novads\",\n      \"name\":\"Baltinavas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":379,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-BL\",\n      \"name\":\"Balvu novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":380,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-BU\",\n      \"name\":\"Bauskas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":381,\n      \"country_code\":\"LV\",\n      \"code\":\"Bever\\u012bnas novads\",\n      \"name\":\"Bever\\u012bnas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":382,\n      \"country_code\":\"LV\",\n      \"code\":\"Broc\\u0113nu novads\",\n      \"name\":\"Broc\\u0113nu novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":383,\n      \"country_code\":\"LV\",\n      \"code\":\"Burtnieku novads\",\n      \"name\":\"Burtnieku novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":384,\n      \"country_code\":\"LV\",\n      \"code\":\"Carnikavas novads\",\n      \"name\":\"Carnikavas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":385,\n      \"country_code\":\"LV\",\n      \"code\":\"Cesvaines novads\",\n      \"name\":\"Cesvaines novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":386,\n      \"country_code\":\"LV\",\n      \"code\":\"Ciblas novads\",\n      \"name\":\"Ciblas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":387,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-CE\",\n      \"name\":\"C\\u0113su novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":388,\n      \"country_code\":\"LV\",\n      \"code\":\"Dagdas novads\",\n      \"name\":\"Dagdas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":389,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-DA\",\n      \"name\":\"Daugavpils novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":390,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-DO\",\n      \"name\":\"Dobeles novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":391,\n      \"country_code\":\"LV\",\n      \"code\":\"Dundagas novads\",\n      \"name\":\"Dundagas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":392,\n      \"country_code\":\"LV\",\n      \"code\":\"Durbes novads\",\n      \"name\":\"Durbes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":393,\n      \"country_code\":\"LV\",\n      \"code\":\"Engures novads\",\n      \"name\":\"Engures novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":394,\n      \"country_code\":\"LV\",\n      \"code\":\"Garkalnes novads\",\n      \"name\":\"Garkalnes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":395,\n      \"country_code\":\"LV\",\n      \"code\":\"Grobi\\u0146as novads\",\n      \"name\":\"Grobi\\u0146as novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":396,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-GU\",\n      \"name\":\"Gulbenes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":397,\n      \"country_code\":\"LV\",\n      \"code\":\"Iecavas novads\",\n      \"name\":\"Iecavas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":398,\n      \"country_code\":\"LV\",\n      \"code\":\"Ik\\u0161\\u0137iles novads\",\n      \"name\":\"Ik\\u0161\\u0137iles novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":399,\n      \"country_code\":\"LV\",\n      \"code\":\"Il\\u016bkstes novads\",\n      \"name\":\"Il\\u016bkstes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":400,\n      \"country_code\":\"LV\",\n      \"code\":\"In\\u010dukalna novads\",\n      \"name\":\"In\\u010dukalna novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":401,\n      \"country_code\":\"LV\",\n      \"code\":\"Jaunjelgavas novads\",\n      \"name\":\"Jaunjelgavas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":402,\n      \"country_code\":\"LV\",\n      \"code\":\"Jaunpiebalgas novads\",\n      \"name\":\"Jaunpiebalgas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":403,\n      \"country_code\":\"LV\",\n      \"code\":\"Jaunpils novads\",\n      \"name\":\"Jaunpils novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":404,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-JL\",\n      \"name\":\"Jelgavas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":405,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-JK\",\n      \"name\":\"J\\u0113kabpils novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":406,\n      \"country_code\":\"LV\",\n      \"code\":\"Kandavas novads\",\n      \"name\":\"Kandavas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":407,\n      \"country_code\":\"LV\",\n      \"code\":\"Kokneses novads\",\n      \"name\":\"Kokneses novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":408,\n      \"country_code\":\"LV\",\n      \"code\":\"Krimuldas novads\",\n      \"name\":\"Krimuldas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":409,\n      \"country_code\":\"LV\",\n      \"code\":\"Krustpils novads\",\n      \"name\":\"Krustpils novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":410,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-KR\",\n      \"name\":\"Kr\\u0101slavas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":411,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-KU\",\n      \"name\":\"Kuld\\u012bgas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":412,\n      \"country_code\":\"LV\",\n      \"code\":\"K\\u0101rsavas novads\",\n      \"name\":\"K\\u0101rsavas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":413,\n      \"country_code\":\"LV\",\n      \"code\":\"Lielv\\u0101rdes novads\",\n      \"name\":\"Lielv\\u0101rdes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":414,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-LM\",\n      \"name\":\"Limba\\u017eu novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":415,\n      \"country_code\":\"LV\",\n      \"code\":\"Lub\\u0101nas novads\",\n      \"name\":\"Lub\\u0101nas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":416,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-LU\",\n      \"name\":\"Ludzas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":417,\n      \"country_code\":\"LV\",\n      \"code\":\"L\\u012bgatnes novads\",\n      \"name\":\"L\\u012bgatnes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":418,\n      \"country_code\":\"LV\",\n      \"code\":\"L\\u012bv\\u0101nu novads\",\n      \"name\":\"L\\u012bv\\u0101nu novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":419,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-MA\",\n      \"name\":\"Madonas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":420,\n      \"country_code\":\"LV\",\n      \"code\":\"Mazsalacas novads\",\n      \"name\":\"Mazsalacas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":421,\n      \"country_code\":\"LV\",\n      \"code\":\"M\\u0101lpils novads\",\n      \"name\":\"M\\u0101lpils novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":422,\n      \"country_code\":\"LV\",\n      \"code\":\"M\\u0101rupes novads\",\n      \"name\":\"M\\u0101rupes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":423,\n      \"country_code\":\"LV\",\n      \"code\":\"Nauk\\u0161\\u0113nu novads\",\n      \"name\":\"Nauk\\u0161\\u0113nu novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":424,\n      \"country_code\":\"LV\",\n      \"code\":\"Neretas novads\",\n      \"name\":\"Neretas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":425,\n      \"country_code\":\"LV\",\n      \"code\":\"N\\u012bcas novads\",\n      \"name\":\"N\\u012bcas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":426,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-OG\",\n      \"name\":\"Ogres novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":427,\n      \"country_code\":\"LV\",\n      \"code\":\"Olaines novads\",\n      \"name\":\"Olaines novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":428,\n      \"country_code\":\"LV\",\n      \"code\":\"Ozolnieku novads\",\n      \"name\":\"Ozolnieku novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":429,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-PR\",\n      \"name\":\"Prei\\u013cu novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":430,\n      \"country_code\":\"LV\",\n      \"code\":\"Priekules novads\",\n      \"name\":\"Priekules novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":431,\n      \"country_code\":\"LV\",\n      \"code\":\"Prieku\\u013cu novads\",\n      \"name\":\"Prieku\\u013cu novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":432,\n      \"country_code\":\"LV\",\n      \"code\":\"P\\u0101rgaujas novads\",\n      \"name\":\"P\\u0101rgaujas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":433,\n      \"country_code\":\"LV\",\n      \"code\":\"P\\u0101vilostas novads\",\n      \"name\":\"P\\u0101vilostas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":434,\n      \"country_code\":\"LV\",\n      \"code\":\"P\\u013cavi\\u0146u novads\",\n      \"name\":\"P\\u013cavi\\u0146u novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":435,\n      \"country_code\":\"LV\",\n      \"code\":\"Raunas novads\",\n      \"name\":\"Raunas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":436,\n      \"country_code\":\"LV\",\n      \"code\":\"Riebi\\u0146u novads\",\n      \"name\":\"Riebi\\u0146u novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":437,\n      \"country_code\":\"LV\",\n      \"code\":\"Rojas novads\",\n      \"name\":\"Rojas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":438,\n      \"country_code\":\"LV\",\n      \"code\":\"Ropa\\u017eu novads\",\n      \"name\":\"Ropa\\u017eu novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":439,\n      \"country_code\":\"LV\",\n      \"code\":\"Rucavas novads\",\n      \"name\":\"Rucavas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":440,\n      \"country_code\":\"LV\",\n      \"code\":\"Rug\\u0101ju novads\",\n      \"name\":\"Rug\\u0101ju novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":441,\n      \"country_code\":\"LV\",\n      \"code\":\"Rund\\u0101les novads\",\n      \"name\":\"Rund\\u0101les novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":442,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-RE\",\n      \"name\":\"R\\u0113zeknes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":443,\n      \"country_code\":\"LV\",\n      \"code\":\"R\\u016bjienas novads\",\n      \"name\":\"R\\u016bjienas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":444,\n      \"country_code\":\"LV\",\n      \"code\":\"Salacgr\\u012bvas novads\",\n      \"name\":\"Salacgr\\u012bvas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":445,\n      \"country_code\":\"LV\",\n      \"code\":\"Salas novads\",\n      \"name\":\"Salas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":446,\n      \"country_code\":\"LV\",\n      \"code\":\"Salaspils novads\",\n      \"name\":\"Salaspils novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":447,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-SA\",\n      \"name\":\"Saldus novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":448,\n      \"country_code\":\"LV\",\n      \"code\":\"Saulkrastu novads\",\n      \"name\":\"Saulkrastu novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":449,\n      \"country_code\":\"LV\",\n      \"code\":\"Siguldas novads\",\n      \"name\":\"Siguldas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":450,\n      \"country_code\":\"LV\",\n      \"code\":\"Skrundas novads\",\n      \"name\":\"Skrundas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":451,\n      \"country_code\":\"LV\",\n      \"code\":\"Skr\\u012bveru novads\",\n      \"name\":\"Skr\\u012bveru novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":452,\n      \"country_code\":\"LV\",\n      \"code\":\"Smiltenes novads\",\n      \"name\":\"Smiltenes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":453,\n      \"country_code\":\"LV\",\n      \"code\":\"Stopi\\u0146u novads\",\n      \"name\":\"Stopi\\u0146u novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":454,\n      \"country_code\":\"LV\",\n      \"code\":\"Stren\\u010du novads\",\n      \"name\":\"Stren\\u010du novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":455,\n      \"country_code\":\"LV\",\n      \"code\":\"S\\u0113jas novads\",\n      \"name\":\"S\\u0113jas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":456,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-TA\",\n      \"name\":\"Talsu novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":457,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-TU\",\n      \"name\":\"Tukuma novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":458,\n      \"country_code\":\"LV\",\n      \"code\":\"T\\u0113rvetes novads\",\n      \"name\":\"T\\u0113rvetes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":459,\n      \"country_code\":\"LV\",\n      \"code\":\"Vai\\u0146odes novads\",\n      \"name\":\"Vai\\u0146odes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":460,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-VK\",\n      \"name\":\"Valkas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":461,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-VM\",\n      \"name\":\"Valmieras novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":462,\n      \"country_code\":\"LV\",\n      \"code\":\"Varak\\u013c\\u0101nu novads\",\n      \"name\":\"Varak\\u013c\\u0101nu novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":463,\n      \"country_code\":\"LV\",\n      \"code\":\"Vecpiebalgas novads\",\n      \"name\":\"Vecpiebalgas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":464,\n      \"country_code\":\"LV\",\n      \"code\":\"Vecumnieku novads\",\n      \"name\":\"Vecumnieku novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":465,\n      \"country_code\":\"LV\",\n      \"code\":\"LV-VE\",\n      \"name\":\"Ventspils novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":466,\n      \"country_code\":\"LV\",\n      \"code\":\"Vies\\u012btes novads\",\n      \"name\":\"Vies\\u012btes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":467,\n      \"country_code\":\"LV\",\n      \"code\":\"Vi\\u013cakas novads\",\n      \"name\":\"Vi\\u013cakas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":468,\n      \"country_code\":\"LV\",\n      \"code\":\"Vi\\u013c\\u0101nu novads\",\n      \"name\":\"Vi\\u013c\\u0101nu novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":469,\n      \"country_code\":\"LV\",\n      \"code\":\"V\\u0101rkavas novads\",\n      \"name\":\"V\\u0101rkavas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":470,\n      \"country_code\":\"LV\",\n      \"code\":\"Zilupes novads\",\n      \"name\":\"Zilupes novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":471,\n      \"country_code\":\"LV\",\n      \"code\":\"\\u0100da\\u017eu novads\",\n      \"name\":\"\\u0100da\\u017eu novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":472,\n      \"country_code\":\"LV\",\n      \"code\":\"\\u0112rg\\u013cu novads\",\n      \"name\":\"\\u0112rg\\u013cu novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":473,\n      \"country_code\":\"LV\",\n      \"code\":\"\\u0136eguma novads\",\n      \"name\":\"\\u0136eguma novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":474,\n      \"country_code\":\"LV\",\n      \"code\":\"\\u0136ekavas novads\",\n      \"name\":\"\\u0136ekavas novads\",\n      \"country_id\":125\n   },\n   {  \n      \"id\":475,\n      \"country_code\":\"LT\",\n      \"code\":\"LT-AL\",\n      \"name\":\"Alytaus Apskritis\",\n      \"country_id\":131\n   },\n   {  \n      \"id\":476,\n      \"country_code\":\"LT\",\n      \"code\":\"LT-KU\",\n      \"name\":\"Kauno Apskritis\",\n      \"country_id\":131\n   },\n   {  \n      \"id\":477,\n      \"country_code\":\"LT\",\n      \"code\":\"LT-KL\",\n      \"name\":\"Klaip\\u0117dos Apskritis\",\n      \"country_id\":131\n   },\n   {  \n      \"id\":478,\n      \"country_code\":\"LT\",\n      \"code\":\"LT-MR\",\n      \"name\":\"Marijampol\\u0117s Apskritis\",\n      \"country_id\":131\n   },\n   {  \n      \"id\":479,\n      \"country_code\":\"LT\",\n      \"code\":\"LT-PN\",\n      \"name\":\"Panev\\u0117\\u017eio Apskritis\",\n      \"country_id\":131\n   },\n   {  \n      \"id\":480,\n      \"country_code\":\"LT\",\n      \"code\":\"LT-SA\",\n      \"name\":\"\\u0160iauli\\u0173 Apskritis\",\n      \"country_id\":131\n   },\n   {  \n      \"id\":481,\n      \"country_code\":\"LT\",\n      \"code\":\"LT-TA\",\n      \"name\":\"Taurag\\u0117s Apskritis\",\n      \"country_id\":131\n   },\n   {  \n      \"id\":482,\n      \"country_code\":\"LT\",\n      \"code\":\"LT-TE\",\n      \"name\":\"Tel\\u0161i\\u0173 Apskritis\",\n      \"country_id\":131\n   },\n   {  \n      \"id\":483,\n      \"country_code\":\"LT\",\n      \"code\":\"LT-UT\",\n      \"name\":\"Utenos Apskritis\",\n      \"country_id\":131\n   },\n   {  \n      \"id\":484,\n      \"country_code\":\"LT\",\n      \"code\":\"LT-VL\",\n      \"name\":\"Vilniaus Apskritis\",\n      \"country_id\":131\n   },\n   {  \n      \"id\":485,\n      \"country_code\":\"BR\",\n      \"code\":\"AC\",\n      \"name\":\"Acre\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":486,\n      \"country_code\":\"BR\",\n      \"code\":\"AL\",\n      \"name\":\"Alagoas\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":487,\n      \"country_code\":\"BR\",\n      \"code\":\"AP\",\n      \"name\":\"Amap\\u00e1\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":488,\n      \"country_code\":\"BR\",\n      \"code\":\"AM\",\n      \"name\":\"Amazonas\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":489,\n      \"country_code\":\"BR\",\n      \"code\":\"BA\",\n      \"name\":\"Bahia\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":490,\n      \"country_code\":\"BR\",\n      \"code\":\"CE\",\n      \"name\":\"Cear\\u00e1\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":491,\n      \"country_code\":\"BR\",\n      \"code\":\"ES\",\n      \"name\":\"Esp\\u00edrito Santo\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":492,\n      \"country_code\":\"BR\",\n      \"code\":\"GO\",\n      \"name\":\"Goi\\u00e1s\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":493,\n      \"country_code\":\"BR\",\n      \"code\":\"MA\",\n      \"name\":\"Maranh\\u00e3o\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":494,\n      \"country_code\":\"BR\",\n      \"code\":\"MT\",\n      \"name\":\"Mato Grosso\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":495,\n      \"country_code\":\"BR\",\n      \"code\":\"MS\",\n      \"name\":\"Mato Grosso do Sul\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":496,\n      \"country_code\":\"BR\",\n      \"code\":\"MG\",\n      \"name\":\"Minas Gerais\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":497,\n      \"country_code\":\"BR\",\n      \"code\":\"PA\",\n      \"name\":\"Par\\u00e1\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":498,\n      \"country_code\":\"BR\",\n      \"code\":\"PB\",\n      \"name\":\"Para\\u00edba\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":499,\n      \"country_code\":\"BR\",\n      \"code\":\"PR\",\n      \"name\":\"Paran\\u00e1\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":500,\n      \"country_code\":\"BR\",\n      \"code\":\"PE\",\n      \"name\":\"Pernambuco\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":501,\n      \"country_code\":\"BR\",\n      \"code\":\"PI\",\n      \"name\":\"Piau\\u00ed\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":502,\n      \"country_code\":\"BR\",\n      \"code\":\"RJ\",\n      \"name\":\"Rio de Janeiro\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":503,\n      \"country_code\":\"BR\",\n      \"code\":\"RN\",\n      \"name\":\"Rio Grande do Norte\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":504,\n      \"country_code\":\"BR\",\n      \"code\":\"RS\",\n      \"name\":\"Rio Grande do Sul\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":505,\n      \"country_code\":\"BR\",\n      \"code\":\"RO\",\n      \"name\":\"Rond\\u00f4nia\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":506,\n      \"country_code\":\"BR\",\n      \"code\":\"RR\",\n      \"name\":\"Roraima\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":507,\n      \"country_code\":\"BR\",\n      \"code\":\"SC\",\n      \"name\":\"Santa Catarina\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":508,\n      \"country_code\":\"BR\",\n      \"code\":\"SP\",\n      \"name\":\"S\\u00e3o Paulo\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":509,\n      \"country_code\":\"BR\",\n      \"code\":\"SE\",\n      \"name\":\"Sergipe\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":510,\n      \"country_code\":\"BR\",\n      \"code\":\"TO\",\n      \"name\":\"Tocantins\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":511,\n      \"country_code\":\"BR\",\n      \"code\":\"DF\",\n      \"name\":\"Distrito Federal\",\n      \"country_id\":31\n   },\n   {  \n      \"id\":512,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-01\",\n      \"name\":\"Zagreba\\u010dka \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":513,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-02\",\n      \"name\":\"Krapinsko-zagorska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":514,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-03\",\n      \"name\":\"Sisa\\u010dko-moslava\\u010dka \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":515,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-04\",\n      \"name\":\"Karlova\\u010dka \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":516,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-05\",\n      \"name\":\"Vara\\u017edinska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":517,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-06\",\n      \"name\":\"Koprivni\\u010dko-kri\\u017eeva\\u010dka \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":518,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-07\",\n      \"name\":\"Bjelovarsko-bilogorska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":519,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-08\",\n      \"name\":\"Primorsko-goranska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":520,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-09\",\n      \"name\":\"Li\\u010dko-senjska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":521,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-10\",\n      \"name\":\"Viroviti\\u010dko-podravska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":522,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-11\",\n      \"name\":\"Po\\u017ee\\u0161ko-slavonska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":523,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-12\",\n      \"name\":\"Brodsko-posavska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":524,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-13\",\n      \"name\":\"Zadarska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":525,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-14\",\n      \"name\":\"Osje\\u010dko-baranjska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":526,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-15\",\n      \"name\":\"\\u0160ibensko-kninska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":527,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-16\",\n      \"name\":\"Vukovarsko-srijemska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":528,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-17\",\n      \"name\":\"Splitsko-dalmatinska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":529,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-18\",\n      \"name\":\"Istarska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":530,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-19\",\n      \"name\":\"Dubrova\\u010dko-neretvanska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":531,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-20\",\n      \"name\":\"Me\\u0111imurska \\u017eupanija\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":532,\n      \"country_code\":\"HR\",\n      \"code\":\"HR-21\",\n      \"name\":\"Grad Zagreb\",\n      \"country_id\":59\n   },\n   {  \n      \"id\":533,\n      \"country_code\":\"IN\",\n      \"code\":\"AN\",\n      \"name\":\"Andaman and Nicobar Islands\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":534,\n      \"country_code\":\"IN\",\n      \"code\":\"AP\",\n      \"name\":\"Andhra Pradesh\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":535,\n      \"country_code\":\"IN\",\n      \"code\":\"AR\",\n      \"name\":\"Arunachal Pradesh\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":536,\n      \"country_code\":\"IN\",\n      \"code\":\"AS\",\n      \"name\":\"Assam\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":537,\n      \"country_code\":\"IN\",\n      \"code\":\"BR\",\n      \"name\":\"Bihar\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":538,\n      \"country_code\":\"IN\",\n      \"code\":\"CH\",\n      \"name\":\"Chandigarh\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":539,\n      \"country_code\":\"IN\",\n      \"code\":\"CT\",\n      \"name\":\"Chhattisgarh\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":540,\n      \"country_code\":\"IN\",\n      \"code\":\"DN\",\n      \"name\":\"Dadra and Nagar Haveli\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":541,\n      \"country_code\":\"IN\",\n      \"code\":\"DD\",\n      \"name\":\"Daman and Diu\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":542,\n      \"country_code\":\"IN\",\n      \"code\":\"DL\",\n      \"name\":\"Delhi\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":543,\n      \"country_code\":\"IN\",\n      \"code\":\"GA\",\n      \"name\":\"Goa\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":544,\n      \"country_code\":\"IN\",\n      \"code\":\"GJ\",\n      \"name\":\"Gujarat\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":545,\n      \"country_code\":\"IN\",\n      \"code\":\"HR\",\n      \"name\":\"Haryana\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":546,\n      \"country_code\":\"IN\",\n      \"code\":\"HP\",\n      \"name\":\"Himachal Pradesh\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":547,\n      \"country_code\":\"IN\",\n      \"code\":\"JK\",\n      \"name\":\"Jammu and Kashmir\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":548,\n      \"country_code\":\"IN\",\n      \"code\":\"JH\",\n      \"name\":\"Jharkhand\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":549,\n      \"country_code\":\"IN\",\n      \"code\":\"KA\",\n      \"name\":\"Karnataka\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":550,\n      \"country_code\":\"IN\",\n      \"code\":\"KL\",\n      \"name\":\"Kerala\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":551,\n      \"country_code\":\"IN\",\n      \"code\":\"LD\",\n      \"name\":\"Lakshadweep\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":552,\n      \"country_code\":\"IN\",\n      \"code\":\"MP\",\n      \"name\":\"Madhya Pradesh\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":553,\n      \"country_code\":\"IN\",\n      \"code\":\"MH\",\n      \"name\":\"Maharashtra\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":554,\n      \"country_code\":\"IN\",\n      \"code\":\"MN\",\n      \"name\":\"Manipur\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":555,\n      \"country_code\":\"IN\",\n      \"code\":\"ML\",\n      \"name\":\"Meghalaya\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":556,\n      \"country_code\":\"IN\",\n      \"code\":\"MZ\",\n      \"name\":\"Mizoram\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":557,\n      \"country_code\":\"IN\",\n      \"code\":\"NL\",\n      \"name\":\"Nagaland\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":558,\n      \"country_code\":\"IN\",\n      \"code\":\"OR\",\n      \"name\":\"Odisha\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":559,\n      \"country_code\":\"IN\",\n      \"code\":\"PY\",\n      \"name\":\"Puducherry\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":560,\n      \"country_code\":\"IN\",\n      \"code\":\"PB\",\n      \"name\":\"Punjab\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":561,\n      \"country_code\":\"IN\",\n      \"code\":\"RJ\",\n      \"name\":\"Rajasthan\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":562,\n      \"country_code\":\"IN\",\n      \"code\":\"SK\",\n      \"name\":\"Sikkim\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":563,\n      \"country_code\":\"IN\",\n      \"code\":\"TN\",\n      \"name\":\"Tamil Nadu\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":564,\n      \"country_code\":\"IN\",\n      \"code\":\"TG\",\n      \"name\":\"Telangana\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":565,\n      \"country_code\":\"IN\",\n      \"code\":\"TR\",\n      \"name\":\"Tripura\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":566,\n      \"country_code\":\"IN\",\n      \"code\":\"UP\",\n      \"name\":\"Uttar Pradesh\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":567,\n      \"country_code\":\"IN\",\n      \"code\":\"UT\",\n      \"name\":\"Uttarakhand\",\n      \"country_id\":106\n   },\n   {  \n      \"id\":568,\n      \"country_code\":\"IN\",\n      \"code\":\"WB\",\n      \"name\":\"West Bengal\",\n      \"country_id\":106\n   }\n]"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Migrations/2024_06_24_174241_insert_warehouse_attributes_in_attributes_table.php",
    "content": "<?php\n\nuse Carbon\\Carbon;\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        $now = Carbon::now();\n\n        DB::table('attributes')\n            ->insert([\n                [\n                    'code' => 'name',\n                    'name' => trans('installer::app.seeders.attributes.warehouses.name'),\n                    'type' => 'text',\n                    'entity_type' => 'warehouses',\n                    'lookup_type' => null,\n                    'validation' => null,\n                    'sort_order' => '1',\n                    'is_required' => '1',\n                    'is_unique' => '0',\n                    'quick_add' => '1',\n                    'is_user_defined' => '0',\n                    'created_at' => $now,\n                    'updated_at' => $now,\n                ], [\n                    'code' => 'description',\n                    'name' => trans('installer::app.seeders.attributes.warehouses.description'),\n                    'type' => 'textarea',\n                    'entity_type' => 'warehouses',\n                    'lookup_type' => null,\n                    'validation' => null,\n                    'sort_order' => '2',\n                    'is_required' => '0',\n                    'is_unique' => '0',\n                    'quick_add' => '1',\n                    'is_user_defined' => '0',\n                    'created_at' => $now,\n                    'updated_at' => $now,\n                ], [\n                    'code' => 'contact_name',\n                    'name' => trans('installer::app.seeders.attributes.warehouses.contact-name'),\n                    'type' => 'text',\n                    'entity_type' => 'warehouses',\n                    'lookup_type' => null,\n                    'validation' => null,\n                    'sort_order' => '3',\n                    'is_required' => '1',\n                    'is_unique' => '0',\n                    'quick_add' => '1',\n                    'is_user_defined' => '0',\n                    'created_at' => $now,\n                    'updated_at' => $now,\n                ], [\n                    'code' => 'contact_emails',\n                    'name' => trans('installer::app.seeders.attributes.warehouses.contact-emails'),\n                    'type' => 'email',\n                    'entity_type' => 'warehouses',\n                    'lookup_type' => null,\n                    'validation' => null,\n                    'sort_order' => '4',\n                    'is_required' => '1',\n                    'is_unique' => '1',\n                    'quick_add' => '1',\n                    'is_user_defined' => '0',\n                    'created_at' => $now,\n                    'updated_at' => $now,\n                ], [\n                    'code' => 'contact_numbers',\n                    'name' => trans('installer::app.seeders.attributes.warehouses.contact-numbers'),\n                    'type' => 'phone',\n                    'entity_type' => 'warehouses',\n                    'lookup_type' => null,\n                    'validation' => 'numeric',\n                    'sort_order' => '5',\n                    'is_required' => '0',\n                    'is_unique' => '1',\n                    'quick_add' => '1',\n                    'is_user_defined' => '0',\n                    'created_at' => $now,\n                    'updated_at' => $now,\n                ], [\n                    'code' => 'contact_address',\n                    'name' => trans('installer::app.seeders.attributes.warehouses.contact-address'),\n                    'type' => 'address',\n                    'entity_type' => 'warehouses',\n                    'lookup_type' => null,\n                    'validation' => null,\n                    'sort_order' => '6',\n                    'is_required' => '1',\n                    'is_unique' => '0',\n                    'quick_add' => '1',\n                    'is_user_defined' => '0',\n                    'created_at' => $now,\n                    'updated_at' => $now,\n                ],\n            ]);\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::table('attributes', function (Blueprint $table) {\n            //\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Migrations/2024_07_31_093603_add_organization_sales_owner_attribute_in_attributes_table.php",
    "content": "<?php\n\nuse Carbon\\Carbon;\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Support\\Facades\\DB;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        $now = Carbon::now();\n\n        DB::table('attributes')\n            ->insert([\n                [\n                    'code' => 'user_id',\n                    'name' => trans('installer::app.seeders.attributes.organizations.sales-owner'),\n                    'type' => 'lookup',\n                    'entity_type' => 'organizations',\n                    'lookup_type' => 'users',\n                    'validation' => null,\n                    'sort_order' => '5',\n                    'is_required' => '0',\n                    'is_unique' => '0',\n                    'quick_add' => '1',\n                    'is_user_defined' => '0',\n                    'created_at' => $now,\n                    'updated_at' => $now,\n                ],\n            ]);\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void {}\n};\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Migrations/2024_07_31_093605_add_person_job_title_attribute_in_attributes_table.php",
    "content": "<?php\n\nuse Carbon\\Carbon;\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Support\\Facades\\DB;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        $now = Carbon::now();\n\n        DB::table('attributes')\n            ->insert([\n                [\n                    'code' => 'job_title',\n                    'name' => trans('installer::app.seeders.attributes.persons.job-title'),\n                    'type' => 'text',\n                    'entity_type' => 'persons',\n                    'lookup_type' => null,\n                    'validation' => null,\n                    'sort_order' => '4',\n                    'is_required' => '0',\n                    'is_unique' => '0',\n                    'quick_add' => '1',\n                    'is_user_defined' => '0',\n                    'created_at' => $now,\n                    'updated_at' => $now,\n                ],\n            ]);\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void {}\n};\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Migrations/2024_07_31_093605_add_person_sales_owner_attribute_in_attributes_table.php",
    "content": "<?php\n\nuse Carbon\\Carbon;\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Support\\Facades\\DB;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        $now = Carbon::now();\n\n        DB::table('attributes')\n            ->insert([\n                [\n                    'code' => 'user_id',\n                    'name' => trans('installer::app.seeders.attributes.persons.sales-owner'),\n                    'type' => 'lookup',\n                    'entity_type' => 'persons',\n                    'lookup_type' => 'users',\n                    'validation' => null,\n                    'sort_order' => '5',\n                    'is_required' => '0',\n                    'is_unique' => '0',\n                    'quick_add' => '1',\n                    'is_user_defined' => '0',\n                    'created_at' => $now,\n                    'updated_at' => $now,\n                ],\n            ]);\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void {}\n};\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Migrations/2024_08_21_153011_add_leads_stage_and_pipeline_attributes.php",
    "content": "<?php\n\nuse Carbon\\Carbon;\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Support\\Facades\\DB;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        $now = Carbon::now();\n\n        DB::table('attributes')\n            ->insert([\n                [\n                    'code' => 'lead_pipeline_id',\n                    'name' => trans('installer::app.seeders.attributes.leads.pipeline'),\n                    'type' => 'lookup',\n                    'entity_type' => 'leads',\n                    'lookup_type' => 'lead_pipelines',\n                    'validation' => null,\n                    'sort_order' => '9',\n                    'is_required' => '1',\n                    'is_unique' => '0',\n                    'quick_add' => '1',\n                    'is_user_defined' => '0',\n                    'created_at' => $now,\n                    'updated_at' => $now,\n                ], [\n                    'code' => 'lead_pipeline_stage_id',\n                    'name' => trans('installer::app.seeders.attributes.leads.stage'),\n                    'type' => 'lookup',\n                    'entity_type' => 'leads',\n                    'lookup_type' => 'lead_pipeline_stages',\n                    'validation' => null,\n                    'sort_order' => '10',\n                    'is_required' => '1',\n                    'is_unique' => '0',\n                    'quick_add' => '1',\n                    'is_user_defined' => '0',\n                    'created_at' => $now,\n                    'updated_at' => $now,\n                ],\n            ]);\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        //\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/Attribute/AttributeSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\Attribute;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass AttributeSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        DB::table('attributes')->delete();\n\n        $now = Carbon::now();\n\n        $defaultLocale = $parameters['locale'] ?? config('app.locale');\n\n        DB::table('attributes')->insert([\n            /**\n             * Leads Attributes\n             */\n            [\n                'code' => 'title',\n                'name' => trans('installer::app.seeders.attributes.leads.title', [], $defaultLocale),\n                'type' => 'text',\n                'entity_type' => 'leads',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '1',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'description',\n                'name' => trans('installer::app.seeders.attributes.leads.description', [], $defaultLocale),\n                'type' => 'textarea',\n                'entity_type' => 'leads',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '2',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'lead_value',\n                'name' => trans('installer::app.seeders.attributes.leads.lead-value', [], $defaultLocale),\n                'type' => 'price',\n                'entity_type' => 'leads',\n                'lookup_type' => null,\n                'validation' => 'decimal',\n                'sort_order' => '3',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'lead_source_id',\n                'name' => trans('installer::app.seeders.attributes.leads.source', [], $defaultLocale),\n                'type' => 'select',\n                'entity_type' => 'leads',\n                'lookup_type' => 'lead_sources',\n                'validation' => null,\n                'sort_order' => '4',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'lead_type_id',\n                'name' => trans('installer::app.seeders.attributes.leads.type', [], $defaultLocale),\n                'type' => 'select',\n                'entity_type' => 'leads',\n                'lookup_type' => 'lead_types',\n                'validation' => null,\n                'sort_order' => '5',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'user_id',\n                'name' => trans('installer::app.seeders.attributes.leads.sales-owner', [], $defaultLocale),\n                'type' => 'select',\n                'entity_type' => 'leads',\n                'lookup_type' => 'users',\n                'validation' => null,\n                'sort_order' => '7',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'expected_close_date',\n                'name' => trans('installer::app.seeders.attributes.leads.expected-close-date', [], $defaultLocale),\n                'type' => 'date',\n                'entity_type' => 'leads',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '8',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'lead_pipeline_id',\n                'name' => trans('installer::app.seeders.attributes.leads.pipeline', [], $defaultLocale),\n                'type' => 'lookup',\n                'entity_type' => 'leads',\n                'lookup_type' => 'lead_pipelines',\n                'validation' => null,\n                'sort_order' => '9',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'lead_pipeline_stage_id',\n                'name' => trans('installer::app.seeders.attributes.leads.stage', [], $defaultLocale),\n                'type' => 'lookup',\n                'entity_type' => 'leads',\n                'lookup_type' => 'lead_pipeline_stages',\n                'validation' => null,\n                'sort_order' => '10',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ],\n\n            /**\n             * Persons Attributes\n             */\n            [\n                'code' => 'name',\n                'name' => trans('installer::app.seeders.attributes.persons.name', [], $defaultLocale),\n                'type' => 'text',\n                'entity_type' => 'persons',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '1',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'emails',\n                'name' => trans('installer::app.seeders.attributes.persons.emails', [], $defaultLocale),\n                'type' => 'email',\n                'entity_type' => 'persons',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '2',\n                'is_required' => '1',\n                'is_unique' => '1',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'contact_numbers',\n                'name' => trans('installer::app.seeders.attributes.persons.contact-numbers', [], $defaultLocale),\n                'type' => 'phone',\n                'entity_type' => 'persons',\n                'lookup_type' => null,\n                'validation' => 'numeric',\n                'sort_order' => '3',\n                'is_required' => '0',\n                'is_unique' => '1',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'job_title',\n                'name' => trans('installer::app.seeders.attributes.persons.job-title', [], $defaultLocale),\n                'type' => 'text',\n                'entity_type' => 'persons',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '4',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'user_id',\n                'name' => trans('installer::app.seeders.attributes.persons.sales-owner', [], $defaultLocale),\n                'type' => 'lookup',\n                'entity_type' => 'persons',\n                'lookup_type' => 'users',\n                'validation' => null,\n                'sort_order' => '5',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'organization_id',\n                'name' => trans('installer::app.seeders.attributes.persons.organization', [], $defaultLocale),\n                'type' => 'lookup',\n                'entity_type' => 'persons',\n                'lookup_type' => 'organizations',\n                'validation' => null,\n                'sort_order' => '6',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ],\n\n            /**\n             * Organizations Attributes\n             */\n            [\n                'code' => 'name',\n                'name' => trans('installer::app.seeders.attributes.organizations.name', [], $defaultLocale),\n                'type' => 'text',\n                'entity_type' => 'organizations',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '1',\n                'is_required' => '1',\n                'is_unique' => '1',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'address',\n                'name' => trans('installer::app.seeders.attributes.organizations.address', [], $defaultLocale),\n                'type' => 'address',\n                'entity_type' => 'organizations',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '2',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'user_id',\n                'name' => trans('installer::app.seeders.attributes.organizations.sales-owner', [], $defaultLocale),\n                'type' => 'lookup',\n                'entity_type' => 'organizations',\n                'lookup_type' => 'users',\n                'validation' => null,\n                'sort_order' => '3',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ],\n\n            /**\n             * Products Attributes\n             */\n            [\n                'code' => 'name',\n                'name' => trans('installer::app.seeders.attributes.products.name', [], $defaultLocale),\n                'type' => 'text',\n                'entity_type' => 'products',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '1',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'description',\n                'name' => trans('installer::app.seeders.attributes.products.description', [], $defaultLocale),\n                'type' => 'textarea',\n                'entity_type' => 'products',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '2',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'sku',\n                'name' => trans('installer::app.seeders.attributes.products.sku', [], $defaultLocale),\n                'type' => 'text',\n                'entity_type' => 'products',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '3',\n                'is_required' => '1',\n                'is_unique' => '1',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'quantity',\n                'name' => trans('installer::app.seeders.attributes.products.quantity', [], $defaultLocale),\n                'type' => 'text',\n                'entity_type' => 'products',\n                'lookup_type' => null,\n                'validation' => 'numeric',\n                'sort_order' => '4',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'price',\n                'name' => trans('installer::app.seeders.attributes.products.price', [], $defaultLocale),\n                'type' => 'price',\n                'entity_type' => 'products',\n                'lookup_type' => null,\n                'validation' => 'decimal',\n                'sort_order' => '5',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ],\n\n            /**\n             * Quotes Attributes\n             */\n            [\n                'code' => 'user_id',\n                'name' => trans('installer::app.seeders.attributes.quotes.sales-owner', [], $defaultLocale),\n                'type' => 'select',\n                'entity_type' => 'quotes',\n                'lookup_type' => 'users',\n                'validation' => null,\n                'sort_order' => '1',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'subject',\n                'name' => trans('installer::app.seeders.attributes.quotes.subject', [], $defaultLocale),\n                'type' => 'text',\n                'entity_type' => 'quotes',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '2',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'description',\n                'name' => trans('installer::app.seeders.attributes.quotes.description', [], $defaultLocale),\n                'type' => 'textarea',\n                'entity_type' => 'quotes',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '3',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'billing_address',\n                'name' => trans('installer::app.seeders.attributes.quotes.billing-address', [], $defaultLocale),\n                'type' => 'address',\n                'entity_type' => 'quotes',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '4',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'shipping_address',\n                'name' => trans('installer::app.seeders.attributes.quotes.shipping-address', [], $defaultLocale),\n                'type' => 'address',\n                'entity_type' => 'quotes',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '5',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'discount_percent',\n                'name' => trans('installer::app.seeders.attributes.quotes.discount-percent', [], $defaultLocale),\n                'type' => 'text',\n                'entity_type' => 'quotes',\n                'lookup_type' => null,\n                'validation' => 'decimal',\n                'sort_order' => '6',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'discount_amount',\n                'name' => trans('installer::app.seeders.attributes.quotes.discount-amount', [], $defaultLocale),\n                'type' => 'price',\n                'entity_type' => 'quotes',\n                'lookup_type' => null,\n                'validation' => 'decimal',\n                'sort_order' => '7',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'tax_amount',\n                'name' => trans('installer::app.seeders.attributes.quotes.tax-amount', [], $defaultLocale),\n                'type' => 'price',\n                'entity_type' => 'quotes',\n                'lookup_type' => null,\n                'validation' => 'decimal',\n                'sort_order' => '8',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'adjustment_amount',\n                'name' => trans('installer::app.seeders.attributes.quotes.adjustment-amount', [], $defaultLocale),\n                'type' => 'price',\n                'entity_type' => 'quotes',\n                'lookup_type' => null,\n                'validation' => 'decimal',\n                'sort_order' => '9',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'sub_total',\n                'name' => trans('installer::app.seeders.attributes.quotes.sub-total', [], $defaultLocale),\n                'type' => 'price',\n                'entity_type' => 'quotes',\n                'lookup_type' => null,\n                'validation' => 'decimal',\n                'sort_order' => '10',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'grand_total',\n                'name' => trans('installer::app.seeders.attributes.quotes.grand-total', [], $defaultLocale),\n                'type' => 'price',\n                'entity_type' => 'quotes',\n                'lookup_type' => null,\n                'validation' => 'decimal',\n                'sort_order' => '11',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'expired_at',\n                'name' => trans('installer::app.seeders.attributes.quotes.expired-at', [], $defaultLocale),\n                'type' => 'date',\n                'entity_type' => 'quotes',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '12',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'person_id',\n                'name' => trans('installer::app.seeders.attributes.quotes.person', [], $defaultLocale),\n                'type' => 'lookup',\n                'entity_type' => 'quotes',\n                'lookup_type' => 'persons',\n                'validation' => null,\n                'sort_order' => '13',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ],\n\n            /**\n             * Warehouses Attributes\n             */\n            [\n                'code' => 'name',\n                'name' => trans('installer::app.seeders.attributes.warehouses.name'),\n                'type' => 'text',\n                'entity_type' => 'warehouses',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '1',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'description',\n                'name' => trans('installer::app.seeders.attributes.warehouses.description'),\n                'type' => 'textarea',\n                'entity_type' => 'warehouses',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '2',\n                'is_required' => '0',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'contact_name',\n                'name' => trans('installer::app.seeders.attributes.warehouses.contact-name'),\n                'type' => 'text',\n                'entity_type' => 'warehouses',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '3',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'contact_emails',\n                'name' => trans('installer::app.seeders.attributes.warehouses.contact-emails'),\n                'type' => 'email',\n                'entity_type' => 'warehouses',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '4',\n                'is_required' => '1',\n                'is_unique' => '1',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'contact_numbers',\n                'name' => trans('installer::app.seeders.attributes.warehouses.contact-numbers'),\n                'type' => 'phone',\n                'entity_type' => 'warehouses',\n                'lookup_type' => null,\n                'validation' => 'numeric',\n                'sort_order' => '5',\n                'is_required' => '0',\n                'is_unique' => '1',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'code' => 'contact_address',\n                'name' => trans('installer::app.seeders.attributes.warehouses.contact-address'),\n                'type' => 'address',\n                'entity_type' => 'warehouses',\n                'lookup_type' => null,\n                'validation' => null,\n                'sort_order' => '6',\n                'is_required' => '1',\n                'is_unique' => '0',\n                'quick_add' => '1',\n                'is_user_defined' => '0',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ],\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/Attribute/DatabaseSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\Attribute;\n\nuse Illuminate\\Database\\Seeder;\n\nclass DatabaseSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        $this->call(AttributeSeeder::class, false, ['parameters' => $parameters]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/Core/CountriesSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\Core;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass CountriesSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        DB::table('countries')->delete();\n\n        $countries = json_decode(file_get_contents(__DIR__.'/../../../Data/countries.json'), true);\n\n        DB::table('countries')->insert($countries);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/Core/DatabaseSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\Core;\n\nuse Illuminate\\Database\\Seeder;\n\nclass DatabaseSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        $this->call(CountriesSeeder::class, false, ['parameters' => $parameters]);\n        $this->call(StatesSeeder::class, false, ['parameters' => $parameters]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/Core/StatesSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\Core;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass StatesSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        DB::table('country_states')->delete();\n\n        $states = json_decode(file_get_contents(__DIR__.'/../../../Data/states.json'), true);\n\n        DB::table('country_states')->insert($states);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/DatabaseSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Webkul\\Installer\\Database\\Seeders\\Attribute\\DatabaseSeeder as AttributeSeeder;\nuse Webkul\\Installer\\Database\\Seeders\\Core\\DatabaseSeeder as CoreSeeder;\nuse Webkul\\Installer\\Database\\Seeders\\EmailTemplate\\DatabaseSeeder as EmailTemplateSeeder;\nuse Webkul\\Installer\\Database\\Seeders\\Lead\\DatabaseSeeder as LeadSeeder;\nuse Webkul\\Installer\\Database\\Seeders\\User\\DatabaseSeeder as UserSeeder;\nuse Webkul\\Installer\\Database\\Seeders\\Workflow\\DatabaseSeeder as WorkflowSeeder;\n\nclass DatabaseSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        $this->call(AttributeSeeder::class, false, ['parameters' => $parameters]);\n        $this->call(CoreSeeder::class, false, ['parameters' => $parameters]);\n        $this->call(EmailTemplateSeeder::class, false, ['parameters' => $parameters]);\n        $this->call(LeadSeeder::class, false, ['parameters' => $parameters]);\n        $this->call(UserSeeder::class, false, ['parameters' => $parameters]);\n        $this->call(WorkflowSeeder::class, false, ['parameters' => $parameters]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/EmailTemplate/DatabaseSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\EmailTemplate;\n\nuse Illuminate\\Database\\Seeder;\n\nclass DatabaseSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        $this->call(EmailTemplateSeeder::class, false, ['parameters' => $parameters]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/EmailTemplate/EmailTemplateSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\EmailTemplate;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass EmailTemplateSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        DB::table('email_templates')->delete();\n\n        $now = Carbon::now();\n\n        $defaultLocale = $parameters['locale'] ?? config('app.locale');\n\n        DB::table('email_templates')->insert([\n            [\n                'id' => 1,\n                'name' => trans('installer::app.seeders.email.activity-created', [], $defaultLocale),\n                'subject' => trans('installer::app.seeders.email.activity-created', [], $defaultLocale).': {%activities.title%}',\n                'created_at' => $now,\n                'updated_at' => $now,\n                'content' => '<p style=\"font-size: 16px; color: #5e5e5e;\">'.trans('installer::app.seeders.email.new-activity', [], $defaultLocale).':</p>\n                                <p><strong style=\"font-size: 16px;\">Details</strong></p>\n                                <table style=\"height: 97px; width: 952px;\">\n                                    <tbody>\n                                        <tr>\n                                            <td style=\"width: 116.953px; color: #546e7a; font-size: 16px;\">'.trans('installer::app.seeders.email.title', [], $defaultLocale).'</td>\n                                            <td style=\"width: 770.047px; font-size: 16px;\">{%activities.title%}</td>\n                                        </tr>\n                                        <tr>\n                                            <td style=\"width: 116.953px; color: #546e7a; font-size: 16px;\">'.trans('installer::app.seeders.email.type', [], $defaultLocale).'</td>\n                                                <td style=\"width: 770.047px; font-size: 16px;\">{%activities.type%}</td>\n                                        </tr>\n                                        <tr>\n                                            <td style=\"width: 116.953px; color: #546e7a; font-size: 16px;\">'.trans('installer::app.seeders.email.date', [], $defaultLocale).'</td>\n                                            <td style=\"width: 770.047px; font-size: 16px;\">{%activities.schedule_from%} to&nbsp;{%activities.schedule_to%}</td>\n                                        </tr>\n                                        <tr>\n                                            <td style=\"width: 116.953px; color: #546e7a; font-size: 16px; vertical-align: text-top;\">'.trans('installer::app.seeders.email.participants', [], $defaultLocale).'</td>\n                                            <td style=\"width: 770.047px; font-size: 16px;\">{%activities.participants%}</td>\n                                        </tr>\n                                    </tbody>\n                                </table>',\n            ], [\n                'id' => 2,\n                'name' => trans('installer::app.seeders.email.activity-modified', [], $defaultLocale),\n                'subject' => trans('installer::app.seeders.email.activity-modified', [], $defaultLocale).': {%activities.title%}',\n                'created_at' => $now,\n                'updated_at' => $now,\n                'content' => '<p style=\"font-size: 16px; color: #5e5e5e;\">'.trans('installer::app.seeders.email.new-activity-modified', [], $defaultLocale).':</p>\n                                <p><strong style=\"font-size: 16px;\">Details</strong></p>\n                                <table style=\"height: 97px; width: 952px;\">\n                                    <tbody>\n                                        <tr>\n                                            <td style=\"width: 116.953px; color: #546e7a; font-size: 16px;\">'.trans('installer::app.seeders.email.title', [], $defaultLocale).'</td>\n                                            <td style=\"width: 770.047px; font-size: 16px;\">{%activities.title%}</td>\n                                        </tr>\n                                        <tr>\n                                            <td style=\"width: 116.953px; color: #546e7a; font-size: 16px;\">'.trans('installer::app.seeders.email.type', [], $defaultLocale).'</td>\n                                            <td style=\"width: 770.047px; font-size: 16px;\">{%activities.type%}</td>\n                                        </tr>\n                                        <tr>\n                                            <td style=\"width: 116.953px; color: #546e7a; font-size: 16px;\">'.trans('installer::app.seeders.email.date', [], $defaultLocale).'</td>\n                                            <td style=\"width: 770.047px; font-size: 16px;\">{%activities.schedule_from%} to&nbsp;{%activities.schedule_to%}</td>\n                                        </tr>\n                                        <tr>\n                                            <td style=\"width: 116.953px; color: #546e7a; font-size: 16px; vertical-align: text-top;\">'.trans('installer::app.seeders.email.participants', [], $defaultLocale).'</td>\n                                            <td style=\"width: 770.047px; font-size: 16px;\">{%activities.participants%}</td>\n                                        </tr>\n                                    </tbody>\n                                </table>',\n            ],\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/Lead/DatabaseSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\Lead;\n\nuse Illuminate\\Database\\Seeder;\n\nclass DatabaseSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        $this->call(PipelineSeeder::class, false, ['parameters' => $parameters]);\n        $this->call(TypeSeeder::class, false, ['parameters' => $parameters]);\n        $this->call(SourceSeeder::class, false, ['parameters' => $parameters]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/Lead/PipelineSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\Lead;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass PipelineSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        DB::table('lead_pipelines')->delete();\n\n        DB::table('lead_pipeline_stages')->delete();\n\n        $now = Carbon::now();\n\n        $defaultLocale = $parameters['locale'] ?? config('app.locale');\n\n        DB::table('lead_pipelines')->insert([\n            [\n                'id' => 1,\n                'name' => trans('installer::app.seeders.lead.pipeline.default', [], $defaultLocale),\n                'is_default' => 1,\n                'created_at' => $now,\n                'updated_at' => $now,\n            ],\n        ]);\n\n        DB::table('lead_pipeline_stages')->insert($data = [\n            [\n                'id' => 1,\n                'code' => 'new',\n                'name' => trans('installer::app.seeders.lead.pipeline.pipeline-stages.new', [], $defaultLocale),\n                'probability' => 100,\n                'sort_order' => 1,\n                'lead_pipeline_id' => 1,\n            ], [\n                'id' => 2,\n                'code' => 'follow-up',\n                'name' => trans('installer::app.seeders.lead.pipeline.pipeline-stages.follow-up', [], $defaultLocale),\n                'probability' => 100,\n                'sort_order' => 2,\n                'lead_pipeline_id' => 1,\n            ], [\n                'id' => 3,\n                'code' => 'prospect',\n                'name' => trans('installer::app.seeders.lead.pipeline.pipeline-stages.prospect', [], $defaultLocale),\n                'probability' => 100,\n                'sort_order' => 3,\n                'lead_pipeline_id' => 1,\n            ], [\n                'id' => 4,\n                'code' => 'negotiation',\n                'name' => trans('installer::app.seeders.lead.pipeline.pipeline-stages.negotiation', [], $defaultLocale),\n                'probability' => 100,\n                'sort_order' => 4,\n                'lead_pipeline_id' => 1,\n            ], [\n                'id' => 5,\n                'code' => 'won',\n                'name' => trans('installer::app.seeders.lead.pipeline.pipeline-stages.won', [], $defaultLocale),\n                'probability' => 100,\n                'sort_order' => 5,\n                'lead_pipeline_id' => 1,\n            ], [\n                'id' => 6,\n                'code' => 'lost',\n                'name' => trans('installer::app.seeders.lead.pipeline.pipeline-stages.lost', [], $defaultLocale),\n                'probability' => 0,\n                'sort_order' => 6,\n                'lead_pipeline_id' => 1,\n            ],\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/Lead/SourceSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\Lead;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass SourceSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        DB::table('lead_sources')->delete();\n\n        $now = Carbon::now();\n\n        $defaultLocale = $parameters['locale'] ?? config('app.locale');\n\n        DB::table('lead_sources')->insert([\n            [\n                'id' => 1,\n                'name' => trans('installer::app.seeders.lead.source.email', [], $defaultLocale),\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'id' => 2,\n                'name' => trans('installer::app.seeders.lead.source.web', [], $defaultLocale),\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'id' => 3,\n                'name' => trans('installer::app.seeders.lead.source.web-form', [], $defaultLocale),\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'id' => 4,\n                'name' => trans('installer::app.seeders.lead.source.phone', [], $defaultLocale),\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'id' => 5,\n                'name' => trans('installer::app.seeders.lead.source.direct', [], $defaultLocale),\n                'created_at' => $now,\n                'updated_at' => $now,\n            ],\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/Lead/TypeSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\Lead;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass TypeSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        DB::table('lead_types')->delete();\n\n        $now = Carbon::now();\n\n        $defaultLocale = $parameters['locale'] ?? config('app.locale');\n\n        DB::table('lead_types')->insert([\n            [\n                'id' => 1,\n                'name' => trans('installer::app.seeders.lead.type.new-business', [], $defaultLocale),\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'id' => 2,\n                'name' => trans('installer::app.seeders.lead.type.existing-business', [], $defaultLocale),\n                'created_at' => $now,\n                'updated_at' => $now,\n            ],\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/User/DatabaseSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\User;\n\nuse Illuminate\\Database\\Seeder;\n\nclass DatabaseSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        $this->call(RoleSeeder::class, false, ['parameters' => $parameters]);\n        $this->call(UserSeeder::class, false, ['parameters' => $parameters]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/User/RoleSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\User;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass RoleSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        DB::table('users')->delete();\n\n        DB::table('roles')->delete();\n\n        $defaultLocale = $parameters['locale'] ?? config('app.locale');\n\n        DB::table('roles')->insert([\n            'id' => 1,\n            'name' => trans('installer::app.seeders.user.role.administrator', [], $defaultLocale),\n            'description' => trans('installer::app.seeders.user.role.administrator-role', [], $defaultLocale),\n            'permission_type' => 'all',\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/User/UserSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\User;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Str;\n\nclass UserSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        DB::table('users')->delete();\n\n        DB::table('users')->insert([\n            'id' => 1,\n            'name' => 'Example Admin',\n            'email' => 'admin@example.com',\n            'password' => bcrypt('admin123'),\n            // 'api_token' => Str::random(80),\n            'created_at' => date('Y-m-d H:i:s'),\n            'updated_at' => date('Y-m-d H:i:s'),\n            'status' => 1,\n            'role_id' => 1,\n            'view_permission' => 'global',\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/Workflow/DatabaseSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\Workflow;\n\nuse Illuminate\\Database\\Seeder;\n\nclass DatabaseSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        $this->call(WorkflowSeeder::class, false, ['parameters' => $parameters]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Database/Seeders/Workflow/WorkflowSeeder.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Database\\Seeders\\Workflow;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass WorkflowSeeder extends Seeder\n{\n    /**\n     * Seed the application's database.\n     *\n     * @param  array  $parameters\n     * @return void\n     */\n    public function run($parameters = [])\n    {\n        DB::table('workflows')->delete();\n\n        $now = Carbon::now();\n\n        $defaultLocale = $parameters['locale'] ?? config('app.locale');\n\n        DB::table('workflows')->insert([\n            [\n                'id' => 1,\n                'name' => trans('installer::app.seeders.workflow.email-to-participants-after-activity-creation', [], $defaultLocale),\n                'description' => trans('installer::app.seeders.workflow.email-to-participants-after-activity-creation', [], $defaultLocale),\n                'entity_type' => 'activities',\n                'event' => 'activity.create.after',\n                'condition_type' => 'and',\n                'conditions' => '[{\"value\": [\"call\", \"meeting\", \"lunch\"], \"operator\": \"{}\", \"attribute\": \"type\", \"attribute_type\": \"multiselect\"}]',\n                'actions' => '[{\"id\": \"send_email_to_participants\", \"value\": \"1\"}]',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ], [\n                'id' => 2,\n                'name' => trans('installer::app.seeders.workflow.email-to-participants-after-activity-updation', [], $defaultLocale),\n                'description' => trans('installer::app.seeders.workflow.email-to-participants-after-activity-updation', [], $defaultLocale),\n                'entity_type' => 'activities',\n                'event' => 'activity.update.after',\n                'condition_type' => 'and',\n                'conditions' => '[{\"value\": [\"call\", \"meeting\", \"lunch\"], \"operator\": \"{}\", \"attribute\": \"type\", \"attribute_type\": \"multiselect\"}]',\n                'actions' => '[{\"id\": \"send_email_to_participants\", \"value\": \"2\"}]',\n                'created_at' => $now,\n                'updated_at' => $now,\n            ],\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Events/ComposerEvents.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Events;\n\nuse Symfony\\Component\\Console\\Output\\ConsoleOutput;\n\nclass ComposerEvents\n{\n    /**\n     * Post create project.\n     *\n     * @return void\n     */\n    public static function postCreateProject()\n    {\n        $output = new ConsoleOutput;\n\n        $output->writeln(file_get_contents(__DIR__.'/../Templates/on-boarding.php'));\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Helpers/DatabaseManager.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Helpers;\n\nuse Exception;\nuse Illuminate\\Support\\Facades\\Artisan;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Schema;\nuse Webkul\\Installer\\Database\\Seeders\\DatabaseSeeder as KrayinDatabaseSeeder;\n\nclass DatabaseManager\n{\n    /**\n     * Check Database Connection.\n     */\n    public function isInstalled()\n    {\n        if (! file_exists(base_path('.env'))) {\n            return false;\n        }\n\n        try {\n            DB::connection()->getPDO();\n\n            $isConnected = (bool) DB::connection()->getDatabaseName();\n\n            if (! $isConnected) {\n                return false;\n            }\n\n            $hasUserTable = Schema::hasTable('users');\n\n            if (! $hasUserTable) {\n                return false;\n            }\n\n            $userCount = DB::table('users')->count();\n\n            if (! $userCount) {\n                return false;\n            }\n\n            return true;\n        } catch (Exception $e) {\n            return false;\n        }\n    }\n\n    /**\n     * Drop all the tables and migrate in the database\n     *\n     * @return void|string\n     */\n    public function migration()\n    {\n        try {\n            Artisan::call('migrate:fresh');\n\n            return response()->json([\n                'success' => true,\n                'message' => 'Tables is migrated successfully.',\n            ]);\n        } catch (Exception $e) {\n            return response()->json([\n                'error' => $e->getMessage(),\n            ], 500);\n        }\n    }\n\n    /**\n     * Seed the database.\n     *\n     * @return void|string\n     */\n    public function seeder($data)\n    {\n        try {\n            app(KrayinDatabaseSeeder::class)->run([\n                'default_locale' => $data['parameter']['default_locales'],\n                'default_currency' => $data['parameter']['default_currency'],\n            ]);\n\n            $this->storageLink();\n        } catch (Exception $e) {\n            return $e->getMessage();\n        }\n    }\n\n    /**\n     * Storage Link.\n     */\n    private function storageLink()\n    {\n        Artisan::call('storage:link');\n    }\n\n    /**\n     * Generate New Application Key\n     */\n    public function generateKey()\n    {\n        try {\n            Artisan::call('key:generate');\n        } catch (Exception $e) {\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Helpers/EnvironmentManager.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Helpers;\n\nuse Exception;\n\nclass EnvironmentManager\n{\n    /**\n     * Create a helper instance.\n     *\n     * @return void\n     */\n    public function __construct(protected DatabaseManager $databaseManager) {}\n\n    /**\n     * Generate ENV File and Installation.\n     *\n     * @param [object] $request\n     */\n    public function generateEnv($request)\n    {\n        $envExamplePath = base_path('.env.example');\n\n        $envPath = base_path('.env');\n\n        if (! file_exists($envPath)) {\n            if (file_exists($envExamplePath)) {\n                copy($envExamplePath, $envPath);\n            } else {\n                touch($envPath);\n            }\n        }\n\n        try {\n            $response = $this->setEnvConfiguration($request->all());\n\n            $this->databaseManager->generateKey();\n\n            return $response;\n        } catch (Exception $e) {\n            return $e;\n        }\n    }\n\n    /**\n     * Set the ENV file configuration.\n     *\n     * @return string\n     */\n    public function setEnvConfiguration(array $request)\n    {\n        $envDBParams = [];\n\n        /**\n         * Update params with form-data.\n         */\n        if (isset($request['db_hostname'])) {\n            $envDBParams['DB_HOST'] = $request['db_hostname'];\n            $envDBParams['DB_DATABASE'] = $request['db_name'];\n            $envDBParams['DB_PREFIX'] = $request['db_prefix'] ?? '';\n            $envDBParams['DB_USERNAME'] = $request['db_username'];\n            $envDBParams['DB_PASSWORD'] = $request['db_password'];\n            $envDBParams['DB_CONNECTION'] = $request['db_connection'];\n            $envDBParams['DB_PORT'] = (int) $request['db_port'];\n        }\n\n        if (isset($request['app_name'])) {\n            $envDBParams['APP_NAME'] = $request['app_name'] ?? null;\n            $envDBParams['APP_URL'] = $request['app_url'];\n            $envDBParams['APP_LOCALE'] = $request['app_locale'];\n            $envDBParams['APP_TIMEZONE'] = $request['app_timezone'];\n            $envDBParams['APP_CURRENCY'] = $request['app_currency'];\n        }\n\n        $data = file_get_contents(base_path('.env'));\n\n        foreach ($envDBParams as $key => $value) {\n            if (preg_match('/\\s/', $value)) {\n                $value = '\"'.$value.'\"';\n            }\n\n            $data = preg_replace(\"/$key=(.*)/\", \"$key=$value\", $data);\n        }\n\n        try {\n            file_put_contents(base_path('.env'), $data);\n        } catch (Exception $e) {\n            return false;\n        }\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Helpers/ServerRequirements.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Helpers;\n\nclass ServerRequirements\n{\n    /**\n     * Minimum PHP Version Supported (Override is in installer.php config file).\n     *\n     * @var string\n     */\n    private $minPhpVersion = '8.1.0';\n\n    /**\n     * Check for the server requirements.\n     */\n    public function validate(): array\n    {\n        // Server Requirements\n        $requirements = [\n            'php' => [\n                'calendar',\n                'ctype',\n                'curl',\n                'dom',\n                'fileinfo',\n                'filter',\n                'gd',\n                'hash',\n                'intl',\n                'json',\n                'mbstring',\n                'openssl',\n                'pcre',\n                'pdo',\n                'session',\n                'tokenizer',\n                'xml',\n            ],\n        ];\n\n        $results = [];\n\n        foreach ($requirements as $type => $requirement) {\n            foreach ($requirement as $item) {\n                $results['requirements'][$type][$item] = true;\n\n                if (! extension_loaded($item)) {\n                    $results['requirements'][$type][$item] = false;\n\n                    $results['errors'] = true;\n                }\n            }\n        }\n\n        return $results;\n    }\n\n    /**\n     * Check PHP version requirement.\n     *\n     * @return array\n     */\n    public function checkPHPversion(?string $minPhpVersion = null)\n    {\n        $minVersionPhp = $minPhpVersion ?? $this->minPhpVersion;\n\n        $currentPhpVersion = $this->getPhpVersionInfo();\n\n        $supported = version_compare($currentPhpVersion['version'], $minVersionPhp) >= 0;\n\n        return [\n            'full' => $currentPhpVersion['full'],\n            'current' => $currentPhpVersion['version'],\n            'minimum' => $minVersionPhp,\n            'supported' => $supported,\n        ];\n    }\n\n    /**\n     * Get current Php version information.\n     *\n     * @return array\n     */\n    private static function getPhpVersionInfo()\n    {\n        $currentVersionFull = PHP_VERSION;\n\n        preg_match(\"#^\\d+(\\.\\d+)*#\", $currentVersionFull, $filtered);\n\n        return [\n            'full' => $currentVersionFull,\n            'version' => $filtered[0] ?? $currentVersionFull,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Http/Controllers/Controller.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Http\\Controllers;\n\nuse Illuminate\\Foundation\\Bus\\DispatchesJobs;\nuse Illuminate\\Foundation\\Validation\\ValidatesRequests;\nuse Illuminate\\Routing\\Controller as BaseController;\n\nclass Controller extends BaseController\n{\n    use DispatchesJobs, ValidatesRequests;\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Http/Controllers/ImageCacheController.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Http\\Controllers;\n\nuse Illuminate\\Http\\Response as IlluminateResponse;\nuse Illuminate\\Support\\Facades\\Cache;\nuse Intervention\\Image\\Image;\n\nclass ImageCacheController\n{\n    /**\n     * Cache template\n     *\n     * @var string\n     */\n    protected $template;\n\n    /**\n     * Logo\n     *\n     * @var string\n     */\n    const KRAYIN_LOGO = 'https://updates.krayincrm.com/krayin.png';\n\n    /**\n     * Get HTTP response of template applied image file\n     *\n     * @param  string  $filename\n     * @return Illuminate\\Http\\Response\n     */\n    public function getImage($filename)\n    {\n        try {\n            $content = Cache::remember('krayin-logo', 10080, function () {\n                return $this->getImageFromUrl(self::KRAYIN_LOGO);\n            });\n        } catch (\\Exception $e) {\n            $content = '';\n        }\n\n        return $this->buildResponse($content);\n    }\n\n    /**\n     * Init from given URL\n     *\n     * @param  string  $url\n     * @return Image\n     */\n    public function getImageFromUrl($url)\n    {\n        $domain = config('app.url');\n\n        $options = [\n            'http' => [\n                'method' => 'GET',\n                'protocol_version' => 1.1, // force use HTTP 1.1 for service mesh environment with envoy\n                'header' => \"Accept-language: en\\r\\n\".\n                \"Domain: $domain\\r\\n\".\n                \"User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36\\r\\n\",\n            ],\n        ];\n\n        $context = stream_context_create($options);\n\n        if ($data = @file_get_contents($url, false, $context)) {\n            return $data;\n        }\n\n        throw new \\Exception(\n            'Unable to init from given url ('.$url.').'\n        );\n    }\n\n    /**\n     * Builds HTTP response from given image data\n     *\n     * @param  string  $content\n     * @return Illuminate\\Http\\Response\n     */\n    protected function buildResponse($content)\n    {\n        /**\n         * Define mime type\n         */\n        $mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $content);\n\n        /**\n         * Respond with 304 not modified if browser has the image cached\n         */\n        $eTag = md5($content);\n\n        $notModified = isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $eTag;\n\n        $content = $notModified ? null : $content;\n\n        $statusCode = $notModified ? 304 : 200;\n\n        /**\n         * Return http response\n         */\n        return new IlluminateResponse($content, $statusCode, [\n            'Content-Type' => $mime,\n            'Cache-Control' => 'max-age=10080, public',\n            'Content-Length' => strlen($content),\n            'Etag' => $eTag,\n        ]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Http/Controllers/InstallerController.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Http\\Controllers;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Facades\\File;\nuse Webkul\\Installer\\Helpers\\DatabaseManager;\nuse Webkul\\Installer\\Helpers\\EnvironmentManager;\nuse Webkul\\Installer\\Helpers\\ServerRequirements;\n\nclass InstallerController extends Controller\n{\n    /**\n     * Const Variable For Min PHP Version\n     *\n     * @var string\n     */\n    const MIN_PHP_VERSION = '8.1.0';\n\n    /**\n     * Const Variable for Static Customer Id\n     *\n     * @var int\n     */\n    const USER_ID = 1;\n\n    /**\n     * Create a new controller instance\n     *\n     * @return void\n     */\n    public function __construct(\n        protected ServerRequirements $serverRequirements,\n        protected EnvironmentManager $environmentManager,\n        protected DatabaseManager $databaseManager\n    ) {}\n\n    /**\n     * Installer View Root Page\n     */\n    public function index()\n    {\n        $phpVersion = $this->serverRequirements->checkPHPversion(self::MIN_PHP_VERSION);\n\n        $requirements = $this->serverRequirements->validate();\n\n        if (request()->has('locale')) {\n            return redirect()->route('installer.index');\n        }\n\n        return view('installer::installer.index', compact('requirements', 'phpVersion'));\n    }\n\n    /**\n     * ENV File Setup\n     */\n    public function envFileSetup(Request $request): JsonResponse\n    {\n        $message = $this->environmentManager->generateEnv($request);\n\n        return new JsonResponse(['data' => $message]);\n    }\n\n    /**\n     * Run Migration\n     */\n    public function runMigration(): mixed\n    {\n        return $this->databaseManager->migration();\n    }\n\n    /**\n     * Run Seeder.\n     *\n     * @return void|string\n     */\n    public function runSeeder()\n    {\n        $allParameters = request()->allParameters;\n\n        $parameter = [\n            'parameter' => [\n                'default_locales' => $allParameters['app_locale'] ?? null,\n                'default_currency' => $allParameters['app_currency'] ?? null,\n            ],\n        ];\n\n        $response = $this->environmentManager->setEnvConfiguration($allParameters);\n\n        if ($response) {\n            $seeder = $this->databaseManager->seeder($parameter);\n\n            return $seeder;\n        }\n    }\n\n    /**\n     * Admin Configuration Setup.\n     */\n    public function adminConfigSetup(): bool\n    {\n        $password = password_hash(request()->input('password'), PASSWORD_BCRYPT, ['cost' => 10]);\n\n        try {\n            DB::table('users')->updateOrInsert(\n                [\n                    'id' => self::USER_ID,\n                ], [\n                    'name' => request()->input('admin'),\n                    'email' => request()->input('email'),\n                    'password' => $password,\n                    'role_id' => 1,\n                    'status' => 1,\n                ]\n            );\n\n            $this->smtpConfigSetup();\n\n            return true;\n        } catch (\\Throwable $th) {\n            report($th);\n\n            return false;\n        }\n    }\n\n    /**\n     * SMTP connection setup for Mail\n     */\n    private function smtpConfigSetup()\n    {\n        $filePath = storage_path('installed');\n\n        File::put($filePath, 'Your Krayin App is Successfully Installed');\n\n        Event::dispatch('krayin.installed');\n\n        return $filePath;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Http/Middleware/CanInstall.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\Str;\nuse Webkul\\Installer\\Helpers\\DatabaseManager;\n\nclass CanInstall\n{\n    /**\n     * Handles Requests if application is already installed then redirect to dashboard else to installer.\n     */\n    public function handle(Request $request, Closure $next): mixed\n    {\n        $isInstallRoute = Str::contains($request->getPathInfo(), '/install');\n        $isInstalled = $this->isAlreadyInstalled();\n\n        if ($isInstallRoute && $isInstalled) {\n            abort_if($request->ajax(), 403);\n\n            return redirect()->route('admin.dashboard.index');\n        }\n\n        if (! $isInstallRoute && ! $isInstalled) {\n            return redirect()->route('installer.index');\n        }\n\n        return $next($request);\n    }\n\n    /**\n     * Check if application is already installed.\n     */\n    public function isAlreadyInstalled(): bool\n    {\n        $installedPath = storage_path('installed');\n\n        if (file_exists($installedPath)) {\n            return true;\n        }\n\n        if (! app(DatabaseManager::class)->isInstalled()) {\n            return false;\n        }\n\n        touch($installedPath);\n\n        Event::dispatch('krayin.installed');\n\n        return true;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Http/Middleware/Locale.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Http\\Middleware;\n\nuse Closure;\nuse Illuminate\\Http\\Request;\n\nclass Locale\n{\n    /**\n     * Handle an incoming request.\n     *\n     * @param  Request  $request\n     * @return mixed\n     */\n    public function handle($request, Closure $next)\n    {\n        if ($localeCode = $request->query('locale')) {\n            app()->setLocale($localeCode);\n\n            session()->put('installer_locale', $localeCode);\n        } else {\n            app()->setLocale(session()->get('installer_locale') ?? config('app.locale'));\n        }\n\n        return $next($request);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Listeners/Installer.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Listeners;\n\nuse GuzzleHttp\\Client;\nuse Webkul\\User\\Repositories\\UserRepository;\n\nclass Installer\n{\n    /**\n     * Api endpoint\n     *\n     * @var string\n     */\n    protected const API_ENDPOINT = 'https://updates.krayincrm.com/api/updates';\n\n    /**\n     * Create a new listener instance.\n     *\n     * @return void\n     */\n    public function __construct(protected UserRepository $userRepository) {}\n\n    /**\n     * After Krayin is successfully installed\n     *\n     * @return void\n     */\n    public function installed()\n    {\n        $user = $this->userRepository->first();\n\n        $httpClient = new Client;\n\n        try {\n            $httpClient->request('POST', self::API_ENDPOINT, [\n                'headers' => [\n                    'Accept' => 'application/json',\n                ],\n                'json' => [\n                    'domain' => config('app.url'),\n                    'email' => $user?->email,\n                    'name' => $user?->name,\n                    'country_code' => config('app.default_country') ?? 'IN',\n                ],\n            ]);\n        } catch (\\Exception $e) {\n            /**\n             * Skip the error\n             */\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Providers/InstallerServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Installer\\Providers;\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\Support\\ServiceProvider;\nuse Webkul\\Installer\\Console\\Commands\\Installer as InstallerCommand;\nuse Webkul\\Installer\\Http\\Middleware\\CanInstall;\nuse Webkul\\Installer\\Http\\Middleware\\Locale;\n\nclass InstallerServiceProvider extends ServiceProvider\n{\n    /**\n     * Indicates if loading of the provider is deferred.\n     */\n    protected bool $defer = false;\n\n    /**\n     * Bootstrap the application events.\n     */\n    public function boot(Router $router): void\n    {\n        $router->middlewareGroup('install', [CanInstall::class]);\n\n        $this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'installer');\n\n        $this->loadRoutesFrom(__DIR__.'/../Routes/web.php');\n\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n\n        $this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'installer');\n\n        $this->loadViewsFrom(__DIR__.'/../Resources/views', 'installer');\n\n        $router->aliasMiddleware('installer_locale', Locale::class);\n\n        Event::listen('krayin.installed', 'Webkul\\Installer\\Listeners\\Installer@installed');\n\n        $this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'installer');\n\n        /**\n         * Route to access template applied image file\n         */\n        $this->app['router']->get('cache/{filename}', [\n            'uses' => 'Webkul\\Installer\\Http\\Controllers\\ImageCacheController@getImage',\n            'as' => 'image_cache',\n        ])->where(['filename' => '[ \\w\\\\.\\\\/\\\\-\\\\@\\(\\)\\=]+']);\n    }\n\n    /**\n     * Register the service provider.\n     */\n    public function register(): void\n    {\n        if (! $this->app->runningInConsole()) {\n            return;\n        }\n\n        $this->commands([InstallerCommand::class]);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/assets/css/app.css",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n/* -------------------------------- new css -------------------------------- */\n@font-face {\n\tfont-family: \"icomoon\";\n\tsrc: url(\"../fonts/icomoon.eot?w2trdd\");\n\tsrc: url(\"../fonts/icomoon.eot?w2trdd#iefix\") format(\"embedded-opentype\"),\n\t\turl(\"../fonts/icomoon.ttf?w2trdd\") format(\"truetype\"),\n\t\turl(\"../fonts/icomoon.woff?w2trdd\") format(\"woff\"),\n\t\turl(\"../fonts/icomoon.svg?w2trdd#icomoon\") format(\"svg\");\n\tfont-weight: normal;\n\tfont-style: normal;\n\tfont-display: block;\n}\n\n[class^=\"icon-\"],\n[class*=\" icon-\"] {\n\t/* use !important to prevent issues with browser extensions that change fonts */\n\tfont-family: \"icomoon\" !important;\n\tspeak: never;\n\tfont-style: normal;\n\tfont-weight: normal;\n\tfont-variant: normal;\n\ttext-transform: none;\n\tline-height: 1;\n\n\t/* Better Font Rendering =========== */\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n/* -------------------------------- new css end -------------------------------- */\n\n@layer components {\n\t::-webkit-scrollbar {\n\t\twidth: 12px;\n\t}\n\n\t::-webkit-scrollbar-track {\n\t\tbackground: #f1f1f1;\n\t}\n\n\t::-webkit-scrollbar-thumb {\n\t\tbackground: #888;\n\t\tborder-radius: 6px;\n\t}\n\n\t::-webkit-scrollbar-thumb:hover {\n\t\tbackground: #555;\n\t}\n\n\t/* Firefox */\n\t* {\n\t\tscrollbar-width: thin;\n\t\tscrollbar-color: #888 #f1f1f1;\n\t}\n\n\t::selection {\n\t\tbackground-color: rgba(0, 68, 242, 0.2);\n\t}\n\n\tbody {\n\t\t@apply bg-gray-100 text-sm text-gray-800;\n\t}\n\n\tbutton:disabled {\n\t\t@apply cursor-not-allowed opacity-50;\n\t}\n\n\tbutton:disabled:hover {\n\t\t@apply cursor-not-allowed opacity-50;\n\t}\n\n\t.direction-ltr {\n\t\tdirection: ltr;\n\t}\n\n\t.direction-rtl {\n\t\tdirection: rtl;\n\t}\n\n\t.draggable-ghost {\n\t\topacity: 0.5;\n\t\tbackground: #e0e7ff;\n\t}\n\n\thtml.dark [class^=\"icon-\"],\n\thtml.dark [class*=\" icon-\"] {\n\t\tcolor: #d1d5db;\n\t}\n\n\t/* -------------------------------- new css -------------------------------- */\n\t.icon-tick:before {\n\t\tcontent: \"\\e931\";\n\t}\n\n\t.icon-cross-large:before {\n\t\tcontent: \"\\e91c\";\n\t}\n\n\t.icon-left-arrow:before {\n\t\tcontent: \"\\e91d\";\n\t}\n\n\t.icon-right-arrow:before {\n\t\tcontent: \"\\e91e\";\n\t}\n\n\t.icon-up-arrow:before {\n\t\tcontent: \"\\e91f\";\n\t}\n\n\t.icon-down-arrow:before {\n\t\tcontent: \"\\e920\";\n\t}\n\n\t/* -------------------------------- new css end -------------------------------- */\n\n\tp {\n\t\t@apply text-[14px] !leading-[17px];\n\t}\n\n\tinput,\n\ttextarea,\n\tselect {\n\t\t@apply outline-none;\n\t}\n\n\t.primary-button {\n        @apply bg-brandColor border border-brandColor cursor-pointer flex focus:opacity-[0.9] font-semibold gap-x-1 hover:opacity-[0.9] items-center place-content-center px-3 py-1.5 rounded-md text-gray-50 transition-all;\n\t}\n\n\t.secondary-button {\n\t\t@apply flex cursor-pointer place-content-center items-center gap-x-1 whitespace-nowrap rounded-md border-2 border-brandColor bg-white px-3 py-1.5 font-semibold text-brandColor transition-all hover: bg-[#eff6ff61] focus:bg-[#eff6ff61] dark:border-gray-400 dark:bg-gray-800 dark:text-white dark:hover:opacity-80;\n\t}\n\n    .transparent-button {\n        @apply flex cursor-pointer appearance-none place-content-center items-center gap-x-1 whitespace-nowrap rounded-md border-2 border-transparent px-3 py-1.5 font-semibold text-gray-600 transition-all marker:shadow hover:bg-gray-100 focus:bg-gray-100 dark:hover:bg-gray-950;\n    }\n\n\t.journal-scroll::-webkit-scrollbar {\n\t\twidth: 14px;\n\t\tcursor: pointer;\n\t\tdisplay: none;\n\t}\n\n\t.journal-scroll::-webkit-scrollbar-track {\n\t\tbackground-color: #fff;\n\t\tcursor: pointer;\n\t\tborder-radius: 12px;\n\t\tborder: 1px solid #e9e9e9;\n\t}\n\n\t.journal-scroll::-webkit-scrollbar-thumb {\n\t\tcursor: pointer;\n\t\tbackground-color: #e9e9e9;\n\t\tborder-radius: 12px;\n\t\tborder: 3px solid transparent;\n\t\tbackground-clip: content-box;\n\t}\n\n\t.custom-select {\n\t\t-webkit-appearance: none;\n\t\t-moz-appearance: none;\n\t\tbackground: transparent;\n\t\tbackground-image: url(\"data:image/svg+xml;utf8,<svg fill='black' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/><path d='M0 0h24v24H0z' fill='none'/></svg>\");\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position-x: calc(100% - 10px);\n\t\tbackground-position-y: 50%;\n\t}\n\n\t.dark .custom-select {\n\t\tbackground-image: url(\"data:image/svg+xml;utf8,<svg fill='white' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/><path d='M0 0h24v24H0z' fill='none'/></svg>\");\n\t}\n\n\t[dir=\"rtl\"] .custom-select {\n\t\tbackground-position-x: calc(100% - (100% - 10px));\n\t}\n}\n/* -------------------------------- new css end -------------------------------- */"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/assets/js/app.js",
    "content": "/**\n * This will track all the images and fonts for publishing.\n */\nimport.meta.glob([\"../images/**\", \"../fonts/**\"]);\n\n/**\n * Main vue bundler.\n */\nimport { createApp } from \"vue/dist/vue.esm-bundler\";\n\n/**\n * We are defining all the global rules here and configuring\n * all the `vee-validate` settings.\n */\nimport { configure, defineRule } from \"vee-validate\";\nimport { localize } from \"@vee-validate/i18n\";\nimport en from \"@vee-validate/i18n/dist/locale/en.json\";\nimport { all } from '@vee-validate/rules';\n\n/**\n * Registration of all global validators.\n */\nObject.entries(all).forEach(([name, rule]) => defineRule(name, rule));\n\ndefineRule(\"\", () => true);\n\nconfigure({\n    /**\n     * Built-in error messages and custom error messages are available. Multiple\n     * locales can be added in the same way.\n     */\n    generateMessage: localize({\n        en: {\n            ...en,\n            messages: {\n                ...en.messages,\n                phone: \"This {field} must be a valid phone number\",\n            },\n        },\n    }),\n\n    validateOnBlur: true,\n    validateOnInput: true,\n    validateOnChange: true,\n});\n\n/**\n * Main root application registry.\n */\nwindow.app = createApp({\n    data() {\n        return {};\n    },\n\n    methods: {\n        onSubmit() {},\n\n        onInvalidSubmit() {},\n    },\n});\n\n/**\n * Global plugins registration.\n */\nimport Axios from \"./plugins/axios\";\n[\n    Axios,\n].forEach((plugin) => app.use(plugin));\n\n\n/**\n * Global components registration;\n */\nimport { Field, Form, ErrorMessage } from \"vee-validate\";\n\napp.component(\"VForm\", Form);\napp.component(\"VField\", Field);\napp.component(\"VErrorMessage\", ErrorMessage);\n\n\n/**\n * Load event, the purpose of using the event is to mount the application\n * after all of our `Vue` components which is present in blade file have\n * been registered in the app. No matter what `app.mount()` should be\n * called in the last.\n */\nwindow.addEventListener(\"load\", function (event) {\n    app.mount(\"#app\");\n});\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/assets/js/plugins/axios.js",
    "content": "import axios from \"axios\";\nwindow.axios = axios;\nwindow.axios.defaults.headers.common[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\nexport default {\n    install(app) {\n        app.config.globalProperties.$axios = axios;\n    },\n};\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/lang/ar/app.php",
    "content": "<?php\n\nreturn [\n    'seeders' => [\n        'attributes' => [\n            'leads' => [\n                'description' => 'الوصف',\n                'expected-close-date' => 'تاريخ الإغلاق المتوقع',\n                'lead-value' => 'قيمة العميل المحتمل',\n                'sales-owner' => 'مالك المبيعات',\n                'source' => 'المصدر',\n                'title' => 'العنوان',\n                'type' => 'النوع',\n                'pipeline' => 'قناة المبيعات',\n                'stage' => 'المرحلة',\n            ],\n\n            'persons' => [\n                'contact-numbers' => 'أرقام الاتصال',\n                'emails' => 'البريد الإلكتروني',\n                'job-title' => 'المسمى الوظيفي',\n                'name' => 'الاسم',\n                'organization' => 'المنظمة',\n                'sales-owner' => 'مالك المبيعات',\n            ],\n\n            'organizations' => [\n                'address' => 'العنوان',\n                'name' => 'الاسم',\n                'sales-owner' => 'مالك المبيعات',\n            ],\n\n            'products' => [\n                'description' => 'الوصف',\n                'name' => 'الاسم',\n                'price' => 'السعر',\n                'quantity' => 'الكمية',\n                'sku' => 'SKU',\n            ],\n\n            'quotes' => [\n                'adjustment-amount' => 'مبلغ التعديل',\n                'billing-address' => 'عنوان الفواتير',\n                'description' => 'الوصف',\n                'discount-amount' => 'مبلغ الخصم',\n                'discount-percent' => 'نسبة الخصم',\n                'expired-at' => 'منتهي في',\n                'grand-total' => 'الإجمالي',\n                'person' => 'شخص',\n                'sales-owner' => 'مالك المبيعات',\n                'shipping-address' => 'عنوان الشحن',\n                'sub-total' => 'الإجمالي الفرعي',\n                'subject' => 'الموضوع',\n                'tax-amount' => 'مبلغ الضريبة',\n            ],\n\n            'warehouses' => [\n                'contact-address' => 'عنوان الاتصال',\n                'contact-emails' => 'البريد الإلكتروني للتواصل',\n                'contact-name' => 'اسم الاتصال',\n                'contact-numbers' => 'أرقام الاتصال',\n                'description' => 'الوصف',\n                'name' => 'الاسم',\n            ],\n        ],\n\n        'email' => [\n            'activity-created' => 'تم إنشاء النشاط',\n            'activity-modified' => 'تم تعديل النشاط',\n            'date' => 'التاريخ',\n            'new-activity' => 'لديك نشاط جديد، يرجى العثور على التفاصيل أدناه',\n            'new-activity-modified' => 'تم تعديل النشاط الجديد، يرجى العثور على التفاصيل أدناه',\n            'participants' => 'المشاركون',\n            'title' => 'العنوان',\n            'type' => 'النوع',\n        ],\n\n        'lead' => [\n            'pipeline' => [\n                'default' => 'قناة المبيعات الافتراضية',\n\n                'pipeline-stages' => [\n                    'follow-up' => 'متابعة',\n                    'lost' => 'مفقود',\n                    'negotiation' => 'مفاوضات',\n                    'new' => 'جديد',\n                    'prospect' => 'عميل محتمل',\n                    'won' => 'مُنتصر',\n                ],\n            ],\n\n            'source' => [\n                'direct' => 'مباشر',\n                'email' => 'البريد الإلكتروني',\n                'phone' => 'الهاتف',\n                'web' => 'ويب',\n                'web-form' => 'نموذج ويب',\n            ],\n\n            'type' => [\n                'existing-business' => 'عمل موجود',\n                'new-business' => 'عمل جديد',\n            ],\n        ],\n\n        'user' => [\n            'role' => [\n                'administrator-role' => 'دور المسؤول',\n                'administrator' => 'مسؤول',\n            ],\n        ],\n\n        'workflow' => [\n            'email-to-participants-after-activity-updation' => 'رسائل بريد إلكتروني للمشاركين بعد تحديث النشاط',\n            'email-to-participants-after-activity-creation' => 'رسائل بريد إلكتروني للمشاركين بعد إنشاء النشاط',\n        ],\n    ],\n\n    'installer' => [\n        'index' => [\n            'create-administrator' => [\n                'admin' => 'مدير',\n                'krayin' => 'Krayin',\n                'confirm-password' => 'تأكيد كلمة المرور',\n                'email' => 'البريد الإلكتروني',\n                'email-address' => 'admin@example.com',\n                'password' => 'كلمة المرور',\n                'title' => 'إنشاء المسؤول',\n            ],\n\n            'environment-configuration' => [\n                'algerian-dinar' => 'الدينار الجزائري (DZD)',\n                'allowed-currencies' => 'العملات المسموح بها',\n                'allowed-locales' => 'اللغات المسموح بها',\n                'application-name' => 'اسم التطبيق',\n                'argentine-peso' => 'البيزو الأرجنتيني (ARS)',\n                'australian-dollar' => 'الدولار الأسترالي (AUD)',\n                'krayin' => 'Krayin',\n                'bangladeshi-taka' => 'التاكا البنغلاديشي (BDT)',\n                'brazilian-real' => 'الريال البرازيلي (BRL)',\n                'british-pound-sterling' => 'الجنيه الإسترليني البريطاني (GBP)',\n                'canadian-dollar' => 'الدولار الكندي (CAD)',\n                'cfa-franc-bceao' => 'فرنك CFA BCEAO (XOF)',\n                'cfa-franc-beac' => 'فرنك CFA BEAC (XAF)',\n                'chilean-peso' => 'البيزو التشيلي (CLP)',\n                'chinese-yuan' => 'اليوان الصيني (CNY)',\n                'colombian-peso' => 'البيزو الكولومبي (COP)',\n                'czech-koruna' => 'الكرونة التشيكية (CZK)',\n                'danish-krone' => 'الكرونة الدنماركية (DKK)',\n                'database-connection' => 'اتصال قاعدة البيانات',\n                'database-hostname' => 'اسم مضيف قاعدة البيانات',\n                'database-name' => 'اسم قاعدة البيانات',\n                'database-password' => 'كلمة مرور قاعدة البيانات',\n                'database-port' => 'منفذ قاعدة البيانات',\n                'database-prefix' => 'بادئة قاعدة البيانات',\n                'database-username' => 'اسم مستخدم قاعدة البيانات',\n                'default-currency' => 'العملة الافتراضية',\n                'default-locale' => 'اللغة الافتراضية',\n                'default-timezone' => 'المنطقة الزمنية الافتراضية',\n                'default-url' => 'الرابط الافتراضي',\n                'default-url-link' => 'https://localhost',\n                'egyptian-pound' => 'الجنيه المصري (EGP)',\n                'euro' => 'اليورو (EUR)',\n                'fijian-dollar' => 'الدولار الفيجي (FJD)',\n                'hong-kong-dollar' => 'الدولار الهونغ كونغي (HKD)',\n                'hungarian-forint' => 'الفورنت الهنغاري (HUF)',\n                'indian-rupee' => 'الروبية الهندية (INR)',\n                'indonesian-rupiah' => 'الروبية الإندونيسية (IDR)',\n                'israeli-new-shekel' => 'الشيكل الإسرائيلي الجديد (ILS)',\n                'japanese-yen' => 'الين الياباني (JPY)',\n                'jordanian-dinar' => 'الدينار الأردني (JOD)',\n                'kazakhstani-tenge' => 'التينغ الكازاخستاني (KZT)',\n                'kuwaiti-dinar' => 'الدينار الكويتي (KWD)',\n                'lebanese-pound' => 'الجنيه اللبناني (LBP)',\n                'libyan-dinar' => 'الدينار الليبي (LYD)',\n                'malaysian-ringgit' => 'الرينغيت الماليزي (MYR)',\n                'mauritian-rupee' => 'الروبية الموريشية (MUR)',\n                'mexican-peso' => 'البيزو المكسيكي (MXN)',\n                'moroccan-dirham' => 'الدرهم المغربي (MAD)',\n                'mysql' => 'MySQL',\n                'nepalese-rupee' => 'الروبية النيبالية (NPR)',\n                'new-taiwan-dollar' => 'الدولار التايواني الجديد (TWD)',\n                'new-zealand-dollar' => 'الدولار النيوزيلندي (NZD)',\n                'nigerian-naira' => 'النايرا النيجيري (NGN)',\n                'norwegian-krone' => 'الكرونة النرويجية (NOK)',\n                'omani-rial' => 'الريال العماني (OMR)',\n                'pakistani-rupee' => 'الروبية الباكستانية (PKR)',\n                'panamanian-balboa' => 'البالبوا البنمي (PAB)',\n                'paraguayan-guarani' => 'الغواراني الباراغواي (PYG)',\n                'peruvian-nuevo-sol' => 'السول البيروفي الجديد (PEN)',\n                'pgsql' => 'PgSQL',\n                'philippine-peso' => 'البيزو الفلبيني (PHP)',\n                'polish-zloty' => 'الزلوتي البولندي (PLN)',\n                'qatari-rial' => 'الريال القطري (QAR)',\n                'romanian-leu' => 'الليو الروماني (RON)',\n                'russian-ruble' => 'الروبل الروسي (RUB)',\n                'saudi-riyal' => 'الريال السعودي (SAR)',\n                'select-timezone' => 'اختر المنطقة الزمنية',\n                'singapore-dollar' => 'الدولار السنغافوري (SGD)',\n                'south-african-rand' => 'الراند الجنوب أفريقي (ZAR)',\n                'south-korean-won' => 'الوون الكوري الجنوبي (KRW)',\n                'sqlsrv' => 'SQLSRV',\n                'sri-lankan-rupee' => 'الروبية السريلانكية (LKR)',\n                'swedish-krona' => 'الكرونا السويدية (SEK)',\n                'swiss-franc' => 'الفرنك السويسري (CHF)',\n                'thai-baht' => 'الباهت التايلاندي (THB)',\n                'title' => 'إعدادات المتجر',\n                'tunisian-dinar' => 'الدينار التونسي (TND)',\n                'turkish-lira' => 'الليرة التركية (TRY)',\n                'ukrainian-hryvnia' => 'الهريفنيا الأوكرانية (UAH)',\n                'united-arab-emirates-dirham' => 'الدرهم الإماراتي (AED)',\n                'united-states-dollar' => 'الدولار الأمريكي (USD)',\n                'uzbekistani-som' => 'السوم الأوزبكستاني (UZS)',\n                'venezuelan-bolívar' => 'البوليفار الفنزويلي (VEF)',\n                'vietnamese-dong' => 'الدونج الفيتنامي (VND)',\n                'warning-message' => 'احذر! إعدادات لغة النظام الافتراضية والعملات الافتراضية دائمة ولا يمكن تغييرها بمجرد تعيينها.',\n                'zambian-kwacha' => 'الكواشا الزامبي (ZMW)',\n            ],\n\n            'installation-processing' => [\n                'krayin' => 'تثبيت Krayin',\n                'krayin-info' => 'إنشاء جداول قاعدة البيانات، وقد يستغرق ذلك بضع دقائق',\n                'title' => 'التثبيت',\n            ],\n\n            'installation-completed' => [\n                'admin-panel' => 'لوحة المشرف',\n                'krayin-forums' => 'منتديات Krayin',\n                'customer-panel' => 'لوحة العميل',\n                'explore-krayin-extensions' => 'استكشاف امتدادات Krayin',\n                'title' => 'اكتمال التثبيت',\n                'title-info' => 'تم تثبيت Krayin بنجاح على نظامك.',\n            ],\n\n            'ready-for-installation' => [\n                'create-databsae-table' => 'إنشاء جدول قاعدة البيانات',\n                'install' => 'التثبيت',\n                'install-info' => 'Krayin للتثبيت',\n                'install-info-button' => 'انقر على الزر أدناه ل',\n                'populate-database-table' => 'ملء جداول قاعدة البيانات',\n                'start-installation' => 'بدء التثبيت',\n                'title' => 'جاهز للتثبيت',\n            ],\n\n            'start' => [\n                'locale' => 'اللغة',\n                'main' => 'بداية',\n                'select-locale' => 'اختر اللغة',\n                'title' => 'تثبيت Krayin الخاص بك',\n                'welcome-title' => 'مرحبًا بك في Krayin',\n            ],\n\n            'server-requirements' => [\n                'calendar' => 'التقويم',\n                'ctype' => 'cType',\n                'curl' => 'cURL',\n                'dom' => 'dom',\n                'fileinfo' => 'معلومات الملف',\n                'filter' => 'المرشح',\n                'gd' => 'GD',\n                'hash' => 'التجزئة',\n                'intl' => 'intl',\n                'json' => 'JSON',\n                'mbstring' => 'mbstring',\n                'openssl' => 'openssl',\n                'pcre' => 'pcre',\n                'pdo' => 'pdo',\n                'php' => 'PHP',\n                'php-version' => '8.1 أو أعلى',\n                'session' => 'الجلسة',\n                'title' => 'متطلبات الخادم',\n                'tokenizer' => 'tokenizer',\n                'xml' => 'XML',\n            ],\n\n            'back' => 'رجوع',\n            'krayin' => 'Krayin',\n            'krayin-info' => 'مشروع مجتمعي من قبل',\n            'krayin-logo' => 'شعار Krayin',\n            'continue' => 'متابعة',\n            'installation-description' => 'عادة ما تتضمن عملية تثبيت Krayin عدة خطوات. إليك نظرة عامة عامة على عملية التثبيت krayin',\n            'installation-info' => 'نحن سعداء برؤيتك هنا!',\n            'installation-title' => 'مرحبًا بك في التثبيت',\n            'installation-wizard' => 'لغة معالج التثبيت',\n            'title' => 'مثبت Krayin',\n            'webkul' => 'Webkul',\n        ],\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/lang/en/app.php",
    "content": "<?php\n\nreturn [\n    'seeders' => [\n        'attributes' => [\n            'leads' => [\n                'description' => 'Description',\n                'expected-close-date' => 'Expected Close Date',\n                'lead-value' => 'Lead Value',\n                'sales-owner' => 'Sales Owner',\n                'source' => 'Source',\n                'title' => 'Title',\n                'type' => 'Type',\n                'pipeline' => 'Pipeline',\n                'stage' => 'Stage',\n            ],\n\n            'persons' => [\n                'contact-numbers' => 'Contact Numbers',\n                'emails' => 'Emails',\n                'job-title' => 'Job Title',\n                'name' => 'Name',\n                'organization' => 'Organization',\n                'sales-owner' => 'Sales Owner',\n            ],\n\n            'organizations' => [\n                'address' => 'Address',\n                'name' => 'Name',\n                'sales-owner' => 'Sales Owner',\n            ],\n\n            'products' => [\n                'description' => 'Description',\n                'name' => 'Name',\n                'price' => 'Price',\n                'quantity' => 'Quantity',\n                'sku' => 'SKU',\n            ],\n\n            'quotes' => [\n                'adjustment-amount' => 'Adjustment Amount',\n                'billing-address' => 'Billing Address',\n                'description' => 'Description',\n                'discount-amount' => 'Discount Amount',\n                'discount-percent' => 'Discount Percent',\n                'expired-at' => 'Expired At',\n                'grand-total' => 'Grand Total',\n                'person' => 'Person',\n                'sales-owner' => 'Sales Owner',\n                'shipping-address' => 'Shipping Address',\n                'sub-total' => 'Sub Total',\n                'subject' => 'Subject',\n                'tax-amount' => 'Tax Amount',\n            ],\n\n            'warehouses' => [\n                'contact-address' => 'Contact Address',\n                'contact-emails' => 'Contact Emails',\n                'contact-name' => 'Contact Name',\n                'contact-numbers' => 'Contact Numbers',\n                'description' => 'Description',\n                'name' => 'Name',\n            ],\n        ],\n\n        'email' => [\n            'activity-created' => 'Activity created',\n            'activity-modified' => 'Activity modified',\n            'date' => 'Date',\n            'new-activity' => 'You have a new activity, please find the details bellow',\n            'new-activity-modified' => 'You have a new activity modified, please find the details bellow',\n            'participants' => 'Participants',\n            'title' => 'Title',\n            'type' => 'Type',\n        ],\n\n        'lead' => [\n            'pipeline' => [\n                'default' => 'Default Pipeline',\n\n                'pipeline-stages' => [\n                    'follow-up' => 'Follow Up',\n                    'lost' => 'Lost',\n                    'negotiation' => 'Negotiation',\n                    'new' => 'New',\n                    'prospect' => 'Prospect',\n                    'won' => 'Won',\n                ],\n            ],\n\n            'source' => [\n                'direct' => 'Direct',\n                'email' => 'Email',\n                'phone' => 'Phone',\n                'web' => 'Web',\n                'web-form' => 'Web Form',\n            ],\n\n            'type' => [\n                'existing-business' => 'Existing Business',\n                'new-business' => 'New Business',\n            ],\n        ],\n\n        'user' => [\n            'role' => [\n                'administrator-role' => 'Administrator Role',\n                'administrator' => 'Administrator',\n            ],\n        ],\n\n        'workflow' => [\n            'email-to-participants-after-activity-updation' => 'Emails to participants after activity updation',\n            'email-to-participants-after-activity-creation' => 'Emails to participants after activity creation',\n        ],\n    ],\n\n    'installer' => [\n        'index' => [\n            'create-administrator' => [\n                'admin' => 'Admin',\n                'krayin' => 'Krayin',\n                'confirm-password' => 'Confirm Password',\n                'email' => 'Email',\n                'email-address' => 'admin@example.com',\n                'password' => 'Password',\n                'title' => 'Create Administrator',\n            ],\n\n            'environment-configuration' => [\n                'algerian-dinar' => 'Algerian Dinar (DZD)',\n                'allowed-currencies' => 'Allowed Currencies',\n                'allowed-locales' => 'Allowed Locales',\n                'application-name' => 'Application Name',\n                'argentine-peso' => 'Argentine Peso (ARS)',\n                'australian-dollar' => 'Australian Dollar (AUD)',\n                'krayin' => 'Krayin',\n                'bangladeshi-taka' => 'Bangladeshi Taka (BDT)',\n                'brazilian-real' => 'Brazilian Real (BRL)',\n                'british-pound-sterling' => 'British Pound Sterling (GBP)',\n                'canadian-dollar' => 'Canadian Dollar (CAD)',\n                'cfa-franc-bceao' => 'CFA Franc BCEAO (XOF)',\n                'cfa-franc-beac' => 'CFA Franc BEAC (XAF)',\n                'chilean-peso' => 'Chilean Peso (CLP)',\n                'chinese-yuan' => 'Chinese Yuan (CNY)',\n                'colombian-peso' => 'Colombian Peso (COP)',\n                'czech-koruna' => 'Czech Koruna (CZK)',\n                'danish-krone' => 'Danish Krone (DKK)',\n                'database-connection' => 'Database Connection',\n                'database-hostname' => 'Database Hostname',\n                'database-name' => 'Database Name',\n                'database-password' => 'Database Password',\n                'database-port' => 'Database Port',\n                'database-prefix' => 'Database Prefix',\n                'database-username' => 'Database Username',\n                'default-currency' => 'Default Currency',\n                'default-locale' => 'Default Locale',\n                'default-timezone' => 'Default Timezone',\n                'default-url' => 'Default URL',\n                'default-url-link' => 'https://localhost',\n                'egyptian-pound' => 'Egyptian Pound (EGP)',\n                'euro' => 'Euro (EUR)',\n                'fijian-dollar' => 'Fijian Dollar (FJD)',\n                'hong-kong-dollar' => 'Hong Kong Dollar (HKD)',\n                'hungarian-forint' => 'Hungarian Forint (HUF)',\n                'indian-rupee' => 'Indian Rupee (INR)',\n                'indonesian-rupiah' => 'Indonesian Rupiah (IDR)',\n                'israeli-new-shekel' => 'Israeli New Shekel (ILS)',\n                'japanese-yen' => 'Japanese Yen (JPY)',\n                'jordanian-dinar' => 'Jordanian Dinar (JOD)',\n                'kazakhstani-tenge' => 'Kazakhstani Tenge (KZT)',\n                'kuwaiti-dinar' => 'Kuwaiti Dinar (KWD)',\n                'lebanese-pound' => 'Lebanese Pound (LBP)',\n                'libyan-dinar' => 'Libyan Dinar (LYD)',\n                'malaysian-ringgit' => 'Malaysian Ringgit (MYR)',\n                'mauritian-rupee' => 'Mauritian Rupee (MUR)',\n                'mexican-peso' => 'Mexican Peso (MXN)',\n                'moroccan-dirham' => 'Moroccan Dirham (MAD)',\n                'mysql' => 'Mysql',\n                'nepalese-rupee' => 'Nepalese Rupee (NPR)',\n                'new-taiwan-dollar' => 'New Taiwan Dollar (TWD)',\n                'new-zealand-dollar' => 'New Zealand Dollar (NZD)',\n                'nigerian-naira' => 'Nigerian Naira (NGN)',\n                'norwegian-krone' => 'Norwegian Krone (NOK)',\n                'omani-rial' => 'Omani Rial (OMR)',\n                'pakistani-rupee' => 'Pakistani Rupee (PKR)',\n                'panamanian-balboa' => 'Panamanian Balboa (PAB)',\n                'paraguayan-guarani' => 'Paraguayan Guarani (PYG)',\n                'peruvian-nuevo-sol' => 'Peruvian Nuevo Sol (PEN)',\n                'pgsql' => 'pgSQL',\n                'philippine-peso' => 'Philippine Peso (PHP)',\n                'polish-zloty' => 'Polish Zloty (PLN)',\n                'qatari-rial' => 'Qatari Rial (QAR)',\n                'romanian-leu' => 'Romanian Leu (RON)',\n                'russian-ruble' => 'Russian Ruble (RUB)',\n                'saudi-riyal' => 'Saudi Riyal (SAR)',\n                'select-timezone' => 'Select Timezone',\n                'singapore-dollar' => 'Singapore Dollar (SGD)',\n                'south-african-rand' => 'South African Rand (ZAR)',\n                'south-korean-won' => 'South Korean Won (KRW)',\n                'sqlsrv' => 'SQLSRV',\n                'sri-lankan-rupee' => 'Sri Lankan Rupee (LKR)',\n                'swedish-krona' => 'Swedish Krona (SEK)',\n                'swiss-franc' => 'Swiss Franc (CHF)',\n                'thai-baht' => 'Thai Baht (THB)',\n                'title' => 'Store Configuration',\n                'tunisian-dinar' => 'Tunisian Dinar (TND)',\n                'turkish-lira' => 'Turkish Lira (TRY)',\n                'ukrainian-hryvnia' => 'Ukrainian Hryvnia (UAH)',\n                'united-arab-emirates-dirham' => 'United Arab Emirates Dirham (AED)',\n                'united-states-dollar' => 'United States Dollar (USD)',\n                'uzbekistani-som' => 'Uzbekistani Som (UZS)',\n                'venezuelan-bolívar' => 'Venezuelan Bolívar (VEF)',\n                'vietnamese-dong' => 'Vietnamese Dong (VND)',\n                'warning-message' => 'Beware! The settings for your default system language and default currency are permanent and cannot be changed once set.',\n                'zambian-kwacha' => 'Zambian Kwacha (ZMW)',\n            ],\n\n            'installation-processing' => [\n                'krayin' => 'Installation Krayin',\n                'krayin-info' => 'Creating the database tables, this can take a few moments',\n                'title' => 'Installation',\n            ],\n\n            'installation-completed' => [\n                'admin-panel' => 'Admin Panel',\n                'krayin-forums' => 'Krayin Forum',\n                'customer-panel' => 'Customer Panel',\n                'explore-krayin-extensions' => 'Explore Krayin Extension',\n                'title' => 'Installation Completed',\n                'title-info' => 'Krayin is Successfully installed on your system.',\n            ],\n\n            'ready-for-installation' => [\n                'create-databsae-table' => 'Create the database table',\n                'install' => 'Installation',\n                'install-info' => 'Krayin For Installation',\n                'install-info-button' => 'Click the button below to',\n                'populate-database-table' => 'Populate the database tables',\n                'start-installation' => 'Start Installation',\n                'title' => 'Ready for Installation',\n            ],\n\n            'start' => [\n                'locale' => 'Locale',\n                'main' => 'Start',\n                'select-locale' => 'Select Locale',\n                'title' => 'Your Krayin install',\n                'welcome-title' => 'Welcome to Krayin',\n            ],\n\n            'server-requirements' => [\n                'calendar' => 'Calendar',\n                'ctype' => 'cType',\n                'curl' => 'cURL',\n                'dom' => 'dom',\n                'fileinfo' => 'fileInfo',\n                'filter' => 'Filter',\n                'gd' => 'GD',\n                'hash' => 'Hash',\n                'intl' => 'intl',\n                'json' => 'JSON',\n                'mbstring' => 'mbstring',\n                'openssl' => 'openssl',\n                'pcre' => 'pcre',\n                'pdo' => 'pdo',\n                'php' => 'PHP',\n                'php-version' => '8.1 or higher',\n                'session' => 'session',\n                'title' => 'System Requirements',\n                'tokenizer' => 'tokenizer',\n                'xml' => 'XML',\n            ],\n\n            'back' => 'Back',\n            'krayin' => 'Krayin',\n            'krayin-info' => 'a Community Project by',\n            'krayin-logo' => 'Krayin Logo',\n            'continue' => 'Continue',\n            'installation-description' => 'Krayin installation typically involves several steps. Here\\'s a general outline of the installation process for Krayin',\n            'installation-info' => 'We are happy to see you here!',\n            'installation-title' => 'Welcome to Installation',\n            'installation-wizard' => 'Installation Wizard language',\n            'title' => 'Krayin Installer',\n            'webkul' => 'Webkul',\n        ],\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/lang/es/app.php",
    "content": "<?php\n\nreturn [\n    'seeders' => [\n        'attributes' => [\n            'leads' => [\n                'description' => 'Descripción',\n                'expected-close-date' => 'Fecha de Cierre Esperada',\n                'lead-value' => 'Valor del Prospecto',\n                'sales-owner' => 'Propietario de Ventas',\n                'source' => 'Fuente',\n                'title' => 'Título',\n                'type' => 'Tipo',\n                'pipeline' => 'Pipeline',\n                'stage' => 'Etapa',\n            ],\n\n            'persons' => [\n                'contact-numbers' => 'Números de Contacto',\n                'emails' => 'Correos Electrónicos',\n                'job-title' => 'Cargo',\n                'name' => 'Nombre',\n                'organization' => 'Organización',\n                'sales-owner' => 'Propietario de Ventas',\n            ],\n\n            'organizations' => [\n                'address' => 'Dirección',\n                'name' => 'Nombre',\n                'sales-owner' => 'Propietario de Ventas',\n            ],\n\n            'products' => [\n                'description' => 'Descripción',\n                'name' => 'Nombre',\n                'price' => 'Precio',\n                'quantity' => 'Cantidad',\n                'sku' => 'SKU',\n            ],\n\n            'quotes' => [\n                'adjustment-amount' => 'Cantidad de Ajuste',\n                'billing-address' => 'Dirección de Facturación',\n                'description' => 'Descripción',\n                'discount-amount' => 'Cantidad de Descuento',\n                'discount-percent' => 'Porcentaje de Descuento',\n                'expired-at' => 'Expira el',\n                'grand-total' => 'Total General',\n                'person' => 'Persona',\n                'sales-owner' => 'Propietario de Ventas',\n                'shipping-address' => 'Dirección de Envío',\n                'sub-total' => 'Subtotal',\n                'subject' => 'Asunto',\n                'tax-amount' => 'Cantidad de Impuestos',\n            ],\n\n            'warehouses' => [\n                'contact-address' => 'Dirección de Contacto',\n                'contact-emails' => 'Correos Electrónicos de Contacto',\n                'contact-name' => 'Nombre de Contacto',\n                'contact-numbers' => 'Números de Contacto',\n                'description' => 'Descripción',\n                'name' => 'Nombre',\n            ],\n        ],\n\n        'email' => [\n            'activity-created' => 'Actividad Creada',\n            'activity-modified' => 'Actividad Modificada',\n            'date' => 'Fecha',\n            'new-activity' => 'Tienes una nueva actividad, encuentra los detalles a continuación',\n            'new-activity-modified' => 'Tienes una actividad modificada, encuentra los detalles a continuación',\n            'participants' => 'Participantes',\n            'title' => 'Título',\n            'type' => 'Tipo',\n        ],\n\n        'lead' => [\n            'pipeline' => [\n                'default' => 'Pipeline Predeterminado',\n\n                'pipeline-stages' => [\n                    'follow-up' => 'Seguimiento',\n                    'lost' => 'Perdido',\n                    'negotiation' => 'Negociación',\n                    'new' => 'Nuevo',\n                    'prospect' => 'Prospecto',\n                    'won' => 'Ganado',\n                ],\n            ],\n\n            'source' => [\n                'direct' => 'Directo',\n                'email' => 'Correo Electrónico',\n                'phone' => 'Teléfono',\n                'web' => 'Web',\n                'web-form' => 'Formulario Web',\n            ],\n\n            'type' => [\n                'existing-business' => 'Negocio Existente',\n                'new-business' => 'Nuevo Negocio',\n            ],\n        ],\n\n        'user' => [\n            'role' => [\n                'administrator-role' => 'Rol de Administrador',\n                'administrator' => 'Administrador',\n            ],\n        ],\n\n        'workflow' => [\n            'email-to-participants-after-activity-updation' => 'Correos electrónicos a los participantes tras la actualización de actividades',\n            'email-to-participants-after-activity-creation' => 'Correos electrónicos a los participantes tras la creación de actividades',\n        ],\n    ],\n\n    'installer' => [\n        'index' => [\n            'create-administrator' => [\n                'admin' => 'Admin',\n                'krayin' => 'Krayin',\n                'confirm-password' => 'Confirmar Contraseña',\n                'email' => 'Correo Electrónico',\n                'email-address' => 'admin@example.com',\n                'password' => 'Contraseña',\n                'title' => 'Crear Administrador',\n            ],\n\n            'environment-configuration' => [\n                'algerian-dinar' => 'Dinar Argelino (DZD)',\n                'allowed-currencies' => 'Monedas Permitidas',\n                'allowed-locales' => 'Idiomas Permitidos',\n                'application-name' => 'Nombre de la Aplicación',\n                'argentine-peso' => 'Peso Argentino (ARS)',\n                'australian-dollar' => 'Dólar Australiano (AUD)',\n                'krayin' => 'Krayin',\n                'bangladeshi-taka' => 'Taka Bangladesí (BDT)',\n                'brazilian-real' => 'Real Brasileño (BRL)',\n                'british-pound-sterling' => 'Libra Esterlina (GBP)',\n                'canadian-dollar' => 'Dólar Canadiense (CAD)',\n                'cfa-franc-bceao' => 'Franco CFA BCEAO (XOF)',\n                'cfa-franc-beac' => 'Franco CFA BEAC (XAF)',\n                'chilean-peso' => 'Peso Chileno (CLP)',\n                'chinese-yuan' => 'Yuan Chino (CNY)',\n                'colombian-peso' => 'Peso Colombiano (COP)',\n                'czech-koruna' => 'Corona Checa (CZK)',\n                'danish-krone' => 'Corona Danesa (DKK)',\n                'database-connection' => 'Conexión de Base de Datos',\n                'database-hostname' => 'Nombre del Host de la Base de Datos',\n                'database-name' => 'Nombre de la Base de Datos',\n                'database-password' => 'Contraseña de la Base de Datos',\n                'database-port' => 'Puerto de la Base de Datos',\n                'database-prefix' => 'Prefijo de la Base de Datos',\n                'database-username' => 'Usuario de la Base de Datos',\n                'default-currency' => 'Moneda Predeterminada',\n                'default-locale' => 'Idioma Predeterminado',\n                'default-timezone' => 'Zona Horaria Predeterminada',\n                'default-url' => 'URL Predeterminada',\n                'default-url-link' => 'https://localhost',\n                'egyptian-pound' => 'Libra Egipcia (EGP)',\n                'euro' => 'Euro (EUR)',\n                'fijian-dollar' => 'Dólar Fiyiano (FJD)',\n                'hong-kong-dollar' => 'Dólar de Hong Kong (HKD)',\n                'hungarian-forint' => 'Forinto Húngaro (HUF)',\n                'indian-rupee' => 'Rupia India (INR)',\n                'indonesian-rupiah' => 'Rupia Indonesia (IDR)',\n                'israeli-new-shekel' => 'Nuevo Shekel Israelí (ILS)',\n                'japanese-yen' => 'Yen Japonés (JPY)',\n                'jordanian-dinar' => 'Dinar Jordano (JOD)',\n                'kazakhstani-tenge' => 'Tenge Kazajo (KZT)',\n                'kuwaiti-dinar' => 'Dinar Kuwaití (KWD)',\n                'lebanese-pound' => 'Libra Libanesa (LBP)',\n                'libyan-dinar' => 'Dinar Libio (LYD)',\n                'malaysian-ringgit' => 'Ringgit Malayo (MYR)',\n                'mauritian-rupee' => 'Rupia de Mauricio (MUR)',\n                'mexican-peso' => 'Peso Mexicano (MXN)',\n                'moroccan-dirham' => 'Dirham Marroquí (MAD)',\n                'mysql' => 'Mysql',\n                'nepalese-rupee' => 'Rupia Nepalesa (NPR)',\n                'new-taiwan-dollar' => 'Nuevo Dólar Taiwanés (TWD)',\n                'new-zealand-dollar' => 'Dólar Neozelandés (NZD)',\n                'nigerian-naira' => 'Naira Nigeriana (NGN)',\n                'norwegian-krone' => 'Corona Noruega (NOK)',\n                'omani-rial' => 'Rial Omaní (OMR)',\n                'pakistani-rupee' => 'Rupia Paquistaní (PKR)',\n                'panamanian-balboa' => 'Balboa Panameño (PAB)',\n                'paraguayan-guarani' => 'Guaraní Paraguayo (PYG)',\n                'peruvian-nuevo-sol' => 'Nuevo Sol Peruano (PEN)',\n                'pgsql' => 'pgSQL',\n                'philippine-peso' => 'Peso Filipino (PHP)',\n                'polish-zloty' => 'Zloty Polaco (PLN)',\n                'qatari-rial' => 'Rial Catarí (QAR)',\n                'romanian-leu' => 'Leu Rumano (RON)',\n                'russian-ruble' => 'Rublo Ruso (RUB)',\n                'saudi-riyal' => 'Riyal Saudí (SAR)',\n                'select-timezone' => 'Seleccionar Zona Horaria',\n                'singapore-dollar' => 'Dólar de Singapur (SGD)',\n                'south-african-rand' => 'Rand Sudafricano (ZAR)',\n                'south-korean-won' => 'Won Surcoreano (KRW)',\n                'sqlsrv' => 'SQLSRV',\n                'sri-lankan-rupee' => 'Rupia de Sri Lanka (LKR)',\n                'swedish-krona' => 'Corona Sueca (SEK)',\n                'swiss-franc' => 'Franco Suizo (CHF)',\n                'thai-baht' => 'Baht Tailandés (THB)',\n                'title' => 'Configuración de la Tienda',\n                'tunisian-dinar' => 'Dinar Tunecino (TND)',\n                'turkish-lira' => 'Lira Turca (TRY)',\n                'ukrainian-hryvnia' => 'Grivna Ucraniana (UAH)',\n                'united-arab-emirates-dirham' => 'Dírham de los Emiratos Árabes Unidos (AED)',\n                'united-states-dollar' => 'Dólar Estadounidense (USD)',\n                'uzbekistani-som' => 'Som Uzbeko (UZS)',\n                'venezuelan-bolívar' => 'Bolívar Venezolano (VEF)',\n                'vietnamese-dong' => 'Dong Vietnamita (VND)',\n                'warning-message' => '¡Atención! Los ajustes de idioma y moneda predeterminados son permanentes y no se pueden cambiar una vez configurados.',\n                'zambian-kwacha' => 'Kwacha de Zambia (ZMW)',\n            ],\n\n            'installation-processing' => [\n                'krayin' => 'Instalación de Krayin',\n                'krayin-info' => 'Creando las tablas de la base de datos, esto puede tardar unos momentos',\n                'title' => 'Instalación',\n            ],\n\n            'installation-completed' => [\n                'admin-panel' => 'Panel de Administración',\n                'krayin-forums' => 'Foro de Krayin',\n                'customer-panel' => 'Panel de Clientes',\n                'explore-krayin-extensions' => 'Explorar Extensiones de Krayin',\n                'title' => 'Instalación Completada',\n                'title-info' => 'Krayin se ha instalado correctamente en su sistema.',\n            ],\n\n            'ready-for-installation' => [\n                'create-databsae-table' => 'Crear tabla de base de datos',\n                'install' => 'Instalación',\n                'install-info' => 'Krayin Para la Instalación',\n                'install-info-button' => 'Haga clic en el botón a continuación para',\n                'populate-database-table' => 'Rellenar las tablas de la base de datos',\n                'start-installation' => 'Iniciar Instalación',\n                'title' => 'Listo para la Instalación',\n            ],\n\n            'start' => [\n                'locale' => 'Idioma',\n                'main' => 'Iniciar',\n                'select-locale' => 'Seleccionar Idioma',\n                'title' => 'Instalación de Krayin',\n                'welcome-title' => 'Bienvenido a Krayin',\n            ],\n\n            'server-requirements' => [\n                'calendar' => 'Calendario',\n                'ctype' => 'cType',\n                'curl' => 'cURL',\n                'dom' => 'dom',\n                'fileinfo' => 'fileInfo',\n                'filter' => 'Filtro',\n                'gd' => 'GD',\n                'hash' => 'Hash',\n                'intl' => 'intl',\n                'json' => 'JSON',\n                'mbstring' => 'mbstring',\n                'openssl' => 'openssl',\n                'pcre' => 'pcre',\n                'pdo' => 'pdo',\n                'php' => 'PHP',\n                'php-version' => '8.1 o superior',\n                'session' => 'sesión',\n                'title' => 'Requisitos del Sistema',\n                'tokenizer' => 'tokenizador',\n                'xml' => 'XML',\n            ],\n\n            'back' => 'Atrás',\n            'krayin' => 'Krayin',\n            'krayin-info' => 'un Proyecto Comunitario de',\n            'krayin-logo' => 'Logotipo de Krayin',\n            'continue' => 'Continuar',\n            'installation-description' => 'La instalación de Krayin generalmente implica varios pasos. Aquí hay un esquema general del proceso de instalación de Krayin.',\n            'installation-info' => '¡Estamos encantados de verte aquí!',\n            'installation-title' => 'Bienvenido a la Instalación',\n            'asistente-de-instalación' => 'Idioma del Asistente de Instalación',\n            'title' => 'Instalador de Krayin',\n            'webkul' => 'Webkul',\n        ],\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/lang/fa/app.php",
    "content": "<?php\n\nreturn [\n    'seeders' => [\n        'attributes' => [\n            'leads' => [\n                'description' => 'توضیحات',\n                'expected-close-date' => 'تاریخ بسته شدن مورد انتظار',\n                'lead-value' => 'ارزش سرنخ',\n                'sales-owner' => 'مالک فروش',\n                'source' => 'منبع',\n                'title' => 'عنوان',\n                'type' => 'نوع',\n                'pipeline' => 'پایپ لاین',\n                'stage' => 'مرحله',\n            ],\n\n            'persons' => [\n                'contact-numbers' => 'شماره‌های تماس',\n                'emails' => 'ایمیل‌ها',\n                'job-title' => 'عنوان شغلی',\n                'name' => 'نام',\n                'organization' => 'سازمان',\n                'sales-owner' => 'مالک فروش',\n            ],\n\n            'organizations' => [\n                'address' => 'آدرس',\n                'name' => 'نام',\n                'sales-owner' => 'مالک فروش',\n            ],\n\n            'products' => [\n                'description' => 'توضیحات',\n                'name' => 'نام',\n                'price' => 'قیمت',\n                'quantity' => 'کمیت',\n                'sku' => 'SKU',\n            ],\n\n            'quotes' => [\n                'adjustment-amount' => 'مقدار تنظیم',\n                'billing-address' => 'آدرس صورت‌حساب',\n                'description' => 'توضیحات',\n                'discount-amount' => 'مقدار تخفیف',\n                'discount-percent' => 'درصد تخفیف',\n                'expired-at' => 'منقضی شده در',\n                'grand-total' => 'مجموع کل',\n                'person' => 'شخص',\n                'sales-owner' => 'مالک فروش',\n                'shipping-address' => 'آدرس ارسال',\n                'sub-total' => 'جمع جزئی',\n                'subject' => 'موضوع',\n                'tax-amount' => 'مقدار مالیات',\n            ],\n\n            'warehouses' => [\n                'contact-address' => 'آدرس تماس',\n                'contact-emails' => 'ایمیل‌های تماس',\n                'contact-name' => 'نام تماس',\n                'contact-numbers' => 'شماره‌های تماس',\n                'description' => 'توضیحات',\n                'name' => 'نام',\n            ],\n        ],\n\n        'email' => [\n            'activity-created' => 'فعالیت ایجاد شد',\n            'activity-modified' => 'فعالیت ویرایش شد',\n            'date' => 'تاریخ',\n            'new-activity' => 'شما یک فعالیت جدید دارید، لطفاً جزئیات را در زیر پیدا کنید',\n            'new-activity-modified' => 'شما یک فعالیت جدید ویرایش شده دارید، لطفاً جزئیات را در زیر پیدا کنید',\n            'participants' => 'شرکت‌کنندگان',\n            'title' => 'عنوان',\n            'type' => 'نوع',\n        ],\n\n        'lead' => [\n            'pipeline' => [\n                'default' => 'پایپ لاین پیش‌فرض',\n\n                'pipeline-stages' => [\n                    'follow-up' => 'پیگیری',\n                    'lost' => 'گم‌شده',\n                    'negotiation' => 'مذاکره',\n                    'new' => 'جدید',\n                    'prospect' => 'مشتری بالقوه',\n                    'won' => 'برد',\n                ],\n            ],\n\n            'source' => [\n                'direct' => 'مستقیم',\n                'email' => 'ایمیل',\n                'phone' => 'تلفن',\n                'web' => 'وب',\n                'web-form' => 'فرم وب',\n            ],\n\n            'type' => [\n                'existing-business' => 'کسب و کار موجود',\n                'new-business' => 'کسب و کار جدید',\n            ],\n        ],\n\n        'user' => [\n            'role' => [\n                'administrator-role' => 'نقش مدیر',\n                'administrator' => 'مدیر',\n            ],\n        ],\n\n        'workflow' => [\n            'email-to-participants-after-activity-updation' => 'ایمیل‌ها به شرکت‌کنندگان پس از به‌روزرسانی فعالیت',\n            'email-to-participants-after-activity-creation' => 'ایمیل‌ها به شرکت‌کنندگان پس از ایجاد فعالیت',\n        ],\n    ],\n\n    'installer' => [\n        'index' => [\n            'create-administrator' => [\n                'admin' => 'مدیر',\n                'krayin' => 'کرایین',\n                'confirm-password' => 'تایید رمز عبور',\n                'email' => 'ایمیل',\n                'email-address' => 'admin@example.com',\n                'password' => 'رمز عبور',\n                'title' => 'ایجاد مدیر',\n            ],\n\n            'environment-configuration' => [\n                'algerian-dinar' => 'دینار الجزایر (DZD)',\n                'allowed-currencies' => 'ارزهای مجاز',\n                'allowed-locales' => 'زبان‌های مجاز',\n                'application-name' => 'نام برنامه',\n                'argentine-peso' => 'پزو آرژانتین (ARS)',\n                'australian-dollar' => 'دلار استرالیا (AUD)',\n                'krayin' => 'کرایین',\n                'bangladeshi-taka' => 'تاکا بنگلادش (BDT)',\n                'brazilian-real' => 'رئال برزیل (BRL)',\n                'british-pound-sterling' => 'پوند استرلینگ بریتانیا (GBP)',\n                'canadian-dollar' => 'دلار کانادا (CAD)',\n                'cfa-franc-bceao' => 'فرانک CFA BCEAO (XOF)',\n                'cfa-franc-beac' => 'فرانک CFA BEAC (XAF)',\n                'chilean-peso' => 'پزو شیلی (CLP)',\n                'chinese-yuan' => 'یوان چین (CNY)',\n                'colombian-peso' => 'پزو کلمبیا (COP)',\n                'czech-koruna' => 'کرونا چک (CZK)',\n                'danish-krone' => 'کرون دانمارک (DKK)',\n                'database-connection' => 'اتصال پایگاه داده',\n                'database-hostname' => 'نام میزبان پایگاه داده',\n                'database-name' => 'نام پایگاه داده',\n                'database-password' => 'رمز عبور پایگاه داده',\n                'database-port' => 'پورت پایگاه داده',\n                'database-prefix' => 'پیشوند پایگاه داده',\n                'database-username' => 'نام کاربری پایگاه داده',\n                'default-currency' => 'ارز پیش‌فرض',\n                'default-locale' => 'زبان پیش‌فرض',\n                'default-timezone' => 'منطقه زمانی پیش‌فرض',\n                'default-url' => 'آدرس URL پیش‌فرض',\n                'default-url-link' => 'https://localhost',\n                'egyptian-pound' => 'پوند مصر (EGP)',\n                'euro' => 'یورو (EUR)',\n                'fijian-dollar' => 'دلار فیجی (FJD)',\n                'hong-kong-dollar' => 'دلار هنگ کنگ (HKD)',\n                'hungarian-forint' => 'فورینت مجارستان (HUF)',\n                'indian-rupee' => 'روپیه هند (INR)',\n                'indonesian-rupiah' => 'روپیه اندونزی (IDR)',\n                'israeli-new-shekel' => 'شکل جدید اسرائیل (ILS)',\n                'japanese-yen' => 'ین ژاپن (JPY)',\n                'jordanian-dinar' => 'دینار اردن (JOD)',\n                'kazakhstani-tenge' => 'تنگه قزاقستان (KZT)',\n                'kuwaiti-dinar' => 'دینار کویت (KWD)',\n                'lebanese-pound' => 'پوند لبنان (LBP)',\n                'libyan-dinar' => 'دینار لیبی (LYD)',\n                'malaysian-ringgit' => 'رینگیت مالزی (MYR)',\n                'mauritian-rupee' => 'روپیه موریس (MUR)',\n                'mexican-peso' => 'پزو مکزیک (MXN)',\n                'moroccan-dirham' => 'درهم مراکش (MAD)',\n                'mysql' => 'Mysql',\n                'nepalese-rupee' => 'روپیه نپال (NPR)',\n                'new-taiwan-dollar' => 'دلار جدید تایوان (TWD)',\n                'new-zealand-dollar' => 'دلار نیوزیلند (NZD)',\n                'nigerian-naira' => 'نایرا نیجریه (NGN)',\n                'norwegian-krone' => 'کرون نروژ (NOK)',\n                'omani-rial' => 'ریال عمان (OMR)',\n                'pakistani-rupee' => 'روپیه پاکستان (PKR)',\n                'panamanian-balboa' => 'بالبوآ پاناما (PAB)',\n                'paraguayan-guarani' => 'گوارانی پاراگوئه (PYG)',\n                'peruvian-nuevo-sol' => 'سول جدید پرو (PEN)',\n                'pgsql' => 'pgSQL',\n                'philippine-peso' => 'پزو فیلیپین (PHP)',\n                'polish-zloty' => 'زلوتی لهستان (PLN)',\n                'qatari-rial' => 'ریال قطر (QAR)',\n                'romanian-leu' => 'لئو رومانی (RON)',\n                'russian-ruble' => 'روبل روسیه (RUB)',\n                'saudi-riyal' => 'ریال عربستان (SAR)',\n                'select-timezone' => 'منطقه زمانی را انتخاب کنید',\n                'singapore-dollar' => 'دلار سنگاپور (SGD)',\n                'south-african-rand' => 'راند آفریقای جنوبی (ZAR)',\n                'south-korean-won' => 'وون کره جنوبی (KRW)',\n                'sqlsrv' => 'SQLSRV',\n                'sri-lankan-rupee' => 'روپیه سریلانکا (LKR)',\n                'swedish-krona' => 'کرون سوئد (SEK)',\n                'swiss-franc' => 'فرانک سوئیس (CHF)',\n                'thai-baht' => 'بات تایلند (THB)',\n                'title' => 'پیکربندی فروشگاه',\n                'tunisian-dinar' => 'دینار تونس (TND)',\n                'turkish-lira' => 'لیر ترکیه (TRY)',\n                'ukrainian-hryvnia' => 'هریونیا اوکراین (UAH)',\n                'united-arab-emirates-dirham' => 'درهم امارات متحده عربی (AED)',\n                'united-states-dollar' => 'دلار ایالات متحده (USD)',\n                'uzbekistani-som' => 'سوم ازبکستان (UZS)',\n                'venezuelan-bolívar' => 'بولیوار ونزوئلا (VEF)',\n                'vietnamese-dong' => 'دونگ ویتنام (VND)',\n                'warning-message' => 'هشدار! تنظیمات زبان پیش‌فرض سیستم و ارز پیش‌فرض دائمی هستند و پس از تنظیم قابل تغییر نیستند.',\n                'zambian-kwacha' => 'کواچای زامبیا (ZMW)',\n            ],\n\n            'installation-processing' => [\n                'krayin' => 'نصب کرایین',\n                'krayin-info' => 'در حال ایجاد جداول پایگاه داده، این ممکن است چند لحظه طول بکشد',\n                'title' => 'نصب',\n            ],\n\n            'installation-completed' => [\n                'admin-panel' => 'پنل مدیریت',\n                'krayin-forums' => 'انجمن کرایین',\n                'customer-panel' => 'پنل مشتری',\n                'explore-krayin-extensions' => 'کاوش افزونه‌های کرایین',\n                'title' => 'نصب کامل شد',\n                'title-info' => 'کرایین با موفقیت بر روی سیستم شما نصب شد.',\n            ],\n\n            'ready-for-installation' => [\n                'create-databsae-table' => 'ایجاد جدول پایگاه داده',\n                'install' => 'نصب',\n                'install-info' => 'کرایین برای نصب',\n                'install-info-button' => 'برای شروع، دکمه زیر را کلیک کنید',\n                'populate-database-table' => 'پر کردن جداول پایگاه داده',\n                'start-installation' => 'شروع نصب',\n                'title' => 'آماده برای نصب',\n            ],\n\n            'start' => [\n                'locale' => 'زبان',\n                'main' => 'شروع',\n                'select-locale' => 'انتخاب زبان',\n                'title' => 'نصب کرایین شما',\n                'welcome-title' => 'به کرایین خوش آمدید',\n            ],\n\n            'server-requirements' => [\n                'calendar' => 'تقویم',\n                'ctype' => 'cType',\n                'curl' => 'cURL',\n                'dom' => 'dom',\n                'fileinfo' => 'fileInfo',\n                'filter' => 'فیلتر',\n                'gd' => 'GD',\n                'hash' => 'Hash',\n                'intl' => 'intl',\n                'json' => 'JSON',\n                'mbstring' => 'mbstring',\n                'openssl' => 'openssl',\n                'pcre' => 'pcre',\n                'pdo' => 'pdo',\n                'php' => 'PHP',\n                'php-version' => '8.1 یا بالاتر',\n                'session' => 'session',\n                'title' => 'نیازمندی‌های سیستم',\n                'tokenizer' => 'tokenizer',\n                'xml' => 'XML',\n            ],\n\n            'back' => 'بازگشت',\n            'krayin' => 'کرایین',\n            'krayin-info' => 'یک پروژه اجتماعی توسط',\n            'krayin-logo' => 'لوگوی کرایین',\n            'continue' => 'ادامه',\n            'installation-description' => 'نصب کرایین معمولاً شامل چندین مرحله است. در اینجا یک طرح کلی از فرآیند نصب کرایین آمده است',\n            'installation-info' => 'خوشحالیم که شما را اینجا می‌بینیم!',\n            'installation-title' => 'به نصب خوش آمدید',\n            'installation-wizard' => 'زبان جادوگر نصب',\n            'title' => 'نصب‌کننده کرایین',\n            'webkul' => 'وبکول',\n        ],\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/lang/pt_BR/app.php",
    "content": "<?php\n\nreturn [\n    'seeders' => [\n        'attributes' => [\n            'leads' => [\n                'description' => 'Descrição',\n                'expected-close-date' => 'Data de Fechamento Esperada',\n                'lead-value' => 'Valor da Oportunidade',\n                'sales-owner' => 'Responsável pela Venda',\n                'source' => 'Origem',\n                'title' => 'Título',\n                'type' => 'Tipo',\n                'pipeline' => 'Funil',\n                'stage' => 'Estágio',\n            ],\n\n            'persons' => [\n                'contact-numbers' => 'Números de Contato',\n                'emails' => 'E-mails',\n                'job-title' => 'Cargo',\n                'name' => 'Nome',\n                'organization' => 'Empresa',\n                'sales-owner' => 'Responsável pela Venda',\n            ],\n\n            'organizations' => [\n                'address' => 'Endereço',\n                'name' => 'Nome',\n                'sales-owner' => 'Responsável pela Venda',\n            ],\n\n            'products' => [\n                'description' => 'Descrição',\n                'name' => 'Nome',\n                'price' => 'Preço',\n                'quantity' => 'Quantidade',\n                'sku' => 'Código',\n            ],\n\n            'quotes' => [\n                'adjustment-amount' => 'Valor de Ajuste',\n                'billing-address' => 'Endereço de Cobrança',\n                'description' => 'Descrição',\n                'discount-amount' => 'Valor do Desconto',\n                'discount-percent' => 'Percentual de Desconto',\n                'expired-at' => 'Expira em',\n                'grand-total' => 'Total Geral',\n                'person' => 'Pessoa',\n                'sales-owner' => 'Responsável pela Venda',\n                'shipping-address' => 'Endereço de Entrega',\n                'sub-total' => 'Subtotal',\n                'subject' => 'Assunto',\n                'tax-amount' => 'Valor do Imposto',\n            ],\n\n            'warehouses' => [\n                'contact-address' => 'Endereço de Contato',\n                'contact-emails' => 'Emails de Contato',\n                'contact-name' => 'Nome do Contato',\n                'contact-numbers' => 'Números de Contato',\n                'description' => 'Descrição',\n                'name' => 'Nome',\n            ],\n        ],\n\n        'email' => [\n            'activity-created' => 'Atividade Adicionada',\n            'activity-modified' => 'Atividade modificada',\n            'date' => 'Data',\n            'new-activity' => 'Você tem uma nova atividade, veja os detalhes abaixo',\n            'new-activity-modified' => 'Uma nova atividade foi modificada, veja os detalhes abaixo',\n            'participants' => 'Participantes',\n            'title' => 'Título',\n            'type' => 'Tipo',\n        ],\n\n        'lead' => [\n            'pipeline' => [\n                'default' => 'Funil Padrão',\n\n                'pipeline-stages' => [\n                    'follow-up' => 'Acompanhamento',\n                    'lost' => 'Perdido',\n                    'negotiation' => 'Negociação',\n                    'new' => 'Novo',\n                    'prospect' => 'Qualificado',\n                    'won' => 'Ganho',\n                ],\n            ],\n\n            'source' => [\n                'direct' => 'Direto',\n                'email' => 'E-mail',\n                'phone' => 'Telefone',\n                'web' => 'Web',\n                'web-form' => 'Formulário Web',\n            ],\n\n            'type' => [\n                'existing-business' => 'Negócio Existente',\n                'new-business' => 'Novo Negócio',\n            ],\n        ],\n\n        'user' => [\n            'role' => [\n                'administrator-role' => 'Função de Administrador',\n                'administrator' => 'Administrador',\n            ],\n        ],\n\n        'workflow' => [\n            'email-to-participants-after-activity-updation' => 'E-mails para participantes após atualização de atividade',\n            'email-to-participants-after-activity-creation' => 'E-mails para participantes após adicionar atividade',\n        ],\n    ],\n\n    'installer' => [\n        'index' => [\n            'create-administrator' => [\n                'admin' => 'Administrador',\n                'krayin' => 'Krayin',\n                'confirm-password' => 'Confirmar Senha',\n                'email' => 'E-mail',\n                'email-address' => 'admin@example.com',\n                'password' => 'Senha',\n                'title' => 'Adicionar Administrador',\n            ],\n\n            'environment-configuration' => [\n                'algerian-dinar' => 'Dinar Argelino (DZD)',\n                'allowed-currencies' => 'Moedas Permitidas',\n                'allowed-locales' => 'Idiomas Permitidos',\n                'application-name' => 'Nome do Aplicativo',\n                'argentine-peso' => 'Peso Argentino (ARS)',\n                'australian-dollar' => 'Dólar Australiano (AUD)',\n                'krayin' => 'Krayin',\n                'bangladeshi-taka' => 'Taka de Bangladesh (BDT)',\n                'brazilian-real' => 'Real Brasileiro (BRL)',\n                'british-pound-sterling' => 'Libra Esterlina (GBP)',\n                'canadian-dollar' => 'Dólar Canadense (CAD)',\n                'cfa-franc-bceao' => 'Franco CFA BCEAO (XOF)',\n                'cfa-franc-beac' => 'Franco CFA BEAC (XAF)',\n                'chilean-peso' => 'Peso Chileno (CLP)',\n                'chinese-yuan' => 'Yuan Chinês (CNY)',\n                'colombian-peso' => 'Peso Colombiano (COP)',\n                'czech-koruna' => 'Coroa Checa (CZK)',\n                'danish-krone' => 'Coroa Dinamarquesa (DKK)',\n                'database-connection' => 'Conexão com Banco de Dados',\n                'database-hostname' => 'Nome do Host do Banco de Dados',\n                'database-name' => 'Nome do Banco de Dados',\n                'database-password' => 'Senha do Banco de Dados',\n                'database-port' => 'Porta do Banco de Dados',\n                'database-prefix' => 'Prefixo do Banco de Dados',\n                'database-username' => 'Usuário do Banco de Dados',\n                'default-currency' => 'Moeda Padrão',\n                'default-locale' => 'Idioma Padrão',\n                'default-timezone' => 'Fuso Horário Padrão',\n                'default-url' => 'URL Padrão',\n                'default-url-link' => 'https://localhost',\n                'euro' => 'Euro (EUR)',\n                'mysql' => 'MySQL',\n                'pgsql' => 'pgSQL',\n                'select-timezone' => 'Selecionar Fuso Horário',\n                'warning-message' => 'Atenção! As configurações de idioma e moeda padrão não podem ser alteradas após definidas.',\n                'united-states-dollar' => 'Dólar Americano (USD)',\n            ],\n\n            'installation-processing' => [\n                'krayin' => 'Instalação do Krayin',\n                'krayin-info' => 'Criando as tabelas do banco de dados, isso pode levar alguns momentos',\n                'title' => 'Instalação',\n            ],\n\n            'installation-completed' => [\n                'admin-panel' => 'Painel de Administração',\n                'krayin-forums' => 'Fórum Krayin',\n                'customer-panel' => 'Painel do Cliente',\n                'explore-krayin-extensions' => 'Explorar Extensões Krayin',\n                'title' => 'Instalação Concluída',\n                'title-info' => 'Krayin foi instalado com sucesso no seu sistema.',\n            ],\n\n            'ready-for-installation' => [\n                'create-databsae-table' => 'Adicionar tabela do banco de dados',\n                'install' => 'Instalação',\n                'start-installation' => 'Iniciar Instalação',\n                'title' => 'Pronto para Instalação',\n            ],\n\n            'start' => [\n                'locale' => 'Idioma',\n                'main' => 'Início',\n                'select-locale' => 'Selecionar Idioma',\n                'title' => 'Instalação do Krayin',\n                'welcome-title' => 'Bem-vindo ao Krayin',\n            ],\n\n            'server-requirements' => [\n                'php-version' => '8.1 ou superior',\n                'title' => 'Requisitos do Sistema',\n            ],\n\n            'back' => 'Voltar',\n            'krayin' => 'Krayin',\n            'krayin-info' => 'um projeto comunitário de',\n            'krayin-logo' => 'Logotipo Krayin',\n            'continue' => 'Continuar',\n            'installation-description' => 'A instalação do Krayin geralmente envolve várias etapas. Aqui está uma visão geral do processo de instalação do Krayin',\n            'installation-info' => 'Estamos felizes em ver você aqui!',\n            'installation-title' => 'Bem-vindo à Instalação',\n            'installation-wizard' => 'Assistente de Instalação - Idioma',\n            'title' => 'Instalador do Krayin',\n            'webkul' => 'Webkul',\n        ],\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/lang/tr/app.php",
    "content": "<?php\n\nreturn [\n    'seeders' => [\n        'attributes' => [\n            'leads' => [\n                'description' => 'Açıklama',\n                'expected-close-date' => 'Beklenen Kapanış Tarihi',\n                'lead-value' => 'Potansiyel Değeri',\n                'sales-owner' => 'Satış Sahibi',\n                'source' => 'Kaynak',\n                'title' => 'Başlık',\n                'type' => 'Tür',\n                'pipeline' => 'Pipeline',\n                'stage' => 'Aşama',\n            ],\n\n            'persons' => [\n                'contact-numbers' => 'İletişim Numaraları',\n                'emails' => 'E-postalar',\n                'job-title' => 'Görev Unvanı',\n                'name' => 'Ad',\n                'organization' => 'Organizasyon',\n                'sales-owner' => 'Satış Sahibi',\n            ],\n\n            'organizations' => [\n                'address' => 'Adres',\n                'name' => 'Ad',\n                'sales-owner' => 'Satış Sahibi',\n            ],\n\n            'products' => [\n                'description' => 'Açıklama',\n                'name' => 'Ad',\n                'price' => 'Fiyat',\n                'quantity' => 'Miktar',\n                'sku' => 'SKU',\n            ],\n\n            'quotes' => [\n                'adjustment-amount' => 'Düzenleme Tutarı',\n                'billing-address' => 'Fatura Adresi',\n                'description' => 'Açıklama',\n                'discount-amount' => 'İndirim Tutarı',\n                'discount-percent' => 'İndirim Yüzdesi',\n                'expired-at' => 'Süresi Doldu',\n                'grand-total' => 'Genel Toplam',\n                'person' => 'Kişi',\n                'sales-owner' => 'Satış Sahibi',\n                'shipping-address' => 'Teslimat Adresi',\n                'sub-total' => 'Ara Toplam',\n                'subject' => 'Konu',\n                'tax-amount' => 'Vergi Tutarı',\n            ],\n\n            'warehouses' => [\n                'contact-address' => 'İletişim Adresi',\n                'contact-emails' => 'İletişim E-postaları',\n                'contact-name' => 'İletişim Adı',\n                'contact-numbers' => 'İletişim Numaraları',\n                'description' => 'Açıklama',\n                'name' => 'Ad',\n            ],\n        ],\n\n        'email' => [\n            'activity-created' => 'Etkinlik oluşturuldu',\n            'activity-modified' => 'Etkinlik değiştirildi',\n            'date' => 'Tarih',\n            'new-activity' => 'Yeni bir etkinliğiniz var, lütfen aşağıdaki detayları bulun',\n            'new-activity-modified' => 'Yeni bir etkinlik değiştirildi, lütfen aşağıdaki detayları bulun',\n            'participants' => 'Katılımcılar',\n            'title' => 'Başlık',\n            'type' => 'Tür',\n        ],\n\n        'lead' => [\n            'pipeline' => [\n                'default' => 'Varsayılan Pipeline',\n\n                'pipeline-stages' => [\n                    'follow-up' => 'Takip',\n                    'lost' => 'Kaybedildi',\n                    'negotiation' => 'Müzakere',\n                    'new' => 'Yeni',\n                    'prospect' => 'Potansiyel',\n                    'won' => 'Kazanıldı',\n                ],\n            ],\n\n            'source' => [\n                'direct' => 'Doğrudan',\n                'email' => 'E-posta',\n                'phone' => 'Telefon',\n                'web' => 'Web',\n                'web-form' => 'Web Formu',\n            ],\n\n            'type' => [\n                'existing-business' => 'Mevcut İş',\n                'new-business' => 'Yeni İş',\n            ],\n        ],\n\n        'user' => [\n            'role' => [\n                'administrator-role' => 'Yönetici Rolü',\n                'administrator' => 'Yönetici',\n            ],\n        ],\n\n        'workflow' => [\n            'email-to-participants-after-activity-updation' => 'Etkinlik güncellemesinden sonra katılımcılara e-postalar',\n            'email-to-participants-after-activity-creation' => 'Etkinlik oluşturulduktan sonra katılımcılara e-postalar',\n        ],\n    ],\n\n    'installer' => [\n        'index' => [\n            'create-administrator' => [\n                'admin' => 'Yönetici',\n                'krayin' => 'Krayin',\n                'confirm-password' => 'Şifreyi Onayla',\n                'email' => 'E-posta',\n                'email-address' => 'admin@ornek.com',\n                'password' => 'Şifre',\n                'title' => 'Yönetici Oluştur',\n            ],\n\n            'environment-configuration' => [\n                'algerian-dinar' => 'Cezayir Dinarı (DZD)',\n                'allowed-currencies' => 'İzin Verilen Para Birimleri',\n                'allowed-locales' => 'İzin Verilen Lokaller',\n                'application-name' => 'Uygulama Adı',\n                'argentine-peso' => 'Arjantin Pezosu (ARS)',\n                'australian-dollar' => 'Avustralya Doları (AUD)',\n                'krayin' => 'Krayin',\n                'bangladeshi-taka' => 'Bangladeş Takası (BDT)',\n                'brazilian-real' => 'Brezilya Reali (BRL)',\n                'british-pound-sterling' => 'İngiliz Sterlini (GBP)',\n                'canadian-dollar' => 'Kanada Doları (CAD)',\n                'cfa-franc-bceao' => 'CFA Frank BCEAO (XOF)',\n                'cfa-franc-beac' => 'CFA Frank BEAC (XAF)',\n                'chilean-peso' => 'Şili Pesosu (CLP)',\n                'chinese-yuan' => 'Çin Yuanı (CNY)',\n                'colombian-peso' => 'Kolombiya Pesosu (COP)',\n                'czech-koruna' => 'Çek Korunası (CZK)',\n                'danish-krone' => 'Danimarka Kronu (DKK)',\n                'database-connection' => 'Veritabanı Bağlantısı',\n                'database-hostname' => 'Veritabanı Sunucu Adı',\n                'database-name' => 'Veritabanı Adı',\n                'database-password' => 'Veritabanı Parolası',\n                'database-port' => 'Veritabanı Bağlantı Noktası',\n                'database-prefix' => 'Veritabanı Öneki',\n                'database-username' => 'Veritabanı Kullanıcı Adı',\n                'default-currency' => 'Varsayılan Para Birimi',\n                'default-locale' => 'Varsayılan Lokal',\n                'default-timezone' => 'Varsayılan Zaman Dilimi',\n                'default-url' => 'Varsayılan URL',\n                'default-url-link' => 'https://localhost',\n                'egyptian-pound' => 'Mısır Lirası (EGP)',\n                'euro' => 'Euro (EUR)',\n                'fijian-dollar' => 'Fiji Doları (FJD)',\n                'hong-kong-dollar' => 'Hong Kong Doları (HKD)',\n                'hungarian-forint' => 'Macar Forinti (HUF)',\n                'indian-rupee' => 'Hint Rupisi (INR)',\n                'indonesian-rupiah' => 'Endonezya Rupisi (IDR)',\n                'israeli-new-shekel' => 'İsrail Yeni Şekeli (ILS)',\n                'japanese-yen' => 'Japon Yeni (JPY)',\n                'jordanian-dinar' => 'Ürdün Dinarı (JOD)',\n                'kazakhstani-tenge' => 'Kazakistan Tengesi (KZT)',\n                'kuwaiti-dinar' => 'Kuveyt Dinarı (KWD)',\n                'lebanese-pound' => 'Lübnan Lirası (LBP)',\n                'libyan-dinar' => 'Libya Dinarı (LYD)',\n                'malaysian-ringgit' => 'Malezya Ringiti (MYR)',\n                'mauritian-rupee' => 'Mauritius Rupisi (MUR)',\n                'mexican-peso' => 'Meksika Pesosu (MXN)',\n                'moroccan-dirham' => 'Fas Dirhemi (MAD)',\n                'mysql' => 'MySQL',\n                'nepalese-rupee' => 'Nepal Rupisi (NPR)',\n                'new-taiwan-dollar' => 'Yeni Tayvan Doları (TWD)',\n                'new-zealand-dollar' => 'Yeni Zelanda Doları (NZD)',\n                'nigerian-naira' => 'Nijerya Nairası (NGN)',\n                'norwegian-krone' => 'Norveç Kronu (NOK)',\n                'omani-rial' => 'Umman Riyali (OMR)',\n                'pakistani-rupee' => 'Pakistan Rupisi (PKR)',\n                'panamanian-balboa' => 'Panama Balboası (PAB)',\n                'paraguayan-guarani' => 'Paraguay Guaranisi (PYG)',\n                'peruvian-nuevo-sol' => 'Peru Nuevo Solu (PEN)',\n                'pgsql' => 'PgSQL',\n                'philippine-peso' => 'Filipinler Pesosu (PHP)',\n                'polish-zloty' => 'Polonya Zlotisi (PLN)',\n                'qatari-rial' => 'Katar Riyali (QAR)',\n                'romanian-leu' => 'Romanya Leyi (RON)',\n                'russian-ruble' => 'Rus Rublesi (RUB)',\n                'saudi-riyal' => 'Suudi Riyali (SAR)',\n                'select-timezone' => 'Zaman Dilimi Seç',\n                'singapore-dollar' => 'Singapur Doları (SGD)',\n                'south-african-rand' => 'Güney Afrika Randı (ZAR)',\n                'south-korean-won' => 'Güney Kore Wonu (KRW)',\n                'sqlsrv' => 'SQLSRV',\n                'sri-lankan-rupee' => 'Sri Lanka Rupisi (LKR)',\n                'swedish-krona' => 'İsveç Kronu (SEK)',\n                'swiss-franc' => 'İsviçre Frangı (CHF)',\n                'thai-baht' => 'Tayland Bahtı (THB)',\n                'title' => 'Mağaza Yapılandırması',\n                'tunisian-dinar' => 'Tunus Dinarı (TND)',\n                'turkish-lira' => 'Türk Lirası (TRY)',\n                'ukrainian-hryvnia' => 'Ukrayna Grivnası (UAH)',\n                'united-arab-emirates-dirham' => 'Birleşik Arap Emirlikleri Dirhemi (AED)',\n                'united-states-dollar' => 'Amerikan Doları (USD)',\n                'uzbekistani-som' => 'Özbekistan Somu (UZS)',\n                'venezuelan-bolívar' => 'Venezuela Bolivarı (VEF)',\n                'vietnamese-dong' => 'Vietnam Dongu (VND)',\n                'warning-message' => 'Dikkat! Varsayılan sistem dili ve varsayılan para birimi ayarları kalıcıdır ve bir kez ayarlandığında değiştirilemez.',\n                'zambian-kwacha' => 'Zambiya Kvaçası (ZMW)',\n            ],\n\n            'installation-processing' => [\n                'krayin' => 'Krayin Kurulumu',\n                'krayin-info' => 'Veritabanı tabloları oluşturuluyor, bu birkaç dakika sürebilir',\n                'title' => 'Kurulum',\n            ],\n\n            'installation-completed' => [\n                'admin-panel' => 'Yönetici Paneli',\n                'krayin-forums' => 'Krayin Forumu',\n                'customer-panel' => 'Müşteri Paneli',\n                'explore-krayin-extensions' => 'Krayin Uzantılarını Keşfedin',\n                'title' => 'Kurulum Tamamlandı',\n                'title-info' => 'Krayin sisteminize başarıyla kuruldu.',\n            ],\n\n            'ready-for-installation' => [\n                'create-databsae-table' => 'Veritabanı tablosu oluştur',\n                'install' => 'Yükleme',\n                'install-info' => 'Kurulum için Krayin',\n                'install-info-button' => 'Aşağıdaki düğmeye tıklayın',\n                'populate-database-table' => 'Veritabanı tablolarını doldur',\n                'start-installation' => 'Kurulumu Başlat',\n                'title' => 'Kurulum için Hazır',\n            ],\n\n            'start' => [\n                'locale' => 'Yerel',\n                'main' => 'Başlangıç',\n                'select-locale' => 'Yerel Seçin',\n                'title' => 'Krayin kurulumunuz',\n                'welcome-title' => 'Krayin\\'ya hoş geldiniz',\n            ],\n\n            'server-requirements' => [\n                'calendar' => 'Takvim',\n                'ctype' => 'cType',\n                'curl' => 'cURL',\n                'dom' => 'dom',\n                'fileinfo' => 'Dosya Bilgisi',\n                'filter' => 'Filtre',\n                'gd' => 'GD',\n                'hash' => 'Hash',\n                'intl' => 'intl',\n                'json' => 'JSON',\n                'mbstring' => 'mbstring',\n                'openssl' => 'openssl',\n                'pcre' => 'pcre',\n                'pdo' => 'pdo',\n                'php' => 'PHP',\n                'php-version' => '8.1 veya üstü',\n                'session' => 'oturum',\n                'title' => 'Sunucu Gereksinimleri',\n                'tokenizer' => 'tokenizer',\n                'xml' => 'XML',\n            ],\n\n            'back' => 'Geri',\n            'krayin' => 'Krayin',\n            'krayin-info' => 'Webkul tarafından geliştirilen bir Topluluk Projesi',\n            'krayin-logo' => 'Krayin Logosu',\n            'continue' => 'Devam Et',\n            'installation-description' => 'Krayin kurulumu genellikle birkaç adım içerir. İşte Krayin\\'nun kurulum sürecine genel bir bakış',\n            'installation-info' => 'Sizi burada görmekten mutluluk duyuyoruz!',\n            'installation-title' => 'Kurulum\\'a Hoş Geldiniz',\n            'installation-wizard' => 'Kurulum Sihirbazı dili',\n            'title' => 'Krayin Kurulum Sihirbazı',\n            'webkul' => 'Webkul',\n        ],\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/lang/vi/app.php",
    "content": "<?php\n\nreturn [\n    'seeders' => [\n        'attributes' => [\n            'leads' => [\n                'description' => 'Mô tả',\n                'expected-close-date' => 'Ngày dự kiến đóng',\n                'lead-value' => 'Giá trị cơ hội',\n                'sales-owner' => 'Chủ sở hữu bán hàng',\n                'source' => 'Nguồn',\n                'title' => 'Tiêu đề',\n                'type' => 'Loại',\n                'pipeline' => 'Kênh bán hàng',\n                'stage' => 'Giai đoạn',\n            ],\n\n            'persons' => [\n                'contact-numbers' => 'Số điện thoại liên hệ',\n                'emails' => 'Email',\n                'job-title' => 'Chức vụ',\n                'name' => 'Tên',\n                'organization' => 'Tổ chức',\n                'sales-owner' => 'Chủ sở hữu bán hàng',\n            ],\n\n            'organizations' => [\n                'address' => 'Địa chỉ',\n                'name' => 'Tên',\n                'sales-owner' => 'Chủ sở hữu bán hàng',\n            ],\n\n            'products' => [\n                'description' => 'Mô tả',\n                'name' => 'Tên',\n                'price' => 'Giá',\n                'quantity' => 'Số lượng',\n                'sku' => 'SKU',\n            ],\n\n            'quotes' => [\n                'adjustment-amount' => 'Số tiền điều chỉnh',\n                'billing-address' => 'Địa chỉ thanh toán',\n                'description' => 'Mô tả',\n                'discount-amount' => 'Số tiền giảm giá',\n                'discount-percent' => 'Phần trăm giảm giá',\n                'expired-at' => 'Hết hạn vào',\n                'grand-total' => 'Tổng cộng',\n                'person' => 'Người',\n                'sales-owner' => 'Chủ sở hữu bán hàng',\n                'shipping-address' => 'Địa chỉ giao hàng',\n                'sub-total' => 'Tổng phụ',\n                'subject' => 'Chủ đề',\n                'tax-amount' => 'Số tiền thuế',\n            ],\n\n            'warehouses' => [\n                'contact-address' => 'Địa chỉ liên hệ',\n                'contact-emails' => 'Email liên hệ',\n                'contact-name' => 'Tên người liên hệ',\n                'contact-numbers' => 'Số điện thoại liên hệ',\n                'description' => 'Mô tả',\n                'name' => 'Tên',\n            ],\n        ],\n\n        'email' => [\n            'activity-created' => 'Hoạt động đã được tạo',\n            'activity-modified' => 'Hoạt động đã được chỉnh sửa',\n            'date' => 'Ngày',\n            'new-activity' => 'Bạn có một hoạt động mới, vui lòng xem chi tiết bên dưới',\n            'new-activity-modified' => 'Bạn có một hoạt động mới đã được chỉnh sửa, vui lòng xem chi tiết bên dưới',\n            'participants' => 'Người tham gia',\n            'title' => 'Tiêu đề',\n            'type' => 'Loại',\n        ],\n\n        'lead' => [\n            'pipeline' => [\n                'default' => 'Kênh bán hàng mặc định',\n\n                'pipeline-stages' => [\n                    'follow-up' => 'Theo dõi',\n                    'lost' => 'Mất',\n                    'negotiation' => 'Đàm phán',\n                    'new' => 'Mới',\n                    'prospect' => 'Triển vọng',\n                    'won' => 'Thắng',\n                ],\n            ],\n\n            'source' => [\n                'direct' => 'Trực tiếp',\n                'email' => 'Email',\n                'phone' => 'Điện thoại',\n                'web' => 'Web',\n                'web-form' => 'Mẫu web',\n            ],\n\n            'type' => [\n                'existing-business' => 'Kinh doanh hiện tại',\n                'new-business' => 'Kinh doanh mới',\n            ],\n        ],\n\n        'user' => [\n            'role' => [\n                'administrator-role' => 'Vai trò quản trị viên',\n                'administrator' => 'Quản trị viên',\n            ],\n        ],\n\n        'workflow' => [\n            'email-to-participants-after-activity-updation' => 'Email đến người tham gia sau khi cập nhật hoạt động',\n            'email-to-participants-after-activity-creation' => 'Email đến người tham gia sau khi tạo hoạt động',\n        ],\n    ],\n\n    'installer' => [\n        'index' => [\n            'create-administrator' => [\n                'admin' => 'Administrador',\n                'krayin' => 'Krayin',\n                'confirm-password' => 'Confirmar Senha',\n                'email' => 'Email',\n                'email-address' => 'admin@exemplo.com',\n                'password' => 'Senha',\n                'title' => 'Criar Administrador',\n            ],\n\n            'environment-configuration' => [\n                'algerian-dinar' => 'Dinar Argelino (DZD)',\n                'allowed-currencies' => 'Moedas Permitidas',\n                'allowed-locales' => 'Idiomas Permitidos',\n                'application-name' => 'Nome da Aplicação',\n                'argentine-peso' => 'Peso Argentino (ARS)',\n                'australian-dollar' => 'Dólar Australiano (AUD)',\n                'krayin' => 'Krayin',\n                'bangladeshi-taka' => 'Taka de Bangladesh (BDT)',\n                'brazilian-real' => 'Real Brasileiro (BRL)',\n                'british-pound-sterling' => 'Libra Esterlina (GBP)',\n                'canadian-dollar' => 'Dólar Canadense (CAD)',\n                'cfa-franc-bceao' => 'Franco CFA BCEAO (XOF)',\n                'cfa-franc-beac' => 'Franco CFA BEAC (XAF)',\n                'chilean-peso' => 'Peso Chileno (CLP)',\n                'chinese-yuan' => 'Yuan Chinês (CNY)',\n                'colombian-peso' => 'Peso Colombiano (COP)',\n                'czech-koruna' => 'Coroa Tcheca (CZK)',\n                'danish-krone' => 'Coroa Dinamarquesa (DKK)',\n                'database-connection' => 'Conexão com o Banco de Dados',\n                'database-hostname' => 'Hostname do Banco de Dados',\n                'database-name' => 'Nome do Banco de Dados',\n                'database-password' => 'Senha do Banco de Dados',\n                'database-port' => 'Porta do Banco de Dados',\n                'database-prefix' => 'Prefixo do Banco de Dados',\n                'database-username' => 'Usuário do Banco de Dados',\n                'default-currency' => 'Moeda Padrão',\n                'default-locale' => 'Idioma Padrão',\n                'default-timezone' => 'Fuso Horário Padrão',\n                'default-url' => 'URL Padrão',\n                'default-url-link' => 'https://localhost',\n                'egyptian-pound' => 'Libra Egípcia (EGP)',\n                'euro' => 'Euro (EUR)',\n                'fijian-dollar' => 'Dólar de Fiji (FJD)',\n                'hong-kong-dollar' => 'Dólar de Hong Kong (HKD)',\n                'hungarian-forint' => 'Forint Húngaro (HUF)',\n                'indian-rupee' => 'Rúpia Indiana (INR)',\n                'indonesian-rupiah' => 'Rupia Indonésia (IDR)',\n                'israeli-new-shekel' => 'Novo Shekel Israelense (ILS)',\n                'japanese-yen' => 'Iene Japonês (JPY)',\n                'jordanian-dinar' => 'Dinar Jordaniano (JOD)',\n                'kazakhstani-tenge' => 'Tenge Cazaque (KZT)',\n                'kuwaiti-dinar' => 'Dinar Kuwaitiano (KWD)',\n                'lebanese-pound' => 'Libra Libanesa (LBP)',\n                'libyan-dinar' => 'Dinar Líbio (LYD)',\n                'malaysian-ringgit' => 'Ringgit Malaio (MYR)',\n                'mauritian-rupee' => 'Rúpia Mauriciana (MUR)',\n                'mexican-peso' => 'Peso Mexicano (MXN)',\n                'moroccan-dirham' => 'Dirham Marroquino (MAD)',\n                'mysql' => 'Mysql',\n                'nepalese-rupee' => 'Rúpia Nepalesa (NPR)',\n                'new-taiwan-dollar' => 'Novo Dólar Taiwanês (TWD)',\n                'new-zealand-dollar' => 'Dólar Neozelandês (NZD)',\n                'nigerian-naira' => 'Naira Nigeriana (NGN)',\n                'norwegian-krone' => 'Coroa Norueguesa (NOK)',\n                'omani-rial' => 'Rial Omanense (OMR)',\n                'pakistani-rupee' => 'Rúpia Paquistanesa (PKR)',\n                'panamanian-balboa' => 'Balboa Panamenho (PAB)',\n                'paraguayan-guarani' => 'Guarani Paraguaio (PYG)',\n                'peruvian-nuevo-sol' => 'Novo Sol Peruano (PEN)',\n                'pgsql' => 'pgSQL',\n                'philippine-peso' => 'Peso Filipino (PHP)',\n                'polish-zloty' => 'Zloty Polonês (PLN)',\n                'qatari-rial' => 'Rial Catariano (QAR)',\n                'romanian-leu' => 'Leu Romeno (RON)',\n                'russian-ruble' => 'Rublo Russo (RUB)',\n                'saudi-riyal' => 'Riyal Saudita (SAR)',\n                'select-timezone' => 'Selecionar Fuso Horário',\n                'singapore-dollar' => 'Dólar de Singapura (SGD)',\n                'south-african-rand' => 'Rand Sul-Africano (ZAR)',\n                'south-korean-won' => 'Won Sul-Coreano (KRW)',\n                'sqlsrv' => 'SQLSRV',\n                'sri-lankan-rupee' => 'Rúpia do Sri Lanka (LKR)',\n                'swedish-krona' => 'Coroa Sueca (SEK)',\n                'swiss-franc' => 'Franco Suíço (CHF)',\n                'thai-baht' => 'Baht Tailandês (THB)',\n                'title' => 'Configuração da Loja',\n                'tunisian-dinar' => 'Dinar Tunisiano (TND)',\n                'turkish-lira' => 'Lira Turca (TRY)',\n                'ukrainian-hryvnia' => 'Hryvnia Ucraniana (UAH)',\n                'united-arab-emirates-dirham' => 'Dirham dos Emirados Árabes Unidos (AED)',\n                'united-states-dollar' => 'Dólar dos Estados Unidos (USD)',\n                'uzbekistani-som' => 'Som Uzbeque (UZS)',\n                'venezuelan-bolívar' => 'Bolívar Venezuelano (VEF)',\n                'vietnamese-dong' => 'Dong Vietnamita (VND)',\n                'warning-message' => 'Atenção! As configurações de idioma padrão e moeda padrão são permanentes e não podem ser alteradas após definidas.',\n                'zambian-kwacha' => 'Kwacha Zambiano (ZMW)',\n            ],\n\n            'installation-processing' => [\n                'krayin' => 'Instalação do Krayin',\n                'krayin-info' => 'Criando as tabelas do banco de dados, isso pode levar alguns momentos',\n                'title' => 'Instalação',\n            ],\n\n            'installation-completed' => [\n                'admin-panel' => 'Painel de Administração',\n                'krayin-forums' => 'Fórum do Krayin',\n                'customer-panel' => 'Painel do Cliente',\n                'explore-krayin-extensions' => 'Explorar Extensões do Krayin',\n                'title' => 'Instalação Concluída',\n                'title-info' => 'O Krayin foi instalado com sucesso no seu sistema.',\n            ],\n\n            'ready-for-installation' => [\n                'create-databsae-table' => 'Criar as tabelas do banco de dados',\n                'install' => 'Instalar',\n                'install-info' => 'Krayin para Instalação',\n                'install-info-button' => 'Clique no botão abaixo para',\n                'populate-database-table' => 'Preencher as tabelas do banco de dados',\n                'start-installation' => 'Iniciar Instalação',\n                'title' => 'Pronto para Instalação',\n            ],\n\n            'start' => [\n                'locale' => 'Localidade',\n                'main' => 'Início',\n                'select-locale' => 'Selecionar Localidade',\n                'title' => 'Instalação do Krayin',\n                'welcome-title' => 'Bem-vindo ao Krayin',\n            ],\n\n            'server-requirements' => [\n                'calendar' => 'Calendário',\n                'ctype' => 'cType',\n                'curl' => 'cURL',\n                'dom' => 'DOM',\n                'fileinfo' => 'fileInfo',\n                'filter' => 'Filtro',\n                'gd' => 'GD',\n                'hash' => 'Hash',\n                'intl' => 'Intl',\n                'json' => 'JSON',\n                'mbstring' => 'mbstring',\n                'openssl' => 'openssl',\n                'pcre' => 'pcre',\n                'pdo' => 'pdo',\n                'php' => 'PHP',\n                'php-version' => '8.1 ou superior',\n                'session' => 'Sessão',\n                'title' => 'Requisitos do Sistema',\n                'tokenizer' => 'Tokenizador',\n                'xml' => 'XML',\n            ],\n\n            'back' => 'Voltar',\n            'krayin' => 'Krayin',\n            'krayin-info' => 'um Projeto Comunitário por',\n            'krayin-logo' => 'Logotipo Krayin',\n            'continue' => 'Continuar',\n            'installation-description' => 'A instalação do Krayin geralmente envolve várias etapas. Aqui está um resumo do processo de instalação do Krayin.',\n            'installation-info' => 'Estamos felizes em vê-lo aqui!',\n            'installation-title' => 'Bem-vindo à Instalação',\n            'installation-wizard' => 'Assistente de Instalação - Idioma',\n            'title' => 'Instalador do Krayin',\n            'webkul' => 'Webkul',\n        ],\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/views/components/button/index.blade.php",
    "content": "<v-button {{ $attributes }}></v-button>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-button-template\"\n    >\n        <button\n            v-if=\"! loading\"\n            :class=\"[buttonClass, '']\"\n        >\n            @{{ title }}\n        </button>\n\n        <button\n            v-else\n            :class=\"[buttonClass, '']\"\n        >\n            <!-- Spinner -->\n            <svg\n                class=\"absolute h-5 w-5 animate-spin\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n                fill=\"none\" \n                aria-hidden=\"true\"\n                viewBox=\"0 0 24 24\"\n            >\n                <circle\n                    class=\"opacity-25\"\n                    cx=\"12\"\n                    cy=\"12\"\n                    r=\"10\"\n                    stroke=\"currentColor\"\n                    stroke-width=\"4\"\n                >\n                </circle>\n\n                <path\n                    class=\"opacity-75\"\n                    fill=\"currentColor\"\n                    d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n                >\n                </path>\n            </svg>\n\n            <span class=\"realative h-full w-full opacity-0\">\n                @{{ title }}\n            </span>\n        </button>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-button', {\n            template: '#v-button-template',\n\n            props: {\n                loading: Boolean,\n                buttonType: String,\n                title: String,\n                buttonClass: String,\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/views/components/form/control-group/control.blade.php",
    "content": "@props([\n    'type' => 'text',\n    'name' => '',\n])\n\n@switch($type)\n    @case('hidden')\n    @case('text')\n    @case('email')\n    @case('password')\n    @case('number')\n        <v-field\n            name=\"{{ $name }}\"\n            v-slot=\"{ field }\"\n            {{ $attributes->only(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}\n        >\n            <input\n                type=\"{{ $type }}\"\n                name=\"{{ $name }}\"\n                v-bind=\"field\"\n                :class=\"[errors['{{ $name }}'] ? 'border border-red-600 hover:border-red-600' : '']\"\n                {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full appearance-none rounded-md border px-3 py-2 text-sm text-gray-600 transition-all hover:border-gray-400']) }}\n            >\n        </v-field>\n\n        @break\n\n    @case('select')\n        <v-field\n            name=\"{{ $name }}\"\n            v-slot=\"{ field }\"\n            {{ $attributes->only(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}\n        >\n            <select\n                name=\"{{ $name }}\"\n                v-bind=\"field\"\n                :class=\"[errors['{{ $name }}'] ? 'border border-red-500' : '']\"\n                {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'custom-select w-full rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400']) }}\n            >\n                {{ $slot }}\n            </select>\n        </v-field>\n\n        @break\n\n    @case('checkbox')\n        <v-field\n            v-slot=\"{ field }\"\n            name=\"{{ $name }}\"\n            type=\"checkbox\"\n            class=\"hidden\"\n            {{ $attributes->only(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}\n        >\n            <input\n                type=\"checkbox\"\n                name=\"{{ $name }}\"\n                v-bind=\"field\"\n                class=\"peer sr-only\"\n                {{ $attributes->except(['rules', 'label', ':label']) }}\n            />\n        </v-field>\n\n        <label\n            class=\"icon-checkbox-normal peer-checked:icon-checkbox-active cursor-pointer text-2xl peer-checked:text-blue-600\"\n            {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}\n        >\n        </label>\n\n        @break\n@endswitch"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/views/components/form/control-group/error.blade.php",
    "content": "@props(['controlName' => ''])\n\n@if (! empty($controlName))\n    <v-error-message\n        name=\"{{ $controlName }}\"\n        {{ $attributes }}\n        v-slot=\"{ message }\"\n    >\n        <p {{ $attributes->merge(['class' => 'mt-1 text-red-600 text-xs italic']) }}>\n            @{{ message }}\n        </p>\n    </v-error-message>\n@endif\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/views/components/form/control-group/index.blade.php",
    "content": "<div {{ $attributes->merge(['class' => 'mb-2.5']) }}>\n    {{ $slot }}\n</div>\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/views/components/form/control-group/label.blade.php",
    "content": "<label {{ $attributes->merge(['class' => 'block text-4 font-medium leading-6 text-gray-800']) }}>\n    {{ $slot }}\n</label>\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/views/components/form/index.blade.php",
    "content": "<!--\n    If a component has the `as` attribute, it indicates that it uses\n    the ajaxified form or some customized slot form.\n-->\n@if ($attributes->has('as'))\n    <v-form {{ $attributes }}>\n        {{ $slot }}\n    </v-form>\n\n<!--\n    Otherwise, a traditional form will be provided with a minimal\n    set of configurations.\n-->\n@else\n    @props(['method' => 'POST'])\n\n    @php $method = strtoupper($method); @endphp\n\n    <v-form\n        method=\"{{ $method === 'GET' ? 'GET' : 'POST' }}\"\n        v-slot=\"{ meta, errors, setValues }\"\n        {{ $attributes }}\n    >\n        @unless(in_array($method, ['HEAD', 'GET', 'OPTIONS']))\n            @csrf\n        @endunless\n\n        @if (! in_array($method, ['GET', 'POST']))\n            @method($method)\n        @endif\n\n        {{ $slot }}\n    </v-form>\n@endif"
  },
  {
    "path": "packages/Webkul/Installer/src/Resources/views/installer/index.blade.php",
    "content": "<!DOCTYPE html>\n<html\n    lang=\"{{ app()->getLocale() }}\"\n    dir=\"{{ in_array(app()->getLocale(), ['ar', 'fa', 'he']) ? 'rtl' : 'ltr' }}\"\n>\n    <head>\n        <title>@lang('installer::app.installer.index.title')</title>\n\n        <meta charset=\"UTF-8\">\n        <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n        <meta name=\"base-url\" content=\"{{ url()->to('/') }}\">\n\n        @stack('meta')\n\n        {{\n            vite()->set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'], 'installer')\n        }}\n\n        <link\n            href=\"https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700;800&display=swap\"\n            rel=\"stylesheet\"\n        />\n\n        <link\n            href=\"https://fonts.googleapis.com/css2?family=DM+Serif+Display&display=swap\"\n            rel=\"stylesheet\"\n        />\n\n        <link\n            type=\"image/x-icon\"\n            href=\"{{ vite()->asset('images/favicon.ico', 'installer') }}\"\n            rel=\"shortcut icon\"\n            sizes=\"16x16\"\n        />\n\n        @stack('styles')\n    </head>\n\n    @php\n        $locales = config('app.available_locales');\n\n        $currencies = [\n            'AED' => 'united-arab-emirates-dirham',\n            'ARS' => 'argentine-peso',\n            'AUD' => 'australian-dollar',\n            'BDT' => 'bangladeshi-taka',\n            'BRL' => 'brazilian-real',\n            'CAD' => 'canadian-dollar',\n            'CHF' => 'swiss-franc',\n            'CLP' => 'chilean-peso',\n            'CNY' => 'chinese-yuan',\n            'COP' => 'colombian-peso',\n            'CZK' => 'czech-koruna',\n            'DKK' => 'danish-krone',\n            'DZD' => 'algerian-dinar',\n            'EGP' => 'egyptian-pound',\n            'EUR' => 'euro',\n            'FJD' => 'fijian-dollar',\n            'GBP' => 'british-pound-sterling',\n            'HKD' => 'hong-kong-dollar',\n            'HUF' => 'hungarian-forint',\n            'IDR' => 'indonesian-rupiah',\n            'ILS' => 'israeli-new-shekel',\n            'INR' => 'indian-rupee',\n            'JOD' => 'jordanian-dinar',\n            'JPY' => 'japanese-yen',\n            'KRW' => 'south-korean-won',\n            'KWD' => 'kuwaiti-dinar',\n            'KZT' => 'kazakhstani-tenge',\n            'LBP' => 'lebanese-pound',\n            'LKR' => 'sri-lankan-rupee',\n            'LYD' => 'libyan-dinar',\n            'MAD' => 'moroccan-dirham',\n            'MUR' => 'mauritian-rupee',\n            'MXN' => 'mexican-peso',\n            'MYR' => 'malaysian-ringgit',\n            'NGN' => 'nigerian-naira',\n            'NOK' => 'norwegian-krone',\n            'NPR' => 'nepalese-rupee',\n            'NZD' => 'new-zealand-dollar',\n            'OMR' => 'omani-rial',\n            'PAB' => 'panamanian-balboa',\n            'PEN' => 'peruvian-nuevo-sol',\n            'PHP' => 'philippine-peso',\n            'PKR' => 'pakistani-rupee',\n            'PLN' => 'polish-zloty',\n            'PYG' => 'paraguayan-guarani',\n            'QAR' => 'qatari-rial',\n            'RON' => 'romanian-leu',\n            'RUB' => 'russian-ruble',\n            'SAR' => 'saudi-riyal',\n            'SEK' => 'swedish-krona',\n            'SGD' => 'singapore-dollar',\n            'THB' => 'thai-baht',\n            'TND' => 'tunisian-dinar',\n            'TRY' => 'turkish-lira',\n            'TWD' => 'new-taiwan-dollar',\n            'UAH' => 'ukrainian-hryvnia',\n            'USD' => 'united-states-dollar',\n            'UZS' => 'uzbekistani-som',\n            'VEF' => 'venezuelan-bolívar',\n            'VND' => 'vietnamese-dong',\n            'XAF' => 'cfa-franc-beac',\n            'XOF' => 'cfa-franc-bceao',\n            'ZAR' => 'south-african-rand',\n            'ZMW' => 'zambian-kwacha'\n        ];\n    @endphp\n\n    <body class=\"h-full font-inter dark:bg-gray-950\">\n        <div\n            id=\"app\"\n            class=\"fixed w-full\"\n        >\n            <div class=\"flex [&amp;>*]:w-[50%] gap-12 justify-center items-center\">\n                <!-- Vue Component -->\n                <v-server-requirements></v-server-requirements>\n            </div>\n        </div>\n\n        @pushOnce('scripts')\n            <script\n                type=\"text/x-template\"\n                id=\"v-server-requirements-template\"\n            >\n                <!-- Left Side Welcome to Installation -->\n                <div class=\"flex flex-col justify-center\">\n                    <div class=\"m-auto grid h-[100vh] max-w-[362px] items-end\">\n                        <div class=\"grid gap-4\">\n                            <img\n                                src=\"{{ vite()->asset('images/krayin-logo.svg', 'installer') }}\"\n                                alt=\"@lang('installer::app.installer.index.krayin-logo')\"\n                            >\n\n                            <div class=\"grid gap-1.5\">\n                                <p class=\"text-xl font-bold text-gray-800\">\n                                    @lang('installer::app.installer.index.installation-title')\n                                </p>\n\n                                <p class=\"text-sm text-gray-600\">\n                                    @lang('installer::app.installer.index.installation-info')\n                                </p>\n                            </div>\n\n                            <div class=\"[&>*]:flex [&>*]:items-center [&>*]:gap-1 grid gap-3 text-sm text-gray-600\">\n                                <!-- Start -->\n                                <div :class=\"[stepStates.start == 'active' ? 'font-bold' : '']\">\n                                    <template v-if=\"stepStates.start !== 'complete'\">\n                                        <span\n                                            class=\"text-xl\"\n                                            :class=\"stepStates.start === 'pending' ? 'icon-checkbox-outline' : 'icon-right-arrow'\"\n                                        >\n                                        </span>\n                                    </template>\n\n                                    <template v-else>\n                                        <span class=\"icon-tick text-green-500\"></span>\n                                    </template>\n\n                                    <p>@lang('installer::app.installer.index.start.main')</p>\n                                </div>\n\n                                <!-- Server Environment -->\n                                <div\n                                    class=\"flex items-center\"\n                                    :class=\"[stepStates.systemRequirements == 'active' ? 'font-bold' : '']\"\n                                >\n                                    <template v-if=\"stepStates.systemRequirements !== 'complete'\">\n                                        <span\n                                            class=\"text-xl\"\n                                            :class=\"stepStates.systemRequirements === 'pending' ? 'icon-checkbox-outline' : 'icon-right-arrow'\"\n                                        >\n                                        </span>\n                                    </template>\n\n                                    <template v-else>\n                                        <span class=\"icon-tick text-green-500\"></span>\n                                    </template>\n\n                                    <p>@lang('installer::app.installer.index.server-requirements.title')</p>\n                                </div>\n\n                                <!-- ENV Database Configuration -->\n                                <div :class=\"[stepStates.envDatabase == 'active' ? 'font-bold' : '']\">\n                                    <template v-if=\"stepStates.envDatabase !== 'complete'\">\n                                        <span\n                                            class=\"text-xl\"\n                                            :class=\"stepStates.envDatabase === 'pending' ? 'icon-checkbox-outline' : 'icon-right-arrow'\"\n                                        >\n                                        </span>\n                                    </template>\n\n                                    <template v-else>\n                                        <span class=\"icon-tick text-green-500\"></span>\n                                    </template>\n\n                                    <p>\n                                        @lang('installer::app.installer.index.environment-configuration.title')\n                                    </p>\n                                </div>\n\n                                <!-- Ready For Installation -->\n                                <div :class=\"[stepStates.readyForInstallation == 'active' ? 'font-bold' : '']\">\n                                    <template v-if=\"stepStates.readyForInstallation !== 'complete'\">\n                                        <span\n                                            class=\"text-xl\"\n                                            :class=\"stepStates.readyForInstallation === 'pending' ? 'icon-checkbox-outline' : 'icon-right-arrow'\"\n                                        >\n                                        </span>\n                                    </template>\n\n                                    <template v-else>\n                                        <span class=\"icon-tick text-green-500\"></span>\n                                    </template>\n\n                                    <p>@lang('installer::app.installer.index.ready-for-installation.title')</p>\n                                </div>\n\n                                <!-- Create Admin Configuration -->\n                                <div :class=\"[stepStates.createAdmin == 'active' ? 'font-bold' : '']\">\n                                    <template v-if=\"stepStates.createAdmin !== 'complete'\">\n                                        <span\n                                            class=\"text-xl\"\n                                            :class=\"stepStates.createAdmin === 'pending' ? 'icon-checkbox-outline' : 'icon-right-arrow'\"\n                                        >\n                                        </span>\n                                    </template>\n\n                                    <template v-else>\n                                        <span class=\"icon-tick text-green-500\"></span>\n                                    </template>\n\n                                    <p>@lang('installer::app.installer.index.create-administrator.title')</p>\n                                </div>\n\n                                <!-- Installation Completed -->\n                                <div :class=\"[stepStates.installationCompleted == 'active' ? 'font-bold' : '']\">\n                                    <template v-if=\"stepStates.installationCompleted !== 'complete'\">\n                                        <span\n                                            class=\"text-xl\"\n                                            :class=\"stepStates.installationCompleted === 'pending' ? 'icon-checkbox-outline' : 'icon-right-arrow'\"\n                                        >\n                                        </span>\n                                    </template>\n\n                                    <template v-else>\n                                        <span class=\"icon-tick text-green-500\"></span>\n                                    </template>\n\n                                    <p>@lang('installer::app.installer.index.installation-completed.title')</p>\n                                </div>\n                            </div>\n                        </div>\n\n                        <p class=\"mb-6 w-full place-self-end text-left\">\n                            <a\n                                class=\"bg-white text-brandColor underline\"\n                                href=\"https://krayincrm.com/\"\n                                target=\"_blank\"\n                            >\n                                @lang('installer::app.installer.index.krayin')\n                            </a>\n\n                            <span>@lang('installer::app.installer.index.krayin-info')</span>\n\n                            <a\n                                class=\"bg-white text-brandColor underline\"\n                                href=\"https://webkul.com/\"\n                                target=\"_blank\"\n                            >\n                                @lang('installer::app.installer.index.webkul')\n                            </a>\n                        </p>\n                    </div>\n                </div>\n\n                <!-- Right Side Components -->\n                <!-- Start -->\n                <div\n                    class=\"w-full max-w-[568px] rounded-lg border-[1px] border-gray-300 bg-white\"\n                    v-if=\"currentStep == 'start'\"\n                >\n                    <x-installer::form\n                        v-slot=\"{ meta, errors, handleSubmit }\"\n                        as=\"div\"\n                        ref=\"start\"\n                    >\n                        <form\n                            @submit.prevent=\"handleSubmit($event, setLocale)\"\n                            enctype=\"multipart/form-data\"\n                            ref=\"multiLocaleForm\"\n                        >\n                            <div class=\"border-b border-gray-300 px-4 py-3\">\n                                <p class=\"text-xl font-bold text-gray-800\">\n                                    @lang('installer::app.installer.index.start.welcome-title')\n                                </p>\n                            </div>\n\n                            <div class=\"flex h-[388px] flex-col items-center gap-3 overflow-y-auto px-7 py-4\">\n                                <div class=\"container overflow-hidden\">\n                                    <div class=\"flex h-[100px] flex-col justify-end gap-3\">\n                                        <p class=\"text-center text-sm text-gray-600\">\n                                            @lang('installer::app.installer.index.installation-description')\n                                        </p>\n                                    </div>\n\n                                    <div class=\"flex h-72 flex-col justify-center gap-3 overflow-y-auto px-7 py-4\">\n                                        <!-- Installation Wizard -->\n                                        <x-installer::form.control-group class=\"mb-2.5\">\n                                            <x-installer::form.control-group.label>\n                                                @lang('installer::app.installer.index.installation-wizard')\n                                            </x-installer::form.control-group.label>\n\n                                            <x-installer::form.control-group.control\n                                                type=\"select\"\n                                                name=\"locale\"\n                                                rules=\"required\"\n                                                :value=\"app()->getLocale()\"\n                                                :label=\"trans('installer::app.installer.index.start.locale')\"\n                                                @change=\"$refs.multiLocaleForm.submit();\"\n                                            >\n                                                <option\n                                                    value=\"\"\n                                                    disabled\n                                                >\n                                                    @lang('installer::app.installer.index.start.select-locale')\n                                                </option>\n\n                                                @foreach ($locales as $value => $label)\n                                                    <option value=\"{{ $value }}\">\n                                                        {{ ucfirst($label) }}\n                                                    </option>\n                                                @endforeach\n                                            </x-installer::form.control-group.control>\n\n                                            <x-installer::form.control-group.error control-name=\"locale\" />\n                                        </x-installer::form.control-group>\n                                    </div>\n                                </div>\n                            </div>\n\n                            <div class=\"flex items-center justify-end px-4 py-3\">\n                                <button\n                                    type=\"button\"\n                                    class=\"primary-button\"\n                                    tabindex=\"0\"\n                                    @click=\"nextForm\"\n                                >\n                                    @lang('installer::app.installer.index.continue')\n                                </button>\n                            </div>\n                        </form>\n                    </x-installer::form>\n                </div>\n\n                <!-- Systme Requirements -->\n                <div\n                    class=\"w-full max-w-[568px] rounded-lg border border-gray-300 bg-white\"\n                    v-if=\"currentStep == 'systemRequirements'\"\n                >\n                    <div class=\"flex items-center justify-between gap-2.5 border-b border-gray-300 px-4 py-3\">\n                        <p class=\"text-xl font-bold text-gray-800\">\n                            @lang('installer::app.installer.index.server-requirements.title')\n                        </p>\n                    </div>\n\n                    <div class=\"flex h-[486px] flex-col gap-4 overflow-y-auto border-b border-gray-300 px-7 py-4\">\n                        <div class=\"flex items-center gap-1\">\n                            <span class=\"{{ $phpVersion['supported'] ? 'icon-tick text-xl text-green-500' : '' }}\"></span>\n\n                            <p class=\"text-sm font-semibold text-gray-600\">\n                                @lang('installer::app.installer.index.server-requirements.php') <span class=\"font-normal\">(@lang('installer::app.installer.index.server-requirements.php-version'))</span>\n                            </p>\n                        </div>\n\n                        @foreach ($requirements['requirements'] as $requirement)\n                            @foreach ($requirement as $key => $item)\n                                <div class=\"flex items-center gap-1\">\n                                    <span class=\"{{ $item ? 'icon-tick text-green-500' : 'icon-cross-large text-red-500' }} text-xl\"></span>\n\n                                    <p class=\"text-sm font-semibold text-gray-600\">\n                                        @lang('installer::app.installer.index.server-requirements.' . $key)\n                                    </p>\n                                </div>\n                            @endforeach\n                        @endforeach\n                    </div>\n\n                    @php\n                        $hasRequirement = false;\n\n                        foreach ($requirements['requirements']['php'] as $value) {\n                            if (!$value) {\n                                $hasRequirement = true;\n                                break;\n                            }\n                        }\n                    @endphp\n\n                    <div class=\"flex items-center justify-between px-4 py-2.5\">\n                        <div\n                            class=\"cursor-pointer text-base font-semibold text-brandColor\"\n                            role=\"button\"\n                            aria-label=\"@lang('installer::app.installer.index.back')\"\n                            tabindex=\"0\"\n                            @click=\"back\"\n                        >\n                            @lang('installer::app.installer.index.back')\n                        </div>\n\n                        <div\n                            class=\"{{ $hasRequirement ? 'opacity-50 cursor-not-allowed' : ''}} px-3 py-1.5 bg-brandColor border border-brandColor rounded-md text-gray-50 font-semibold cursor-pointer {{ $hasRequirement ?: 'hover:opacity-90' }}\"\n                            @click=\"nextForm\"\n                            tabindex=\"0\"\n                        >\n                            @lang('installer::app.installer.index.continue')\n                        </div>\n                    </div>\n                </div>\n\n                <!-- Environment Configuration Database -->\n                <div\n                    class=\"w-full max-w-[568px] rounded-lg border-[1px] border-gray-300 bg-white\"\n                    v-if=\"currentStep == 'envDatabase'\"\n                >\n                    <x-installer::form\n                        v-slot=\"{ meta, errors, handleSubmit }\"\n                        as=\"div\"\n                        ref=\"envDatabase\"\n                    >\n                        <form\n                            @submit.prevent=\"handleSubmit($event, FormSubmit)\"\n                            enctype=\"multipart/form-data\"\n                        >\n                            <div class=\"flex items-center justify-between gap-2.5 border-b border-gray-300 px-4 py-3\">\n                                <p class=\"text-xl font-bold text-gray-800\">\n                                    @lang('installer::app.installer.index.environment-configuration.title')\n                                </p>\n                            </div>\n\n                            <div class=\"flex h-[484px] flex-col gap-3 overflow-y-auto border-b border-gray-300 px-7 py-4\">\n                                <!-- Database Connection-->\n                                <x-installer::form.control-group class=\"mb-2.5\">\n                                    <x-installer::form.control-group.label class=\"required\">\n                                        @lang('installer::app.installer.index.environment-configuration.database-connection')\n                                    </x-installer::form.control-group.label>\n\n                                    <x-installer::form.control-group.control\n                                        type=\"select\"\n                                        name=\"db_connection\"\n                                        ::value=\"envData.db_connection ?? 'mysql'\"\n                                        rules=\"required\"\n                                        :label=\"trans('installer::app.installer.index.environment-configuration.database-connection')\"\n                                        :placeholder=\"trans('installer::app.installer.index.environment-configuration.database-connection')\"\n                                    >\n                                        <option\n                                            value=\"mysql\"\n                                            selected\n                                        >\n                                            @lang('installer::app.installer.index.environment-configuration.mysql')\n                                        </option>\n                                    </x-installer::form.control-group.control>\n\n                                    <x-installer::form.control-group.error control-name=\"db_connection\" />\n                                </x-installer::form.control-group>\n\n                                <!-- Database Hostname-->\n                                <x-installer::form.control-group class=\"mb-2.5\">\n                                    <x-installer::form.control-group.label class=\"required\">\n                                        @lang('installer::app.installer.index.environment-configuration.database-hostname')\n                                    </x-installer::form.control-group.label>\n\n                                    <x-installer::form.control-group.control\n                                        type=\"text\"\n                                        name=\"db_hostname\"\n                                        ::value=\"envData.db_hostname ?? '127.0.0.1'\"\n                                        rules=\"required\"\n                                        :label=\"trans('installer::app.installer.index.environment-configuration.database-hostname')\"\n                                        :placeholder=\"trans('installer::app.installer.index.environment-configuration.database-hostname')\"\n                                    />\n\n                                    <x-installer::form.control-group.error control-name=\"db_hostname\" />\n                                </x-installer::form.control-group>\n\n                                <!-- Database Port-->\n                                <x-installer::form.control-group class=\"mb-2.5\">\n                                    <x-installer::form.control-group.label class=\"required\">\n                                        @lang('installer::app.installer.index.environment-configuration.database-port')\n                                    </x-installer::form.control-group.label>\n\n                                    <x-installer::form.control-group.control\n                                        type=\"text\"\n                                        name=\"db_port\"\n                                        ::value=\"envData.db_port ?? '3306'\"\n                                        rules=\"required\"\n                                        :label=\"trans('installer::app.installer.index.environment-configuration.database-port')\"\n                                        :placeholder=\"trans('installer::app.installer.index.environment-configuration.database-port')\"\n                                    />\n\n                                    <x-installer::form.control-group.error control-name=\"db_port\" />\n                                </x-installer::form.control-group>\n\n                                <!-- Database name-->\n                                <x-installer::form.control-group class=\"mb-2.5\">\n                                    <x-installer::form.control-group.label class=\"required\">\n                                        @lang('installer::app.installer.index.environment-configuration.database-name')\n                                    </x-installer::form.control-group.label>\n\n                                    <x-installer::form.control-group.control\n                                        type=\"text\"\n                                        name=\"db_name\"\n                                        ::value=\"envData.db_name\"\n                                        rules=\"required\"\n                                        :label=\"trans('installer::app.installer.index.environment-configuration.database-name')\"\n                                        :placeholder=\"trans('installer::app.installer.index.environment-configuration.database-name')\"\n                                    />\n\n                                    <x-installer::form.control-group.error control-name=\"db_name\" />\n                                </x-installer::form.control-group>\n\n                                <!-- Database Prefix-->\n                                <x-installer::form.control-group class=\"mb-2.5\">\n                                    <x-installer::form.control-group.label>\n                                        @lang('installer::app.installer.index.environment-configuration.database-prefix')\n                                    </x-installer::form.control-group.label>\n\n                                    <x-installer::form.control-group.control\n                                        type=\"text\"\n                                        name=\"db_prefix\"\n                                        ::value=\"envData.db_prefix\"\n                                        :label=\"trans('installer::app.installer.index.environment-configuration.database-prefix')\"\n                                        :placeholder=\"trans('installer::app.installer.index.environment-configuration.database-prefix')\"\n                                    />\n\n                                    <x-installer::form.control-group.error control-name=\"db_prefix\" />\n                                </x-installer::form.control-group>\n\n                                <!-- Database Username-->\n                                <x-installer::form.control-group class=\"mb-2.5\">\n                                    <x-installer::form.control-group.label class=\"required\">\n                                        @lang('installer::app.installer.index.environment-configuration.database-username')\n                                    </x-installer::form.control-group.label>\n\n                                    <x-installer::form.control-group.control\n                                        type=\"text\"\n                                        name=\"db_username\"\n                                        ::value=\"envData.db_username\"\n                                        rules=\"required\"\n                                        :label=\"trans('installer::app.installer.index.environment-configuration.database-username')\"\n                                        :placeholder=\"trans('installer::app.installer.index.environment-configuration.database-username')\"\n                                    />\n\n                                    <x-installer::form.control-group.error control-name=\"db_username\" />\n                                </x-installer::form.control-group>\n\n                                <!-- Database Password-->\n                                <x-installer::form.control-group class=\"mb-2.5\">\n                                    <x-installer::form.control-group.label>\n                                        @lang('installer::app.installer.index.environment-configuration.database-password')\n                                    </x-installer::form.control-group.label>\n\n                                    <x-installer::form.control-group.control\n                                        type=\"password\"\n                                        name=\"db_password\"\n                                        ::value=\"envData.db_password\"\n                                        :label=\"trans('installer::app.installer.index.environment-configuration.database-password')\"\n                                        :placeholder=\"trans('installer::app.installer.index.environment-configuration.database-password')\"\n                                    />\n\n                                    <x-installer::form.control-group.error control-name=\"db_password\" />\n                                </x-installer::form.control-group>\n                            </div>\n\n                            <div class=\"flex items-center justify-between px-4 py-2.5\">\n                                <div\n                                    class=\"cursor-pointer text-base font-semibold text-brandColor\"\n                                    role=\"button\"\n                                    :aria-label=\"@lang('installer::app.installer.index.back')\"\n                                    tabindex=\"0\"\n                                    @click=\"back\"\n                                >\n                                    @lang('installer::app.installer.index.back')\n                                </div>\n\n                                <button\n                                    type=\"submit\"\n                                    class=\"primary-button\"\n                                    tabindex=\"0\"\n                                >\n                                    @lang('installer::app.installer.index.continue')\n                                </button>\n                            </div>\n                        </form>\n                    </x-installer::form>\n                </div>\n\n                <!-- Ready For Installation -->\n                <div\n                    class=\"w-full max-w-[568px] rounded-lg border-[1px] border-gray-300 bg-white\"\n                    v-if=\"currentStep == 'readyForInstallation'\"\n                >\n                    <x-installer::form\n                        v-slot=\"{ meta, errors, handleSubmit }\"\n                        as=\"div\"\n                        ref=\"envDatabase\"\n                    >\n                        <form\n                            @submit.prevent=\"handleSubmit($event, FormSubmit)\"\n                            enctype=\"multipart/form-data\"\n                        >\n                            <div class=\"flex items-center justify-between gap-2.5 border-b border-gray-300 px-4 py-3\">\n                                <p class=\"text-xl font-bold text-gray-800\">\n                                    @lang('installer::app.installer.index.ready-for-installation.install')\n                                </p>\n                            </div>\n\n                            <div class=\"flex h-[484px] flex-col justify-center gap-4 overflow-y-auto border-b border-gray-300 px-7 py-4\">\n                                <div class=\"grid gap-1\">\n                                    <p class=\"text-lg font-semibold text-gray-800\">\n                                        @lang('installer::app.installer.index.ready-for-installation.install-info')\n                                    </p>\n\n                                    <div class=\"grid gap-4\">\n                                        <label class=\"text-sm text-gray-600\">\n                                            @lang('installer::app.installer.index.ready-for-installation.install-info-button')\n                                        </label>\n\n                                        <div class=\"grid gap-3\">\n                                            <div class=\"flex items-center gap-1 text-sm text-gray-600\">\n                                                <span class=\"icon-right-arrow text-xl\"></span>\n\n                                                <p>@lang('installer::app.installer.index.ready-for-installation.create-databsae-table')</p>\n                                            </div>\n\n                                            <div class=\"flex items-center gap-1 text-sm text-gray-600\">\n                                                <span class=\"icon-right-arrow text-xl\"></span>\n\n                                                <p>@lang('installer::app.installer.index.ready-for-installation.populate-database-table')</p>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n\n                            <div class=\"flex items-center justify-between px-4 py-2.5\">\n                                <div\n                                    class=\"cursor-pointer text-base font-semibold text-brandColor\"\n                                    role=\"button\"\n                                    :aria-label=\"@lang('installer::app.installer.index.back')\"\n                                    tabindex=\"0\"\n                                    @click=\"back\"\n                                >\n                                    Back\n                                </div>\n\n                                <button\n                                    type=\"submit\"\n                                    class=\"cursor-pointer rounded-md border border-brandColor bg-brandColor px-3 py-1.5 font-semibold text-gray-50 hover:opacity-90\"\n                                >\n                                    @lang('installer::app.installer.index.ready-for-installation.start-installation')\n                                </button>\n                            </div>\n                        </form>\n                    </x-installer::form>\n                </div>\n\n                <!-- Installation Processing -->\n                <div\n                    class=\"w-full max-w-[568px] rounded-lg border-[1px] border-gray-300 bg-white\"\n                    v-if=\"currentStep == 'installProgress'\"\n                >\n                    <div class=\"flex items-center justify-between gap-2.5 border-b border-gray-300 px-4 py-3\">\n                        <p class=\"text-xl font-bold text-gray-800\">\n                            @lang('installer::app.installer.index.installation-processing.title')\n                        </p>\n                    </div>\n\n                    <div class=\"flex h-[484px] flex-col justify-center gap-4 overflow-y-auto px-7 py-4\">\n                        <div class=\"flex flex-col gap-4\">\n                            <p class=\"text-lg font-bold text-gray-800\">\n                                @lang('installer::app.installer.index.installation-processing.krayin')\n                            </p>\n\n                            <div class=\"grid gap-2.5\">\n                                <!-- Spinner -->\n                                <img\n                                    class=\"h-5 w-5 animate-spin text-brandColor\"\n                                    src=\"{{ vite()->asset('images/spinner.svg', 'installer') }}\"\n                                    alt=\"Loading\"\n                                />\n\n                                <p class=\"text-sm text-gray-600\">\n                                    @lang('installer::app.installer.index.installation-processing.krayin-info')\n                                </p>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n\n                <!-- Environment Configuration .ENV -->\n                <div\n                    class=\"w-full max-w-[568px] rounded-lg border-[1px] border-gray-300 bg-white\"\n                    v-if=\"currentStep == 'envConfiguration'\"\n                >\n                    <x-installer::form\n                        v-slot=\"{ meta, errors, handleSubmit }\"\n                        as=\"div\"\n                        ref=\"envSetup\"\n                    >\n                        <form\n                            @submit.prevent=\"handleSubmit($event, nextForm)\"\n                            enctype=\"multipart/form-data\"\n                        >\n                            <div class=\"flex items-center justify-between gap-2.5 border-b border-gray-300 px-4 py-3\">\n                                <p class=\"text-xl font-bold text-gray-800\">\n                                    @lang('installer::app.installer.index.environment-configuration.title')\n                                </p>\n                            </div>\n\n                            <div class=\"flex h-[484px] flex-col gap-3 overflow-y-auto border-b border-gray-300 px-7 py-4\">\n                                <!-- Application Name -->\n                                <x-installer::form.control-group class=\"mb-2.5\">\n                                    <x-installer::form.control-group.label class=\"required\">\n                                        @lang('installer::app.installer.index.environment-configuration.application-name')\n                                    </x-installer::form.control-group.label>\n\n                                    <x-installer::form.control-group.control\n                                        type=\"text\"\n                                        name=\"app_name\"\n                                        ::value=\"envData.app_name ?? 'Krayin'\"\n                                        rules=\"required\"\n                                        :label=\"trans('installer::app.installer.index.environment-configuration.application-name')\"\n                                        :placeholder=\"trans('installer::app.installer.index.environment-configuration.krayin')\"\n                                    />\n\n                                    <x-installer::form.control-group.error control-name=\"app_name\" />\n                                </x-installer::form.control-group>\n\n                                <!-- Application Default URL -->\n                                <x-installer::form.control-group class=\"mb-2.5\">\n                                    <x-installer::form.control-group.label class=\"required\">\n                                        @lang('installer::app.installer.index.environment-configuration.default-url')\n                                    </x-installer::form.control-group.label>\n\n                                    <x-installer::form.control-group.control\n                                        type=\"text\"\n                                        name=\"app_url\"\n                                        ::value=\"envData.app_url ?? 'https://localhost'\"\n                                        rules=\"required\"\n                                        :label=\"trans('installer::app.installer.index.environment-configuration.default-url')\"\n                                        :placeholder=\"trans('installer::app.installer.index.environment-configuration.default-url-link')\"\n                                    />\n\n                                    <x-installer::form.control-group.error control-name=\"app_url\" />\n                                </x-installer::form.control-group>\n\n                                <!-- Application Default Timezone -->\n                                <x-installer::form.control-group class=\"mb-2.5\">\n                                    <x-installer::form.control-group.label class=\"required\">\n                                        @lang('installer::app.installer.index.environment-configuration.default-timezone')\n                                    </x-installer::form.control-group.label>\n\n                                    @php\n                                        date_default_timezone_set('UTC');\n\n                                        $tzlist = DateTimeZone::listIdentifiers(DateTimeZone::ALL);\n\n                                        $current = date_default_timezone_get();\n                                    @endphp\n\n                                    <x-installer::form.control-group.control\n                                        type=\"select\"\n                                        name=\"app_timezone\"\n                                        ::value=\"envData.app_timezone ?? $current\"\n                                        rules=\"required\"\n                                        :aria-label=\"trans('installer::app.installer.index.environment-configuration.default-timezone')\"\n                                        :label=\"trans('installer::app.installer.index.environment-configuration.default-timezone')\"\n                                    >\n                                        <option\n                                            value=\"\"\n                                            disabled\n                                        >\n                                            @lang('installer::app.installer.index.environment-configuration.select-timezone')\n                                        </option>\n\n                                        @foreach($tzlist as $key => $value)\n                                            <option\n                                                value=\"{{ $value }}\"\n                                                {{ $value === $current ? 'selected' : '' }}\n                                            >\n                                                {{ $value }}\n                                            </option>\n                                        @endforeach\n                                    </x-installer::form.control-group.control>\n\n                                    <x-installer::form.control-group.error control-name=\"app_timezone\" />\n                                </x-installer::form.control-group>\n\n                                <div\n                                    class=\"p-1.5\"\n                                    :style=\"warning['container'], warning['message']\"\n                                >\n                                    <i class=\"icon-limited !text-black\"></i>\n\n                                    @lang('installer::app.installer.index.environment-configuration.warning-message')\n                                </div>\n\n                                <div class=\"grid grid-cols-2 gap-2.5\">\n                                    <!-- Application Default Locale -->\n                                    <x-installer::form.control-group class=\"w-full\">\n                                        <x-installer::form.control-group.label class=\"required\">\n                                            @lang('installer::app.installer.index.environment-configuration.default-locale')\n                                        </x-installer::form.control-group.label>\n\n                                        <x-installer::form.control-group.control\n                                            type=\"select\"\n                                            name=\"app_locale\"\n                                            value=\"{{ app()->getLocale() }}\"\n                                            rules=\"required\"\n                                            :aria-label=\"trans('installer::app.installer.index.environment-configuration.default-locale')\"\n                                            :label=\"trans('installer::app.installer.index.environment-configuration.default-locale')\"\n                                        >\n                                            @foreach ($locales as $value => $label)\n                                                <option value=\"{{ $value }}\">\n                                                    {{ $label }}\n                                                </option>\n                                            @endforeach\n                                        </x-installer::form.control-group.control>\n\n                                        <x-installer::form.control-group.error control-name=\"app_locale\" />\n                                    </x-installer::form.control-group>\n\n                                    <!-- Application Default Currency -->\n                                    <x-installer::form.control-group class=\"w-full\">\n                                        <x-installer::form.control-group.label class=\"required\">\n                                            @lang('installer::app.installer.index.environment-configuration.default-currency')\n                                        </x-installer::form.control-group.label>\n\n                                        <x-installer::form.control-group.control\n                                            type=\"select\"\n                                            name=\"app_currency\"\n                                            ::value=\"envData.app_currency ?? 'USD'\"\n                                            :aria-label=\"trans('installer::app.installer.index.environment-configuration.default-currency')\"\n                                            rules=\"required\"\n                                            :label=\"trans('installer::app.installer.index.environment-configuration.default-currency')\"\n                                        >\n                                            <option value=\"\" disabled>Select Currencies</option>\n\n                                            @foreach ($currencies as $value => $label)\n                                                <option value=\"{{ $value }}\" @if($value == 'USD') selected @endif>\n                                                    @lang(\"installer::app.installer.index.environment-configuration.$label\")\n                                                </option>\n                                            @endforeach\n                                        </x-installer::form.control-group.control>\n\n                                        <x-installer::form.control-group.error control-name=\"app_currency\" />\n                                    </x-installer::form.control-group>\n                                </div>\n                            </div>\n\n                            <div class=\"flex items-center justify-end px-4 py-2.5\">\n                                <x-installer::button\n                                    button-type=\"submit\"\n                                    class=\"primary-button\"\n                                    :title=\"trans('installer::app.installer.index.continue')\"\n                                    tabindex=\"0\"\n                                    ::loading=\"isLoading\"\n                                    ::disabled=\"isLoading\"\n                                />\n                            </div>\n                        </form>\n                    </x-installer::form>\n                </div>\n\n                <!-- Create Administrator -->\n                <div\n                    class=\"w-full max-w-[568px] rounded-lg border border-gray-300 bg-white\"\n                    v-if=\"currentStep == 'createAdmin'\"\n                >\n                    <x-installer::form\n                        v-slot=\"{ meta, errors, handleSubmit }\"\n                        as=\"div\"\n                        ref=\"createAdmin\"\n                    >\n                        <form\n                            @submit.prevent=\"handleSubmit($event, FormSubmit)\"\n                            enctype=\"multipart/form-data\"\n                        >\n                            <div class=\"flex items-center justify-between gap-2.5 border-b border-gray-300 px-4 py-3\">\n                                <p class=\"text-xl font-bold text-gray-800\">\n                                    @lang('installer::app.installer.index.create-administrator.title')\n                                </p>\n                            </div>\n\n                            <div class=\"flex h-[484px] flex-col gap-3 overflow-y-auto border-b border-gray-300 px-7 py-4\">\n                                <!-- Admin -->\n                                <x-installer::form.control-group class=\"mb-2.5\">\n                                    <x-installer::form.control-group.label class=\"required\">\n                                        @lang('installer::app.installer.index.create-administrator.admin')\n                                    </x-installer::form.control-group.label>\n\n                                    <x-installer::form.control-group.control\n                                        type=\"text\"\n                                        name=\"admin\"\n                                        rules=\"required\"\n                                        value=\"Admin\"\n                                        :label=\"trans('installer::app.installer.index.create-administrator.admin')\"\n                                        :placeholder=\"trans('installer::app.installer.index.create-administrator.krayin')\"\n                                    />\n\n                                    <x-installer::form.control-group.error control-name=\"admin\" />\n                                </x-installer::form.control-group>\n\n                                <!-- Email -->\n                                <x-installer::form.control-group class=\"mb-2.5\">\n                                    <x-installer::form.control-group.label class=\"required\">\n                                        @lang('installer::app.installer.index.create-administrator.email')\n                                    </x-installer::form.control-group.label>\n\n                                    <x-installer::form.control-group.control\n                                        type=\"text\"\n                                        name=\"email\"\n                                        rules=\"required\"\n                                        value=\"admin@example.com\"\n                                        :label=\"trans('installer::app.installer.index.create-administrator.email')\"\n                                        :placeholder=\"trans('installer::app.installer.index.create-administrator.email-address')\"\n                                    />\n\n                                    <x-installer::form.control-group.error control-name=\"email\" />\n                                </x-installer::form.control-group>\n\n                                <!-- Password -->\n                                <x-installer::form.control-group class=\"mb-2.5\">\n                                    <x-installer::form.control-group.label class=\"required\">\n                                        @lang('installer::app.installer.index.create-administrator.password')\n                                    </x-installer::form.control-group.label>\n\n                                    <x-installer::form.control-group.control\n                                        type=\"password\"\n                                        name=\"password\"\n                                        rules=\"required|min:6\"\n                                        :value=\"old('password')\"\n                                        :label=\"trans('installer::app.installer.index.create-administrator.password')\"\n                                    />\n\n                                    <x-installer::form.control-group.error control-name=\"password\" />\n                                </x-installer::form.control-group>\n\n                                <!-- Confirm Password -->\n                                <x-installer::form.control-group class=\"mb-2.5\">\n                                    <x-installer::form.control-group.label class=\"required\">\n                                        @lang('installer::app.installer.index.create-administrator.confirm-password')\n                                    </x-installer::form.control-group.label>\n\n                                    <x-installer::form.control-group.control\n                                        type=\"password\"\n                                        name=\"confirm_password\"\n                                        rules=\"required|confirmed:@password\"\n                                        :value=\"old('confirm_password')\"\n                                        :label=\"trans('installer::app.installer.index.create-administrator.confirm-password')\"\n                                    />\n\n                                    <x-installer::form.control-group.error control-name=\"confirm_password\" />\n                                </x-installer::form.control-group>\n                            </div>\n\n                            <div class=\"flex items-center justify-end px-4 py-2.5\">\n                                <button\n                                    type=\"submit\"\n                                    class=\"primary-button\"\n                                    tabindex=\"0\"\n                                >\n                                    @lang('installer::app.installer.index.continue')\n                                </button>\n                            </div>\n\n                        </form>\n                    </x-installer::form>\n                </div>\n\n                <!-- Installation Completed -->\n                <div\n                    class=\"w-full max-w-[568px] rounded-lg border border-gray-300 bg-white\"\n                    v-if=\"currentStep == 'installationCompleted'\"\n                >\n                    <div class=\"flex items-center justify-between gap-2.5 border-b border-gray-300 px-4 py-3\">\n                        <p class=\"text-xl font-bold text-gray-800\">\n                            @lang('installer::app.installer.index.installation-completed.title')\n                        </p>\n                    </div>\n\n                    <div class=\"flex h-[484px] flex-col justify-center gap-4 overflow-y-auto border-b border-gray-300 px-7 py-4\">\n                        <div class=\"flex flex-col gap-4\">\n                            <div class=\"flex h-8 w-8 items-center justify-center rounded-full border border-green-500\">\n                                <span class=\"icon-tick text-xl font-semibold text-green-500\"></span>\n                            </div>\n\n                            <div class=\"grid gap-2.5\">\n                                <p class=\"text-lg font-semibold text-gray-800\">\n                                    @lang('installer::app.installer.index.installation-completed.title')\n                                </p>\n\n                                <p class=\"text-sm text-gray-600\">\n                                    @lang('installer::app.installer.index.installation-completed.title-info')\n                                </p>\n\n                                <!-- Admin & Shop both buttons -->\n                                <div class=\"flex items-center gap-4\">\n                                    <a\n                                        href=\"{{ URL('/admin/login')}}\"\n                                        class=\"cursor-pointer rounded-md border border-brandColor bg-white px-3 py-1.5 font-semibold text-brandColor hover:opacity-90\"\n                                    >\n                                        @lang('installer::app.installer.index.installation-completed.admin-panel')\n                                    </a>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n\n                    <div class=\"flex items-center justify-between px-4 py-2.5\">\n                        <a\n                            href=\"https://forums.krayincrm.com/\"\n                            class=\"cursor-pointer text-xs font-semibold text-brandColor\"\n                        >\n                            @lang('installer::app.installer.index.installation-completed.krayin-forums')\n                        </a>\n\n                        <a\n                            href=\"https://krayincrm.com/extensions/\"\n                            class=\"cursor-pointer rounded-md border border-brandColor bg-white px-3 py-1.5 font-semibold text-brandColor hover:opacity-90\"\n                        >\n                            @lang('installer::app.installer.index.installation-completed.explore-krayin-extensions')\n                        </a>\n                    </div>\n                </div>\n            </script>\n\n            <script type=\"module\">\n                app.component('v-server-requirements', {\n                    template: '#v-server-requirements-template',\n\n                    data() {\n                        return {\n                            step: '',\n\n                            currentStep: 'start',\n\n                            envData: {},\n\n                            stepStates: {\n                                start: 'active',\n                                systemRequirements: 'pending',\n                                envDatabase: 'pending',\n                                readyForInstallation: 'pending',\n                                envConfiguration: 'pending',\n                                createAdmin: 'pending',\n                                installationCompleted: 'pending',\n                            },\n\n                            steps: [\n                                'start',\n                                'systemRequirements',\n                                'envDatabase',\n                                'readyForInstallation',\n                                'installProgress',\n                                'envConfiguration',\n                                'createAdmin',\n                                'installationCompleted',\n                            ],\n\n                            warning: {\n                                container: 'background: #fde68a',\n\n                                message: 'color: #1F2937',\n                            },\n\n                            isLoading: false,\n                        }\n                    },\n\n                    mounted() {\n                        const preventUnload = (event) => {\n                            event.preventDefault();\n                        };\n\n                        window.addEventListener('beforeunload', preventUnload);\n                    },\n\n                    methods: {\n                        FormSubmit(params, { setErrors }) {\n                            const stepActions = {\n                                envDatabase: () => {\n                                    if (params.db_connection === 'mysql') {\n                                        this.completeStep('envDatabase', 'readyForInstallation', 'active', 'complete', setErrors);\n\n                                        this.envData = { ...this.envData, ...params };\n                                    } else {\n                                        setErrors({ 'db_connection': [\"Krayin currently supports MySQL only.\"] });\n                                    }\n                                },\n\n                                readyForInstallation: (setErrors) => {\n                                    this.currentStep = 'installProgress';\n\n                                    this.startMigration(setErrors);\n                                },\n\n                                createAdmin: (setErrors) => {\n                                    this.isLoading = true;\n\n                                    this.saveAdmin(params, setErrors);\n                                },\n                            };\n\n                            const index = this.steps.find(step => step === this.currentStep);\n\n                            if (stepActions[index]) {\n                                stepActions[index]();\n                            }\n                        },\n\n                        nextForm(params) {\n                            const stepActions = {\n                                start: () => {\n                                    this.completeStep('start', 'systemRequirements', 'active', 'complete');\n                                },\n\n                                systemRequirements: () => {\n                                    this.completeStep('systemRequirements', 'envDatabase', 'active', 'complete');\n\n                                    this.currentStep = 'envDatabase';\n                                },\n\n                                envConfiguration: () => {\n                                    this.envData = { ...params };\n\n                                    this.startSeeding(this.envData);\n                                },\n\n                            };\n\n                            const index = this.steps.find(step => step === this.currentStep);\n\n                            if (stepActions[index]) {\n                                stepActions[index]();\n                            }\n                        },\n\n                        completeStep(fromStep, toStep, toState, nextState, setErrors) {\n                            this.stepStates[fromStep] = nextState;\n\n                            this.currentStep = toStep;\n\n                            this.stepStates[toStep] = toState;\n                        },\n\n                        startMigration(setErrors) {\n                            this.currentStep = 'installProgress';\n\n                            this.$axios.post(\"{{ route('installer.env_file_setup') }}\", this.envData)\n                                .then((response) => {\n                                    this.runMigartion(setErrors);\n                            })\n                            .catch(error => {\n                                setErrors(error.response.data.errors);\n                            });\n                        },\n\n                        runMigartion(setErrors) {\n                            this.$axios.post(\"{{ route('installer.run_migration') }}\")\n                                .then((response) => {\n                                    this.completeStep('readyForInstallation', 'envConfiguration', 'active', 'complete');\n\n                                    this.currentStep = 'envConfiguration';\n                                })\n                                .catch(error => {\n                                    alert(error.response.data.error);\n\n                                    this.currentStep = 'envDatabase';\n                                });\n                        },\n\n                        startSeeding(allParameters) {\n                                this.$axios.post(\"{{ route('installer.run_seeder') }}\", {\n                                    'allParameters': allParameters,\n                                })\n                                .then((response) => {\n                                    this.completeStep('readyForInstallation', 'createAdmin', 'active', 'complete');\n\n                                    this.currentStep = 'createAdmin';\n                                })\n                                .catch(error => {\n                                    setErrors(error.response.data.errors);\n                                });\n                        },\n\n                        saveAdmin(params, setErrors) {\n                            this.$axios.post(\"{{ route('installer.admin_config_setup') }}\", params)\n                                .then((response) => {\n                                    this.isLoading = false;\n\n                                    this.currentStep = 'installationCompleted';\n\n                                    if (response.data) {\n                                        this.completeStep('createAdmin', 'installationCompleted', 'active', 'complete', setErrors);\n                                    }\n                                })\n                                .catch(error => {\n                                    setErrors(error.response.data.errors);\n                                });\n                        },\n\n                        setLocale(params) {\n                            const newLocale = params.locale;\n                            const url = new URL(window.location.href);\n\n                            if (! url.searchParams.has('locale')) {\n                                url.searchParams.set('locale', newLocale);\n                                window.location.href = url.toString();\n                            }\n                        },\n\n                        back() {\n                            if (this.$refs[this.currentStep] && this.$refs[this.currentStep].setValues) {\n                                this.$refs[this.currentStep].setValues(this.envData);\n                            }\n\n                            let index = this.steps.indexOf(this.currentStep);\n\n                            if (index > 0) {\n                                this.currentStep = this.steps[index - 1];\n                            }\n                        }\n                    },\n                });\n            </script>\n        @endPushOnce\n\n        @stack('scripts')\n    </body>\n</html>\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Routes/web.php",
    "content": "<?php\n\nuse Illuminate\\Session\\Middleware\\StartSession;\nuse Illuminate\\Support\\Facades\\Route;\nuse Webkul\\Installer\\Http\\Controllers\\InstallerController;\n\nRoute::middleware(['web', 'installer_locale'])->group(function () {\n    Route::controller(InstallerController::class)->group(function () {\n        Route::get('install', 'index')->name('installer.index');\n\n        Route::middleware(StartSession::class)->prefix('install/api')->group(function () {\n            Route::post('env-file-setup', 'envFileSetup')->name('installer.env_file_setup');\n\n            Route::withoutMiddleware('web')->group(function () {\n                Route::post('run-migration', 'runMigration')->name('installer.run_migration');\n\n                Route::post('run-seeder', 'runSeeder')->name('installer.run_seeder');\n\n                Route::post('admin-config-setup', 'adminConfigSetup')->name('installer.admin_config_setup');\n            });\n        });\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/Installer/src/Templates/on-boarding.php",
    "content": "\n _   __                _       \n| | / /               (_)      \n| |/ / _ __ __ _ _   _ _ _ __  \n|    \\| '__/ _` | | | | | '_ \\ \n| |\\  \\ | | (_| | |_| | | | | |\n\\_| \\_/_|  \\__,_|\\__, |_|_| |_|\n                  __/ |        \n                 |___/         \n\n</>\n\nWelcome to the <info>Krayin</info> project! Krayin Community is an <comment>open-source CRM solution</comment>\nwhich is built on top of Laravel and Vue.js.\n\nMade with 💖  by the Krayin Team. Happy helping :)\n"
  },
  {
    "path": "packages/Webkul/Installer/tailwind.config.js",
    "content": "/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n    content: [\"./src/Resources/**/*.blade.php\", \"./src/Resources/**/*.js\"],\n\n    theme: {\n        container: {\n            center: true,\n\n            screens: {\n                \"2xl\": \"1920px\",\n            },\n\n            padding: {\n                DEFAULT: \"16px\",\n            },\n        },\n\n        screens: {\n            sm: \"525px\",\n            md: \"768px\",\n            lg: \"1024px\",\n            xl: \"1240px\",\n            \"2xl\": \"1920px\",\n        },\n\n        extend: {\n            colors: {\n                brandColor: '#0E90D9',\n            },\n\n            fontFamily: {\n                inter: ['Inter'],\n                icon: ['icomoon']\n            }\n        },\n    },\n    \n    darkMode: 'class',\n\n    plugins: [],\n\n    safelist: [\n        {\n            pattern: /icon-/,\n        }\n    ]\n};"
  },
  {
    "path": "packages/Webkul/Installer/vite.config.js",
    "content": "import { defineConfig, loadEnv } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\nimport laravel from \"laravel-vite-plugin\";\nimport path from \"path\";\n\nexport default defineConfig(({ mode }) => {\n    const envDir = \"../../../\";\n\n    Object.assign(process.env, loadEnv(mode, envDir));\n\n    return {\n        build: {\n            emptyOutDir: true,\n        },\n\n        envDir,\n\n        server: {\n            host: process.env.VITE_HOST || \"localhost\",\n            port: process.env.VITE_PORT || 5173,\n        },\n\n        plugins: [\n            vue(),\n\n            laravel({\n                hotFile: \"../../../public/installer-vite.hot\",\n                publicDirectory: \"../../../public\",\n                buildDirectory: \"installer/build\",\n                input: [\n                    \"src/Resources/assets/css/app.css\",\n                    \"src/Resources/assets/js/app.js\",\n                ],\n                refresh: true,\n            }),\n        ],\n\n        experimental: {\n            renderBuiltUrl(filename, { hostId, hostType, type }) {\n                if (hostType === \"css\") {\n                    return path.basename(filename);\n                }\n            },\n        },\n    };\n});"
  },
  {
    "path": "packages/Webkul/Lead/composer.json",
    "content": "{\n    \"name\": \"krayin/laravel-lead\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Jitendra Singh\",\n            \"email\": \"jitendra@webkul.com\"\n        }\n    ],\n    \"require\": {\n        \"krayin/laravel-activity\": \"^1.0\",\n        \"krayin/laravel-attribute\": \"^1.0\",\n        \"krayin/laravel-contact\": \"^1.0\",\n        \"krayin/laravel-core\": \"^1.0\",\n        \"krayin/laravel-email\": \"^1.0\",\n        \"krayin/laravel-product\": \"^1.0\",\n        \"krayin/laravel-quote\": \"^1.0\",\n        \"krayin/laravel-tag\": \"^1.0\",\n        \"krayin/laravel-user\": \"^1.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Webkul\\\\Lead\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"laravel\": {\n            \"providers\": [\n                \"Webkul\\\\Lead\\\\Providers\\\\LeadServiceProvider\"\n            ],\n            \"aliases\": {}\n        }\n    },\n    \"minimum-stability\": \"dev\"\n}"
  },
  {
    "path": "packages/Webkul/Lead/src/Contracts/Lead.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Contracts;\n\ninterface Lead {}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Contracts/Pipeline.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Contracts;\n\ninterface Pipeline {}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Contracts/Product.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Contracts;\n\ninterface Product {}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Contracts/Source.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Contracts;\n\ninterface Source {}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Contracts/Stage.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Contracts;\n\ninterface Stage {}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Contracts/Type.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Contracts;\n\ninterface Type {}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_04_21_172825_create_lead_sources_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('lead_sources', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('lead_sources');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_04_21_172847_create_lead_types_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('lead_types', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('lead_types');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_04_22_153258_create_lead_stages_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('lead_stages', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('code');\n            $table->string('name');\n            $table->boolean('is_user_defined')->default(1);\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('lead_stages');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_04_22_155706_create_lead_pipelines_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('lead_pipelines', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->boolean('is_default')->default(0);\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('lead_pipelines');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_04_22_155838_create_lead_pipeline_stages_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('lead_pipeline_stages', function (Blueprint $table) {\n            $table->increments('id');\n            $table->integer('probability')->default(0);\n            $table->integer('sort_order')->default(0);\n\n            $table->integer('lead_stage_id')->unsigned();\n            $table->foreign('lead_stage_id')->references('id')->on('lead_stages')->onDelete('cascade');\n\n            $table->integer('lead_pipeline_id')->unsigned();\n            $table->foreign('lead_pipeline_id')->references('id')->on('lead_pipelines')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('lead_pipeline_stages');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_04_22_164215_create_leads_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('leads', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('title');\n            $table->text('description')->nullable();\n            $table->decimal('lead_value', 12, 4)->nullable();\n            $table->boolean('status')->nullable();\n            $table->text('lost_reason')->nullable();\n            $table->datetime('closed_at')->nullable();\n\n            $table->integer('user_id')->unsigned();\n            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');\n\n            $table->integer('person_id')->unsigned();\n            $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade');\n\n            $table->integer('lead_source_id')->unsigned();\n            $table->foreign('lead_source_id')->references('id')->on('lead_sources')->onDelete('cascade');\n\n            $table->integer('lead_type_id')->unsigned();\n            $table->foreign('lead_type_id')->references('id')->on('lead_types')->onDelete('cascade');\n\n            $table->integer('lead_pipeline_id')->unsigned()->nullable();\n            $table->foreign('lead_pipeline_id')->references('id')->on('lead_pipelines')->onDelete('cascade');\n\n            $table->integer('lead_stage_id')->unsigned();\n            $table->foreign('lead_stage_id')->references('id')->on('lead_stages')->onDelete('cascade');\n\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('leads');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_04_22_171805_create_lead_products_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('lead_products', function (Blueprint $table) {\n            $table->increments('id');\n            $table->integer('quantity')->default(0);\n            $table->decimal('price', 12, 4)->nullable();\n            $table->decimal('amount', 12, 4)->nullable();\n\n            $table->integer('lead_id')->unsigned();\n            $table->foreign('lead_id')->references('id')->on('leads')->onDelete('cascade');\n\n            $table->integer('product_id')->unsigned();\n            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('lead_products');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_05_12_150329_create_lead_activities_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('lead_activities', function (Blueprint $table) {\n            $table->integer('activity_id')->unsigned();\n            $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade');\n\n            $table->integer('lead_id')->unsigned();\n            $table->foreign('lead_id')->references('id')->on('leads')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('lead_activities');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_05_20_141240_create_lead_tags_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('lead_tags', function (Blueprint $table) {\n            $table->integer('tag_id')->unsigned();\n            $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');\n\n            $table->integer('lead_id')->unsigned();\n            $table->foreign('lead_id')->references('id')->on('leads')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('lead_tags');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_07_02_201822_create_lead_quotes_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('lead_quotes', function (Blueprint $table) {\n            $table->integer('quote_id')->unsigned();\n            $table->foreign('quote_id')->references('id')->on('quotes')->onDelete('cascade');\n\n            $table->integer('lead_id')->unsigned();\n            $table->foreign('lead_id')->references('id')->on('leads')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('lead_quotes');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_09_23_221138_add_column_expected_close_date_in_leads_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::table('leads', function (Blueprint $table) {\n            $table->date('expected_close_date')->nullable();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::table('leads', function (Blueprint $table) {\n            $table->dropColumn('expected_close_date');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_09_30_135857_add_column_rotten_days_in_lead_pipelines_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::table('lead_pipelines', function (Blueprint $table) {\n            $table->integer('rotten_days')->after('is_default')->default(30);\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::table('lead_pipelines', function (Blueprint $table) {\n            $table->dropColumn('rotten_days');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_09_30_154222_alter_lead_pipeline_stages_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        $tablePrefix = DB::getTablePrefix();\n\n        Schema::table('lead_pipeline_stages', function (Blueprint $table) {\n            $table->string('code')->after('id')->nullable();\n            $table->string('name')->after('code')->nullable();\n        });\n\n        DB::table('lead_pipeline_stages')\n            ->join('lead_stages', 'lead_pipeline_stages.lead_stage_id', '=', 'lead_stages.id')\n            ->update([\n                'lead_pipeline_stages.code' => DB::raw($tablePrefix.'lead_stages.code'),\n                'lead_pipeline_stages.name' => DB::raw($tablePrefix.'lead_stages.name'),\n            ]);\n\n        Schema::table('lead_pipeline_stages', function (Blueprint $table) use ($tablePrefix) {\n            $table->dropForeign($tablePrefix.'lead_pipeline_stages_lead_stage_id_foreign');\n            $table->dropColumn('lead_stage_id');\n\n            $table->unique(['code', 'lead_pipeline_id']);\n            $table->unique(['name', 'lead_pipeline_id']);\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::table('lead_pipeline_stages', function (Blueprint $table) {\n            $table->dropColumn('code');\n            $table->dropColumn('name');\n\n            $table->integer('lead_stage_id')->unsigned();\n            $table->foreign('lead_stage_id')->references('id')->on('lead_stages')->onDelete('cascade');\n\n            $table->dropUnique(['lead_pipeline_stages_code_lead_pipeline_id_unique', 'lead_pipeline_stages_name_lead_pipeline_id_unique']);\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_09_30_161722_alter_leads_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        $tablePrefix = DB::getTablePrefix();\n\n        Schema::table('leads', function (Blueprint $table) {\n            $table->integer('lead_pipeline_stage_id')->after('lead_pipeline_id')->unsigned()->nullable();\n            $table->foreign('lead_pipeline_stage_id')->references('id')->on('lead_pipeline_stages')->onDelete('cascade');\n        });\n\n        DB::table('leads')\n            ->update([\n                'leads.lead_pipeline_stage_id' => DB::raw($tablePrefix.'leads.lead_stage_id'),\n            ]);\n\n        Schema::table('leads', function (Blueprint $table) use ($tablePrefix) {\n            $table->dropForeign($tablePrefix.'leads_lead_stage_id_foreign');\n            $table->dropColumn('lead_stage_id');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::table('leads', function (Blueprint $table) {\n            $table->dropForeign(DB::getTablePrefix().'leads_lead_pipeline_stage_id_foreign');\n            $table->dropColumn('lead_pipeline_stage_id');\n\n            $table->integer('lead_stage_id')->unsigned();\n            $table->foreign('lead_stage_id')->references('id')->on('lead_stages')->onDelete('cascade');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_09_30_183825_change_user_id_to_nullable_in_leads_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::table('leads', function (Blueprint $table) {\n            $table->integer('user_id')->unsigned()->nullable()->change();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::table('leads', function (Blueprint $table) {\n            $table->integer('user_id')->unsigned()->nullable()->change();\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2021_11_11_180804_change_lead_pipeline_stage_id_constraint_in_leads_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::table('leads', function (Blueprint $table) {\n            $table->dropForeign(['lead_pipeline_stage_id']);\n\n            $table->foreign('lead_pipeline_stage_id')->references('id')->on('lead_pipeline_stages')->onDelete('set null');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::table('leads', function (Blueprint $table) {\n            $table->dropForeign(['lead_pipeline_stage_id']);\n\n            $table->foreign('lead_pipeline_stage_id')->references('id')->on('lead_pipeline_stages')->onDelete('cascade');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2024_11_29_120302_modify_foreign_keys_in_leads_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::table('leads', function (Blueprint $table) {\n            $table->integer('user_id')->unsigned()->nullable()->change();\n            $table->integer('person_id')->unsigned()->nullable()->change();\n            $table->integer('lead_source_id')->unsigned()->nullable()->change();\n            $table->integer('lead_type_id')->unsigned()->nullable()->change();\n\n            $table->dropForeign(['user_id']);\n            $table->dropForeign(['person_id']);\n            $table->dropForeign(['lead_source_id']);\n            $table->dropForeign(['lead_type_id']);\n\n            $table->foreign('user_id')\n                ->references('id')->on('users')\n                ->onDelete('set null');\n\n            $table->foreign('person_id')\n                ->references('id')->on('persons')\n                ->onDelete('restrict');\n\n            $table->foreign('lead_source_id')\n                ->references('id')->on('lead_sources')\n                ->onDelete('restrict');\n\n            $table->foreign('lead_type_id')\n                ->references('id')->on('lead_types')\n                ->onDelete('restrict');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::table('leads', function (Blueprint $table) {\n            $table->dropForeign(['user_id']);\n            $table->dropForeign(['person_id']);\n            $table->dropForeign(['lead_source_id']);\n            $table->dropForeign(['lead_type_id']);\n\n            $table->integer('user_id')->unsigned()->nullable()->change();\n            $table->integer('person_id')->unsigned()->nullable(false)->change();\n            $table->integer('lead_source_id')->unsigned()->nullable(false)->change();\n            $table->integer('lead_type_id')->unsigned()->nullable(false)->change();\n\n            $table->foreign('user_id')\n                ->references('id')->on('users')\n                ->onDelete('cascade');\n\n            $table->foreign('person_id')\n                ->references('id')->on('persons')\n                ->onDelete('cascade');\n\n            $table->foreign('lead_source_id')\n                ->references('id')->on('lead_sources')\n                ->onDelete('cascade');\n\n            $table->foreign('lead_type_id')\n                ->references('id')->on('lead_types')\n                ->onDelete('cascade');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Database/Migrations/2025_07_01_133612_alter_lead_pipelines_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::table('lead_pipelines', function (Blueprint $table) {\n            $table->string('name')->unique()->change();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::table('lead_pipelines', function (Blueprint $table) {\n            $table->dropUnique(['name']);\n\n            $table->string('name')->change();\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Helpers/MagicAI.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Helpers;\n\nuse Illuminate\\Support\\Facades\\Validator;\nuse Illuminate\\Validation\\ValidationException;\nuse Webkul\\Admin\\Http\\Requests\\LeadForm;\n\nclass MagicAI\n{\n    /**\n     * Const Variable of LEAD_ENTITY.\n     */\n    const LEAD_ENTITY = 'leads';\n\n    /**\n     * Const Variable of PERSON_ENTITY.\n     */\n    const PERSON_ENTITY = 'persons';\n\n    /**\n     * Mapped the receive Extracted AI data.\n     */\n    public static function mapAIDataToLead($aiData)\n    {\n        if (! empty($aiData['error'])) {\n            return self::errorHandler($aiData['error']);\n        }\n\n        $content = strip_tags($aiData['choices'][0]['message']['content']);\n\n        if (empty($content)) {\n            return self::errorHandler(trans('admin::app.leads.file.data-not-found'));\n        }\n\n        preg_match('/\\{.*\\}/s', $content, $matches);\n\n        if (isset($matches[0])) {\n            $jsonString = $matches[0];\n        } else {\n            return self::errorHandler(trans('admin::app.leads.file.invalid-response'));\n        }\n\n        $finalData = json_decode($jsonString);\n\n        if (json_last_error() !== JSON_ERROR_NONE) {\n            return self::errorHandler(trans('admin::app.leads.file.invalid-format'));\n        }\n\n        try {\n            self::validateLeadData($finalData);\n\n            $validatedData = app(LeadForm::class)->validated();\n\n            return array_merge($validatedData, self::prepareLeadData($finalData));\n        } catch (\\Exception $e) {\n            return self::errorHandler($e->getMessage());\n        }\n    }\n\n    /**\n     * Validate the lead data.\n     */\n    private static function validateLeadData($data)\n    {\n        $dataArray = json_decode(json_encode($data), true);\n\n        $validator = Validator::make($dataArray, [\n            'title' => 'required|string|max:255',\n            'lead_value' => 'required|numeric|min:0',\n            'person.name' => 'required|string|max:255',\n            'person.emails.value' => 'required|email',\n            'person.contact_numbers.value' => 'required|string|max:20',\n        ]);\n\n        if ($validator->fails()) {\n            throw new ValidationException(\n                $validator,\n                response()->json(self::errorHandler($validator->errors()->getMessages()), 400)\n            );\n        }\n\n        return $data;\n    }\n\n    /**\n     * Prepares the lead prompt data.\n     */\n    private static function prepareLeadData($finalData)\n    {\n        return [\n            'status' => 1,\n            'title' => $finalData->title ?? 'N/A',\n            'description' => $finalData->description ?? null,\n            'lead_source_id' => 1,\n            'lead_type_id' => 1,\n            'lead_value' => $finalData->lead_value ?? 0,\n            'person' => [\n                'name' => $finalData->person->name ?? 'Unknown',\n                'emails' => [\n                    [\n                        'value' => $finalData->person->emails->value ?? null,\n                        'label' => $finalData->person->emails->label ?? 'work',\n                    ],\n                ],\n                'contact_numbers' => [\n                    [\n                        'value' => $finalData->person->contact_numbers->value ?? null,\n                        'label' => $finalData->person->contact_numbers->label ?? 'work',\n                    ],\n                ],\n                'entity_type' => self::PERSON_ENTITY,\n            ],\n            'entity_type' => self::LEAD_ENTITY,\n        ];\n    }\n\n    /**\n     * Prepares method for error handler.\n     */\n    public static function errorHandler($message)\n    {\n        return [\n            'status' => 'error',\n            'message' => $message,\n        ];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Models/Lead.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Models;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Illuminate\\Database\\Eloquent\\Relations\\BelongsTo;\nuse Illuminate\\Database\\Eloquent\\Relations\\BelongsToMany;\nuse Illuminate\\Database\\Eloquent\\Relations\\HasMany;\nuse Webkul\\Activity\\Models\\ActivityProxy;\nuse Webkul\\Activity\\Traits\\LogsActivity;\nuse Webkul\\Attribute\\Traits\\CustomAttribute;\nuse Webkul\\Contact\\Models\\PersonProxy;\nuse Webkul\\Email\\Models\\EmailProxy;\nuse Webkul\\Lead\\Contracts\\Lead as LeadContract;\nuse Webkul\\Quote\\Models\\QuoteProxy;\nuse Webkul\\Tag\\Models\\TagProxy;\nuse Webkul\\User\\Models\\UserProxy;\n\nclass Lead extends Model implements LeadContract\n{\n    use CustomAttribute, LogsActivity;\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'title',\n        'description',\n        'lead_value',\n        'status',\n        'lost_reason',\n        'expected_close_date',\n        'closed_at',\n        'user_id',\n        'person_id',\n        'lead_source_id',\n        'lead_type_id',\n        'lead_pipeline_id',\n        'lead_pipeline_stage_id',\n    ];\n\n    /**\n     * Cast the attributes to their respective types.\n     *\n     * @var array\n     */\n    protected $casts = [\n        'closed_at' => 'datetime:D M d, Y H:i A',\n        'expected_close_date' => 'date:D M d, Y',\n    ];\n\n    /**\n     * The attributes that are appended.\n     *\n     * @var array\n     */\n    protected $appends = [\n        'rotten_days',\n    ];\n\n    /**\n     * Get the user that owns the lead.\n     */\n    public function user(): BelongsTo\n    {\n        return $this->belongsTo(UserProxy::modelClass());\n    }\n\n    /**\n     * Get the person that owns the lead.\n     */\n    public function person(): BelongsTo\n    {\n        return $this->belongsTo(PersonProxy::modelClass());\n    }\n\n    /**\n     * Get the type that owns the lead.\n     */\n    public function type(): BelongsTo\n    {\n        return $this->belongsTo(TypeProxy::modelClass(), 'lead_type_id');\n    }\n\n    /**\n     * Get the source that owns the lead.\n     */\n    public function source(): BelongsTo\n    {\n        return $this->belongsTo(SourceProxy::modelClass(), 'lead_source_id');\n    }\n\n    /**\n     * Get the pipeline that owns the lead.\n     */\n    public function pipeline(): BelongsTo\n    {\n        return $this->belongsTo(PipelineProxy::modelClass(), 'lead_pipeline_id');\n    }\n\n    /**\n     * Get the pipeline stage that owns the lead.\n     */\n    public function stage(): BelongsTo\n    {\n        return $this->belongsTo(StageProxy::modelClass(), 'lead_pipeline_stage_id');\n    }\n\n    /**\n     * Get the activities.\n     */\n    public function activities(): BelongsToMany\n    {\n        return $this->belongsToMany(ActivityProxy::modelClass(), 'lead_activities');\n    }\n\n    /**\n     * Get the products.\n     */\n    public function products(): HasMany\n    {\n        return $this->hasMany(ProductProxy::modelClass());\n    }\n\n    /**\n     * Get the emails.\n     */\n    public function emails(): HasMany\n    {\n        return $this->hasMany(EmailProxy::modelClass());\n    }\n\n    /**\n     * The quotes that belong to the lead.\n     */\n    public function quotes(): BelongsToMany\n    {\n        return $this->belongsToMany(QuoteProxy::modelClass(), 'lead_quotes');\n    }\n\n    /**\n     * The tags that belong to the lead.\n     */\n    public function tags(): BelongsToMany\n    {\n        return $this->belongsToMany(TagProxy::modelClass(), 'lead_tags');\n    }\n\n    /**\n     * Returns the rotten days\n     */\n    public function getRottenDaysAttribute()\n    {\n        if (! $this->stage) {\n            return 0;\n        }\n\n        if (in_array($this->stage->code, ['won', 'lost'])) {\n            return 0;\n        }\n\n        if (! $this->created_at) {\n            return 0;\n        }\n\n        $rottenDate = $this->created_at->addDays($this->pipeline->rotten_days);\n\n        return $rottenDate->diffInDays(Carbon::now(), false);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Models/LeadProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass LeadProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Models/Pipeline.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Lead\\Contracts\\Pipeline as PipelineContract;\n\nclass Pipeline extends Model implements PipelineContract\n{\n    protected $table = 'lead_pipelines';\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'rotten_days',\n        'is_default',\n    ];\n\n    /**\n     * Get the leads.\n     */\n    public function leads()\n    {\n        return $this->hasMany(LeadProxy::modelClass(), 'lead_pipeline_id');\n    }\n\n    /**\n     * Get the stages that owns the pipeline.\n     */\n    public function stages()\n    {\n        return $this->hasMany(StageProxy::modelClass(), 'lead_pipeline_id')->orderBy('sort_order', 'ASC');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Models/PipelineProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass PipelineProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Models/Product.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Lead\\Contracts\\Product as ProductContract;\nuse Webkul\\Product\\Models\\ProductProxy;\n\nclass Product extends Model implements ProductContract\n{\n    protected $table = 'lead_products';\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'quantity',\n        'price',\n        'amount',\n        'product_id',\n        'lead_id',\n    ];\n\n    /**\n     * Get the product owns the lead product.\n     */\n    public function product()\n    {\n        return $this->belongsTo(ProductProxy::modelClass());\n    }\n\n    /**\n     * Get the lead that owns the lead product.\n     */\n    public function lead()\n    {\n        return $this->belongsTo(LeadProxy::modelClass());\n    }\n\n    /**\n     * Get the customer full name.\n     */\n    public function getNameAttribute()\n    {\n        return $this->product->name;\n    }\n\n    /**\n     * @return array\n     */\n    public function toArray()\n    {\n        $array = parent::toArray();\n\n        $array['name'] = $this->name;\n\n        return $array;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Models/ProductProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass ProductProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Models/Source.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Lead\\Contracts\\Source as SourceContract;\n\nclass Source extends Model implements SourceContract\n{\n    protected $table = 'lead_sources';\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n    ];\n\n    /**\n     * Get the leads.\n     */\n    public function leads()\n    {\n        return $this->hasMany(LeadProxy::modelClass(), 'lead_source_id', 'id');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Models/SourceProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass SourceProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Models/Stage.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Lead\\Contracts\\Stage as StageContract;\n\nclass Stage extends Model implements StageContract\n{\n    public $timestamps = false;\n\n    protected $table = 'lead_pipeline_stages';\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'code',\n        'name',\n        'probability',\n        'sort_order',\n        'lead_pipeline_id',\n    ];\n\n    /**\n     * Get the pipeline that owns the pipeline stage.\n     */\n    public function pipeline()\n    {\n        return $this->belongsTo(PipelineProxy::modelClass(), 'lead_pipeline_id');\n    }\n\n    /**\n     * Get the leads.\n     */\n    public function leads()\n    {\n        return $this->hasMany(LeadProxy::modelClass(), 'lead_pipeline_stage_id');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Models/StageProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass StageProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Models/Type.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Lead\\Contracts\\Type as TypeContract;\n\nclass Type extends Model implements TypeContract\n{\n    protected $table = 'lead_types';\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n    ];\n\n    /**\n     * Get the leads.\n     */\n    public function leads()\n    {\n        return $this->hasMany(LeadProxy::modelClass());\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Models/TypeProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass TypeProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Providers/LeadServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Providers;\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\ServiceProvider;\n\nclass LeadServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap services.\n     *\n     * @return void\n     */\n    public function boot(Router $router)\n    {\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n    }\n\n    /**\n     * Register services.\n     *\n     * @return void\n     */\n    public function register() {}\n}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Providers;\n\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\nuse Webkul\\Lead\\Models\\Lead;\nuse Webkul\\Lead\\Models\\Pipeline;\nuse Webkul\\Lead\\Models\\Product;\nuse Webkul\\Lead\\Models\\Source;\nuse Webkul\\Lead\\Models\\Stage;\nuse Webkul\\Lead\\Models\\Type;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    protected $models = [\n        Lead::class,\n        Pipeline::class,\n        Product::class,\n        Source::class,\n        Stage::class,\n        Type::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Repositories/LeadRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Repositories;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Container\\Container;\nuse Illuminate\\Database\\Eloquent\\Collection;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Support\\Str;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Attribute\\Repositories\\AttributeValueRepository;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\nuse Webkul\\Core\\Eloquent\\Repository;\nuse Webkul\\Lead\\Contracts\\Lead;\n\nclass LeadRepository extends Repository\n{\n    /**\n     * Searchable fields.\n     */\n    protected $fieldSearchable = [\n        'title',\n        'lead_value',\n        'status',\n        'user_id',\n        'user.name',\n        'person_id',\n        'person.name',\n        'lead_source_id',\n        'lead_type_id',\n        'lead_pipeline_id',\n        'lead_pipeline_stage_id',\n        'created_at',\n        'closed_at',\n        'expected_close_date',\n    ];\n\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected StageRepository $stageRepository,\n        protected PersonRepository $personRepository,\n        protected ProductRepository $productRepository,\n        protected AttributeRepository $attributeRepository,\n        protected AttributeValueRepository $attributeValueRepository,\n        Container $container\n    ) {\n        parent::__construct($container);\n    }\n\n    /**\n     * Specify model class name.\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return Lead::class;\n    }\n\n    /**\n     * Get leads query.\n     *\n     * @param  int  $pipelineId\n     * @param  int  $pipelineStageId\n     * @param  string  $term\n     * @param  string  $createdAtRange\n     * @return mixed\n     */\n    public function getLeadsQuery($pipelineId, $pipelineStageId, $term, $createdAtRange)\n    {\n        return $this->with([\n            'attribute_values',\n            'pipeline',\n            'stage',\n        ])->scopeQuery(function ($query) use ($pipelineId, $pipelineStageId, $term, $createdAtRange) {\n            return $query->select(\n                'leads.id as id',\n                'leads.created_at as created_at',\n                'title',\n                'lead_value',\n                'persons.name as person_name',\n                'leads.person_id as person_id',\n                'lead_pipelines.id as lead_pipeline_id',\n                'lead_pipeline_stages.name as status',\n                'lead_pipeline_stages.id as lead_pipeline_stage_id'\n            )\n                ->addSelect(DB::raw('DATEDIFF('.DB::getTablePrefix().'leads.created_at + INTERVAL lead_pipelines.rotten_days DAY, now()) as rotten_days'))\n                ->leftJoin('persons', 'leads.person_id', '=', 'persons.id')\n                ->leftJoin('lead_pipelines', 'leads.lead_pipeline_id', '=', 'lead_pipelines.id')\n                ->leftJoin('lead_pipeline_stages', 'leads.lead_pipeline_stage_id', '=', 'lead_pipeline_stages.id')\n                ->where('title', 'like', \"%$term%\")\n                ->where('leads.lead_pipeline_id', $pipelineId)\n                ->where('leads.lead_pipeline_stage_id', $pipelineStageId)\n                ->when($createdAtRange, function ($query) use ($createdAtRange) {\n                    return $query->whereBetween('leads.created_at', $createdAtRange);\n                })\n                ->where(function ($query) {\n                    if ($userIds = bouncer()->getAuthorizedUserIds()) {\n                        $query->whereIn('leads.user_id', $userIds);\n                    }\n                });\n        });\n    }\n\n    /**\n     * Create.\n     *\n     * @return Lead\n     */\n    public function create(array $data)\n    {\n        /**\n         * If a person is provided, create or update the person and set the `person_id`.\n         */\n        if (isset($data['person'])) {\n            if (! empty($data['person']['id'])) {\n                $person = $this->personRepository->findOrFail($data['person']['id']);\n            } else {\n                $person = $this->personRepository->create(array_merge($data['person'], [\n                    'entity_type' => 'persons',\n                ]));\n            }\n\n            $data['person_id'] = $person->id;\n        }\n\n        if (empty($data['expected_close_date'])) {\n            $data['expected_close_date'] = null;\n        }\n\n        $lead = parent::create(array_merge([\n            'lead_pipeline_id' => 1,\n            'lead_pipeline_stage_id' => 1,\n        ], $data));\n\n        $this->attributeValueRepository->save(array_merge($data, [\n            'entity_id' => $lead->id,\n        ]));\n\n        if (isset($data['products'])) {\n            foreach ($data['products'] as $product) {\n                $this->productRepository->create(array_merge($product, [\n                    'lead_id' => $lead->id,\n                    'amount' => $product['price'] * $product['quantity'],\n                ]));\n            }\n        }\n\n        return $lead;\n    }\n\n    /**\n     * Update.\n     *\n     * @param  int  $id\n     * @param  array|Collection  $attributes\n     * @return Lead\n     */\n    public function update(array $data, $id, $attributes = [])\n    {\n        /**\n         * If a person is provided, create or update the person and set the `person_id`.\n         * Be cautious, as a lead can be updated without providing person data.\n         * For example, in the lead Kanban section, when switching stages, only the stage will be updated.\n         */\n        if (isset($data['person'])) {\n            if (! empty($data['person']['id'])) {\n                $person = $this->personRepository->findOrFail($data['person']['id']);\n            } else {\n                $person = $this->personRepository->create(array_merge($data['person'], [\n                    'entity_type' => 'persons',\n                ]));\n            }\n\n            $data['person_id'] = $person->id;\n        }\n\n        if (isset($data['lead_pipeline_stage_id'])) {\n            $stage = $this->stageRepository->find($data['lead_pipeline_stage_id']);\n\n            if (in_array($stage->code, ['won', 'lost'])) {\n                $data['closed_at'] = $data['closed_at'] ?? Carbon::now();\n            } else {\n                $data['closed_at'] = null;\n            }\n        }\n\n        if (empty($data['expected_close_date'])) {\n            $data['expected_close_date'] = null;\n        }\n\n        $lead = parent::update($data, $id);\n\n        /**\n         * If attributes are provided, only save the provided attributes and return.\n         * A collection of attributes may also be provided, which will be treated as valid,\n         * regardless of whether it is empty or not.\n         */\n        if (! empty($attributes)) {\n            /**\n             * If attributes are provided as an array, then fetch the attributes from the database;\n             * otherwise, use the provided collection of attributes.\n             */\n            if (is_array($attributes)) {\n                $conditions = ['entity_type' => $data['entity_type']];\n\n                if (isset($data['quick_add'])) {\n                    $conditions['quick_add'] = 1;\n                }\n\n                $attributes = $this->attributeRepository->where($conditions)\n                    ->whereIn('code', $attributes)\n                    ->get();\n            }\n\n            $this->attributeValueRepository->save(array_merge($data, [\n                'entity_id' => $lead->id,\n            ]), $attributes);\n\n            return $lead;\n        }\n\n        $this->attributeValueRepository->save(array_merge($data, [\n            'entity_id' => $lead->id,\n        ]));\n\n        $previousProductIds = $lead->products()->pluck('id');\n\n        if (isset($data['products'])) {\n            foreach ($data['products'] as $productId => $productInputs) {\n                if (Str::contains($productId, 'product_')) {\n                    $this->productRepository->create(array_merge([\n                        'lead_id' => $lead->id,\n                    ], $productInputs));\n                } else {\n                    if (is_numeric($index = $previousProductIds->search($productId))) {\n                        $previousProductIds->forget($index);\n                    }\n\n                    $this->productRepository->update($productInputs, $productId);\n                }\n            }\n        }\n\n        foreach ($previousProductIds as $productId) {\n            $this->productRepository->delete($productId);\n        }\n\n        return $lead;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Repositories/PipelineRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Repositories;\n\nuse Illuminate\\Container\\Container;\nuse Illuminate\\Support\\Str;\nuse Webkul\\Core\\Eloquent\\Repository;\nuse Webkul\\Lead\\Contracts\\Pipeline;\n\nclass PipelineRepository extends Repository\n{\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected StageRepository $stageRepository,\n        Container $container\n    ) {\n        parent::__construct($container);\n    }\n\n    /**\n     * Specify model class name.\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\Lead\\Contracts\\Pipeline';\n    }\n\n    /**\n     * Create pipeline.\n     *\n     * @return Pipeline\n     */\n    public function create(array $data)\n    {\n        if ($data['is_default'] ?? false) {\n            $this->model->query()->update(['is_default' => 0]);\n        }\n\n        $pipeline = $this->model->create($data);\n\n        foreach ($data['stages'] as $stageData) {\n            $this->stageRepository->create(array_merge([\n                'lead_pipeline_id' => $pipeline->id,\n            ], $stageData));\n        }\n\n        return $pipeline;\n    }\n\n    /**\n     * Update pipeline.\n     *\n     * @param  int  $id\n     * @param  string  $attribute\n     * @return Pipeline\n     */\n    public function update(array $data, $id, $attribute = 'id')\n    {\n        $pipeline = $this->find($id);\n\n        if ($data['is_default'] ?? false) {\n            $this->model->query()->where('id', '<>', $id)->update(['is_default' => 0]);\n        }\n\n        $pipeline->update($data);\n\n        $previousStageIds = $pipeline->stages()->pluck('id');\n\n        foreach ($data['stages'] as $stageId => $stageData) {\n            if (Str::contains($stageId, 'stage_')) {\n                $this->stageRepository->create(array_merge([\n                    'lead_pipeline_id' => $pipeline->id,\n                ], $stageData));\n            } else {\n                if (is_numeric($index = $previousStageIds->search($stageId))) {\n                    $previousStageIds->forget($index);\n                }\n\n                $this->stageRepository->update($stageData, $stageId);\n            }\n        }\n\n        foreach ($previousStageIds as $stageId) {\n            $pipeline->leads()->where('lead_pipeline_stage_id', $stageId)->update([\n                'lead_pipeline_stage_id' => $pipeline->stages()->first()->id,\n            ]);\n\n            $this->stageRepository->delete($stageId);\n        }\n\n        return $pipeline;\n    }\n\n    /**\n     * Return the default pipeline.\n     *\n     * @return Pipeline\n     */\n    public function getDefaultPipeline()\n    {\n        $pipeline = $this->findOneByField('is_default', 1);\n\n        if (! $pipeline) {\n            $pipeline = $this->first();\n        }\n\n        return $pipeline;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Repositories/ProductRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass ProductRepository extends Repository\n{\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\Lead\\Contracts\\Product';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Repositories/SourceRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass SourceRepository extends Repository\n{\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\Lead\\Contracts\\Source';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Repositories/StageRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass StageRepository extends Repository\n{\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\Lead\\Contracts\\Stage';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Repositories/TypeRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass TypeRepository extends Repository\n{\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\Lead\\Contracts\\Type';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Lead/src/Services/MagicAIService.php",
    "content": "<?php\n\nnamespace Webkul\\Lead\\Services;\n\nuse Exception;\nuse Smalot\\PdfParser\\Parser;\n\nclass MagicAIService\n{\n    /**\n     * API endpoint for OpenRouter AI service.\n     */\n    const OPEN_ROUTER_URL = 'https://openrouter.ai/api/v1/chat/completions';\n\n    /**\n     * Maximum token limit for AI prompt.\n     */\n    const MAX_TOKENS = 100000;\n\n    /**\n     * Flag to prevent re-entrant calls.\n     */\n    private static $isExtracting = false;\n\n    /**\n     * Extract data from base64-encoded file.\n     */\n    public static function extractDataFromFile($base64File)\n    {\n        if (self::$isExtracting) {\n            throw new Exception(trans('admin::app.leads.file.recursive-call'));\n        }\n\n        self::$isExtracting = true;\n\n        try {\n            $text = self::extractTextFromBase64File($base64File);\n\n            if (empty($text)) {\n                throw new Exception(trans('admin::app.leads.file.failed-extract'));\n            }\n\n            return self::processPromptWithAI($text);\n        } catch (Exception $e) {\n            return ['error' => $e->getMessage()];\n        } finally {\n            self::$isExtracting = false;\n        }\n    }\n\n    /**\n     * Extract text from base64-encoded file.\n     */\n    private static function extractTextFromBase64File($base64File)\n    {\n        if (\n            empty($base64File)\n            || ! base64_decode($base64File, true)\n        ) {\n            throw new Exception(trans('admin::app.leads.file.invalid-base64'));\n        }\n\n        $tempFile = tempnam(sys_get_temp_dir(), 'file_');\n\n        file_put_contents($tempFile, self::handleBase64($base64File, 'decode'));\n\n        $mimeType = mime_content_type($tempFile);\n\n        $data = [];\n\n        try {\n            if ($mimeType === 'application/pdf') {\n                $pdfParser = (new Parser)->parseFile($tempFile);\n\n                $data['text'] = $pdfParser->getText();\n\n                $data['images'][] = '';\n\n                $images = $pdfParser->getObjectsByType('XObject', 'Image');\n\n                foreach ($images as $image) {\n                    $data['images'][] = self::handleBase64($image->getContent());\n                }\n            } else {\n                $data['text'] = '';\n\n                $data['images'][] = self::handleBase64(self::handleBase64($base64File, 'decode'));\n            }\n\n            if (empty($data)) {\n                throw new Exception(trans('admin::app.leads.file.data-extraction-failed'));\n            }\n\n            return $data;\n        } catch (Exception $e) {\n            throw new Exception($e->getMessage());\n        } finally {\n            @unlink($tempFile);\n        }\n    }\n\n    /**\n     * Send extracted data to AI for processing.\n     */\n    private static function processPromptWithAI($prompt)\n    {\n        $model = core()->getConfigData('general.magic_ai.settings.other_model') ?: core()->getConfigData('general.magic_ai.settings.model');\n\n        $apiKey = core()->getConfigData('general.magic_ai.settings.api_key');\n\n        if (! $apiKey || ! $model) {\n            return ['error' => trans('admin::app.leads.file.missing-api-key')];\n        }\n\n        $promptText = self::truncatePrompt($prompt['text'] ?? '');\n\n        $promptImages = $prompt['images'] ?? [];\n\n        $prompt = array_filter(array_merge([$promptText], $promptImages), function ($value) {\n            return ! empty($value);\n        });\n\n        return self::ask(array_values($prompt), $model, $apiKey);\n    }\n\n    /**\n     * Truncate prompt to fit within token limit.\n     */\n    private static function truncatePrompt($prompt)\n    {\n        if (strlen($prompt) > self::MAX_TOKENS) {\n            $start = mb_substr($prompt, 0, self::MAX_TOKENS * 0.4);\n\n            $end = mb_substr($prompt, -self::MAX_TOKENS * 0.4);\n\n            return $start.\"\\n...\\n\".$end;\n        }\n\n        return $prompt;\n    }\n\n    /**\n     * Send prompt request to AI for processing.\n     */\n    private static function ask($prompt, $model, $apiKey)\n    {\n        try {\n            $response = \\Http::withHeaders([\n                'Content-Type' => 'application/json',\n                'Authorization' => 'Bearer '.$apiKey,\n            ])->post(self::OPEN_ROUTER_URL, [\n                'model' => $model,\n                'messages' => [\n                    [\n                        'role' => 'system',\n                        'content' => self::getSystemPrompt(),\n                    ], [\n                        'role' => 'user',\n                        'content' => [\n                            [\n                                'type' => 'text',\n                                'text' => $prompt[0],\n                            ],\n                        ],\n                    ],\n                ],\n            ]);\n\n            if ($response->failed()) {\n                throw new Exception($response->body());\n            }\n\n            $data = $response->json();\n\n            if (isset($data['error'])) {\n                throw new Exception($data['error']['message']);\n            }\n\n            return $data;\n        } catch (Exception $e) {\n            return ['error' => trans('admin::app.leads.file.insufficient-info')];\n        }\n    }\n\n    /**\n     * Define system prompt for AI processing.\n     *\n     * @return string System prompt for AI model.\n     */\n    private static function getSystemPrompt()\n    {\n        return <<<'PROMPT'\n            You are an AI assistant specialized in extracting structured data from text.  \n            The user will provide text extracted from a file (in Base64 or plain text).  \n            Your task is to accurately extract the following fields. If the value is not available, use the default values provided:  \n\n            ### **Output Format:** \n            ```json\n            {\n                \"status\": 1,\n                \"title\": \"Untitled Lead\",\n                \"lead_value\": 0,\n                \"person\": {\n                    \"name\": \"Unknown\",\n                    \"emails\": {\n                        \"value\": null,\n                        \"label\": null\n                    },\n                    \"contact_numbers\": {\n                        \"value\": null,\n                        \"label\": null\n                    }\n                }\n            }\n            ```\n            ### **Fields to Extract:**\n            - **Title:** Title of the lead. Default: \"Untitled Lead\"\n            - **Lead Value:** Value of the lead. Default: 0\n            - **Person Name:** Name of the person. Default: \"Unknown\"\n            - **Person Email:** Email of the person. Default: null\n            - **Person Email Label:** Label for the email. Default: null\n            - **Person Contact Number:** Contact number of the person. Default: null\n            - **Person Contact Number Label:** Label for the contact number. Default: null\n        PROMPT;\n    }\n\n    /**\n     * process for encoding and decoding base64 data.\n     */\n    private static function handleBase64($base64, string $type = 'encode')\n    {\n        if ($type === 'encode') {\n            return base64_encode($base64);\n        }\n\n        return base64_decode($base64);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Marketing/src/Console/Commands/CampaignCommand.php",
    "content": "<?php\n\nnamespace Webkul\\Marketing\\Console\\Commands;\n\nuse Illuminate\\Console\\Command;\nuse Webkul\\Marketing\\Helpers\\Campaign;\n\nclass CampaignCommand extends Command\n{\n    /**\n     * The name and signature of the console command.\n     *\n     * @var string\n     */\n    protected $signature = 'campaign:process';\n\n    /**\n     * The console command description.\n     *\n     * @var string\n     */\n    protected $description = 'Process campaigns and send emails to the contact persons.';\n\n    /**\n     * Create a new command instance.\n     *\n     * @return void\n     */\n    public function __construct(protected Campaign $campaignHelper)\n    {\n        parent::__construct();\n    }\n\n    /**\n     * Execute the console command.\n     */\n    public function handle()\n    {\n        $this->info('🚀 Starting campaign processing...');\n\n        try {\n            $this->campaignHelper->process();\n\n            $this->info('✅ Campaign processing completed successfully!');\n        } catch (\\Exception $e) {\n            $this->error('❌ An error occurred during campaign processing: '.$e->getMessage());\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Marketing/src/Contracts/Campaign.php",
    "content": "<?php\n\nnamespace Webkul\\Marketing\\Contracts;\n\ninterface Campaign {}\n"
  },
  {
    "path": "packages/Webkul/Marketing/src/Contracts/Event.php",
    "content": "<?php\n\nnamespace Webkul\\Marketing\\Contracts;\n\ninterface Event {}\n"
  },
  {
    "path": "packages/Webkul/Marketing/src/Database/Migrations/2024_10_29_044744_create_marketing_events_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('marketing_events', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->string('description');\n            $table->date('date');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::dropIfExists('marketing_events');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Marketing/src/Database/Migrations/2024_11_04_122500_create_marketing_campaigns_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    public function up(): void\n    {\n        Schema::create('marketing_campaigns', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->string('subject');\n            $table->boolean('status')->default(0);\n            $table->string('type');\n            $table->string('mail_to');\n            $table->string('spooling')->nullable();\n            $table->unsignedInteger('marketing_template_id')->nullable();\n            $table->unsignedInteger('marketing_event_id')->nullable();\n            $table->timestamps();\n\n            $table->foreign('marketing_template_id')->references('id')->on('email_templates')->onDelete('set null');\n            $table->foreign('marketing_event_id')->references('id')->on('marketing_events')->onDelete('set null');\n        });\n    }\n\n    public function down(): void\n    {\n        Schema::dropIfExists('marketing_campaigns');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Marketing/src/Helpers/Campaign.php",
    "content": "<?php\n\nnamespace Webkul\\Marketing\\Helpers;\n\nuse Carbon\\Carbon;\nuse Illuminate\\Support\\Facades\\Mail;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\nuse Webkul\\Marketing\\Mail\\CampaignMail;\nuse Webkul\\Marketing\\Repositories\\CampaignRepository;\nuse Webkul\\Marketing\\Repositories\\EventRepository;\n\nclass Campaign\n{\n    /**\n     * Create a new helper instance.\n     *\n     *\n     * @return void\n     */\n    public function __construct(\n        protected EventRepository $eventRepository,\n        protected CampaignRepository $campaignRepository,\n        protected PersonRepository $personRepository,\n    ) {}\n\n    /**\n     * Process the email.\n     */\n    public function process(): void\n    {\n        $campaigns = $this->campaignRepository->getModel()\n            ->leftJoin('marketing_events', 'marketing_campaigns.marketing_event_id', 'marketing_events.id')\n            ->leftJoin('email_templates', 'marketing_campaigns.marketing_template_id', 'email_templates.id')\n            ->select('marketing_campaigns.*')\n            ->where('marketing_campaigns.status', 1)\n            ->where(function ($query) {\n                $query->where('marketing_events.date', Carbon::now()->format('Y-m-d'))\n                    ->orWhereNull('marketing_events.date');\n            })\n            ->get();\n\n        collect($campaigns)->each(function ($campaign) {\n            collect($this->getPersonsEmails())->each(fn ($email) => Mail::queue(new CampaignMail($email, $campaign)));\n        });\n    }\n\n    /**\n     * Get the email address.\n     */\n    private function getPersonsEmails(): array\n    {\n        return $this->personRepository->pluck('emails')\n            ->flatMap(fn ($emails) => collect($emails)->pluck('value'))\n            ->all();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Marketing/src/Mail/CampaignMail.php",
    "content": "<?php\n\nnamespace Webkul\\Marketing\\Mail;\n\nuse Illuminate\\Mail\\Mailable;\nuse Illuminate\\Mail\\Mailables\\Address;\nuse Illuminate\\Mail\\Mailables\\Content;\nuse Illuminate\\Mail\\Mailables\\Envelope;\nuse Webkul\\Marketing\\Contracts\\Campaign;\n\nclass CampaignMail extends Mailable\n{\n    /**\n     * Create a new message instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        public string $email,\n        public Campaign $campaign\n    ) {}\n\n    /**\n     * Get the message envelope.\n     */\n    public function envelope(): Envelope\n    {\n        return new Envelope(\n            to: [\n                new Address($this->email),\n            ],\n            subject: $this->campaign->subject,\n        );\n    }\n\n    /**\n     * Get the message content definition.\n     */\n    public function content(): Content\n    {\n        return new Content(\n            htmlString: $this->campaign->email_template->content,\n        );\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Marketing/src/Models/Campaign.php",
    "content": "<?php\n\nnamespace Webkul\\Marketing\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\EmailTemplate\\Models\\EmailTemplateProxy;\nuse Webkul\\Marketing\\Contracts\\Campaign as CampaignContract;\n\nclass Campaign extends Model implements CampaignContract\n{\n    /**\n     * Define the table for the model.\n     *\n     * @var string\n     */\n    protected $table = 'marketing_campaigns';\n\n    /**\n     * The attributes that are fillable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'subject',\n        'status',\n        'marketing_template_id',\n        'marketing_event_id',\n        'spooling',\n    ];\n\n    /**\n     * Get the email template\n     */\n    public function email_template()\n    {\n        return $this->belongsTo(EmailTemplateProxy::modelClass(), 'marketing_template_id');\n    }\n\n    /**\n     * Get the event\n     */\n    public function event()\n    {\n        return $this->belongsTo(EventProxy::modelClass(), 'marketing_event_id');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Marketing/src/Models/CampaignProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Marketing\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass CampaignProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Marketing/src/Models/Event.php",
    "content": "<?php\n\nnamespace Webkul\\Marketing\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Marketing\\Contracts\\Event as EventContract;\n\nclass Event extends Model implements EventContract\n{\n    /**\n     * The table associated with the model.\n     *\n     * @var string\n     */\n    protected $table = 'marketing_events';\n\n    /**\n     * The attributes that are fillable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'description',\n        'date',\n    ];\n\n    public function campaigns()\n    {\n        return $this->hasMany(CampaignProxy::modelClass(), 'marketing_event_id');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Marketing/src/Models/EventProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Marketing\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass EventProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Marketing/src/Providers/MarketingServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Marketing\\Providers;\n\nuse Illuminate\\Console\\Scheduling\\Schedule;\nuse Illuminate\\Support\\ServiceProvider;\nuse Webkul\\Marketing\\Console\\Commands\\CampaignCommand;\n\nclass MarketingServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap services.\n     */\n    public function boot(): void\n    {\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n\n        $this->callAfterResolving(Schedule::class, function (Schedule $schedule) {\n            $schedule->command('campaign:process')->daily();\n        });\n    }\n\n    /**\n     * Register services.\n     */\n    public function register(): void\n    {\n        $this->registerCommands();\n\n        $this->app->register(ModuleServiceProvider::class);\n    }\n\n    /**\n     * Register the commands.\n     */\n    private function registerCommands(): void\n    {\n        if ($this->app->runningInConsole()) {\n            $this->commands([\n                CampaignCommand::class,\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Marketing/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Marketing\\Providers;\n\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\nuse Webkul\\Marketing\\Models\\Campaign;\nuse Webkul\\Marketing\\Models\\Event;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    /**\n     * Define the module's array.\n     *\n     * @var array\n     */\n    protected $models = [\n        Event::class,\n        Campaign::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/Marketing/src/Repositories/CampaignRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Marketing\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\nuse Webkul\\Marketing\\Contracts\\Campaign;\n\nclass CampaignRepository extends Repository\n{\n    /**\n     * Specify Model class name.\n     */\n    public function model(): string\n    {\n        return Campaign::class;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Marketing/src/Repositories/EventRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Marketing\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\nuse Webkul\\Marketing\\Contracts\\Event;\n\nclass EventRepository extends Repository\n{\n    /**\n     * Specify Model class name.\n     */\n    public function model(): string\n    {\n        return Event::class;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Product/composer.json",
    "content": "{\n    \"name\": \"krayin/laravel-product\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Jitendra Singh\",\n            \"email\": \"jitendra@webkul.com\"\n        }\n    ],\n    \"require\": {\n        \"krayin/laravel-attribute\": \"^1.0\",\n        \"krayin/laravel-core\": \"^1.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Webkul\\\\Product\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"laravel\": {\n            \"providers\": [\n                \"Webkul\\\\Product\\\\Providers\\\\ProductServiceProvider\"\n            ],\n            \"aliases\": {}\n        }\n    },\n    \"minimum-stability\": \"dev\"\n}"
  },
  {
    "path": "packages/Webkul/Product/src/Contracts/Product.php",
    "content": "<?php\n\nnamespace Webkul\\Product\\Contracts;\n\ninterface Product {}\n"
  },
  {
    "path": "packages/Webkul/Product/src/Contracts/ProductInventory.php",
    "content": "<?php\n\nnamespace Webkul\\Product\\Contracts;\n\ninterface ProductInventory {}\n"
  },
  {
    "path": "packages/Webkul/Product/src/Database/Migrations/2021_04_09_065617_create_products_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('products', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('sku')->unique();\n            $table->string('name')->nullable();\n            $table->string('description')->nullable();\n            $table->integer('quantity')->default(0);\n            $table->decimal('price', 12, 4)->nullable();\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('products');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Product/src/Database/Migrations/2024_06_28_154009_create_product_inventories_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('product_inventories', function (Blueprint $table) {\n            $table->increments('id');\n            $table->integer('in_stock')->default(0);\n            $table->integer('allocated')->default(0);\n\n            $table->integer('product_id')->unsigned();\n            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');\n\n            $table->integer('warehouse_id')->unsigned()->nullable();\n            $table->foreign('warehouse_id')->references('id')->on('warehouses')->onDelete('cascade');\n\n            $table->integer('warehouse_location_id')->unsigned()->nullable();\n            $table->foreign('warehouse_location_id')->references('id')->on('warehouse_locations')->onDelete('SET NULL');\n\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::dropIfExists('product_inventories');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Product/src/Database/Migrations/2024_08_10_150329_create_product_activities_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('product_activities', function (Blueprint $table) {\n            $table->integer('activity_id')->unsigned();\n            $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade');\n\n            $table->integer('product_id')->unsigned();\n            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('product_activities');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Product/src/Database/Migrations/2024_08_10_150340_create_product_tags_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('product_tags', function (Blueprint $table) {\n            $table->integer('tag_id')->unsigned();\n            $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');\n\n            $table->integer('product_id')->unsigned();\n            $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('product_tags');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Product/src/Database/Migrations/2024_09_06_065808_alter_product_inventories_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    public function up()\n    {\n        Schema::table('product_inventories', function (Blueprint $table) {\n            $table->dropForeign(['warehouse_location_id']);\n\n            $table->foreign('warehouse_location_id')->references('id')->on('warehouse_locations')->onDelete('cascade');\n        });\n    }\n\n    public function down()\n    {\n        Schema::table('product_inventories', function (Blueprint $table) {\n            $table->dropForeign(['warehouse_location_id']);\n\n            $table->foreign('warehouse_location_id')->references('id')->on('warehouse_locations')->onDelete('set null');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Product/src/Models/Product.php",
    "content": "<?php\n\nnamespace Webkul\\Product\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Illuminate\\Database\\Eloquent\\Relations\\BelongsToMany;\nuse Illuminate\\Database\\Eloquent\\Relations\\HasMany;\nuse Webkul\\Activity\\Models\\ActivityProxy;\nuse Webkul\\Activity\\Traits\\LogsActivity;\nuse Webkul\\Attribute\\Traits\\CustomAttribute;\nuse Webkul\\Product\\Contracts\\Product as ProductContract;\nuse Webkul\\Tag\\Models\\TagProxy;\nuse Webkul\\Warehouse\\Models\\LocationProxy;\nuse Webkul\\Warehouse\\Models\\WarehouseProxy;\n\nclass Product extends Model implements ProductContract\n{\n    use CustomAttribute, LogsActivity;\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'sku',\n        'description',\n        'quantity',\n        'price',\n    ];\n\n    /**\n     * Get the product warehouses that owns the product.\n     */\n    public function warehouses(): BelongsToMany\n    {\n        return $this->belongsToMany(WarehouseProxy::modelClass(), 'product_inventories');\n    }\n\n    /**\n     * Get the product locations that owns the product.\n     */\n    public function locations(): BelongsToMany\n    {\n        return $this->belongsToMany(LocationProxy::modelClass(), 'product_inventories', 'product_id', 'warehouse_location_id');\n    }\n\n    /**\n     * Get the product inventories that owns the product.\n     */\n    public function inventories(): HasMany\n    {\n        return $this->hasMany(ProductInventoryProxy::modelClass());\n    }\n\n    /**\n     * The tags that belong to the Products.\n     */\n    public function tags()\n    {\n        return $this->belongsToMany(TagProxy::modelClass(), 'product_tags');\n    }\n\n    /**\n     * Get the activities.\n     */\n    public function activities()\n    {\n        return $this->belongsToMany(ActivityProxy::modelClass(), 'product_activities');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Product/src/Models/ProductInventory.php",
    "content": "<?php\n\nnamespace Webkul\\Product\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Casts\\Attribute;\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Illuminate\\Database\\Eloquent\\Relations\\BelongsTo;\nuse Webkul\\Product\\Contracts\\ProductInventory as ProductInventoryContract;\nuse Webkul\\Warehouse\\Models\\LocationProxy;\nuse Webkul\\Warehouse\\Models\\WarehouseProxy;\n\nclass ProductInventory extends Model implements ProductInventoryContract\n{\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'in_stock',\n        'allocated',\n        'product_id',\n        'warehouse_id',\n        'warehouse_location_id',\n    ];\n\n    /**\n     * Interact with the name.\n     */\n    protected function onHand(): Attribute\n    {\n        return Attribute::make(\n            get: fn ($value) => $this->in_stock - $this->allocated,\n            set: fn ($value) => $this->in_stock - $this->allocated\n        );\n    }\n\n    /**\n     * Get the product that owns the product inventory.\n     */\n    public function product(): BelongsTo\n    {\n        return $this->belongsTo(ProductProxy::modelClass());\n    }\n\n    /**\n     * Get the product attribute family that owns the product.\n     */\n    public function warehouse(): BelongsTo\n    {\n        return $this->belongsTo(WarehouseProxy::modelClass());\n    }\n\n    /**\n     * Get the product attribute family that owns the product.\n     */\n    public function location(): BelongsTo\n    {\n        return $this->belongsTo(LocationProxy::modelClass(), 'warehouse_location_id');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Product/src/Models/ProductInventoryProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Product\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass ProductInventoryProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Product/src/Models/ProductProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Product\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass ProductProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Product/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Product\\Providers;\n\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\nuse Webkul\\Product\\Models\\Product;\nuse Webkul\\Product\\Models\\ProductInventory;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    protected $models = [\n        Product::class,\n        ProductInventory::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/Product/src/Providers/ProductServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Product\\Providers;\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\ServiceProvider;\n\nclass ProductServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap services.\n     *\n     * @return void\n     */\n    public function boot(Router $router)\n    {\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n    }\n\n    /**\n     * Register services.\n     *\n     * @return void\n     */\n    public function register() {}\n}\n"
  },
  {
    "path": "packages/Webkul/Product/src/Repositories/ProductInventoryRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Product\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass ProductInventoryRepository extends Repository\n{\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\Product\\Contracts\\ProductInventory';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Product/src/Repositories/ProductRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Product\\Repositories;\n\nuse Illuminate\\Container\\Container;\nuse Illuminate\\Support\\Str;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Attribute\\Repositories\\AttributeValueRepository;\nuse Webkul\\Core\\Eloquent\\Repository;\nuse Webkul\\Product\\Contracts\\Product;\n\nclass ProductRepository extends Repository\n{\n    /**\n     * Searchable fields.\n     */\n    protected $fieldSearchable = [\n        'sku',\n        'name',\n        'description',\n    ];\n\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected AttributeValueRepository $attributeValueRepository,\n        protected ProductInventoryRepository $productInventoryRepository,\n        Container $container\n    ) {\n        parent::__construct($container);\n    }\n\n    /**\n     * Specify model class name.\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return Product::class;\n    }\n\n    /**\n     * Create.\n     *\n     * @return Product\n     */\n    public function create(array $data)\n    {\n        $product = parent::create($data);\n\n        $this->attributeValueRepository->save(array_merge($data, [\n            'entity_id' => $product->id,\n        ]));\n\n        return $product;\n    }\n\n    /**\n     * Update.\n     *\n     * @param  int  $id\n     * @param  array  $attribute\n     * @return Product\n     */\n    public function update(array $data, $id, $attributes = [])\n    {\n        $product = parent::update($data, $id);\n\n        /**\n         * If attributes are provided then only save the provided attributes and return.\n         */\n        if (! empty($attributes)) {\n            $conditions = ['entity_type' => $data['entity_type']];\n\n            if (isset($data['quick_add'])) {\n                $conditions['quick_add'] = 1;\n            }\n\n            $attributes = $this->attributeRepository->where($conditions)\n                ->whereIn('code', $attributes)\n                ->get();\n\n            $this->attributeValueRepository->save(array_merge($data, [\n                'entity_id' => $product->id,\n            ]), $attributes);\n\n            return $product;\n        }\n\n        $this->attributeValueRepository->save(array_merge($data, [\n            'entity_id' => $product->id,\n        ]));\n\n        return $product;\n    }\n\n    /**\n     * Save inventories.\n     *\n     * @param  int  $id\n     * @param  ?int  $warehouseId\n     * @return void\n     */\n    public function saveInventories(array $data, $id, $warehouseId = null)\n    {\n        $productInventories = $this->productInventoryRepository->where('product_id', $id);\n\n        if ($warehouseId) {\n            $productInventories = $productInventories->where('warehouse_id', $warehouseId);\n        }\n\n        $previousInventoryIds = $productInventories->pluck('id');\n\n        if (isset($data['inventories'])) {\n            foreach ($data['inventories'] as $inventoryId => $inventoryData) {\n                if (Str::contains($inventoryId, 'inventory_')) {\n                    $this->productInventoryRepository->create(array_merge($inventoryData, [\n                        'product_id' => $id,\n                        'warehouse_id' => $warehouseId,\n                    ]));\n                } else {\n                    if (is_numeric($index = $previousInventoryIds->search($inventoryId))) {\n                        $previousInventoryIds->forget($index);\n                    }\n\n                    $this->productInventoryRepository->update($inventoryData, $inventoryId);\n                }\n            }\n        }\n\n        foreach ($previousInventoryIds as $inventoryId) {\n            $this->productInventoryRepository->delete($inventoryId);\n        }\n    }\n\n    /**\n     * Retrieves customers count based on date.\n     *\n     * @return int\n     */\n    public function getProductCount($startDate, $endDate)\n    {\n        return $this\n            ->whereBetween('created_at', [$startDate, $endDate])\n            ->get()\n            ->count();\n    }\n\n    /**\n     * Get inventories grouped by warehouse.\n     *\n     * @param  int  $id\n     * @return array\n     */\n    public function getInventoriesGroupedByWarehouse($id)\n    {\n        $product = $this->findOrFail($id);\n\n        $warehouses = [];\n\n        foreach ($product->inventories as $inventory) {\n            if (! isset($warehouses[$inventory->warehouse_id])) {\n                $warehouses[$inventory->warehouse_id] = [\n                    'id' => $inventory->warehouse_id,\n                    'name' => $inventory->warehouse->name,\n                    'in_stock' => $inventory->in_stock,\n                    'allocated' => $inventory->allocated,\n                    'on_hand' => $inventory->on_hand,\n                ];\n            } else {\n                $warehouses[$inventory->warehouse_id]['in_stock'] += $inventory->in_stock;\n                $warehouses[$inventory->warehouse_id]['allocated'] += $inventory->allocated;\n                $warehouses[$inventory->warehouse_id]['on_hand'] += $inventory->on_hand;\n            }\n\n            $warehouses[$inventory->warehouse_id]['locations'][] = [\n                'id' => $inventory->warehouse_location_id,\n                'name' => $inventory->location->name,\n                'in_stock' => $inventory->in_stock,\n                'allocated' => $inventory->allocated,\n                'on_hand' => $inventory->on_hand,\n            ];\n        }\n\n        return $warehouses;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Quote/src/Contracts/Quote.php",
    "content": "<?php\n\nnamespace Webkul\\Quote\\Contracts;\n\ninterface Quote {}\n"
  },
  {
    "path": "packages/Webkul/Quote/src/Contracts/QuoteItem.php",
    "content": "<?php\n\nnamespace Webkul\\Quote\\Contracts;\n\ninterface QuoteItem {}\n"
  },
  {
    "path": "packages/Webkul/Quote/src/Database/Migrations/2021_07_01_230345_create_quotes_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('quotes', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('subject');\n            $table->string('description')->nullable();\n\n            $table->json('billing_address')->nullable();\n            $table->json('shipping_address')->nullable();\n\n            $table->decimal('discount_percent', 12, 4)->default(0)->nullable();\n            $table->decimal('discount_amount', 12, 4)->nullable();\n            $table->decimal('tax_amount', 12, 4)->nullable();\n            $table->decimal('adjustment_amount', 12, 4)->nullable();\n            $table->decimal('sub_total', 12, 4)->nullable();\n            $table->decimal('grand_total', 12, 4)->nullable();\n\n            $table->datetime('expired_at')->nullable();\n\n            $table->integer('person_id')->unsigned();\n            $table->foreign('person_id')->references('id')->on('persons')->onDelete('cascade');\n\n            $table->integer('user_id')->unsigned();\n            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');\n\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('quotes');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Quote/src/Database/Migrations/2021_07_01_231317_create_quote_items_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('quote_items', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('sku')->nullable();\n            $table->string('name')->nullable();\n            $table->integer('quantity')->default(0)->nullable();\n            $table->decimal('price', 12, 4)->default(0);\n\n            $table->string('coupon_code')->nullable();\n            $table->decimal('discount_percent', 12, 4)->default(0)->nullable();\n            $table->decimal('discount_amount', 12, 4)->default(0)->nullable();\n\n            $table->decimal('tax_percent', 12, 4)->default(0)->nullable();\n            $table->decimal('tax_amount', 12, 4)->default(0)->nullable();\n\n            $table->decimal('total', 12, 4)->default(0);\n\n            $table->integer('product_id')->unsigned();\n            $table->integer('quote_id')->unsigned();\n            $table->foreign('quote_id')->references('id')->on('quotes')->onDelete('cascade');\n\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('quote_items');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Quote/src/Models/Quote.php",
    "content": "<?php\n\nnamespace Webkul\\Quote\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Attribute\\Traits\\CustomAttribute;\nuse Webkul\\Contact\\Models\\PersonProxy;\nuse Webkul\\Lead\\Models\\LeadProxy;\nuse Webkul\\Quote\\Contracts\\Quote as QuoteContract;\nuse Webkul\\User\\Models\\UserProxy;\n\nclass Quote extends Model implements QuoteContract\n{\n    use CustomAttribute;\n\n    protected $table = 'quotes';\n\n    protected $casts = [\n        'billing_address' => 'array',\n        'shipping_address' => 'array',\n        'expired_at' => 'datetime',\n    ];\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'subject',\n        'description',\n        'billing_address',\n        'shipping_address',\n        'discount_percent',\n        'discount_amount',\n        'tax_amount',\n        'adjustment_amount',\n        'sub_total',\n        'grand_total',\n        'expired_at',\n        'user_id',\n        'person_id',\n    ];\n\n    /**\n     * Get the quote items record associated with the quote.\n     */\n    public function items()\n    {\n        return $this->hasMany(QuoteItemProxy::modelClass());\n    }\n\n    /**\n     * Get the user that owns the quote.\n     */\n    public function user()\n    {\n        return $this->belongsTo(UserProxy::modelClass());\n    }\n\n    /**\n     * Get the person that owns the quote.\n     */\n    public function person()\n    {\n        return $this->belongsTo(PersonProxy::modelClass());\n    }\n\n    /**\n     * The leads that belong to the quote.\n     */\n    public function leads()\n    {\n        return $this->belongsToMany(LeadProxy::modelClass(), 'lead_quotes');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Quote/src/Models/QuoteItem.php",
    "content": "<?php\n\nnamespace Webkul\\Quote\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Quote\\Contracts\\QuoteItem as QuoteItemContract;\n\nclass QuoteItem extends Model implements QuoteItemContract\n{\n    protected $table = 'quote_items';\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'sku',\n        'name',\n        'quantity',\n        'price',\n        'coupon_code',\n        'discount_percent',\n        'discount_amount',\n        'tax_percent',\n        'tax_amount',\n        'total',\n        'product_id',\n        'quote_id',\n    ];\n\n    /**\n     * Get the quote record associated with the quote item.\n     */\n    public function quote()\n    {\n        return $this->belongsTo(QuoteProxy::modelClass());\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Quote/src/Models/QuoteItemProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Quote\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass QuoteItemProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Quote/src/Models/QuoteProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Quote\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass QuoteProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Quote/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Quote\\Providers;\n\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\nuse Webkul\\Quote\\Models\\Quote;\nuse Webkul\\Quote\\Models\\QuoteItem;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    protected $models = [\n        Quote::class,\n        QuoteItem::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/Quote/src/Providers/QuoteServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Quote\\Providers;\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\ServiceProvider;\n\nclass QuoteServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap services.\n     *\n     * @return void\n     */\n    public function boot(Router $router)\n    {\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n    }\n\n    /**\n     * Register services.\n     *\n     * @return void\n     */\n    public function register() {}\n}\n"
  },
  {
    "path": "packages/Webkul/Quote/src/Repositories/QuoteItemRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Quote\\Repositories;\n\nuse Illuminate\\Container\\Container;\nuse Webkul\\Core\\Eloquent\\Repository;\nuse Webkul\\Product\\Repositories\\ProductRepository;\nuse Webkul\\Quote\\Contracts\\QuoteItem;\n\nclass QuoteItemRepository extends Repository\n{\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected ProductRepository $productRepository,\n        Container $container\n    ) {\n        parent::__construct($container);\n    }\n\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\Quote\\Contracts\\QuoteItem';\n    }\n\n    /**\n     * @return mixed\n     */\n    public function create(array $data)\n    {\n        if (empty($data['product_id'])) {\n            return null;\n        }\n\n        $product = $this->productRepository->findOrFail($data['product_id']);\n\n        $quoteItem = parent::create(array_merge($data, [\n            'sku' => $product->sku,\n            'name' => $product->name,\n        ]));\n\n        return $quoteItem;\n    }\n\n    /**\n     * @param  int  $id\n     * @param  string  $attribute\n     * @return QuoteItem\n     */\n    public function update(array $data, $id, $attribute = 'id')\n    {\n        $product = $this->productRepository->findOrFail($data['product_id']);\n\n        $quoteItem = parent::update(array_merge($data, [\n            'sku' => $product->sku,\n            'name' => $product->name,\n        ]), $id);\n\n        return $quoteItem;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Quote/src/Repositories/QuoteRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Quote\\Repositories;\n\nuse Illuminate\\Container\\Container;\nuse Illuminate\\Support\\Str;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Attribute\\Repositories\\AttributeValueRepository;\nuse Webkul\\Core\\Eloquent\\Repository;\nuse Webkul\\Quote\\Contracts\\Quote;\n\nclass QuoteRepository extends Repository\n{\n    /**\n     * Searchable fields.\n     */\n    protected $fieldSearchable = [\n        'subject',\n        'description',\n        'person_id',\n        'person.name',\n        'user_id',\n        'user.name',\n    ];\n\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected AttributeValueRepository $attributeValueRepository,\n        protected QuoteItemRepository $quoteItemRepository,\n        Container $container\n    ) {\n        parent::__construct($container);\n    }\n\n    /**\n     * Specify model class name.\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return Quote::class;\n    }\n\n    /**\n     * Create.\n     *\n     * @return Quote\n     */\n    public function create(array $data)\n    {\n        $quote = parent::create($data);\n\n        $this->attributeValueRepository->save(array_merge($data, [\n            'entity_id' => $quote->id,\n        ]));\n\n        foreach ($data['items'] as $itemData) {\n            $this->quoteItemRepository->create(array_merge($itemData, [\n                'quote_id' => $quote->id,\n            ]));\n        }\n\n        return $quote;\n    }\n\n    /**\n     * Update.\n     *\n     * @param  int  $id\n     * @param  array  $attribute\n     * @return Quote\n     */\n    public function update(array $data, $id, $attributes = [])\n    {\n        $quote = $this->find($id);\n\n        parent::update($data, $id);\n\n        /**\n         * If attributes are provided then only save the provided attributes and return.\n         */\n        if (! empty($attributes)) {\n            $conditions = ['entity_type' => $data['entity_type']];\n\n            if (isset($data['quick_add'])) {\n                $conditions['quick_add'] = 1;\n            }\n\n            $attributes = $this->attributeRepository->where($conditions)\n                ->whereIn('code', $attributes)\n                ->get();\n\n            $this->attributeValueRepository->save(array_merge($data, [\n                'entity_id' => $quote->id,\n            ]), $attributes);\n\n            return $quote;\n        }\n\n        $this->attributeValueRepository->save(array_merge($data, [\n            'entity_id' => $quote->id,\n        ]));\n\n        $previousItemIds = $quote->items->pluck('id');\n\n        if (isset($data['items'])) {\n            foreach ($data['items'] as $itemId => $itemData) {\n                if (Str::contains($itemId, 'item_')) {\n                    $this->quoteItemRepository->create(array_merge($itemData, [\n                        'quote_id' => $id,\n                    ]));\n                } else {\n                    if (is_numeric($index = $previousItemIds->search($itemId))) {\n                        $previousItemIds->forget($index);\n                    }\n\n                    $this->quoteItemRepository->update($itemData, $itemId);\n                }\n            }\n        }\n\n        foreach ($previousItemIds as $itemId) {\n            $this->quoteItemRepository->delete($itemId);\n        }\n\n        return $quote;\n    }\n\n    /**\n     * Retrieves customers count based on date.\n     *\n     * @return number\n     */\n    public function getQuotesCount($startDate, $endDate)\n    {\n        return $this\n            ->whereBetween('created_at', [$startDate, $endDate])\n            ->get()\n            ->count();\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Tag/composer.json",
    "content": "{\n    \"name\": \"krayin/laravel-tag\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Jitendra Singh\",\n            \"email\": \"jitendra@webkul.com\"\n        }\n    ],\n    \"require\": {\n        \"krayin/laravel-core\": \"^1.0\",\n        \"krayin/laravel-user\": \"^1.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Webkul\\\\Tag\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"laravel\": {\n            \"providers\": [\n                \"Webkul\\\\Tag\\\\Providers\\\\TagServiceProvider\"\n            ],\n            \"aliases\": {}\n        }\n    },\n    \"minimum-stability\": \"dev\"\n}"
  },
  {
    "path": "packages/Webkul/Tag/src/Contracts/Tag.php",
    "content": "<?php\n\nnamespace Webkul\\Tag\\Contracts;\n\ninterface Tag {}\n"
  },
  {
    "path": "packages/Webkul/Tag/src/Database/Migrations/2021_05_20_141230_create_tags_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('tags', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->string('color')->nullable();\n\n            $table->integer('user_id')->unsigned();\n            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');\n\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('tags');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Tag/src/Models/Tag.php",
    "content": "<?php\n\nnamespace Webkul\\Tag\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Tag\\Contracts\\Tag as TagContract;\nuse Webkul\\User\\Models\\UserProxy;\n\nclass Tag extends Model implements TagContract\n{\n    protected $table = 'tags';\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'color',\n        'user_id',\n    ];\n\n    /**\n     * Get the user that owns the tag.\n     */\n    public function user()\n    {\n        return $this->belongsTo(UserProxy::modelClass());\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Tag/src/Models/TagProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Tag\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass TagProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Tag/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Tag\\Providers;\n\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\nuse Webkul\\Tag\\Models\\Tag;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    protected $models = [\n        Tag::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/Tag/src/Providers/TagServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Tag\\Providers;\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\ServiceProvider;\n\nclass TagServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap services.\n     *\n     * @return void\n     */\n    public function boot(Router $router)\n    {\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n    }\n\n    /**\n     * Register services.\n     *\n     * @return void\n     */\n    public function register() {}\n}\n"
  },
  {
    "path": "packages/Webkul/Tag/src/Repositories/TagRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Tag\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass TagRepository extends Repository\n{\n    /**\n     * Searchable fields\n     */\n    protected $fieldSearchable = [\n        'name',\n        'color',\n        'user_id',\n    ];\n\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\Tag\\Contracts\\Tag';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/User/.gitignore",
    "content": "/node_modules"
  },
  {
    "path": "packages/Webkul/User/composer.json",
    "content": "{\n    \"name\": \"krayin/laravel-user\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Jitendra Singh\",\n            \"email\": \"jitendra@webkul.com\"\n        }\n    ],\n    \"require\": {\n        \"krayin/laravel-core\": \"^1.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Webkul\\\\User\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"laravel\": {\n            \"providers\": [\n                \"Webkul\\\\User\\\\Providers\\\\UserServiceProvider\"\n            ],\n            \"aliases\": {}\n        }\n    },\n    \"minimum-stability\": \"dev\"\n}"
  },
  {
    "path": "packages/Webkul/User/src/Contracts/Group.php",
    "content": "<?php\n\nnamespace Webkul\\User\\Contracts;\n\ninterface Group {}\n"
  },
  {
    "path": "packages/Webkul/User/src/Contracts/Role.php",
    "content": "<?php\n\nnamespace Webkul\\User\\Contracts;\n\ninterface Role {}\n"
  },
  {
    "path": "packages/Webkul/User/src/Contracts/User.php",
    "content": "<?php\n\nnamespace Webkul\\User\\Contracts;\n\ninterface User {}\n"
  },
  {
    "path": "packages/Webkul/User/src/Database/Migrations/.gitkeep",
    "content": ""
  },
  {
    "path": "packages/Webkul/User/src/Database/Migrations/2021_03_12_074578_create_groups_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('groups', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->string('description')->nullable();\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('groups');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/User/src/Database/Migrations/2021_03_12_074597_create_roles_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('roles', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->string('description')->nullable();\n            $table->string('permission_type');\n            $table->json('permissions')->nullable();\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('roles');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/User/src/Database/Migrations/2021_03_12_074857_create_users_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('users', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->string('email')->unique();\n            $table->string('password')->nullable();\n            $table->boolean('status')->default(0);\n            $table->integer('role_id')->unsigned();\n            $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');\n            $table->rememberToken();\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('users');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/User/src/Database/Migrations/2021_03_12_074867_create_user_groups_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('user_groups', function (Blueprint $table) {\n            $table->integer('group_id')->unsigned();\n            $table->foreign('group_id')->references('id')->on('groups')->onDelete('cascade');\n\n            $table->integer('user_id')->unsigned();\n            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('user_groups');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/User/src/Database/Migrations/2021_03_12_074957_create_user_password_resets_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('user_password_resets', function (Blueprint $table) {\n            $table->string('email')->index();\n            $table->string('token');\n            $table->timestamp('created_at')->nullable();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('user_password_resets');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/User/src/Database/Migrations/2021_09_22_194622_add_unique_index_to_name_in_groups_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::table('groups', function (Blueprint $table) {\n            $table->unique('name');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::table('groups', function (Blueprint $table) {\n            $table->dropUnique('groups_name_unique');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/User/src/Database/Migrations/2021_11_12_171510_add_image_column_in_users_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::table('users', function (Blueprint $table) {\n            $table->string('image')->nullable();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::table('users', function (Blueprint $table) {\n            $table->dropColumn('image');\n        });\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/User/src/Models/Group.php",
    "content": "<?php\n\nnamespace Webkul\\User\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\User\\Contracts\\Group as GroupContract;\n\nclass Group extends Model implements GroupContract\n{\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'description',\n    ];\n\n    /**\n     * The users that belong to the group.\n     */\n    public function users()\n    {\n        return $this->belongsToMany(UserProxy::modelClass(), 'user_groups');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/User/src/Models/GroupProxy.php",
    "content": "<?php\n\nnamespace Webkul\\User\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass GroupProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/User/src/Models/Role.php",
    "content": "<?php\n\nnamespace Webkul\\User\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\User\\Contracts\\Role as RoleContract;\n\nclass Role extends Model implements RoleContract\n{\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'description',\n        'permission_type',\n        'permissions',\n    ];\n\n    protected $casts = [\n        'permissions' => 'array',\n    ];\n\n    /**\n     * Get the users.\n     */\n    public function users()\n    {\n        return $this->hasMany(UserProxy::modelClass());\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/User/src/Models/RoleProxy.php",
    "content": "<?php\n\nnamespace Webkul\\User\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass RoleProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/User/src/Models/User.php",
    "content": "<?php\n\nnamespace Webkul\\User\\Models;\n\nuse Illuminate\\Foundation\\Auth\\User as Authenticatable;\nuse Illuminate\\Notifications\\Notifiable;\nuse Illuminate\\Support\\Facades\\Storage;\nuse Laravel\\Sanctum\\HasApiTokens;\nuse Webkul\\User\\Contracts\\User as UserContract;\n\nclass User extends Authenticatable implements UserContract\n{\n    use HasApiTokens, Notifiable;\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'email',\n        'image',\n        'password',\n        'api_token',\n        'role_id',\n        'status',\n        'view_permission',\n    ];\n\n    /**\n     * The attributes that should be hidden for arrays.\n     *\n     * @var array\n     */\n    protected $hidden = [\n        'password',\n        'api_token',\n        'remember_token',\n    ];\n\n    /**\n     * Get image url for the product image.\n     */\n    public function image_url()\n    {\n        if (! $this->image) {\n            return;\n        }\n\n        return Storage::url($this->image);\n    }\n\n    /**\n     * Get image url for the product image.\n     */\n    public function getImageUrlAttribute()\n    {\n        return $this->image_url();\n    }\n\n    /**\n     * @return array\n     */\n    public function toArray()\n    {\n        $array = parent::toArray();\n\n        $array['image_url'] = $this->image_url;\n\n        return $array;\n    }\n\n    /**\n     * Get the role that owns the user.\n     */\n    public function role()\n    {\n        return $this->belongsTo(RoleProxy::modelClass());\n    }\n\n    /**\n     * The groups that belong to the user.\n     */\n    public function groups()\n    {\n        return $this->belongsToMany(GroupProxy::modelClass(), 'user_groups');\n    }\n\n    /**\n     * Checks if user has permission to perform certain action.\n     *\n     * @param  string  $permission\n     * @return bool\n     */\n    public function hasPermission($permission)\n    {\n        if ($this->role->permission_type == 'custom' && ! $this->role->permissions) {\n            return false;\n        }\n\n        return in_array($permission, $this->role->permissions);\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/User/src/Models/UserProxy.php",
    "content": "<?php\n\nnamespace Webkul\\User\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass UserProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/User/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\User\\Providers;\n\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\nuse Webkul\\User\\Models\\Group;\nuse Webkul\\User\\Models\\Role;\nuse Webkul\\User\\Models\\User;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    protected $models = [\n        Group::class,\n        Role::class,\n        User::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/User/src/Providers/UserServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\User\\Providers;\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\ServiceProvider;\n\nclass UserServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap services.\n     *\n     * @return void\n     */\n    public function boot(Router $router)\n    {\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n    }\n\n    /**\n     * Register services.\n     *\n     * @return void\n     */\n    public function register() {}\n}\n"
  },
  {
    "path": "packages/Webkul/User/src/Repositories/GroupRepository.php",
    "content": "<?php\n\nnamespace Webkul\\User\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass GroupRepository extends Repository\n{\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\User\\Contracts\\Group';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/User/src/Repositories/RoleRepository.php",
    "content": "<?php\n\nnamespace Webkul\\User\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass RoleRepository extends Repository\n{\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\User\\Contracts\\Role';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/User/src/Repositories/UserRepository.php",
    "content": "<?php\n\nnamespace Webkul\\User\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass UserRepository extends Repository\n{\n    /**\n     * Searchable fields\n     */\n    protected $fieldSearchable = [\n        'name',\n        'email',\n        'status',\n        'view_permission',\n        'role_id',\n    ];\n\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\User\\Contracts\\User';\n    }\n\n    /**\n     * This function will return user ids of current user's groups\n     *\n     * @return array\n     */\n    public function getCurrentUserGroupsUserIds()\n    {\n        $userIds = $this->scopeQuery(function ($query) {\n            return $query->select('users.*')\n                ->leftJoin('user_groups', 'users.id', '=', 'user_groups.user_id')\n                ->leftJoin('groups', 'user_groups.group_id', 'groups.id')\n                ->whereIn('groups.id', auth()->guard('user')->user()->groups()->pluck('id'));\n        })->get()->pluck('id')->toArray();\n\n        return $userIds;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Warehouse/src/Contracts/Location.php",
    "content": "<?php\n\nnamespace Webkul\\Warehouse\\Contracts;\n\ninterface Location {}\n"
  },
  {
    "path": "packages/Webkul/Warehouse/src/Contracts/Warehouse.php",
    "content": "<?php\n\nnamespace Webkul\\Warehouse\\Contracts;\n\ninterface Warehouse {}\n"
  },
  {
    "path": "packages/Webkul/Warehouse/src/Database/Migrations/2024_06_21_160707_create_warehouses_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('warehouses', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n            $table->text('description')->nullable();\n            $table->string('contact_name');\n            $table->json('contact_emails');\n            $table->json('contact_numbers');\n            $table->json('contact_address');\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::dropIfExists('warehouses');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Warehouse/src/Database/Migrations/2024_06_21_160735_create_warehouse_locations_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     */\n    public function up(): void\n    {\n        Schema::create('warehouse_locations', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name');\n\n            $table->integer('warehouse_id')->unsigned();\n            $table->foreign('warehouse_id')->references('id')->on('warehouses')->onDelete('cascade');\n\n            $table->unique(['warehouse_id', 'name']);\n\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     */\n    public function down(): void\n    {\n        Schema::dropIfExists('warehouse_locations');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Warehouse/src/Database/Migrations/2024_08_10_100329_create_warehouse_activities_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('warehouse_activities', function (Blueprint $table) {\n            $table->integer('activity_id')->unsigned();\n            $table->foreign('activity_id')->references('id')->on('activities')->onDelete('cascade');\n\n            $table->integer('warehouse_id')->unsigned();\n            $table->foreign('warehouse_id')->references('id')->on('warehouses')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('warehouse_activities');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Warehouse/src/Database/Migrations/2024_08_10_100340_create_warehouse_tags_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('warehouse_tags', function (Blueprint $table) {\n            $table->integer('tag_id')->unsigned();\n            $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');\n\n            $table->integer('warehouse_id')->unsigned();\n            $table->foreign('warehouse_id')->references('id')->on('warehouses')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('warehouse_tags');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/Warehouse/src/Models/Location.php",
    "content": "<?php\n\nnamespace Webkul\\Warehouse\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Warehouse\\Contracts\\Location as LocationContract;\n\nclass Location extends Model implements LocationContract\n{\n    /**\n     * The table associated with the model.\n     */\n    protected $table = 'warehouse_locations';\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'warehouse_id',\n    ];\n\n    /**\n     * Get the warehouse that owns the location.\n     */\n    public function warehouse()\n    {\n        return $this->belongsTo(WarehouseProxy::modelClass());\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Warehouse/src/Models/LocationProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Warehouse\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass LocationProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Warehouse/src/Models/Warehouse.php",
    "content": "<?php\n\nnamespace Webkul\\Warehouse\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Activity\\Models\\ActivityProxy;\nuse Webkul\\Activity\\Traits\\LogsActivity;\nuse Webkul\\Attribute\\Traits\\CustomAttribute;\nuse Webkul\\Tag\\Models\\TagProxy;\nuse Webkul\\Warehouse\\Contracts\\Warehouse as WarehouseContract;\n\nclass Warehouse extends Model implements WarehouseContract\n{\n    use CustomAttribute, LogsActivity;\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'description',\n        'contact_name',\n        'contact_emails',\n        'contact_numbers',\n        'contact_address',\n    ];\n\n    /**\n     * The attributes that are castable.\n     *\n     * @var array\n     */\n    protected $casts = [\n        'contact_emails' => 'array',\n        'contact_numbers' => 'array',\n        'contact_address' => 'array',\n    ];\n\n    /**\n     * Get the locations for the warehouse.\n     */\n    public function locations()\n    {\n        return $this->hasMany(LocationProxy::modelClass());\n    }\n\n    /**\n     * The tags that belong to the lead.\n     */\n    public function tags()\n    {\n        return $this->belongsToMany(TagProxy::modelClass(), 'warehouse_tags');\n    }\n\n    /**\n     * Get the activities.\n     */\n    public function activities()\n    {\n        return $this->belongsToMany(ActivityProxy::modelClass(), 'warehouse_activities');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Warehouse/src/Models/WarehouseProxy.php",
    "content": "<?php\n\nnamespace Webkul\\Warehouse\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass WarehouseProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/Warehouse/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Warehouse\\Providers;\n\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\nuse Webkul\\Warehouse\\Models\\Location;\nuse Webkul\\Warehouse\\Models\\Warehouse;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    protected $models = [\n        Location::class,\n        Warehouse::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/Warehouse/src/Providers/WarehouseServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\Warehouse\\Providers;\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\ServiceProvider;\n\nclass WarehouseServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap services.\n     *\n     * @return void\n     */\n    public function boot(Router $router)\n    {\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n    }\n\n    /**\n     * Register services.\n     *\n     * @return void\n     */\n    public function register() {}\n}\n"
  },
  {
    "path": "packages/Webkul/Warehouse/src/Repositories/LocationRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Warehouse\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass LocationRepository extends Repository\n{\n    /**\n     * Searchable fields\n     */\n    protected $fieldSearchable = [\n        'name',\n        'warehouse_id',\n    ];\n\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\Warehouse\\Contracts\\Location';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/Warehouse/src/Repositories/WarehouseRepository.php",
    "content": "<?php\n\nnamespace Webkul\\Warehouse\\Repositories;\n\nuse Illuminate\\Container\\Container;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Attribute\\Repositories\\AttributeValueRepository;\nuse Webkul\\Core\\Eloquent\\Repository;\nuse Webkul\\Warehouse\\Contracts\\Warehouse;\n\nclass WarehouseRepository extends Repository\n{\n    /**\n     * Searchable fields.\n     */\n    protected $fieldSearchable = [\n        'name',\n        'contact_name',\n        'contact_emails',\n        'contact_numbers',\n        'contact_address',\n    ];\n\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected AttributeValueRepository $attributeValueRepository,\n        Container $container\n    ) {\n        parent::__construct($container);\n    }\n\n    /**\n     * Specify model class name.\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return Warehouse::class;\n    }\n\n    /**\n     * Create.\n     *\n     * @return Warehouse\n     */\n    public function create(array $data)\n    {\n        $warehouse = parent::create($data);\n\n        $this->attributeValueRepository->save(array_merge($data, [\n            'entity_id' => $warehouse->id,\n        ]));\n\n        return $warehouse;\n    }\n\n    /**\n     * Update.\n     *\n     * @param  int  $id\n     * @param  array  $attribute\n     * @return Warehouse\n     */\n    public function update(array $data, $id, $attributes = [])\n    {\n        $warehouse = parent::update($data, $id);\n\n        /**\n         * If attributes are provided then only save the provided attributes and return.\n         */\n        if (! empty($attributes)) {\n            $conditions = ['entity_type' => $data['entity_type']];\n\n            if (isset($data['quick_add'])) {\n                $conditions['quick_add'] = 1;\n            }\n\n            $attributes = $this->attributeRepository->where($conditions)\n                ->whereIn('code', $attributes)\n                ->get();\n\n            $this->attributeValueRepository->save(array_merge($data, [\n                'entity_id' => $warehouse->id,\n            ]), $attributes);\n\n            return $warehouse;\n        }\n\n        $this->attributeValueRepository->save(array_merge($data, [\n            'entity_id' => $warehouse->id,\n        ]));\n\n        return $warehouse;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/WebForm/.gitignore",
    "content": "/node_modules\n/package-lock.json\nnpm-debug.log"
  },
  {
    "path": "packages/Webkul/WebForm/composer.json",
    "content": "{\n    \"name\": \"krayin/laravel-webform\",\n    \"license\": \"MIT\",\n    \"authors\": [\n        {\n            \"name\": \"Jitendra Singh\",\n            \"email\": \"jitendra@webkul.com\"\n        }\n    ],\n    \"require\": {},\n    \"autoload\": {\n        \"psr-4\": {\n            \"Webkul\\\\WebForm\\\\\": \"src/\"\n        }\n    },\n    \"extra\": {\n        \"laravel\": {\n            \"providers\": [\n                \"Webkul\\\\WebForm\\\\Providers\\\\WebFormServiceProvider\"\n            ],\n            \"aliases\": {}\n        }\n    },\n    \"minimum-stability\": \"dev\"\n}"
  },
  {
    "path": "packages/Webkul/WebForm/package.json",
    "content": "{\n    \"private\": true,\n    \"scripts\": {\n      \"dev\": \"vite\",\n      \"build\": \"vite build\"\n    },\n    \"devDependencies\": {\n      \"autoprefixer\": \"^10.4.16\",\n      \"axios\": \"^1.6.4\",\n      \"laravel-vite-plugin\": \"^0.7.2\",\n      \"postcss\": \"^8.4.23\",\n      \"tailwindcss\": \"^3.3.2\",\n      \"vite\": \"^4.0.0\",\n      \"vue\": \"^3.4.19\"\n    },\n    \"dependencies\": {\n      \"@vee-validate/i18n\": \"^4.9.1\",\n      \"@vee-validate/rules\": \"^4.9.1\",\n      \"@vitejs/plugin-vue\": \"^4.2.3\",\n      \"mitt\": \"^3.0.0\",\n      \"vee-validate\": \"^4.9.1\",\n      \"vue-flatpickr\": \"^2.3.0\"\n    }\n  }"
  },
  {
    "path": "packages/Webkul/WebForm/postcss.config.js",
    "content": "module.exports = {\n  plugins: {\n    tailwindcss: {},\n    autoprefixer: {},\n  },\n}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Config/acl.php",
    "content": "<?php\n\nreturn [\n    [\n        'key' => 'settings.other_settings.web_forms',\n        'name' => 'web_form::app.acl.title',\n        'route' => 'admin.settings.web_forms.index',\n        'sort' => 1,\n    ], [\n        'key' => 'settings.other_settings.web_forms.view',\n        'name' => 'web_form::app.acl.view',\n        'route' => 'admin.settings.web_forms.view',\n        'sort' => 1,\n    ], [\n        'key' => 'settings.other_settings.web_forms.create',\n        'name' => 'web_form::app.acl.create',\n        'route' => ['admin.settings.web_forms.create', 'admin.settings.web_forms.store'],\n        'sort' => 2,\n    ], [\n        'key' => 'settings.other_settings.web_forms.edit',\n        'name' => 'web_form::app.acl.edit',\n        'route' => ['admin.settings.web_forms.edit', 'admin.settings.web_forms.update'],\n        'sort' => 3,\n    ], [\n        'key' => 'settings.other_settings.web_forms.delete',\n        'name' => 'web_form::app.acl.delete',\n        'route' => 'admin.settings.web_forms.delete',\n        'sort' => 4,\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Config/menu.php",
    "content": "<?php\n\nreturn [\n    [\n        'key' => 'settings.other_settings.web_forms',\n        'name' => 'web_form::app.menu.title',\n        'info' => 'web_form::app.menu.title-info',\n        'route' => 'admin.settings.web_forms.index',\n        'sort' => 1,\n        'icon-class' => 'icon-settings-webforms',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Contracts/WebForm.php",
    "content": "<?php\n\nnamespace Webkul\\WebForm\\Contracts;\n\ninterface WebForm {}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Contracts/WebFormAttribute.php",
    "content": "<?php\n\nnamespace Webkul\\WebForm\\Contracts;\n\ninterface WebFormAttribute {}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/DataGrids/WebFormDataGrid.php",
    "content": "<?php\n\nnamespace Webkul\\WebForm\\DataGrids;\n\nuse Illuminate\\Contracts\\Database\\Query\\Builder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Webkul\\DataGrid\\DataGrid;\n\nclass WebFormDataGrid extends DataGrid\n{\n    /**\n     * Prepare query builder.\n     */\n    public function prepareQueryBuilder(): Builder\n    {\n        $queryBuilder = DB::table('web_forms')\n            ->addSelect(\n                'web_forms.id',\n                'web_forms.title',\n            );\n\n        $this->addFilter('id', 'web_forms.id');\n\n        return $queryBuilder;\n    }\n\n    /**\n     * Prepare columns.\n     */\n    public function prepareColumns(): void\n    {\n        $this->addColumn([\n            'index' => 'id',\n            'label' => trans('admin::app.settings.webforms.index.datagrid.id'),\n            'type' => 'string',\n            'sortable' => true,\n        ]);\n\n        $this->addColumn([\n            'index' => 'title',\n            'label' => trans('admin::app.settings.webforms.index.datagrid.title'),\n            'type' => 'string',\n            'sortable' => true,\n            'searchable' => true,\n            'filterable' => true,\n        ]);\n    }\n\n    /**\n     * Prepare actions.\n     */\n    public function prepareActions(): void\n    {\n        if (bouncer()->hasPermission('settings.other_settings.web_forms.view')) {\n            $this->addAction([\n                'index' => 'view',\n                'icon' => 'icon-eye',\n                'title' => trans('admin::app.settings.webforms.index.datagrid.view'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.settings.web_forms.view', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.other_settings.web_forms.edit')) {\n            $this->addAction([\n                'index' => 'edit',\n                'icon' => 'icon-edit',\n                'title' => trans('admin::app.settings.webforms.index.datagrid.edit'),\n                'method' => 'GET',\n                'url' => fn ($row) => route('admin.settings.web_forms.edit', $row->id),\n            ]);\n        }\n\n        if (bouncer()->hasPermission('settings.other_settings.web_forms.delete')) {\n            $this->addAction([\n                'index' => 'delete',\n                'icon' => 'icon-delete',\n                'title' => trans('admin::app.settings.webforms.index.datagrid.delete'),\n                'method' => 'DELETE',\n                'url' => fn ($row) => route('admin.settings.web_forms.delete', $row->id),\n            ]);\n        }\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Database/Migrations/2021_12_14_213049_create_web_forms_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('web_forms', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('form_id')->unique();\n            $table->string('title');\n            $table->text('description')->nullable();\n            $table->text('submit_button_label');\n            $table->string('submit_success_action');\n            $table->string('submit_success_content');\n            $table->boolean('create_lead')->default(0);\n            $table->string('background_color')->nullable();\n            $table->string('form_background_color')->nullable();\n            $table->string('form_title_color')->nullable();\n            $table->string('form_submit_button_color')->nullable();\n            $table->string('attribute_label_color')->nullable();\n            $table->timestamps();\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('web_forms');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Database/Migrations/2021_12_14_214923_create_web_form_attributes_table.php",
    "content": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\Schema;\n\nreturn new class extends Migration\n{\n    /**\n     * Run the migrations.\n     *\n     * @return void\n     */\n    public function up()\n    {\n        Schema::create('web_form_attributes', function (Blueprint $table) {\n            $table->increments('id');\n            $table->string('name')->nullable();\n            $table->string('placeholder')->nullable();\n            $table->boolean('is_required')->default(0);\n            $table->boolean('is_hidden')->default(0);\n            $table->integer('sort_order')->nullable();\n\n            $table->integer('attribute_id')->unsigned();\n            $table->foreign('attribute_id')->references('id')->on('attributes')->onDelete('cascade');\n\n            $table->integer('web_form_id')->unsigned();\n            $table->foreign('web_form_id')->references('id')->on('web_forms')->onDelete('cascade');\n        });\n    }\n\n    /**\n     * Reverse the migrations.\n     *\n     * @return void\n     */\n    public function down()\n    {\n        Schema::dropIfExists('web_form_attributes');\n    }\n};\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Http/Controllers/Controller.php",
    "content": "<?php\n\nnamespace Webkul\\WebForm\\Http\\Controllers;\n\nuse Illuminate\\Foundation\\Auth\\Access\\AuthorizesRequests;\nuse Illuminate\\Foundation\\Bus\\DispatchesJobs;\nuse Illuminate\\Foundation\\Validation\\ValidatesRequests;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Routing\\Controller as BaseController;\n\nclass Controller extends BaseController\n{\n    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;\n\n    /**\n     * Display a listing of the resource.\n     *\n     * @return Response\n     */\n    public function redirectToLogin()\n    {\n        return redirect()->route('admin.session.create');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Http/Controllers/WebFormController.php",
    "content": "<?php\n\nnamespace Webkul\\WebForm\\Http\\Controllers;\n\nuse Illuminate\\Http\\JsonResponse;\nuse Illuminate\\Http\\Response;\nuse Illuminate\\Support\\Facades\\Event;\nuse Illuminate\\View\\View;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Contact\\Repositories\\PersonRepository;\nuse Webkul\\Lead\\Repositories\\LeadRepository;\nuse Webkul\\Lead\\Repositories\\PipelineRepository;\nuse Webkul\\Lead\\Repositories\\SourceRepository;\nuse Webkul\\Lead\\Repositories\\TypeRepository;\nuse Webkul\\WebForm\\Http\\Requests\\WebForm;\nuse Webkul\\WebForm\\Repositories\\WebFormRepository;\n\nclass WebFormController extends Controller\n{\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected WebFormRepository $webFormRepository,\n        protected PersonRepository $personRepository,\n        protected LeadRepository $leadRepository,\n        protected PipelineRepository $pipelineRepository,\n        protected SourceRepository $sourceRepository,\n        protected TypeRepository $typeRepository,\n    ) {}\n\n    /**\n     * Remove the specified email template from storage.\n     */\n    public function formJS(string $formId): Response\n    {\n        $webForm = $this->webFormRepository->findOneByField('form_id', $formId);\n\n        return response()->view('web_form::settings.web-forms.embed', compact('webForm'))\n            ->header('Content-Type', 'text/javascript');\n    }\n\n    /**\n     * Remove the specified email template from storage.\n     */\n    public function formStore(int $id): JsonResponse\n    {\n        $person = $this->personRepository\n            ->getModel()\n            ->where('emails', 'like', '%'.request('persons.emails.0.value').'%')\n            ->first();\n\n        if ($person) {\n            request()->request->add(['persons' => array_merge(request('persons'), ['id' => $person->id])]);\n        }\n\n        app(WebForm::class);\n\n        $webForm = $this->webFormRepository->findOrFail($id);\n\n        if ($webForm->create_lead) {\n            request()->request->add(['entity_type' => 'leads']);\n\n            Event::dispatch('lead.create.before');\n\n            $data = request('leads');\n\n            $data['entity_type'] = 'leads';\n\n            $data['person'] = request('persons');\n\n            $data['status'] = 1;\n\n            $pipeline = $this->pipelineRepository->getDefaultPipeline();\n\n            $stage = $pipeline->stages()->first();\n\n            $data['lead_pipeline_id'] = $pipeline->id;\n\n            $data['lead_pipeline_stage_id'] = $stage->id;\n\n            $data['title'] = request('leads.title') ?: 'Lead From Web Form';\n\n            $data['lead_value'] = request('leads.lead_value') ?: 0;\n\n            if (! request('leads.lead_source_id')) {\n                $source = $this->sourceRepository->findOneByField('name', 'Web Form');\n\n                if (! $source) {\n                    $source = $this->sourceRepository->first();\n                }\n\n                $data['lead_source_id'] = $source->id;\n            }\n\n            $data['lead_type_id'] = request('leads.lead_type_id') ?: $this->typeRepository->first()->id;\n\n            $lead = $this->leadRepository->create($data);\n\n            Event::dispatch('lead.create.after', $lead);\n        } else {\n            if (! $person) {\n                Event::dispatch('contacts.person.create.before');\n\n                $data = request('persons');\n\n                request()->request->add(['entity_type' => 'persons']);\n\n                $data['entity_type'] = 'persons';\n\n                $person = $this->personRepository->create($data);\n\n                Event::dispatch('contacts.person.create.after', $person);\n            }\n        }\n\n        if ($webForm->submit_success_action == 'message') {\n            return response()->json([\n                'message' => $webForm->submit_success_content,\n            ], 200);\n        } else {\n            return response()->json([\n                'redirect' => $webForm->submit_success_content,\n            ], 301);\n        }\n    }\n\n    /**\n     * Remove the specified email template from storage.\n     */\n    public function preview(string $id): View\n    {\n        $webForm = $this->webFormRepository->findOneByField('form_id', $id);\n\n        if (is_null($webForm)) {\n            abort(404);\n        }\n\n        return view('web_form::settings.web-forms.preview', compact('webForm'));\n    }\n\n    /**\n     * Preview the web form from datagrid.\n     */\n    public function view(int $id): View\n    {\n        $webForm = $this->webFormRepository->findOneByField('id', $id);\n\n        request()->merge(['id' => $webForm->form_id]);\n\n        if (is_null($webForm)) {\n            abort(404);\n        }\n\n        return view('web_form::settings.web-forms.preview', compact('webForm'));\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Http/Requests/WebForm.php",
    "content": "<?php\n\nnamespace Webkul\\WebForm\\Http\\Requests;\n\nuse Illuminate\\Foundation\\Http\\FormRequest;\nuse Webkul\\Attribute\\Repositories\\AttributeRepository;\nuse Webkul\\Attribute\\Repositories\\AttributeValueRepository;\nuse Webkul\\Core\\Contracts\\Validations\\Decimal;\nuse Webkul\\WebForm\\Rules\\PhoneNumber;\n\nclass WebForm extends FormRequest\n{\n    /**\n     * @var array\n     */\n    protected $rules = [];\n\n    /**\n     * Create a new form request instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected AttributeRepository $attributeRepository,\n        protected AttributeValueRepository $attributeValueRepository\n    ) {}\n\n    /**\n     * Determine if the product is authorized to make this request.\n     *\n     * @return bool\n     */\n    public function authorize()\n    {\n        return true;\n    }\n\n    /**\n     * Get the validation rules that apply to the request.\n     *\n     * @return array\n     */\n    public function rules()\n    {\n        foreach (['leads', 'persons'] as $key => $entityType) {\n            $attributes = $this->attributeRepository->scopeQuery(function ($query) use ($entityType) {\n                $attributeCodes = $entityType == 'persons'\n                    ? array_keys(request('persons') ?? [])\n                    : array_keys(request('leads') ?? []);\n\n                $query = $query->whereIn('code', $attributeCodes)\n                    ->where('entity_type', $entityType);\n\n                return $query;\n            })->get();\n\n            foreach ($attributes as $attribute) {\n                $attribute->code = $entityType.'.'.$attribute->code;\n\n                $validations = [];\n\n                if ($attribute->type == 'boolean') {\n                    continue;\n                } elseif ($attribute->type == 'address') {\n                    if (! $attribute->is_required) {\n                        continue;\n                    }\n\n                    $validations = [\n                        $attribute->code.'.address' => 'required',\n                        $attribute->code.'.country' => 'required',\n                        $attribute->code.'.state' => 'required',\n                        $attribute->code.'.city' => 'required',\n                        $attribute->code.'.postcode' => 'required',\n                    ];\n                } elseif ($attribute->type == 'email') {\n                    $validations = [\n                        $attribute->code => [$attribute->is_required ? 'required' : 'nullable'],\n                        $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable', 'email'],\n                        $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable',\n                    ];\n                } elseif ($attribute->type == 'phone') {\n                    $validations = [\n                        $attribute->code => [$attribute->is_required ? 'required' : 'nullable'],\n                        $attribute->code.'.*.value' => [$attribute->is_required ? 'required' : 'nullable', new PhoneNumber],\n                        $attribute->code.'.*.label' => $attribute->is_required ? 'required' : 'nullable',\n                    ];\n                } else {\n                    $validations[$attribute->code] = [$attribute->is_required ? 'required' : 'nullable'];\n\n                    if ($attribute->type == 'text' && $attribute->validation) {\n                        array_push($validations[$attribute->code],\n                            $attribute->validation == 'decimal'\n                            ? new Decimal\n                            : $attribute->validation\n                        );\n                    }\n\n                    if ($attribute->type == 'price') {\n                        array_push($validations[$attribute->code], new Decimal);\n                    }\n                }\n\n                if ($attribute->is_unique) {\n                    array_push($validations[in_array($attribute->type, ['email', 'phone'])\n                        ? $attribute->code.'.*.value'\n                        : $attribute->code\n                    ], function ($field, $value, $fail) use ($attribute, $entityType) {\n                        if (! $this->attributeValueRepository->isValueUnique(\n                            $entityType == 'persons' ? request('persons.id') : null,\n                            $attribute->entity_type,\n                            $attribute,\n                            request($field)\n                        )\n                        ) {\n                            $fail('The value has already been taken.');\n                        }\n                    });\n                }\n\n                $this->rules = array_merge($this->rules, $validations);\n            }\n        }\n\n        return $this->rules;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Models/WebForm.php",
    "content": "<?php\n\nnamespace Webkul\\WebForm\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\WebForm\\Contracts\\WebForm as WebFormContract;\n\nclass WebForm extends Model implements WebFormContract\n{\n    protected $fillable = [\n        'form_id',\n        'title',\n        'description',\n        'submit_button_label',\n        'submit_success_action',\n        'submit_success_content',\n        'create_lead',\n        'background_color',\n        'form_background_color',\n        'form_title_color',\n        'form_submit_button_color',\n        'attribute_label_color',\n    ];\n\n    /**\n     * The attributes that belong to the activity.\n     */\n    public function attributes()\n    {\n        return $this->hasMany(WebFormAttributeProxy::modelClass());\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Models/WebFormAttribute.php",
    "content": "<?php\n\nnamespace Webkul\\WebForm\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Webkul\\Attribute\\Models\\AttributeProxy;\nuse Webkul\\WebForm\\Contracts\\WebFormAttribute as WebFormAttributeContract;\n\nclass WebFormAttribute extends Model implements WebFormAttributeContract\n{\n    /**\n     * Indicates if the model should be timestamped.\n     *\n     * @var string\n     */\n    public $timestamps = false;\n\n    /**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     */\n    protected $fillable = [\n        'name',\n        'placeholder',\n        'is_required',\n        'is_hidden',\n        'sort_order',\n        'attribute_id',\n        'web_form_id',\n    ];\n\n    /**\n     * Get the attribute that owns the attribute.\n     */\n    public function attribute()\n    {\n        return $this->belongsTo(AttributeProxy::modelClass());\n    }\n\n    /**\n     * Get the web_form that owns the attribute.\n     */\n    public function web_form()\n    {\n        return $this->belongsTo(WebFormProxy::modelClass());\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Models/WebFormAttributeProxy.php",
    "content": "<?php\n\nnamespace Webkul\\WebForm\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass WebFormAttributeProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Models/WebFormProxy.php",
    "content": "<?php\n\nnamespace Webkul\\WebForm\\Models;\n\nuse Konekt\\Concord\\Proxies\\ModelProxy;\n\nclass WebFormProxy extends ModelProxy {}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Providers/ModuleServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\WebForm\\Providers;\n\nuse Webkul\\Core\\Providers\\BaseModuleServiceProvider;\nuse Webkul\\WebForm\\Models\\WebForm;\nuse Webkul\\WebForm\\Models\\WebFormAttribute;\n\nclass ModuleServiceProvider extends BaseModuleServiceProvider\n{\n    protected $models = [\n        WebForm::class,\n        WebFormAttribute::class,\n    ];\n}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Providers/WebFormServiceProvider.php",
    "content": "<?php\n\nnamespace Webkul\\WebForm\\Providers;\n\nuse Illuminate\\Support\\Facades\\Blade;\nuse Illuminate\\Support\\ServiceProvider;\n\nclass WebFormServiceProvider extends ServiceProvider\n{\n    /**\n     * Bootstrap services.\n     */\n    public function boot(): void\n    {\n        $this->loadRoutesFrom(__DIR__.'/../Routes/routes.php');\n\n        $this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'web_form');\n\n        $this->loadViewsFrom(__DIR__.'/../Resources/views', 'web_form');\n\n        Blade::anonymousComponentPath(__DIR__.'/../Resources/views/components');\n\n        $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations');\n\n        $this->app->register(ModuleServiceProvider::class);\n    }\n\n    /**\n     * Register services.\n     */\n    public function register(): void\n    {\n        $this->registerConfig();\n    }\n\n    /**\n     * Register package config.\n     */\n    protected function registerConfig(): void\n    {\n        $this->mergeConfigFrom(dirname(__DIR__).'/Config/menu.php', 'menu.admin');\n\n        $this->mergeConfigFrom(dirname(__DIR__).'/Config/acl.php', 'acl');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Repositories/WebFormAttributeRepository.php",
    "content": "<?php\n\nnamespace Webkul\\WebForm\\Repositories;\n\nuse Webkul\\Core\\Eloquent\\Repository;\n\nclass WebFormAttributeRepository extends Repository\n{\n    /**\n     * Specify Model class name\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return 'Webkul\\WebForm\\Contracts\\WebFormAttribute';\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Repositories/WebFormRepository.php",
    "content": "<?php\n\nnamespace Webkul\\WebForm\\Repositories;\n\nuse Illuminate\\Container\\Container;\nuse Illuminate\\Support\\Str;\nuse Webkul\\Core\\Eloquent\\Repository;\nuse Webkul\\WebForm\\Contracts\\WebForm;\n\nclass WebFormRepository extends Repository\n{\n    /**\n     * Create a new repository instance.\n     *\n     * @return void\n     */\n    public function __construct(\n        protected WebFormAttributeRepository $webFormAttributeRepository,\n        Container $container\n    ) {\n        parent::__construct($container);\n    }\n\n    /**\n     * Specify model class name.\n     *\n     * @return mixed\n     */\n    public function model()\n    {\n        return WebForm::class;\n    }\n\n    /**\n     * Create Web Form.\n     *\n     * @return WebForm\n     */\n    public function create(array $data)\n    {\n        $webForm = $this->model->create(array_merge($data, [\n            'form_id' => Str::random(50),\n        ]));\n\n        foreach ($data['attributes'] as $attributeData) {\n            $this->webFormAttributeRepository->create(array_merge([\n                'web_form_id' => $webForm->id,\n            ], $attributeData));\n        }\n\n        return $webForm;\n    }\n\n    /**\n     * Update Web Form.\n     *\n     * @param  int  $id\n     * @param  string  $attribute\n     * @return WebForm\n     */\n    public function update(array $data, $id, $attribute = 'id')\n    {\n        $webForm = parent::update($data, $id);\n\n        $previousAttributeIds = $webForm->attributes()->pluck('id');\n\n        foreach ($data['attributes'] as $attributeId => $attributeData) {\n            if (Str::contains($attributeId, 'attribute_')) {\n                $this->webFormAttributeRepository->create(array_merge([\n                    'web_form_id' => $webForm->id,\n                ], $attributeData));\n            } else {\n                if (is_numeric($index = $previousAttributeIds->search($attributeId))) {\n                    $previousAttributeIds->forget($index);\n                }\n\n                $this->webFormAttributeRepository->update($attributeData, $attributeId);\n            }\n        }\n\n        foreach ($previousAttributeIds as $attributeId) {\n            $this->webFormAttributeRepository->delete($attributeId);\n        }\n\n        return $webForm;\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/assets/css/app.css",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n/* -------------------------------- new css -------------------------------- */\n\n@font-face {\n    font-family: \"icomoon\";\n    src: url(\"../fonts/icomoon.woff?w2trdd\") format(\"woff\");\n    font-weight: normal;\n    font-style: normal;\n    font-display: block;\n}\n\n[class^=\"icon-\"],\n[class*=\" icon-\"] {\n    /* use !important to prevent issues with browser extensions that change fonts */\n    font-family: \"icomoon\" !important;\n    speak: never;\n    font-style: normal;\n    font-weight: normal;\n    font-variant: normal;\n    text-transform: none;\n    line-height: 1;\n\n    /* Better Font Rendering =========== */\n    -webkit-font-smoothing: antialiased;\n    -moz-osx-font-smoothing: grayscale;\n}\n\n@layer components {\n    .icon-cross-large:before {\n        content: \"\\e91c\";\n    }\n\n    [dir=\"rtl\"] .stage::before {\n        content: \"\";\n        position: absolute;\n        top: 50%;\n        left: -10px;\n        width: 24px;\n        height: 24px;\n        z-index: 1;\n        border-radius: 0 0 0 25px;\n        transform: translateY(-50%) rotate(225deg);\n        border-right: 4px solid #f3f4f6;\n        border-top: 4px solid #f3f4f6;\n    }\n\n    [dir=\"rtl\"] .stage::after {\n        display: none;\n    }\n\n    .primary-button {\n        @apply bg-brandColor border border-brandColor cursor-pointer flex focus:opacity-[0.9] font-semibold gap-x-1 hover:opacity-[0.9] items-center place-content-center px-3 py-1.5 rounded-md text-gray-50 transition-all;\n    }\n\n    .secondary-button {\n        @apply flex cursor-pointer place-content-center items-center gap-x-1 whitespace-nowrap rounded-md border-2 border-brandColor bg-white px-3 py-1.5 font-semibold text-brandColor transition-all hover:bg-[#eff6ff61] focus:bg-[#eff6ff61] dark:border-gray-400 dark:bg-gray-800 dark:text-white dark:hover:opacity-80;\n    }\n\n    .transparent-button {\n        @apply flex cursor-pointer appearance-none place-content-center items-center gap-x-1 whitespace-nowrap rounded-md border-2 border-transparent px-3 py-1.5 font-semibold text-gray-600 transition-all marker:shadow hover:bg-gray-100 focus:bg-gray-100 dark:hover:bg-gray-950;\n    }\n\n    ::-webkit-scrollbar {\n        width: 12px;\n    }\n\n    ::-webkit-scrollbar-track {\n        background: #f1f1f1;\n    }\n\n    ::-webkit-scrollbar-thumb {\n        background: #888;\n        border-radius: 6px;\n    }\n\n    ::-webkit-scrollbar-thumb:hover {\n        background: #555;\n    }\n\n    /* Firefox */\n    * {\n        scrollbar-width: thin;\n        scrollbar-color: #888 #f1f1f1;\n    }\n\n    ::selection {\n        background-color: rgba(0, 68, 242, 0.2);\n    }\n\n    body {\n        @apply bg-gray-100 text-sm text-gray-800;\n    }\n\n    button:disabled {\n        @apply cursor-not-allowed opacity-50;\n    }\n\n    button:disabled:hover {\n        @apply cursor-not-allowed opacity-50;\n    }\n\n    .draggable-ghost {\n        opacity: 0.5;\n        background: #e0e7ff;\n    }\n\n    html.dark [class^=\"icon-\"],\n    html.dark [class*=\" icon-\"] {\n        color: #d1d5db;\n    }\n\n    p {\n        @apply text-[14px] !leading-[17px];\n    }\n\n    input,\n    textarea,\n    select {\n        @apply outline-none;\n    }\n\n    .required:after {\n        @apply content-['*'];\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/assets/js/app.js",
    "content": "/**\n * This will track all the images and fonts for publishing.\n */\nimport.meta.glob([\"../images/**\", \"../fonts/**\"]);\n\n/**\n * Main vue bundler.\n */\nimport { createApp } from \"vue/dist/vue.esm-bundler\";\n\n/**\n * Main root application registry.\n */\nwindow.app = createApp({\n    data() {\n        return {\n            isMenuActive: false,\n\n            hoveringMenu: '',\n        };\n    },\n\n    methods: {\n        onSubmit() {},\n\n        onInvalidSubmit({ values, errors, results }) {\n            setTimeout(() => {\n                const errorKeys = Object.entries(errors)\n                    .map(([key, value]) => ({ key, value }))\n                    .filter(error => error[\"value\"].length);\n\n                let firstErrorElement = document.querySelector('[name=\"' + errorKeys[0][\"key\"] + '\"]');\n\n                firstErrorElement.scrollIntoView({\n                    behavior: \"smooth\",\n                    block: \"center\"\n                });\n            }, 100);\n        },\n    },\n});\n\n/**\n * Global plugins registration.\n */\nimport Axios from \"./plugins/axios\";\nimport Emitter from \"./plugins/emitter\";\nimport Flatpickr from \"./plugins/flatpickr\";\nimport VeeValidate from \"./plugins/vee-validate\";\n[\n    Axios,\n    Emitter,\n    Flatpickr,\n    VeeValidate,\n].forEach((plugin) => app.use(plugin));\n\nexport default app;"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/assets/js/plugins/axios.js",
    "content": "/**\n * We'll load the axios HTTP library which allows us to easily issue requests\n * to our Laravel back-end. This library automatically handles sending the\n * CSRF token as a header based on the value of the \"XSRF\" token cookie.\n */\nimport axios from \"axios\";\nwindow.axios = axios;\nwindow.axios.defaults.headers.common[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\nexport default {\n    install(app) {\n        app.config.globalProperties.$axios = axios;\n    },\n};\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/assets/js/plugins/emitter.js",
    "content": "import mitt from \"mitt\";\n\nconst emitter = mitt();\n\nwindow.emitter = emitter;\n\nexport default {\n    install: (app, options) => {\n        app.config.globalProperties.$emitter = emitter;\n    },\n};\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/assets/js/plugins/flatpickr.js",
    "content": "import Flatpickr from \"flatpickr\";\nimport \"flatpickr/dist/flatpickr.css\";\n\nexport default {\n    install: (app) => {\n        window.Flatpickr = Flatpickr;\n\n        const changeTheme = (theme) => {\n            document.getElementById('flatpickr')?.remove();\n\n            if (theme === 'light') {\n                return;\n            }\n\n            const linkElement = document.createElement(\"link\");\n            \n            linkElement.rel = \"stylesheet\";\n            linkElement.type = \"text/css\";\n            linkElement.href = `https://npmcdn.com/flatpickr/dist/themes/${theme}.css`;\n            linkElement.id = 'flatpickr';\n\n            document.head.appendChild(linkElement);\n        };\n\n        const currentTheme = document.documentElement.classList.contains(\"dark\")\n            ? \"dark\"\n            : \"light\";\n\n        changeTheme(currentTheme);\n\n        app.config.globalProperties.$emitter.on(\"change-theme\", (theme) => {\n            changeTheme(theme);\n        });\n    },\n};\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/assets/js/plugins/vee-validate.js",
    "content": "/**\n * We are defining all the global rules here and configuring\n * all the `vee-validate` settings.\n */\nimport { configure, defineRule, Field, Form, ErrorMessage } from \"vee-validate\";\nimport { localize, setLocale } from \"@vee-validate/i18n\";\nimport ar from \"@vee-validate/i18n/dist/locale/ar.json\";\nimport bn from \"@vee-validate/i18n/dist/locale/bn.json\";\nimport de from \"@vee-validate/i18n/dist/locale/de.json\";\nimport en from \"@vee-validate/i18n/dist/locale/en.json\";\nimport es from \"@vee-validate/i18n/dist/locale/es.json\";\nimport fa from \"@vee-validate/i18n/dist/locale/fa.json\";\nimport fr from \"@vee-validate/i18n/dist/locale/fr.json\";\nimport he from \"@vee-validate/i18n/dist/locale/he.json\";\nimport hi_IN from \"../../locales/hi_IN.json\";\nimport it from \"@vee-validate/i18n/dist/locale/it.json\";\nimport ja from \"@vee-validate/i18n/dist/locale/ja.json\";\nimport nl from \"@vee-validate/i18n/dist/locale/nl.json\";\nimport pl from \"@vee-validate/i18n/dist/locale/pl.json\";\nimport pt_BR from \"@vee-validate/i18n/dist/locale/pt_BR.json\";\nimport ru from \"@vee-validate/i18n/dist/locale/ru.json\";\nimport sin from \"../../locales/sin.json\";\nimport tr from \"@vee-validate/i18n/dist/locale/tr.json\";\nimport uk from \"@vee-validate/i18n/dist/locale/uk.json\";\nimport zh_CN from \"@vee-validate/i18n/dist/locale/zh_CN.json\";\nimport { all } from '@vee-validate/rules';\n\nwindow.defineRule = defineRule;\n\nexport default {\n    install: (app) => {\n        /**\n         * Global components registration;\n         */\n        app.component(\"VForm\", Form);\n        app.component(\"VField\", Field);\n        app.component(\"VErrorMessage\", ErrorMessage);\n\n        window.addEventListener(\"load\", () => setLocale(document.documentElement.attributes.lang.value));\n\n        /**\n         * Registration of all global validators.\n         */\n        Object.entries(all).forEach(([name, rule]) => defineRule(name, rule));\n\n        /**\n         * This regular expression allows phone numbers with the following conditions:\n         * - The phone number can start with an optional \"+\" sign.\n         * - After the \"+\" sign, there should be one or more digits.\n         *\n         * This validation is sufficient for global-level phone number validation. If\n         * someone wants to customize it, they can override this rule.\n         */\n        defineRule(\"phone\", (value) => {\n            if (! value || ! value.length) {\n                return true;\n            }\n\n            if (! /^\\+?\\d+$/.test(value)) {\n                return false;\n            }\n\n            return true;\n        });\n                \n        defineRule(\"address\", (value) => {\n            if (!value || !value.length) {\n                return true;\n            }\n\n            if (\n                !/^[a-zA-Z0-9\\s.\\/*'\\u0600-\\u06FF\\u0750-\\u077F\\u08A0-\\u08FF\\u0590-\\u05FF\\u3040-\\u309F\\u30A0-\\u30FF\\u0400-\\u04FF\\u0D80-\\u0DFF\\u3400-\\u4DBF\\u2000-\\u2A6D\\u00C0-\\u017F\\u0980-\\u09FF\\u0900-\\u097F\\u4E00-\\u9FFF,\\(\\)-]{1,60}$/iu.test(\n                    value\n                )\n            ) {\n                return false;\n            }\n\n            return true;\n        });\n\n        defineRule(\"decimal\", (value, { decimals = '*', separator = '.' } = {}) => {\n            if (value === null || value === undefined || value === '') {\n                return true;\n            }\n\n            if (Number(decimals) === 0) {\n                return /^-?\\d*$/.test(value);\n            }\n\n            const regexPart = decimals === '*' ? '+' : `{1,${decimals}}`;\n            const regex = new RegExp(`^[-+]?\\\\d*(\\\\${separator}\\\\d${regexPart})?([eE]{1}[-]?\\\\d+)?$`);\n\n            return regex.test(value);\n        });\n\n        defineRule(\"required_if\", (value, { condition = true } = {}) => {\n            if (condition) {\n                if (value === null || value === undefined || value === '') {\n                    return false;\n                }\n            }\n\n            return true;\n        });\n\n        defineRule(\"\", () => true);\n\n        // @TODO handle this\n        // @suraj-webkul\n        defineRule(\"date_format\", (value) => {\n            return true;\n        });\n\n        // @TODO handle this\n        // @suraj-webkul\n        defineRule(\"after\", (value) => {\n            return true;\n        });\n\n        configure({\n            /**\n             * Built-in error messages and custom error messages are available. Multiple\n             * locales can be added in the same way.\n             */\n            generateMessage: localize({\n                ar: {\n                    ...ar,\n                    messages: {\n                        ...ar.messages,\n                        phone: \"يجب أن يكون هذا {field} رقم هاتف صالحًا\",\n                    },\n                },\n        \n                bn: {\n                    ...bn,\n                    messages: {\n                        ...bn.messages,\n                        phone: \"এই {field} একটি বৈধ ফোন নম্বর হতে হবে\",\n                    },\n                },\n        \n                de: {\n                    ...de,\n                    messages: {\n                        ...de.messages,\n                        phone: \"Dieses {field} muss eine gültige Telefonnummer sein.\",\n                    },\n                },\n\n                en: {\n                    ...en,\n                    messages: {\n                        ...en.messages,\n                        phone: \"This {field} must be a valid phone number\",\n                    },\n                },\n        \n                es: {\n                    ...es,\n                    messages: {\n                        ...es.messages,\n                        phone: \"Este {field} debe ser un número de teléfono válido.\",\n                    },\n                },\n        \n                fa: {\n                    ...fa,\n                    messages: {\n                        ...fa.messages,\n                        phone: \"این {field} باید یک شماره تلفن معتبر باشد.\",\n                    },\n                },\n        \n                fr: {\n                    ...fr,\n                    messages: {\n                        ...fr.messages,\n                        phone: \"Ce {field} doit être un numéro de téléphone valide.\",\n                    },\n                },\n        \n                he: {\n                    ...he,\n                    messages: {\n                        ...he.messages,\n                        phone: \"זה {field} חייב להיות מספר טלפון תקין.\",\n                    },\n                },\n        \n                hi_IN: {\n                    ...hi_IN,\n                    messages: {\n                        ...hi_IN.messages,\n                        phone: \"यह {field} कोई मान्य फ़ोन नंबर होना चाहिए।\",\n                    },\n                },\n        \n                it: {\n                    ...it,\n                    messages: {\n                        ...it.messages,\n                        phone: \"Questo {field} deve essere un numero di telefono valido.\",\n                    },\n                },\n        \n                ja: {\n                    ...ja,\n                    messages: {\n                        ...ja.messages,\n                        phone: \"この{field}は有効な電話番号である必要があります。\",\n                    },\n                },\n        \n                nl: {\n                    ...nl,\n                    messages: {\n                        ...nl.messages,\n                        phone: \"Dit {field} moet een geldig telefoonnummer zijn.\",\n                    },\n                },\n        \n                pl: {\n                    ...pl,\n                    messages: {\n                        ...pl.messages,\n                        phone: \"To {field} musi być prawidłowy numer telefonu.\",\n                    },\n                },\n        \n                pt_BR: {\n                    ...pt_BR,\n                    messages: {\n                        ...pt_BR.messages,\n                        phone: \"Este {field} deve ser um número de telefone válido.\",\n                    },\n                },\n        \n                ru: {\n                    ...ru,\n                    messages: {\n                        ...ru.messages,\n                        phone: \"Это {field} должно быть действительным номером телефона.\",\n                    },\n                },\n        \n                sin: {\n                    ...sin,\n                    messages: {\n                        ...sin.messages,\n                        phone: \"මෙම {field} වටේ වලංගු දුරකතන අංකය විය යුතුයි.\",\n                    },\n                },\n        \n                tr: {\n                    ...tr,\n                    messages: {\n                        ...tr.messages,\n                        phone: \"Bu {field} geçerli bir telefon numarası olmalıdır.\",\n                    },\n                },\n        \n                uk: {\n                    ...uk,\n                    messages: {\n                        ...uk.messages,\n                        phone: \"Це {field} повинно бути дійсним номером телефону.\",\n                    },\n                },\n        \n                zh_CN: {\n                    ...zh_CN,\n                    messages: {\n                        ...zh_CN.messages,\n                        phone: \"这个 {field} 必须是一个有效的电话号码。\",\n                    },\n                },\n            }),\n\n            validateOnBlur: true,\n            validateOnInput: true,\n            validateOnChange: true,\n        });\n    },\n};\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/assets/locales/hi_IN.json",
    "content": "{\n  \"code\": \"hi_IN\",\n  \"messages\": {\n    \"_default\": \"यह {field} मान्य नहीं है\",\n    \"alpha\": \"{field} फ़ील्ड में केवल वर्णात्मक अक्षर हो सकते हैं\",\n    \"alpha_num\": \"{field} फ़ील्ड में केवल वर्णात्मक और संख्यात्मक अक्षर हो सकते हैं\",\n    \"alpha_dash\": \"{field} फ़ील्ड में वर्णात्मक और संख्यात्मक अक्षरों के साथ डैश और अंडरस्कोर हो सकते हैं\",\n    \"alpha_spaces\": \"{field} फ़ील्ड में केवल वर्णात्मक अक्षर और अंतर हो सकते हैं\",\n    \"between\": \"{field} फ़ील्ड 0:{min} और 1:{max} के बीच होना चाहिए\",\n    \"confirmed\": \"{field} फ़ील्ड की पुष्टि मेल नहीं खाती\",\n    \"digits\": \"{field} फ़ील्ड संख्यात्मक होनी चाहिए और बिल्कुल 0:{length} अंक होने चाहिए\",\n    \"dimensions\": \"{field} फ़ील्ड 0:{width} पिक्सेल और 1:{height} पिक्सेल होना चाहिए\",\n    \"email\": \"{field} फ़ील्ड में एक मान्य ईमेल होना चाहिए\",\n    \"not_one_of\": \"{field} फ़ील्ड मान्य मूल्य नहीं है\",\n    \"ext\": \"{field} फ़ील्ड में मान्य फ़ाइल नहीं है\",\n    \"image\": \"{field} फ़ील्ड एक छवि होनी चाहिए\",\n    \"integer\": \"{field} फ़ील्ड एक पूर्णांक होना चाहिए\",\n    \"length\": \"{field} फ़ील्ड 0:{length} लंबा होना चाहिए\",\n    \"max_value\": \"{field} फ़ील्ड 0:{max} या उससे कम होना चाहिए\",\n    \"max\": \"{field} फ़ील्ड 0:{length} अक्षरों से अधिक नहीं हो सकता\",\n    \"mimes\": \"{field} फ़ील्ड को मान्य फ़ाइल प्रकार होना चाहिए\",\n    \"min_value\": \"{field} फ़ील्ड 0:{min} या उससे अधिक होना चाहिए\",\n    \"min\": \"{field} फ़ील्ड कम से कम 0:{length} अक्षरों का होना चाहिए\",\n    \"numeric\": \"{field} फ़ील्ड में केवल संख्याएँ हो सकती हैं\",\n    \"one_of\": \"{field} फ़ील्ड मान्य मूल्य नहीं है\",\n    \"regex\": \"{field} फ़ील्ड का प्रारूप अवैध है\",\n    \"required_if\": \"{field} फ़ील्ड आवश्यक है\",\n    \"required\": \"{field} फ़ील्ड आवश्यक है\",\n    \"size\": \"{field} फ़ील्ड का आकार 0:{size}KB से कम होना चाहिए\",\n    \"url\": \"{field} फ़ील्ड में एक मान्य URL नहीं है\"\n  }\n}\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/assets/locales/sin.json",
    "content": "{\n    \"code\": \"sin\",\n    \"messages\": {\n        \"_default\": \"මේ {field} වල වලංගු නොවේ\",\n        \"alpha\": \"{field} ක්ෂණික සංඛ්‍යාවක් පිළිබඳව සියල්ල සියල්ල සහිතව හැකිය\",\n        \"alpha_num\": \"{field} ක්ෂණික සහ සංඛ්‍යාවක් පිළිබඳව සියල්ල සහිතව හැකිය\",\n        \"alpha_dash\": \"{field} ක්ෂණික සහ සංඛ්‍යාවක් සමග දැහැ හෝ පරිදි ලොව සහිතව හැකිය\",\n        \"alpha_spaces\": \"{field} ක්ෂණික සංඛ්‍යාවක් සහිතව හැකිය, සහ වීඩියෝ හෝම්හෝ සහිතව හැකිය\",\n        \"between\": \"{field} ක්ෂණික 0:{min} සහ 1:{max} අතර විය යුතුය\",\n        \"confirmed\": \"{field} ක්ෂණික තහවුරු නොගත් බව තහවුරු කර නොයාය\",\n        \"digits\": \"{field} ක්ෂණික සෂ්යෝගයක් හා සියලුමේ විය 0:{length} දිගු විය යුතුය\",\n        \"dimensions\": \"{field} ක්ෂණික 0:{width} පික්සල සහ 1:{height} පික්සල විය යුතුය\",\n        \"email\": \"{field} ක්ෂණික වලංගු ඊමේල් එක හෝ යුක්ත විය යුතුය\",\n        \"not_one_of\": \"{field} ක්ෂණික වලංගු අගය නොවේ\",\n        \"ext\": \"{field} ක්ෂණික වලංගු ගොනුව නොවේ\",\n        \"image\": \"{field} ක්ෂණික වලංගු ඡායාරූපය යුතුය\",\n        \"integer\": \"{field} ක්ෂණික වලංගු නික්මෙර වර්ගයේ යුතුය\",\n        \"length\": \"{field} ක්ෂණික වලංගු 0:{length} හෝමාව යුතුය\",\n        \"max_value\": \"{field} ක්ෂණික 0:{max} හෝමා හෝමා හෝමා යුතුය\",\n        \"max\": \"{field} ක්ෂණික 0:{length} අකුරු වලංගු වී නොයාය\",\n        \"mimes\": \"{field} ක්ෂණික ගොනුවේ වලංගු ගොනු වර්ගය හෝ හෝ හෝ යුතුය\",\n        \"min_value\": \"{field} ක්ෂණික 0:{min} හෝමාව හෝමාව හෝමාව හෝමාව හෝමාව යුතුය\",\n        \"min\": \"{field} ක්ෂණික 0:{length} හෝමාවක් හෝමාවක් හෝමාවක් හෝමාවක් යුතුය\",\n        \"numeric\": \"{field} ක්ෂණික වලංගු සංඛ්‍යාවෙන් වයස්ක්‍ර සංඛ්‍යාවෙන් වයස්ක්‍ර විය ෺\",\n        \"one_of\": \"{field} ක්ෂණික වලංගු අගය නොවේ\",\n        \"regex\": \"{field} ක්ෂණික වලංගු ආකාරය අවලංගුය\",\n        \"required_if\": \"{field} ක්ෂණිකයෙන් හෝයි\",\n        \"required\": \"{field} ක්ෂණිකයෙන් හෝයි\",\n        \"size\": \"{field} ක්ෂණික වලංගු විය හැකි ආකාරය 0:{size}KB හෝ හොයා යුතුයි\",\n        \"url\": \"{field} ක්ෂණික වලංගු වර්ගවල URL නොවේ\"\n    }\n}"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/lang/ar/app.php",
    "content": "<?php\n\nreturn [\n    'acl' => [\n        'title' => 'نماذج الويب',\n        'view' => 'عرض',\n        'create' => 'إنشاء',\n        'edit' => 'تعديل',\n        'delete' => 'حذف',\n    ],\n\n    'menu' => [\n        'title' => 'نماذج الويب',\n        'title-info' => 'إضافة، تعديل أو حذف نماذج الويب من CRM',\n    ],\n\n    'validations' => [\n        'invalid-phone-number' => 'رقم الهاتف غير صحيح',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/lang/en/app.php",
    "content": "<?php\n\nreturn [\n    'acl' => [\n        'title' => 'Web Forms',\n        'view' => 'View',\n        'create' => 'Create',\n        'edit' => 'Edit',\n        'delete' => 'Delete',\n    ],\n\n    'menu' => [\n        'title' => 'Web Forms',\n        'title-info' => 'Add, edit, or delete web forms from the CRM',\n    ],\n\n    'validations' => [\n        'invalid-phone-number' => 'Invalid phone number',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/lang/es/app.php",
    "content": "<?php\n\nreturn [\n    'acl' => [\n        'title' => 'Formularios Web',\n        'view' => 'Ver',\n        'create' => 'Crear',\n        'edit' => 'Editar',\n        'delete' => 'Eliminar',\n    ],\n\n    'menu' => [\n        'title' => 'Formularios Web',\n        'title-info' => 'Agregar, editar o eliminar formularios web desde CRM',\n    ],\n\n    'validations' => [\n        'invalid-phone-number' => 'Número de teléfono no válido',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/lang/fa/app.php",
    "content": "<?php\n\nreturn [\n    'acl' => [\n        'title' => 'فرم‌های وب',\n        'view' => 'نمایش',\n        'create' => 'ایجاد',\n        'edit' => 'ویرایش',\n        'delete' => 'حذف',\n    ],\n\n    'menu' => [\n        'title' => 'فرم‌های وب',\n        'title-info' => 'افزودن، ویرایش یا حذف فرم‌های وب از CRM',\n    ],\n\n    'validations' => [\n        'invalid-phone-number' => 'شماره تلفن نامعتبر است',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/lang/pt_BR/app.php",
    "content": "<?php\n\nreturn [\n    'acl' => [\n        'title' => 'Formulários Web',\n        'view' => 'Visualizar',\n        'create' => 'Adicionar',\n        'edit' => 'Editar',\n        'delete' => 'Excluir',\n    ],\n\n    'menu' => [\n        'title' => 'Formulários Web',\n        'title-info' => 'Adicione, edite ou exclua formulários web no CRM',\n    ],\n\n    'validations' => [\n        'invalid-phone-number' => 'Número de telefone inválido',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/lang/tr/app.php",
    "content": "<?php\n\nreturn [\n    'acl' => [\n        'title' => 'Web Formları',\n        'view' => 'Görüntüle',\n        'create' => 'Oluştur',\n        'edit' => 'Düzenle',\n        'delete' => 'Sil',\n    ],\n\n    'menu' => [\n        'title' => 'Web Formları',\n        'title-info' => 'CRM’den web formlarını ekle, düzenle veya sil',\n    ],\n\n    'validations' => [\n        'invalid-phone-number' => 'Geçersiz telefon numarası',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/lang/vi/app.php",
    "content": "<?php\n\nreturn [\n    'acl' => [\n        'title' => 'Biểu mẫu Web',\n        'view' => 'Xem',\n        'create' => 'Tạo',\n        'edit' => 'Chỉnh sửa',\n        'delete' => 'Xóa',\n    ],\n\n    'menu' => [\n        'title' => 'Biểu mẫu Web',\n        'title-info' => 'Thêm, chỉnh sửa hoặc xóa biểu mẫu web từ CRM',\n    ],\n\n    'validations' => [\n        'invalid-phone-number' => 'Số điện thoại không hợp lệ.',\n    ],\n];\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/views/components/button/index.blade.php",
    "content": "<v-button {{ $attributes }}></v-button>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-button-template\"\n    >\n        <button\n            v-if=\"! loading\"\n            :class=\"[buttonClass, '']\"\n        >\n            @{{ title }}\n        </button>\n\n        <button\n            v-else\n            :class=\"[buttonClass, '']\"\n        >\n            <!-- Spinner -->\n            <x-admin::spinner class=\"absolute\" />\n\n            <span class=\"realative h-full w-full opacity-0\">\n                @{{ title }}\n            </span>\n        </button>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-button', {\n            template: '#v-button-template',\n\n            props: {\n                loading: Boolean,\n                buttonType: String,\n                title: String,\n                buttonClass: String,\n            },\n        });\n    </script>\n@endPushOnce"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/views/components/flash-group/index.blade.php",
    "content": "<v-flash-group ref='flashes'></v-flash-group>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-flash-group-template\"\n    >\n        <transition-group\n            tag='div'\n            name=\"flash-group\"\n            enter-from-class=\"ltr:translate-y-full rtl:-translate-y-full\"\n            enter-active-class=\"transform transition duration-300 ease-[cubic-bezier(.4,0,.2,1)]\"\n            enter-to-class=\"ltr:translate-y-0 rtl:-translate-y-0\"\n            leave-from-class=\"ltr:translate-y-0 rtl:-translate-y-0\"\n            leave-active-class=\"transform transition duration-300 ease-[cubic-bezier(.4,0,.2,1)]\"\n            leave-to-class=\"ltr:translate-y-full rtl:-translate-y-full\"\n            class='fixed bottom-5 left-1/2 z-[10003] grid -translate-x-1/2 justify-items-end gap-2.5'\n        >\n            <x-admin::flash-group.item />\n        </transition-group>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-flash-group', {\n            template: '#v-flash-group-template',\n\n            data() {\n                return {\n                    uid: 0,\n\n                    flashes: []\n                }\n            },\n\n            created() {\n                @foreach (['success', 'warning', 'error', 'info'] as $key)\n                    @if (session()->has($key))\n                        this.flashes.push({'type': '{{ $key }}', 'message': \"{{ session($key) }}\", 'uid':  this.uid++});\n                    @endif\n                @endforeach\n\n                this.registerGlobalEvents();\n            },\n\n            methods: {\n                add(flash) {\n                    flash.uid = this.uid++;\n\n                    this.flashes.push(flash);\n                },\n\n                remove(flash) {\n                    let index = this.flashes.indexOf(flash);\n\n                    this.flashes.splice(index, 1);\n                },\n\n                registerGlobalEvents() {\n                    this.$emitter.on('add-flash', this.add);\n                },\n            }\n        });\n    </script>\n@endpushOnce"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/views/components/flash-group/item.blade.php",
    "content": "<v-flash-item\n    v-for='flash in flashes'\n    :key='flash.uid'\n    :flash=\"flash\"\n    @onRemove=\"remove($event)\"\n>\n</v-flash-item>\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-flash-item-template\"\n    >\n        <div\n            class=\"flex w-max items-start justify-between gap-2 rounded-lg bg-white p-3 shadow-[0px_10px_20px_0px_rgba(0,0,0,0.12)] dark:bg-gray-950\"\n            :style=\"typeStyles[flash.type]['container']\"\n            @mouseenter=\"pauseTimer\"\n            @mouseleave=\"resumeTimer\"\n        >\n            <!-- Icon -->\n            <span\n                class=\"icon-toast-done rounded-full bg-white text-2xl dark:bg-gray-900\"\n                :class=\"iconClasses[flash.type]\"\n                :style=\"typeStyles[flash.type]['icon']\"\n            ></span>\n\n            <div class=\"flex flex-col gap-1.5\">\n                <!-- Heading -->\n                <p class=\"text-base font-semibold dark:text-white\">\n                    @{{ typeHeadings[flash.type] }}\n                </p>\n\n                <!-- Message -->\n                <p\n                    class=\"flex items-center break-all text-sm dark:text-white\"\n                    :style=\"typeStyles[flash.type]['message']\"\n                >\n\n                    @{{ flash.message }}\n                </p>\n            </div>\n\n            <button\n                class=\"relative ml-4 inline-flex rounded-full bg-white p-1.5 text-gray-400 dark:bg-gray-950\"\n                @click=\"remove\"\n            >\n                <span class=\"icon-cross-large text-2xl text-slate-800\"></span>\n\n                <svg class=\"absolute inset-0 h-full w-full -rotate-90\" viewBox=\"0 0 24 24\">\n                    <circle\n                        class=\"text-gray-200\"\n                        stroke-width=\"1.5\"\n                        stroke=\"#D0D4DA\"\n                        fill=\"transparent\"\n                        r=\"10\"\n                        cx=\"12\"\n                        cy=\"12\"\n                    />\n                    \n                    <circle\n                        class=\"text-blue-600 transition-all duration-100 ease-out\"\n                        stroke-width=\"1.5\"\n                        :stroke-dasharray=\"circumference\"\n                        :stroke-dashoffset=\"strokeDashoffset\"\n                        stroke-linecap=\"round\"\n                        :stroke=\"typeStyles[flash.type]['stroke']\"\n                        fill=\"transparent\"\n                        r=\"10\"\n                        cx=\"12\"\n                        cy=\"12\"\n                    />\n                </svg>\n            </button>\n        </div>\n    </script>\n\n    <script type=\"module\">\n        app.component('v-flash-item', {\n            template: '#v-flash-item-template',\n\n            props: ['flash'],\n\n            data() {\n                return {\n                    iconClasses: {\n                        success: 'icon-success',\n\n                        error: 'icon-error',\n\n                        warning: 'icon-warning',\n\n                        info: 'icon-info',\n                    },\n\n                    typeHeadings: {\n                        success: \"@lang('admin::app.components.flash-group.success')\",\n\n                        error: \"@lang('admin::app.components.flash-group.error')\",\n\n                        warning: \"@lang('admin::app.components.flash-group.warning')\",\n\n                        info: \"@lang('admin::app.components.flash-group.info')\",\n                    },\n\n                    typeStyles: {\n                        success: {\n                            container: 'border-left: 8px solid #16A34A',\n\n                            icon: 'color: #16A34A',\n\n                            stroke: '#16A34A',\n                        },\n\n                        error: {\n                            container: 'border-left: 8px solid #FF4D50',\n\n                            icon: 'color: #FF4D50',\n\n                            stroke: '#FF4D50',\n                        },\n\n                        warning: {\n                            container: 'border-left: 8px solid #FBAD15',\n\n                            icon: 'color: #FBAD15',\n\n                            stroke: '#FBAD15',\n                        },\n\n                        info: {\n                            container: 'border-left: 8px solid #0E90D9',\n\n                            icon: 'color: #0E90D9',\n\n                            stroke: '#0E90D9',\n                        },\n                    },\n\n                    duration: 5000,\n\n                    progress: 0,\n                    \n                    circumference: 2 * Math.PI * 10,\n\n                    timer: null,\n\n                    isPaused: false,\n                    \n                    remainingTime: 5000,\n                };\n            },\n\n            computed: {\n                strokeDashoffset() {\n                    return this.circumference - (this.progress / 100) * this.circumference;\n                }\n            },\n\n            created() {\n                this.startTimer();\n            },\n\n            beforeUnmount() {\n                this.stopTimer();\n            },\n\n            methods: {\n                remove() {\n                    this.$emit('onRemove', this.flash)\n                },\n\n                startTimer() {\n                    const interval = 100;\n                    \n                    const step = (100 / (this.duration / interval));\n\n                    this.timer = setInterval(() => {\n                        if (! this.isPaused) {\n                            this.progress += step;\n\n                            this.remainingTime -= interval;\n\n                            if (this.progress >= 100) {\n                                this.stopTimer();\n                                this.remove();\n                            }\n                        }\n                    }, interval);\n                },\n\n                stopTimer() {\n                    clearInterval(this.timer);\n                },\n\n                pauseTimer() {\n                    this.isPaused = true;\n                },\n\n                resumeTimer() {\n                    this.isPaused = false;\n                },\n            }\n        });\n    </script>\n@endpushOnce\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/views/components/form/control-group/control.blade.php",
    "content": "@props([\n    'type' => 'text',\n    'name' => '',\n])\n\n@switch($type)\n    @case('hidden')\n    @case('text')\n    @case('email')\n    @case('password')\n    @case('number')\n        <v-field\n            v-slot=\"{ field, errors }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}\n            name=\"{{ $name }}\"\n        >\n            <input\n                type=\"{{ $type }}\"\n                name=\"{{ $name }}\"\n                v-bind=\"field\"\n                :class=\"[errors.length ? 'border !border-red-600 hover:border-red-600' : '']\"\n                {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }}\n            />\n        </v-field>\n\n        @break\n\n    @case('price')\n        <v-field\n            v-slot=\"{ field, errors }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}\n            name=\"{{ $name }}\"\n        >\n            <div\n                class=\"flex w-full items-center overflow-hidden rounded-md border text-sm text-gray-600 transition-all focus-within:border-gray-400 hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400\"\n                :class=\"[errors.length ? 'border !border-red-600 hover:border-red-600' : '']\"\n            >\n                @if (isset($currency))\n                    <span {{ $currency->attributes->merge(['class' => 'py-2.5 text-gray-500 ltr:pl-4 rtl:pr-4']) }}>\n                        {{ $currency }}\n                    </span>\n                @else\n                    <span class=\"py-2.5 text-gray-500 ltr:pl-4 rtl:pr-4\">\n                        {{ config('app.currency') }}\n                    </span>\n                @endif\n\n                <input\n                    type=\"text\"\n                    name=\"{{ $name }}\"\n                    v-bind=\"field\"\n                    {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full p-2.5 text-sm text-gray-600 dark:bg-gray-900 dark:text-gray-300']) }}\n                />\n            </div>\n        </v-field>\n\n        @break\n\n    @case('file')\n        <v-field\n            v-slot=\"{ field, errors, handleChange, handleBlur }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}\n            name=\"{{ $name }}\"\n        >\n            <input\n                type=\"{{ $type }}\"\n                v-bind=\"{ name: field.name }\"\n                :class=\"[errors.length ? 'border !border-red-600 hover:border-red-600' : '']\"\n                {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded-md border px-3 py-2.5 text-sm text-gray-600 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:file:bg-gray-800 dark:file:dark:text-white dark:hover:border-gray-400 dark:focus:border-gray-400']) }}\n                @change=\"handleChange\"\n                @blur=\"handleBlur\"\n            />\n        </v-field>\n\n        @break\n\n    @case('color')\n        <v-field\n            name=\"{{ $name }}\"\n            v-slot=\"{ field, errors }\"\n            {{ $attributes->except('class') }}\n        >\n            <input\n                type=\"{{ $type }}\"\n                :class=\"[errors.length ? 'border border-red-500' : '']\"\n                v-bind=\"field\"\n                {{ $attributes->except(['value'])->merge(['class' => 'w-full appearance-none rounded-md border text-sm text-gray-600 transition-all hover:border-gray-400 dark:text-gray-300 dark:hover:border-gray-400']) }}\n            >\n        </v-field>\n        @break\n\n    @case('textarea')\n        <v-field\n            v-slot=\"{ field, errors }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}\n            name=\"{{ $name }}\"\n        >\n            <textarea\n                type=\"{{ $type }}\"\n                name=\"{{ $name }}\"\n                v-bind=\"field\"\n                :class=\"[errors.length ? 'border !border-red-600 hover:border-red-600' : '']\"\n                {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }}\n            >\n            </textarea>\n\n            @if ($attributes->get('tinymce', false) || $attributes->get(':tinymce', false))\n                <x-admin::tinymce \n                    :selector=\"'textarea#' . $attributes->get('id')\"\n                    ::field=\"field\"\n                />\n            @endif\n        </v-field>\n\n        @break\n\n    @case('date')\n        <v-field\n            v-slot=\"{ field, errors }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\\d{4}-\\d{2}-\\d{2}$']) }}\n            name=\"{{ $name }}\"\n        >\n            <x-admin::flat-picker.date>\n                <input\n                    name=\"{{ $name }}\"\n                    v-bind=\"field\"\n                    :class=\"[errors.length ? 'border !border-red-600 hover:border-red-600' : '']\"\n                    {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }}\n                    autocomplete=\"off\"\n                />\n            </x-admin::flat-picker.date>\n        </v-field>\n\n        @break\n\n    @case('datetime')\n        <v-field\n            v-slot=\"{ field, errors }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['rules' => 'regex:^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$']) }}\n            name=\"{{ $name }}\"\n        >\n            <x-admin::flat-picker.datetime>\n                <input\n                    name=\"{{ $name }}\"\n                    v-bind=\"field\"\n                    :class=\"[errors.length ? 'border !border-red-600 hover:border-red-600' : '']\"\n                    {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400 dark:focus:border-gray-400']) }}\n                    autocomplete=\"off\"\n                >\n            </x-admin::flat-picker.datetime>\n        </v-field>\n        @break\n\n    @case('select')\n        <v-field\n            v-slot=\"{ field, errors }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label']) }}\n            name=\"{{ $name }}\"\n        >\n            <select\n                name=\"{{ $name }}\"\n                v-bind=\"field\"\n                :class=\"[errors.length ? 'border border-red-500' : '']\"\n                {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label'])->merge(['class' => 'custom-select w-full rounded border border-gray-200 px-2.5 py-2 text-sm font-normal text-gray-800 transition-all hover:border-gray-400 focus:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400']) }}\n            >\n                {{ $slot }}\n            </select>\n        </v-field>\n\n        @break\n\n    @case('multiselect')\n        <v-field\n            as=\"select\"\n            v-slot=\"{ value }\"\n            :class=\"[errors && errors['{{ $name }}'] ? 'border !border-red-600 hover:border-red-600' : '']\"\n            {{ $attributes->except([])->merge(['class' => 'flex w-full flex-col rounded-md border bg-white px-3 py-2.5 text-sm font-normal text-gray-600 transition-all hover:border-gray-400 dark:border-gray-800 dark:bg-gray-900 dark:text-gray-300 dark:hover:border-gray-400']) }}\n            name=\"{{ $name }}\"\n            multiple\n        >\n            {{ $slot }}\n        </v-field>\n\n        @break\n\n    @case('checkbox')\n        <v-field\n            v-slot=\"{ field }\"\n            type=\"checkbox\"\n            class=\"hidden\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label', 'key', ':key']) }}\n            name=\"{{ $name }}\"\n        >\n            <input\n                type=\"checkbox\"\n                name=\"{{ $name }}\"\n                v-bind=\"field\"\n                class=\"peer sr-only\"\n                {{ $attributes->except(['rules', 'label', ':label', 'key', ':key']) }}\n            />\n\n            <v-checked-handler\n                :field=\"field\"\n                checked=\"{{ $attributes->get('checked') }}\"\n            >\n            </v-checked-handler>\n        </v-field>\n\n        <label\n             {{ \n                $attributes\n                    ->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label', 'key', ':key'])\n                    ->merge(['class' => 'text-gray-500 icon-checkbox-outline peer-checked:icon-checkbox-select text-2xl peer-checked:text-blue-600'])\n                    ->merge(['class' => $attributes->get('disabled') ? 'cursor-not-allowed opacity-70' : 'cursor-pointer'])\n            }}\n        >\n        </label>\n\n        @break\n\n    @case('radio')\n        <v-field\n            type=\"radio\"\n            class=\"hidden\"\n            v-slot=\"{ field }\"\n            {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label', 'key', ':key']) }}\n            name=\"{{ $name }}\"\n        >\n            <input\n                type=\"radio\"\n                name=\"{{ $name }}\"\n                v-bind=\"field\"\n                {{ $attributes->except(['rules', 'label', ':label', 'key', ':key'])->merge(['class' => 'peer sr-only']) }}\n            />\n                \n            <v-checked-handler\n                class=\"hidden\"\n                :field=\"field\"\n                checked=\"{{ $attributes->get('checked') }}\"\n            >\n            </v-checked-handler>\n        </v-field>\n\n        <label\n            {{ $attributes->except(['value', ':value', 'v-model', 'rules', ':rules', 'label', ':label', 'key', ':key'])->merge(['class' => 'icon-radio-normal peer-checked:icon-radio-selected cursor-pointer text-2xl peer-checked:text-blue-600']) }}\n        >\n        </label>\n\n        @break\n\n    @case('switch')\n        <label class=\"relative inline-flex cursor-pointer items-center\">\n            <v-field\n                type=\"checkbox\"\n                class=\"hidden\"\n                v-slot=\"{ field }\"\n                {{ $attributes->only(['name', ':name', 'value', ':value', 'v-model', 'rules', ':rules', 'label', ':label', 'key', ':key']) }}\n                name=\"{{ $name }}\"\n            >\n                <input\n                    type=\"checkbox\"\n                    name=\"{{ $name }}\"\n                    id=\"{{ $name }}\"\n                    class=\"peer sr-only\"\n                    v-bind=\"field\"\n                    {{ $attributes->except(['v-model', 'rules', ':rules', 'label', ':label', 'key', ':key']) }}\n                />\n                \n                <v-checked-handler\n                    class=\"hidden\"\n                    :field=\"field\"\n                    checked=\"{{ $attributes->get('checked') }}\"\n                >\n                </v-checked-handler>\n            </v-field>\n\n            <label\n                class=\"peer h-5 w-9 cursor-pointer rounded-full bg-gray-200 after:absolute after:top-0.5 after:h-4 after:w-4 after:rounded-full after:border after:border-gray-300 after:bg-white after:transition-all after:content-[''] peer-checked:bg-blue-600 peer-checked:after:border-white peer-focus:outline-none peer-focus:ring-blue-300 after:ltr:left-0.5 peer-checked:after:ltr:translate-x-full after:rtl:right-0.5 peer-checked:after:rtl:-translate-x-full dark:bg-gray-800 dark:after:border-white dark:after:bg-white dark:peer-checked:bg-gray-950\"\n                for=\"{{ $name }}\"\n            ></label>\n        </label>\n\n        @break\n\n    @case('image')\n        <x-admin::media.images\n            name=\"{{ $name }}\"\n            ::class=\"[errors && errors['{{ $name }}'] ? 'border !border-red-600 hover:border-red-600' : '']\"\n            {{ $attributes }}\n        />\n\n        @break\n    \n    @case('inline')\n        <x-admin::form.control-group.controls.inline.text {{ $attributes }}/>\n\n        @break\n\n    @case('custom')\n        <v-field {{ $attributes }}>\n            {{ $slot }}\n        </v-field>\n\n        @break\n\n    @case('tags')\n        <x-admin::form.control-group.controls.tags\n            :name=\"$name\"\n            :data=\"$attributes->get(':data') ?? $attributes->get('data')\"\n            {{ $attributes}}\n        />\n        @break\n@endswitch\n\n@pushOnce('scripts')\n    <script\n        type=\"text/x-template\"\n        id=\"v-checked-handler-template\"\n    >\n    </script>\n\n    <script type=\"module\">\n        app.component('v-checked-handler', {\n            template: '#v-checked-handler-template',\n\n            props: ['field', 'checked'],\n\n            mounted() {\n                if (this.checked == '') {\n                    return;\n                }\n\n                this.field.checked = true;\n\n                this.field.onChange();\n            },\n        });\n    </script>\n@endpushOnce"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/views/components/form/control-group/error.blade.php",
    "content": "@props([\n    'name' => null,\n    'controlName' => '',\n])\n\n<v-error-message\n    {{ $attributes }}\n    name=\"{{ $name ?? $controlName }}\"\n    v-slot=\"{ message }\"\n>\n    <p\n        {{ $attributes->merge(['class' => 'mt-1 text-xs italic text-red-600']) }}\n        v-text=\"message\"\n    >\n    </p>\n</v-error-message>\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/views/components/form/control-group/index.blade.php",
    "content": "<div {{ $attributes->merge(['class' => 'mb-4']) }}>\n    {{ $slot }}\n</div>\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/views/components/form/control-group/label.blade.php",
    "content": "<label {{ $attributes->merge(['class' => 'mb-1.5 flex items-center gap-1 text-sm font-normal text-gray-800 dark:text-white']) }}>\n    {{ $slot }}\n</label>\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/views/components/form/index.blade.php",
    "content": "<!--\n    If a component has the as attribute, it indicates that it uses\n    the ajaxified form or some customized slot form.\n-->\n@if ($attributes->has('as'))\n    <v-form {{ $attributes }}>\n        {{ $slot }}\n    </v-form>\n\n<!--\n    Otherwise, a traditional form will be provided with a minimal\n    set of configurations.\n-->\n@else\n    @props([\n        'method' => 'POST',\n    ])\n\n    @php\n        $method = strtoupper($method);\n    @endphp\n\n    <v-form\n        method=\"{{ $method === 'GET' ? 'GET' : 'POST' }}\"\n        :initial-errors=\"{{ json_encode($errors->getMessages()) }}\"\n        v-slot=\"{ meta, errors, setValues }\"\n        @invalid-submit=\"onInvalidSubmit\"\n        {{ $attributes }}\n    >\n        @unless(in_array($method, ['HEAD', 'GET', 'OPTIONS']))\n            @csrf\n        @endunless\n\n        @if (! in_array($method, ['GET', 'POST']))\n            @method($method)\n        @endif\n\n        {{ $slot }}\n    </v-form>\n@endif"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/views/components/layouts/index.blade.php",
    "content": "<!DOCTYPE html>\n\n<html\n    lang=\"{{ app()->getLocale() }}\"\n    dir=\"{{ in_array(app()->getLocale(), ['fa', 'ar']) ? 'rtl' : 'ltr' }}\"\n>\n\n<head>\n    <title>{{ $title ?? '' }}</title>\n\n    <meta charset=\"UTF-8\">\n\n    <meta\n        http-equiv=\"X-UA-Compatible\"\n        content=\"IE=edge\"\n    >\n    \n    <meta\n        http-equiv=\"content-language\"\n        content=\"{{ app()->getLocale() }}\"\n    >\n\n    <meta\n        name=\"viewport\"\n        content=\"width=device-width, initial-scale=1\"\n    >\n    <meta\n        name=\"base-url\"\n        content=\"{{ url()->to('/') }}\"\n    >\n\n    @stack('meta')\n\n    {{\n        vite()->set(['src/Resources/assets/css/app.css', 'src/Resources/assets/js/app.js'], 'webform')\n    }}\n\n    <link\n        href=\"https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700;800&display=swap\"\n        rel=\"stylesheet\"\n    />\n\n    <link\n        href=\"https://fonts.googleapis.com/css2?family=DM+Serif+Display&display=swap\"\n        rel=\"stylesheet\"\n    />\n\n    @if ($favicon = core()->getConfigData('general.design.admin_logo.favicon'))\n        <link\n            type=\"image/x-icon\"\n            href=\"{{ Storage::url($favicon) }}\"\n            rel=\"shortcut icon\"\n            sizes=\"16x16\"\n        >\n    @else\n        <link\n            type=\"image/x-icon\"\n            href=\"{{ vite()->asset('images/favicon.ico') }}\"\n            rel=\"shortcut icon\"\n            sizes=\"16x16\"\n        />\n    @endif\n\n    @stack('styles')\n\n    <style>\n        {!! core()->getConfigData('general.content.custom_scripts.custom_css') !!}\n    </style>\n\n    {!! view_render_event('webform.layout.head') !!}\n</head>\n\n<body>\n    {!! view_render_event('webform.layout.body.before') !!}\n\n    <div id=\"app\">\n        <!-- Flash Message Blade Component -->\n        <x-web_form::flash-group />\n\n        {!! view_render_event('webform.layout.content.before') !!}\n\n        <!-- Page Content Blade Component -->\n        {{ $slot }}\n\n        {!! view_render_event('webform.layout.content.after') !!}\n    </div>\n\n    {!! view_render_event('webform.layout.body.after') !!}\n\n    @stack('scripts')\n\n    {!! view_render_event('webform.layout.vue-app-mount.before') !!}\n\n    <script>\n        /**\n         * Load event, the purpose of using the event is to mount the application\n         * after all of our Vue components which is present in blade file have\n         * been registered in the app. No matter what app.mount() should be\n         * called in the last.\n         */\n        window.addEventListener(\"load\", function(event) {\n            app.mount(\"#app\");\n        });\n    </script>\n\n    {!! view_render_event('webform.layout.vue-app-mount.after') !!}\n\n    <script type=\"text/javascript\">\n        {!! core()->getConfigData('general.content.custom_scripts.custom_javascript') !!}\n    </script>\n</body>\n\n</html>\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/views/components/spinner/index.blade.php",
    "content": "<!-- Spinner -->\n@props(['color' => 'currentColor'])\n\n<svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    fill=\"none\"\n    aria-hidden=\"true\"\n    viewBox=\"0 0 24 24\"\n    {{ $attributes->merge(['class' => 'h-5 w-5 animate-spin']) }}\n>\n    <circle\n        class=\"opacity-25\"\n        cx=\"12\"\n        cy=\"12\"\n        r=\"10\"\n        stroke=\"{{ $color }}\"\n        stroke-width=\"4\"\n    >\n    </circle>\n\n    <path\n        class=\"opacity-75\"\n        fill=\"{{ $color }}\"\n        d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n    >\n    </path>\n</svg>"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/views/settings/web-forms/controls.blade.php",
    "content": "@foreach ($webForm->attributes as $attribute)\n    @php\n        $parentAttribute = $attribute->attribute;\n\n        $fieldName = $parentAttribute->entity_type . '[' . $parentAttribute->code . ']';\n\n        $validations = $attribute->is_required ? 'required' : '';\n    @endphp\n\n    <x-web_form::form.control-group>\n        <x-web_form::form.control-group.label\n            :for=\"$fieldName\"\n            class=\"{{ $validations }}\"\n            style=\"color: {{ $webForm->attribute_label_color }} !important;\"\n        >\n            {{ $attribute->name ?? $parentAttribute->name }}\n        </x-web_form::form.control-group.label>\n\n        @switch($parentAttribute->type)\n            @case('text')\n                <x-web_form::form.control-group.control\n                    type=\"text\"\n                    :name=\"$fieldName\"\n                    :id=\"$fieldName\"\n                    :rules=\"$validations\"\n                    :label=\"$attribute->name ?? $parentAttribute->name\"\n                    :placeholder=\"$attribute->placeholder\"\n                />\n\n                <x-web_form::form.control-group.error :control-name=\"$fieldName\" />\n\n                @break\n\n            @case('price')\n                <x-web_form::form.control-group.control\n                    type=\"text\"\n                    :name=\"$fieldName\"\n                    :id=\"$fieldName\"\n                    :rules=\"$validations.'|numeric'\"\n                    :label=\"$attribute->name ?? $parentAttribute->name\"\n                    :placeholder=\"$attribute->placeholder\"\n                />\n\n                <x-web_form::form.control-group.error :control-name=\"$fieldName\" />\n\n                @break\n\n            @case('email')\n                <x-web_form::form.control-group.control\n                    type=\"email\"\n                    name=\"{{ $fieldName }}[0][value]\"\n                    id=\"{{ $fieldName }}[0][value]\"\n                    rules=\"{{ $validations }}|email\"\n                    :label=\"$attribute->name ?? $parentAttribute->name\"\n                    :placeholder=\"$attribute->placeholder\"\n                />\n\n                <x-web_form::form.control-group.control\n                    type=\"hidden\"\n                    name=\"{{ $fieldName }}[0][label]\"\n                    id=\"{{ $fieldName }}[0][label]\"\n                    rules=\"required\"\n                    value=\"work\"\n                />\n\n                <x-web_form::form.control-group.error control-name=\"{{ $fieldName }}[0][value]\" />\n\n                @break\n\n            @case('checkbox')\n                @php\n                    $options = $parentAttribute->lookup_type\n                        ? app('Webkul\\Attribute\\Repositories\\AttributeRepository')->getLookUpOptions($parentAttribute->lookup_type)\n                        : $parentAttribute->options()->orderBy('sort_order')->get();\n                @endphp\n\n                @foreach ($options as $option)\n                    <x-web_form::form.control-group class=\"!mb-2 flex select-none items-center gap-2.5\">\n                        <x-web_form::form.control-group.control\n                            type=\"checkbox\"\n                            name=\"{{ $fieldName }}[]\"\n                            id=\"{{ $fieldName }}[]\"\n                            value=\"{{ $option->id }}\"\n                            for=\"{{ $fieldName }}[]\"\n                        />\n\n                        <label\n                            class=\"cursor-pointer text-xs font-medium text-gray-600 dark:text-gray-300\"\n                            for=\"{{ $fieldName }}[]\"\n                        >\n                            @lang('web_form::app.catalog.attributes.edit.is-required')\n                        </label>\n                    </x-web_form::form.control-group>\n                @endforeach\n\n            @case('file')\n            @case('image')\n                <x-web_form::form.control-group.control\n                    type=\"file\"\n                    :name=\"$fieldName\"\n                    :id=\"$fieldName\"\n                    :rules=\"$validations\"\n                    :placeholder=\"$attribute->placeholder\"\n                    :label=\"$attribute->name ?? $parentAttribute->name\"\n                />\n\n                <x-web_form::form.control-group.error control-name=\"{{ $fieldName }}\" />\n\n                @break;\n\n            @case('phone')\n                <x-web_form::form.control-group.control\n                    type=\"text\"\n                    name=\"{{ $fieldName }}[0][value]\"\n                    id=\"{{ $fieldName }}[0][value]\"\n                    rules=\"{{ $validations }}|phone\"\n                    :label=\"$attribute->name ?? $parentAttribute->name\"\n                    :placeholder=\"$attribute->placeholder\"\n                />\n\n                <x-web_form::form.control-group.control\n                    type=\"hidden\"\n                    name=\"{{ $fieldName }}[0][label]\"\n                    id=\"{{ $fieldName }}[0][label]\"\n                    rules=\"required\"\n                    value=\"work\"\n                />\n\n                <x-web_form::form.control-group.error control-name=\"{{ $fieldName }}[0][value]\" />\n\n                @break\n\n            @case('date')\n                <x-web_form::form.control-group.control\n                    type=\"date\"\n                    :name=\"$fieldName\"\n                    :id=\"$fieldName\"\n                    :rules=\"$validations\"\n                    :label=\"$attribute->name ?? $parentAttribute->name\"\n                    :placeholder=\"$attribute->placeholder\"\n                />\n\n                <x-web_form::form.control-group.error :control-name=\"$fieldName\" />\n\n                @break\n\n            @case('datetime')\n                <x-web_form::form.control-group.control\n                    type=\"datetime\"\n                    :name=\"$fieldName\"\n                    :id=\"$fieldName\"\n                    :rules=\"$validations\"\n                    :label=\"$attribute->name ?? $parentAttribute->name\"\n                    :placeholder=\"$attribute->placeholder\"\n                />\n\n                <x-web_form::form.control-group.error :control-name=\"$fieldName\" />\n\n                @break\n\n            @case('select')\n            @case('lookup')\n                @php\n                    $options = $parentAttribute->lookup_type\n                        ? app('Webkul\\Attribute\\Repositories\\AttributeRepository')->getLookUpOptions($parentAttribute->lookup_type)\n                        : $parentAttribute->options()->orderBy('sort_order')->get();\n                @endphp\n\n                <x-web_form::form.control-group.control\n                    type=\"select\"\n                    :name=\"$fieldName\"\n                    :id=\"$fieldName\"\n                    :rules=\"$validations\"\n                    :label=\"$attribute->name ?? $parentAttribute->name\"\n                    :placeholder=\"$attribute->placeholder\"\n                >\n                    @foreach ($options as $option)\n                        <option value=\"{{ $option->id }}\">{{ $option->name }}</option>\n                    @endforeach\n                </x-web_form::form.control-group.control>\n\n                <x-web_form::form.control-group.error :control-name=\"$fieldName\" />\n\n                @break\n\n            @case('multiselect')\n                @php\n                    $options = $parentAttribute->lookup_type\n                        ? app('Webkul\\Attribute\\Repositories\\AttributeRepository')->getLookUpOptions($parentAttribute->lookup_type)\n                        : $parentAttribute->options()->orderBy('sort_order')->get();\n                @endphp\n\n                <x-web_form::form.control-group.control\n                    type=\"select\"\n                    id=\"{{ $fieldName }}\"\n                    name=\"{{ $fieldName }}[]\"\n                    :rules=\"$validations\"\n                    :label=\"$attribute->name ?? $parentAttribute->name\"\n                    :placeholder=\"$attribute->placeholder\"\n                >\n                    @foreach ($options as $option)\n                        <option value=\"{{ $option->id }}\">{{ $option->name }}</option>\n                    @endforeach\n                </x-web_form::form.control-group.control>\n\n                <x-web_form::form.control-group.error :control-name=\"$fieldName\" />\n\n                @break\n\n            @case('checkbox')\n                <div class=\"checkbox-control\">\n                    @php\n                        $options = $parentAttribute->lookup_type\n                            ? app('Webkul\\Attribute\\Repositories\\AttributeRepository')->getLookUpOptions($parentAttribute->lookup_type)\n                            : $parentAttribute->options()->orderBy('sort_order')->get();\n                    @endphp\n\n                    @foreach ($options as $option)\n                        <span class=\"checkbox\">\n                            <input\n                                type=\"checkbox\"\n                                name=\"{{ $fieldName }}[]\"\n                                value=\"{{ $option->id }}\"\n                            />\n\n                            <label class=\"checkbox-view\" style=\"display: inline;\"></label>\n                            {{ $option->name }}\n                        </span>\n                    @endforeach\n                </div>\n\n                <p\n                    id=\"{{ $fieldName }}[]-error\"\n                    class=\"error-message mt-1 text-xs italic text-red-600\"\n                ></p>\n\n                @break\n\n            @case('boolean')\n                <x-web_form::form.control-group.control\n                    type=\"select\"\n                    :name=\"$fieldName\"\n                    :id=\"$fieldName\"\n                    :rules=\"$validations\"\n                    :label=\"$attribute->name ?? $parentAttribute->name\"\n                    :placeholder=\"$attribute->placeholder\"\n                >\n                    <option value=\"1\">Yes</option>\n                    <option value=\"0\">No</option>\n                </x-web_form::form.control-group.control>\n\n                <x-web_form::form.control-group.error :control-name=\"$fieldName\" />\n\n                @break\n        @endswitch\n    </x-web_form::form.control-group>\n@endforeach\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/views/settings/web-forms/embed.blade.php",
    "content": "(function() {\n    document.write(`{!! view('web_form::settings.web-forms.preview', compact('webForm'))->render() !!}`.replaceAll('$', '\\$'));\n})();"
  },
  {
    "path": "packages/Webkul/WebForm/src/Resources/views/settings/web-forms/preview.blade.php",
    "content": "<x-web_form::layouts>\n    <x-slot:title>\n        {{ strip_tags($webForm->title) }}\n    </x-slot>\n\n    <!-- Web Form -->\n    <v-web-form>\n        <div class=\"flex h-[100vh] items-center justify-center\">\n            <div class=\"flex flex-col items-center gap-5\">\n                <x-web_form::spinner />\n            </div>\n        </div>\n    </v-web-form>\n\n    @pushOnce('scripts')\n        <script\n            type=\"text/template\"\n            id=\"v-web-form-template\"\n        >\n            <div\n                class=\"flex h-[100vh] items-center justify-center\"\n                style=\"background-color: {{ $webForm->background_color }}\"\n            >\n                <div class=\"flex flex-col items-center gap-5\">\n                    <!-- Logo -->\n                    <img\n                        class=\"w-max\"\n                        src=\"{{ vite()->asset('images/logo.svg') }}\"\n                        alt=\"{{ config('app.name') }}\"\n                    />\n\n                    <h1\n                        class=\"text-2xl font-bold\"\n                        style=\"color: {{ $webForm->form_title_color }} !important;\"\n                    >\n                        {{ $webForm->title }}\n                    </h1>\n\n                    <p class=\"mt-2 text-base text-gray-600\">{{ $webForm->description }}</p>\n\n                    <div\n                        class=\"box-shadow flex min-w-[300px] flex-col rounded-lg border border-gray-200 bg-white p-4 dark:bg-gray-900\"\n                        style=\"background-color: {{ $webForm->form_background_color }}\"\n                    >\n                        {!! view_render_event('web_forms.web_forms.form_controls.before', ['webForm' => $webForm]) !!}\n\n                        <!-- Webform Form -->\n                        <x-web_form::form\n                            v-slot=\"{ meta, values, errors, handleSubmit }\"\n                            as=\"div\"\n                            ref=\"modalForm\"\n                        >\n                            <form\n                                @submit=\"handleSubmit($event, create)\"\n                                ref=\"webForm\"\n                            >\n                                @include('web_form::settings.web-forms.controls')\n\n                                <div class=\"flex justify-center\">\n                                    <x-web_form::button\n                                        class=\"primary-button\"\n                                        :title=\"$webForm->submit_button_label\"\n                                        ::loading=\"isStoring\"\n                                        ::disabled=\"isStoring\"\n                                        style=\"background-color: {{ $webForm->form_submit_button_color }} !important\"\n                                    />\n                                </div>\n                            </form>\n                        </x-web_form::form>\n\n                        {!! view_render_event('web_forms.web_forms.form_controls.after', ['webForm' => $webForm]) !!}\n                    </div>\n                </div>\n            </div>\n        </script>\n\n        <script type=\"module\">\n            app.component('v-web-form', {\n                template: '#v-web-form-template',\n\n                data() {\n                    return {\n                        isStoring: false,\n                    };\n                },\n\n                methods: {\n                    create(params, { resetForm, setErrors }) {\n                        this.isStoring = true;\n\n                        const formData = new FormData(this.$refs.webForm);\n\n                        let inputNames = Array.from(formData.keys());\n\n                        inputNames = inputNames.reduce((acc, name) => {\n                            const dotName = name.replace(/\\[([^\\]]+)\\]/g, '.$1');\n\n                            acc[dotName] = name;\n\n                            return acc;\n                        }, {});\n\n                        this.$axios\n                            .post('{{ route('admin.settings.web_forms.form_store', $webForm->id) }}', formData, {\n                                headers: {\n                                    'Content-Type': 'multipart/form-data',\n                                },\n                            })\n                            .then(response => {\n                                resetForm();\n\n                                this.$refs.webForm.reset();\n\n                                this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });\n                            })\n                            .catch(error => {\n                                if (error.response.data.redirect) {\n                                    window.location.href = error.response.data.redirect;\n\n                                    return;\n                                }\n\n                                if (! error.response.data.errors) {\n                                    this.$emitter.emit('add-flash', { type: 'error', message: error.response.data.message });\n\n                                    return;\n                                }\n\n                                const laravelErrors = error.response.data.errors || {};\n                                const mappedErrors = {};\n\n                                for (\n                                    const [dotKey, messages]\n                                    of Object.entries(laravelErrors)\n                                ) {\n                                    const inputName = inputNames[dotKey];\n\n                                    if (\n                                        inputName\n                                        && messages.length\n                                    ) {\n                                        mappedErrors[inputName] = messages[0];\n                                    }\n                                }\n\n                                setErrors(mappedErrors);\n                            })\n                            .finally(() => {\n                                this.isStoring = false;\n                            });\n                    }\n                }\n            });\n        </script>\n    @endPushOnce\n</x-web_form::layouts>\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Routes/routes.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Route;\nuse Webkul\\WebForm\\Http\\Controllers\\WebFormController;\n\nRoute::controller(WebFormController::class)->middleware(['web', 'admin_locale'])->prefix('web-forms')->group(function () {\n    Route::get('forms/{id}/form.js', 'formJS')->name('admin.settings.web_forms.form_js');\n\n    Route::get('forms/{id}/form.html', 'preview')->name('admin.settings.web_forms.preview');\n\n    Route::post('forms/{id}', 'formStore')->name('admin.settings.web_forms.form_store');\n\n    Route::group(['middleware' => ['user']], function () {\n        Route::get('form/{id}/form.html', 'view')->name('admin.settings.web_forms.view');\n    });\n});\n"
  },
  {
    "path": "packages/Webkul/WebForm/src/Rules/PhoneNumber.php",
    "content": "<?php\n\nnamespace Webkul\\WebForm\\Rules;\n\nuse Illuminate\\Contracts\\Validation\\Rule;\n\nclass PhoneNumber implements Rule\n{\n    /**\n     * Determine if the validation rule passes.\n     *\n     * @param  string  $attribute\n     * @param  mixed  $value\n     * @return bool\n     */\n    public function passes($attribute, $value)\n    {\n        // This regular expression allows phone numbers with the following conditions:\n        // - The phone number can start with an optional \"+\" sign.\n        // - After the \"+\" sign, there should be one or more digits.\n        return preg_match('/^\\+?\\d+$/', $value);\n    }\n\n    /**\n     * Get the validation error message.\n     *\n     * @return string\n     */\n    public function message()\n    {\n        return trans('web_form::app.validations.invalid-phone-number');\n    }\n}\n"
  },
  {
    "path": "packages/Webkul/WebForm/tailwind.config.js",
    "content": "/** @type {import('tailwindcss').Config} */\nmodule.exports = {\n    content: [\"./src/Resources/**/*.blade.php\", \"./src/Resources/**/*.js\"],\n\n    theme: {\n        container: {\n            center: true,\n\n            screens: {\n                \"2xl\": \"1920px\",\n            },\n\n            padding: {\n                DEFAULT: \"16px\",\n            },\n        },\n\n        screens: {\n            sm: \"525px\",\n            md: \"768px\",\n            lg: \"1024px\",\n            xl: \"1240px\",\n            \"2xl\": \"1920px\",\n        },\n\n        extend: {\n            colors: {\n                brandColor: '#0E90D9',\n            },\n\n            fontFamily: {\n                inter: ['Inter'],\n                icon: ['icomoon']\n            }\n        },\n    },\n    \n    darkMode: 'class',\n\n    plugins: [],\n\n    safelist: [\n        {\n            pattern: /icon-/,\n        }\n    ]\n};"
  },
  {
    "path": "packages/Webkul/WebForm/vite.config.js",
    "content": "import { defineConfig, loadEnv } from \"vite\";\nimport vue from \"@vitejs/plugin-vue\";\nimport laravel from \"laravel-vite-plugin\";\nimport path from \"path\";\n\nexport default defineConfig(({ mode }) => {\n    const envDir = \"../../../\";\n\n    Object.assign(process.env, loadEnv(mode, envDir));\n\n    return {\n        build: {\n            emptyOutDir: true,\n        },\n\n        envDir,\n\n        server: {\n            host: process.env.VITE_HOST || \"localhost\",\n            port: process.env.VITE_PORT || 5174,\n        },\n\n        plugins: [\n            vue(),\n\n            laravel({\n                hotFile: \"../../../public/webform-vite.hot\",\n                publicDirectory: \"../../../public\",\n                buildDirectory: \"webform/build\",\n                input: [\n                    \"src/Resources/assets/css/app.css\",\n                    \"src/Resources/assets/js/app.js\",\n                ],\n                refresh: true,\n            }),\n        ],\n\n        experimental: {\n            renderBuiltUrl(filename, { hostId, hostType, type }) {\n                if (hostType === \"css\") {\n                    return path.basename(filename);\n                }\n            },\n        },\n    };\n});"
  },
  {
    "path": "phpunit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit\n    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n    xsi:noNamespaceSchemaLocation=\"vendor/phpunit/phpunit/phpunit.xsd\"\n    bootstrap=\"vendor/autoload.php\"\n    colors=\"true\"\n    cacheDirectory=\".phpunit.cache\"\n>\n    <testsuites>\n        <testsuite name=\"Unit\">\n            <directory suffix=\"Test.php\">./tests/Unit</directory>\n        </testsuite>\n\n        <testsuite name=\"Feature\">\n            <directory suffix=\"Test.php\">./tests/Feature</directory>\n        </testsuite>\n    </testsuites>\n\n    <source>\n        <include>\n            <directory suffix=\".php\">./app</directory>\n        </include>\n    </source>\n\n    <php>\n        <env name=\"APP_ENV\" value=\"testing\" />\n        <env name=\"APP_MAINTENANCE_DRIVER\" value=\"file\" />\n        <env name=\"BCRYPT_ROUNDS\" value=\"4\" />\n        <env name=\"CACHE_STORE\" value=\"array\" />\n        <env name=\"MAIL_MAILER\" value=\"array\" />\n        <env name=\"PULSE_ENABLED\" value=\"false\" />\n        <env name=\"QUEUE_CONNECTION\" value=\"sync\" />\n        <env name=\"SESSION_DRIVER\" value=\"array\" />\n        <env name=\"TELESCOPE_ENABLED\" value=\"false\" />\n    </php>\n</phpunit>\n"
  },
  {
    "path": "pint.json",
    "content": "{\n    \"preset\": \"laravel\",\n    \"rules\": {\n        \"binary_operator_spaces\": {\n            \"operators\": {\n                \"=>\": \"single_space\"\n            }\n        }\n    }\n}"
  },
  {
    "path": "public/.htaccess",
    "content": "# Rewrite Module\n<IfModule mod_rewrite.c>\n    <IfModule mod_negotiation.c>\n        Options -MultiViews -Indexes\n    </IfModule>\n\n    RewriteEngine On\n\n    # Handle Authorization Header\n    RewriteCond %{HTTP:Authorization} .\n    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]\n\n    # Redirect Trailing Slashes If Not A Folder...\n    RewriteCond %{REQUEST_FILENAME} !-d\n    RewriteCond %{REQUEST_URI} (.+)/$\n    RewriteRule ^ %1 [L,R=301]\n\n    # Handle Front Controller...\n    RewriteCond %{REQUEST_FILENAME} !-d\n    RewriteCond %{REQUEST_FILENAME} !-f\n    RewriteRule ^ index.php [L]\n</IfModule>\n"
  },
  {
    "path": "public/admin/build/assets/app-B1rBjssc.js",
    "content": "const xE=\"modulepreload\",NE=function(e,t){return new URL(e,t).href},xd={},He=function(t,n,r){let i=Promise.resolve();if(n&&n.length>0){const o=document.getElementsByTagName(\"link\"),a=document.querySelector(\"meta[property=csp-nonce]\"),l=(a==null?void 0:a.nonce)||(a==null?void 0:a.getAttribute(\"nonce\"));i=Promise.allSettled(n.map(c=>{if(c=NE(c,r),c in xd)return;xd[c]=!0;const u=c.endsWith(\".css\"),f=u?'[rel=\"stylesheet\"]':\"\";if(!!r)for(let m=o.length-1;m>=0;m--){const g=o[m];if(g.href===c&&(!u||g.rel===\"stylesheet\"))return}else if(document.querySelector(`link[href=\"${c}\"]${f}`))return;const p=document.createElement(\"link\");if(p.rel=u?\"stylesheet\":xE,u||(p.as=\"script\"),p.crossOrigin=\"\",p.href=c,l&&p.setAttribute(\"nonce\",l),document.head.appendChild(p),u)return new Promise((m,g)=>{p.addEventListener(\"load\",m),p.addEventListener(\"error\",()=>g(new Error(`Unable to preload CSS for ${c}`)))})}))}function s(o){const a=new Event(\"vite:preloadError\",{cancelable:!0});if(a.payload=o,window.dispatchEvent(a),!a.defaultPrevented)throw o}return i.then(o=>{for(const a of o||[])a.status===\"rejected\"&&s(a.reason);return t().catch(s)})};/**\n* @vue/shared v3.5.16\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**//*! #__NO_SIDE_EFFECTS__ */function zt(e){const t=Object.create(null);for(const n of e.split(\",\"))t[n]=1;return n=>n in t}const et={},bi=[],Ft=()=>{},Zi=()=>!1,ai=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Al=e=>e.startsWith(\"onUpdate:\"),Ze=Object.assign,_l=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},IE=Object.prototype.hasOwnProperty,st=(e,t)=>IE.call(e,t),ye=Array.isArray,Si=e=>Vi(e)===\"[object Map]\",li=e=>Vi(e)===\"[object Set]\",mu=e=>Vi(e)===\"[object Date]\",Kp=e=>Vi(e)===\"[object RegExp]\",Pe=e=>typeof e==\"function\",ke=e=>typeof e==\"string\",Sn=e=>typeof e==\"symbol\",ct=e=>e!==null&&typeof e==\"object\",Ml=e=>(ct(e)||Pe(e))&&Pe(e.then)&&Pe(e.catch),cf=Object.prototype.toString,Vi=e=>cf.call(e),Gp=e=>Vi(e).slice(8,-1),xo=e=>Vi(e)===\"[object Object]\",xl=e=>ke(e)&&e!==\"NaN\"&&e[0]!==\"-\"&&\"\"+parseInt(e,10)===e,xr=zt(\",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"),Xp=zt(\"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"),Nl=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},RE=/-(\\w)/g,gt=Nl(e=>e.replace(RE,(t,n)=>n?n.toUpperCase():\"\")),PE=/\\B([A-Z])/g,ln=Nl(e=>e.replace(PE,\"-$1\").toLowerCase()),ci=Nl(e=>e.charAt(0).toUpperCase()+e.slice(1)),Ti=Nl(e=>e?`on${ci(e)}`:\"\"),on=(e,t)=>!Object.is(e,t),wi=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},uf=(e,t,n,r=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},lo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},co=e=>{const t=ke(e)?Number(e):NaN;return isNaN(t)?e:t};let Nd;const No=()=>Nd||(Nd=typeof globalThis<\"u\"?globalThis:typeof self<\"u\"?self:typeof window<\"u\"?window:typeof global<\"u\"?global:{}),LE=/^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;function kE(e){return LE.test(e)?`__props.${e}`:`__props[${JSON.stringify(e)}]`}function Jp(e,t){return e+JSON.stringify(t,(n,r)=>typeof r==\"function\"?r.toString():r)}const FE={TEXT:1,1:\"TEXT\",CLASS:2,2:\"CLASS\",STYLE:4,4:\"STYLE\",PROPS:8,8:\"PROPS\",FULL_PROPS:16,16:\"FULL_PROPS\",NEED_HYDRATION:32,32:\"NEED_HYDRATION\",STABLE_FRAGMENT:64,64:\"STABLE_FRAGMENT\",KEYED_FRAGMENT:128,128:\"KEYED_FRAGMENT\",UNKEYED_FRAGMENT:256,256:\"UNKEYED_FRAGMENT\",NEED_PATCH:512,512:\"NEED_PATCH\",DYNAMIC_SLOTS:1024,1024:\"DYNAMIC_SLOTS\",DEV_ROOT_FRAGMENT:2048,2048:\"DEV_ROOT_FRAGMENT\",CACHED:-1,\"-1\":\"CACHED\",BAIL:-2,\"-2\":\"BAIL\"},VE={1:\"TEXT\",2:\"CLASS\",4:\"STYLE\",8:\"PROPS\",16:\"FULL_PROPS\",32:\"NEED_HYDRATION\",64:\"STABLE_FRAGMENT\",128:\"KEYED_FRAGMENT\",256:\"UNKEYED_FRAGMENT\",512:\"NEED_PATCH\",1024:\"DYNAMIC_SLOTS\",2048:\"DEV_ROOT_FRAGMENT\",[-1]:\"HOISTED\",[-2]:\"BAIL\"},BE={ELEMENT:1,1:\"ELEMENT\",FUNCTIONAL_COMPONENT:2,2:\"FUNCTIONAL_COMPONENT\",STATEFUL_COMPONENT:4,4:\"STATEFUL_COMPONENT\",TEXT_CHILDREN:8,8:\"TEXT_CHILDREN\",ARRAY_CHILDREN:16,16:\"ARRAY_CHILDREN\",SLOTS_CHILDREN:32,32:\"SLOTS_CHILDREN\",TELEPORT:64,64:\"TELEPORT\",SUSPENSE:128,128:\"SUSPENSE\",COMPONENT_SHOULD_KEEP_ALIVE:256,256:\"COMPONENT_SHOULD_KEEP_ALIVE\",COMPONENT_KEPT_ALIVE:512,512:\"COMPONENT_KEPT_ALIVE\",COMPONENT:6,6:\"COMPONENT\"},jE={STABLE:1,1:\"STABLE\",DYNAMIC:2,2:\"DYNAMIC\",FORWARDED:3,3:\"FORWARDED\"},HE={1:\"STABLE\",2:\"DYNAMIC\",3:\"FORWARDED\"},UE=\"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\",ff=zt(UE),$E=ff,Id=2;function Zp(e,t=0,n=e.length){if(t=Math.max(0,Math.min(t,e.length)),n=Math.max(0,Math.min(n,e.length)),t>n)return\"\";let r=e.split(/(\\r?\\n)/);const i=r.filter((a,l)=>l%2===1);r=r.filter((a,l)=>l%2===0);let s=0;const o=[];for(let a=0;a<r.length;a++)if(s+=r[a].length+(i[a]&&i[a].length||0),s>=t){for(let l=a-Id;l<=a+Id||n>s;l++){if(l<0||l>=r.length)continue;const c=l+1;o.push(`${c}${\" \".repeat(Math.max(3-String(c).length,0))}|  ${r[l]}`);const u=r[l].length,f=i[l]&&i[l].length||0;if(l===a){const d=t-(s-(u+f)),p=Math.max(1,n>s?u-d:n-t);o.push(\"   |  \"+\" \".repeat(d)+\"^\".repeat(p))}else if(l>a){if(n>s){const d=Math.max(Math.min(n-s,u),1);o.push(\"   |  \"+\"^\".repeat(d))}s+=u+f}}break}return o.join(`\n`)}function vs(e){if(ye(e)){const t={};for(let n=0;n<e.length;n++){const r=e[n],i=ke(r)?df(r):vs(r);if(i)for(const s in i)t[s]=i[s]}return t}else if(ke(e)||ct(e))return e}const WE=/;(?![^(]*\\))/g,YE=/:([^]+)/,zE=/\\/\\*[^]*?\\*\\//g;function df(e){const t={};return e.replace(zE,\"\").split(WE).forEach(n=>{if(n){const r=n.split(YE);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function KE(e){if(!e)return\"\";if(ke(e))return e;let t=\"\";for(const n in e){const r=e[n];if(ke(r)||typeof r==\"number\"){const i=n.startsWith(\"--\")?n:ln(n);t+=`${i}:${r};`}}return t}function ys(e){let t=\"\";if(ke(e))t=e;else if(ye(e))for(let n=0;n<e.length;n++){const r=ys(e[n]);r&&(t+=r+\" \")}else if(ct(e))for(const n in e)e[n]&&(t+=n+\" \");return t.trim()}function Qp(e){if(!e)return null;let{class:t,style:n}=e;return t&&!ke(t)&&(e.class=ys(t)),n&&(e.style=vs(n)),e}const GE=\"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\",XE=\"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,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,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\",JE=\"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\",ZE=\"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\",qp=zt(GE),em=zt(XE),tm=zt(JE),nm=zt(ZE),rm=\"itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly\",im=zt(rm),QE=zt(rm+\",async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected\");function hf(e){return!!e||e===\"\"}const qE=/[>/=\"'\\u0009\\u000a\\u000c\\u0020]/,Oc={};function eb(e){if(Oc.hasOwnProperty(e))return Oc[e];const t=qE.test(e);return t&&console.error(`unsafe attribute name: ${e}`),Oc[e]=!t}const tb={acceptCharset:\"accept-charset\",className:\"class\",htmlFor:\"for\",httpEquiv:\"http-equiv\"},nb=zt(\"accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap\"),rb=zt(\"xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan\"),ib=zt(\"accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns\");function sb(e){if(e==null)return!1;const t=typeof e;return t===\"string\"||t===\"number\"||t===\"boolean\"}const ob=/[\"'&<>]/;function ab(e){const t=\"\"+e,n=ob.exec(t);if(!n)return t;let r=\"\",i,s,o=0;for(s=n.index;s<t.length;s++){switch(t.charCodeAt(s)){case 34:i=\"&quot;\";break;case 38:i=\"&amp;\";break;case 39:i=\"&#39;\";break;case 60:i=\"&lt;\";break;case 62:i=\"&gt;\";break;default:continue}o!==s&&(r+=t.slice(o,s)),o=s+1,r+=i}return o!==s?r+t.slice(o,s):r}const lb=/^-?>|<!--|-->|--!>|<!-$/g;function cb(e){return e.replace(lb,\"\")}const sm=/[ !\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~]/g;function ub(e,t){return e.replace(sm,n=>t?n==='\"'?'\\\\\\\\\\\\\"':`\\\\\\\\${n}`:`\\\\${n}`)}function fb(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&r<e.length;r++)n=Pr(e[r],t[r]);return n}function Pr(e,t){if(e===t)return!0;let n=mu(e),r=mu(t);if(n||r)return n&&r?e.getTime()===t.getTime():!1;if(n=Sn(e),r=Sn(t),n||r)return e===t;if(n=ye(e),r=ye(t),n||r)return n&&r?fb(e,t):!1;if(n=ct(e),r=ct(t),n||r){if(!n||!r)return!1;const i=Object.keys(e).length,s=Object.keys(t).length;if(i!==s)return!1;for(const o in e){const a=e.hasOwnProperty(o),l=t.hasOwnProperty(o);if(a&&!l||!a&&l||!Pr(e[o],t[o]))return!1}}return String(e)===String(t)}function Io(e,t){return e.findIndex(n=>Pr(n,t))}const om=e=>!!(e&&e.__v_isRef===!0),pf=e=>ke(e)?e:e==null?\"\":ye(e)||ct(e)&&(e.toString===cf||!Pe(e.toString))?om(e)?pf(e.value):JSON.stringify(e,am,2):String(e),am=(e,t)=>om(t)?am(e,t.value):Si(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,i],s)=>(n[Ac(r,s)+\" =>\"]=i,n),{})}:li(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Ac(n))}:Sn(t)?Ac(t):ct(t)&&!ye(t)&&!xo(t)?String(t):t,Ac=(e,t=\"\")=>{var n;return Sn(e)?`Symbol(${(n=e.description)!=null?n:t})`:e},db=Object.freeze(Object.defineProperty({__proto__:null,EMPTY_ARR:bi,EMPTY_OBJ:et,NO:Zi,NOOP:Ft,PatchFlagNames:VE,PatchFlags:FE,ShapeFlags:BE,SlotFlags:jE,camelize:gt,capitalize:ci,cssVarNameEscapeSymbolsRE:sm,def:uf,escapeHtml:ab,escapeHtmlComment:cb,extend:Ze,genCacheKey:Jp,genPropsAccessExp:kE,generateCodeFrame:Zp,getEscapedCssVarName:ub,getGlobalThis:No,hasChanged:on,hasOwn:st,hyphenate:ln,includeBooleanAttr:hf,invokeArrayFns:wi,isArray:ye,isBooleanAttr:QE,isBuiltInDirective:Xp,isDate:mu,isFunction:Pe,isGloballyAllowed:ff,isGloballyWhitelisted:$E,isHTMLTag:qp,isIntegerKey:xl,isKnownHtmlAttr:nb,isKnownMathMLAttr:ib,isKnownSvgAttr:rb,isMap:Si,isMathMLTag:tm,isModelListener:Al,isObject:ct,isOn:ai,isPlainObject:xo,isPromise:Ml,isRegExp:Kp,isRenderableAttrValue:sb,isReservedProp:xr,isSSRSafeAttrName:eb,isSVGTag:em,isSet:li,isSpecialBooleanAttr:im,isString:ke,isSymbol:Sn,isVoidTag:nm,looseEqual:Pr,looseIndexOf:Io,looseToNumber:lo,makeMap:zt,normalizeClass:ys,normalizeProps:Qp,normalizeStyle:vs,objectToString:cf,parseStringStyle:df,propsToAttrMap:tb,remove:_l,slotFlagsText:HE,stringifyStyle:KE,toDisplayString:pf,toHandlerKey:Ti,toNumber:co,toRawType:Gp,toTypeString:Vi},Symbol.toStringTag,{value:\"Module\"}));/**\n* @vue/reactivity v3.5.16\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/let nn;class mf{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=nn,!t&&nn&&(this.index=(nn.scopes||(nn.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].pause();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].resume();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].resume()}}run(t){if(this._active){const n=nn;try{return nn=this,t()}finally{nn=n}}}on(){++this._on===1&&(this.prevScope=nn,nn=this)}off(){this._on>0&&--this._on===0&&(nn=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,r;for(n=0,r=this.effects.length;n<r;n++)this.effects[n].stop();for(this.effects.length=0,n=0,r=this.cleanups.length;n<r;n++)this.cleanups[n]();if(this.cleanups.length=0,this.scopes){for(n=0,r=this.scopes.length;n<r;n++)this.scopes[n].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const i=this.parent.scopes.pop();i&&i!==this&&(this.parent.scopes[this.index]=i,i.index=this.index)}this.parent=void 0}}}function hb(e){return new mf(e)}function lm(){return nn}function pb(e,t=!1){nn&&nn.cleanups.push(e)}let mt;const _c=new WeakSet;class uo{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,nn&&nn.active&&nn.effects.push(this)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,_c.has(this)&&(_c.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||um(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,Rd(this),fm(this);const t=mt,n=lr;mt=this,lr=!0;try{return this.fn()}finally{dm(this),mt=t,lr=n,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)yf(t);this.deps=this.depsTail=void 0,Rd(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?_c.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){gu(this)&&this.run()}get dirty(){return gu(this)}}let cm=0,Gs,Xs;function um(e,t=!1){if(e.flags|=8,t){e.next=Xs,Xs=e;return}e.next=Gs,Gs=e}function gf(){cm++}function vf(){if(--cm>0)return;if(Xs){let t=Xs;for(Xs=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Gs;){let t=Gs;for(Gs=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function fm(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function dm(e){let t,n=e.depsTail,r=n;for(;r;){const i=r.prevDep;r.version===-1?(r===n&&(n=i),yf(r),mb(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=i}e.deps=t,e.depsTail=n}function gu(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(hm(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function hm(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===fo)||(e.globalVersion=fo,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!gu(e))))return;e.flags|=2;const t=e.dep,n=mt,r=lr;mt=e,lr=!0;try{fm(e);const i=e.fn(e._value);(t.version===0||on(i,e._value))&&(e.flags|=128,e._value=i,t.version++)}catch(i){throw t.version++,i}finally{mt=n,lr=r,dm(e),e.flags&=-3}}function yf(e,t=!1){const{dep:n,prevSub:r,nextSub:i}=e;if(r&&(r.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let s=n.computed.deps;s;s=s.nextDep)yf(s,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function mb(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}function gb(e,t){e.effect instanceof uo&&(e=e.effect.fn);const n=new uo(e);t&&Ze(n,t);try{n.run()}catch(i){throw n.stop(),i}const r=n.run.bind(n);return r.effect=n,r}function vb(e){e.effect.stop()}let lr=!0;const pm=[];function Lr(){pm.push(lr),lr=!1}function kr(){const e=pm.pop();lr=e===void 0?!0:e}function Rd(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=mt;mt=void 0;try{t()}finally{mt=n}}}let fo=0;class yb{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Il{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!mt||!lr||mt===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==mt)n=this.activeLink=new yb(mt,this),mt.deps?(n.prevDep=mt.depsTail,mt.depsTail.nextDep=n,mt.depsTail=n):mt.deps=mt.depsTail=n,mm(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=mt.depsTail,n.nextDep=void 0,mt.depsTail.nextDep=n,mt.depsTail=n,mt.deps===n&&(mt.deps=r)}return n}trigger(t){this.version++,fo++,this.notify(t)}notify(t){gf();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{vf()}}}function mm(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)mm(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Ka=new WeakMap,Di=Symbol(\"\"),vu=Symbol(\"\"),ho=Symbol(\"\");function an(e,t,n){if(lr&&mt){let r=Ka.get(e);r||Ka.set(e,r=new Map);let i=r.get(n);i||(r.set(n,i=new Il),i.map=r,i.key=n),i.track()}}function Cr(e,t,n,r,i,s){const o=Ka.get(e);if(!o){fo++;return}const a=l=>{l&&l.trigger()};if(gf(),t===\"clear\")o.forEach(a);else{const l=ye(e),c=l&&xl(n);if(l&&n===\"length\"){const u=Number(r);o.forEach((f,d)=>{(d===\"length\"||d===ho||!Sn(d)&&d>=u)&&a(f)})}else switch((n!==void 0||o.has(void 0))&&a(o.get(n)),c&&a(o.get(ho)),t){case\"add\":l?c&&a(o.get(\"length\")):(a(o.get(Di)),Si(e)&&a(o.get(vu)));break;case\"delete\":l||(a(o.get(Di)),Si(e)&&a(o.get(vu)));break;case\"set\":Si(e)&&a(o.get(Di));break}}vf()}function Eb(e,t){const n=Ka.get(e);return n&&n.get(t)}function Hi(e){const t=rt(e);return t===e?t:(an(t,\"iterate\",ho),$n(e)?t:t.map(Jt))}function Rl(e){return an(e=rt(e),\"iterate\",ho),e}const bb={__proto__:null,[Symbol.iterator](){return Mc(this,Symbol.iterator,Jt)},concat(...e){return Hi(this).concat(...e.map(t=>ye(t)?Hi(t):t))},entries(){return Mc(this,\"entries\",e=>(e[1]=Jt(e[1]),e))},every(e,t){return Er(this,\"every\",e,t,void 0,arguments)},filter(e,t){return Er(this,\"filter\",e,t,n=>n.map(Jt),arguments)},find(e,t){return Er(this,\"find\",e,t,Jt,arguments)},findIndex(e,t){return Er(this,\"findIndex\",e,t,void 0,arguments)},findLast(e,t){return Er(this,\"findLast\",e,t,Jt,arguments)},findLastIndex(e,t){return Er(this,\"findLastIndex\",e,t,void 0,arguments)},forEach(e,t){return Er(this,\"forEach\",e,t,void 0,arguments)},includes(...e){return xc(this,\"includes\",e)},indexOf(...e){return xc(this,\"indexOf\",e)},join(e){return Hi(this).join(e)},lastIndexOf(...e){return xc(this,\"lastIndexOf\",e)},map(e,t){return Er(this,\"map\",e,t,void 0,arguments)},pop(){return Os(this,\"pop\")},push(...e){return Os(this,\"push\",e)},reduce(e,...t){return Pd(this,\"reduce\",e,t)},reduceRight(e,...t){return Pd(this,\"reduceRight\",e,t)},shift(){return Os(this,\"shift\")},some(e,t){return Er(this,\"some\",e,t,void 0,arguments)},splice(...e){return Os(this,\"splice\",e)},toReversed(){return Hi(this).toReversed()},toSorted(e){return Hi(this).toSorted(e)},toSpliced(...e){return Hi(this).toSpliced(...e)},unshift(...e){return Os(this,\"unshift\",e)},values(){return Mc(this,\"values\",Jt)}};function Mc(e,t,n){const r=Rl(e),i=r[t]();return r!==e&&!$n(e)&&(i._next=i.next,i.next=()=>{const s=i._next();return s.value&&(s.value=n(s.value)),s}),i}const Sb=Array.prototype;function Er(e,t,n,r,i,s){const o=Rl(e),a=o!==e&&!$n(e),l=o[t];if(l!==Sb[t]){const f=l.apply(e,s);return a?Jt(f):f}let c=n;o!==e&&(a?c=function(f,d){return n.call(this,Jt(f),d,e)}:n.length>2&&(c=function(f,d){return n.call(this,f,d,e)}));const u=l.call(o,c,r);return a&&i?i(u):u}function Pd(e,t,n,r){const i=Rl(e);let s=n;return i!==e&&($n(e)?n.length>3&&(s=function(o,a,l){return n.call(this,o,a,l,e)}):s=function(o,a,l){return n.call(this,o,Jt(a),l,e)}),i[t](s,...r)}function xc(e,t,n){const r=rt(e);an(r,\"iterate\",ho);const i=r[t](...n);return(i===-1||i===!1)&&Fl(n[0])?(n[0]=rt(n[0]),r[t](...n)):i}function Os(e,t,n=[]){Lr(),gf();const r=rt(e)[t].apply(e,n);return vf(),kr(),r}const Tb=zt(\"__proto__,__v_isRef,__isVue\"),gm=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==\"arguments\"&&e!==\"caller\").map(e=>Symbol[e]).filter(Sn));function wb(e){Sn(e)||(e=String(e));const t=rt(this);return an(t,\"has\",e),t.hasOwnProperty(e)}class vm{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){if(n===\"__v_skip\")return t.__v_skip;const i=this._isReadonly,s=this._isShallow;if(n===\"__v_isReactive\")return!i;if(n===\"__v_isReadonly\")return i;if(n===\"__v_isShallow\")return s;if(n===\"__v_raw\")return r===(i?s?wm:Tm:s?Sm:bm).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const o=ye(t);if(!i){let l;if(o&&(l=bb[n]))return l;if(n===\"hasOwnProperty\")return wb}const a=Reflect.get(t,n,Ut(t)?t:r);return(Sn(n)?gm.has(n):Tb(n))||(i||an(t,\"get\",n),s)?a:Ut(a)?o&&xl(n)?a:a.value:ct(a)?i?Ef(a):Ll(a):a}}class ym extends vm{constructor(t=!1){super(!1,t)}set(t,n,r,i){let s=t[n];if(!this._isShallow){const l=Fr(s);if(!$n(r)&&!Fr(r)&&(s=rt(s),r=rt(r)),!ye(t)&&Ut(s)&&!Ut(r))return l?!1:(s.value=r,!0)}const o=ye(t)&&xl(n)?Number(n)<t.length:st(t,n),a=Reflect.set(t,n,r,Ut(t)?t:i);return t===rt(i)&&(o?on(r,s)&&Cr(t,\"set\",n,r):Cr(t,\"add\",n,r)),a}deleteProperty(t,n){const r=st(t,n);t[n];const i=Reflect.deleteProperty(t,n);return i&&r&&Cr(t,\"delete\",n,void 0),i}has(t,n){const r=Reflect.has(t,n);return(!Sn(n)||!gm.has(n))&&an(t,\"has\",n),r}ownKeys(t){return an(t,\"iterate\",ye(t)?\"length\":Di),Reflect.ownKeys(t)}}class Em extends vm{constructor(t=!1){super(!0,t)}set(t,n){return!0}deleteProperty(t,n){return!0}}const Db=new ym,Cb=new Em,Ob=new ym(!0),Ab=new Em(!0),yu=e=>e,Zo=e=>Reflect.getPrototypeOf(e);function _b(e,t,n){return function(...r){const i=this.__v_raw,s=rt(i),o=Si(s),a=e===\"entries\"||e===Symbol.iterator&&o,l=e===\"keys\"&&o,c=i[e](...r),u=n?yu:t?Ga:Jt;return!t&&an(s,\"iterate\",l?vu:Di),{next(){const{value:f,done:d}=c.next();return d?{value:f,done:d}:{value:a?[u(f[0]),u(f[1])]:u(f),done:d}},[Symbol.iterator](){return this}}}}function Qo(e){return function(...t){return e===\"delete\"?!1:e===\"clear\"?void 0:this}}function Mb(e,t){const n={get(i){const s=this.__v_raw,o=rt(s),a=rt(i);e||(on(i,a)&&an(o,\"get\",i),an(o,\"get\",a));const{has:l}=Zo(o),c=t?yu:e?Ga:Jt;if(l.call(o,i))return c(s.get(i));if(l.call(o,a))return c(s.get(a));s!==o&&s.get(i)},get size(){const i=this.__v_raw;return!e&&an(rt(i),\"iterate\",Di),Reflect.get(i,\"size\",i)},has(i){const s=this.__v_raw,o=rt(s),a=rt(i);return e||(on(i,a)&&an(o,\"has\",i),an(o,\"has\",a)),i===a?s.has(i):s.has(i)||s.has(a)},forEach(i,s){const o=this,a=o.__v_raw,l=rt(a),c=t?yu:e?Ga:Jt;return!e&&an(l,\"iterate\",Di),a.forEach((u,f)=>i.call(s,c(u),c(f),o))}};return Ze(n,e?{add:Qo(\"add\"),set:Qo(\"set\"),delete:Qo(\"delete\"),clear:Qo(\"clear\")}:{add(i){!t&&!$n(i)&&!Fr(i)&&(i=rt(i));const s=rt(this);return Zo(s).has.call(s,i)||(s.add(i),Cr(s,\"add\",i,i)),this},set(i,s){!t&&!$n(s)&&!Fr(s)&&(s=rt(s));const o=rt(this),{has:a,get:l}=Zo(o);let c=a.call(o,i);c||(i=rt(i),c=a.call(o,i));const u=l.call(o,i);return o.set(i,s),c?on(s,u)&&Cr(o,\"set\",i,s):Cr(o,\"add\",i,s),this},delete(i){const s=rt(this),{has:o,get:a}=Zo(s);let l=o.call(s,i);l||(i=rt(i),l=o.call(s,i)),a&&a.call(s,i);const c=s.delete(i);return l&&Cr(s,\"delete\",i,void 0),c},clear(){const i=rt(this),s=i.size!==0,o=i.clear();return s&&Cr(i,\"clear\",void 0,void 0),o}}),[\"keys\",\"values\",\"entries\",Symbol.iterator].forEach(i=>{n[i]=_b(i,e,t)}),n}function Pl(e,t){const n=Mb(e,t);return(r,i,s)=>i===\"__v_isReactive\"?!e:i===\"__v_isReadonly\"?e:i===\"__v_raw\"?r:Reflect.get(st(n,i)&&i in r?n:r,i,s)}const xb={get:Pl(!1,!1)},Nb={get:Pl(!1,!0)},Ib={get:Pl(!0,!1)},Rb={get:Pl(!0,!0)},bm=new WeakMap,Sm=new WeakMap,Tm=new WeakMap,wm=new WeakMap;function Pb(e){switch(e){case\"Object\":case\"Array\":return 1;case\"Map\":case\"Set\":case\"WeakMap\":case\"WeakSet\":return 2;default:return 0}}function Lb(e){return e.__v_skip||!Object.isExtensible(e)?0:Pb(Gp(e))}function Ll(e){return Fr(e)?e:kl(e,!1,Db,xb,bm)}function Dm(e){return kl(e,!1,Ob,Nb,Sm)}function Ef(e){return kl(e,!0,Cb,Ib,Tm)}function kb(e){return kl(e,!0,Ab,Rb,wm)}function kl(e,t,n,r,i){if(!ct(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=Lb(e);if(s===0)return e;const o=i.get(e);if(o)return o;const a=new Proxy(e,s===2?r:n);return i.set(e,a),a}function ti(e){return Fr(e)?ti(e.__v_raw):!!(e&&e.__v_isReactive)}function Fr(e){return!!(e&&e.__v_isReadonly)}function $n(e){return!!(e&&e.__v_isShallow)}function Fl(e){return e?!!e.__v_raw:!1}function rt(e){const t=e&&e.__v_raw;return t?rt(t):e}function Cm(e){return!st(e,\"__v_skip\")&&Object.isExtensible(e)&&uf(e,\"__v_skip\",!0),e}const Jt=e=>ct(e)?Ll(e):e,Ga=e=>ct(e)?Ef(e):e;function Ut(e){return e?e.__v_isRef===!0:!1}function Js(e){return Am(e,!1)}function Om(e){return Am(e,!0)}function Am(e,t){return Ut(e)?e:new Fb(e,t)}class Fb{constructor(t,n){this.dep=new Il,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:rt(t),this._value=n?t:Jt(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||$n(t)||Fr(t);t=r?t:rt(t),on(t,n)&&(this._rawValue=t,this._value=r?t:Jt(t),this.dep.trigger())}}function Vb(e){e.dep&&e.dep.trigger()}function Vl(e){return Ut(e)?e.value:e}function Bb(e){return Pe(e)?e():Vl(e)}const jb={get:(e,t,n)=>t===\"__v_raw\"?e:Vl(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const i=e[t];return Ut(i)&&!Ut(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function bf(e){return ti(e)?e:new Proxy(e,jb)}class Hb{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Il,{get:r,set:i}=t(n.track.bind(n),n.trigger.bind(n));this._get=r,this._set=i}get value(){return this._value=this._get()}set value(t){this._set(t)}}function _m(e){return new Hb(e)}function Ub(e){const t=ye(e)?new Array(e.length):{};for(const n in e)t[n]=Mm(e,n);return t}class $b{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Eb(rt(this._object),this._key)}}class Wb{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Yb(e,t,n){return Ut(e)?e:Pe(e)?new Wb(e):ct(e)&&arguments.length>1?Mm(e,t,n):Js(e)}function Mm(e,t,n){const r=e[t];return Ut(r)?r:new $b(e,t,n)}class zb{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Il(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=fo-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&mt!==this)return um(this,!0),!0}get value(){const t=this.dep.track();return hm(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Kb(e,t,n=!1){let r,i;return Pe(e)?r=e:(r=e.get,i=e.set),new zb(r,i,n)}const Gb={GET:\"get\",HAS:\"has\",ITERATE:\"iterate\"},Xb={SET:\"set\",ADD:\"add\",DELETE:\"delete\",CLEAR:\"clear\"},qo={},Xa=new WeakMap;let zr;function Jb(){return zr}function xm(e,t=!1,n=zr){if(n){let r=Xa.get(n);r||Xa.set(n,r=[]),r.push(e)}}function Zb(e,t,n=et){const{immediate:r,deep:i,once:s,scheduler:o,augmentJob:a,call:l}=n,c=E=>i?E:$n(E)||i===!1||i===0?Or(E,1):Or(E);let u,f,d,p,m=!1,g=!1;if(Ut(e)?(f=()=>e.value,m=$n(e)):ti(e)?(f=()=>c(e),m=!0):ye(e)?(g=!0,m=e.some(E=>ti(E)||$n(E)),f=()=>e.map(E=>{if(Ut(E))return E.value;if(ti(E))return c(E);if(Pe(E))return l?l(E,2):E()})):Pe(e)?t?f=l?()=>l(e,2):e:f=()=>{if(d){Lr();try{d()}finally{kr()}}const E=zr;zr=u;try{return l?l(e,3,[p]):e(p)}finally{zr=E}}:f=Ft,t&&i){const E=f,C=i===!0?1/0:i;f=()=>Or(E(),C)}const v=lm(),w=()=>{u.stop(),v&&v.active&&_l(v.effects,u)};if(s&&t){const E=t;t=(...C)=>{E(...C),w()}}let S=g?new Array(e.length).fill(qo):qo;const y=E=>{if(!(!(u.flags&1)||!u.dirty&&!E))if(t){const C=u.run();if(i||m||(g?C.some((M,B)=>on(M,S[B])):on(C,S))){d&&d();const M=zr;zr=u;try{const B=[C,S===qo?void 0:g&&S[0]===qo?[]:S,p];S=C,l?l(t,3,B):t(...B)}finally{zr=M}}}else u.run()};return a&&a(y),u=new uo(f),u.scheduler=o?()=>o(y,!1):y,p=E=>xm(E,!1,u),d=u.onStop=()=>{const E=Xa.get(u);if(E){if(l)l(E,4);else for(const C of E)C();Xa.delete(u)}},t?r?y(!0):S=u.run():o?o(y.bind(null,!0),!0):u.run(),w.pause=u.pause.bind(u),w.resume=u.resume.bind(u),w.stop=w,w}function Or(e,t=1/0,n){if(t<=0||!ct(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,Ut(e))Or(e.value,t,n);else if(ye(e))for(let r=0;r<e.length;r++)Or(e[r],t,n);else if(li(e)||Si(e))e.forEach(r=>{Or(r,t,n)});else if(xo(e)){for(const r in e)Or(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Or(e[r],t,n)}return e}/**\n* @vue/runtime-core v3.5.16\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/const Nm=[];function Qb(e){Nm.push(e)}function qb(){Nm.pop()}function eS(e,t){}const tS={SETUP_FUNCTION:0,0:\"SETUP_FUNCTION\",RENDER_FUNCTION:1,1:\"RENDER_FUNCTION\",NATIVE_EVENT_HANDLER:5,5:\"NATIVE_EVENT_HANDLER\",COMPONENT_EVENT_HANDLER:6,6:\"COMPONENT_EVENT_HANDLER\",VNODE_HOOK:7,7:\"VNODE_HOOK\",DIRECTIVE_HOOK:8,8:\"DIRECTIVE_HOOK\",TRANSITION_HOOK:9,9:\"TRANSITION_HOOK\",APP_ERROR_HANDLER:10,10:\"APP_ERROR_HANDLER\",APP_WARN_HANDLER:11,11:\"APP_WARN_HANDLER\",FUNCTION_REF:12,12:\"FUNCTION_REF\",ASYNC_COMPONENT_LOADER:13,13:\"ASYNC_COMPONENT_LOADER\",SCHEDULER:14,14:\"SCHEDULER\",COMPONENT_UPDATE:15,15:\"COMPONENT_UPDATE\",APP_UNMOUNT_CLEANUP:16,16:\"APP_UNMOUNT_CLEANUP\"},nS={sp:\"serverPrefetch hook\",bc:\"beforeCreate hook\",c:\"created hook\",bm:\"beforeMount hook\",m:\"mounted hook\",bu:\"beforeUpdate hook\",u:\"updated\",bum:\"beforeUnmount hook\",um:\"unmounted hook\",a:\"activated hook\",da:\"deactivated hook\",ec:\"errorCaptured hook\",rtc:\"renderTracked hook\",rtg:\"renderTriggered hook\",0:\"setup function\",1:\"render function\",2:\"watcher getter\",3:\"watcher callback\",4:\"watcher cleanup function\",5:\"native event handler\",6:\"component event handler\",7:\"vnode hook\",8:\"directive hook\",9:\"transition hook\",10:\"app errorHandler\",11:\"app warnHandler\",12:\"ref function\",13:\"async component loader\",14:\"scheduler flush\",15:\"component update\",16:\"app unmount cleanup function\"};function Es(e,t,n,r){try{return r?e(...r):e()}catch(i){Bi(i,t,n)}}function Jn(e,t,n,r){if(Pe(e)){const i=Es(e,t,n,r);return i&&Ml(i)&&i.catch(s=>{Bi(s,t,n)}),i}if(ye(e)){const i=[];for(let s=0;s<e.length;s++)i.push(Jn(e[s],t,n,r));return i}}function Bi(e,t,n,r=!0){const i=t?t.vnode:null,{errorHandler:s,throwUnhandledErrorInProduction:o}=t&&t.appContext.config||et;if(t){let a=t.parent;const l=t.proxy,c=`https://vuejs.org/error-reference/#runtime-${n}`;for(;a;){const u=a.ec;if(u){for(let f=0;f<u.length;f++)if(u[f](e,l,c)===!1)return}a=a.parent}if(s){Lr(),Es(s,null,10,[e,l,c]),kr();return}}rS(e,n,i,r,o)}function rS(e,t,n,r=!0,i=!1){if(i)throw e;console.error(e)}const vn=[];let hr=-1;const es=[];let Kr=null,Gi=0;const Im=Promise.resolve();let Ja=null;function Bl(e){const t=Ja||Im;return e?t.then(this?e.bind(this):e):t}function iS(e){let t=hr+1,n=vn.length;for(;t<n;){const r=t+n>>>1,i=vn[r],s=mo(i);s<e||s===e&&i.flags&2?t=r+1:n=r}return t}function Sf(e){if(!(e.flags&1)){const t=mo(e),n=vn[vn.length-1];!n||!(e.flags&2)&&t>=mo(n)?vn.push(e):vn.splice(iS(t),0,e),e.flags|=1,Rm()}}function Rm(){Ja||(Ja=Im.then(Pm))}function po(e){ye(e)?es.push(...e):Kr&&e.id===-1?Kr.splice(Gi+1,0,e):e.flags&1||(es.push(e),e.flags|=1),Rm()}function Ld(e,t,n=hr+1){for(;n<vn.length;n++){const r=vn[n];if(r&&r.flags&2){if(e&&r.id!==e.uid)continue;vn.splice(n,1),n--,r.flags&4&&(r.flags&=-2),r(),r.flags&4||(r.flags&=-2)}}}function Za(e){if(es.length){const t=[...new Set(es)].sort((n,r)=>mo(n)-mo(r));if(es.length=0,Kr){Kr.push(...t);return}for(Kr=t,Gi=0;Gi<Kr.length;Gi++){const n=Kr[Gi];n.flags&4&&(n.flags&=-2),n.flags&8||n(),n.flags&=-2}Kr=null,Gi=0}}const mo=e=>e.id==null?e.flags&2?-1:1/0:e.id;function Pm(e){try{for(hr=0;hr<vn.length;hr++){const t=vn[hr];t&&!(t.flags&8)&&(t.flags&4&&(t.flags&=-2),Es(t,t.i,t.i?15:14),t.flags&4||(t.flags&=-2))}}finally{for(;hr<vn.length;hr++){const t=vn[hr];t&&(t.flags&=-2)}hr=-1,vn.length=0,Za(),Ja=null,(vn.length||es.length)&&Pm()}}let Xi,ea=[];function Lm(e,t){var n,r;Xi=e,Xi?(Xi.enabled=!0,ea.forEach(({event:i,args:s})=>Xi.emit(i,...s)),ea=[]):typeof window<\"u\"&&window.HTMLElement&&!((r=(n=window.navigator)==null?void 0:n.userAgent)!=null&&r.includes(\"jsdom\"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(s=>{Lm(s,t)}),setTimeout(()=>{Xi||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,ea=[])},3e3)):ea=[]}let Ht=null,jl=null;function go(e){const t=Ht;return Ht=e,jl=e&&e.type.__scopeId||null,t}function sS(e){jl=e}function oS(){jl=null}const aS=e=>Tf;function Tf(e,t=Ht,n){if(!t||e._n)return e;const r=(...i)=>{r._d&&Ou(-1);const s=go(t);let o;try{o=e(...i)}finally{go(s),r._d&&Ou(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function lS(e,t){if(Ht===null)return e;const n=ko(Ht),r=e.dirs||(e.dirs=[]);for(let i=0;i<t.length;i++){let[s,o,a,l=et]=t[i];s&&(Pe(s)&&(s={mounted:s,updated:s}),s.deep&&Or(o),r.push({dir:s,instance:n,value:o,oldValue:void 0,arg:a,modifiers:l}))}return e}function pr(e,t,n,r){const i=e.dirs,s=t&&t.dirs;for(let o=0;o<i.length;o++){const a=i[o];s&&(a.oldValue=s[o].value);let l=a.dir[r];l&&(Lr(),Jn(l,n,8,[e.el,a,e,t]),kr())}}const km=Symbol(\"_vte\"),Fm=e=>e.__isTeleport,Zs=e=>e&&(e.disabled||e.disabled===\"\"),kd=e=>e&&(e.defer||e.defer===\"\"),Fd=e=>typeof SVGElement<\"u\"&&e instanceof SVGElement,Vd=e=>typeof MathMLElement==\"function\"&&e instanceof MathMLElement,Eu=(e,t)=>{const n=e&&e.to;return ke(n)?t?t(n):null:n},Vm={name:\"Teleport\",__isTeleport:!0,process(e,t,n,r,i,s,o,a,l,c){const{mc:u,pc:f,pbc:d,o:{insert:p,querySelector:m,createText:g,createComment:v}}=c,w=Zs(t.props);let{shapeFlag:S,children:y,dynamicChildren:E}=t;if(e==null){const C=t.el=g(\"\"),M=t.anchor=g(\"\");p(C,n,r),p(M,n,r);const B=(A,x)=>{S&16&&(i&&i.isCE&&(i.ce._teleportTarget=A),u(y,A,x,i,s,o,a,l))},j=()=>{const A=t.target=Eu(t.props,m),x=Bm(A,t,g,p);A&&(o!==\"svg\"&&Fd(A)?o=\"svg\":o!==\"mathml\"&&Vd(A)&&(o=\"mathml\"),w||(B(A,x),Oa(t,!1)))};w&&(B(n,M),Oa(t,!0)),kd(t.props)?(t.el.__isMounted=!1,Bt(()=>{j(),delete t.el.__isMounted},s)):j()}else{if(kd(t.props)&&e.el.__isMounted===!1){Bt(()=>{Vm.process(e,t,n,r,i,s,o,a,l,c)},s);return}t.el=e.el,t.targetStart=e.targetStart;const C=t.anchor=e.anchor,M=t.target=e.target,B=t.targetAnchor=e.targetAnchor,j=Zs(e.props),A=j?n:M,x=j?C:B;if(o===\"svg\"||Fd(M)?o=\"svg\":(o===\"mathml\"||Vd(M))&&(o=\"mathml\"),E?(d(e.dynamicChildren,E,A,i,s,o,a),Pf(e,t,!0)):l||f(e,t,A,x,i,s,o,a,!1),w)j?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):ta(t,n,C,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const k=t.target=Eu(t.props,m);k&&ta(t,k,null,c,0)}else j&&ta(t,M,B,c,1);Oa(t,w)}},remove(e,t,n,{um:r,o:{remove:i}},s){const{shapeFlag:o,children:a,anchor:l,targetStart:c,targetAnchor:u,target:f,props:d}=e;if(f&&(i(c),i(u)),s&&i(l),o&16){const p=s||!Zs(d);for(let m=0;m<a.length;m++){const g=a[m];r(g,t,n,p,!!g.dynamicChildren)}}},move:ta,hydrate:cS};function ta(e,t,n,{o:{insert:r},m:i},s=2){s===0&&r(e.targetAnchor,t,n);const{el:o,anchor:a,shapeFlag:l,children:c,props:u}=e,f=s===2;if(f&&r(o,t,n),(!f||Zs(u))&&l&16)for(let d=0;d<c.length;d++)i(c[d],t,n,2);f&&r(a,t,n)}function cS(e,t,n,r,i,s,{o:{nextSibling:o,parentNode:a,querySelector:l,insert:c,createText:u}},f){const d=t.target=Eu(t.props,l);if(d){const p=Zs(t.props),m=d._lpa||d.firstChild;if(t.shapeFlag&16)if(p)t.anchor=f(o(e),t,a(e),n,r,i,s),t.targetStart=m,t.targetAnchor=m&&o(m);else{t.anchor=o(e);let g=m;for(;g;){if(g&&g.nodeType===8){if(g.data===\"teleport start anchor\")t.targetStart=g;else if(g.data===\"teleport anchor\"){t.targetAnchor=g,d._lpa=t.targetAnchor&&o(t.targetAnchor);break}}g=o(g)}t.targetAnchor||Bm(d,t,u,c),f(m&&o(m),t,d,n,r,i,s)}Oa(t,p)}return t.anchor&&o(t.anchor)}const uS=Vm;function Oa(e,t){const n=e.ctx;if(n&&n.ut){let r,i;for(t?(r=e.el,i=e.anchor):(r=e.targetStart,i=e.targetAnchor);r&&r!==i;)r.nodeType===1&&r.setAttribute(\"data-v-owner\",n.uid),r=r.nextSibling;n.ut()}}function Bm(e,t,n,r){const i=t.targetStart=n(\"\"),s=t.targetAnchor=n(\"\");return i[km]=s,e&&(r(i,e),r(s,e)),s}const Gr=Symbol(\"_leaveCb\"),na=Symbol(\"_enterCb\");function wf(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Po(()=>{e.isMounted=!0}),Wl(()=>{e.isUnmounting=!0}),e}const Wn=[Function,Array],Df={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Wn,onEnter:Wn,onAfterEnter:Wn,onEnterCancelled:Wn,onBeforeLeave:Wn,onLeave:Wn,onAfterLeave:Wn,onLeaveCancelled:Wn,onBeforeAppear:Wn,onAppear:Wn,onAfterAppear:Wn,onAppearCancelled:Wn},jm=e=>{const t=e.subTree;return t.component?jm(t.component):t},fS={name:\"BaseTransition\",props:Df,setup(e,{slots:t}){const n=qn(),r=wf();return()=>{const i=t.default&&Hl(t.default(),!0);if(!i||!i.length)return;const s=Hm(i),o=rt(e),{mode:a}=o;if(r.isLeaving)return Nc(s);const l=Bd(s);if(!l)return Nc(s);let c=os(l,o,r,n,f=>c=f);l.type!==Rt&&Vr(l,c);let u=n.subTree&&Bd(n.subTree);if(u&&u.type!==Rt&&!or(l,u)&&jm(n).type!==Rt){let f=os(u,o,r,n);if(Vr(u,f),a===\"out-in\"&&l.type!==Rt)return r.isLeaving=!0,f.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete f.afterLeave,u=void 0},Nc(s);a===\"in-out\"&&l.type!==Rt?f.delayLeave=(d,p,m)=>{const g=$m(r,u);g[String(u.key)]=u,d[Gr]=()=>{p(),d[Gr]=void 0,delete c.delayedLeave,u=void 0},c.delayedLeave=()=>{m(),delete c.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return s}}};function Hm(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==Rt){t=n;break}}return t}const Um=fS;function $m(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function os(e,t,n,r,i){const{appear:s,mode:o,persisted:a=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:d,onLeave:p,onAfterLeave:m,onLeaveCancelled:g,onBeforeAppear:v,onAppear:w,onAfterAppear:S,onAppearCancelled:y}=t,E=String(e.key),C=$m(n,e),M=(A,x)=>{A&&Jn(A,r,9,x)},B=(A,x)=>{const k=x[1];M(A,x),ye(A)?A.every(P=>P.length<=1)&&k():A.length<=1&&k()},j={mode:o,persisted:a,beforeEnter(A){let x=l;if(!n.isMounted)if(s)x=v||l;else return;A[Gr]&&A[Gr](!0);const k=C[E];k&&or(e,k)&&k.el[Gr]&&k.el[Gr](),M(x,[A])},enter(A){let x=c,k=u,P=f;if(!n.isMounted)if(s)x=w||c,k=S||u,P=y||f;else return;let V=!1;const $=A[na]=Z=>{V||(V=!0,Z?M(P,[A]):M(k,[A]),j.delayedLeave&&j.delayedLeave(),A[na]=void 0)};x?B(x,[A,$]):$()},leave(A,x){const k=String(e.key);if(A[na]&&A[na](!0),n.isUnmounting)return x();M(d,[A]);let P=!1;const V=A[Gr]=$=>{P||(P=!0,x(),$?M(g,[A]):M(m,[A]),A[Gr]=void 0,C[k]===e&&delete C[k])};C[k]=e,p?B(p,[A,V]):V()},clone(A){const x=os(A,t,n,r,i);return i&&i(x),x}};return j}function Nc(e){if(Ro(e))return e=gr(e),e.children=null,e}function Bd(e){if(!Ro(e))return Fm(e.type)&&e.children?Hm(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&Pe(n.default))return n.default()}}function Vr(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Vr(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Hl(e,t=!1,n){let r=[],i=0;for(let s=0;s<e.length;s++){let o=e[s];const a=n==null?o.key:String(n)+String(o.key!=null?o.key:s);o.type===Wt?(o.patchFlag&128&&i++,r=r.concat(Hl(o.children,t,a))):(t||o.type!==Rt)&&r.push(a!=null?gr(o,{key:a}):o)}if(i>1)for(let s=0;s<r.length;s++)r[s].patchFlag=-2;return r}/*! #__NO_SIDE_EFFECTS__ */function Cf(e,t){return Pe(e)?Ze({name:e.name},t,{setup:e}):e}function dS(){const e=qn();return e?(e.appContext.config.idPrefix||\"v\")+\"-\"+e.ids[0]+e.ids[1]++:\"\"}function Of(e){e.ids=[e.ids[0]+e.ids[2]+++\"-\",0,0]}function hS(e){const t=qn(),n=Om(null);if(t){const i=t.refs===et?t.refs={}:t.refs;Object.defineProperty(i,e,{enumerable:!0,get:()=>n.value,set:s=>n.value=s})}return n}function vo(e,t,n,r,i=!1){if(ye(e)){e.forEach((m,g)=>vo(m,t&&(ye(t)?t[g]:t),n,r,i));return}if(ni(r)&&!i){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&vo(e,t,n,r.component.subTree);return}const s=r.shapeFlag&4?ko(r.component):r.el,o=i?null:s,{i:a,r:l}=e,c=t&&t.r,u=a.refs===et?a.refs={}:a.refs,f=a.setupState,d=rt(f),p=f===et?()=>!1:m=>st(d,m);if(c!=null&&c!==l&&(ke(c)?(u[c]=null,p(c)&&(f[c]=null)):Ut(c)&&(c.value=null)),Pe(l))Es(l,a,12,[o,u]);else{const m=ke(l),g=Ut(l);if(m||g){const v=()=>{if(e.f){const w=m?p(l)?f[l]:u[l]:l.value;i?ye(w)&&_l(w,s):ye(w)?w.includes(s)||w.push(s):m?(u[l]=[s],p(l)&&(f[l]=u[l])):(l.value=[s],e.k&&(u[e.k]=l.value))}else m?(u[l]=o,p(l)&&(f[l]=o)):g&&(l.value=o,e.k&&(u[e.k]=o))};o?(v.id=-1,Bt(v,n)):v()}}}let jd=!1;const Ui=()=>{jd||(console.error(\"Hydration completed but contains mismatches.\"),jd=!0)},pS=e=>e.namespaceURI.includes(\"svg\")&&e.tagName!==\"foreignObject\",mS=e=>e.namespaceURI.includes(\"MathML\"),ra=e=>{if(e.nodeType===1){if(pS(e))return\"svg\";if(mS(e))return\"mathml\"}},Qi=e=>e.nodeType===8;function gS(e){const{mt:t,p:n,o:{patchProp:r,createText:i,nextSibling:s,parentNode:o,remove:a,insert:l,createComment:c}}=e,u=(y,E)=>{if(!E.hasChildNodes()){n(null,y,E),Za(),E._vnode=y;return}f(E.firstChild,y,null,null,null),Za(),E._vnode=y},f=(y,E,C,M,B,j=!1)=>{j=j||!!E.dynamicChildren;const A=Qi(y)&&y.data===\"[\",x=()=>g(y,E,C,M,B,A),{type:k,ref:P,shapeFlag:V,patchFlag:$}=E;let Z=y.nodeType;E.el=y,$===-2&&(j=!1,E.dynamicChildren=null);let U=null;switch(k){case ri:Z!==3?E.children===\"\"?(l(E.el=i(\"\"),o(y),y),U=y):U=x():(y.data!==E.children&&(Ui(),y.data=E.children),U=s(y));break;case Rt:S(y)?(U=s(y),w(E.el=y.content.firstChild,y,C)):Z!==8||A?U=x():U=s(y);break;case Oi:if(A&&(y=s(y),Z=y.nodeType),Z===1||Z===3){U=y;const W=!E.children.length;for(let ee=0;ee<E.staticCount;ee++)W&&(E.children+=U.nodeType===1?U.outerHTML:U.data),ee===E.staticCount-1&&(E.anchor=U),U=s(U);return A?s(U):U}else x();break;case Wt:A?U=m(y,E,C,M,B,j):U=x();break;default:if(V&1)(Z!==1||E.type.toLowerCase()!==y.tagName.toLowerCase())&&!S(y)?U=x():U=d(y,E,C,M,B,j);else if(V&6){E.slotScopeIds=B;const W=o(y);if(A?U=v(y):Qi(y)&&y.data===\"teleport start\"?U=v(y,y.data,\"teleport end\"):U=s(y),t(E,W,null,C,M,ra(W),j),ni(E)&&!E.type.__asyncResolved){let ee;A?(ee=yt(Wt),ee.anchor=U?U.previousSibling:W.lastChild):ee=y.nodeType===3?kf(\"\"):yt(\"div\"),ee.el=y,E.component.subTree=ee}}else V&64?Z!==8?U=x():U=E.type.hydrate(y,E,C,M,B,j,e,p):V&128&&(U=E.type.hydrate(y,E,C,M,ra(o(y)),B,j,e,f))}return P!=null&&vo(P,null,M,E),U},d=(y,E,C,M,B,j)=>{j=j||!!E.dynamicChildren;const{type:A,props:x,patchFlag:k,shapeFlag:P,dirs:V,transition:$}=E,Z=A===\"input\"||A===\"option\";if(Z||k!==-1){V&&pr(E,null,C,\"created\");let U=!1;if(S(y)){U=mg(null,$)&&C&&C.vnode.props&&C.vnode.props.appear;const ee=y.content.firstChild;if(U){const Te=ee.getAttribute(\"class\");Te&&(ee.$cls=Te),$.beforeEnter(ee)}w(ee,y,C),E.el=y=ee}if(P&16&&!(x&&(x.innerHTML||x.textContent))){let ee=p(y.firstChild,E,y,C,M,B,j);for(;ee;){ia(y,1)||Ui();const Te=ee;ee=ee.nextSibling,a(Te)}}else if(P&8){let ee=E.children;ee[0]===`\n`&&(y.tagName===\"PRE\"||y.tagName===\"TEXTAREA\")&&(ee=ee.slice(1)),y.textContent!==ee&&(ia(y,0)||Ui(),y.textContent=E.children)}if(x){if(Z||!j||k&48){const ee=y.tagName.includes(\"-\");for(const Te in x)(Z&&(Te.endsWith(\"value\")||Te===\"indeterminate\")||ai(Te)&&!xr(Te)||Te[0]===\".\"||ee)&&r(y,Te,null,x[Te],void 0,C)}else if(x.onClick)r(y,\"onClick\",null,x.onClick,void 0,C);else if(k&4&&ti(x.style))for(const ee in x.style)x.style[ee]}let W;(W=x&&x.onVnodeBeforeMount)&&_n(W,C,E),V&&pr(E,null,C,\"beforeMount\"),((W=x&&x.onVnodeMounted)||V||U)&&Dg(()=>{W&&_n(W,C,E),U&&$.enter(y),V&&pr(E,null,C,\"mounted\")},M)}return y.nextSibling},p=(y,E,C,M,B,j,A)=>{A=A||!!E.dynamicChildren;const x=E.children,k=x.length;for(let P=0;P<k;P++){const V=A?x[P]:x[P]=xn(x[P]),$=V.type===ri;y?($&&!A&&P+1<k&&xn(x[P+1]).type===ri&&(l(i(y.data.slice(V.children.length)),C,s(y)),y.data=V.children),y=f(y,V,M,B,j,A)):$&&!V.children?l(V.el=i(\"\"),C):(ia(C,1)||Ui(),n(null,V,C,null,M,B,ra(C),j))}return y},m=(y,E,C,M,B,j)=>{const{slotScopeIds:A}=E;A&&(B=B?B.concat(A):A);const x=o(y),k=p(s(y),E,x,C,M,B,j);return k&&Qi(k)&&k.data===\"]\"?s(E.anchor=k):(Ui(),l(E.anchor=c(\"]\"),x,k),k)},g=(y,E,C,M,B,j)=>{if(ia(y.parentElement,1)||Ui(),E.el=null,j){const k=v(y);for(;;){const P=s(y);if(P&&P!==k)a(P);else break}}const A=s(y),x=o(y);return a(y),n(null,E,x,A,C,M,ra(x),B),C&&(C.vnode.el=E.el,Kl(C,E.el)),A},v=(y,E=\"[\",C=\"]\")=>{let M=0;for(;y;)if(y=s(y),y&&Qi(y)&&(y.data===E&&M++,y.data===C)){if(M===0)return s(y);M--}return y},w=(y,E,C)=>{const M=E.parentNode;M&&M.replaceChild(y,E);let B=C;for(;B;)B.vnode.el===E&&(B.vnode.el=B.subTree.el=y),B=B.parent},S=y=>y.nodeType===1&&y.tagName===\"TEMPLATE\";return[u,f]}const Hd=\"data-allow-mismatch\",vS={0:\"text\",1:\"children\",2:\"class\",3:\"style\",4:\"attribute\"};function ia(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(Hd);)e=e.parentElement;const n=e&&e.getAttribute(Hd);if(n==null)return!1;if(n===\"\")return!0;{const r=n.split(\",\");return t===0&&r.includes(\"children\")?!0:n.split(\",\").includes(vS[t])}}const yS=No().requestIdleCallback||(e=>setTimeout(e,1)),ES=No().cancelIdleCallback||(e=>clearTimeout(e)),bS=(e=1e4)=>t=>{const n=yS(t,{timeout:e});return()=>ES(n)};function SS(e){const{top:t,left:n,bottom:r,right:i}=e.getBoundingClientRect(),{innerHeight:s,innerWidth:o}=window;return(t>0&&t<s||r>0&&r<s)&&(n>0&&n<o||i>0&&i<o)}const TS=e=>(t,n)=>{const r=new IntersectionObserver(i=>{for(const s of i)if(s.isIntersecting){r.disconnect(),t();break}},e);return n(i=>{if(i instanceof Element){if(SS(i))return t(),r.disconnect(),!1;r.observe(i)}}),()=>r.disconnect()},wS=e=>t=>{if(e){const n=matchMedia(e);if(n.matches)t();else return n.addEventListener(\"change\",t,{once:!0}),()=>n.removeEventListener(\"change\",t)}},DS=(e=[])=>(t,n)=>{ke(e)&&(e=[e]);let r=!1;const i=o=>{r||(r=!0,s(),t(),o.target.dispatchEvent(new o.constructor(o.type,o)))},s=()=>{n(o=>{for(const a of e)o.removeEventListener(a,i)})};return n(o=>{for(const a of e)o.addEventListener(a,i,{once:!0})}),s};function CS(e,t){if(Qi(e)&&e.data===\"[\"){let n=1,r=e.nextSibling;for(;r;){if(r.nodeType===1){if(t(r)===!1)break}else if(Qi(r))if(r.data===\"]\"){if(--n===0)break}else r.data===\"[\"&&n++;r=r.nextSibling}}else t(e)}const ni=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function OS(e){Pe(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:i=200,hydrate:s,timeout:o,suspensible:a=!0,onError:l}=e;let c=null,u,f=0;const d=()=>(f++,c=null,p()),p=()=>{let m;return c||(m=c=t().catch(g=>{if(g=g instanceof Error?g:new Error(String(g)),l)return new Promise((v,w)=>{l(g,()=>v(d()),()=>w(g),f+1)});throw g}).then(g=>m!==c&&c?c:(g&&(g.__esModule||g[Symbol.toStringTag]===\"Module\")&&(g=g.default),u=g,g)))};return Cf({name:\"AsyncComponentWrapper\",__asyncLoader:p,__asyncHydrate(m,g,v){const w=s?()=>{const y=s(()=>{v()},E=>CS(m,E));y&&(g.bum||(g.bum=[])).push(y),(g.u||(g.u=[])).push(()=>!0)}:v;u?w():p().then(()=>!g.isUnmounted&&w())},get __asyncResolved(){return u},setup(){const m=jt;if(Of(m),u)return()=>Ic(u,m);const g=y=>{c=null,Bi(y,m,13,!r)};if(a&&m.suspense||as)return p().then(y=>()=>Ic(y,m)).catch(y=>(g(y),()=>r?yt(r,{error:y}):null));const v=Js(!1),w=Js(),S=Js(!!i);return i&&setTimeout(()=>{S.value=!1},i),o!=null&&setTimeout(()=>{if(!v.value&&!w.value){const y=new Error(`Async component timed out after ${o}ms.`);g(y),w.value=y}},o),p().then(()=>{v.value=!0,m.parent&&Ro(m.parent.vnode)&&m.parent.update()}).catch(y=>{g(y),w.value=y}),()=>{if(v.value&&u)return Ic(u,m);if(w.value&&r)return yt(r,{error:w.value});if(n&&!S.value)return yt(n)}}})}function Ic(e,t){const{ref:n,props:r,children:i,ce:s}=t.vnode,o=yt(e,r,i);return o.ref=n,o.ce=s,delete t.vnode.ce,o}const Ro=e=>e.type.__isKeepAlive,AS={name:\"KeepAlive\",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=qn(),r=n.ctx;if(!r.renderer)return()=>{const S=t.default&&t.default();return S&&S.length===1?S[0]:S};const i=new Map,s=new Set;let o=null;const a=n.suspense,{renderer:{p:l,m:c,um:u,o:{createElement:f}}}=r,d=f(\"div\");r.activate=(S,y,E,C,M)=>{const B=S.component;c(S,y,E,0,a),l(B.vnode,S,y,E,B,a,C,S.slotScopeIds,M),Bt(()=>{B.isDeactivated=!1,B.a&&wi(B.a);const j=S.props&&S.props.onVnodeMounted;j&&_n(j,B.parent,S)},a)},r.deactivate=S=>{const y=S.component;qa(y.m),qa(y.a),c(S,d,null,1,a),Bt(()=>{y.da&&wi(y.da);const E=S.props&&S.props.onVnodeUnmounted;E&&_n(E,y.parent,S),y.isDeactivated=!0},a)};function p(S){Rc(S),u(S,n,a,!0)}function m(S){i.forEach((y,E)=>{const C=Nu(y.type);C&&!S(C)&&g(E)})}function g(S){const y=i.get(S);y&&(!o||!or(y,o))?p(y):o&&Rc(o),i.delete(S),s.delete(S)}ts(()=>[e.include,e.exclude],([S,y])=>{S&&m(E=>Hs(S,E)),y&&m(E=>!Hs(y,E))},{flush:\"post\",deep:!0});let v=null;const w=()=>{v!=null&&(el(n.subTree.type)?Bt(()=>{i.set(v,sa(n.subTree))},n.subTree.suspense):i.set(v,sa(n.subTree)))};return Po(w),$l(w),Wl(()=>{i.forEach(S=>{const{subTree:y,suspense:E}=n,C=sa(y);if(S.type===C.type&&S.key===C.key){Rc(C);const M=C.component.da;M&&Bt(M,E);return}p(S)})}),()=>{if(v=null,!t.default)return o=null;const S=t.default(),y=S[0];if(S.length>1)return o=null,S;if(!Br(y)||!(y.shapeFlag&4)&&!(y.shapeFlag&128))return o=null,y;let E=sa(y);if(E.type===Rt)return o=null,E;const C=E.type,M=Nu(ni(E)?E.type.__asyncResolved||{}:C),{include:B,exclude:j,max:A}=e;if(B&&(!M||!Hs(B,M))||j&&M&&Hs(j,M))return E.shapeFlag&=-257,o=E,y;const x=E.key==null?C:E.key,k=i.get(x);return E.el&&(E=gr(E),y.shapeFlag&128&&(y.ssContent=E)),v=x,k?(E.el=k.el,E.component=k.component,E.transition&&Vr(E,E.transition),E.shapeFlag|=512,s.delete(x),s.add(x)):(s.add(x),A&&s.size>parseInt(A,10)&&g(s.values().next().value)),E.shapeFlag|=256,o=E,el(y.type)?y:E}}},_S=AS;function Hs(e,t){return ye(e)?e.some(n=>Hs(n,t)):ke(e)?e.split(\",\").includes(t):Kp(e)?(e.lastIndex=0,e.test(t)):!1}function Wm(e,t){zm(e,\"a\",t)}function Ym(e,t){zm(e,\"da\",t)}function zm(e,t,n=jt){const r=e.__wdc||(e.__wdc=()=>{let i=n;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(Ul(t,r,n),n){let i=n.parent;for(;i&&i.parent;)Ro(i.parent.vnode)&&MS(r,t,n,i),i=i.parent}}function MS(e,t,n,r){const i=Ul(t,e,r,!0);Yl(()=>{_l(r[t],i)},n)}function Rc(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function sa(e){return e.shapeFlag&128?e.ssContent:e}function Ul(e,t,n=jt,r=!1){if(n){const i=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...o)=>{Lr();const a=Ni(n),l=Jn(t,n,e,o);return a(),kr(),l});return r?i.unshift(s):i.push(s),s}}const jr=e=>(t,n=jt)=>{(!as||e===\"sp\")&&Ul(e,(...r)=>t(...r),n)},Km=jr(\"bm\"),Po=jr(\"m\"),Af=jr(\"bu\"),$l=jr(\"u\"),Wl=jr(\"bum\"),Yl=jr(\"um\"),Gm=jr(\"sp\"),Xm=jr(\"rtg\"),Jm=jr(\"rtc\");function Zm(e,t=jt){Ul(\"ec\",e,t)}const _f=\"components\",xS=\"directives\";function Qm(e,t){return Mf(_f,e,!0,t)||e}const qm=Symbol.for(\"v-ndc\");function NS(e){return ke(e)?Mf(_f,e,!1)||e:e||qm}function IS(e){return Mf(xS,e)}function Mf(e,t,n=!0,r=!1){const i=Ht||jt;if(i){const s=i.type;if(e===_f){const a=Nu(s,!1);if(a&&(a===t||a===gt(t)||a===ci(gt(t))))return s}const o=Ud(i[e]||s[e],t)||Ud(i.appContext[e],t);return!o&&r?s:o}}function Ud(e,t){return e&&(e[t]||e[gt(t)]||e[ci(gt(t))])}function RS(e,t,n,r){let i;const s=n&&n[r],o=ye(e);if(o||ke(e)){const a=o&&ti(e);let l=!1,c=!1;a&&(l=!$n(e),c=Fr(e),e=Rl(e)),i=new Array(e.length);for(let u=0,f=e.length;u<f;u++)i[u]=t(l?c?Ga(Jt(e[u])):Jt(e[u]):e[u],u,void 0,s&&s[u])}else if(typeof e==\"number\"){i=new Array(e);for(let a=0;a<e;a++)i[a]=t(a+1,a,void 0,s&&s[a])}else if(ct(e))if(e[Symbol.iterator])i=Array.from(e,(a,l)=>t(a,l,void 0,s&&s[l]));else{const a=Object.keys(e);i=new Array(a.length);for(let l=0,c=a.length;l<c;l++){const u=a[l];i[l]=t(e[u],u,l,s&&s[l])}}else i=[];return n&&(n[r]=i),i}function PS(e,t){for(let n=0;n<t.length;n++){const r=t[n];if(ye(r))for(let i=0;i<r.length;i++)e[r[i].name]=r[i].fn;else r&&(e[r.name]=r.key?(...i)=>{const s=r.fn(...i);return s&&(s.key=r.key),s}:r.fn)}return e}function LS(e,t,n={},r,i){if(Ht.ce||Ht.parent&&ni(Ht.parent)&&Ht.parent.ce)return t!==\"default\"&&(n.name=t),bo(),tl(Wt,null,[yt(\"slot\",n,r&&r())],64);let s=e[t];s&&s._c&&(s._d=!1),bo();const o=s&&xf(s(n)),a=n.key||o&&o.key,l=tl(Wt,{key:(a&&!Sn(a)?a:`_${t}`)+(!o&&r?\"_fb\":\"\")},o||(r?r():[]),o&&e._===1?64:-2);return!i&&l.scopeId&&(l.slotScopeIds=[l.scopeId+\"-s\"]),s&&s._c&&(s._d=!0),l}function xf(e){return e.some(t=>Br(t)?!(t.type===Rt||t.type===Wt&&!xf(t.children)):!0)?e:null}function kS(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:Ti(r)]=e[r];return n}const bu=e=>e?Ng(e)?ko(e):bu(e.parent):null,Qs=Ze(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>bu(e.parent),$root:e=>bu(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Nf(e),$forceUpdate:e=>e.f||(e.f=()=>{Sf(e.update)}),$nextTick:e=>e.n||(e.n=Bl.bind(e.proxy)),$watch:e=>p0.bind(e)}),Pc=(e,t)=>e!==et&&!e.__isScriptSetup&&st(e,t),Su={get({_:e},t){if(t===\"__v_skip\")return!0;const{ctx:n,setupState:r,data:i,props:s,accessCache:o,type:a,appContext:l}=e;let c;if(t[0]!==\"$\"){const p=o[t];if(p!==void 0)switch(p){case 1:return r[t];case 2:return i[t];case 4:return n[t];case 3:return s[t]}else{if(Pc(r,t))return o[t]=1,r[t];if(i!==et&&st(i,t))return o[t]=2,i[t];if((c=e.propsOptions[0])&&st(c,t))return o[t]=3,s[t];if(n!==et&&st(n,t))return o[t]=4,n[t];Tu&&(o[t]=0)}}const u=Qs[t];let f,d;if(u)return t===\"$attrs\"&&an(e.attrs,\"get\",\"\"),u(e);if((f=a.__cssModules)&&(f=f[t]))return f;if(n!==et&&st(n,t))return o[t]=4,n[t];if(d=l.config.globalProperties,st(d,t))return d[t]},set({_:e},t,n){const{data:r,setupState:i,ctx:s}=e;return Pc(i,t)?(i[t]=n,!0):r!==et&&st(r,t)?(r[t]=n,!0):st(e.props,t)||t[0]===\"$\"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:i,propsOptions:s}},o){let a;return!!n[o]||e!==et&&st(e,o)||Pc(t,o)||(a=s[0])&&st(a,o)||st(r,o)||st(Qs,o)||st(i.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:st(n,\"value\")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},FS=Ze({},Su,{get(e,t){if(t!==Symbol.unscopables)return Su.get(e,t,e)},has(e,t){return t[0]!==\"_\"&&!ff(t)}});function VS(){return null}function BS(){return null}function jS(e){}function HS(e){}function US(){return null}function $S(){}function WS(e,t){return null}function YS(){return eg().slots}function zS(){return eg().attrs}function eg(){const e=qn();return e.setupContext||(e.setupContext=Lg(e))}function yo(e){return ye(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function KS(e,t){const n=yo(e);for(const r in t){if(r.startsWith(\"__skip\"))continue;let i=n[r];i?ye(i)||Pe(i)?i=n[r]={type:i,default:t[r]}:i.default=t[r]:i===null&&(i=n[r]={default:t[r]}),i&&t[`__skip_${r}`]&&(i.skipFactory=!0)}return n}function GS(e,t){return!e||!t?e||t:ye(e)&&ye(t)?e.concat(t):Ze({},yo(e),yo(t))}function XS(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function JS(e){const t=qn();let n=e();return _u(),Ml(n)&&(n=n.catch(r=>{throw Ni(t),r})),[n,()=>Ni(t)]}let Tu=!0;function ZS(e){const t=Nf(e),n=e.proxy,r=e.ctx;Tu=!1,t.beforeCreate&&$d(t.beforeCreate,e,\"bc\");const{data:i,computed:s,methods:o,watch:a,provide:l,inject:c,created:u,beforeMount:f,mounted:d,beforeUpdate:p,updated:m,activated:g,deactivated:v,beforeDestroy:w,beforeUnmount:S,destroyed:y,unmounted:E,render:C,renderTracked:M,renderTriggered:B,errorCaptured:j,serverPrefetch:A,expose:x,inheritAttrs:k,components:P,directives:V,filters:$}=t;if(c&&QS(c,r,null),o)for(const W in o){const ee=o[W];Pe(ee)&&(r[W]=ee.bind(n))}if(i){const W=i.call(n,n);ct(W)&&(e.data=Ll(W))}if(Tu=!0,s)for(const W in s){const ee=s[W],Te=Pe(ee)?ee.bind(n,n):Pe(ee.get)?ee.get.bind(n,n):Ft,ze=!Pe(ee)&&Pe(ee.set)?ee.set.bind(n):Ft,De=kg({get:Te,set:ze});Object.defineProperty(r,W,{enumerable:!0,configurable:!0,get:()=>De.value,set:$e=>De.value=$e})}if(a)for(const W in a)tg(a[W],r,n,W);if(l){const W=Pe(l)?l.call(n):l;Reflect.ownKeys(W).forEach(ee=>{rg(ee,W[ee])})}u&&$d(u,e,\"c\");function U(W,ee){ye(ee)?ee.forEach(Te=>W(Te.bind(n))):ee&&W(ee.bind(n))}if(U(Km,f),U(Po,d),U(Af,p),U($l,m),U(Wm,g),U(Ym,v),U(Zm,j),U(Jm,M),U(Xm,B),U(Wl,S),U(Yl,E),U(Gm,A),ye(x))if(x.length){const W=e.exposed||(e.exposed={});x.forEach(ee=>{Object.defineProperty(W,ee,{get:()=>n[ee],set:Te=>n[ee]=Te})})}else e.exposed||(e.exposed={});C&&e.render===Ft&&(e.render=C),k!=null&&(e.inheritAttrs=k),P&&(e.components=P),V&&(e.directives=V),A&&Of(e)}function QS(e,t,n=Ft){ye(e)&&(e=wu(e));for(const r in e){const i=e[r];let s;ct(i)?\"default\"in i?s=qs(i.from||r,i.default,!0):s=qs(i.from||r):s=qs(i),Ut(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:o=>s.value=o}):t[r]=s}}function $d(e,t,n){Jn(ye(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function tg(e,t,n,r){let i=r.includes(\".\")?bg(n,r):()=>n[r];if(ke(e)){const s=t[e];Pe(s)&&ts(i,s)}else if(Pe(e))ts(i,e.bind(n));else if(ct(e))if(ye(e))e.forEach(s=>tg(s,t,n,r));else{const s=Pe(e.handler)?e.handler.bind(n):t[e.handler];Pe(s)&&ts(i,s,e)}}function Nf(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:i,optionsCache:s,config:{optionMergeStrategies:o}}=e.appContext,a=s.get(t);let l;return a?l=a:!i.length&&!n&&!r?l=t:(l={},i.length&&i.forEach(c=>Qa(l,c,o,!0)),Qa(l,t,o)),ct(t)&&s.set(t,l),l}function Qa(e,t,n,r=!1){const{mixins:i,extends:s}=t;s&&Qa(e,s,n,!0),i&&i.forEach(o=>Qa(e,o,n,!0));for(const o in t)if(!(r&&o===\"expose\")){const a=qS[o]||n&&n[o];e[o]=a?a(e[o],t[o]):t[o]}return e}const qS={data:Wd,props:Yd,emits:Yd,methods:Us,computed:Us,beforeCreate:mn,created:mn,beforeMount:mn,mounted:mn,beforeUpdate:mn,updated:mn,beforeDestroy:mn,beforeUnmount:mn,destroyed:mn,unmounted:mn,activated:mn,deactivated:mn,errorCaptured:mn,serverPrefetch:mn,components:Us,directives:Us,watch:t0,provide:Wd,inject:e0};function Wd(e,t){return t?e?function(){return Ze(Pe(e)?e.call(this,this):e,Pe(t)?t.call(this,this):t)}:t:e}function e0(e,t){return Us(wu(e),wu(t))}function wu(e){if(ye(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function mn(e,t){return e?[...new Set([].concat(e,t))]:t}function Us(e,t){return e?Ze(Object.create(null),e,t):t}function Yd(e,t){return e?ye(e)&&ye(t)?[...new Set([...e,...t])]:Ze(Object.create(null),yo(e),yo(t??{})):t}function t0(e,t){if(!e)return t;if(!t)return e;const n=Ze(Object.create(null),e);for(const r in t)n[r]=mn(e[r],t[r]);return n}function ng(){return{app:null,config:{isNativeTag:Zi,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let n0=0;function r0(e,t){return function(r,i=null){Pe(r)||(r=Ze({},r)),i!=null&&!ct(i)&&(i=null);const s=ng(),o=new WeakSet,a=[];let l=!1;const c=s.app={_uid:n0++,_component:r,_props:i,_container:null,_context:s,_instance:null,version:Vg,get config(){return s.config},set config(u){},use(u,...f){return o.has(u)||(u&&Pe(u.install)?(o.add(u),u.install(c,...f)):Pe(u)&&(o.add(u),u(c,...f))),c},mixin(u){return s.mixins.includes(u)||s.mixins.push(u),c},component(u,f){return f?(s.components[u]=f,c):s.components[u]},directive(u,f){return f?(s.directives[u]=f,c):s.directives[u]},mount(u,f,d){if(!l){const p=c._ceVNode||yt(r,i);return p.appContext=s,d===!0?d=\"svg\":d===!1&&(d=void 0),f&&t?t(p,u):e(p,u,d),l=!0,c._container=u,u.__vue_app__=c,ko(p.component)}},onUnmount(u){a.push(u)},unmount(){l&&(Jn(a,c._instance,16),e(null,c._container),delete c._container.__vue_app__)},provide(u,f){return s.provides[u]=f,c},runWithContext(u){const f=Ci;Ci=c;try{return u()}finally{Ci=f}}};return c}}let Ci=null;function rg(e,t){if(jt){let n=jt.provides;const r=jt.parent&&jt.parent.provides;r===n&&(n=jt.provides=Object.create(r)),n[e]=t}}function qs(e,t,n=!1){const r=jt||Ht;if(r||Ci){let i=Ci?Ci._context.provides:r?r.parent==null||r.ce?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides:void 0;if(i&&e in i)return i[e];if(arguments.length>1)return n&&Pe(t)?t.call(r&&r.proxy):t}}function i0(){return!!(jt||Ht||Ci)}const ig={},sg=()=>Object.create(ig),og=e=>Object.getPrototypeOf(e)===ig;function s0(e,t,n,r=!1){const i={},s=sg();e.propsDefaults=Object.create(null),ag(e,t,i,s);for(const o in e.propsOptions[0])o in i||(i[o]=void 0);n?e.props=r?i:Dm(i):e.type.props?e.props=i:e.props=s,e.attrs=s}function o0(e,t,n,r){const{props:i,attrs:s,vnode:{patchFlag:o}}=e,a=rt(i),[l]=e.propsOptions;let c=!1;if((r||o>0)&&!(o&16)){if(o&8){const u=e.vnode.dynamicProps;for(let f=0;f<u.length;f++){let d=u[f];if(zl(e.emitsOptions,d))continue;const p=t[d];if(l)if(st(s,d))p!==s[d]&&(s[d]=p,c=!0);else{const m=gt(d);i[m]=Du(l,a,m,p,e,!1)}else p!==s[d]&&(s[d]=p,c=!0)}}}else{ag(e,t,i,s)&&(c=!0);let u;for(const f in a)(!t||!st(t,f)&&((u=ln(f))===f||!st(t,u)))&&(l?n&&(n[f]!==void 0||n[u]!==void 0)&&(i[f]=Du(l,a,f,void 0,e,!0)):delete i[f]);if(s!==a)for(const f in s)(!t||!st(t,f))&&(delete s[f],c=!0)}c&&Cr(e.attrs,\"set\",\"\")}function ag(e,t,n,r){const[i,s]=e.propsOptions;let o=!1,a;if(t)for(let l in t){if(xr(l))continue;const c=t[l];let u;i&&st(i,u=gt(l))?!s||!s.includes(u)?n[u]=c:(a||(a={}))[u]=c:zl(e.emitsOptions,l)||(!(l in r)||c!==r[l])&&(r[l]=c,o=!0)}if(s){const l=rt(n),c=a||et;for(let u=0;u<s.length;u++){const f=s[u];n[f]=Du(i,l,f,c[f],e,!st(c,f))}}return o}function Du(e,t,n,r,i,s){const o=e[n];if(o!=null){const a=st(o,\"default\");if(a&&r===void 0){const l=o.default;if(o.type!==Function&&!o.skipFactory&&Pe(l)){const{propsDefaults:c}=i;if(n in c)r=c[n];else{const u=Ni(i);r=c[n]=l.call(null,t),u()}}else r=l;i.ce&&i.ce._setProp(n,r)}o[0]&&(s&&!a?r=!1:o[1]&&(r===\"\"||r===ln(n))&&(r=!0))}return r}const a0=new WeakMap;function lg(e,t,n=!1){const r=n?a0:t.propsCache,i=r.get(e);if(i)return i;const s=e.props,o={},a=[];let l=!1;if(!Pe(e)){const u=f=>{l=!0;const[d,p]=lg(f,t,!0);Ze(o,d),p&&a.push(...p)};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!s&&!l)return ct(e)&&r.set(e,bi),bi;if(ye(s))for(let u=0;u<s.length;u++){const f=gt(s[u]);zd(f)&&(o[f]=et)}else if(s)for(const u in s){const f=gt(u);if(zd(f)){const d=s[u],p=o[f]=ye(d)||Pe(d)?{type:d}:Ze({},d),m=p.type;let g=!1,v=!0;if(ye(m))for(let w=0;w<m.length;++w){const S=m[w],y=Pe(S)&&S.name;if(y===\"Boolean\"){g=!0;break}else y===\"String\"&&(v=!1)}else g=Pe(m)&&m.name===\"Boolean\";p[0]=g,p[1]=v,(g||st(p,\"default\"))&&a.push(f)}}const c=[o,a];return ct(e)&&r.set(e,c),c}function zd(e){return e[0]!==\"$\"&&!xr(e)}const If=e=>e[0]===\"_\"||e===\"$stable\",Rf=e=>ye(e)?e.map(xn):[xn(e)],l0=(e,t,n)=>{if(t._n)return t;const r=Tf((...i)=>Rf(t(...i)),n);return r._c=!1,r},cg=(e,t,n)=>{const r=e._ctx;for(const i in e){if(If(i))continue;const s=e[i];if(Pe(s))t[i]=l0(i,s,r);else if(s!=null){const o=Rf(s);t[i]=()=>o}}},ug=(e,t)=>{const n=Rf(t);e.slots.default=()=>n},fg=(e,t,n)=>{for(const r in t)(n||!If(r))&&(e[r]=t[r])},c0=(e,t,n)=>{const r=e.slots=sg();if(e.vnode.shapeFlag&32){const i=t._;i?(fg(r,t,n),n&&uf(r,\"_\",i,!0)):cg(t,r)}else t&&ug(e,t)},u0=(e,t,n)=>{const{vnode:r,slots:i}=e;let s=!0,o=et;if(r.shapeFlag&32){const a=t._;a?n&&a===1?s=!1:fg(i,t,n):(s=!t.$stable,cg(t,i)),o=t}else t&&(ug(e,t),o={default:1});if(s)for(const a in i)!If(a)&&o[a]==null&&delete i[a]},Bt=Dg;function dg(e){return pg(e)}function hg(e){return pg(e,gS)}function pg(e,t){const n=No();n.__VUE__=!0;const{insert:r,remove:i,patchProp:s,createElement:o,createText:a,createComment:l,setText:c,setElementText:u,parentNode:f,nextSibling:d,setScopeId:p=Ft,insertStaticContent:m}=e,g=(_,N,Y,Q=null,J=null,q=null,se=void 0,ne=null,ie=!!N.dynamicChildren)=>{if(_===N)return;_&&!or(_,N)&&(Q=me(_),$e(_,J,q,!0),_=null),N.patchFlag===-2&&(ie=!1,N.dynamicChildren=null);const{type:te,ref:Se,shapeFlag:ce}=N;switch(te){case ri:v(_,N,Y,Q);break;case Rt:w(_,N,Y,Q);break;case Oi:_==null&&S(N,Y,Q,se);break;case Wt:P(_,N,Y,Q,J,q,se,ne,ie);break;default:ce&1?C(_,N,Y,Q,J,q,se,ne,ie):ce&6?V(_,N,Y,Q,J,q,se,ne,ie):(ce&64||ce&128)&&te.process(_,N,Y,Q,J,q,se,ne,ie,ut)}Se!=null&&J&&vo(Se,_&&_.ref,q,N||_,!N)},v=(_,N,Y,Q)=>{if(_==null)r(N.el=a(N.children),Y,Q);else{const J=N.el=_.el;N.children!==_.children&&c(J,N.children)}},w=(_,N,Y,Q)=>{_==null?r(N.el=l(N.children||\"\"),Y,Q):N.el=_.el},S=(_,N,Y,Q)=>{[_.el,_.anchor]=m(_.children,N,Y,Q,_.el,_.anchor)},y=({el:_,anchor:N},Y,Q)=>{let J;for(;_&&_!==N;)J=d(_),r(_,Y,Q),_=J;r(N,Y,Q)},E=({el:_,anchor:N})=>{let Y;for(;_&&_!==N;)Y=d(_),i(_),_=Y;i(N)},C=(_,N,Y,Q,J,q,se,ne,ie)=>{N.type===\"svg\"?se=\"svg\":N.type===\"math\"&&(se=\"mathml\"),_==null?M(N,Y,Q,J,q,se,ne,ie):A(_,N,J,q,se,ne,ie)},M=(_,N,Y,Q,J,q,se,ne)=>{let ie,te;const{props:Se,shapeFlag:ce,transition:ge,dirs:we}=_;if(ie=_.el=o(_.type,q,Se&&Se.is,Se),ce&8?u(ie,_.children):ce&16&&j(_.children,ie,null,Q,J,Lc(_,q),se,ne),we&&pr(_,null,Q,\"created\"),B(ie,_,_.scopeId,se,Q),Se){for(const Xe in Se)Xe!==\"value\"&&!xr(Xe)&&s(ie,Xe,null,Se[Xe],q,Q);\"value\"in Se&&s(ie,\"value\",null,Se.value,q),(te=Se.onVnodeBeforeMount)&&_n(te,Q,_)}we&&pr(_,null,Q,\"beforeMount\");const Fe=mg(J,ge);Fe&&ge.beforeEnter(ie),r(ie,N,Y),((te=Se&&Se.onVnodeMounted)||Fe||we)&&Bt(()=>{te&&_n(te,Q,_),Fe&&ge.enter(ie),we&&pr(_,null,Q,\"mounted\")},J)},B=(_,N,Y,Q,J)=>{if(Y&&p(_,Y),Q)for(let q=0;q<Q.length;q++)p(_,Q[q]);if(J){let q=J.subTree;if(N===q||el(q.type)&&(q.ssContent===N||q.ssFallback===N)){const se=J.vnode;B(_,se,se.scopeId,se.slotScopeIds,J.parent)}}},j=(_,N,Y,Q,J,q,se,ne,ie=0)=>{for(let te=ie;te<_.length;te++){const Se=_[te]=ne?Xr(_[te]):xn(_[te]);g(null,Se,N,Y,Q,J,q,se,ne)}},A=(_,N,Y,Q,J,q,se)=>{const ne=N.el=_.el;let{patchFlag:ie,dynamicChildren:te,dirs:Se}=N;ie|=_.patchFlag&16;const ce=_.props||et,ge=N.props||et;let we;if(Y&&ui(Y,!1),(we=ge.onVnodeBeforeUpdate)&&_n(we,Y,N,_),Se&&pr(N,_,Y,\"beforeUpdate\"),Y&&ui(Y,!0),(ce.innerHTML&&ge.innerHTML==null||ce.textContent&&ge.textContent==null)&&u(ne,\"\"),te?x(_.dynamicChildren,te,ne,Y,Q,Lc(N,J),q):se||ee(_,N,ne,null,Y,Q,Lc(N,J),q,!1),ie>0){if(ie&16)k(ne,ce,ge,Y,J);else if(ie&2&&ce.class!==ge.class&&s(ne,\"class\",null,ge.class,J),ie&4&&s(ne,\"style\",ce.style,ge.style,J),ie&8){const Fe=N.dynamicProps;for(let Xe=0;Xe<Fe.length;Xe++){const L=Fe[Xe],H=ce[L],T=ge[L];(T!==H||L===\"value\")&&s(ne,L,H,T,J,Y)}}ie&1&&_.children!==N.children&&u(ne,N.children)}else!se&&te==null&&k(ne,ce,ge,Y,J);((we=ge.onVnodeUpdated)||Se)&&Bt(()=>{we&&_n(we,Y,N,_),Se&&pr(N,_,Y,\"updated\")},Q)},x=(_,N,Y,Q,J,q,se)=>{for(let ne=0;ne<N.length;ne++){const ie=_[ne],te=N[ne],Se=ie.el&&(ie.type===Wt||!or(ie,te)||ie.shapeFlag&198)?f(ie.el):Y;g(ie,te,Se,null,Q,J,q,se,!0)}},k=(_,N,Y,Q,J)=>{if(N!==Y){if(N!==et)for(const q in N)!xr(q)&&!(q in Y)&&s(_,q,N[q],null,J,Q);for(const q in Y){if(xr(q))continue;const se=Y[q],ne=N[q];se!==ne&&q!==\"value\"&&s(_,q,ne,se,J,Q)}\"value\"in Y&&s(_,\"value\",N.value,Y.value,J)}},P=(_,N,Y,Q,J,q,se,ne,ie)=>{const te=N.el=_?_.el:a(\"\"),Se=N.anchor=_?_.anchor:a(\"\");let{patchFlag:ce,dynamicChildren:ge,slotScopeIds:we}=N;we&&(ne=ne?ne.concat(we):we),_==null?(r(te,Y,Q),r(Se,Y,Q),j(N.children||[],Y,Se,J,q,se,ne,ie)):ce>0&&ce&64&&ge&&_.dynamicChildren?(x(_.dynamicChildren,ge,Y,J,q,se,ne),(N.key!=null||J&&N===J.subTree)&&Pf(_,N,!0)):ee(_,N,Y,Se,J,q,se,ne,ie)},V=(_,N,Y,Q,J,q,se,ne,ie)=>{N.slotScopeIds=ne,_==null?N.shapeFlag&512?J.ctx.activate(N,Y,Q,se,ie):$(N,Y,Q,J,q,se,ie):Z(_,N,ie)},$=(_,N,Y,Q,J,q,se)=>{const ne=_.component=xg(_,Q,J);if(Ro(_)&&(ne.ctx.renderer=ut),Ig(ne,!1,se),ne.asyncDep){if(J&&J.registerDep(ne,U,se),!_.el){const ie=ne.subTree=yt(Rt);w(null,ie,N,Y)}}else U(ne,_,N,Y,J,q,se)},Z=(_,N,Y)=>{const Q=N.component=_.component;if(b0(_,N,Y))if(Q.asyncDep&&!Q.asyncResolved){W(Q,N,Y);return}else Q.next=N,Q.update();else N.el=_.el,Q.vnode=N},U=(_,N,Y,Q,J,q,se)=>{const ne=()=>{if(_.isMounted){let{next:ce,bu:ge,u:we,parent:Fe,vnode:Xe}=_;{const F=gg(_);if(F){ce&&(ce.el=Xe.el,W(_,ce,se)),F.asyncDep.then(()=>{_.isUnmounted||ne()});return}}let L=ce,H;ui(_,!1),ce?(ce.el=Xe.el,W(_,ce,se)):ce=Xe,ge&&wi(ge),(H=ce.props&&ce.props.onVnodeBeforeUpdate)&&_n(H,Fe,ce,Xe),ui(_,!0);const T=Aa(_),O=_.subTree;_.subTree=T,g(O,T,f(O.el),me(O),_,J,q),ce.el=T.el,L===null&&Kl(_,T.el),we&&Bt(we,J),(H=ce.props&&ce.props.onVnodeUpdated)&&Bt(()=>_n(H,Fe,ce,Xe),J)}else{let ce;const{el:ge,props:we}=N,{bm:Fe,m:Xe,parent:L,root:H,type:T}=_,O=ni(N);if(ui(_,!1),Fe&&wi(Fe),!O&&(ce=we&&we.onVnodeBeforeMount)&&_n(ce,L,N),ui(_,!0),ge&&Qe){const F=()=>{_.subTree=Aa(_),Qe(ge,_.subTree,_,J,null)};O&&T.__asyncHydrate?T.__asyncHydrate(ge,_,F):F()}else{H.ce&&H.ce._injectChildStyle(T);const F=_.subTree=Aa(_);g(null,F,Y,Q,_,J,q),N.el=F.el}if(Xe&&Bt(Xe,J),!O&&(ce=we&&we.onVnodeMounted)){const F=N;Bt(()=>_n(ce,L,F),J)}(N.shapeFlag&256||L&&ni(L.vnode)&&L.vnode.shapeFlag&256)&&_.a&&Bt(_.a,J),_.isMounted=!0,N=Y=Q=null}};_.scope.on();const ie=_.effect=new uo(ne);_.scope.off();const te=_.update=ie.run.bind(ie),Se=_.job=ie.runIfDirty.bind(ie);Se.i=_,Se.id=_.uid,ie.scheduler=()=>Sf(Se),ui(_,!0),te()},W=(_,N,Y)=>{N.component=_;const Q=_.vnode.props;_.vnode=N,_.next=null,o0(_,N.props,Q,Y),u0(_,N.children,Y),Lr(),Ld(_),kr()},ee=(_,N,Y,Q,J,q,se,ne,ie=!1)=>{const te=_&&_.children,Se=_?_.shapeFlag:0,ce=N.children,{patchFlag:ge,shapeFlag:we}=N;if(ge>0){if(ge&128){ze(te,ce,Y,Q,J,q,se,ne,ie);return}else if(ge&256){Te(te,ce,Y,Q,J,q,se,ne,ie);return}}we&8?(Se&16&&re(te,J,q),ce!==te&&u(Y,ce)):Se&16?we&16?ze(te,ce,Y,Q,J,q,se,ne,ie):re(te,J,q,!0):(Se&8&&u(Y,\"\"),we&16&&j(ce,Y,Q,J,q,se,ne,ie))},Te=(_,N,Y,Q,J,q,se,ne,ie)=>{_=_||bi,N=N||bi;const te=_.length,Se=N.length,ce=Math.min(te,Se);let ge;for(ge=0;ge<ce;ge++){const we=N[ge]=ie?Xr(N[ge]):xn(N[ge]);g(_[ge],we,Y,null,J,q,se,ne,ie)}te>Se?re(_,J,q,!0,!1,ce):j(N,Y,Q,J,q,se,ne,ie,ce)},ze=(_,N,Y,Q,J,q,se,ne,ie)=>{let te=0;const Se=N.length;let ce=_.length-1,ge=Se-1;for(;te<=ce&&te<=ge;){const we=_[te],Fe=N[te]=ie?Xr(N[te]):xn(N[te]);if(or(we,Fe))g(we,Fe,Y,null,J,q,se,ne,ie);else break;te++}for(;te<=ce&&te<=ge;){const we=_[ce],Fe=N[ge]=ie?Xr(N[ge]):xn(N[ge]);if(or(we,Fe))g(we,Fe,Y,null,J,q,se,ne,ie);else break;ce--,ge--}if(te>ce){if(te<=ge){const we=ge+1,Fe=we<Se?N[we].el:Q;for(;te<=ge;)g(null,N[te]=ie?Xr(N[te]):xn(N[te]),Y,Fe,J,q,se,ne,ie),te++}}else if(te>ge)for(;te<=ce;)$e(_[te],J,q,!0),te++;else{const we=te,Fe=te,Xe=new Map;for(te=Fe;te<=ge;te++){const oe=N[te]=ie?Xr(N[te]):xn(N[te]);oe.key!=null&&Xe.set(oe.key,te)}let L,H=0;const T=ge-Fe+1;let O=!1,F=0;const G=new Array(T);for(te=0;te<T;te++)G[te]=0;for(te=we;te<=ce;te++){const oe=_[te];if(H>=T){$e(oe,J,q,!0);continue}let ae;if(oe.key!=null)ae=Xe.get(oe.key);else for(L=Fe;L<=ge;L++)if(G[L-Fe]===0&&or(oe,N[L])){ae=L;break}ae===void 0?$e(oe,J,q,!0):(G[ae-Fe]=te+1,ae>=F?F=ae:O=!0,g(oe,N[ae],Y,null,J,q,se,ne,ie),H++)}const X=O?f0(G):bi;for(L=X.length-1,te=T-1;te>=0;te--){const oe=Fe+te,ae=N[oe],he=oe+1<Se?N[oe+1].el:Q;G[te]===0?g(null,ae,Y,he,J,q,se,ne,ie):O&&(L<0||te!==X[L]?De(ae,Y,he,2):L--)}}},De=(_,N,Y,Q,J=null)=>{const{el:q,type:se,transition:ne,children:ie,shapeFlag:te}=_;if(te&6){De(_.component.subTree,N,Y,Q);return}if(te&128){_.suspense.move(N,Y,Q);return}if(te&64){se.move(_,N,Y,ut);return}if(se===Wt){r(q,N,Y);for(let ce=0;ce<ie.length;ce++)De(ie[ce],N,Y,Q);r(_.anchor,N,Y);return}if(se===Oi){y(_,N,Y);return}if(Q!==2&&te&1&&ne)if(Q===0)ne.beforeEnter(q),r(q,N,Y),Bt(()=>ne.enter(q),J);else{const{leave:ce,delayLeave:ge,afterLeave:we}=ne,Fe=()=>{_.ctx.isUnmounted?i(q):r(q,N,Y)},Xe=()=>{ce(q,()=>{Fe(),we&&we()})};ge?ge(q,Fe,Xe):Xe()}else r(q,N,Y)},$e=(_,N,Y,Q=!1,J=!1)=>{const{type:q,props:se,ref:ne,children:ie,dynamicChildren:te,shapeFlag:Se,patchFlag:ce,dirs:ge,cacheIndex:we}=_;if(ce===-2&&(J=!1),ne!=null&&(Lr(),vo(ne,null,Y,_,!0),kr()),we!=null&&(N.renderCache[we]=void 0),Se&256){N.ctx.deactivate(_);return}const Fe=Se&1&&ge,Xe=!ni(_);let L;if(Xe&&(L=se&&se.onVnodeBeforeUnmount)&&_n(L,N,_),Se&6)Ie(_.component,Y,Q);else{if(Se&128){_.suspense.unmount(Y,Q);return}Fe&&pr(_,null,N,\"beforeUnmount\"),Se&64?_.type.remove(_,N,Y,ut,Q):te&&!te.hasOnce&&(q!==Wt||ce>0&&ce&64)?re(te,N,Y,!1,!0):(q===Wt&&ce&384||!J&&Se&16)&&re(ie,N,Y),Q&&Ve(_)}(Xe&&(L=se&&se.onVnodeUnmounted)||Fe)&&Bt(()=>{L&&_n(L,N,_),Fe&&pr(_,null,N,\"unmounted\")},Y)},Ve=_=>{const{type:N,el:Y,anchor:Q,transition:J}=_;if(N===Wt){Ke(Y,Q);return}if(N===Oi){E(_);return}const q=()=>{i(Y),J&&!J.persisted&&J.afterLeave&&J.afterLeave()};if(_.shapeFlag&1&&J&&!J.persisted){const{leave:se,delayLeave:ne}=J,ie=()=>se(Y,q);ne?ne(_.el,q,ie):ie()}else q()},Ke=(_,N)=>{let Y;for(;_!==N;)Y=d(_),i(_),_=Y;i(N)},Ie=(_,N,Y)=>{const{bum:Q,scope:J,job:q,subTree:se,um:ne,m:ie,a:te,parent:Se,slots:{__:ce}}=_;qa(ie),qa(te),Q&&wi(Q),Se&&ye(ce)&&ce.forEach(ge=>{Se.renderCache[ge]=void 0}),J.stop(),q&&(q.flags|=8,$e(se,_,N,Y)),ne&&Bt(ne,N),Bt(()=>{_.isUnmounted=!0},N),N&&N.pendingBranch&&!N.isUnmounted&&_.asyncDep&&!_.asyncResolved&&_.suspenseId===N.pendingId&&(N.deps--,N.deps===0&&N.resolve())},re=(_,N,Y,Q=!1,J=!1,q=0)=>{for(let se=q;se<_.length;se++)$e(_[se],N,Y,Q,J)},me=_=>{if(_.shapeFlag&6)return me(_.component.subTree);if(_.shapeFlag&128)return _.suspense.next();const N=d(_.anchor||_.el),Y=N&&N[km];return Y?d(Y):N};let xe=!1;const Ne=(_,N,Y)=>{_==null?N._vnode&&$e(N._vnode,null,null,!0):g(N._vnode||null,_,N,null,null,null,Y),N._vnode=_,xe||(xe=!0,Ld(),Za(),xe=!1)},ut={p:g,um:$e,m:De,r:Ve,mt:$,mc:j,pc:ee,pbc:x,n:me,o:e};let dt,Qe;return t&&([dt,Qe]=t(ut)),{render:Ne,hydrate:dt,createApp:r0(Ne,dt)}}function Lc({type:e,props:t},n){return n===\"svg\"&&e===\"foreignObject\"||n===\"mathml\"&&e===\"annotation-xml\"&&t&&t.encoding&&t.encoding.includes(\"html\")?void 0:n}function ui({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function mg(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Pf(e,t,n=!1){const r=e.children,i=t.children;if(ye(r)&&ye(i))for(let s=0;s<r.length;s++){const o=r[s];let a=i[s];a.shapeFlag&1&&!a.dynamicChildren&&((a.patchFlag<=0||a.patchFlag===32)&&(a=i[s]=Xr(i[s]),a.el=o.el),!n&&a.patchFlag!==-2&&Pf(o,a)),a.type===ri&&(a.el=o.el),a.type===Rt&&!a.el&&(a.el=o.el)}}function f0(e){const t=e.slice(),n=[0];let r,i,s,o,a;const l=e.length;for(r=0;r<l;r++){const c=e[r];if(c!==0){if(i=n[n.length-1],e[i]<c){t[r]=i,n.push(r);continue}for(s=0,o=n.length-1;s<o;)a=s+o>>1,e[n[a]]<c?s=a+1:o=a;c<e[n[s]]&&(s>0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,o=n[s-1];s-- >0;)n[s]=o,o=t[o];return n}function gg(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:gg(t)}function qa(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}const vg=Symbol.for(\"v-scx\"),yg=()=>qs(vg);function d0(e,t){return Lo(e,null,t)}function h0(e,t){return Lo(e,null,{flush:\"post\"})}function Eg(e,t){return Lo(e,null,{flush:\"sync\"})}function ts(e,t,n){return Lo(e,t,n)}function Lo(e,t,n=et){const{immediate:r,deep:i,flush:s,once:o}=n,a=Ze({},n),l=t&&r||!t&&s!==\"post\";let c;if(as){if(s===\"sync\"){const p=yg();c=p.__watcherHandles||(p.__watcherHandles=[])}else if(!l){const p=()=>{};return p.stop=Ft,p.resume=Ft,p.pause=Ft,p}}const u=jt;a.call=(p,m,g)=>Jn(p,u,m,g);let f=!1;s===\"post\"?a.scheduler=p=>{Bt(p,u&&u.suspense)}:s!==\"sync\"&&(f=!0,a.scheduler=(p,m)=>{m?p():Sf(p)}),a.augmentJob=p=>{t&&(p.flags|=4),f&&(p.flags|=2,u&&(p.id=u.uid,p.i=u))};const d=Zb(e,t,a);return as&&(c?c.push(d):l&&d()),d}function p0(e,t,n){const r=this.proxy,i=ke(e)?e.includes(\".\")?bg(r,e):()=>r[e]:e.bind(r,r);let s;Pe(t)?s=t:(s=t.handler,n=t);const o=Ni(this),a=Lo(i,s.bind(r),n);return o(),a}function bg(e,t){const n=t.split(\".\");return()=>{let r=e;for(let i=0;i<n.length&&r;i++)r=r[n[i]];return r}}function m0(e,t,n=et){const r=qn(),i=gt(t),s=ln(t),o=Sg(e,i),a=_m((l,c)=>{let u,f=et,d;return Eg(()=>{const p=e[i];on(u,p)&&(u=p,c())}),{get(){return l(),n.get?n.get(u):u},set(p){const m=n.set?n.set(p):p;if(!on(m,u)&&!(f!==et&&on(p,f)))return;const g=r.vnode.props;g&&(t in g||i in g||s in g)&&(`onUpdate:${t}`in g||`onUpdate:${i}`in g||`onUpdate:${s}`in g)||(u=p,c()),r.emit(`update:${t}`,m),on(p,m)&&on(p,f)&&!on(m,d)&&c(),f=p,d=m}}});return a[Symbol.iterator]=()=>{let l=0;return{next(){return l<2?{value:l++?o||et:a,done:!1}:{done:!0}}}},a}const Sg=(e,t)=>t===\"modelValue\"||t===\"model-value\"?e.modelModifiers:e[`${t}Modifiers`]||e[`${gt(t)}Modifiers`]||e[`${ln(t)}Modifiers`];function g0(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||et;let i=n;const s=t.startsWith(\"update:\"),o=s&&Sg(r,t.slice(7));o&&(o.trim&&(i=n.map(u=>ke(u)?u.trim():u)),o.number&&(i=n.map(lo)));let a,l=r[a=Ti(t)]||r[a=Ti(gt(t))];!l&&s&&(l=r[a=Ti(ln(t))]),l&&Jn(l,e,6,i);const c=r[a+\"Once\"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,Jn(c,e,6,i)}}function Tg(e,t,n=!1){const r=t.emitsCache,i=r.get(e);if(i!==void 0)return i;const s=e.emits;let o={},a=!1;if(!Pe(e)){const l=c=>{const u=Tg(c,t,!0);u&&(a=!0,Ze(o,u))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!s&&!a?(ct(e)&&r.set(e,null),null):(ye(s)?s.forEach(l=>o[l]=null):Ze(o,s),ct(e)&&r.set(e,o),o)}function zl(e,t){return!e||!ai(t)?!1:(t=t.slice(2).replace(/Once$/,\"\"),st(e,t[0].toLowerCase()+t.slice(1))||st(e,ln(t))||st(e,t))}function Aa(e){const{type:t,vnode:n,proxy:r,withProxy:i,propsOptions:[s],slots:o,attrs:a,emit:l,render:c,renderCache:u,props:f,data:d,setupState:p,ctx:m,inheritAttrs:g}=e,v=go(e);let w,S;try{if(n.shapeFlag&4){const E=i||r,C=E;w=xn(c.call(C,E,u,f,p,d,m)),S=a}else{const E=t;w=xn(E.length>1?E(f,{attrs:a,slots:o,emit:l}):E(f,null)),S=t.props?a:y0(a)}}catch(E){eo.length=0,Bi(E,e,1),w=yt(Rt)}let y=w;if(S&&g!==!1){const E=Object.keys(S),{shapeFlag:C}=y;E.length&&C&7&&(s&&E.some(Al)&&(S=E0(S,s)),y=gr(y,S,!1,!0))}return n.dirs&&(y=gr(y,null,!1,!0),y.dirs=y.dirs?y.dirs.concat(n.dirs):n.dirs),n.transition&&Vr(y,n.transition),w=y,go(v),w}function v0(e,t=!0){let n;for(let r=0;r<e.length;r++){const i=e[r];if(Br(i)){if(i.type!==Rt||i.children===\"v-if\"){if(n)return;n=i}}else return}return n}const y0=e=>{let t;for(const n in e)(n===\"class\"||n===\"style\"||ai(n))&&((t||(t={}))[n]=e[n]);return t},E0=(e,t)=>{const n={};for(const r in e)(!Al(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function b0(e,t,n){const{props:r,children:i,component:s}=e,{props:o,children:a,patchFlag:l}=t,c=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?Kd(r,o,c):!!o;if(l&8){const u=t.dynamicProps;for(let f=0;f<u.length;f++){const d=u[f];if(o[d]!==r[d]&&!zl(c,d))return!0}}}else return(i||a)&&(!a||!a.$stable)?!0:r===o?!1:r?o?Kd(r,o,c):!0:!!o;return!1}function Kd(e,t,n){const r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let i=0;i<r.length;i++){const s=r[i];if(t[s]!==e[s]&&!zl(n,s))return!0}return!1}function Kl({vnode:e,parent:t},n){for(;t;){const r=t.subTree;if(r.suspense&&r.suspense.activeBranch===e&&(r.el=e.el),r===e)(e=t.vnode).el=n,t=t.parent;else break}}const el=e=>e.__isSuspense;let Cu=0;const S0={name:\"Suspense\",__isSuspense:!0,process(e,t,n,r,i,s,o,a,l,c){if(e==null)w0(t,n,r,i,s,o,a,l,c);else{if(s&&s.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}D0(e,t,n,r,i,o,a,l,c)}},hydrate:C0,normalize:O0},T0=S0;function Eo(e,t){const n=e.props&&e.props[t];Pe(n)&&n()}function w0(e,t,n,r,i,s,o,a,l){const{p:c,o:{createElement:u}}=l,f=u(\"div\"),d=e.suspense=wg(e,i,r,t,f,n,s,o,a,l);c(null,d.pendingBranch=e.ssContent,f,null,r,d,s,o),d.deps>0?(Eo(e,\"onPending\"),Eo(e,\"onFallback\"),c(null,e.ssFallback,t,n,r,null,s,o),ns(d,e.ssFallback)):d.resolve(!1,!0)}function D0(e,t,n,r,i,s,o,a,{p:l,um:c,o:{createElement:u}}){const f=t.suspense=e.suspense;f.vnode=t,t.el=e.el;const d=t.ssContent,p=t.ssFallback,{activeBranch:m,pendingBranch:g,isInFallback:v,isHydrating:w}=f;if(g)f.pendingBranch=d,or(d,g)?(l(g,d,f.hiddenContainer,null,i,f,s,o,a),f.deps<=0?f.resolve():v&&(w||(l(m,p,n,r,i,null,s,o,a),ns(f,p)))):(f.pendingId=Cu++,w?(f.isHydrating=!1,f.activeBranch=g):c(g,i,f),f.deps=0,f.effects.length=0,f.hiddenContainer=u(\"div\"),v?(l(null,d,f.hiddenContainer,null,i,f,s,o,a),f.deps<=0?f.resolve():(l(m,p,n,r,i,null,s,o,a),ns(f,p))):m&&or(d,m)?(l(m,d,n,r,i,f,s,o,a),f.resolve(!0)):(l(null,d,f.hiddenContainer,null,i,f,s,o,a),f.deps<=0&&f.resolve()));else if(m&&or(d,m))l(m,d,n,r,i,f,s,o,a),ns(f,d);else if(Eo(t,\"onPending\"),f.pendingBranch=d,d.shapeFlag&512?f.pendingId=d.component.suspenseId:f.pendingId=Cu++,l(null,d,f.hiddenContainer,null,i,f,s,o,a),f.deps<=0)f.resolve();else{const{timeout:S,pendingId:y}=f;S>0?setTimeout(()=>{f.pendingId===y&&f.fallback(p)},S):S===0&&f.fallback(p)}}function wg(e,t,n,r,i,s,o,a,l,c,u=!1){const{p:f,m:d,um:p,n:m,o:{parentNode:g,remove:v}}=c;let w;const S=A0(e);S&&t&&t.pendingBranch&&(w=t.pendingId,t.deps++);const y=e.props?co(e.props.timeout):void 0,E=s,C={vnode:e,parent:t,parentComponent:n,namespace:o,container:r,hiddenContainer:i,deps:0,pendingId:Cu++,timeout:typeof y==\"number\"?y:-1,activeBranch:null,pendingBranch:null,isInFallback:!u,isHydrating:u,isUnmounted:!1,effects:[],resolve(M=!1,B=!1){const{vnode:j,activeBranch:A,pendingBranch:x,pendingId:k,effects:P,parentComponent:V,container:$}=C;let Z=!1;C.isHydrating?C.isHydrating=!1:M||(Z=A&&x.transition&&x.transition.mode===\"out-in\",Z&&(A.transition.afterLeave=()=>{k===C.pendingId&&(d(x,$,s===E?m(A):s,0),po(P))}),A&&(g(A.el)===$&&(s=m(A)),p(A,V,C,!0)),Z||d(x,$,s,0)),ns(C,x),C.pendingBranch=null,C.isInFallback=!1;let U=C.parent,W=!1;for(;U;){if(U.pendingBranch){U.effects.push(...P),W=!0;break}U=U.parent}!W&&!Z&&po(P),C.effects=[],S&&t&&t.pendingBranch&&w===t.pendingId&&(t.deps--,t.deps===0&&!B&&t.resolve()),Eo(j,\"onResolve\")},fallback(M){if(!C.pendingBranch)return;const{vnode:B,activeBranch:j,parentComponent:A,container:x,namespace:k}=C;Eo(B,\"onFallback\");const P=m(j),V=()=>{C.isInFallback&&(f(null,M,x,P,A,null,k,a,l),ns(C,M))},$=M.transition&&M.transition.mode===\"out-in\";$&&(j.transition.afterLeave=V),C.isInFallback=!0,p(j,A,null,!0),$||V()},move(M,B,j){C.activeBranch&&d(C.activeBranch,M,B,j),C.container=M},next(){return C.activeBranch&&m(C.activeBranch)},registerDep(M,B,j){const A=!!C.pendingBranch;A&&C.deps++;const x=M.vnode.el;M.asyncDep.catch(k=>{Bi(k,M,0)}).then(k=>{if(M.isUnmounted||C.isUnmounted||C.pendingId!==M.suspenseId)return;M.asyncResolved=!0;const{vnode:P}=M;Mu(M,k,!1),x&&(P.el=x);const V=!x&&M.subTree.el;B(M,P,g(x||M.subTree.el),x?null:m(M.subTree),C,o,j),V&&v(V),Kl(M,P.el),A&&--C.deps===0&&C.resolve()})},unmount(M,B){C.isUnmounted=!0,C.activeBranch&&p(C.activeBranch,n,M,B),C.pendingBranch&&p(C.pendingBranch,n,M,B)}};return C}function C0(e,t,n,r,i,s,o,a,l){const c=t.suspense=wg(t,r,n,e.parentNode,document.createElement(\"div\"),null,i,s,o,a,!0),u=l(e,c.pendingBranch=t.ssContent,n,c,s,o);return c.deps===0&&c.resolve(!1,!0),u}function O0(e){const{shapeFlag:t,children:n}=e,r=t&32;e.ssContent=Gd(r?n.default:n),e.ssFallback=r?Gd(n.fallback):yt(Rt)}function Gd(e){let t;if(Pe(e)){const n=xi&&e._c;n&&(e._d=!1,bo()),e=e(),n&&(e._d=!0,t=fn,Cg())}return ye(e)&&(e=v0(e)),e=xn(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function Dg(e,t){t&&t.pendingBranch?ye(e)?t.effects.push(...e):t.effects.push(e):po(e)}function ns(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let i=t.el;for(;!i&&t.component;)t=t.component.subTree,i=t.el;n.el=i,r&&r.subTree===n&&(r.vnode.el=i,Kl(r,i))}function A0(e){const t=e.props&&e.props.suspensible;return t!=null&&t!==!1}const Wt=Symbol.for(\"v-fgt\"),ri=Symbol.for(\"v-txt\"),Rt=Symbol.for(\"v-cmt\"),Oi=Symbol.for(\"v-stc\"),eo=[];let fn=null;function bo(e=!1){eo.push(fn=e?null:[])}function Cg(){eo.pop(),fn=eo[eo.length-1]||null}let xi=1;function Ou(e,t=!1){xi+=e,e<0&&fn&&t&&(fn.hasOnce=!0)}function Og(e){return e.dynamicChildren=xi>0?fn||bi:null,Cg(),xi>0&&fn&&fn.push(e),e}function _0(e,t,n,r,i,s){return Og(Lf(e,t,n,r,i,s,!0))}function tl(e,t,n,r,i){return Og(yt(e,t,n,r,i,!0))}function Br(e){return e?e.__v_isVNode===!0:!1}function or(e,t){return e.type===t.type&&e.key===t.key}function M0(e){}const Ag=({key:e})=>e??null,_a=({ref:e,ref_key:t,ref_for:n})=>(typeof e==\"number\"&&(e=\"\"+e),e!=null?ke(e)||Ut(e)||Pe(e)?{i:Ht,r:e,k:t,f:!!n}:e:null);function Lf(e,t=null,n=null,r=0,i=null,s=e===Wt?0:1,o=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ag(t),ref:t&&_a(t),scopeId:jl,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:Ht};return a?(Ff(l,n),s&128&&e.normalize(l)):n&&(l.shapeFlag|=ke(n)?8:16),xi>0&&!o&&fn&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&fn.push(l),l}const yt=x0;function x0(e,t=null,n=null,r=0,i=null,s=!1){if((!e||e===qm)&&(e=Rt),Br(e)){const a=gr(e,t,!0);return n&&Ff(a,n),xi>0&&!s&&fn&&(a.shapeFlag&6?fn[fn.indexOf(e)]=a:fn.push(a)),a.patchFlag=-2,a}if(V0(e)&&(e=e.__vccOpts),t){t=_g(t);let{class:a,style:l}=t;a&&!ke(a)&&(t.class=ys(a)),ct(l)&&(Fl(l)&&!ye(l)&&(l=Ze({},l)),t.style=vs(l))}const o=ke(e)?1:el(e)?128:Fm(e)?64:ct(e)?4:Pe(e)?2:0;return Lf(e,t,n,r,i,o,s,!0)}function _g(e){return e?Fl(e)||og(e)?Ze({},e):e:null}function gr(e,t,n=!1,r=!1){const{props:i,ref:s,patchFlag:o,children:a,transition:l}=e,c=t?Mg(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&Ag(c),ref:t&&t.ref?n&&s?ye(s)?s.concat(_a(t)):[s,_a(t)]:_a(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Wt?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&gr(e.ssContent),ssFallback:e.ssFallback&&gr(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&Vr(u,l.clone(u)),u}function kf(e=\" \",t=0){return yt(ri,null,e,t)}function N0(e,t){const n=yt(Oi,null,e);return n.staticCount=t,n}function I0(e=\"\",t=!1){return t?(bo(),tl(Rt,null,e)):yt(Rt,null,e)}function xn(e){return e==null||typeof e==\"boolean\"?yt(Rt):ye(e)?yt(Wt,null,e.slice()):Br(e)?Xr(e):yt(ri,null,String(e))}function Xr(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:gr(e)}function Ff(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(ye(t))n=16;else if(typeof t==\"object\")if(r&65){const i=t.default;i&&(i._c&&(i._d=!1),Ff(e,i()),i._c&&(i._d=!0));return}else{n=32;const i=t._;!i&&!og(t)?t._ctx=Ht:i===3&&Ht&&(Ht.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else Pe(t)?(t={default:t,_ctx:Ht},n=32):(t=String(t),r&64?(n=16,t=[kf(t)]):n=8);e.children=t,e.shapeFlag|=n}function Mg(...e){const t={};for(let n=0;n<e.length;n++){const r=e[n];for(const i in r)if(i===\"class\")t.class!==r.class&&(t.class=ys([t.class,r.class]));else if(i===\"style\")t.style=vs([t.style,r.style]);else if(ai(i)){const s=t[i],o=r[i];o&&s!==o&&!(ye(s)&&s.includes(o))&&(t[i]=s?[].concat(s,o):o)}else i!==\"\"&&(t[i]=r[i])}return t}function _n(e,t,n,r=null){Jn(e,t,7,[n,r])}const R0=ng();let P0=0;function xg(e,t,n){const r=e.type,i=(t?t.appContext:e.appContext)||R0,s={uid:P0++,vnode:e,type:r,parent:t,appContext:i,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new mf(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(i.provides),ids:t?t.ids:[\"\",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:lg(r,i),emitsOptions:Tg(r,i),emit:null,emitted:null,propsDefaults:et,inheritAttrs:r.inheritAttrs,ctx:et,data:et,props:et,attrs:et,slots:et,refs:et,setupState:et,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return s.ctx={_:s},s.root=t?t.root:s,s.emit=g0.bind(null,s),e.ce&&e.ce(s),s}let jt=null;const qn=()=>jt||Ht;let nl,Au;{const e=No(),t=(n,r)=>{let i;return(i=e[n])||(i=e[n]=[]),i.push(r),s=>{i.length>1?i.forEach(o=>o(s)):i[0](s)}};nl=t(\"__VUE_INSTANCE_SETTERS__\",n=>jt=n),Au=t(\"__VUE_SSR_SETTERS__\",n=>as=n)}const Ni=e=>{const t=jt;return nl(e),e.scope.on(),()=>{e.scope.off(),nl(t)}},_u=()=>{jt&&jt.scope.off(),nl(null)};function Ng(e){return e.vnode.shapeFlag&4}let as=!1;function Ig(e,t=!1,n=!1){t&&Au(t);const{props:r,children:i}=e.vnode,s=Ng(e);s0(e,r,s,t),c0(e,i,n||t);const o=s?L0(e,t):void 0;return t&&Au(!1),o}function L0(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Su);const{setup:r}=n;if(r){Lr();const i=e.setupContext=r.length>1?Lg(e):null,s=Ni(e),o=Es(r,e,0,[e.props,i]),a=Ml(o);if(kr(),s(),(a||e.sp)&&!ni(e)&&Of(e),a){if(o.then(_u,_u),t)return o.then(l=>{Mu(e,l,t)}).catch(l=>{Bi(l,e,0)});e.asyncDep=o}else Mu(e,o,t)}else Pg(e,t)}function Mu(e,t,n){Pe(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ct(t)&&(e.setupState=bf(t)),Pg(e,n)}let rl,xu;function Rg(e){rl=e,xu=t=>{t.render._rc&&(t.withProxy=new Proxy(t.ctx,FS))}}const k0=()=>!rl;function Pg(e,t,n){const r=e.type;if(!e.render){if(!t&&rl&&!r.render){const i=r.template||Nf(e).template;if(i){const{isCustomElement:s,compilerOptions:o}=e.appContext.config,{delimiters:a,compilerOptions:l}=r,c=Ze(Ze({isCustomElement:s,delimiters:a},o),l);r.render=rl(i,c)}}e.render=r.render||Ft,xu&&xu(e)}{const i=Ni(e);Lr();try{ZS(e)}finally{kr(),i()}}}const F0={get(e,t){return an(e,\"get\",\"\"),e[t]}};function Lg(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,F0),slots:e.slots,emit:e.emit,expose:t}}function ko(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(bf(Cm(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Qs)return Qs[n](e)},has(t,n){return n in t||n in Qs}})):e.proxy}function Nu(e,t=!0){return Pe(e)?e.displayName||e.name:e.name||t&&e.__name}function V0(e){return Pe(e)&&\"__vccOpts\"in e}const kg=(e,t)=>Kb(e,t,as);function Vf(e,t,n){const r=arguments.length;return r===2?ct(t)&&!ye(t)?Br(t)?yt(e,null,[t]):yt(e,t):yt(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Br(n)&&(n=[n]),yt(e,t,n))}function B0(){}function j0(e,t,n,r){const i=n[r];if(i&&Fg(i,e))return i;const s=t();return s.memo=e.slice(),s.cacheIndex=r,n[r]=s}function Fg(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let r=0;r<n.length;r++)if(on(n[r],t[r]))return!1;return xi>0&&fn&&fn.push(e),!0}const Vg=\"3.5.16\",H0=Ft,U0=nS,$0=Xi,W0=Lm,Y0={createComponentInstance:xg,setupComponent:Ig,renderComponentRoot:Aa,setCurrentRenderingInstance:go,isVNode:Br,normalizeVNode:xn,getComponentPublicInstance:ko,ensureValidVNode:xf,pushWarningContext:Qb,popWarningContext:qb},z0=Y0,K0=null,G0=null,X0=null;/**\n* @vue/runtime-dom v3.5.16\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/let Iu;const Xd=typeof window<\"u\"&&window.trustedTypes;if(Xd)try{Iu=Xd.createPolicy(\"vue\",{createHTML:e=>e})}catch{}const Bg=Iu?e=>Iu.createHTML(e):e=>e,J0=\"http://www.w3.org/2000/svg\",Z0=\"http://www.w3.org/1998/Math/MathML\",Dr=typeof document<\"u\"?document:null,Jd=Dr&&Dr.createElement(\"template\"),Q0={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const i=t===\"svg\"?Dr.createElementNS(J0,e):t===\"mathml\"?Dr.createElementNS(Z0,e):n?Dr.createElement(e,{is:n}):Dr.createElement(e);return e===\"select\"&&r&&r.multiple!=null&&i.setAttribute(\"multiple\",r.multiple),i},createText:e=>Dr.createTextNode(e),createComment:e=>Dr.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Dr.querySelector(e),setScopeId(e,t){e.setAttribute(t,\"\")},insertStaticContent(e,t,n,r,i,s){const o=n?n.previousSibling:t.lastChild;if(i&&(i===s||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),!(i===s||!(i=i.nextSibling)););else{Jd.innerHTML=Bg(r===\"svg\"?`<svg>${e}</svg>`:r===\"mathml\"?`<math>${e}</math>`:e);const a=Jd.content;if(r===\"svg\"||r===\"mathml\"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},$r=\"transition\",As=\"animation\",ls=Symbol(\"_vtc\"),jg={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Hg=Ze({},Df,jg),q0=e=>(e.displayName=\"Transition\",e.props=Hg,e),eT=q0((e,{slots:t})=>Vf(Um,Ug(e),t)),fi=(e,t=[])=>{ye(e)?e.forEach(n=>n(...t)):e&&e(...t)},Zd=e=>e?ye(e)?e.some(t=>t.length>1):e.length>1:!1;function Ug(e){const t={};for(const P in e)P in jg||(t[P]=e[P]);if(e.css===!1)return t;const{name:n=\"v\",type:r,duration:i,enterFromClass:s=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:c=o,appearToClass:u=a,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,m=tT(i),g=m&&m[0],v=m&&m[1],{onBeforeEnter:w,onEnter:S,onEnterCancelled:y,onLeave:E,onLeaveCancelled:C,onBeforeAppear:M=w,onAppear:B=S,onAppearCancelled:j=y}=t,A=(P,V,$,Z)=>{P._enterCancelled=Z,Yr(P,V?u:a),Yr(P,V?c:o),$&&$()},x=(P,V)=>{P._isLeaving=!1,Yr(P,f),Yr(P,p),Yr(P,d),V&&V()},k=P=>(V,$)=>{const Z=P?B:S,U=()=>A(V,P,$);fi(Z,[V,U]),Qd(()=>{Yr(V,P?l:s),fr(V,P?u:a),Zd(Z)||qd(V,r,g,U)})};return Ze(t,{onBeforeEnter(P){fi(w,[P]),fr(P,s),fr(P,o)},onBeforeAppear(P){fi(M,[P]),fr(P,l),fr(P,c)},onEnter:k(!1),onAppear:k(!0),onLeave(P,V){P._isLeaving=!0;const $=()=>x(P,V);fr(P,f),P._enterCancelled?(fr(P,d),Ru()):(Ru(),fr(P,d)),Qd(()=>{P._isLeaving&&(Yr(P,f),fr(P,p),Zd(E)||qd(P,r,v,$))}),fi(E,[P,$])},onEnterCancelled(P){A(P,!1,void 0,!0),fi(y,[P])},onAppearCancelled(P){A(P,!0,void 0,!0),fi(j,[P])},onLeaveCancelled(P){x(P),fi(C,[P])}})}function tT(e){if(e==null)return null;if(ct(e))return[kc(e.enter),kc(e.leave)];{const t=kc(e);return[t,t]}}function kc(e){return co(e)}function fr(e,t){t.split(/\\s+/).forEach(n=>n&&e.classList.add(n)),(e[ls]||(e[ls]=new Set)).add(t)}function Yr(e,t){t.split(/\\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[ls];n&&(n.delete(t),n.size||(e[ls]=void 0))}function Qd(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let nT=0;function qd(e,t,n,r){const i=e._endId=++nT,s=()=>{i===e._endId&&r()};if(n!=null)return setTimeout(s,n);const{type:o,timeout:a,propCount:l}=$g(e,t);if(!o)return r();const c=o+\"end\";let u=0;const f=()=>{e.removeEventListener(c,d),s()},d=p=>{p.target===e&&++u>=l&&f()};setTimeout(()=>{u<l&&f()},a+1),e.addEventListener(c,d)}function $g(e,t){const n=window.getComputedStyle(e),r=m=>(n[m]||\"\").split(\", \"),i=r(`${$r}Delay`),s=r(`${$r}Duration`),o=eh(i,s),a=r(`${As}Delay`),l=r(`${As}Duration`),c=eh(a,l);let u=null,f=0,d=0;t===$r?o>0&&(u=$r,f=o,d=s.length):t===As?c>0&&(u=As,f=c,d=l.length):(f=Math.max(o,c),u=f>0?o>c?$r:As:null,d=u?u===$r?s.length:l.length:0);const p=u===$r&&/\\b(transform|all)(,|$)/.test(r(`${$r}Property`).toString());return{type:u,timeout:f,propCount:d,hasTransform:p}}function eh(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,r)=>th(n)+th(e[r])))}function th(e){return e===\"auto\"?0:Number(e.slice(0,-1).replace(\",\",\".\"))*1e3}function Ru(){return document.body.offsetHeight}function rT(e,t,n){const r=e[ls];r&&(t=(t?[t,...r]:[...r]).join(\" \")),t==null?e.removeAttribute(\"class\"):n?e.setAttribute(\"class\",t):e.className=t}const il=Symbol(\"_vod\"),Wg=Symbol(\"_vsh\"),Yg={beforeMount(e,{value:t},{transition:n}){e[il]=e.style.display===\"none\"?\"\":e.style.display,n&&t?n.beforeEnter(e):_s(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),_s(e,!0),r.enter(e)):r.leave(e,()=>{_s(e,!1)}):_s(e,t))},beforeUnmount(e,{value:t}){_s(e,t)}};function _s(e,t){e.style.display=t?e[il]:\"none\",e[Wg]=!t}function iT(){Yg.getSSRProps=({value:e})=>{if(!e)return{style:{display:\"none\"}}}}const zg=Symbol(\"\");function sT(e){const t=qn();if(!t)return;const n=t.ut=(i=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner=\"${t.uid}\"]`)).forEach(s=>sl(s,i))},r=()=>{const i=e(t.proxy);t.ce?sl(t.ce,i):Pu(t.subTree,i),n(i)};Af(()=>{po(r)}),Po(()=>{ts(r,Ft,{flush:\"post\"});const i=new MutationObserver(r);i.observe(t.subTree.el.parentNode,{childList:!0}),Yl(()=>i.disconnect())})}function Pu(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{Pu(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)sl(e.el,t);else if(e.type===Wt)e.children.forEach(n=>Pu(n,t));else if(e.type===Oi){let{el:n,anchor:r}=e;for(;n&&(sl(n,t),n!==r);)n=n.nextSibling}}function sl(e,t){if(e.nodeType===1){const n=e.style;let r=\"\";for(const i in t)n.setProperty(`--${i}`,t[i]),r+=`--${i}: ${t[i]};`;n[zg]=r}}const oT=/(^|;)\\s*display\\s*:/;function aT(e,t,n){const r=e.style,i=ke(n);let s=!1;if(n&&!i){if(t)if(ke(t))for(const o of t.split(\";\")){const a=o.slice(0,o.indexOf(\":\")).trim();n[a]==null&&Ma(r,a,\"\")}else for(const o in t)n[o]==null&&Ma(r,o,\"\");for(const o in n)o===\"display\"&&(s=!0),Ma(r,o,n[o])}else if(i){if(t!==n){const o=r[zg];o&&(n+=\";\"+o),r.cssText=n,s=oT.test(n)}}else t&&e.removeAttribute(\"style\");il in e&&(e[il]=s?r.display:\"\",e[Wg]&&(r.display=\"none\"))}const nh=/\\s*!important$/;function Ma(e,t,n){if(ye(n))n.forEach(r=>Ma(e,t,r));else if(n==null&&(n=\"\"),t.startsWith(\"--\"))e.setProperty(t,n);else{const r=lT(e,t);nh.test(n)?e.setProperty(ln(r),n.replace(nh,\"\"),\"important\"):e[r]=n}}const rh=[\"Webkit\",\"Moz\",\"ms\"],Fc={};function lT(e,t){const n=Fc[t];if(n)return n;let r=gt(t);if(r!==\"filter\"&&r in e)return Fc[t]=r;r=ci(r);for(let i=0;i<rh.length;i++){const s=rh[i]+r;if(s in e)return Fc[t]=s}return t}const ih=\"http://www.w3.org/1999/xlink\";function sh(e,t,n,r,i,s=im(t)){r&&t.startsWith(\"xlink:\")?n==null?e.removeAttributeNS(ih,t.slice(6,t.length)):e.setAttributeNS(ih,t,n):n==null||s&&!hf(n)?e.removeAttribute(t):e.setAttribute(t,s?\"\":Sn(n)?String(n):n)}function oh(e,t,n,r,i){if(t===\"innerHTML\"||t===\"textContent\"){n!=null&&(e[t]=t===\"innerHTML\"?Bg(n):n);return}const s=e.tagName;if(t===\"value\"&&s!==\"PROGRESS\"&&!s.includes(\"-\")){const a=s===\"OPTION\"?e.getAttribute(\"value\")||\"\":e.value,l=n==null?e.type===\"checkbox\"?\"on\":\"\":String(n);(a!==l||!(\"_value\"in e))&&(e.value=l),n==null&&e.removeAttribute(t),e._value=n;return}let o=!1;if(n===\"\"||n==null){const a=typeof e[t];a===\"boolean\"?n=hf(n):n==null&&a===\"string\"?(n=\"\",o=!0):a===\"number\"&&(n=0,o=!0)}try{e[t]=n}catch{}o&&e.removeAttribute(i||t)}function Ar(e,t,n,r){e.addEventListener(t,n,r)}function cT(e,t,n,r){e.removeEventListener(t,n,r)}const ah=Symbol(\"_vei\");function uT(e,t,n,r,i=null){const s=e[ah]||(e[ah]={}),o=s[t];if(r&&o)o.value=r;else{const[a,l]=fT(t);if(r){const c=s[t]=pT(r,i);Ar(e,a,c,l)}else o&&(cT(e,a,o,l),s[t]=void 0)}}const lh=/(?:Once|Passive|Capture)$/;function fT(e){let t;if(lh.test(e)){t={};let r;for(;r=e.match(lh);)e=e.slice(0,e.length-r[0].length),t[r[0].toLowerCase()]=!0}return[e[2]===\":\"?e.slice(3):ln(e.slice(2)),t]}let Vc=0;const dT=Promise.resolve(),hT=()=>Vc||(dT.then(()=>Vc=0),Vc=Date.now());function pT(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Jn(mT(r,n.value),t,5,[r])};return n.value=e,n.attached=hT(),n}function mT(e,t){if(ye(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>i=>!i._stopped&&r&&r(i))}else return t}const ch=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,gT=(e,t,n,r,i,s)=>{const o=i===\"svg\";t===\"class\"?rT(e,r,o):t===\"style\"?aT(e,n,r):ai(t)?Al(t)||uT(e,t,n,r,s):(t[0]===\".\"?(t=t.slice(1),!0):t[0]===\"^\"?(t=t.slice(1),!1):vT(e,t,r,o))?(oh(e,t,r),!e.tagName.includes(\"-\")&&(t===\"value\"||t===\"checked\"||t===\"selected\")&&sh(e,t,r,o,s,t!==\"value\")):e._isVueCE&&(/[A-Z]/.test(t)||!ke(r))?oh(e,gt(t),r,s,t):(t===\"true-value\"?e._trueValue=r:t===\"false-value\"&&(e._falseValue=r),sh(e,t,r,o))};function vT(e,t,n,r){if(r)return!!(t===\"innerHTML\"||t===\"textContent\"||t in e&&ch(t)&&Pe(n));if(t===\"spellcheck\"||t===\"draggable\"||t===\"translate\"||t===\"autocorrect\"||t===\"form\"||t===\"list\"&&e.tagName===\"INPUT\"||t===\"type\"&&e.tagName===\"TEXTAREA\")return!1;if(t===\"width\"||t===\"height\"){const i=e.tagName;if(i===\"IMG\"||i===\"VIDEO\"||i===\"CANVAS\"||i===\"SOURCE\")return!1}return ch(t)&&ke(n)?!1:t in e}const uh={};/*! #__NO_SIDE_EFFECTS__ */function Kg(e,t,n){const r=Cf(e,t);xo(r)&&Ze(r,t);class i extends Gl{constructor(o){super(r,o,n)}}return i.def=r,i}/*! #__NO_SIDE_EFFECTS__ */const yT=(e,t)=>Kg(e,t,sv),ET=typeof HTMLElement<\"u\"?HTMLElement:class{};class Gl extends ET{constructor(t,n={},r=ll){super(),this._def=t,this._props=n,this._createApp=r,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._ob=null,this.shadowRoot&&r!==ll?this._root=this.shadowRoot:t.shadowRoot!==!1?(this.attachShadow({mode:\"open\"}),this._root=this.shadowRoot):this._root=this}connectedCallback(){if(!this.isConnected)return;!this.shadowRoot&&!this._resolved&&this._parseSlots(),this._connected=!0;let t=this;for(;t=t&&(t.parentNode||t.host);)if(t instanceof Gl){this._parent=t;break}this._instance||(this._resolved?this._mount(this._def):t&&t._pendingResolve?this._pendingResolve=t._pendingResolve.then(()=>{this._pendingResolve=void 0,this._resolveDef()}):this._resolveDef())}_setParent(t=this._parent){t&&(this._instance.parent=t._instance,this._inheritParentContext(t))}_inheritParentContext(t=this._parent){t&&this._app&&Object.setPrototypeOf(this._app._context.provides,t._instance.provides)}disconnectedCallback(){this._connected=!1,Bl(()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null)})}_resolveDef(){if(this._pendingResolve)return;for(let r=0;r<this.attributes.length;r++)this._setAttr(this.attributes[r].name);this._ob=new MutationObserver(r=>{for(const i of r)this._setAttr(i.attributeName)}),this._ob.observe(this,{attributes:!0});const t=(r,i=!1)=>{this._resolved=!0,this._pendingResolve=void 0;const{props:s,styles:o}=r;let a;if(s&&!ye(s))for(const l in s){const c=s[l];(c===Number||c&&c.type===Number)&&(l in this._props&&(this._props[l]=co(this._props[l])),(a||(a=Object.create(null)))[gt(l)]=!0)}this._numberProps=a,this._resolveProps(r),this.shadowRoot&&this._applyStyles(o),this._mount(r)},n=this._def.__asyncLoader;n?this._pendingResolve=n().then(r=>t(this._def=r,!0)):t(this._def)}_mount(t){this._app=this._createApp(t),this._inheritParentContext(),t.configureApp&&t.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);const n=this._instance&&this._instance.exposed;if(n)for(const r in n)st(this,r)||Object.defineProperty(this,r,{get:()=>Vl(n[r])})}_resolveProps(t){const{props:n}=t,r=ye(n)?n:Object.keys(n||{});for(const i of Object.keys(this))i[0]!==\"_\"&&r.includes(i)&&this._setProp(i,this[i]);for(const i of r.map(gt))Object.defineProperty(this,i,{get(){return this._getProp(i)},set(s){this._setProp(i,s,!0,!0)}})}_setAttr(t){if(t.startsWith(\"data-v-\"))return;const n=this.hasAttribute(t);let r=n?this.getAttribute(t):uh;const i=gt(t);n&&this._numberProps&&this._numberProps[i]&&(r=co(r)),this._setProp(i,r,!1,!0)}_getProp(t){return this._props[t]}_setProp(t,n,r=!0,i=!1){if(n!==this._props[t]&&(n===uh?delete this._props[t]:(this._props[t]=n,t===\"key\"&&this._app&&(this._app._ceVNode.key=n)),i&&this._instance&&this._update(),r)){const s=this._ob;s&&s.disconnect(),n===!0?this.setAttribute(ln(t),\"\"):typeof n==\"string\"||typeof n==\"number\"?this.setAttribute(ln(t),n+\"\"):n||this.removeAttribute(ln(t)),s&&s.observe(this,{attributes:!0})}}_update(){const t=this._createVNode();this._app&&(t.appContext=this._app._context),iv(t,this._root)}_createVNode(){const t={};this.shadowRoot||(t.onVnodeMounted=t.onVnodeUpdated=this._renderSlots.bind(this));const n=yt(this._def,Ze(t,this._props));return this._instance||(n.ce=r=>{this._instance=r,r.ce=this,r.isCE=!0;const i=(s,o)=>{this.dispatchEvent(new CustomEvent(s,xo(o[0])?Ze({detail:o},o[0]):{detail:o}))};r.emit=(s,...o)=>{i(s,o),ln(s)!==s&&i(ln(s),o)},this._setParent()}),n}_applyStyles(t,n){if(!t)return;if(n){if(n===this._def||this._styleChildren.has(n))return;this._styleChildren.add(n)}const r=this._nonce;for(let i=t.length-1;i>=0;i--){const s=document.createElement(\"style\");r&&s.setAttribute(\"nonce\",r),s.textContent=t[i],this.shadowRoot.prepend(s)}}_parseSlots(){const t=this._slots={};let n;for(;n=this.firstChild;){const r=n.nodeType===1&&n.getAttribute(\"slot\")||\"default\";(t[r]||(t[r]=[])).push(n),this.removeChild(n)}}_renderSlots(){const t=(this._teleportTarget||this).querySelectorAll(\"slot\"),n=this._instance.type.__scopeId;for(let r=0;r<t.length;r++){const i=t[r],s=i.getAttribute(\"name\")||\"default\",o=this._slots[s],a=i.parentNode;if(o)for(const l of o){if(n&&l.nodeType===1){const c=n+\"-s\",u=document.createTreeWalker(l,1);l.setAttribute(c,\"\");let f;for(;f=u.nextNode();)f.setAttribute(c,\"\")}a.insertBefore(l,i)}else for(;i.firstChild;)a.insertBefore(i.firstChild,i);a.removeChild(i)}}_injectChildStyle(t){this._applyStyles(t.styles,t)}_removeChildStyle(t){}}function Gg(e){const t=qn(),n=t&&t.ce;return n||null}function bT(){const e=Gg();return e&&e.shadowRoot}function ST(e=\"$style\"){{const t=qn();if(!t)return et;const n=t.type.__cssModules;if(!n)return et;const r=n[e];return r||et}}const Xg=new WeakMap,Jg=new WeakMap,ol=Symbol(\"_moveCb\"),fh=Symbol(\"_enterCb\"),TT=e=>(delete e.props.mode,e),wT=TT({name:\"TransitionGroup\",props:Ze({},Hg,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=qn(),r=wf();let i,s;return $l(()=>{if(!i.length)return;const o=e.moveClass||`${e.name||\"v\"}-move`;if(!_T(i[0].el,n.vnode.el,o)){i=[];return}i.forEach(CT),i.forEach(OT);const a=i.filter(AT);Ru(),a.forEach(l=>{const c=l.el,u=c.style;fr(c,o),u.transform=u.webkitTransform=u.transitionDuration=\"\";const f=c[ol]=d=>{d&&d.target!==c||(!d||/transform$/.test(d.propertyName))&&(c.removeEventListener(\"transitionend\",f),c[ol]=null,Yr(c,o))};c.addEventListener(\"transitionend\",f)}),i=[]}),()=>{const o=rt(e),a=Ug(o);let l=o.tag||Wt;if(i=[],s)for(let c=0;c<s.length;c++){const u=s[c];u.el&&u.el instanceof Element&&(i.push(u),Vr(u,os(u,a,r,n)),Xg.set(u,u.el.getBoundingClientRect()))}s=t.default?Hl(t.default()):[];for(let c=0;c<s.length;c++){const u=s[c];u.key!=null&&Vr(u,os(u,a,r,n))}return yt(l,null,s)}}}),DT=wT;function CT(e){const t=e.el;t[ol]&&t[ol](),t[fh]&&t[fh]()}function OT(e){Jg.set(e,e.el.getBoundingClientRect())}function AT(e){const t=Xg.get(e),n=Jg.get(e),r=t.left-n.left,i=t.top-n.top;if(r||i){const s=e.el.style;return s.transform=s.webkitTransform=`translate(${r}px,${i}px)`,s.transitionDuration=\"0s\",e}}function _T(e,t,n){const r=e.cloneNode(),i=e[ls];i&&i.forEach(a=>{a.split(/\\s+/).forEach(l=>l&&r.classList.remove(l))}),n.split(/\\s+/).forEach(a=>a&&r.classList.add(a)),r.style.display=\"none\";const s=t.nodeType===1?t:t.parentNode;s.appendChild(r);const{hasTransform:o}=$g(r);return s.removeChild(r),o}const si=e=>{const t=e.props[\"onUpdate:modelValue\"]||!1;return ye(t)?n=>wi(t,n):t};function MT(e){e.target.composing=!0}function dh(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event(\"input\")))}const Gn=Symbol(\"_assign\"),al={created(e,{modifiers:{lazy:t,trim:n,number:r}},i){e[Gn]=si(i);const s=r||i.props&&i.props.type===\"number\";Ar(e,t?\"change\":\"input\",o=>{if(o.target.composing)return;let a=e.value;n&&(a=a.trim()),s&&(a=lo(a)),e[Gn](a)}),n&&Ar(e,\"change\",()=>{e.value=e.value.trim()}),t||(Ar(e,\"compositionstart\",MT),Ar(e,\"compositionend\",dh),Ar(e,\"change\",dh))},mounted(e,{value:t}){e.value=t??\"\"},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:i,number:s}},o){if(e[Gn]=si(o),e.composing)return;const a=(s||e.type===\"number\")&&!/^0\\d/.test(e.value)?lo(e.value):e.value,l=t??\"\";a!==l&&(document.activeElement===e&&e.type!==\"range\"&&(r&&t===n||i&&e.value.trim()===l)||(e.value=l))}},Bf={deep:!0,created(e,t,n){e[Gn]=si(n),Ar(e,\"change\",()=>{const r=e._modelValue,i=cs(e),s=e.checked,o=e[Gn];if(ye(r)){const a=Io(r,i),l=a!==-1;if(s&&!l)o(r.concat(i));else if(!s&&l){const c=[...r];c.splice(a,1),o(c)}}else if(li(r)){const a=new Set(r);s?a.add(i):a.delete(i),o(a)}else o(Qg(e,s))})},mounted:hh,beforeUpdate(e,t,n){e[Gn]=si(n),hh(e,t,n)}};function hh(e,{value:t,oldValue:n},r){e._modelValue=t;let i;if(ye(t))i=Io(t,r.props.value)>-1;else if(li(t))i=t.has(r.props.value);else{if(t===n)return;i=Pr(t,Qg(e,!0))}e.checked!==i&&(e.checked=i)}const jf={created(e,{value:t},n){e.checked=Pr(t,n.props.value),e[Gn]=si(n),Ar(e,\"change\",()=>{e[Gn](cs(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[Gn]=si(r),t!==n&&(e.checked=Pr(t,r.props.value))}},Zg={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const i=li(t);Ar(e,\"change\",()=>{const s=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>n?lo(cs(o)):cs(o));e[Gn](e.multiple?i?new Set(s):s:s[0]),e._assigning=!0,Bl(()=>{e._assigning=!1})}),e[Gn]=si(r)},mounted(e,{value:t}){ph(e,t)},beforeUpdate(e,t,n){e[Gn]=si(n)},updated(e,{value:t}){e._assigning||ph(e,t)}};function ph(e,t){const n=e.multiple,r=ye(t);if(!(n&&!r&&!li(t))){for(let i=0,s=e.options.length;i<s;i++){const o=e.options[i],a=cs(o);if(n)if(r){const l=typeof a;l===\"string\"||l===\"number\"?o.selected=t.some(c=>String(c)===String(a)):o.selected=Io(t,a)>-1}else o.selected=t.has(a);else if(Pr(cs(o),t)){e.selectedIndex!==i&&(e.selectedIndex=i);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function cs(e){return\"_value\"in e?e._value:e.value}function Qg(e,t){const n=t?\"_trueValue\":\"_falseValue\";return n in e?e[n]:t}const qg={created(e,t,n){oa(e,t,n,null,\"created\")},mounted(e,t,n){oa(e,t,n,null,\"mounted\")},beforeUpdate(e,t,n,r){oa(e,t,n,r,\"beforeUpdate\")},updated(e,t,n,r){oa(e,t,n,r,\"updated\")}};function ev(e,t){switch(e){case\"SELECT\":return Zg;case\"TEXTAREA\":return al;default:switch(t){case\"checkbox\":return Bf;case\"radio\":return jf;default:return al}}}function oa(e,t,n,r,i){const o=ev(e.tagName,n.props&&n.props.type)[i];o&&o(e,t,n,r)}function xT(){al.getSSRProps=({value:e})=>({value:e}),jf.getSSRProps=({value:e},t)=>{if(t.props&&Pr(t.props.value,e))return{checked:!0}},Bf.getSSRProps=({value:e},t)=>{if(ye(e)){if(t.props&&Io(e,t.props.value)>-1)return{checked:!0}}else if(li(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},qg.getSSRProps=(e,t)=>{if(typeof t.type!=\"string\")return;const n=ev(t.type.toUpperCase(),t.props&&t.props.type);if(n.getSSRProps)return n.getSSRProps(e,t)}}const NT=[\"ctrl\",\"shift\",\"alt\",\"meta\"],IT={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>\"button\"in e&&e.button!==0,middle:e=>\"button\"in e&&e.button!==1,right:e=>\"button\"in e&&e.button!==2,exact:(e,t)=>NT.some(n=>e[`${n}Key`]&&!t.includes(n))},RT=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(\".\");return n[r]||(n[r]=(i,...s)=>{for(let o=0;o<t.length;o++){const a=IT[t[o]];if(a&&a(i,t))return}return e(i,...s)})},PT={esc:\"escape\",space:\" \",up:\"arrow-up\",left:\"arrow-left\",right:\"arrow-right\",down:\"arrow-down\",delete:\"backspace\"},LT=(e,t)=>{const n=e._withKeys||(e._withKeys={}),r=t.join(\".\");return n[r]||(n[r]=i=>{if(!(\"key\"in i))return;const s=ln(i.key);if(t.some(o=>o===s||PT[o]===s))return e(i)})},tv=Ze({patchProp:gT},Q0);let to,mh=!1;function nv(){return to||(to=dg(tv))}function rv(){return to=mh?to:hg(tv),mh=!0,to}const iv=(...e)=>{nv().render(...e)},kT=(...e)=>{rv().hydrate(...e)},ll=(...e)=>{const t=nv().createApp(...e),{mount:n}=t;return t.mount=r=>{const i=av(r);if(!i)return;const s=t._component;!Pe(s)&&!s.render&&!s.template&&(s.template=i.innerHTML),i.nodeType===1&&(i.textContent=\"\");const o=n(i,!1,ov(i));return i instanceof Element&&(i.removeAttribute(\"v-cloak\"),i.setAttribute(\"data-v-app\",\"\")),o},t},sv=(...e)=>{const t=rv().createApp(...e),{mount:n}=t;return t.mount=r=>{const i=av(r);if(i)return n(i,!0,ov(i))},t};function ov(e){if(e instanceof SVGElement)return\"svg\";if(typeof MathMLElement==\"function\"&&e instanceof MathMLElement)return\"mathml\"}function av(e){return ke(e)?document.querySelector(e):e}let gh=!1;const FT=()=>{gh||(gh=!0,xT(),iT())},lv=Object.freeze(Object.defineProperty({__proto__:null,BaseTransition:Um,BaseTransitionPropsValidators:Df,Comment:Rt,DeprecationTypes:X0,EffectScope:mf,ErrorCodes:tS,ErrorTypeStrings:U0,Fragment:Wt,KeepAlive:_S,ReactiveEffect:uo,Static:Oi,Suspense:T0,Teleport:uS,Text:ri,TrackOpTypes:Gb,Transition:eT,TransitionGroup:DT,TriggerOpTypes:Xb,VueElement:Gl,assertNumber:eS,callWithAsyncErrorHandling:Jn,callWithErrorHandling:Es,camelize:gt,capitalize:ci,cloneVNode:gr,compatUtils:G0,computed:kg,createApp:ll,createBlock:tl,createCommentVNode:I0,createElementBlock:_0,createElementVNode:Lf,createHydrationRenderer:hg,createPropsRestProxy:XS,createRenderer:dg,createSSRApp:sv,createSlots:PS,createStaticVNode:N0,createTextVNode:kf,createVNode:yt,customRef:_m,defineAsyncComponent:OS,defineComponent:Cf,defineCustomElement:Kg,defineEmits:BS,defineExpose:jS,defineModel:$S,defineOptions:HS,defineProps:VS,defineSSRCustomElement:yT,defineSlots:US,devtools:$0,effect:gb,effectScope:hb,getCurrentInstance:qn,getCurrentScope:lm,getCurrentWatcher:Jb,getTransitionRawChildren:Hl,guardReactiveProps:_g,h:Vf,handleError:Bi,hasInjectionContext:i0,hydrate:kT,hydrateOnIdle:bS,hydrateOnInteraction:DS,hydrateOnMediaQuery:wS,hydrateOnVisible:TS,initCustomFormatter:B0,initDirectivesForSSR:FT,inject:qs,isMemoSame:Fg,isProxy:Fl,isReactive:ti,isReadonly:Fr,isRef:Ut,isRuntimeOnly:k0,isShallow:$n,isVNode:Br,markRaw:Cm,mergeDefaults:KS,mergeModels:GS,mergeProps:Mg,nextTick:Bl,normalizeClass:ys,normalizeProps:Qp,normalizeStyle:vs,onActivated:Wm,onBeforeMount:Km,onBeforeUnmount:Wl,onBeforeUpdate:Af,onDeactivated:Ym,onErrorCaptured:Zm,onMounted:Po,onRenderTracked:Jm,onRenderTriggered:Xm,onScopeDispose:pb,onServerPrefetch:Gm,onUnmounted:Yl,onUpdated:$l,onWatcherCleanup:xm,openBlock:bo,popScopeId:oS,provide:rg,proxyRefs:bf,pushScopeId:sS,queuePostFlushCb:po,reactive:Ll,readonly:Ef,ref:Js,registerRuntimeCompiler:Rg,render:iv,renderList:RS,renderSlot:LS,resolveComponent:Qm,resolveDirective:IS,resolveDynamicComponent:NS,resolveFilter:K0,resolveTransitionHooks:os,setBlockTracking:Ou,setDevtoolsHook:W0,setTransitionHooks:Vr,shallowReactive:Dm,shallowReadonly:kb,shallowRef:Om,ssrContextKey:vg,ssrUtils:z0,stop:vb,toDisplayString:pf,toHandlerKey:Ti,toHandlers:kS,toRaw:rt,toRef:Yb,toRefs:Ub,toValue:Bb,transformVNodeArgs:M0,triggerRef:Vb,unref:Vl,useAttrs:zS,useCssModule:ST,useCssVars:sT,useHost:Gg,useId:dS,useModel:m0,useSSRContext:yg,useShadowRoot:bT,useSlots:YS,useTemplateRef:hS,useTransitionState:wf,vModelCheckbox:Bf,vModelDynamic:qg,vModelRadio:jf,vModelSelect:Zg,vModelText:al,vShow:Yg,version:Vg,warn:H0,watch:ts,watchEffect:d0,watchPostEffect:h0,watchSyncEffect:Eg,withAsyncContext:JS,withCtx:Tf,withDefaults:WS,withDirectives:lS,withKeys:LT,withMemo:j0,withModifiers:RT,withScopeId:aS},Symbol.toStringTag,{value:\"Module\"}));/**\n* @vue/compiler-core v3.5.16\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/const us=Symbol(\"\"),rs=Symbol(\"\"),Xl=Symbol(\"\"),So=Symbol(\"\"),Hf=Symbol(\"\"),oi=Symbol(\"\"),Uf=Symbol(\"\"),$f=Symbol(\"\"),Jl=Symbol(\"\"),Zl=Symbol(\"\"),bs=Symbol(\"\"),Ql=Symbol(\"\"),Wf=Symbol(\"\"),ql=Symbol(\"\"),ec=Symbol(\"\"),tc=Symbol(\"\"),nc=Symbol(\"\"),rc=Symbol(\"\"),ic=Symbol(\"\"),Yf=Symbol(\"\"),zf=Symbol(\"\"),Fo=Symbol(\"\"),To=Symbol(\"\"),sc=Symbol(\"\"),oc=Symbol(\"\"),fs=Symbol(\"\"),Ss=Symbol(\"\"),ac=Symbol(\"\"),cl=Symbol(\"\"),cv=Symbol(\"\"),ul=Symbol(\"\"),wo=Symbol(\"\"),uv=Symbol(\"\"),fv=Symbol(\"\"),lc=Symbol(\"\"),dv=Symbol(\"\"),hv=Symbol(\"\"),cc=Symbol(\"\"),Kf=Symbol(\"\"),Ii={[us]:\"Fragment\",[rs]:\"Teleport\",[Xl]:\"Suspense\",[So]:\"KeepAlive\",[Hf]:\"BaseTransition\",[oi]:\"openBlock\",[Uf]:\"createBlock\",[$f]:\"createElementBlock\",[Jl]:\"createVNode\",[Zl]:\"createElementVNode\",[bs]:\"createCommentVNode\",[Ql]:\"createTextVNode\",[Wf]:\"createStaticVNode\",[ql]:\"resolveComponent\",[ec]:\"resolveDynamicComponent\",[tc]:\"resolveDirective\",[nc]:\"resolveFilter\",[rc]:\"withDirectives\",[ic]:\"renderList\",[Yf]:\"renderSlot\",[zf]:\"createSlots\",[Fo]:\"toDisplayString\",[To]:\"mergeProps\",[sc]:\"normalizeClass\",[oc]:\"normalizeStyle\",[fs]:\"normalizeProps\",[Ss]:\"guardReactiveProps\",[ac]:\"toHandlers\",[cl]:\"camelize\",[cv]:\"capitalize\",[ul]:\"toHandlerKey\",[wo]:\"setBlockTracking\",[uv]:\"pushScopeId\",[fv]:\"popScopeId\",[lc]:\"withCtx\",[dv]:\"unref\",[hv]:\"isRef\",[cc]:\"withMemo\",[Kf]:\"isMemoSame\"};function pv(e){Object.getOwnPropertySymbols(e).forEach(t=>{Ii[t]=e[t]})}const VT={HTML:0,0:\"HTML\",SVG:1,1:\"SVG\",MATH_ML:2,2:\"MATH_ML\"},BT={ROOT:0,0:\"ROOT\",ELEMENT:1,1:\"ELEMENT\",TEXT:2,2:\"TEXT\",COMMENT:3,3:\"COMMENT\",SIMPLE_EXPRESSION:4,4:\"SIMPLE_EXPRESSION\",INTERPOLATION:5,5:\"INTERPOLATION\",ATTRIBUTE:6,6:\"ATTRIBUTE\",DIRECTIVE:7,7:\"DIRECTIVE\",COMPOUND_EXPRESSION:8,8:\"COMPOUND_EXPRESSION\",IF:9,9:\"IF\",IF_BRANCH:10,10:\"IF_BRANCH\",FOR:11,11:\"FOR\",TEXT_CALL:12,12:\"TEXT_CALL\",VNODE_CALL:13,13:\"VNODE_CALL\",JS_CALL_EXPRESSION:14,14:\"JS_CALL_EXPRESSION\",JS_OBJECT_EXPRESSION:15,15:\"JS_OBJECT_EXPRESSION\",JS_PROPERTY:16,16:\"JS_PROPERTY\",JS_ARRAY_EXPRESSION:17,17:\"JS_ARRAY_EXPRESSION\",JS_FUNCTION_EXPRESSION:18,18:\"JS_FUNCTION_EXPRESSION\",JS_CONDITIONAL_EXPRESSION:19,19:\"JS_CONDITIONAL_EXPRESSION\",JS_CACHE_EXPRESSION:20,20:\"JS_CACHE_EXPRESSION\",JS_BLOCK_STATEMENT:21,21:\"JS_BLOCK_STATEMENT\",JS_TEMPLATE_LITERAL:22,22:\"JS_TEMPLATE_LITERAL\",JS_IF_STATEMENT:23,23:\"JS_IF_STATEMENT\",JS_ASSIGNMENT_EXPRESSION:24,24:\"JS_ASSIGNMENT_EXPRESSION\",JS_SEQUENCE_EXPRESSION:25,25:\"JS_SEQUENCE_EXPRESSION\",JS_RETURN_STATEMENT:26,26:\"JS_RETURN_STATEMENT\"},jT={ELEMENT:0,0:\"ELEMENT\",COMPONENT:1,1:\"COMPONENT\",SLOT:2,2:\"SLOT\",TEMPLATE:3,3:\"TEMPLATE\"},HT={NOT_CONSTANT:0,0:\"NOT_CONSTANT\",CAN_SKIP_PATCH:1,1:\"CAN_SKIP_PATCH\",CAN_CACHE:2,2:\"CAN_CACHE\",CAN_STRINGIFY:3,3:\"CAN_STRINGIFY\"},$t={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0},source:\"\"};function mv(e,t=\"\"){return{type:0,source:t,children:e,helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:[],temps:0,codegenNode:void 0,loc:$t}}function ds(e,t,n,r,i,s,o,a=!1,l=!1,c=!1,u=$t){return e&&(a?(e.helper(oi),e.helper(Li(e.inSSR,c))):e.helper(Pi(e.inSSR,c)),o&&e.helper(rc)),{type:13,tag:t,props:n,children:r,patchFlag:i,dynamicProps:s,directives:o,isBlock:a,disableTracking:l,isComponent:c,loc:u}}function ii(e,t=$t){return{type:17,loc:t,elements:e}}function Un(e,t=$t){return{type:15,loc:t,properties:e}}function Ct(e,t){return{type:16,loc:$t,key:ke(e)?Be(e,!0):e,value:t}}function Be(e,t=!1,n=$t,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function UT(e,t){return{type:5,loc:t,content:ke(e)?Be(e,!1,t):e}}function Xn(e,t=$t){return{type:8,loc:t,children:e}}function kt(e,t=[],n=$t){return{type:14,loc:n,callee:e,arguments:t}}function Ri(e,t=void 0,n=!1,r=!1,i=$t){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:i}}function fl(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:$t}}function gv(e,t,n=!1,r=!1){return{type:20,index:e,value:t,needPauseTracking:n,inVOnce:r,needArraySpread:!1,loc:$t}}function vv(e){return{type:21,body:e,loc:$t}}function $T(e){return{type:22,elements:e,loc:$t}}function WT(e,t,n){return{type:23,test:e,consequent:t,alternate:n,loc:$t}}function YT(e,t){return{type:24,left:e,right:t,loc:$t}}function zT(e){return{type:25,expressions:e,loc:$t}}function KT(e){return{type:26,returns:e,loc:$t}}function Pi(e,t){return e||t?Jl:Zl}function Li(e,t){return e||t?Uf:$f}function uc(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(Pi(r,e.isComponent)),t(oi),t(Li(r,e.isComponent)))}const vh=new Uint8Array([123,123]),yh=new Uint8Array([125,125]);function Eh(e){return e>=97&&e<=122||e>=65&&e<=90}function Hn(e){return e===32||e===10||e===9||e===12||e===13}function Wr(e){return e===47||e===62||Hn(e)}function dl(e){const t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t}const en={Cdata:new Uint8Array([67,68,65,84,65,91]),CdataEnd:new Uint8Array([93,93,62]),CommentEnd:new Uint8Array([45,45,62]),ScriptEnd:new Uint8Array([60,47,115,99,114,105,112,116]),StyleEnd:new Uint8Array([60,47,115,116,121,108,101]),TitleEnd:new Uint8Array([60,47,116,105,116,108,101]),TextareaEnd:new Uint8Array([60,47,116,101,120,116,97,114,101,97])};class GT{constructor(t,n){this.stack=t,this.cbs=n,this.state=1,this.buffer=\"\",this.sectionStart=0,this.index=0,this.entityStart=0,this.baseState=1,this.inRCDATA=!1,this.inXML=!1,this.inVPre=!1,this.newlines=[],this.mode=0,this.delimiterOpen=vh,this.delimiterClose=yh,this.delimiterIndex=-1,this.currentSequence=void 0,this.sequenceIndex=0}get inSFCRoot(){return this.mode===2&&this.stack.length===0}reset(){this.state=1,this.mode=0,this.buffer=\"\",this.sectionStart=0,this.index=0,this.baseState=1,this.inRCDATA=!1,this.currentSequence=void 0,this.newlines.length=0,this.delimiterOpen=vh,this.delimiterClose=yh}getPos(t){let n=1,r=t+1;for(let i=this.newlines.length-1;i>=0;i--){const s=this.newlines[i];if(t>s){n=i+2,r=t-s;break}}return{column:r,line:n,offset:t}}peek(){return this.buffer.charCodeAt(this.index+1)}stateText(t){t===60?(this.index>this.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=5,this.sectionStart=this.index):!this.inVPre&&t===this.delimiterOpen[0]&&(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(t))}stateInterpolationOpen(t){if(t===this.delimiterOpen[this.delimiterIndex])if(this.delimiterIndex===this.delimiterOpen.length-1){const n=this.index+1-this.delimiterOpen.length;n>this.sectionStart&&this.cbs.ontext(this.sectionStart,n),this.state=3,this.sectionStart=n}else this.delimiterIndex++;else this.inRCDATA?(this.state=32,this.stateInRCDATA(t)):(this.state=1,this.stateText(t))}stateInterpolation(t){t===this.delimiterClose[0]&&(this.state=4,this.delimiterIndex=0,this.stateInterpolationClose(t))}stateInterpolationClose(t){t===this.delimiterClose[this.delimiterIndex]?this.delimiterIndex===this.delimiterClose.length-1?(this.cbs.oninterpolation(this.sectionStart,this.index+1),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):this.delimiterIndex++:(this.state=3,this.stateInterpolation(t))}stateSpecialStartSequence(t){const n=this.sequenceIndex===this.currentSequence.length;if(!(n?Wr(t):(t|32)===this.currentSequence[this.sequenceIndex]))this.inRCDATA=!1;else if(!n){this.sequenceIndex++;return}this.sequenceIndex=0,this.state=6,this.stateInTagName(t)}stateInRCDATA(t){if(this.sequenceIndex===this.currentSequence.length){if(t===62||Hn(t)){const n=this.index-this.currentSequence.length;if(this.sectionStart<n){const r=this.index;this.index=n,this.cbs.ontext(this.sectionStart,n),this.index=r}this.sectionStart=n+2,this.stateInClosingTagName(t),this.inRCDATA=!1;return}this.sequenceIndex=0}(t|32)===this.currentSequence[this.sequenceIndex]?this.sequenceIndex+=1:this.sequenceIndex===0?this.currentSequence===en.TitleEnd||this.currentSequence===en.TextareaEnd&&!this.inSFCRoot?!this.inVPre&&t===this.delimiterOpen[0]&&(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(t)):this.fastForwardTo(60)&&(this.sequenceIndex=1):this.sequenceIndex=+(t===60)}stateCDATASequence(t){t===en.Cdata[this.sequenceIndex]?++this.sequenceIndex===en.Cdata.length&&(this.state=28,this.currentSequence=en.CdataEnd,this.sequenceIndex=0,this.sectionStart=this.index+1):(this.sequenceIndex=0,this.state=23,this.stateInDeclaration(t))}fastForwardTo(t){for(;++this.index<this.buffer.length;){const n=this.buffer.charCodeAt(this.index);if(n===10&&this.newlines.push(this.index),n===t)return!0}return this.index=this.buffer.length-1,!1}stateInCommentLike(t){t===this.currentSequence[this.sequenceIndex]?++this.sequenceIndex===this.currentSequence.length&&(this.currentSequence===en.CdataEnd?this.cbs.oncdata(this.sectionStart,this.index-2):this.cbs.oncomment(this.sectionStart,this.index-2),this.sequenceIndex=0,this.sectionStart=this.index+1,this.state=1):this.sequenceIndex===0?this.fastForwardTo(this.currentSequence[0])&&(this.sequenceIndex=1):t!==this.currentSequence[this.sequenceIndex-1]&&(this.sequenceIndex=0)}startSpecial(t,n){this.enterRCDATA(t,n),this.state=31}enterRCDATA(t,n){this.inRCDATA=!0,this.currentSequence=t,this.sequenceIndex=n}stateBeforeTagName(t){t===33?(this.state=22,this.sectionStart=this.index+1):t===63?(this.state=24,this.sectionStart=this.index+1):Eh(t)?(this.sectionStart=this.index,this.mode===0?this.state=6:this.inSFCRoot?this.state=34:this.inXML?this.state=6:t===116?this.state=30:this.state=t===115?29:6):t===47?this.state=8:(this.state=1,this.stateText(t))}stateInTagName(t){Wr(t)&&this.handleTagName(t)}stateInSFCRootTagName(t){if(Wr(t)){const n=this.buffer.slice(this.sectionStart,this.index);n!==\"template\"&&this.enterRCDATA(dl(\"</\"+n),0),this.handleTagName(t)}}handleTagName(t){this.cbs.onopentagname(this.sectionStart,this.index),this.sectionStart=-1,this.state=11,this.stateBeforeAttrName(t)}stateBeforeClosingTagName(t){Hn(t)||(t===62?(this.state=1,this.sectionStart=this.index+1):(this.state=Eh(t)?9:27,this.sectionStart=this.index))}stateInClosingTagName(t){(t===62||Hn(t))&&(this.cbs.onclosetag(this.sectionStart,this.index),this.sectionStart=-1,this.state=10,this.stateAfterClosingTagName(t))}stateAfterClosingTagName(t){t===62&&(this.state=1,this.sectionStart=this.index+1)}stateBeforeAttrName(t){t===62?(this.cbs.onopentagend(this.index),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):t===47?this.state=7:t===60&&this.peek()===47?(this.cbs.onopentagend(this.index),this.state=5,this.sectionStart=this.index):Hn(t)||this.handleAttrStart(t)}handleAttrStart(t){t===118&&this.peek()===45?(this.state=13,this.sectionStart=this.index):t===46||t===58||t===64||t===35?(this.cbs.ondirname(this.index,this.index+1),this.state=14,this.sectionStart=this.index+1):(this.state=12,this.sectionStart=this.index)}stateInSelfClosingTag(t){t===62?(this.cbs.onselfclosingtag(this.index),this.state=1,this.sectionStart=this.index+1,this.inRCDATA=!1):Hn(t)||(this.state=11,this.stateBeforeAttrName(t))}stateInAttrName(t){(t===61||Wr(t))&&(this.cbs.onattribname(this.sectionStart,this.index),this.handleAttrNameEnd(t))}stateInDirName(t){t===61||Wr(t)?(this.cbs.ondirname(this.sectionStart,this.index),this.handleAttrNameEnd(t)):t===58?(this.cbs.ondirname(this.sectionStart,this.index),this.state=14,this.sectionStart=this.index+1):t===46&&(this.cbs.ondirname(this.sectionStart,this.index),this.state=16,this.sectionStart=this.index+1)}stateInDirArg(t){t===61||Wr(t)?(this.cbs.ondirarg(this.sectionStart,this.index),this.handleAttrNameEnd(t)):t===91?this.state=15:t===46&&(this.cbs.ondirarg(this.sectionStart,this.index),this.state=16,this.sectionStart=this.index+1)}stateInDynamicDirArg(t){t===93?this.state=14:(t===61||Wr(t))&&(this.cbs.ondirarg(this.sectionStart,this.index+1),this.handleAttrNameEnd(t))}stateInDirModifier(t){t===61||Wr(t)?(this.cbs.ondirmodifier(this.sectionStart,this.index),this.handleAttrNameEnd(t)):t===46&&(this.cbs.ondirmodifier(this.sectionStart,this.index),this.sectionStart=this.index+1)}handleAttrNameEnd(t){this.sectionStart=this.index,this.state=17,this.cbs.onattribnameend(this.index),this.stateAfterAttrName(t)}stateAfterAttrName(t){t===61?this.state=18:t===47||t===62?(this.cbs.onattribend(0,this.sectionStart),this.sectionStart=-1,this.state=11,this.stateBeforeAttrName(t)):Hn(t)||(this.cbs.onattribend(0,this.sectionStart),this.handleAttrStart(t))}stateBeforeAttrValue(t){t===34?(this.state=19,this.sectionStart=this.index+1):t===39?(this.state=20,this.sectionStart=this.index+1):Hn(t)||(this.sectionStart=this.index,this.state=21,this.stateInAttrValueNoQuotes(t))}handleInAttrValue(t,n){(t===n||this.fastForwardTo(n))&&(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=-1,this.cbs.onattribend(n===34?3:2,this.index+1),this.state=11)}stateInAttrValueDoubleQuotes(t){this.handleInAttrValue(t,34)}stateInAttrValueSingleQuotes(t){this.handleInAttrValue(t,39)}stateInAttrValueNoQuotes(t){Hn(t)||t===62?(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=-1,this.cbs.onattribend(1,this.index),this.state=11,this.stateBeforeAttrName(t)):(t===39||t===60||t===61||t===96)&&this.cbs.onerr(18,this.index)}stateBeforeDeclaration(t){t===91?(this.state=26,this.sequenceIndex=0):this.state=t===45?25:23}stateInDeclaration(t){(t===62||this.fastForwardTo(62))&&(this.state=1,this.sectionStart=this.index+1)}stateInProcessingInstruction(t){(t===62||this.fastForwardTo(62))&&(this.cbs.onprocessinginstruction(this.sectionStart,this.index),this.state=1,this.sectionStart=this.index+1)}stateBeforeComment(t){t===45?(this.state=28,this.currentSequence=en.CommentEnd,this.sequenceIndex=2,this.sectionStart=this.index+1):this.state=23}stateInSpecialComment(t){(t===62||this.fastForwardTo(62))&&(this.cbs.oncomment(this.sectionStart,this.index),this.state=1,this.sectionStart=this.index+1)}stateBeforeSpecialS(t){t===en.ScriptEnd[3]?this.startSpecial(en.ScriptEnd,4):t===en.StyleEnd[3]?this.startSpecial(en.StyleEnd,4):(this.state=6,this.stateInTagName(t))}stateBeforeSpecialT(t){t===en.TitleEnd[3]?this.startSpecial(en.TitleEnd,4):t===en.TextareaEnd[3]?this.startSpecial(en.TextareaEnd,4):(this.state=6,this.stateInTagName(t))}startEntity(){}stateInEntity(){}parse(t){for(this.buffer=t;this.index<this.buffer.length;){const n=this.buffer.charCodeAt(this.index);switch(n===10&&this.newlines.push(this.index),this.state){case 1:{this.stateText(n);break}case 2:{this.stateInterpolationOpen(n);break}case 3:{this.stateInterpolation(n);break}case 4:{this.stateInterpolationClose(n);break}case 31:{this.stateSpecialStartSequence(n);break}case 32:{this.stateInRCDATA(n);break}case 26:{this.stateCDATASequence(n);break}case 19:{this.stateInAttrValueDoubleQuotes(n);break}case 12:{this.stateInAttrName(n);break}case 13:{this.stateInDirName(n);break}case 14:{this.stateInDirArg(n);break}case 15:{this.stateInDynamicDirArg(n);break}case 16:{this.stateInDirModifier(n);break}case 28:{this.stateInCommentLike(n);break}case 27:{this.stateInSpecialComment(n);break}case 11:{this.stateBeforeAttrName(n);break}case 6:{this.stateInTagName(n);break}case 34:{this.stateInSFCRootTagName(n);break}case 9:{this.stateInClosingTagName(n);break}case 5:{this.stateBeforeTagName(n);break}case 17:{this.stateAfterAttrName(n);break}case 20:{this.stateInAttrValueSingleQuotes(n);break}case 18:{this.stateBeforeAttrValue(n);break}case 8:{this.stateBeforeClosingTagName(n);break}case 10:{this.stateAfterClosingTagName(n);break}case 29:{this.stateBeforeSpecialS(n);break}case 30:{this.stateBeforeSpecialT(n);break}case 21:{this.stateInAttrValueNoQuotes(n);break}case 7:{this.stateInSelfClosingTag(n);break}case 23:{this.stateInDeclaration(n);break}case 22:{this.stateBeforeDeclaration(n);break}case 25:{this.stateBeforeComment(n);break}case 24:{this.stateInProcessingInstruction(n);break}case 33:{this.stateInEntity();break}}this.index++}this.cleanup(),this.finish()}cleanup(){this.sectionStart!==this.index&&(this.state===1||this.state===32&&this.sequenceIndex===0?(this.cbs.ontext(this.sectionStart,this.index),this.sectionStart=this.index):(this.state===19||this.state===20||this.state===21)&&(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=this.index))}finish(){this.handleTrailingData(),this.cbs.onend()}handleTrailingData(){const t=this.buffer.length;this.sectionStart>=t||(this.state===28?this.currentSequence===en.CdataEnd?this.cbs.oncdata(this.sectionStart,t):this.cbs.oncomment(this.sectionStart,t):this.state===6||this.state===11||this.state===18||this.state===17||this.state===12||this.state===13||this.state===14||this.state===15||this.state===16||this.state===20||this.state===19||this.state===21||this.state===9||this.cbs.ontext(this.sectionStart,t))}emitCodePoint(t,n){}}const XT={COMPILER_IS_ON_ELEMENT:\"COMPILER_IS_ON_ELEMENT\",COMPILER_V_BIND_SYNC:\"COMPILER_V_BIND_SYNC\",COMPILER_V_BIND_OBJECT_ORDER:\"COMPILER_V_BIND_OBJECT_ORDER\",COMPILER_V_ON_NATIVE:\"COMPILER_V_ON_NATIVE\",COMPILER_V_IF_V_FOR_PRECEDENCE:\"COMPILER_V_IF_V_FOR_PRECEDENCE\",COMPILER_NATIVE_TEMPLATE:\"COMPILER_NATIVE_TEMPLATE\",COMPILER_INLINE_TEMPLATE:\"COMPILER_INLINE_TEMPLATE\",COMPILER_FILTERS:\"COMPILER_FILTERS\"},JT={COMPILER_IS_ON_ELEMENT:{message:'Platform-native elements with \"is\" prop will no longer be treated as components in Vue 3 unless the \"is\" value is explicitly prefixed with \"vue:\".',link:\"https://v3-migration.vuejs.org/breaking-changes/custom-elements-interop.html\"},COMPILER_V_BIND_SYNC:{message:e=>`.sync modifier for v-bind has been removed. Use v-model with argument instead. \\`v-bind:${e}.sync\\` should be changed to \\`v-model:${e}\\`.`,link:\"https://v3-migration.vuejs.org/breaking-changes/v-model.html\"},COMPILER_V_BIND_OBJECT_ORDER:{message:'v-bind=\"obj\" usage is now order sensitive and behaves like JavaScript object spread: it will now overwrite an existing non-mergeable attribute that appears before v-bind in the case of conflict. To retain 2.x behavior, move v-bind to make it the first attribute. You can also suppress this warning if the usage is intended.',link:\"https://v3-migration.vuejs.org/breaking-changes/v-bind.html\"},COMPILER_V_ON_NATIVE:{message:\".native modifier for v-on has been removed as is no longer necessary.\",link:\"https://v3-migration.vuejs.org/breaking-changes/v-on-native-modifier-removed.html\"},COMPILER_V_IF_V_FOR_PRECEDENCE:{message:\"v-if / v-for precedence when used on the same element has changed in Vue 3: v-if now takes higher precedence and will no longer have access to v-for scope variables. It is best to avoid the ambiguity with <template> tags or use a computed property that filters v-for data source.\",link:\"https://v3-migration.vuejs.org/breaking-changes/v-if-v-for.html\"},COMPILER_NATIVE_TEMPLATE:{message:\"<template> with no special directives will render as a native template element instead of its inner content in Vue 3.\"},COMPILER_INLINE_TEMPLATE:{message:'\"inline-template\" has been removed in Vue 3.',link:\"https://v3-migration.vuejs.org/breaking-changes/inline-template-attribute.html\"},COMPILER_FILTERS:{message:'filters have been removed in Vue 3. The \"|\" symbol will be treated as native JavaScript bitwise OR operator. Use method calls or computed properties instead.',link:\"https://v3-migration.vuejs.org/breaking-changes/filters.html\"}};function Lu(e,{compatConfig:t}){const n=t&&t[e];return e===\"MODE\"?n||3:n}function Ai(e,t){const n=Lu(\"MODE\",t),r=Lu(e,t);return n===3?r===!0:r!==!1}function hs(e,t,n,...r){return Ai(e,t)}function ZT(e,t,n,...r){if(Lu(e,t)===\"suppress-warning\")return;const{message:s,link:o}=JT[e],a=`(deprecation ${e}) ${typeof s==\"function\"?s(...r):s}${o?`\n  Details: ${o}`:\"\"}`,l=new SyntaxError(a);l.code=e,n&&(l.loc=n),t.onWarn(l)}function Gf(e){throw e}function yv(e){}function vt(e,t,n,r){const i=`https://vuejs.org/error-reference/#compiler-${e}`,s=new SyntaxError(String(i));return s.code=e,s.loc=t,s}const QT={ABRUPT_CLOSING_OF_EMPTY_COMMENT:0,0:\"ABRUPT_CLOSING_OF_EMPTY_COMMENT\",CDATA_IN_HTML_CONTENT:1,1:\"CDATA_IN_HTML_CONTENT\",DUPLICATE_ATTRIBUTE:2,2:\"DUPLICATE_ATTRIBUTE\",END_TAG_WITH_ATTRIBUTES:3,3:\"END_TAG_WITH_ATTRIBUTES\",END_TAG_WITH_TRAILING_SOLIDUS:4,4:\"END_TAG_WITH_TRAILING_SOLIDUS\",EOF_BEFORE_TAG_NAME:5,5:\"EOF_BEFORE_TAG_NAME\",EOF_IN_CDATA:6,6:\"EOF_IN_CDATA\",EOF_IN_COMMENT:7,7:\"EOF_IN_COMMENT\",EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT:8,8:\"EOF_IN_SCRIPT_HTML_COMMENT_LIKE_TEXT\",EOF_IN_TAG:9,9:\"EOF_IN_TAG\",INCORRECTLY_CLOSED_COMMENT:10,10:\"INCORRECTLY_CLOSED_COMMENT\",INCORRECTLY_OPENED_COMMENT:11,11:\"INCORRECTLY_OPENED_COMMENT\",INVALID_FIRST_CHARACTER_OF_TAG_NAME:12,12:\"INVALID_FIRST_CHARACTER_OF_TAG_NAME\",MISSING_ATTRIBUTE_VALUE:13,13:\"MISSING_ATTRIBUTE_VALUE\",MISSING_END_TAG_NAME:14,14:\"MISSING_END_TAG_NAME\",MISSING_WHITESPACE_BETWEEN_ATTRIBUTES:15,15:\"MISSING_WHITESPACE_BETWEEN_ATTRIBUTES\",NESTED_COMMENT:16,16:\"NESTED_COMMENT\",UNEXPECTED_CHARACTER_IN_ATTRIBUTE_NAME:17,17:\"UNEXPECTED_CHARACTER_IN_ATTRIBUTE_NAME\",UNEXPECTED_CHARACTER_IN_UNQUOTED_ATTRIBUTE_VALUE:18,18:\"UNEXPECTED_CHARACTER_IN_UNQUOTED_ATTRIBUTE_VALUE\",UNEXPECTED_EQUALS_SIGN_BEFORE_ATTRIBUTE_NAME:19,19:\"UNEXPECTED_EQUALS_SIGN_BEFORE_ATTRIBUTE_NAME\",UNEXPECTED_NULL_CHARACTER:20,20:\"UNEXPECTED_NULL_CHARACTER\",UNEXPECTED_QUESTION_MARK_INSTEAD_OF_TAG_NAME:21,21:\"UNEXPECTED_QUESTION_MARK_INSTEAD_OF_TAG_NAME\",UNEXPECTED_SOLIDUS_IN_TAG:22,22:\"UNEXPECTED_SOLIDUS_IN_TAG\",X_INVALID_END_TAG:23,23:\"X_INVALID_END_TAG\",X_MISSING_END_TAG:24,24:\"X_MISSING_END_TAG\",X_MISSING_INTERPOLATION_END:25,25:\"X_MISSING_INTERPOLATION_END\",X_MISSING_DIRECTIVE_NAME:26,26:\"X_MISSING_DIRECTIVE_NAME\",X_MISSING_DYNAMIC_DIRECTIVE_ARGUMENT_END:27,27:\"X_MISSING_DYNAMIC_DIRECTIVE_ARGUMENT_END\",X_V_IF_NO_EXPRESSION:28,28:\"X_V_IF_NO_EXPRESSION\",X_V_IF_SAME_KEY:29,29:\"X_V_IF_SAME_KEY\",X_V_ELSE_NO_ADJACENT_IF:30,30:\"X_V_ELSE_NO_ADJACENT_IF\",X_V_FOR_NO_EXPRESSION:31,31:\"X_V_FOR_NO_EXPRESSION\",X_V_FOR_MALFORMED_EXPRESSION:32,32:\"X_V_FOR_MALFORMED_EXPRESSION\",X_V_FOR_TEMPLATE_KEY_PLACEMENT:33,33:\"X_V_FOR_TEMPLATE_KEY_PLACEMENT\",X_V_BIND_NO_EXPRESSION:34,34:\"X_V_BIND_NO_EXPRESSION\",X_V_ON_NO_EXPRESSION:35,35:\"X_V_ON_NO_EXPRESSION\",X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET:36,36:\"X_V_SLOT_UNEXPECTED_DIRECTIVE_ON_SLOT_OUTLET\",X_V_SLOT_MIXED_SLOT_USAGE:37,37:\"X_V_SLOT_MIXED_SLOT_USAGE\",X_V_SLOT_DUPLICATE_SLOT_NAMES:38,38:\"X_V_SLOT_DUPLICATE_SLOT_NAMES\",X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN:39,39:\"X_V_SLOT_EXTRANEOUS_DEFAULT_SLOT_CHILDREN\",X_V_SLOT_MISPLACED:40,40:\"X_V_SLOT_MISPLACED\",X_V_MODEL_NO_EXPRESSION:41,41:\"X_V_MODEL_NO_EXPRESSION\",X_V_MODEL_MALFORMED_EXPRESSION:42,42:\"X_V_MODEL_MALFORMED_EXPRESSION\",X_V_MODEL_ON_SCOPE_VARIABLE:43,43:\"X_V_MODEL_ON_SCOPE_VARIABLE\",X_V_MODEL_ON_PROPS:44,44:\"X_V_MODEL_ON_PROPS\",X_INVALID_EXPRESSION:45,45:\"X_INVALID_EXPRESSION\",X_KEEP_ALIVE_INVALID_CHILDREN:46,46:\"X_KEEP_ALIVE_INVALID_CHILDREN\",X_PREFIX_ID_NOT_SUPPORTED:47,47:\"X_PREFIX_ID_NOT_SUPPORTED\",X_MODULE_MODE_NOT_SUPPORTED:48,48:\"X_MODULE_MODE_NOT_SUPPORTED\",X_CACHE_HANDLER_NOT_SUPPORTED:49,49:\"X_CACHE_HANDLER_NOT_SUPPORTED\",X_SCOPE_ID_NOT_SUPPORTED:50,50:\"X_SCOPE_ID_NOT_SUPPORTED\",X_VNODE_HOOKS:51,51:\"X_VNODE_HOOKS\",X_V_BIND_INVALID_SAME_NAME_ARGUMENT:52,52:\"X_V_BIND_INVALID_SAME_NAME_ARGUMENT\",__EXTEND_POINT__:53,53:\"__EXTEND_POINT__\"},qT={0:\"Illegal comment.\",1:\"CDATA section is allowed only in XML context.\",2:\"Duplicate attribute.\",3:\"End tag cannot have attributes.\",4:\"Illegal '/' in tags.\",5:\"Unexpected EOF in tag.\",6:\"Unexpected EOF in CDATA section.\",7:\"Unexpected EOF in comment.\",8:\"Unexpected EOF in script.\",9:\"Unexpected EOF in tag.\",10:\"Incorrectly closed comment.\",11:\"Incorrectly opened comment.\",12:\"Illegal tag name. Use '&lt;' to print '<'.\",13:\"Attribute value was expected.\",14:\"End tag name was expected.\",15:\"Whitespace was expected.\",16:\"Unexpected '<!--' in comment.\",17:`Attribute name cannot contain U+0022 (\"), U+0027 ('), and U+003C (<).`,18:\"Unquoted attribute value cannot contain U+0022 (\\\"), U+0027 ('), U+003C (<), U+003D (=), and U+0060 (`).\",19:\"Attribute name cannot start with '='.\",21:\"'<?' is allowed only in XML context.\",20:\"Unexpected null character.\",22:\"Illegal '/' in tags.\",23:\"Invalid end tag.\",24:\"Element is missing end tag.\",25:\"Interpolation end sign was not found.\",27:\"End bracket for dynamic directive argument was not found. Note that dynamic directive argument cannot contain spaces.\",26:\"Legal directive name was expected.\",28:\"v-if/v-else-if is missing expression.\",29:\"v-if/else branches must use unique keys.\",30:\"v-else/v-else-if has no adjacent v-if or v-else-if.\",31:\"v-for is missing expression.\",32:\"v-for has invalid expression.\",33:\"<template v-for> key should be placed on the <template> tag.\",34:\"v-bind is missing expression.\",52:\"v-bind with same-name shorthand only allows static argument.\",35:\"v-on is missing expression.\",36:\"Unexpected custom directive on <slot> outlet.\",37:\"Mixed v-slot usage on both the component and nested <template>. When there are multiple named slots, all slots should use <template> syntax to avoid scope ambiguity.\",38:\"Duplicate slot names found. \",39:\"Extraneous children found when component already has explicitly named default slot. These children will be ignored.\",40:\"v-slot can only be used on components or <template> tags.\",41:\"v-model is missing expression.\",42:\"v-model value must be a valid JavaScript member expression.\",43:\"v-model cannot be used on v-for or v-slot scope variables because they are not writable.\",44:`v-model cannot be used on a prop, because local prop bindings are not writable.\nUse a v-bind binding combined with a v-on listener that emits update:x event instead.`,45:\"Error parsing JavaScript expression: \",46:\"<KeepAlive> expects exactly one child component.\",51:\"@vnode-* hooks in templates are no longer supported. Use the vue: prefix instead. For example, @vnode-mounted should be changed to @vue:mounted. @vnode-* hooks support has been removed in 3.4.\",47:'\"prefixIdentifiers\" option is not supported in this build of compiler.',48:\"ES module mode is not supported in this build of compiler.\",49:'\"cacheHandlers\" option is only supported when the \"prefixIdentifiers\" option is enabled.',50:'\"scopeId\" option is only supported in module mode.',53:\"\"};function ew(e,t,n=!1,r=[],i=Object.create(null)){}function tw(e,t,n){return!1}function nw(e,t){if(e&&(e.type===\"ObjectProperty\"||e.type===\"ArrayPattern\")){let n=t.length;for(;n--;){const r=t[n];if(r.type===\"AssignmentExpression\")return!0;if(r.type!==\"ObjectProperty\"&&!r.type.endsWith(\"Pattern\"))break}}return!1}function rw(e){let t=e.length;for(;t--;){const n=e[t];if(n.type===\"NewExpression\")return!0;if(n.type!==\"MemberExpression\")break}return!1}function iw(e,t){for(const n of e.params)for(const r of _r(n))t(r)}function sw(e,t){for(const n of e.body)if(n.type===\"VariableDeclaration\"){if(n.declare)continue;for(const r of n.declarations)for(const i of _r(r.id))t(i)}else if(n.type===\"FunctionDeclaration\"||n.type===\"ClassDeclaration\"){if(n.declare||!n.id)continue;t(n.id)}else ow(n)&&aw(n,!0,t)}function ow(e){return e.type===\"ForOfStatement\"||e.type===\"ForInStatement\"||e.type===\"ForStatement\"}function aw(e,t,n){const r=e.type===\"ForStatement\"?e.init:e.left;if(r&&r.type===\"VariableDeclaration\"&&(r.kind===\"var\"&&t))for(const i of r.declarations)for(const s of _r(i.id))n(s)}function _r(e,t=[]){switch(e.type){case\"Identifier\":t.push(e);break;case\"MemberExpression\":let n=e;for(;n.type===\"MemberExpression\";)n=n.object;t.push(n);break;case\"ObjectPattern\":for(const r of e.properties)r.type===\"RestElement\"?_r(r.argument,t):_r(r.value,t);break;case\"ArrayPattern\":e.elements.forEach(r=>{r&&_r(r,t)});break;case\"RestElement\":_r(e.argument,t);break;case\"AssignmentPattern\":_r(e.left,t);break}return t}const lw=e=>/Function(?:Expression|Declaration)$|Method$/.test(e.type),Ev=e=>e&&(e.type===\"ObjectProperty\"||e.type===\"ObjectMethod\")&&!e.computed,cw=(e,t)=>Ev(t)&&t.key===e,bv=[\"TSAsExpression\",\"TSTypeAssertion\",\"TSNonNullExpression\",\"TSInstantiationExpression\",\"TSSatisfiesExpression\"];function Sv(e){return bv.includes(e.type)?Sv(e.expression):e}const En=e=>e.type===4&&e.isStatic;function Xf(e){switch(e){case\"Teleport\":case\"teleport\":return rs;case\"Suspense\":case\"suspense\":return Xl;case\"KeepAlive\":case\"keep-alive\":return So;case\"BaseTransition\":case\"base-transition\":return Hf}}const uw=/^\\d|[^\\$\\w\\xA0-\\uFFFF]/,Vo=e=>!uw.test(e),fw=/[A-Za-z_$\\xA0-\\uFFFF]/,dw=/[\\.\\?\\w$\\xA0-\\uFFFF]/,hw=/\\s+[.[]\\s*|\\s*[.[]\\s+/g,Tv=e=>e.type===4?e.content:e.loc.source,wv=e=>{const t=Tv(e).trim().replace(hw,a=>a.trim());let n=0,r=[],i=0,s=0,o=null;for(let a=0;a<t.length;a++){const l=t.charAt(a);switch(n){case 0:if(l===\"[\")r.push(n),n=1,i++;else if(l===\"(\")r.push(n),n=2,s++;else if(!(a===0?fw:dw).test(l))return!1;break;case 1:l===\"'\"||l==='\"'||l===\"`\"?(r.push(n),n=3,o=l):l===\"[\"?i++:l===\"]\"&&(--i||(n=r.pop()));break;case 2:if(l===\"'\"||l==='\"'||l===\"`\")r.push(n),n=3,o=l;else if(l===\"(\")s++;else if(l===\")\"){if(a===t.length-1)return!1;--s||(n=r.pop())}break;case 3:l===o&&(n=r.pop(),o=null);break}}return!i&&!s},pw=Ft,Jf=wv,mw=/^\\s*(async\\s*)?(\\([^)]*?\\)|[\\w$_]+)\\s*(:[^=]+)?=>|^\\s*(async\\s+)?function(?:\\s+[\\w$]+)?\\s*\\(/,Dv=e=>mw.test(Tv(e)),gw=Ft,Cv=Dv;function vw(e,t,n=t.length){return Ov({offset:e.offset,line:e.line,column:e.column},t,n)}function Ov(e,t,n=t.length){let r=0,i=-1;for(let s=0;s<n;s++)t.charCodeAt(s)===10&&(r++,i=s);return e.offset+=n,e.line+=r,e.column=i===-1?e.column+n:n-i,e}function yw(e,t){if(!e)throw new Error(t||\"unexpected compiler condition\")}function yn(e,t,n=!1){for(let r=0;r<e.props.length;r++){const i=e.props[r];if(i.type===7&&(n||i.exp)&&(ke(t)?i.name===t:t.test(i.name)))return i}}function Bo(e,t,n=!1,r=!1){for(let i=0;i<e.props.length;i++){const s=e.props[i];if(s.type===6){if(n)continue;if(s.name===t&&(s.value||r))return s}else if(s.name===\"bind\"&&(s.exp||r)&&qr(s.arg,t))return s}}function qr(e,t){return!!(e&&En(e)&&e.content===t)}function Av(e){return e.props.some(t=>t.type===7&&t.name===\"bind\"&&(!t.arg||t.arg.type!==4||!t.arg.isStatic))}function xa(e){return e.type===5||e.type===2}function Zf(e){return e.type===7&&e.name===\"slot\"}function ps(e){return e.type===1&&e.tagType===3}function Do(e){return e.type===1&&e.tagType===2}const Ew=new Set([fs,Ss]);function _v(e,t=[]){if(e&&!ke(e)&&e.type===14){const n=e.callee;if(!ke(n)&&Ew.has(n))return _v(e.arguments[0],t.concat(e))}return[e,t]}function Co(e,t,n){let r,i=e.type===13?e.props:e.arguments[2],s=[],o;if(i&&!ke(i)&&i.type===14){const a=_v(i);i=a[0],s=a[1],o=s[s.length-1]}if(i==null||ke(i))r=Un([t]);else if(i.type===14){const a=i.arguments[0];!ke(a)&&a.type===15?bh(t,a)||a.properties.unshift(t):i.callee===ac?r=kt(n.helper(To),[Un([t]),i]):i.arguments.unshift(Un([t])),!r&&(r=i)}else i.type===15?(bh(t,i)||i.properties.unshift(t),r=i):(r=kt(n.helper(To),[Un([t]),i]),o&&o.callee===Ss&&(o=s[s.length-2]));e.type===13?o?o.arguments[0]=r:e.props=r:o?o.arguments[0]=r:e.arguments[2]=r}function bh(e,t){let n=!1;if(e.key.type===4){const r=e.key.content;n=t.properties.some(i=>i.key.type===4&&i.key.content===r)}return n}function ms(e,t){return`_${t}_${e.replace(/[^\\w]/g,(n,r)=>n===\"-\"?\"_\":e.charCodeAt(r).toString())}`}function rr(e,t){if(!e||Object.keys(t).length===0)return!1;switch(e.type){case 1:for(let n=0;n<e.props.length;n++){const r=e.props[n];if(r.type===7&&(rr(r.arg,t)||rr(r.exp,t)))return!0}return e.children.some(n=>rr(n,t));case 11:return rr(e.source,t)?!0:e.children.some(n=>rr(n,t));case 9:return e.branches.some(n=>rr(n,t));case 10:return rr(e.condition,t)?!0:e.children.some(n=>rr(n,t));case 4:return!e.isStatic&&Vo(e.content)&&!!t[e.content];case 8:return e.children.some(n=>ct(n)&&rr(n,t));case 5:case 12:return rr(e.content,t);case 2:case 3:case 20:return!1;default:return!1}}function Mv(e){return e.type===14&&e.callee===cc?e.arguments[1].returns:e}const xv=/([\\s\\S]*?)\\s+(?:in|of)\\s+(\\S[\\s\\S]*)/,Nv={parseMode:\"base\",ns:0,delimiters:[\"{{\",\"}}\"],getNamespace:()=>0,isVoidTag:Zi,isPreTag:Zi,isIgnoreNewlineTag:Zi,isCustomElement:Zi,onError:Gf,onWarn:yv,comments:!1,prefixIdentifiers:!1};let lt=Nv,Oo=null,Nr=\"\",rn=null,nt=null,An=\"\",Sr=-1,pi=-1,Qf=0,Jr=!1,ku=null;const bt=[],xt=new GT(bt,{onerr:br,ontext(e,t){aa(Xt(e,t),e,t)},ontextentity(e,t,n){aa(e,t,n)},oninterpolation(e,t){if(Jr)return aa(Xt(e,t),e,t);let n=e+xt.delimiterOpen.length,r=t-xt.delimiterClose.length;for(;Hn(Nr.charCodeAt(n));)n++;for(;Hn(Nr.charCodeAt(r-1));)r--;let i=Xt(n,r);i.includes(\"&\")&&(i=lt.decodeEntities(i,!1)),Fu({type:5,content:Ia(i,!1,It(n,r)),loc:It(e,t)})},onopentagname(e,t){const n=Xt(e,t);rn={type:1,tag:n,ns:lt.getNamespace(n,bt[0],lt.ns),tagType:0,props:[],children:[],loc:It(e-1,t),codegenNode:void 0}},onopentagend(e){Th(e)},onclosetag(e,t){const n=Xt(e,t);if(!lt.isVoidTag(n)){let r=!1;for(let i=0;i<bt.length;i++)if(bt[i].tag.toLowerCase()===n.toLowerCase()){r=!0,i>0&&br(24,bt[0].loc.start.offset);for(let o=0;o<=i;o++){const a=bt.shift();Na(a,t,o<i)}break}r||br(23,Iv(e,60))}},onselfclosingtag(e){const t=rn.tag;rn.isSelfClosing=!0,Th(e),bt[0]&&bt[0].tag===t&&Na(bt.shift(),e)},onattribname(e,t){nt={type:6,name:Xt(e,t),nameLoc:It(e,t),value:void 0,loc:It(e)}},ondirname(e,t){const n=Xt(e,t),r=n===\".\"||n===\":\"?\"bind\":n===\"@\"?\"on\":n===\"#\"?\"slot\":n.slice(2);if(!Jr&&r===\"\"&&br(26,e),Jr||r===\"\")nt={type:6,name:n,nameLoc:It(e,t),value:void 0,loc:It(e)};else if(nt={type:7,name:r,rawName:n,exp:void 0,arg:void 0,modifiers:n===\".\"?[Be(\"prop\")]:[],loc:It(e)},r===\"pre\"){Jr=xt.inVPre=!0,ku=rn;const i=rn.props;for(let s=0;s<i.length;s++)i[s].type===7&&(i[s]=xw(i[s]))}},ondirarg(e,t){if(e===t)return;const n=Xt(e,t);if(Jr)nt.name+=n,vi(nt.nameLoc,t);else{const r=n[0]!==\"[\";nt.arg=Ia(r?n:n.slice(1,-1),r,It(e,t),r?3:0)}},ondirmodifier(e,t){const n=Xt(e,t);if(Jr)nt.name+=\".\"+n,vi(nt.nameLoc,t);else if(nt.name===\"slot\"){const r=nt.arg;r&&(r.content+=\".\"+n,vi(r.loc,t))}else{const r=Be(n,!0,It(e,t));nt.modifiers.push(r)}},onattribdata(e,t){An+=Xt(e,t),Sr<0&&(Sr=e),pi=t},onattribentity(e,t,n){An+=e,Sr<0&&(Sr=t),pi=n},onattribnameend(e){const t=nt.loc.start.offset,n=Xt(t,e);nt.type===7&&(nt.rawName=n),rn.props.some(r=>(r.type===7?r.rawName:r.name)===n)&&br(2,t)},onattribend(e,t){if(rn&&nt){if(vi(nt.loc,t),e!==0)if(An.includes(\"&\")&&(An=lt.decodeEntities(An,!0)),nt.type===6)nt.name===\"class\"&&(An=Pv(An).trim()),e===1&&!An&&br(13,t),nt.value={type:2,content:An,loc:e===1?It(Sr,pi):It(Sr-1,pi+1)},xt.inSFCRoot&&rn.tag===\"template\"&&nt.name===\"lang\"&&An&&An!==\"html\"&&xt.enterRCDATA(dl(\"</template\"),0);else{let n=0;nt.exp=Ia(An,!1,It(Sr,pi),0,n),nt.name===\"for\"&&(nt.forParseResult=Sw(nt.exp));let r=-1;nt.name===\"bind\"&&(r=nt.modifiers.findIndex(i=>i.content===\"sync\"))>-1&&hs(\"COMPILER_V_BIND_SYNC\",lt,nt.loc,nt.arg.loc.source)&&(nt.name=\"model\",nt.modifiers.splice(r,1))}(nt.type!==7||nt.name!==\"pre\")&&rn.props.push(nt)}An=\"\",Sr=pi=-1},oncomment(e,t){lt.comments&&Fu({type:3,content:Xt(e,t),loc:It(e-4,t+3)})},onend(){const e=Nr.length;for(let t=0;t<bt.length;t++)Na(bt[t],e-1),br(24,bt[t].loc.start.offset)},oncdata(e,t){bt[0].ns!==0?aa(Xt(e,t),e,t):br(1,e-9)},onprocessinginstruction(e){(bt[0]?bt[0].ns:lt.ns)===0&&br(21,e-1)}}),Sh=/,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/,bw=/^\\(|\\)$/g;function Sw(e){const t=e.loc,n=e.content,r=n.match(xv);if(!r)return;const[,i,s]=r,o=(f,d,p=!1)=>{const m=t.start.offset+d,g=m+f.length;return Ia(f,!1,It(m,g),0,p?1:0)},a={source:o(s.trim(),n.indexOf(s,i.length)),value:void 0,key:void 0,index:void 0,finalized:!1};let l=i.trim().replace(bw,\"\").trim();const c=i.indexOf(l),u=l.match(Sh);if(u){l=l.replace(Sh,\"\").trim();const f=u[1].trim();let d;if(f&&(d=n.indexOf(f,c+l.length),a.key=o(f,d,!0)),u[2]){const p=u[2].trim();p&&(a.index=o(p,n.indexOf(p,a.key?d+f.length:c+l.length),!0))}}return l&&(a.value=o(l,c,!0)),a}function Xt(e,t){return Nr.slice(e,t)}function Th(e){xt.inSFCRoot&&(rn.innerLoc=It(e+1,e+1)),Fu(rn);const{tag:t,ns:n}=rn;n===0&&lt.isPreTag(t)&&Qf++,lt.isVoidTag(t)?Na(rn,e):(bt.unshift(rn),(n===1||n===2)&&(xt.inXML=!0)),rn=null}function aa(e,t,n){{const s=bt[0]&&bt[0].tag;s!==\"script\"&&s!==\"style\"&&e.includes(\"&\")&&(e=lt.decodeEntities(e,!1))}const r=bt[0]||Oo,i=r.children[r.children.length-1];i&&i.type===2?(i.content+=e,vi(i.loc,n)):r.children.push({type:2,content:e,loc:It(t,n)})}function Na(e,t,n=!1){n?vi(e.loc,Iv(t,60)):vi(e.loc,Tw(t,62)+1),xt.inSFCRoot&&(e.children.length?e.innerLoc.end=Ze({},e.children[e.children.length-1].loc.end):e.innerLoc.end=Ze({},e.innerLoc.start),e.innerLoc.source=Xt(e.innerLoc.start.offset,e.innerLoc.end.offset));const{tag:r,ns:i,children:s}=e;if(Jr||(r===\"slot\"?e.tagType=2:wh(e)?e.tagType=3:Dw(e)&&(e.tagType=1)),xt.inRCDATA||(e.children=Rv(s)),i===0&&lt.isIgnoreNewlineTag(r)){const o=s[0];o&&o.type===2&&(o.content=o.content.replace(/^\\r?\\n/,\"\"))}i===0&&lt.isPreTag(r)&&Qf--,ku===e&&(Jr=xt.inVPre=!1,ku=null),xt.inXML&&(bt[0]?bt[0].ns:lt.ns)===0&&(xt.inXML=!1);{const o=e.props;if(!xt.inSFCRoot&&Ai(\"COMPILER_NATIVE_TEMPLATE\",lt)&&e.tag===\"template\"&&!wh(e)){const l=bt[0]||Oo,c=l.children.indexOf(e);l.children.splice(c,1,...e.children)}const a=o.find(l=>l.type===6&&l.name===\"inline-template\");a&&hs(\"COMPILER_INLINE_TEMPLATE\",lt,a.loc)&&e.children.length&&(a.value={type:2,content:Xt(e.children[0].loc.start.offset,e.children[e.children.length-1].loc.end.offset),loc:a.loc})}}function Tw(e,t){let n=e;for(;Nr.charCodeAt(n)!==t&&n<Nr.length-1;)n++;return n}function Iv(e,t){let n=e;for(;Nr.charCodeAt(n)!==t&&n>=0;)n--;return n}const ww=new Set([\"if\",\"else\",\"else-if\",\"for\",\"slot\"]);function wh({tag:e,props:t}){if(e===\"template\"){for(let n=0;n<t.length;n++)if(t[n].type===7&&ww.has(t[n].name))return!0}return!1}function Dw({tag:e,props:t}){if(lt.isCustomElement(e))return!1;if(e===\"component\"||Cw(e.charCodeAt(0))||Xf(e)||lt.isBuiltInComponent&&lt.isBuiltInComponent(e)||lt.isNativeTag&&!lt.isNativeTag(e))return!0;for(let n=0;n<t.length;n++){const r=t[n];if(r.type===6){if(r.name===\"is\"&&r.value){if(r.value.content.startsWith(\"vue:\"))return!0;if(hs(\"COMPILER_IS_ON_ELEMENT\",lt,r.loc))return!0}}else if(r.name===\"bind\"&&qr(r.arg,\"is\")&&hs(\"COMPILER_IS_ON_ELEMENT\",lt,r.loc))return!0}return!1}function Cw(e){return e>64&&e<91}const Ow=/\\r\\n/g;function Rv(e,t){const n=lt.whitespace!==\"preserve\";let r=!1;for(let i=0;i<e.length;i++){const s=e[i];if(s.type===2)if(Qf)s.content=s.content.replace(Ow,`\n`);else if(Aw(s.content)){const o=e[i-1]&&e[i-1].type,a=e[i+1]&&e[i+1].type;!o||!a||n&&(o===3&&(a===3||a===1)||o===1&&(a===3||a===1&&_w(s.content)))?(r=!0,e[i]=null):s.content=\" \"}else n&&(s.content=Pv(s.content))}return r?e.filter(Boolean):e}function Aw(e){for(let t=0;t<e.length;t++)if(!Hn(e.charCodeAt(t)))return!1;return!0}function _w(e){for(let t=0;t<e.length;t++){const n=e.charCodeAt(t);if(n===10||n===13)return!0}return!1}function Pv(e){let t=\"\",n=!1;for(let r=0;r<e.length;r++)Hn(e.charCodeAt(r))?n||(t+=\" \",n=!0):(t+=e[r],n=!1);return t}function Fu(e){(bt[0]||Oo).children.push(e)}function It(e,t){return{start:xt.getPos(e),end:t==null?t:xt.getPos(t),source:t==null?t:Xt(e,t)}}function Mw(e){return It(e.start.offset,e.end.offset)}function vi(e,t){e.end=xt.getPos(t),e.source=Xt(e.start.offset,t)}function xw(e){const t={type:6,name:e.rawName,nameLoc:It(e.loc.start.offset,e.loc.start.offset+e.rawName.length),value:void 0,loc:e.loc};if(e.exp){const n=e.exp.loc;n.end.offset<e.loc.end.offset&&(n.start.offset--,n.start.column--,n.end.offset++,n.end.column++),t.value={type:2,content:e.exp.content,loc:n}}return t}function Ia(e,t=!1,n,r=0,i=0){return Be(e,t,n,r)}function br(e,t,n){lt.onError(vt(e,It(t,t)))}function Nw(){xt.reset(),rn=null,nt=null,An=\"\",Sr=-1,pi=-1,bt.length=0}function qf(e,t){if(Nw(),Nr=e,lt=Ze({},Nv),t){let i;for(i in t)t[i]!=null&&(lt[i]=t[i])}xt.mode=lt.parseMode===\"html\"?1:lt.parseMode===\"sfc\"?2:0,xt.inXML=lt.ns===1||lt.ns===2;const n=t&&t.delimiters;n&&(xt.delimiterOpen=dl(n[0]),xt.delimiterClose=dl(n[1]));const r=Oo=mv([],e);return xt.parse(Nr),r.loc=It(0,e.length),r.children=Rv(r.children),Oo=null,r}function Iw(e,t){Ra(e,void 0,t,Lv(e,e.children[0]))}function Lv(e,t){const{children:n}=e;return n.length===1&&t.type===1&&!Do(t)}function Ra(e,t,n,r=!1,i=!1){const{children:s}=e,o=[];for(let f=0;f<s.length;f++){const d=s[f];if(d.type===1&&d.tagType===0){const p=r?0:In(d,n);if(p>0){if(p>=2){d.codegenNode.patchFlag=-1,o.push(d);continue}}else{const m=d.codegenNode;if(m.type===13){const g=m.patchFlag;if((g===void 0||g===512||g===1)&&Fv(d,n)>=2){const v=Vv(d);v&&(m.props=n.hoist(v))}m.dynamicProps&&(m.dynamicProps=n.hoist(m.dynamicProps))}}}else if(d.type===12&&(r?0:In(d,n))>=2){o.push(d);continue}if(d.type===1){const p=d.tagType===1;p&&n.scopes.vSlot++,Ra(d,e,n,!1,i),p&&n.scopes.vSlot--}else if(d.type===11)Ra(d,e,n,d.children.length===1,!0);else if(d.type===9)for(let p=0;p<d.branches.length;p++)Ra(d.branches[p],e,n,d.branches[p].children.length===1,i)}let a=!1;const l=[];if(o.length===s.length&&e.type===1){if(e.tagType===0&&e.codegenNode&&e.codegenNode.type===13&&ye(e.codegenNode.children))e.codegenNode.children=c(ii(e.codegenNode.children)),a=!0;else if(e.tagType===1&&e.codegenNode&&e.codegenNode.type===13&&e.codegenNode.children&&!ye(e.codegenNode.children)&&e.codegenNode.children.type===15){const f=u(e.codegenNode,\"default\");f&&(l.push(n.cached.length),f.returns=c(ii(f.returns)),a=!0)}else if(e.tagType===3&&t&&t.type===1&&t.tagType===1&&t.codegenNode&&t.codegenNode.type===13&&t.codegenNode.children&&!ye(t.codegenNode.children)&&t.codegenNode.children.type===15){const f=yn(e,\"slot\",!0),d=f&&f.arg&&u(t.codegenNode,f.arg);d&&(l.push(n.cached.length),d.returns=c(ii(d.returns)),a=!0)}}if(!a)for(const f of o)l.push(n.cached.length),f.codegenNode=n.cache(f.codegenNode);l.length&&e.type===1&&e.tagType===1&&e.codegenNode&&e.codegenNode.type===13&&e.codegenNode.children&&!ye(e.codegenNode.children)&&e.codegenNode.children.type===15&&e.codegenNode.children.properties.push(Ct(\"__\",Be(JSON.stringify(l),!1)));function c(f){const d=n.cache(f);return i&&n.hmr&&(d.needArraySpread=!0),d}function u(f,d){if(f.children&&!ye(f.children)&&f.children.type===15){const p=f.children.properties.find(m=>m.key===d||m.key.content===d);return p&&p.value}}o.length&&n.transformHoist&&n.transformHoist(s,n,e)}function In(e,t){const{constantCache:n}=t;switch(e.type){case 1:if(e.tagType!==0)return 0;const r=n.get(e);if(r!==void 0)return r;const i=e.codegenNode;if(i.type!==13||i.isBlock&&e.tag!==\"svg\"&&e.tag!==\"foreignObject\"&&e.tag!==\"math\")return 0;if(i.patchFlag===void 0){let o=3;const a=Fv(e,t);if(a===0)return n.set(e,0),0;a<o&&(o=a);for(let l=0;l<e.children.length;l++){const c=In(e.children[l],t);if(c===0)return n.set(e,0),0;c<o&&(o=c)}if(o>1)for(let l=0;l<e.props.length;l++){const c=e.props[l];if(c.type===7&&c.name===\"bind\"&&c.exp){const u=In(c.exp,t);if(u===0)return n.set(e,0),0;u<o&&(o=u)}}if(i.isBlock){for(let l=0;l<e.props.length;l++)if(e.props[l].type===7)return n.set(e,0),0;t.removeHelper(oi),t.removeHelper(Li(t.inSSR,i.isComponent)),i.isBlock=!1,t.helper(Pi(t.inSSR,i.isComponent))}return n.set(e,o),o}else return n.set(e,0),0;case 2:case 3:return 3;case 9:case 11:case 10:return 0;case 5:case 12:return In(e.content,t);case 4:return e.constType;case 8:let s=3;for(let o=0;o<e.children.length;o++){const a=e.children[o];if(ke(a)||Sn(a))continue;const l=In(a,t);if(l===0)return 0;l<s&&(s=l)}return s;case 20:return 2;default:return 0}}const Rw=new Set([sc,oc,fs,Ss]);function kv(e,t){if(e.type===14&&!ke(e.callee)&&Rw.has(e.callee)){const n=e.arguments[0];if(n.type===4)return In(n,t);if(n.type===14)return kv(n,t)}return 0}function Fv(e,t){let n=3;const r=Vv(e);if(r&&r.type===15){const{properties:i}=r;for(let s=0;s<i.length;s++){const{key:o,value:a}=i[s],l=In(o,t);if(l===0)return l;l<n&&(n=l);let c;if(a.type===4?c=In(a,t):a.type===14?c=kv(a,t):c=0,c===0)return c;c<n&&(n=c)}}return n}function Vv(e){const t=e.codegenNode;if(t.type===13)return t.props}function Bv(e,{filename:t=\"\",prefixIdentifiers:n=!1,hoistStatic:r=!1,hmr:i=!1,cacheHandlers:s=!1,nodeTransforms:o=[],directiveTransforms:a={},transformHoist:l=null,isBuiltInComponent:c=Ft,isCustomElement:u=Ft,expressionPlugins:f=[],scopeId:d=null,slotted:p=!0,ssr:m=!1,inSSR:g=!1,ssrCssVars:v=\"\",bindingMetadata:w=et,inline:S=!1,isTS:y=!1,onError:E=Gf,onWarn:C=yv,compatConfig:M}){const B=t.replace(/\\?.*$/,\"\").match(/([^/\\\\]+)\\.\\w+$/),j={filename:t,selfName:B&&ci(gt(B[1])),prefixIdentifiers:n,hoistStatic:r,hmr:i,cacheHandlers:s,nodeTransforms:o,directiveTransforms:a,transformHoist:l,isBuiltInComponent:c,isCustomElement:u,expressionPlugins:f,scopeId:d,slotted:p,ssr:m,inSSR:g,ssrCssVars:v,bindingMetadata:w,inline:S,isTS:y,onError:E,onWarn:C,compatConfig:M,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],cached:[],constantCache:new WeakMap,temps:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,grandParent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(A){const x=j.helpers.get(A)||0;return j.helpers.set(A,x+1),A},removeHelper(A){const x=j.helpers.get(A);if(x){const k=x-1;k?j.helpers.set(A,k):j.helpers.delete(A)}},helperString(A){return`_${Ii[j.helper(A)]}`},replaceNode(A){j.parent.children[j.childIndex]=j.currentNode=A},removeNode(A){const x=j.parent.children,k=A?x.indexOf(A):j.currentNode?j.childIndex:-1;!A||A===j.currentNode?(j.currentNode=null,j.onNodeRemoved()):j.childIndex>k&&(j.childIndex--,j.onNodeRemoved()),j.parent.children.splice(k,1)},onNodeRemoved:Ft,addIdentifiers(A){},removeIdentifiers(A){},hoist(A){ke(A)&&(A=Be(A)),j.hoists.push(A);const x=Be(`_hoisted_${j.hoists.length}`,!1,A.loc,2);return x.hoisted=A,x},cache(A,x=!1,k=!1){const P=gv(j.cached.length,A,x,k);return j.cached.push(P),P}};return j.filters=new Set,j}function jv(e,t){const n=Bv(e,t);jo(e,n),t.hoistStatic&&Iw(e,n),t.ssr||Pw(e,n),e.helpers=new Set([...n.helpers.keys()]),e.components=[...n.components],e.directives=[...n.directives],e.imports=n.imports,e.hoists=n.hoists,e.temps=n.temps,e.cached=n.cached,e.transformed=!0,e.filters=[...n.filters]}function Pw(e,t){const{helper:n}=t,{children:r}=e;if(r.length===1){const i=r[0];if(Lv(e,i)&&i.codegenNode){const s=i.codegenNode;s.type===13&&uc(s,t),e.codegenNode=s}else e.codegenNode=i}else if(r.length>1){let i=64;e.codegenNode=ds(t,n(us),void 0,e.children,i,void 0,void 0,!0,void 0,!1)}}function Lw(e,t){let n=0;const r=()=>{n--};for(;n<e.children.length;n++){const i=e.children[n];ke(i)||(t.grandParent=t.parent,t.parent=e,t.childIndex=n,t.onNodeRemoved=r,jo(i,t))}}function jo(e,t){t.currentNode=e;const{nodeTransforms:n}=t,r=[];for(let s=0;s<n.length;s++){const o=n[s](e,t);if(o&&(ye(o)?r.push(...o):r.push(o)),t.currentNode)e=t.currentNode;else return}switch(e.type){case 3:t.ssr||t.helper(bs);break;case 5:t.ssr||t.helper(Fo);break;case 9:for(let s=0;s<e.branches.length;s++)jo(e.branches[s],t);break;case 10:case 11:case 1:case 0:Lw(e,t);break}t.currentNode=e;let i=r.length;for(;i--;)r[i]()}function ed(e,t){const n=ke(e)?r=>r===e:r=>e.test(r);return(r,i)=>{if(r.type===1){const{props:s}=r;if(r.tagType===3&&s.some(Zf))return;const o=[];for(let a=0;a<s.length;a++){const l=s[a];if(l.type===7&&n(l.name)){s.splice(a,1),a--;const c=t(r,l,i);c&&o.push(c)}}return o}}}const fc=\"/*@__PURE__*/\",Hv=e=>`${Ii[e]}: _${Ii[e]}`;function kw(e,{mode:t=\"function\",prefixIdentifiers:n=t===\"module\",sourceMap:r=!1,filename:i=\"template.vue.html\",scopeId:s=null,optimizeImports:o=!1,runtimeGlobalName:a=\"Vue\",runtimeModuleName:l=\"vue\",ssrRuntimeModuleName:c=\"vue/server-renderer\",ssr:u=!1,isTS:f=!1,inSSR:d=!1}){const p={mode:t,prefixIdentifiers:n,sourceMap:r,filename:i,scopeId:s,optimizeImports:o,runtimeGlobalName:a,runtimeModuleName:l,ssrRuntimeModuleName:c,ssr:u,isTS:f,inSSR:d,source:e.source,code:\"\",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper(g){return`_${Ii[g]}`},push(g,v=-2,w){p.code+=g},indent(){m(++p.indentLevel)},deindent(g=!1){g?--p.indentLevel:m(--p.indentLevel)},newline(){m(p.indentLevel)}};function m(g){p.push(`\n`+\"  \".repeat(g),0)}return p}function Uv(e,t={}){const n=kw(e,t);t.onContextCreated&&t.onContextCreated(n);const{mode:r,push:i,prefixIdentifiers:s,indent:o,deindent:a,newline:l,scopeId:c,ssr:u}=n,f=Array.from(e.helpers),d=f.length>0,p=!s&&r!==\"module\";Fw(e,n);const g=u?\"ssrRender\":\"render\",w=(u?[\"_ctx\",\"_push\",\"_parent\",\"_attrs\"]:[\"_ctx\",\"_cache\"]).join(\", \");if(i(`function ${g}(${w}) {`),o(),p&&(i(\"with (_ctx) {\"),o(),d&&(i(`const { ${f.map(Hv).join(\", \")} } = _Vue\n`,-1),l())),e.components.length&&(Bc(e.components,\"component\",n),(e.directives.length||e.temps>0)&&l()),e.directives.length&&(Bc(e.directives,\"directive\",n),e.temps>0&&l()),e.filters&&e.filters.length&&(l(),Bc(e.filters,\"filter\",n),l()),e.temps>0){i(\"let \");for(let S=0;S<e.temps;S++)i(`${S>0?\", \":\"\"}_temp${S}`)}return(e.components.length||e.directives.length||e.temps)&&(i(`\n`,0),l()),u||i(\"return \"),e.codegenNode?dn(e.codegenNode,n):i(\"null\"),p&&(a(),i(\"}\")),a(),i(\"}\"),{ast:e,code:n.code,preamble:\"\",map:n.map?n.map.toJSON():void 0}}function Fw(e,t){const{ssr:n,prefixIdentifiers:r,push:i,newline:s,runtimeModuleName:o,runtimeGlobalName:a,ssrRuntimeModuleName:l}=t,c=a,u=Array.from(e.helpers);if(u.length>0&&(i(`const _Vue = ${c}\n`,-1),e.hoists.length)){const f=[Jl,Zl,bs,Ql,Wf].filter(d=>u.includes(d)).map(Hv).join(\", \");i(`const { ${f} } = _Vue\n`,-1)}Vw(e.hoists,t),s(),i(\"return \")}function Bc(e,t,{helper:n,push:r,newline:i,isTS:s}){const o=n(t===\"filter\"?nc:t===\"component\"?ql:tc);for(let a=0;a<e.length;a++){let l=e[a];const c=l.endsWith(\"__self\");c&&(l=l.slice(0,-6)),r(`const ${ms(l,t)} = ${o}(${JSON.stringify(l)}${c?\", true\":\"\"})${s?\"!\":\"\"}`),a<e.length-1&&i()}}function Vw(e,t){if(!e.length)return;t.pure=!0;const{push:n,newline:r}=t;r();for(let i=0;i<e.length;i++){const s=e[i];s&&(n(`const _hoisted_${i+1} = `),dn(s,t),r())}t.pure=!1}function td(e,t){const n=e.length>3||!1;t.push(\"[\"),n&&t.indent(),Ho(e,t,n),n&&t.deindent(),t.push(\"]\")}function Ho(e,t,n=!1,r=!0){const{push:i,newline:s}=t;for(let o=0;o<e.length;o++){const a=e[o];ke(a)?i(a,-3):ye(a)?td(a,t):dn(a,t),o<e.length-1&&(n?(r&&i(\",\"),s()):r&&i(\", \"))}}function dn(e,t){if(ke(e)){t.push(e,-3);return}if(Sn(e)){t.push(t.helper(e));return}switch(e.type){case 1:case 9:case 11:dn(e.codegenNode,t);break;case 2:Bw(e,t);break;case 4:$v(e,t);break;case 5:jw(e,t);break;case 12:dn(e.codegenNode,t);break;case 8:Wv(e,t);break;case 3:Uw(e,t);break;case 13:$w(e,t);break;case 14:Yw(e,t);break;case 15:zw(e,t);break;case 17:Kw(e,t);break;case 18:Gw(e,t);break;case 19:Xw(e,t);break;case 20:Jw(e,t);break;case 21:Ho(e.body,t,!0,!1);break}}function Bw(e,t){t.push(JSON.stringify(e.content),-3,e)}function $v(e,t){const{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,-3,e)}function jw(e,t){const{push:n,helper:r,pure:i}=t;i&&n(fc),n(`${r(Fo)}(`),dn(e.content,t),n(\")\")}function Wv(e,t){for(let n=0;n<e.children.length;n++){const r=e.children[n];ke(r)?t.push(r,-3):dn(r,t)}}function Hw(e,t){const{push:n}=t;if(e.type===8)n(\"[\"),Wv(e,t),n(\"]\");else if(e.isStatic){const r=Vo(e.content)?e.content:JSON.stringify(e.content);n(r,-2,e)}else n(`[${e.content}]`,-3,e)}function Uw(e,t){const{push:n,helper:r,pure:i}=t;i&&n(fc),n(`${r(bs)}(${JSON.stringify(e.content)})`,-3,e)}function $w(e,t){const{push:n,helper:r,pure:i}=t,{tag:s,props:o,children:a,patchFlag:l,dynamicProps:c,directives:u,isBlock:f,disableTracking:d,isComponent:p}=e;let m;l&&(m=String(l)),u&&n(r(rc)+\"(\"),f&&n(`(${r(oi)}(${d?\"true\":\"\"}), `),i&&n(fc);const g=f?Li(t.inSSR,p):Pi(t.inSSR,p);n(r(g)+\"(\",-2,e),Ho(Ww([s,o,a,m,c]),t),n(\")\"),f&&n(\")\"),u&&(n(\", \"),dn(u,t),n(\")\"))}function Ww(e){let t=e.length;for(;t--&&e[t]==null;);return e.slice(0,t+1).map(n=>n||\"null\")}function Yw(e,t){const{push:n,helper:r,pure:i}=t,s=ke(e.callee)?e.callee:r(e.callee);i&&n(fc),n(s+\"(\",-2,e),Ho(e.arguments,t),n(\")\")}function zw(e,t){const{push:n,indent:r,deindent:i,newline:s}=t,{properties:o}=e;if(!o.length){n(\"{}\",-2,e);return}const a=o.length>1||!1;n(a?\"{\":\"{ \"),a&&r();for(let l=0;l<o.length;l++){const{key:c,value:u}=o[l];Hw(c,t),n(\": \"),dn(u,t),l<o.length-1&&(n(\",\"),s())}a&&i(),n(a?\"}\":\" }\")}function Kw(e,t){td(e.elements,t)}function Gw(e,t){const{push:n,indent:r,deindent:i}=t,{params:s,returns:o,body:a,newline:l,isSlot:c}=e;c&&n(`_${Ii[lc]}(`),n(\"(\",-2,e),ye(s)?Ho(s,t):s&&dn(s,t),n(\") => \"),(l||a)&&(n(\"{\"),r()),o?(l&&n(\"return \"),ye(o)?td(o,t):dn(o,t)):a&&dn(a,t),(l||a)&&(i(),n(\"}\")),c&&(e.isNonScopedSlot&&n(\", undefined, true\"),n(\")\"))}function Xw(e,t){const{test:n,consequent:r,alternate:i,newline:s}=e,{push:o,indent:a,deindent:l,newline:c}=t;if(n.type===4){const f=!Vo(n.content);f&&o(\"(\"),$v(n,t),f&&o(\")\")}else o(\"(\"),dn(n,t),o(\")\");s&&a(),t.indentLevel++,s||o(\" \"),o(\"? \"),dn(r,t),t.indentLevel--,s&&c(),s||o(\" \"),o(\": \");const u=i.type===19;u||t.indentLevel++,dn(i,t),u||t.indentLevel--,s&&l(!0)}function Jw(e,t){const{push:n,helper:r,indent:i,deindent:s,newline:o}=t,{needPauseTracking:a,needArraySpread:l}=e;l&&n(\"[...(\"),n(`_cache[${e.index}] || (`),a&&(i(),n(`${r(wo)}(-1`),e.inVOnce&&n(\", true\"),n(\"),\"),o(),n(\"(\")),n(`_cache[${e.index}] = `),dn(e.value,t),a&&(n(`).cacheIndex = ${e.index},`),o(),n(`${r(wo)}(1),`),o(),n(`_cache[${e.index}]`),s()),n(\")\"),l&&n(\")]\")}new RegExp(\"\\\\b\"+\"arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield\".split(\",\").join(\"\\\\b|\\\\b\")+\"\\\\b\");const Zw=(e,t)=>{if(e.type===5)e.content=Pa(e.content,t);else if(e.type===1){const n=yn(e,\"memo\");for(let r=0;r<e.props.length;r++){const i=e.props[r];if(i.type===7&&i.name!==\"for\"){const s=i.exp,o=i.arg;s&&s.type===4&&!(i.name===\"on\"&&o)&&!(n&&o&&o.type===4&&o.content===\"key\")&&(i.exp=Pa(s,t,i.name===\"slot\")),o&&o.type===4&&!o.isStatic&&(i.arg=Pa(o,t))}}}};function Pa(e,t,n=!1,r=!1,i=Object.create(t.identifiers)){return e}function Yv(e){return ke(e)?e:e.type===4?e.content:e.children.map(Yv).join(\"\")}const Qw=ed(/^(if|else|else-if)$/,(e,t,n)=>zv(e,t,n,(r,i,s)=>{const o=n.parent.children;let a=o.indexOf(r),l=0;for(;a-->=0;){const c=o[a];c&&c.type===9&&(l+=c.branches.length)}return()=>{if(s)r.codegenNode=Ch(i,l,n);else{const c=qw(r.codegenNode);c.alternate=Ch(i,l+r.branches.length-1,n)}}}));function zv(e,t,n,r){if(t.name!==\"else\"&&(!t.exp||!t.exp.content.trim())){const i=t.exp?t.exp.loc:e.loc;n.onError(vt(28,t.loc)),t.exp=Be(\"true\",!1,i)}if(t.name===\"if\"){const i=Dh(e,t),s={type:9,loc:Mw(e.loc),branches:[i]};if(n.replaceNode(s),r)return r(s,i,!0)}else{const i=n.parent.children;let s=i.indexOf(e);for(;s-->=-1;){const o=i[s];if(o&&o.type===3){n.removeNode(o);continue}if(o&&o.type===2&&!o.content.trim().length){n.removeNode(o);continue}if(o&&o.type===9){t.name===\"else-if\"&&o.branches[o.branches.length-1].condition===void 0&&n.onError(vt(30,e.loc)),n.removeNode();const a=Dh(e,t);o.branches.push(a);const l=r&&r(o,a,!1);jo(a,n),l&&l(),n.currentNode=null}else n.onError(vt(30,e.loc));break}}}function Dh(e,t){const n=e.tagType===3;return{type:10,loc:e.loc,condition:t.name===\"else\"?void 0:t.exp,children:n&&!yn(e,\"for\")?e.children:[e],userKey:Bo(e,\"key\"),isTemplateIf:n}}function Ch(e,t,n){return e.condition?fl(e.condition,Oh(e,t,n),kt(n.helper(bs),['\"\"',\"true\"])):Oh(e,t,n)}function Oh(e,t,n){const{helper:r}=n,i=Ct(\"key\",Be(`${t}`,!1,$t,2)),{children:s}=e,o=s[0];if(s.length!==1||o.type!==1)if(s.length===1&&o.type===11){const l=o.codegenNode;return Co(l,i,n),l}else return ds(n,r(us),Un([i]),s,64,void 0,void 0,!0,!1,!1,e.loc);else{const l=o.codegenNode,c=Mv(l);return c.type===13&&uc(c,n),Co(c,i,n),l}}function qw(e){for(;;)if(e.type===19)if(e.alternate.type===19)e=e.alternate;else return e;else e.type===20&&(e=e.value)}const Kv=(e,t,n)=>{const{modifiers:r,loc:i}=e,s=e.arg;let{exp:o}=e;if(o&&o.type===4&&!o.content.trim()&&(o=void 0),!o){if(s.type!==4||!s.isStatic)return n.onError(vt(52,s.loc)),{props:[Ct(s,Be(\"\",!0,i))]};Gv(e),o=e.exp}return s.type!==4?(s.children.unshift(\"(\"),s.children.push(') || \"\"')):s.isStatic||(s.content=`${s.content} || \"\"`),r.some(a=>a.content===\"camel\")&&(s.type===4?s.isStatic?s.content=gt(s.content):s.content=`${n.helperString(cl)}(${s.content})`:(s.children.unshift(`${n.helperString(cl)}(`),s.children.push(\")\"))),n.inSSR||(r.some(a=>a.content===\"prop\")&&Ah(s,\".\"),r.some(a=>a.content===\"attr\")&&Ah(s,\"^\")),{props:[Ct(s,o)]}},Gv=(e,t)=>{const n=e.arg,r=gt(n.content);e.exp=Be(r,!1,n.loc)},Ah=(e,t)=>{e.type===4?e.isStatic?e.content=t+e.content:e.content=`\\`${t}\\${${e.content}}\\``:(e.children.unshift(`'${t}' + (`),e.children.push(\")\"))},eD=ed(\"for\",(e,t,n)=>{const{helper:r,removeHelper:i}=n;return Xv(e,t,n,s=>{const o=kt(r(ic),[s.source]),a=ps(e),l=yn(e,\"memo\"),c=Bo(e,\"key\",!1,!0);c&&c.type===7&&!c.exp&&Gv(c);let f=c&&(c.type===6?c.value?Be(c.value.content,!0):void 0:c.exp);const d=c&&f?Ct(\"key\",f):null,p=s.source.type===4&&s.source.constType>0,m=p?64:c?128:256;return s.codegenNode=ds(n,r(us),void 0,o,m,void 0,void 0,!0,!p,!1,e.loc),()=>{let g;const{children:v}=s,w=v.length!==1||v[0].type!==1,S=Do(e)?e:a&&e.children.length===1&&Do(e.children[0])?e.children[0]:null;if(S?(g=S.codegenNode,a&&d&&Co(g,d,n)):w?g=ds(n,r(us),d?Un([d]):void 0,e.children,64,void 0,void 0,!0,void 0,!1):(g=v[0].codegenNode,a&&d&&Co(g,d,n),g.isBlock!==!p&&(g.isBlock?(i(oi),i(Li(n.inSSR,g.isComponent))):i(Pi(n.inSSR,g.isComponent))),g.isBlock=!p,g.isBlock?(r(oi),r(Li(n.inSSR,g.isComponent))):r(Pi(n.inSSR,g.isComponent))),l){const y=Ri(hl(s.parseResult,[Be(\"_cached\")]));y.body=vv([Xn([\"const _memo = (\",l.exp,\")\"]),Xn([\"if (_cached\",...f?[\" && _cached.key === \",f]:[],` && ${n.helperString(Kf)}(_cached, _memo)) return _cached`]),Xn([\"const _item = \",g]),Be(\"_item.memo = _memo\"),Be(\"return _item\")]),o.arguments.push(y,Be(\"_cache\"),Be(String(n.cached.length))),n.cached.push(null)}else o.arguments.push(Ri(hl(s.parseResult),g,!0))}})});function Xv(e,t,n,r){if(!t.exp){n.onError(vt(31,t.loc));return}const i=t.forParseResult;if(!i){n.onError(vt(32,t.loc));return}nd(i);const{addIdentifiers:s,removeIdentifiers:o,scopes:a}=n,{source:l,value:c,key:u,index:f}=i,d={type:11,loc:t.loc,source:l,valueAlias:c,keyAlias:u,objectIndexAlias:f,parseResult:i,children:ps(e)?e.children:[e]};n.replaceNode(d),a.vFor++;const p=r&&r(d);return()=>{a.vFor--,p&&p()}}function nd(e,t){e.finalized||(e.finalized=!0)}function hl({value:e,key:t,index:n},r=[]){return tD([e,t,n,...r])}function tD(e){let t=e.length;for(;t--&&!e[t];);return e.slice(0,t+1).map((n,r)=>n||Be(\"_\".repeat(r+1),!1))}const _h=Be(\"undefined\",!1),Jv=(e,t)=>{if(e.type===1&&(e.tagType===1||e.tagType===3)){const n=yn(e,\"slot\");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},nD=(e,t)=>{let n;if(ps(e)&&e.props.some(Zf)&&(n=yn(e,\"for\"))){const r=n.forParseResult;if(r){nd(r);const{value:i,key:s,index:o}=r,{addIdentifiers:a,removeIdentifiers:l}=t;return i&&a(i),s&&a(s),o&&a(o),()=>{i&&l(i),s&&l(s),o&&l(o)}}}},rD=(e,t,n,r)=>Ri(e,n,!1,!0,n.length?n[0].loc:r);function Zv(e,t,n=rD){t.helper(lc);const{children:r,loc:i}=e,s=[],o=[];let a=t.scopes.vSlot>0||t.scopes.vFor>0;const l=yn(e,\"slot\",!0);if(l){const{arg:v,exp:w}=l;v&&!En(v)&&(a=!0),s.push(Ct(v||Be(\"default\",!0),n(w,void 0,r,i)))}let c=!1,u=!1;const f=[],d=new Set;let p=0;for(let v=0;v<r.length;v++){const w=r[v];let S;if(!ps(w)||!(S=yn(w,\"slot\",!0))){w.type!==3&&f.push(w);continue}if(l){t.onError(vt(37,S.loc));break}c=!0;const{children:y,loc:E}=w,{arg:C=Be(\"default\",!0),exp:M,loc:B}=S;let j;En(C)?j=C?C.content:\"default\":a=!0;const A=yn(w,\"for\"),x=n(M,A,y,E);let k,P;if(k=yn(w,\"if\"))a=!0,o.push(fl(k.exp,la(C,x,p++),_h));else if(P=yn(w,/^else(-if)?$/,!0)){let V=v,$;for(;V--&&($=r[V],$.type===3););if($&&ps($)&&yn($,/^(else-)?if$/)){let Z=o[o.length-1];for(;Z.alternate.type===19;)Z=Z.alternate;Z.alternate=P.exp?fl(P.exp,la(C,x,p++),_h):la(C,x,p++)}else t.onError(vt(30,P.loc))}else if(A){a=!0;const V=A.forParseResult;V?(nd(V),o.push(kt(t.helper(ic),[V.source,Ri(hl(V),la(C,x),!0)]))):t.onError(vt(32,A.loc))}else{if(j){if(d.has(j)){t.onError(vt(38,B));continue}d.add(j),j===\"default\"&&(u=!0)}s.push(Ct(C,x))}}if(!l){const v=(w,S)=>{const y=n(w,void 0,S,i);return t.compatConfig&&(y.isNonScopedSlot=!0),Ct(\"default\",y)};c?f.length&&f.some(w=>Qv(w))&&(u?t.onError(vt(39,f[0].loc)):s.push(v(void 0,f))):s.push(v(void 0,r))}const m=a?2:La(e.children)?3:1;let g=Un(s.concat(Ct(\"_\",Be(m+\"\",!1))),i);return o.length&&(g=kt(t.helper(zf),[g,ii(o)])),{slots:g,hasDynamicSlots:a}}function la(e,t,n){const r=[Ct(\"name\",e),Ct(\"fn\",t)];return n!=null&&r.push(Ct(\"key\",Be(String(n),!0))),Un(r)}function La(e){for(let t=0;t<e.length;t++){const n=e[t];switch(n.type){case 1:if(n.tagType===2||La(n.children))return!0;break;case 9:if(La(n.branches))return!0;break;case 10:case 11:if(La(n.children))return!0;break}}return!1}function Qv(e){return e.type!==2&&e.type!==12?!0:e.type===2?!!e.content.trim():Qv(e.content)}const qv=new WeakMap,ey=(e,t)=>function(){if(e=t.currentNode,!(e.type===1&&(e.tagType===0||e.tagType===1)))return;const{tag:r,props:i}=e,s=e.tagType===1;let o=s?ty(e,t):`\"${r}\"`;const a=ct(o)&&o.callee===ec;let l,c,u=0,f,d,p,m=a||o===rs||o===Xl||!s&&(r===\"svg\"||r===\"foreignObject\"||r===\"math\");if(i.length>0){const g=rd(e,t,void 0,s,a);l=g.props,u=g.patchFlag,d=g.dynamicPropNames;const v=g.directives;p=v&&v.length?ii(v.map(w=>ny(w,t))):void 0,g.shouldUseBlock&&(m=!0)}if(e.children.length>0)if(o===So&&(m=!0,u|=1024),s&&o!==rs&&o!==So){const{slots:v,hasDynamicSlots:w}=Zv(e,t);c=v,w&&(u|=1024)}else if(e.children.length===1&&o!==rs){const v=e.children[0],w=v.type,S=w===5||w===8;S&&In(v,t)===0&&(u|=1),S||w===2?c=v:c=e.children}else c=e.children;d&&d.length&&(f=sD(d)),e.codegenNode=ds(t,o,l,c,u===0?void 0:u,f,p,!!m,!1,s,e.loc)};function ty(e,t,n=!1){let{tag:r}=e;const i=Vu(r),s=Bo(e,\"is\",!1,!0);if(s)if(i||Ai(\"COMPILER_IS_ON_ELEMENT\",t)){let a;if(s.type===6?a=s.value&&Be(s.value.content,!0):(a=s.exp,a||(a=Be(\"is\",!1,s.arg.loc))),a)return kt(t.helper(ec),[a])}else s.type===6&&s.value.content.startsWith(\"vue:\")&&(r=s.value.content.slice(4));const o=Xf(r)||t.isBuiltInComponent(r);return o?(n||t.helper(o),o):(t.helper(ql),t.components.add(r),ms(r,\"component\"))}function rd(e,t,n=e.props,r,i,s=!1){const{tag:o,loc:a,children:l}=e;let c=[];const u=[],f=[],d=l.length>0;let p=!1,m=0,g=!1,v=!1,w=!1,S=!1,y=!1,E=!1;const C=[],M=x=>{c.length&&(u.push(Un(Mh(c),a)),c=[]),x&&u.push(x)},B=()=>{t.scopes.vFor>0&&c.push(Ct(Be(\"ref_for\",!0),Be(\"true\")))},j=({key:x,value:k})=>{if(En(x)){const P=x.content,V=ai(P);if(V&&(!r||i)&&P.toLowerCase()!==\"onclick\"&&P!==\"onUpdate:modelValue\"&&!xr(P)&&(S=!0),V&&xr(P)&&(E=!0),V&&k.type===14&&(k=k.arguments[0]),k.type===20||(k.type===4||k.type===8)&&In(k,t)>0)return;P===\"ref\"?g=!0:P===\"class\"?v=!0:P===\"style\"?w=!0:P!==\"key\"&&!C.includes(P)&&C.push(P),r&&(P===\"class\"||P===\"style\")&&!C.includes(P)&&C.push(P)}else y=!0};for(let x=0;x<n.length;x++){const k=n[x];if(k.type===6){const{loc:P,name:V,nameLoc:$,value:Z}=k;let U=!0;if(V===\"ref\"&&(g=!0,B()),V===\"is\"&&(Vu(o)||Z&&Z.content.startsWith(\"vue:\")||Ai(\"COMPILER_IS_ON_ELEMENT\",t)))continue;c.push(Ct(Be(V,!0,$),Be(Z?Z.content:\"\",U,Z?Z.loc:P)))}else{const{name:P,arg:V,exp:$,loc:Z,modifiers:U}=k,W=P===\"bind\",ee=P===\"on\";if(P===\"slot\"){r||t.onError(vt(40,Z));continue}if(P===\"once\"||P===\"memo\"||P===\"is\"||W&&qr(V,\"is\")&&(Vu(o)||Ai(\"COMPILER_IS_ON_ELEMENT\",t))||ee&&s)continue;if((W&&qr(V,\"key\")||ee&&d&&qr(V,\"vue:before-update\"))&&(p=!0),W&&qr(V,\"ref\")&&B(),!V&&(W||ee)){if(y=!0,$)if(W){if(M(),Ai(\"COMPILER_V_BIND_OBJECT_ORDER\",t)){u.unshift($);continue}B(),M(),u.push($)}else M({type:14,loc:Z,callee:t.helper(ac),arguments:r?[$]:[$,\"true\"]});else t.onError(vt(W?34:35,Z));continue}W&&U.some(ze=>ze.content===\"prop\")&&(m|=32);const Te=t.directiveTransforms[P];if(Te){const{props:ze,needRuntime:De}=Te(k,e,t);!s&&ze.forEach(j),ee&&V&&!En(V)?M(Un(ze,a)):c.push(...ze),De&&(f.push(k),Sn(De)&&qv.set(k,De))}else Xp(P)||(f.push(k),d&&(p=!0))}}let A;if(u.length?(M(),u.length>1?A=kt(t.helper(To),u,a):A=u[0]):c.length&&(A=Un(Mh(c),a)),y?m|=16:(v&&!r&&(m|=2),w&&!r&&(m|=4),C.length&&(m|=8),S&&(m|=32)),!p&&(m===0||m===32)&&(g||E||f.length>0)&&(m|=512),!t.inSSR&&A)switch(A.type){case 15:let x=-1,k=-1,P=!1;for(let Z=0;Z<A.properties.length;Z++){const U=A.properties[Z].key;En(U)?U.content===\"class\"?x=Z:U.content===\"style\"&&(k=Z):U.isHandlerKey||(P=!0)}const V=A.properties[x],$=A.properties[k];P?A=kt(t.helper(fs),[A]):(V&&!En(V.value)&&(V.value=kt(t.helper(sc),[V.value])),$&&(w||$.value.type===4&&$.value.content.trim()[0]===\"[\"||$.value.type===17)&&($.value=kt(t.helper(oc),[$.value])));break;case 14:break;default:A=kt(t.helper(fs),[kt(t.helper(Ss),[A])]);break}return{props:A,directives:f,patchFlag:m,dynamicPropNames:C,shouldUseBlock:p}}function Mh(e){const t=new Map,n=[];for(let r=0;r<e.length;r++){const i=e[r];if(i.key.type===8||!i.key.isStatic){n.push(i);continue}const s=i.key.content,o=t.get(s);o?(s===\"style\"||s===\"class\"||ai(s))&&iD(o,i):(t.set(s,i),n.push(i))}return n}function iD(e,t){e.value.type===17?e.value.elements.push(t.value):e.value=ii([e.value,t.value],e.loc)}function ny(e,t){const n=[],r=qv.get(e);r?n.push(t.helperString(r)):(t.helper(tc),t.directives.add(e.name),n.push(ms(e.name,\"directive\")));const{loc:i}=e;if(e.exp&&n.push(e.exp),e.arg&&(e.exp||n.push(\"void 0\"),n.push(e.arg)),Object.keys(e.modifiers).length){e.arg||(e.exp||n.push(\"void 0\"),n.push(\"void 0\"));const s=Be(\"true\",!1,i);n.push(Un(e.modifiers.map(o=>Ct(o,s)),i))}return ii(n,e.loc)}function sD(e){let t=\"[\";for(let n=0,r=e.length;n<r;n++)t+=JSON.stringify(e[n]),n<r-1&&(t+=\", \");return t+\"]\"}function Vu(e){return e===\"component\"||e===\"Component\"}const oD=(e,t)=>{if(Do(e)){const{children:n,loc:r}=e,{slotName:i,slotProps:s}=ry(e,t),o=[t.prefixIdentifiers?\"_ctx.$slots\":\"$slots\",i,\"{}\",\"undefined\",\"true\"];let a=2;s&&(o[2]=s,a=3),n.length&&(o[3]=Ri([],n,!1,!1,r),a=4),t.scopeId&&!t.slotted&&(a=5),o.splice(a),e.codegenNode=kt(t.helper(Yf),o,r)}};function ry(e,t){let n='\"default\"',r;const i=[];for(let s=0;s<e.props.length;s++){const o=e.props[s];if(o.type===6)o.value&&(o.name===\"name\"?n=JSON.stringify(o.value.content):(o.name=gt(o.name),i.push(o)));else if(o.name===\"bind\"&&qr(o.arg,\"name\")){if(o.exp)n=o.exp;else if(o.arg&&o.arg.type===4){const a=gt(o.arg.content);n=o.exp=Be(a,!1,o.arg.loc)}}else o.name===\"bind\"&&o.arg&&En(o.arg)&&(o.arg.content=gt(o.arg.content)),i.push(o)}if(i.length>0){const{props:s,directives:o}=rd(e,t,i,!1,!1);r=s,o.length&&t.onError(vt(36,o[0].loc))}return{slotName:n,slotProps:r}}const id=(e,t,n,r)=>{const{loc:i,modifiers:s,arg:o}=e;!e.exp&&!s.length&&n.onError(vt(35,i));let a;if(o.type===4)if(o.isStatic){let f=o.content;f.startsWith(\"vue:\")&&(f=`vnode-${f.slice(4)}`);const d=t.tagType!==0||f.startsWith(\"vnode\")||!/[A-Z]/.test(f)?Ti(gt(f)):`on:${f}`;a=Be(d,!0,o.loc)}else a=Xn([`${n.helperString(ul)}(`,o,\")\"]);else a=o,a.children.unshift(`${n.helperString(ul)}(`),a.children.push(\")\");let l=e.exp;l&&!l.content.trim()&&(l=void 0);let c=n.cacheHandlers&&!l&&!n.inVOnce;if(l){const f=Jf(l),d=!(f||Cv(l)),p=l.content.includes(\";\");(d||c&&f)&&(l=Xn([`${d?\"$event\":\"(...args)\"} => ${p?\"{\":\"(\"}`,l,p?\"}\":\")\"]))}let u={props:[Ct(a,l||Be(\"() => {}\",!1,i))]};return r&&(u=r(u)),c&&(u.props[0].value=n.cache(u.props[0].value)),u.props.forEach(f=>f.key.isHandlerKey=!0),u},aD=(e,t)=>{if(e.type===0||e.type===1||e.type===11||e.type===10)return()=>{const n=e.children;let r,i=!1;for(let s=0;s<n.length;s++){const o=n[s];if(xa(o)){i=!0;for(let a=s+1;a<n.length;a++){const l=n[a];if(xa(l))r||(r=n[s]=Xn([o],o.loc)),r.children.push(\" + \",l),n.splice(a,1),a--;else{r=void 0;break}}}}if(!(!i||n.length===1&&(e.type===0||e.type===1&&e.tagType===0&&!e.props.find(s=>s.type===7&&!t.directiveTransforms[s.name])&&e.tag!==\"template\")))for(let s=0;s<n.length;s++){const o=n[s];if(xa(o)||o.type===8){const a=[];(o.type!==2||o.content!==\" \")&&a.push(o),!t.ssr&&In(o,t)===0&&a.push(\"1\"),n[s]={type:12,content:o,loc:o.loc,codegenNode:kt(t.helper(Ql),a)}}}}},xh=new WeakSet,lD=(e,t)=>{if(e.type===1&&yn(e,\"once\",!0))return xh.has(e)||t.inVOnce||t.inSSR?void 0:(xh.add(e),t.inVOnce=!0,t.helper(wo),()=>{t.inVOnce=!1;const n=t.currentNode;n.codegenNode&&(n.codegenNode=t.cache(n.codegenNode,!0,!0))})},sd=(e,t,n)=>{const{exp:r,arg:i}=e;if(!r)return n.onError(vt(41,e.loc)),ca();const s=r.loc.source.trim(),o=r.type===4?r.content:s,a=n.bindingMetadata[s];if(a===\"props\"||a===\"props-aliased\")return n.onError(vt(44,r.loc)),ca();if(!o.trim()||!Jf(r))return n.onError(vt(42,r.loc)),ca();const l=i||Be(\"modelValue\",!0),c=i?En(i)?`onUpdate:${gt(i.content)}`:Xn(['\"onUpdate:\" + ',i]):\"onUpdate:modelValue\";let u;const f=n.isTS?\"($event: any)\":\"$event\";u=Xn([`${f} => ((`,r,\") = $event)\"]);const d=[Ct(l,e.exp),Ct(c,u)];if(e.modifiers.length&&t.tagType===1){const p=e.modifiers.map(g=>g.content).map(g=>(Vo(g)?g:JSON.stringify(g))+\": true\").join(\", \"),m=i?En(i)?`${i.content}Modifiers`:Xn([i,' + \"Modifiers\"']):\"modelModifiers\";d.push(Ct(m,Be(`{ ${p} }`,!1,e.loc,2)))}return ca(d)};function ca(e=[]){return{props:e}}const cD=/[\\w).+\\-_$\\]]/,uD=(e,t)=>{Ai(\"COMPILER_FILTERS\",t)&&(e.type===5?pl(e.content,t):e.type===1&&e.props.forEach(n=>{n.type===7&&n.name!==\"for\"&&n.exp&&pl(n.exp,t)}))};function pl(e,t){if(e.type===4)Nh(e,t);else for(let n=0;n<e.children.length;n++){const r=e.children[n];typeof r==\"object\"&&(r.type===4?Nh(r,t):r.type===8?pl(e,t):r.type===5&&pl(r.content,t))}}function Nh(e,t){const n=e.content;let r=!1,i=!1,s=!1,o=!1,a=0,l=0,c=0,u=0,f,d,p,m,g=[];for(p=0;p<n.length;p++)if(d=f,f=n.charCodeAt(p),r)f===39&&d!==92&&(r=!1);else if(i)f===34&&d!==92&&(i=!1);else if(s)f===96&&d!==92&&(s=!1);else if(o)f===47&&d!==92&&(o=!1);else if(f===124&&n.charCodeAt(p+1)!==124&&n.charCodeAt(p-1)!==124&&!a&&!l&&!c)m===void 0?(u=p+1,m=n.slice(0,p).trim()):v();else{switch(f){case 34:i=!0;break;case 39:r=!0;break;case 96:s=!0;break;case 40:c++;break;case 41:c--;break;case 91:l++;break;case 93:l--;break;case 123:a++;break;case 125:a--;break}if(f===47){let w=p-1,S;for(;w>=0&&(S=n.charAt(w),S===\" \");w--);(!S||!cD.test(S))&&(o=!0)}}m===void 0?m=n.slice(0,p).trim():u!==0&&v();function v(){g.push(n.slice(u,p).trim()),u=p+1}if(g.length){for(p=0;p<g.length;p++)m=fD(m,g[p],t);e.content=m,e.ast=void 0}}function fD(e,t,n){n.helper(nc);const r=t.indexOf(\"(\");if(r<0)return n.filters.add(t),`${ms(t,\"filter\")}(${e})`;{const i=t.slice(0,r),s=t.slice(r+1);return n.filters.add(i),`${ms(i,\"filter\")}(${e}${s!==\")\"?\",\"+s:s}`}}const Ih=new WeakSet,dD=(e,t)=>{if(e.type===1){const n=yn(e,\"memo\");return!n||Ih.has(e)?void 0:(Ih.add(e),()=>{const r=e.codegenNode||t.currentNode.codegenNode;r&&r.type===13&&(e.tagType!==1&&uc(r,t),e.codegenNode=kt(t.helper(cc),[n.exp,Ri(void 0,r),\"_cache\",String(t.cached.length)]),t.cached.push(null))})}};function iy(e){return[[lD,Qw,dD,eD,uD,oD,ey,Jv,aD],{on:id,bind:Kv,model:sd}]}function sy(e,t={}){const n=t.onError||Gf,r=t.mode===\"module\";t.prefixIdentifiers===!0?n(vt(47)):r&&n(vt(48));const i=!1;t.cacheHandlers&&n(vt(49)),t.scopeId&&!r&&n(vt(50));const s=Ze({},t,{prefixIdentifiers:i}),o=ke(e)?qf(e,s):e,[a,l]=iy();return jv(o,Ze({},s,{nodeTransforms:[...a,...t.nodeTransforms||[]],directiveTransforms:Ze({},l,t.directiveTransforms||{})})),Uv(o,s)}const hD={DATA:\"data\",PROPS:\"props\",PROPS_ALIASED:\"props-aliased\",SETUP_LET:\"setup-let\",SETUP_CONST:\"setup-const\",SETUP_REACTIVE_CONST:\"setup-reactive-const\",SETUP_MAYBE_REF:\"setup-maybe-ref\",SETUP_REF:\"setup-ref\",OPTIONS:\"options\",LITERAL_CONST:\"literal-const\"},oy=()=>({props:[]});/**\n* @vue/compiler-dom v3.5.16\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/const od=Symbol(\"\"),ad=Symbol(\"\"),ld=Symbol(\"\"),cd=Symbol(\"\"),ml=Symbol(\"\"),ud=Symbol(\"\"),fd=Symbol(\"\"),dd=Symbol(\"\"),hd=Symbol(\"\"),pd=Symbol(\"\");pv({[od]:\"vModelRadio\",[ad]:\"vModelCheckbox\",[ld]:\"vModelText\",[cd]:\"vModelSelect\",[ml]:\"vModelDynamic\",[ud]:\"withModifiers\",[fd]:\"withKeys\",[dd]:\"vShow\",[hd]:\"Transition\",[pd]:\"TransitionGroup\"});let $i;function pD(e,t=!1){return $i||($i=document.createElement(\"div\")),t?($i.innerHTML=`<div foo=\"${e.replace(/\"/g,\"&quot;\")}\">`,$i.children[0].getAttribute(\"foo\")):($i.innerHTML=e,$i.textContent)}const md={parseMode:\"html\",isVoidTag:nm,isNativeTag:e=>qp(e)||em(e)||tm(e),isPreTag:e=>e===\"pre\",isIgnoreNewlineTag:e=>e===\"pre\"||e===\"textarea\",decodeEntities:pD,isBuiltInComponent:e=>{if(e===\"Transition\"||e===\"transition\")return hd;if(e===\"TransitionGroup\"||e===\"transition-group\")return pd},getNamespace(e,t,n){let r=t?t.ns:n;if(t&&r===2)if(t.tag===\"annotation-xml\"){if(e===\"svg\")return 1;t.props.some(i=>i.type===6&&i.name===\"encoding\"&&i.value!=null&&(i.value.content===\"text/html\"||i.value.content===\"application/xhtml+xml\"))&&(r=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&e!==\"mglyph\"&&e!==\"malignmark\"&&(r=0);else t&&r===1&&(t.tag===\"foreignObject\"||t.tag===\"desc\"||t.tag===\"title\")&&(r=0);if(r===0){if(e===\"svg\")return 1;if(e===\"math\")return 2}return r}},ay=e=>{e.type===1&&e.props.forEach((t,n)=>{t.type===6&&t.name===\"style\"&&t.value&&(e.props[n]={type:7,name:\"bind\",arg:Be(\"style\",!0,t.loc),exp:mD(t.value.content,t.loc),modifiers:[],loc:t.loc})})},mD=(e,t)=>{const n=df(e);return Be(JSON.stringify(n),!1,t,3)};function Ir(e,t){return vt(e,t)}const gD={X_V_HTML_NO_EXPRESSION:53,53:\"X_V_HTML_NO_EXPRESSION\",X_V_HTML_WITH_CHILDREN:54,54:\"X_V_HTML_WITH_CHILDREN\",X_V_TEXT_NO_EXPRESSION:55,55:\"X_V_TEXT_NO_EXPRESSION\",X_V_TEXT_WITH_CHILDREN:56,56:\"X_V_TEXT_WITH_CHILDREN\",X_V_MODEL_ON_INVALID_ELEMENT:57,57:\"X_V_MODEL_ON_INVALID_ELEMENT\",X_V_MODEL_ARG_ON_ELEMENT:58,58:\"X_V_MODEL_ARG_ON_ELEMENT\",X_V_MODEL_ON_FILE_INPUT_ELEMENT:59,59:\"X_V_MODEL_ON_FILE_INPUT_ELEMENT\",X_V_MODEL_UNNECESSARY_VALUE:60,60:\"X_V_MODEL_UNNECESSARY_VALUE\",X_V_SHOW_NO_EXPRESSION:61,61:\"X_V_SHOW_NO_EXPRESSION\",X_TRANSITION_INVALID_CHILDREN:62,62:\"X_TRANSITION_INVALID_CHILDREN\",X_IGNORED_SIDE_EFFECT_TAG:63,63:\"X_IGNORED_SIDE_EFFECT_TAG\",__EXTEND_POINT__:64,64:\"__EXTEND_POINT__\"},vD={53:\"v-html is missing expression.\",54:\"v-html will override element children.\",55:\"v-text is missing expression.\",56:\"v-text will override element children.\",57:\"v-model can only be used on <input>, <textarea> and <select> elements.\",58:\"v-model argument is not supported on plain elements.\",59:\"v-model cannot be used on file inputs since they are read-only. Use a v-on:change listener instead.\",60:\"Unnecessary value binding used alongside v-model. It will interfere with v-model's behavior.\",61:\"v-show is missing expression.\",62:\"<Transition> expects exactly one child element or component.\",63:\"Tags with side effect (<script> and <style>) are ignored in client component templates.\"},yD=(e,t,n)=>{const{exp:r,loc:i}=e;return r||n.onError(Ir(53,i)),t.children.length&&(n.onError(Ir(54,i)),t.children.length=0),{props:[Ct(Be(\"innerHTML\",!0,i),r||Be(\"\",!0))]}},ED=(e,t,n)=>{const{exp:r,loc:i}=e;return r||n.onError(Ir(55,i)),t.children.length&&(n.onError(Ir(56,i)),t.children.length=0),{props:[Ct(Be(\"textContent\",!0),r?In(r,n)>0?r:kt(n.helperString(Fo),[r],i):Be(\"\",!0))]}},bD=(e,t,n)=>{const r=sd(e,t,n);if(!r.props.length||t.tagType===1)return r;e.arg&&n.onError(Ir(58,e.arg.loc));const{tag:i}=t,s=n.isCustomElement(i);if(i===\"input\"||i===\"textarea\"||i===\"select\"||s){let o=ld,a=!1;if(i===\"input\"||s){const l=Bo(t,\"type\");if(l){if(l.type===7)o=ml;else if(l.value)switch(l.value.content){case\"radio\":o=od;break;case\"checkbox\":o=ad;break;case\"file\":a=!0,n.onError(Ir(59,e.loc));break}}else Av(t)&&(o=ml)}else i===\"select\"&&(o=cd);a||(r.needRuntime=n.helper(o))}else n.onError(Ir(57,e.loc));return r.props=r.props.filter(o=>!(o.key.type===4&&o.key.content===\"modelValue\")),r},SD=zt(\"passive,once,capture\"),TD=zt(\"stop,prevent,self,ctrl,shift,alt,meta,exact,middle\"),wD=zt(\"left,right\"),ly=zt(\"onkeyup,onkeydown,onkeypress\"),DD=(e,t,n,r)=>{const i=[],s=[],o=[];for(let a=0;a<t.length;a++){const l=t[a].content;l===\"native\"&&hs(\"COMPILER_V_ON_NATIVE\",n)||SD(l)?o.push(l):wD(l)?En(e)?ly(e.content.toLowerCase())?i.push(l):s.push(l):(i.push(l),s.push(l)):TD(l)?s.push(l):i.push(l)}return{keyModifiers:i,nonKeyModifiers:s,eventOptionModifiers:o}},Rh=(e,t)=>En(e)&&e.content.toLowerCase()===\"onclick\"?Be(t,!0):e.type!==4?Xn([\"(\",e,`) === \"onClick\" ? \"${t}\" : (`,e,\")\"]):e,CD=(e,t,n)=>id(e,t,n,r=>{const{modifiers:i}=e;if(!i.length)return r;let{key:s,value:o}=r.props[0];const{keyModifiers:a,nonKeyModifiers:l,eventOptionModifiers:c}=DD(s,i,n,e.loc);if(l.includes(\"right\")&&(s=Rh(s,\"onContextmenu\")),l.includes(\"middle\")&&(s=Rh(s,\"onMouseup\")),l.length&&(o=kt(n.helper(ud),[o,JSON.stringify(l)])),a.length&&(!En(s)||ly(s.content.toLowerCase()))&&(o=kt(n.helper(fd),[o,JSON.stringify(a)])),c.length){const u=c.map(ci).join(\"\");s=En(s)?Be(`${s.content}${u}`,!0):Xn([\"(\",s,`) + \"${u}\"`])}return{props:[Ct(s,o)]}}),OD=(e,t,n)=>{const{exp:r,loc:i}=e;return r||n.onError(Ir(61,i)),{props:[],needRuntime:n.helper(dd)}},AD=(e,t)=>{e.type===1&&e.tagType===0&&(e.tag===\"script\"||e.tag===\"style\")&&t.removeNode()},cy=[ay],uy={cloak:oy,html:yD,text:ED,model:bD,on:CD,show:OD};function fy(e,t={}){return sy(e,Ze({},md,t,{nodeTransforms:[AD,...cy,...t.nodeTransforms||[]],directiveTransforms:Ze({},uy,t.directiveTransforms||{}),transformHoist:null}))}function _D(e,t={}){return qf(e,Ze({},md,t))}const MD=Object.freeze(Object.defineProperty({__proto__:null,BASE_TRANSITION:Hf,BindingTypes:hD,CAMELIZE:cl,CAPITALIZE:cv,CREATE_BLOCK:Uf,CREATE_COMMENT:bs,CREATE_ELEMENT_BLOCK:$f,CREATE_ELEMENT_VNODE:Zl,CREATE_SLOTS:zf,CREATE_STATIC:Wf,CREATE_TEXT:Ql,CREATE_VNODE:Jl,CompilerDeprecationTypes:XT,ConstantTypes:HT,DOMDirectiveTransforms:uy,DOMErrorCodes:gD,DOMErrorMessages:vD,DOMNodeTransforms:cy,ElementTypes:jT,ErrorCodes:QT,FRAGMENT:us,GUARD_REACTIVE_PROPS:Ss,IS_MEMO_SAME:Kf,IS_REF:hv,KEEP_ALIVE:So,MERGE_PROPS:To,NORMALIZE_CLASS:sc,NORMALIZE_PROPS:fs,NORMALIZE_STYLE:oc,Namespaces:VT,NodeTypes:BT,OPEN_BLOCK:oi,POP_SCOPE_ID:fv,PUSH_SCOPE_ID:uv,RENDER_LIST:ic,RENDER_SLOT:Yf,RESOLVE_COMPONENT:ql,RESOLVE_DIRECTIVE:tc,RESOLVE_DYNAMIC_COMPONENT:ec,RESOLVE_FILTER:nc,SET_BLOCK_TRACKING:wo,SUSPENSE:Xl,TELEPORT:rs,TO_DISPLAY_STRING:Fo,TO_HANDLERS:ac,TO_HANDLER_KEY:ul,TRANSITION:hd,TRANSITION_GROUP:pd,TS_NODE_TYPES:bv,UNREF:dv,V_MODEL_CHECKBOX:ad,V_MODEL_DYNAMIC:ml,V_MODEL_RADIO:od,V_MODEL_SELECT:cd,V_MODEL_TEXT:ld,V_ON_WITH_KEYS:fd,V_ON_WITH_MODIFIERS:ud,V_SHOW:dd,WITH_CTX:lc,WITH_DIRECTIVES:rc,WITH_MEMO:cc,advancePositionWithClone:vw,advancePositionWithMutation:Ov,assert:yw,baseCompile:sy,baseParse:qf,buildDirectiveArgs:ny,buildProps:rd,buildSlots:Zv,checkCompatEnabled:hs,compile:fy,convertToBlock:uc,createArrayExpression:ii,createAssignmentExpression:YT,createBlockStatement:vv,createCacheExpression:gv,createCallExpression:kt,createCompilerError:vt,createCompoundExpression:Xn,createConditionalExpression:fl,createDOMCompilerError:Ir,createForLoopParams:hl,createFunctionExpression:Ri,createIfStatement:WT,createInterpolation:UT,createObjectExpression:Un,createObjectProperty:Ct,createReturnStatement:KT,createRoot:mv,createSequenceExpression:zT,createSimpleExpression:Be,createStructuralDirectiveTransform:ed,createTemplateLiteral:$T,createTransformContext:Bv,createVNodeCall:ds,errorMessages:qT,extractIdentifiers:_r,findDir:yn,findProp:Bo,forAliasRE:xv,generate:Uv,generateCodeFrame:Zp,getBaseTransformPreset:iy,getConstantType:In,getMemoedVNodeCall:Mv,getVNodeBlockHelper:Li,getVNodeHelper:Pi,hasDynamicKeyVBind:Av,hasScopeRef:rr,helperNameMap:Ii,injectProp:Co,isCoreComponent:Xf,isFnExpression:Cv,isFnExpressionBrowser:Dv,isFnExpressionNode:gw,isFunctionType:lw,isInDestructureAssignment:nw,isInNewExpression:rw,isMemberExpression:Jf,isMemberExpressionBrowser:wv,isMemberExpressionNode:pw,isReferencedIdentifier:tw,isSimpleIdentifier:Vo,isSlotOutlet:Do,isStaticArgOf:qr,isStaticExp:En,isStaticProperty:Ev,isStaticPropertyKey:cw,isTemplateNode:ps,isText:xa,isVSlot:Zf,locStub:$t,noopDirectiveTransform:oy,parse:_D,parserOptions:md,processExpression:Pa,processFor:Xv,processIf:zv,processSlotOutlet:ry,registerRuntimeHelpers:pv,resolveComponentType:ty,stringifyExpression:Yv,toValidAssetId:ms,trackSlotScopes:Jv,trackVForSlotScopes:nD,transform:jv,transformBind:Kv,transformElement:ey,transformExpression:Zw,transformModel:sd,transformOn:id,transformStyle:ay,traverseNode:jo,unwrapTSNode:Sv,walkBlockDeclarations:sw,walkFunctionParams:iw,walkIdentifiers:ew,warnDeprecation:ZT},Symbol.toStringTag,{value:\"Module\"}));/**\n* vue v3.5.16\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/const Ph=Object.create(null);function xD(e,t){if(!ke(e))if(e.nodeType)e=e.innerHTML;else return Ft;const n=Jp(e,t),r=Ph[n];if(r)return r;if(e[0]===\"#\"){const a=document.querySelector(e);e=a?a.innerHTML:\"\"}const i=Ze({hoistStatic:!0,onError:void 0,onWarn:Ft},t);!i.isCustomElement&&typeof customElements<\"u\"&&(i.isCustomElement=a=>!!customElements.get(a));const{code:s}=fy(e,i),o=new Function(\"Vue\",s)(lv);return o._rc=!0,Ph[n]=o}Rg(xD);const ND={install(e){e.config.globalProperties.$admin={formatPrice:t=>{let n=document.querySelector('meta[http-equiv=\"content-language\"]').content;n=n.replace(/([a-z]{2})_([A-Z]{2})/g,\"$1-$2\");const r=JSON.parse(document.querySelector('meta[name=\"currency\"]').content),i=r.symbol!==\"\"?r.symbol:r.code;if(!r.currency_position)return new Intl.NumberFormat(n,{style:\"currency\",currency:r.code}).format(t);const o=new Intl.NumberFormat(n,{style:\"currency\",currency:r.code,minimumFractionDigits:r.decimal??2}).formatToParts(t).map(a=>{switch(a.type){case\"currency\":return\"\";case\"group\":return r.group_separator===\"\"?a.value:r.group_separator;case\"decimal\":return r.decimal_separator===\"\"?a.value:r.decimal_separator;default:return a.value}}).join(\"\");switch(r.currency_position){case\"left\":return i+o;case\"left_with_space\":return i+\" \"+o;case\"right\":return o+i;case\"right_with_space\":return o+\" \"+i;default:return o}},formatDate:(t,n,r)=>{const i=new Date(t),s={timeZone:r},a=new Intl.DateTimeFormat(\"en-US\",{...s,hour12:!1,year:\"numeric\",month:\"numeric\",day:\"numeric\",hour:\"numeric\",minute:\"numeric\",second:\"numeric\"}).formatToParts(i),l={};a.forEach(g=>{g.type!==\"literal\"&&(l[g.type]=g.value)});const c=parseInt(l.day,10),u=parseInt(l.month,10),f=parseInt(l.year,10),d=parseInt(l.hour,10),p=parseInt(l.minute,10),m={d:c,DD:c.toString().padStart(2,\"0\"),M:u,MM:u.toString().padStart(2,\"0\"),MMM:new Date(f,u-1,1).toLocaleString(\"en-US\",{month:\"short\"}),MMMM:new Date(f,u-1,1).toLocaleString(\"en-US\",{month:\"long\"}),yy:f.toString().slice(-2),yyyy:f,H:d,HH:d.toString().padStart(2,\"0\"),h:d%12||12,hh:(d%12||12).toString().padStart(2,\"0\"),m:p,mm:p.toString().padStart(2,\"0\"),A:d<12?\"AM\":\"PM\"};return n.replace(/\\b(?:d|DD|M|MM|MMM|MMMM|yy|yyyy|H|HH|h|hh|m|mm|A)\\b/g,g=>m[g])}}}};function dy(e,t){return function(){return e.apply(t,arguments)}}const{toString:ID}=Object.prototype,{getPrototypeOf:gd}=Object,{iterator:dc,toStringTag:hy}=Symbol,hc=(e=>t=>{const n=ID.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),cr=e=>(e=e.toLowerCase(),t=>hc(t)===e),pc=e=>t=>typeof t===e,{isArray:Ts}=Array,Ao=pc(\"undefined\");function RD(e){return e!==null&&!Ao(e)&&e.constructor!==null&&!Ao(e.constructor)&&Rn(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const py=cr(\"ArrayBuffer\");function PD(e){let t;return typeof ArrayBuffer<\"u\"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&py(e.buffer),t}const LD=pc(\"string\"),Rn=pc(\"function\"),my=pc(\"number\"),mc=e=>e!==null&&typeof e==\"object\",kD=e=>e===!0||e===!1,ka=e=>{if(hc(e)!==\"object\")return!1;const t=gd(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(hy in e)&&!(dc in e)},FD=cr(\"Date\"),VD=cr(\"File\"),BD=cr(\"Blob\"),jD=cr(\"FileList\"),HD=e=>mc(e)&&Rn(e.pipe),UD=e=>{let t;return e&&(typeof FormData==\"function\"&&e instanceof FormData||Rn(e.append)&&((t=hc(e))===\"formdata\"||t===\"object\"&&Rn(e.toString)&&e.toString()===\"[object FormData]\"))},$D=cr(\"URLSearchParams\"),[WD,YD,zD,KD]=[\"ReadableStream\",\"Request\",\"Response\",\"Headers\"].map(cr),GD=e=>e.trim?e.trim():e.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\"\");function Uo(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>\"u\")return;let r,i;if(typeof e!=\"object\"&&(e=[e]),Ts(e))for(r=0,i=e.length;r<i;r++)t.call(null,e[r],r,e);else{const s=n?Object.getOwnPropertyNames(e):Object.keys(e),o=s.length;let a;for(r=0;r<o;r++)a=s[r],t.call(null,e[a],a,e)}}function gy(e,t){t=t.toLowerCase();const n=Object.keys(e);let r=n.length,i;for(;r-- >0;)if(i=n[r],t===i.toLowerCase())return i;return null}const yi=typeof globalThis<\"u\"?globalThis:typeof self<\"u\"?self:typeof window<\"u\"?window:global,vy=e=>!Ao(e)&&e!==yi;function Bu(){const{caseless:e}=vy(this)&&this||{},t={},n=(r,i)=>{const s=e&&gy(t,i)||i;ka(t[s])&&ka(r)?t[s]=Bu(t[s],r):ka(r)?t[s]=Bu({},r):Ts(r)?t[s]=r.slice():t[s]=r};for(let r=0,i=arguments.length;r<i;r++)arguments[r]&&Uo(arguments[r],n);return t}const XD=(e,t,n,{allOwnKeys:r}={})=>(Uo(t,(i,s)=>{n&&Rn(i)?e[s]=dy(i,n):e[s]=i},{allOwnKeys:r}),e),JD=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),ZD=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,\"super\",{value:t.prototype}),n&&Object.assign(e.prototype,n)},QD=(e,t,n,r)=>{let i,s,o;const a={};if(t=t||{},e==null)return t;do{for(i=Object.getOwnPropertyNames(e),s=i.length;s-- >0;)o=i[s],(!r||r(o,e,t))&&!a[o]&&(t[o]=e[o],a[o]=!0);e=n!==!1&&gd(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},qD=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},eC=e=>{if(!e)return null;if(Ts(e))return e;let t=e.length;if(!my(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},tC=(e=>t=>e&&t instanceof e)(typeof Uint8Array<\"u\"&&gd(Uint8Array)),nC=(e,t)=>{const r=(e&&e[dc]).call(e);let i;for(;(i=r.next())&&!i.done;){const s=i.value;t.call(e,s[0],s[1])}},rC=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},iC=cr(\"HTMLFormElement\"),sC=e=>e.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,function(n,r,i){return r.toUpperCase()+i}),Lh=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),oC=cr(\"RegExp\"),yy=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Uo(n,(i,s)=>{let o;(o=t(i,s,e))!==!1&&(r[s]=o||i)}),Object.defineProperties(e,r)},aC=e=>{yy(e,(t,n)=>{if(Rn(e)&&[\"arguments\",\"caller\",\"callee\"].indexOf(n)!==-1)return!1;const r=e[n];if(Rn(r)){if(t.enumerable=!1,\"writable\"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error(\"Can not rewrite read-only method '\"+n+\"'\")})}})},lC=(e,t)=>{const n={},r=i=>{i.forEach(s=>{n[s]=!0})};return Ts(e)?r(e):r(String(e).split(t)),n},cC=()=>{},uC=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function fC(e){return!!(e&&Rn(e.append)&&e[hy]===\"FormData\"&&e[dc])}const dC=e=>{const t=new Array(10),n=(r,i)=>{if(mc(r)){if(t.indexOf(r)>=0)return;if(!(\"toJSON\"in r)){t[i]=r;const s=Ts(r)?[]:{};return Uo(r,(o,a)=>{const l=n(o,i+1);!Ao(l)&&(s[a]=l)}),t[i]=void 0,s}}return r};return n(e,0)},hC=cr(\"AsyncFunction\"),pC=e=>e&&(mc(e)||Rn(e))&&Rn(e.then)&&Rn(e.catch),Ey=((e,t)=>e?setImmediate:t?((n,r)=>(yi.addEventListener(\"message\",({source:i,data:s})=>{i===yi&&s===n&&r.length&&r.shift()()},!1),i=>{r.push(i),yi.postMessage(n,\"*\")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate==\"function\",Rn(yi.postMessage)),mC=typeof queueMicrotask<\"u\"?queueMicrotask.bind(yi):typeof process<\"u\"&&process.nextTick||Ey,gC=e=>e!=null&&Rn(e[dc]),z={isArray:Ts,isArrayBuffer:py,isBuffer:RD,isFormData:UD,isArrayBufferView:PD,isString:LD,isNumber:my,isBoolean:kD,isObject:mc,isPlainObject:ka,isReadableStream:WD,isRequest:YD,isResponse:zD,isHeaders:KD,isUndefined:Ao,isDate:FD,isFile:VD,isBlob:BD,isRegExp:oC,isFunction:Rn,isStream:HD,isURLSearchParams:$D,isTypedArray:tC,isFileList:jD,forEach:Uo,merge:Bu,extend:XD,trim:GD,stripBOM:JD,inherits:ZD,toFlatObject:QD,kindOf:hc,kindOfTest:cr,endsWith:qD,toArray:eC,forEachEntry:nC,matchAll:rC,isHTMLForm:iC,hasOwnProperty:Lh,hasOwnProp:Lh,reduceDescriptors:yy,freezeMethods:aC,toObjectSet:lC,toCamelCase:sC,noop:cC,toFiniteNumber:uC,findKey:gy,global:yi,isContextDefined:vy,isSpecCompliantForm:fC,toJSONObject:dC,isAsyncFn:hC,isThenable:pC,setImmediate:Ey,asap:mC,isIterable:gC};function Ye(e,t,n,r,i){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name=\"AxiosError\",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),i&&(this.response=i,this.status=i.status?i.status:null)}z.inherits(Ye,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:z.toJSONObject(this.config),code:this.code,status:this.status}}});const by=Ye.prototype,Sy={};[\"ERR_BAD_OPTION_VALUE\",\"ERR_BAD_OPTION\",\"ECONNABORTED\",\"ETIMEDOUT\",\"ERR_NETWORK\",\"ERR_FR_TOO_MANY_REDIRECTS\",\"ERR_DEPRECATED\",\"ERR_BAD_RESPONSE\",\"ERR_BAD_REQUEST\",\"ERR_CANCELED\",\"ERR_NOT_SUPPORT\",\"ERR_INVALID_URL\"].forEach(e=>{Sy[e]={value:e}});Object.defineProperties(Ye,Sy);Object.defineProperty(by,\"isAxiosError\",{value:!0});Ye.from=(e,t,n,r,i,s)=>{const o=Object.create(by);return z.toFlatObject(e,o,function(l){return l!==Error.prototype},a=>a!==\"isAxiosError\"),Ye.call(o,e.message,t,n,r,i),o.cause=e,o.name=e.name,s&&Object.assign(o,s),o};const vC=null;function ju(e){return z.isPlainObject(e)||z.isArray(e)}function Ty(e){return z.endsWith(e,\"[]\")?e.slice(0,-2):e}function kh(e,t,n){return e?e.concat(t).map(function(i,s){return i=Ty(i),!n&&s?\"[\"+i+\"]\":i}).join(n?\".\":\"\"):t}function yC(e){return z.isArray(e)&&!e.some(ju)}const EC=z.toFlatObject(z,{},null,function(t){return/^is[A-Z]/.test(t)});function gc(e,t,n){if(!z.isObject(e))throw new TypeError(\"target must be an object\");t=t||new FormData,n=z.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(g,v){return!z.isUndefined(v[g])});const r=n.metaTokens,i=n.visitor||u,s=n.dots,o=n.indexes,l=(n.Blob||typeof Blob<\"u\"&&Blob)&&z.isSpecCompliantForm(t);if(!z.isFunction(i))throw new TypeError(\"visitor must be a function\");function c(m){if(m===null)return\"\";if(z.isDate(m))return m.toISOString();if(z.isBoolean(m))return m.toString();if(!l&&z.isBlob(m))throw new Ye(\"Blob is not supported. Use a Buffer instead.\");return z.isArrayBuffer(m)||z.isTypedArray(m)?l&&typeof Blob==\"function\"?new Blob([m]):Buffer.from(m):m}function u(m,g,v){let w=m;if(m&&!v&&typeof m==\"object\"){if(z.endsWith(g,\"{}\"))g=r?g:g.slice(0,-2),m=JSON.stringify(m);else if(z.isArray(m)&&yC(m)||(z.isFileList(m)||z.endsWith(g,\"[]\"))&&(w=z.toArray(m)))return g=Ty(g),w.forEach(function(y,E){!(z.isUndefined(y)||y===null)&&t.append(o===!0?kh([g],E,s):o===null?g:g+\"[]\",c(y))}),!1}return ju(m)?!0:(t.append(kh(v,g,s),c(m)),!1)}const f=[],d=Object.assign(EC,{defaultVisitor:u,convertValue:c,isVisitable:ju});function p(m,g){if(!z.isUndefined(m)){if(f.indexOf(m)!==-1)throw Error(\"Circular reference detected in \"+g.join(\".\"));f.push(m),z.forEach(m,function(w,S){(!(z.isUndefined(w)||w===null)&&i.call(t,w,z.isString(S)?S.trim():S,g,d))===!0&&p(w,g?g.concat(S):[S])}),f.pop()}}if(!z.isObject(e))throw new TypeError(\"data must be an object\");return p(e),t}function Fh(e){const t={\"!\":\"%21\",\"'\":\"%27\",\"(\":\"%28\",\")\":\"%29\",\"~\":\"%7E\",\"%20\":\"+\",\"%00\":\"\\0\"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function vd(e,t){this._pairs=[],e&&gc(e,this,t)}const wy=vd.prototype;wy.append=function(t,n){this._pairs.push([t,n])};wy.toString=function(t){const n=t?function(r){return t.call(this,r,Fh)}:Fh;return this._pairs.map(function(i){return n(i[0])+\"=\"+n(i[1])},\"\").join(\"&\")};function bC(e){return encodeURIComponent(e).replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%20/g,\"+\").replace(/%5B/gi,\"[\").replace(/%5D/gi,\"]\")}function Dy(e,t,n){if(!t)return e;const r=n&&n.encode||bC;z.isFunction(n)&&(n={serialize:n});const i=n&&n.serialize;let s;if(i?s=i(t,n):s=z.isURLSearchParams(t)?t.toString():new vd(t,n).toString(r),s){const o=e.indexOf(\"#\");o!==-1&&(e=e.slice(0,o)),e+=(e.indexOf(\"?\")===-1?\"?\":\"&\")+s}return e}class Vh{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){z.forEach(this.handlers,function(r){r!==null&&t(r)})}}const Cy={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},SC=typeof URLSearchParams<\"u\"?URLSearchParams:vd,TC=typeof FormData<\"u\"?FormData:null,wC=typeof Blob<\"u\"?Blob:null,DC={isBrowser:!0,classes:{URLSearchParams:SC,FormData:TC,Blob:wC},protocols:[\"http\",\"https\",\"file\",\"blob\",\"url\",\"data\"]},yd=typeof window<\"u\"&&typeof document<\"u\",Hu=typeof navigator==\"object\"&&navigator||void 0,CC=yd&&(!Hu||[\"ReactNative\",\"NativeScript\",\"NS\"].indexOf(Hu.product)<0),OC=typeof WorkerGlobalScope<\"u\"&&self instanceof WorkerGlobalScope&&typeof self.importScripts==\"function\",AC=yd&&window.location.href||\"http://localhost\",_C=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:yd,hasStandardBrowserEnv:CC,hasStandardBrowserWebWorkerEnv:OC,navigator:Hu,origin:AC},Symbol.toStringTag,{value:\"Module\"})),cn={..._C,...DC};function MC(e,t){return gc(e,new cn.classes.URLSearchParams,Object.assign({visitor:function(n,r,i,s){return cn.isNode&&z.isBuffer(n)?(this.append(r,n.toString(\"base64\")),!1):s.defaultVisitor.apply(this,arguments)}},t))}function xC(e){return z.matchAll(/\\w+|\\[(\\w*)]/g,e).map(t=>t[0]===\"[]\"?\"\":t[1]||t[0])}function NC(e){const t={},n=Object.keys(e);let r;const i=n.length;let s;for(r=0;r<i;r++)s=n[r],t[s]=e[s];return t}function Oy(e){function t(n,r,i,s){let o=n[s++];if(o===\"__proto__\")return!0;const a=Number.isFinite(+o),l=s>=n.length;return o=!o&&z.isArray(i)?i.length:o,l?(z.hasOwnProp(i,o)?i[o]=[i[o],r]:i[o]=r,!a):((!i[o]||!z.isObject(i[o]))&&(i[o]=[]),t(n,r,i[o],s)&&z.isArray(i[o])&&(i[o]=NC(i[o])),!a)}if(z.isFormData(e)&&z.isFunction(e.entries)){const n={};return z.forEachEntry(e,(r,i)=>{t(xC(r),i,n,0)}),n}return null}function IC(e,t,n){if(z.isString(e))try{return(t||JSON.parse)(e),z.trim(e)}catch(r){if(r.name!==\"SyntaxError\")throw r}return(n||JSON.stringify)(e)}const $o={transitional:Cy,adapter:[\"xhr\",\"http\",\"fetch\"],transformRequest:[function(t,n){const r=n.getContentType()||\"\",i=r.indexOf(\"application/json\")>-1,s=z.isObject(t);if(s&&z.isHTMLForm(t)&&(t=new FormData(t)),z.isFormData(t))return i?JSON.stringify(Oy(t)):t;if(z.isArrayBuffer(t)||z.isBuffer(t)||z.isStream(t)||z.isFile(t)||z.isBlob(t)||z.isReadableStream(t))return t;if(z.isArrayBufferView(t))return t.buffer;if(z.isURLSearchParams(t))return n.setContentType(\"application/x-www-form-urlencoded;charset=utf-8\",!1),t.toString();let a;if(s){if(r.indexOf(\"application/x-www-form-urlencoded\")>-1)return MC(t,this.formSerializer).toString();if((a=z.isFileList(t))||r.indexOf(\"multipart/form-data\")>-1){const l=this.env&&this.env.FormData;return gc(a?{\"files[]\":t}:t,l&&new l,this.formSerializer)}}return s||i?(n.setContentType(\"application/json\",!1),IC(t)):t}],transformResponse:[function(t){const n=this.transitional||$o.transitional,r=n&&n.forcedJSONParsing,i=this.responseType===\"json\";if(z.isResponse(t)||z.isReadableStream(t))return t;if(t&&z.isString(t)&&(r&&!this.responseType||i)){const o=!(n&&n.silentJSONParsing)&&i;try{return JSON.parse(t)}catch(a){if(o)throw a.name===\"SyntaxError\"?Ye.from(a,Ye.ERR_BAD_RESPONSE,this,null,this.response):a}}return t}],timeout:0,xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",maxContentLength:-1,maxBodyLength:-1,env:{FormData:cn.classes.FormData,Blob:cn.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:\"application/json, text/plain, */*\",\"Content-Type\":void 0}}};z.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\"],e=>{$o.headers[e]={}});const RC=z.toObjectSet([\"age\",\"authorization\",\"content-length\",\"content-type\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modified\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agent\"]),PC=e=>{const t={};let n,r,i;return e&&e.split(`\n`).forEach(function(o){i=o.indexOf(\":\"),n=o.substring(0,i).trim().toLowerCase(),r=o.substring(i+1).trim(),!(!n||t[n]&&RC[n])&&(n===\"set-cookie\"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+\", \"+r:r)}),t},Bh=Symbol(\"internals\");function Ms(e){return e&&String(e).trim().toLowerCase()}function Fa(e){return e===!1||e==null?e:z.isArray(e)?e.map(Fa):String(e)}function LC(e){const t=Object.create(null),n=/([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const kC=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function jc(e,t,n,r,i){if(z.isFunction(r))return r.call(this,t,n);if(i&&(t=n),!!z.isString(t)){if(z.isString(r))return t.indexOf(r)!==-1;if(z.isRegExp(r))return r.test(t)}}function FC(e){return e.trim().toLowerCase().replace(/([a-z\\d])(\\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function VC(e,t){const n=z.toCamelCase(\" \"+t);[\"get\",\"set\",\"has\"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(i,s,o){return this[r].call(this,t,i,s,o)},configurable:!0})})}let Pn=class{constructor(t){t&&this.set(t)}set(t,n,r){const i=this;function s(a,l,c){const u=Ms(l);if(!u)throw new Error(\"header name must be a non-empty string\");const f=z.findKey(i,u);(!f||i[f]===void 0||c===!0||c===void 0&&i[f]!==!1)&&(i[f||l]=Fa(a))}const o=(a,l)=>z.forEach(a,(c,u)=>s(c,u,l));if(z.isPlainObject(t)||t instanceof this.constructor)o(t,n);else if(z.isString(t)&&(t=t.trim())&&!kC(t))o(PC(t),n);else if(z.isObject(t)&&z.isIterable(t)){let a={},l,c;for(const u of t){if(!z.isArray(u))throw TypeError(\"Object iterator must return a key-value pair\");a[c=u[0]]=(l=a[c])?z.isArray(l)?[...l,u[1]]:[l,u[1]]:u[1]}o(a,n)}else t!=null&&s(n,t,r);return this}get(t,n){if(t=Ms(t),t){const r=z.findKey(this,t);if(r){const i=this[r];if(!n)return i;if(n===!0)return LC(i);if(z.isFunction(n))return n.call(this,i,r);if(z.isRegExp(n))return n.exec(i);throw new TypeError(\"parser must be boolean|regexp|function\")}}}has(t,n){if(t=Ms(t),t){const r=z.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||jc(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let i=!1;function s(o){if(o=Ms(o),o){const a=z.findKey(r,o);a&&(!n||jc(r,r[a],a,n))&&(delete r[a],i=!0)}}return z.isArray(t)?t.forEach(s):s(t),i}clear(t){const n=Object.keys(this);let r=n.length,i=!1;for(;r--;){const s=n[r];(!t||jc(this,this[s],s,t,!0))&&(delete this[s],i=!0)}return i}normalize(t){const n=this,r={};return z.forEach(this,(i,s)=>{const o=z.findKey(r,s);if(o){n[o]=Fa(i),delete n[s];return}const a=t?FC(s):String(s).trim();a!==s&&delete n[s],n[a]=Fa(i),r[a]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return z.forEach(this,(r,i)=>{r!=null&&r!==!1&&(n[i]=t&&z.isArray(r)?r.join(\", \"):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+\": \"+n).join(`\n`)}getSetCookie(){return this.get(\"set-cookie\")||[]}get[Symbol.toStringTag](){return\"AxiosHeaders\"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(i=>r.set(i)),r}static accessor(t){const r=(this[Bh]=this[Bh]={accessors:{}}).accessors,i=this.prototype;function s(o){const a=Ms(o);r[a]||(VC(i,o),r[a]=!0)}return z.isArray(t)?t.forEach(s):s(t),this}};Pn.accessor([\"Content-Type\",\"Content-Length\",\"Accept\",\"Accept-Encoding\",\"User-Agent\",\"Authorization\"]);z.reduceDescriptors(Pn.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});z.freezeMethods(Pn);function Hc(e,t){const n=this||$o,r=t||n,i=Pn.from(r.headers);let s=r.data;return z.forEach(e,function(a){s=a.call(n,s,i.normalize(),t?t.status:void 0)}),i.normalize(),s}function Ay(e){return!!(e&&e.__CANCEL__)}function ws(e,t,n){Ye.call(this,e??\"canceled\",Ye.ERR_CANCELED,t,n),this.name=\"CanceledError\"}z.inherits(ws,Ye,{__CANCEL__:!0});function _y(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new Ye(\"Request failed with status code \"+n.status,[Ye.ERR_BAD_REQUEST,Ye.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function BC(e){const t=/^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(e);return t&&t[1]||\"\"}function jC(e,t){e=e||10;const n=new Array(e),r=new Array(e);let i=0,s=0,o;return t=t!==void 0?t:1e3,function(l){const c=Date.now(),u=r[s];o||(o=c),n[i]=l,r[i]=c;let f=s,d=0;for(;f!==i;)d+=n[f++],f=f%e;if(i=(i+1)%e,i===s&&(s=(s+1)%e),c-o<t)return;const p=u&&c-u;return p?Math.round(d*1e3/p):void 0}}function HC(e,t){let n=0,r=1e3/t,i,s;const o=(c,u=Date.now())=>{n=u,i=null,s&&(clearTimeout(s),s=null),e.apply(null,c)};return[(...c)=>{const u=Date.now(),f=u-n;f>=r?o(c,u):(i=c,s||(s=setTimeout(()=>{s=null,o(i)},r-f)))},()=>i&&o(i)]}const gl=(e,t,n=3)=>{let r=0;const i=jC(50,250);return HC(s=>{const o=s.loaded,a=s.lengthComputable?s.total:void 0,l=o-r,c=i(l),u=o<=a;r=o;const f={loaded:o,total:a,progress:a?o/a:void 0,bytes:l,rate:c||void 0,estimated:c&&a&&u?(a-o)/c:void 0,event:s,lengthComputable:a!=null,[t?\"download\":\"upload\"]:!0};e(f)},n)},jh=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},Hh=e=>(...t)=>z.asap(()=>e(...t)),UC=cn.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,cn.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(cn.origin),cn.navigator&&/(msie|trident)/i.test(cn.navigator.userAgent)):()=>!0,$C=cn.hasStandardBrowserEnv?{write(e,t,n,r,i,s){const o=[e+\"=\"+encodeURIComponent(t)];z.isNumber(n)&&o.push(\"expires=\"+new Date(n).toGMTString()),z.isString(r)&&o.push(\"path=\"+r),z.isString(i)&&o.push(\"domain=\"+i),s===!0&&o.push(\"secure\"),document.cookie=o.join(\"; \")},read(e){const t=document.cookie.match(new RegExp(\"(^|;\\\\s*)(\"+e+\")=([^;]*)\"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,\"\",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function WC(e){return/^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(e)}function YC(e,t){return t?e.replace(/\\/?\\/$/,\"\")+\"/\"+t.replace(/^\\/+/,\"\"):e}function My(e,t,n){let r=!WC(t);return e&&(r||n==!1)?YC(e,t):t}const Uh=e=>e instanceof Pn?{...e}:e;function ki(e,t){t=t||{};const n={};function r(c,u,f,d){return z.isPlainObject(c)&&z.isPlainObject(u)?z.merge.call({caseless:d},c,u):z.isPlainObject(u)?z.merge({},u):z.isArray(u)?u.slice():u}function i(c,u,f,d){if(z.isUndefined(u)){if(!z.isUndefined(c))return r(void 0,c,f,d)}else return r(c,u,f,d)}function s(c,u){if(!z.isUndefined(u))return r(void 0,u)}function o(c,u){if(z.isUndefined(u)){if(!z.isUndefined(c))return r(void 0,c)}else return r(void 0,u)}function a(c,u,f){if(f in t)return r(c,u);if(f in e)return r(void 0,c)}const l={url:s,method:s,data:s,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,withXSRFToken:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,beforeRedirect:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:a,headers:(c,u,f)=>i(Uh(c),Uh(u),f,!0)};return z.forEach(Object.keys(Object.assign({},e,t)),function(u){const f=l[u]||i,d=f(e[u],t[u],u);z.isUndefined(d)&&f!==a||(n[u]=d)}),n}const xy=e=>{const t=ki({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:i,xsrfCookieName:s,headers:o,auth:a}=t;t.headers=o=Pn.from(o),t.url=Dy(My(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),a&&o.set(\"Authorization\",\"Basic \"+btoa((a.username||\"\")+\":\"+(a.password?unescape(encodeURIComponent(a.password)):\"\")));let l;if(z.isFormData(n)){if(cn.hasStandardBrowserEnv||cn.hasStandardBrowserWebWorkerEnv)o.setContentType(void 0);else if((l=o.getContentType())!==!1){const[c,...u]=l?l.split(\";\").map(f=>f.trim()).filter(Boolean):[];o.setContentType([c||\"multipart/form-data\",...u].join(\"; \"))}}if(cn.hasStandardBrowserEnv&&(r&&z.isFunction(r)&&(r=r(t)),r||r!==!1&&UC(t.url))){const c=i&&s&&$C.read(s);c&&o.set(i,c)}return t},zC=typeof XMLHttpRequest<\"u\",KC=zC&&function(e){return new Promise(function(n,r){const i=xy(e);let s=i.data;const o=Pn.from(i.headers).normalize();let{responseType:a,onUploadProgress:l,onDownloadProgress:c}=i,u,f,d,p,m;function g(){p&&p(),m&&m(),i.cancelToken&&i.cancelToken.unsubscribe(u),i.signal&&i.signal.removeEventListener(\"abort\",u)}let v=new XMLHttpRequest;v.open(i.method.toUpperCase(),i.url,!0),v.timeout=i.timeout;function w(){if(!v)return;const y=Pn.from(\"getAllResponseHeaders\"in v&&v.getAllResponseHeaders()),C={data:!a||a===\"text\"||a===\"json\"?v.responseText:v.response,status:v.status,statusText:v.statusText,headers:y,config:e,request:v};_y(function(B){n(B),g()},function(B){r(B),g()},C),v=null}\"onloadend\"in v?v.onloadend=w:v.onreadystatechange=function(){!v||v.readyState!==4||v.status===0&&!(v.responseURL&&v.responseURL.indexOf(\"file:\")===0)||setTimeout(w)},v.onabort=function(){v&&(r(new Ye(\"Request aborted\",Ye.ECONNABORTED,e,v)),v=null)},v.onerror=function(){r(new Ye(\"Network Error\",Ye.ERR_NETWORK,e,v)),v=null},v.ontimeout=function(){let E=i.timeout?\"timeout of \"+i.timeout+\"ms exceeded\":\"timeout exceeded\";const C=i.transitional||Cy;i.timeoutErrorMessage&&(E=i.timeoutErrorMessage),r(new Ye(E,C.clarifyTimeoutError?Ye.ETIMEDOUT:Ye.ECONNABORTED,e,v)),v=null},s===void 0&&o.setContentType(null),\"setRequestHeader\"in v&&z.forEach(o.toJSON(),function(E,C){v.setRequestHeader(C,E)}),z.isUndefined(i.withCredentials)||(v.withCredentials=!!i.withCredentials),a&&a!==\"json\"&&(v.responseType=i.responseType),c&&([d,m]=gl(c,!0),v.addEventListener(\"progress\",d)),l&&v.upload&&([f,p]=gl(l),v.upload.addEventListener(\"progress\",f),v.upload.addEventListener(\"loadend\",p)),(i.cancelToken||i.signal)&&(u=y=>{v&&(r(!y||y.type?new ws(null,e,v):y),v.abort(),v=null)},i.cancelToken&&i.cancelToken.subscribe(u),i.signal&&(i.signal.aborted?u():i.signal.addEventListener(\"abort\",u)));const S=BC(i.url);if(S&&cn.protocols.indexOf(S)===-1){r(new Ye(\"Unsupported protocol \"+S+\":\",Ye.ERR_BAD_REQUEST,e));return}v.send(s||null)})},GC=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let r=new AbortController,i;const s=function(c){if(!i){i=!0,a();const u=c instanceof Error?c:this.reason;r.abort(u instanceof Ye?u:new ws(u instanceof Error?u.message:u))}};let o=t&&setTimeout(()=>{o=null,s(new Ye(`timeout ${t} of ms exceeded`,Ye.ETIMEDOUT))},t);const a=()=>{e&&(o&&clearTimeout(o),o=null,e.forEach(c=>{c.unsubscribe?c.unsubscribe(s):c.removeEventListener(\"abort\",s)}),e=null)};e.forEach(c=>c.addEventListener(\"abort\",s));const{signal:l}=r;return l.unsubscribe=()=>z.asap(a),l}},XC=function*(e,t){let n=e.byteLength;if(n<t){yield e;return}let r=0,i;for(;r<n;)i=r+t,yield e.slice(r,i),r=i},JC=async function*(e,t){for await(const n of ZC(e))yield*XC(n,t)},ZC=async function*(e){if(e[Symbol.asyncIterator]){yield*e;return}const t=e.getReader();try{for(;;){const{done:n,value:r}=await t.read();if(n)break;yield r}}finally{await t.cancel()}},$h=(e,t,n,r)=>{const i=JC(e,t);let s=0,o,a=l=>{o||(o=!0,r&&r(l))};return new ReadableStream({async pull(l){try{const{done:c,value:u}=await i.next();if(c){a(),l.close();return}let f=u.byteLength;if(n){let d=s+=f;n(d)}l.enqueue(new Uint8Array(u))}catch(c){throw a(c),c}},cancel(l){return a(l),i.return()}},{highWaterMark:2})},vc=typeof fetch==\"function\"&&typeof Request==\"function\"&&typeof Response==\"function\",Ny=vc&&typeof ReadableStream==\"function\",QC=vc&&(typeof TextEncoder==\"function\"?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),Iy=(e,...t)=>{try{return!!e(...t)}catch{return!1}},qC=Ny&&Iy(()=>{let e=!1;const t=new Request(cn.origin,{body:new ReadableStream,method:\"POST\",get duplex(){return e=!0,\"half\"}}).headers.has(\"Content-Type\");return e&&!t}),Wh=64*1024,Uu=Ny&&Iy(()=>z.isReadableStream(new Response(\"\").body)),vl={stream:Uu&&(e=>e.body)};vc&&(e=>{[\"text\",\"arrayBuffer\",\"blob\",\"formData\",\"stream\"].forEach(t=>{!vl[t]&&(vl[t]=z.isFunction(e[t])?n=>n[t]():(n,r)=>{throw new Ye(`Response type '${t}' is not supported`,Ye.ERR_NOT_SUPPORT,r)})})})(new Response);const eO=async e=>{if(e==null)return 0;if(z.isBlob(e))return e.size;if(z.isSpecCompliantForm(e))return(await new Request(cn.origin,{method:\"POST\",body:e}).arrayBuffer()).byteLength;if(z.isArrayBufferView(e)||z.isArrayBuffer(e))return e.byteLength;if(z.isURLSearchParams(e)&&(e=e+\"\"),z.isString(e))return(await QC(e)).byteLength},tO=async(e,t)=>{const n=z.toFiniteNumber(e.getContentLength());return n??eO(t)},nO=vc&&(async e=>{let{url:t,method:n,data:r,signal:i,cancelToken:s,timeout:o,onDownloadProgress:a,onUploadProgress:l,responseType:c,headers:u,withCredentials:f=\"same-origin\",fetchOptions:d}=xy(e);c=c?(c+\"\").toLowerCase():\"text\";let p=GC([i,s&&s.toAbortSignal()],o),m;const g=p&&p.unsubscribe&&(()=>{p.unsubscribe()});let v;try{if(l&&qC&&n!==\"get\"&&n!==\"head\"&&(v=await tO(u,r))!==0){let C=new Request(t,{method:\"POST\",body:r,duplex:\"half\"}),M;if(z.isFormData(r)&&(M=C.headers.get(\"content-type\"))&&u.setContentType(M),C.body){const[B,j]=jh(v,gl(Hh(l)));r=$h(C.body,Wh,B,j)}}z.isString(f)||(f=f?\"include\":\"omit\");const w=\"credentials\"in Request.prototype;m=new Request(t,{...d,signal:p,method:n.toUpperCase(),headers:u.normalize().toJSON(),body:r,duplex:\"half\",credentials:w?f:void 0});let S=await fetch(m,d);const y=Uu&&(c===\"stream\"||c===\"response\");if(Uu&&(a||y&&g)){const C={};[\"status\",\"statusText\",\"headers\"].forEach(A=>{C[A]=S[A]});const M=z.toFiniteNumber(S.headers.get(\"content-length\")),[B,j]=a&&jh(M,gl(Hh(a),!0))||[];S=new Response($h(S.body,Wh,B,()=>{j&&j(),g&&g()}),C)}c=c||\"text\";let E=await vl[z.findKey(vl,c)||\"text\"](S,e);return!y&&g&&g(),await new Promise((C,M)=>{_y(C,M,{data:E,headers:Pn.from(S.headers),status:S.status,statusText:S.statusText,config:e,request:m})})}catch(w){throw g&&g(),w&&w.name===\"TypeError\"&&/Load failed|fetch/i.test(w.message)?Object.assign(new Ye(\"Network Error\",Ye.ERR_NETWORK,e,m),{cause:w.cause||w}):Ye.from(w,w&&w.code,e,m)}}),$u={http:vC,xhr:KC,fetch:nO};z.forEach($u,(e,t)=>{if(e){try{Object.defineProperty(e,\"name\",{value:t})}catch{}Object.defineProperty(e,\"adapterName\",{value:t})}});const Yh=e=>`- ${e}`,rO=e=>z.isFunction(e)||e===null||e===!1,Ry={getAdapter:e=>{e=z.isArray(e)?e:[e];const{length:t}=e;let n,r;const i={};for(let s=0;s<t;s++){n=e[s];let o;if(r=n,!rO(n)&&(r=$u[(o=String(n)).toLowerCase()],r===void 0))throw new Ye(`Unknown adapter '${o}'`);if(r)break;i[o||\"#\"+s]=r}if(!r){const s=Object.entries(i).map(([a,l])=>`adapter ${a} `+(l===!1?\"is not supported by the environment\":\"is not available in the build\"));let o=t?s.length>1?`since :\n`+s.map(Yh).join(`\n`):\" \"+Yh(s[0]):\"as no adapter specified\";throw new Ye(\"There is no suitable adapter to dispatch the request \"+o,\"ERR_NOT_SUPPORT\")}return r},adapters:$u};function Uc(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new ws(null,e)}function zh(e){return Uc(e),e.headers=Pn.from(e.headers),e.data=Hc.call(e,e.transformRequest),[\"post\",\"put\",\"patch\"].indexOf(e.method)!==-1&&e.headers.setContentType(\"application/x-www-form-urlencoded\",!1),Ry.getAdapter(e.adapter||$o.adapter)(e).then(function(r){return Uc(e),r.data=Hc.call(e,e.transformResponse,r),r.headers=Pn.from(r.headers),r},function(r){return Ay(r)||(Uc(e),r&&r.response&&(r.response.data=Hc.call(e,e.transformResponse,r.response),r.response.headers=Pn.from(r.response.headers))),Promise.reject(r)})}const Py=\"1.10.0\",yc={};[\"object\",\"boolean\",\"number\",\"function\",\"string\",\"symbol\"].forEach((e,t)=>{yc[e]=function(r){return typeof r===e||\"a\"+(t<1?\"n \":\" \")+e}});const Kh={};yc.transitional=function(t,n,r){function i(s,o){return\"[Axios v\"+Py+\"] Transitional option '\"+s+\"'\"+o+(r?\". \"+r:\"\")}return(s,o,a)=>{if(t===!1)throw new Ye(i(o,\" has been removed\"+(n?\" in \"+n:\"\")),Ye.ERR_DEPRECATED);return n&&!Kh[o]&&(Kh[o]=!0,console.warn(i(o,\" has been deprecated since v\"+n+\" and will be removed in the near future\"))),t?t(s,o,a):!0}};yc.spelling=function(t){return(n,r)=>(console.warn(`${r} is likely a misspelling of ${t}`),!0)};function iO(e,t,n){if(typeof e!=\"object\")throw new Ye(\"options must be an object\",Ye.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let i=r.length;for(;i-- >0;){const s=r[i],o=t[s];if(o){const a=e[s],l=a===void 0||o(a,s,e);if(l!==!0)throw new Ye(\"option \"+s+\" must be \"+l,Ye.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new Ye(\"Unknown option \"+s,Ye.ERR_BAD_OPTION)}}const Va={assertOptions:iO,validators:yc},ur=Va.validators;let _i=class{constructor(t){this.defaults=t||{},this.interceptors={request:new Vh,response:new Vh}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let i={};Error.captureStackTrace?Error.captureStackTrace(i):i=new Error;const s=i.stack?i.stack.replace(/^.+\\n/,\"\"):\"\";try{r.stack?s&&!String(r.stack).endsWith(s.replace(/^.+\\n.+\\n/,\"\"))&&(r.stack+=`\n`+s):r.stack=s}catch{}}throw r}}_request(t,n){typeof t==\"string\"?(n=n||{},n.url=t):n=t||{},n=ki(this.defaults,n);const{transitional:r,paramsSerializer:i,headers:s}=n;r!==void 0&&Va.assertOptions(r,{silentJSONParsing:ur.transitional(ur.boolean),forcedJSONParsing:ur.transitional(ur.boolean),clarifyTimeoutError:ur.transitional(ur.boolean)},!1),i!=null&&(z.isFunction(i)?n.paramsSerializer={serialize:i}:Va.assertOptions(i,{encode:ur.function,serialize:ur.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),Va.assertOptions(n,{baseUrl:ur.spelling(\"baseURL\"),withXsrfToken:ur.spelling(\"withXSRFToken\")},!0),n.method=(n.method||this.defaults.method||\"get\").toLowerCase();let o=s&&z.merge(s.common,s[n.method]);s&&z.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\",\"common\"],m=>{delete s[m]}),n.headers=Pn.concat(o,s);const a=[];let l=!0;this.interceptors.request.forEach(function(g){typeof g.runWhen==\"function\"&&g.runWhen(n)===!1||(l=l&&g.synchronous,a.unshift(g.fulfilled,g.rejected))});const c=[];this.interceptors.response.forEach(function(g){c.push(g.fulfilled,g.rejected)});let u,f=0,d;if(!l){const m=[zh.bind(this),void 0];for(m.unshift.apply(m,a),m.push.apply(m,c),d=m.length,u=Promise.resolve(n);f<d;)u=u.then(m[f++],m[f++]);return u}d=a.length;let p=n;for(f=0;f<d;){const m=a[f++],g=a[f++];try{p=m(p)}catch(v){g.call(this,v);break}}try{u=zh.call(this,p)}catch(m){return Promise.reject(m)}for(f=0,d=c.length;f<d;)u=u.then(c[f++],c[f++]);return u}getUri(t){t=ki(this.defaults,t);const n=My(t.baseURL,t.url,t.allowAbsoluteUrls);return Dy(n,t.params,t.paramsSerializer)}};z.forEach([\"delete\",\"get\",\"head\",\"options\"],function(t){_i.prototype[t]=function(n,r){return this.request(ki(r||{},{method:t,url:n,data:(r||{}).data}))}});z.forEach([\"post\",\"put\",\"patch\"],function(t){function n(r){return function(s,o,a){return this.request(ki(a||{},{method:t,headers:r?{\"Content-Type\":\"multipart/form-data\"}:{},url:s,data:o}))}}_i.prototype[t]=n(),_i.prototype[t+\"Form\"]=n(!0)});let sO=class Ly{constructor(t){if(typeof t!=\"function\")throw new TypeError(\"executor must be a function.\");let n;this.promise=new Promise(function(s){n=s});const r=this;this.promise.then(i=>{if(!r._listeners)return;let s=r._listeners.length;for(;s-- >0;)r._listeners[s](i);r._listeners=null}),this.promise.then=i=>{let s;const o=new Promise(a=>{r.subscribe(a),s=a}).then(i);return o.cancel=function(){r.unsubscribe(s)},o},t(function(s,o,a){r.reason||(r.reason=new ws(s,o,a),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new Ly(function(i){t=i}),cancel:t}}};function oO(e){return function(n){return e.apply(null,n)}}function aO(e){return z.isObject(e)&&e.isAxiosError===!0}const Wu={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Wu).forEach(([e,t])=>{Wu[t]=e});function ky(e){const t=new _i(e),n=dy(_i.prototype.request,t);return z.extend(n,_i.prototype,t,{allOwnKeys:!0}),z.extend(n,t,null,{allOwnKeys:!0}),n.create=function(i){return ky(ki(e,i))},n}const Nt=ky($o);Nt.Axios=_i;Nt.CanceledError=ws;Nt.CancelToken=sO;Nt.isCancel=Ay;Nt.VERSION=Py;Nt.toFormData=gc;Nt.AxiosError=Ye;Nt.Cancel=Nt.CanceledError;Nt.all=function(t){return Promise.all(t)};Nt.spread=oO;Nt.isAxiosError=aO;Nt.mergeConfig=ki;Nt.AxiosHeaders=Pn;Nt.formToJSON=e=>Oy(z.isHTMLForm(e)?new FormData(e):e);Nt.getAdapter=Ry.getAdapter;Nt.HttpStatusCode=Wu;Nt.default=Nt;const{Axios:YM,AxiosError:zM,CanceledError:KM,isCancel:GM,CancelToken:XM,VERSION:JM,all:ZM,Cancel:QM,isAxiosError:qM,spread:ex,toFormData:tx,AxiosHeaders:nx,HttpStatusCode:rx,formToJSON:ix,getAdapter:sx,mergeConfig:ox}=Nt;window.axios=Nt;window.axios.defaults.headers.common[\"X-Requested-With\"]=\"XMLHttpRequest\";const lO={install(e){e.config.globalProperties.$axios=Nt}};function cO(e){return{all:e=e||new Map,on:function(t,n){var r=e.get(t);r?r.push(n):e.set(t,[n])},off:function(t,n){var r=e.get(t);r&&(n?r.splice(r.indexOf(n)>>>0,1):e.set(t,[]))},emit:function(t,n){var r=e.get(t);r&&r.slice().map(function(i){i(n)}),(r=e.get(\"*\"))&&r.slice().map(function(i){i(t,n)})}}}const Fy=cO();window.emitter=Fy;const uO={install:(e,t)=>{e.config.globalProperties.$emitter=Fy}};var $c=[\"onChange\",\"onClose\",\"onDayCreate\",\"onDestroy\",\"onKeyDown\",\"onMonthChange\",\"onOpen\",\"onParseConfig\",\"onReady\",\"onValueUpdate\",\"onYearChange\",\"onPreCalendarPosition\"],is={_disable:[],allowInput:!1,allowInvalidPreload:!1,altFormat:\"F j, Y\",altInput:!1,altInputClass:\"form-control input\",animate:typeof window==\"object\"&&window.navigator.userAgent.indexOf(\"MSIE\")===-1,ariaDateFormat:\"F j, Y\",autoFillDefaultTime:!0,clickOpens:!0,closeOnSelect:!0,conjunction:\", \",dateFormat:\"Y-m-d\",defaultHour:12,defaultMinute:0,defaultSeconds:0,disable:[],disableMobile:!1,enableSeconds:!1,enableTime:!1,errorHandler:function(e){return typeof console<\"u\"&&console.warn(e)},getWeek:function(e){var t=new Date(e.getTime());t.setHours(0,0,0,0),t.setDate(t.getDate()+3-(t.getDay()+6)%7);var n=new Date(t.getFullYear(),0,4);return 1+Math.round(((t.getTime()-n.getTime())/864e5-3+(n.getDay()+6)%7)/7)},hourIncrement:1,ignoredFocusElements:[],inline:!1,locale:\"default\",minuteIncrement:5,mode:\"single\",monthSelectorType:\"dropdown\",nextArrow:\"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>\",noCalendar:!1,now:new Date,onChange:[],onClose:[],onDayCreate:[],onDestroy:[],onKeyDown:[],onMonthChange:[],onOpen:[],onParseConfig:[],onReady:[],onValueUpdate:[],onYearChange:[],onPreCalendarPosition:[],plugins:[],position:\"auto\",positionElement:void 0,prevArrow:\"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>\",shorthandCurrentMonth:!1,showMonths:1,static:!1,time_24hr:!1,weekNumbers:!1,wrap:!1},_o={weekdays:{shorthand:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],longhand:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},months:{shorthand:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],longhand:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:function(e){var t=e%100;if(t>3&&t<21)return\"th\";switch(t%10){case 1:return\"st\";case 2:return\"nd\";case 3:return\"rd\";default:return\"th\"}},rangeSeparator:\" to \",weekAbbreviation:\"Wk\",scrollTitle:\"Scroll to increment\",toggleTitle:\"Click to toggle\",amPM:[\"AM\",\"PM\"],yearAriaLabel:\"Year\",monthAriaLabel:\"Month\",hourAriaLabel:\"Hour\",minuteAriaLabel:\"Minute\",time_24hr:!1},Mn=function(e,t){return t===void 0&&(t=2),(\"000\"+e).slice(t*-1)},Kn=function(e){return e===!0?1:0};function Gh(e,t){var n;return function(){var r=this,i=arguments;clearTimeout(n),n=setTimeout(function(){return e.apply(r,i)},t)}}var Wc=function(e){return e instanceof Array?e:[e]};function hn(e,t,n){if(n===!0)return e.classList.add(t);e.classList.remove(t)}function ot(e,t,n){var r=window.document.createElement(e);return t=t||\"\",n=n||\"\",r.className=t,n!==void 0&&(r.textContent=n),r}function ua(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function Vy(e,t){if(t(e))return e;if(e.parentNode)return Vy(e.parentNode,t)}function fa(e,t){var n=ot(\"div\",\"numInputWrapper\"),r=ot(\"input\",\"numInput \"+e),i=ot(\"span\",\"arrowUp\"),s=ot(\"span\",\"arrowDown\");if(navigator.userAgent.indexOf(\"MSIE 9.0\")===-1?r.type=\"number\":(r.type=\"text\",r.pattern=\"\\\\d*\"),t!==void 0)for(var o in t)r.setAttribute(o,t[o]);return n.appendChild(r),n.appendChild(i),n.appendChild(s),n}function kn(e){try{if(typeof e.composedPath==\"function\"){var t=e.composedPath();return t[0]}return e.target}catch{return e.target}}var Yc=function(){},yl=function(e,t,n){return n.months[t?\"shorthand\":\"longhand\"][e]},fO={D:Yc,F:function(e,t,n){e.setMonth(n.months.longhand.indexOf(t))},G:function(e,t){e.setHours((e.getHours()>=12?12:0)+parseFloat(t))},H:function(e,t){e.setHours(parseFloat(t))},J:function(e,t){e.setDate(parseFloat(t))},K:function(e,t,n){e.setHours(e.getHours()%12+12*Kn(new RegExp(n.amPM[1],\"i\").test(t)))},M:function(e,t,n){e.setMonth(n.months.shorthand.indexOf(t))},S:function(e,t){e.setSeconds(parseFloat(t))},U:function(e,t){return new Date(parseFloat(t)*1e3)},W:function(e,t,n){var r=parseInt(t),i=new Date(e.getFullYear(),0,2+(r-1)*7,0,0,0,0);return i.setDate(i.getDate()-i.getDay()+n.firstDayOfWeek),i},Y:function(e,t){e.setFullYear(parseFloat(t))},Z:function(e,t){return new Date(t)},d:function(e,t){e.setDate(parseFloat(t))},h:function(e,t){e.setHours((e.getHours()>=12?12:0)+parseFloat(t))},i:function(e,t){e.setMinutes(parseFloat(t))},j:function(e,t){e.setDate(parseFloat(t))},l:Yc,m:function(e,t){e.setMonth(parseFloat(t)-1)},n:function(e,t){e.setMonth(parseFloat(t)-1)},s:function(e,t){e.setSeconds(parseFloat(t))},u:function(e,t){return new Date(parseFloat(t))},w:Yc,y:function(e,t){e.setFullYear(2e3+parseFloat(t))}},gi={D:\"\",F:\"\",G:\"(\\\\d\\\\d|\\\\d)\",H:\"(\\\\d\\\\d|\\\\d)\",J:\"(\\\\d\\\\d|\\\\d)\\\\w+\",K:\"\",M:\"\",S:\"(\\\\d\\\\d|\\\\d)\",U:\"(.+)\",W:\"(\\\\d\\\\d|\\\\d)\",Y:\"(\\\\d{4})\",Z:\"(.+)\",d:\"(\\\\d\\\\d|\\\\d)\",h:\"(\\\\d\\\\d|\\\\d)\",i:\"(\\\\d\\\\d|\\\\d)\",j:\"(\\\\d\\\\d|\\\\d)\",l:\"\",m:\"(\\\\d\\\\d|\\\\d)\",n:\"(\\\\d\\\\d|\\\\d)\",s:\"(\\\\d\\\\d|\\\\d)\",u:\"(.+)\",w:\"(\\\\d\\\\d|\\\\d)\",y:\"(\\\\d{2})\"},no={Z:function(e){return e.toISOString()},D:function(e,t,n){return t.weekdays.shorthand[no.w(e,t,n)]},F:function(e,t,n){return yl(no.n(e,t,n)-1,!1,t)},G:function(e,t,n){return Mn(no.h(e,t,n))},H:function(e){return Mn(e.getHours())},J:function(e,t){return t.ordinal!==void 0?e.getDate()+t.ordinal(e.getDate()):e.getDate()},K:function(e,t){return t.amPM[Kn(e.getHours()>11)]},M:function(e,t){return yl(e.getMonth(),!0,t)},S:function(e){return Mn(e.getSeconds())},U:function(e){return e.getTime()/1e3},W:function(e,t,n){return n.getWeek(e)},Y:function(e){return Mn(e.getFullYear(),4)},d:function(e){return Mn(e.getDate())},h:function(e){return e.getHours()%12?e.getHours()%12:12},i:function(e){return Mn(e.getMinutes())},j:function(e){return e.getDate()},l:function(e,t){return t.weekdays.longhand[e.getDay()]},m:function(e){return Mn(e.getMonth()+1)},n:function(e){return e.getMonth()+1},s:function(e){return e.getSeconds()},u:function(e){return e.getTime()},w:function(e){return e.getDay()},y:function(e){return String(e.getFullYear()).substring(2)}},By=function(e){var t=e.config,n=t===void 0?is:t,r=e.l10n,i=r===void 0?_o:r,s=e.isMobile,o=s===void 0?!1:s;return function(a,l,c){var u=c||i;return n.formatDate!==void 0&&!o?n.formatDate(a,l,u):l.split(\"\").map(function(f,d,p){return no[f]&&p[d-1]!==\"\\\\\"?no[f](a,u,n):f!==\"\\\\\"?f:\"\"}).join(\"\")}},Yu=function(e){var t=e.config,n=t===void 0?is:t,r=e.l10n,i=r===void 0?_o:r;return function(s,o,a,l){if(!(s!==0&&!s)){var c=l||i,u,f=s;if(s instanceof Date)u=new Date(s.getTime());else if(typeof s!=\"string\"&&s.toFixed!==void 0)u=new Date(s);else if(typeof s==\"string\"){var d=o||(n||is).dateFormat,p=String(s).trim();if(p===\"today\")u=new Date,a=!0;else if(n&&n.parseDate)u=n.parseDate(s,d);else if(/Z$/.test(p)||/GMT$/.test(p))u=new Date(s);else{for(var m=void 0,g=[],v=0,w=0,S=\"\";v<d.length;v++){var y=d[v],E=y===\"\\\\\",C=d[v-1]===\"\\\\\"||E;if(gi[y]&&!C){S+=gi[y];var M=new RegExp(S).exec(s);M&&(m=!0)&&g[y!==\"Y\"?\"push\":\"unshift\"]({fn:fO[y],val:M[++w]})}else E||(S+=\".\")}u=!n||!n.noCalendar?new Date(new Date().getFullYear(),0,1,0,0,0,0):new Date(new Date().setHours(0,0,0,0)),g.forEach(function(B){var j=B.fn,A=B.val;return u=j(u,A,c)||u}),u=m?u:void 0}}if(!(u instanceof Date&&!isNaN(u.getTime()))){n.errorHandler(new Error(\"Invalid date provided: \"+f));return}return a===!0&&u.setHours(0,0,0,0),u}}};function Fn(e,t,n){return n===void 0&&(n=!0),n!==!1?new Date(e.getTime()).setHours(0,0,0,0)-new Date(t.getTime()).setHours(0,0,0,0):e.getTime()-t.getTime()}var dO=function(e,t,n){return e>Math.min(t,n)&&e<Math.max(t,n)},zc=function(e,t,n){return e*3600+t*60+n},hO=function(e){var t=Math.floor(e/3600),n=(e-t*3600)/60;return[t,n,e-t*3600-n*60]},pO={DAY:864e5};function Kc(e){var t=e.defaultHour,n=e.defaultMinute,r=e.defaultSeconds;if(e.minDate!==void 0){var i=e.minDate.getHours(),s=e.minDate.getMinutes(),o=e.minDate.getSeconds();t<i&&(t=i),t===i&&n<s&&(n=s),t===i&&n===s&&r<o&&(r=e.minDate.getSeconds())}if(e.maxDate!==void 0){var a=e.maxDate.getHours(),l=e.maxDate.getMinutes();t=Math.min(t,a),t===a&&(n=Math.min(l,n)),t===a&&n===l&&(r=e.maxDate.getSeconds())}return{hours:t,minutes:n,seconds:r}}typeof Object.assign!=\"function\"&&(Object.assign=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];if(!e)throw TypeError(\"Cannot convert undefined or null to object\");for(var r=function(a){a&&Object.keys(a).forEach(function(l){return e[l]=a[l]})},i=0,s=t;i<s.length;i++){var o=s[i];r(o)}return e});var sn=function(){return sn=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++){t=arguments[n];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])}return e},sn.apply(this,arguments)},Xh=function(){for(var e=0,t=0,n=arguments.length;t<n;t++)e+=arguments[t].length;for(var r=Array(e),i=0,t=0;t<n;t++)for(var s=arguments[t],o=0,a=s.length;o<a;o++,i++)r[i]=s[o];return r},mO=300;function gO(e,t){var n={config:sn(sn({},is),Lt.defaultConfig),l10n:_o};n.parseDate=Yu({config:n.config,l10n:n.l10n}),n._handlers=[],n.pluginElements=[],n.loadedPlugins=[],n._bind=g,n._setHoursFromDate=d,n._positionCalendar=se,n.changeMonth=De,n.changeYear=me,n.clear=$e,n.close=Ve,n.onMouseOver=Qe,n._createElement=ot,n.createDay=M,n.destroy=Ke,n.isEnabled=xe,n.jumpToDate=S,n.updateValue=Ee,n.open=N,n.redraw=te,n.set=we,n.setDate=Xe,n.toggle=G;function r(){n.utils={getDaysInMonth:function(b,D){return b===void 0&&(b=n.currentMonth),D===void 0&&(D=n.currentYear),b===1&&(D%4===0&&D%100!==0||D%400===0)?29:n.l10n.daysInMonth[b]}}}function i(){n.element=n.input=e,n.isOpen=!1,Q(),q(),T(),H(),r(),n.isMobile||C(),w(),(n.selectedDates.length||n.config.noCalendar)&&(n.config.enableTime&&d(n.config.noCalendar?n.latestSelectedDateObj:void 0),Ee(!1)),a();var b=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);!n.isMobile&&b&&se(),X(\"onReady\")}function s(){var b;return((b=n.calendarContainer)===null||b===void 0?void 0:b.getRootNode()).activeElement||document.activeElement}function o(b){return b.bind(n)}function a(){var b=n.config;b.weekNumbers===!1&&b.showMonths===1||b.noCalendar!==!0&&window.requestAnimationFrame(function(){if(n.calendarContainer!==void 0&&(n.calendarContainer.style.visibility=\"hidden\",n.calendarContainer.style.display=\"block\"),n.daysContainer!==void 0){var D=(n.days.offsetWidth+1)*b.showMonths;n.daysContainer.style.width=D+\"px\",n.calendarContainer.style.width=D+(n.weekWrapper!==void 0?n.weekWrapper.offsetWidth:0)+\"px\",n.calendarContainer.style.removeProperty(\"visibility\"),n.calendarContainer.style.removeProperty(\"display\")}})}function l(b){if(n.selectedDates.length===0){var D=n.config.minDate===void 0||Fn(new Date,n.config.minDate)>=0?new Date:new Date(n.config.minDate.getTime()),R=Kc(n.config);D.setHours(R.hours,R.minutes,R.seconds,D.getMilliseconds()),n.selectedDates=[D],n.latestSelectedDateObj=D}b!==void 0&&b.type!==\"blur\"&&it(b);var K=n._input.value;f(),Ee(),n._input.value!==K&&n._debouncedChange()}function c(b,D){return b%12+12*Kn(D===n.l10n.amPM[1])}function u(b){switch(b%24){case 0:case 12:return 12;default:return b%12}}function f(){if(!(n.hourElement===void 0||n.minuteElement===void 0)){var b=(parseInt(n.hourElement.value.slice(-2),10)||0)%24,D=(parseInt(n.minuteElement.value,10)||0)%60,R=n.secondElement!==void 0?(parseInt(n.secondElement.value,10)||0)%60:0;n.amPM!==void 0&&(b=c(b,n.amPM.textContent));var K=n.config.minTime!==void 0||n.config.minDate&&n.minDateHasTime&&n.latestSelectedDateObj&&Fn(n.latestSelectedDateObj,n.config.minDate,!0)===0,fe=n.config.maxTime!==void 0||n.config.maxDate&&n.maxDateHasTime&&n.latestSelectedDateObj&&Fn(n.latestSelectedDateObj,n.config.maxDate,!0)===0;if(n.config.maxTime!==void 0&&n.config.minTime!==void 0&&n.config.minTime>n.config.maxTime){var pe=zc(n.config.minTime.getHours(),n.config.minTime.getMinutes(),n.config.minTime.getSeconds()),je=zc(n.config.maxTime.getHours(),n.config.maxTime.getMinutes(),n.config.maxTime.getSeconds()),Ce=zc(b,D,R);if(Ce>je&&Ce<pe){var Ge=hO(pe);b=Ge[0],D=Ge[1],R=Ge[2]}}else{if(fe){var be=n.config.maxTime!==void 0?n.config.maxTime:n.config.maxDate;b=Math.min(b,be.getHours()),b===be.getHours()&&(D=Math.min(D,be.getMinutes())),D===be.getMinutes()&&(R=Math.min(R,be.getSeconds()))}if(K){var Re=n.config.minTime!==void 0?n.config.minTime:n.config.minDate;b=Math.max(b,Re.getHours()),b===Re.getHours()&&D<Re.getMinutes()&&(D=Re.getMinutes()),D===Re.getMinutes()&&(R=Math.max(R,Re.getSeconds()))}}p(b,D,R)}}function d(b){var D=b||n.latestSelectedDateObj;D&&D instanceof Date&&p(D.getHours(),D.getMinutes(),D.getSeconds())}function p(b,D,R){n.latestSelectedDateObj!==void 0&&n.latestSelectedDateObj.setHours(b%24,D,R||0,0),!(!n.hourElement||!n.minuteElement||n.isMobile)&&(n.hourElement.value=Mn(n.config.time_24hr?b:(12+b)%12+12*Kn(b%12===0)),n.minuteElement.value=Mn(D),n.amPM!==void 0&&(n.amPM.textContent=n.l10n.amPM[Kn(b>=12)]),n.secondElement!==void 0&&(n.secondElement.value=Mn(R)))}function m(b){var D=kn(b),R=parseInt(D.value)+(b.delta||0);(R/1e3>1||b.key===\"Enter\"&&!/[^\\d]/.test(R.toString()))&&me(R)}function g(b,D,R,K){if(D instanceof Array)return D.forEach(function(fe){return g(b,fe,R,K)});if(b instanceof Array)return b.forEach(function(fe){return g(fe,D,R,K)});b.addEventListener(D,R,K),n._handlers.push({remove:function(){return b.removeEventListener(D,R,K)}})}function v(){X(\"onChange\")}function w(){if(n.config.wrap&&[\"open\",\"close\",\"toggle\",\"clear\"].forEach(function(R){Array.prototype.forEach.call(n.element.querySelectorAll(\"[data-\"+R+\"]\"),function(K){return g(K,\"click\",n[R])})}),n.isMobile){F();return}var b=Gh(_,50);if(n._debouncedChange=Gh(v,mO),n.daysContainer&&!/iPhone|iPad|iPod/i.test(navigator.userAgent)&&g(n.daysContainer,\"mouseover\",function(R){n.config.mode===\"range\"&&Qe(kn(R))}),g(n._input,\"keydown\",dt),n.calendarContainer!==void 0&&g(n.calendarContainer,\"keydown\",dt),!n.config.inline&&!n.config.static&&g(window,\"resize\",b),window.ontouchstart!==void 0?g(window.document,\"touchstart\",re):g(window.document,\"mousedown\",re),g(window.document,\"focus\",re,{capture:!0}),n.config.clickOpens===!0&&(g(n._input,\"focus\",n.open),g(n._input,\"click\",n.open)),n.daysContainer!==void 0&&(g(n.monthNav,\"click\",_e),g(n.monthNav,[\"keyup\",\"increment\"],m),g(n.daysContainer,\"click\",ce)),n.timeContainer!==void 0&&n.minuteElement!==void 0&&n.hourElement!==void 0){var D=function(R){return kn(R).select()};g(n.timeContainer,[\"increment\"],l),g(n.timeContainer,\"blur\",l,{capture:!0}),g(n.timeContainer,\"click\",y),g([n.hourElement,n.minuteElement],[\"focus\",\"click\"],D),n.secondElement!==void 0&&g(n.secondElement,\"focus\",function(){return n.secondElement&&n.secondElement.select()}),n.amPM!==void 0&&g(n.amPM,\"click\",function(R){l(R)})}n.config.allowInput&&g(n._input,\"blur\",ut)}function S(b,D){var R=b!==void 0?n.parseDate(b):n.latestSelectedDateObj||(n.config.minDate&&n.config.minDate>n.now?n.config.minDate:n.config.maxDate&&n.config.maxDate<n.now?n.config.maxDate:n.now),K=n.currentYear,fe=n.currentMonth;try{R!==void 0&&(n.currentYear=R.getFullYear(),n.currentMonth=R.getMonth())}catch(pe){pe.message=\"Invalid date supplied: \"+R,n.config.errorHandler(pe)}D&&n.currentYear!==K&&(X(\"onYearChange\"),V()),D&&(n.currentYear!==K||n.currentMonth!==fe)&&X(\"onMonthChange\"),n.redraw()}function y(b){var D=kn(b);~D.className.indexOf(\"arrow\")&&E(b,D.classList.contains(\"arrowUp\")?1:-1)}function E(b,D,R){var K=b&&kn(b),fe=R||K&&K.parentNode&&K.parentNode.firstChild,pe=oe(\"increment\");pe.delta=D,fe&&fe.dispatchEvent(pe)}function C(){var b=window.document.createDocumentFragment();if(n.calendarContainer=ot(\"div\",\"flatpickr-calendar\"),n.calendarContainer.tabIndex=-1,!n.config.noCalendar){if(b.appendChild(U()),n.innerContainer=ot(\"div\",\"flatpickr-innerContainer\"),n.config.weekNumbers){var D=ze(),R=D.weekWrapper,K=D.weekNumbers;n.innerContainer.appendChild(R),n.weekNumbers=K,n.weekWrapper=R}n.rContainer=ot(\"div\",\"flatpickr-rContainer\"),n.rContainer.appendChild(ee()),n.daysContainer||(n.daysContainer=ot(\"div\",\"flatpickr-days\"),n.daysContainer.tabIndex=-1),P(),n.rContainer.appendChild(n.daysContainer),n.innerContainer.appendChild(n.rContainer),b.appendChild(n.innerContainer)}n.config.enableTime&&b.appendChild(W()),hn(n.calendarContainer,\"rangeMode\",n.config.mode===\"range\"),hn(n.calendarContainer,\"animate\",n.config.animate===!0),hn(n.calendarContainer,\"multiMonth\",n.config.showMonths>1),n.calendarContainer.appendChild(b);var fe=n.config.appendTo!==void 0&&n.config.appendTo.nodeType!==void 0;if((n.config.inline||n.config.static)&&(n.calendarContainer.classList.add(n.config.inline?\"inline\":\"static\"),n.config.inline&&(!fe&&n.element.parentNode?n.element.parentNode.insertBefore(n.calendarContainer,n._input.nextSibling):n.config.appendTo!==void 0&&n.config.appendTo.appendChild(n.calendarContainer)),n.config.static)){var pe=ot(\"div\",\"flatpickr-wrapper\");n.element.parentNode&&n.element.parentNode.insertBefore(pe,n.element),pe.appendChild(n.element),n.altInput&&pe.appendChild(n.altInput),pe.appendChild(n.calendarContainer)}!n.config.static&&!n.config.inline&&(n.config.appendTo!==void 0?n.config.appendTo:window.document.body).appendChild(n.calendarContainer)}function M(b,D,R,K){var fe=xe(D,!0),pe=ot(\"span\",b,D.getDate().toString());return pe.dateObj=D,pe.$i=K,pe.setAttribute(\"aria-label\",n.formatDate(D,n.config.ariaDateFormat)),b.indexOf(\"hidden\")===-1&&Fn(D,n.now)===0&&(n.todayDateElem=pe,pe.classList.add(\"today\"),pe.setAttribute(\"aria-current\",\"date\")),fe?(pe.tabIndex=-1,ae(D)&&(pe.classList.add(\"selected\"),n.selectedDateElem=pe,n.config.mode===\"range\"&&(hn(pe,\"startRange\",n.selectedDates[0]&&Fn(D,n.selectedDates[0],!0)===0),hn(pe,\"endRange\",n.selectedDates[1]&&Fn(D,n.selectedDates[1],!0)===0),b===\"nextMonthDay\"&&pe.classList.add(\"inRange\")))):pe.classList.add(\"flatpickr-disabled\"),n.config.mode===\"range\"&&he(D)&&!ae(D)&&pe.classList.add(\"inRange\"),n.weekNumbers&&n.config.showMonths===1&&b!==\"prevMonthDay\"&&K%7===6&&n.weekNumbers.insertAdjacentHTML(\"beforeend\",\"<span class='flatpickr-day'>\"+n.config.getWeek(D)+\"</span>\"),X(\"onDayCreate\",pe),pe}function B(b){b.focus(),n.config.mode===\"range\"&&Qe(b)}function j(b){for(var D=b>0?0:n.config.showMonths-1,R=b>0?n.config.showMonths:-1,K=D;K!=R;K+=b)for(var fe=n.daysContainer.children[K],pe=b>0?0:fe.children.length-1,je=b>0?fe.children.length:-1,Ce=pe;Ce!=je;Ce+=b){var Ge=fe.children[Ce];if(Ge.className.indexOf(\"hidden\")===-1&&xe(Ge.dateObj))return Ge}}function A(b,D){for(var R=b.className.indexOf(\"Month\")===-1?b.dateObj.getMonth():n.currentMonth,K=D>0?n.config.showMonths:-1,fe=D>0?1:-1,pe=R-n.currentMonth;pe!=K;pe+=fe)for(var je=n.daysContainer.children[pe],Ce=R-n.currentMonth===pe?b.$i+D:D<0?je.children.length-1:0,Ge=je.children.length,be=Ce;be>=0&&be<Ge&&be!=(D>0?Ge:-1);be+=fe){var Re=je.children[be];if(Re.className.indexOf(\"hidden\")===-1&&xe(Re.dateObj)&&Math.abs(b.$i-be)>=Math.abs(D))return B(Re)}n.changeMonth(fe),x(j(fe),0)}function x(b,D){var R=s(),K=Ne(R||document.body),fe=b!==void 0?b:K?R:n.selectedDateElem!==void 0&&Ne(n.selectedDateElem)?n.selectedDateElem:n.todayDateElem!==void 0&&Ne(n.todayDateElem)?n.todayDateElem:j(D>0?1:-1);fe===void 0?n._input.focus():K?A(fe,D):B(fe)}function k(b,D){for(var R=(new Date(b,D,1).getDay()-n.l10n.firstDayOfWeek+7)%7,K=n.utils.getDaysInMonth((D-1+12)%12,b),fe=n.utils.getDaysInMonth(D,b),pe=window.document.createDocumentFragment(),je=n.config.showMonths>1,Ce=je?\"prevMonthDay hidden\":\"prevMonthDay\",Ge=je?\"nextMonthDay hidden\":\"nextMonthDay\",be=K+1-R,Re=0;be<=K;be++,Re++)pe.appendChild(M(\"flatpickr-day \"+Ce,new Date(b,D-1,be),be,Re));for(be=1;be<=fe;be++,Re++)pe.appendChild(M(\"flatpickr-day\",new Date(b,D,be),be,Re));for(var ft=fe+1;ft<=42-R&&(n.config.showMonths===1||Re%7!==0);ft++,Re++)pe.appendChild(M(\"flatpickr-day \"+Ge,new Date(b,D+1,ft%fe),ft,Re));var Ln=ot(\"div\",\"dayContainer\");return Ln.appendChild(pe),Ln}function P(){if(n.daysContainer!==void 0){ua(n.daysContainer),n.weekNumbers&&ua(n.weekNumbers);for(var b=document.createDocumentFragment(),D=0;D<n.config.showMonths;D++){var R=new Date(n.currentYear,n.currentMonth,1);R.setMonth(n.currentMonth+D),b.appendChild(k(R.getFullYear(),R.getMonth()))}n.daysContainer.appendChild(b),n.days=n.daysContainer.firstChild,n.config.mode===\"range\"&&n.selectedDates.length===1&&Qe()}}function V(){if(!(n.config.showMonths>1||n.config.monthSelectorType!==\"dropdown\")){var b=function(K){return n.config.minDate!==void 0&&n.currentYear===n.config.minDate.getFullYear()&&K<n.config.minDate.getMonth()?!1:!(n.config.maxDate!==void 0&&n.currentYear===n.config.maxDate.getFullYear()&&K>n.config.maxDate.getMonth())};n.monthsDropdownContainer.tabIndex=-1,n.monthsDropdownContainer.innerHTML=\"\";for(var D=0;D<12;D++)if(b(D)){var R=ot(\"option\",\"flatpickr-monthDropdown-month\");R.value=new Date(n.currentYear,D).getMonth().toString(),R.textContent=yl(D,n.config.shorthandCurrentMonth,n.l10n),R.tabIndex=-1,n.currentMonth===D&&(R.selected=!0),n.monthsDropdownContainer.appendChild(R)}}}function $(){var b=ot(\"div\",\"flatpickr-month\"),D=window.document.createDocumentFragment(),R;n.config.showMonths>1||n.config.monthSelectorType===\"static\"?R=ot(\"span\",\"cur-month\"):(n.monthsDropdownContainer=ot(\"select\",\"flatpickr-monthDropdown-months\"),n.monthsDropdownContainer.setAttribute(\"aria-label\",n.l10n.monthAriaLabel),g(n.monthsDropdownContainer,\"change\",function(je){var Ce=kn(je),Ge=parseInt(Ce.value,10);n.changeMonth(Ge-n.currentMonth),X(\"onMonthChange\")}),V(),R=n.monthsDropdownContainer);var K=fa(\"cur-year\",{tabindex:\"-1\"}),fe=K.getElementsByTagName(\"input\")[0];fe.setAttribute(\"aria-label\",n.l10n.yearAriaLabel),n.config.minDate&&fe.setAttribute(\"min\",n.config.minDate.getFullYear().toString()),n.config.maxDate&&(fe.setAttribute(\"max\",n.config.maxDate.getFullYear().toString()),fe.disabled=!!n.config.minDate&&n.config.minDate.getFullYear()===n.config.maxDate.getFullYear());var pe=ot(\"div\",\"flatpickr-current-month\");return pe.appendChild(R),pe.appendChild(K),D.appendChild(pe),b.appendChild(D),{container:b,yearElement:fe,monthElement:R}}function Z(){ua(n.monthNav),n.monthNav.appendChild(n.prevMonthNav),n.config.showMonths&&(n.yearElements=[],n.monthElements=[]);for(var b=n.config.showMonths;b--;){var D=$();n.yearElements.push(D.yearElement),n.monthElements.push(D.monthElement),n.monthNav.appendChild(D.container)}n.monthNav.appendChild(n.nextMonthNav)}function U(){return n.monthNav=ot(\"div\",\"flatpickr-months\"),n.yearElements=[],n.monthElements=[],n.prevMonthNav=ot(\"span\",\"flatpickr-prev-month\"),n.prevMonthNav.innerHTML=n.config.prevArrow,n.nextMonthNav=ot(\"span\",\"flatpickr-next-month\"),n.nextMonthNav.innerHTML=n.config.nextArrow,Z(),Object.defineProperty(n,\"_hidePrevMonthArrow\",{get:function(){return n.__hidePrevMonthArrow},set:function(b){n.__hidePrevMonthArrow!==b&&(hn(n.prevMonthNav,\"flatpickr-disabled\",b),n.__hidePrevMonthArrow=b)}}),Object.defineProperty(n,\"_hideNextMonthArrow\",{get:function(){return n.__hideNextMonthArrow},set:function(b){n.__hideNextMonthArrow!==b&&(hn(n.nextMonthNav,\"flatpickr-disabled\",b),n.__hideNextMonthArrow=b)}}),n.currentYearElement=n.yearElements[0],ue(),n.monthNav}function W(){n.calendarContainer.classList.add(\"hasTime\"),n.config.noCalendar&&n.calendarContainer.classList.add(\"noCalendar\");var b=Kc(n.config);n.timeContainer=ot(\"div\",\"flatpickr-time\"),n.timeContainer.tabIndex=-1;var D=ot(\"span\",\"flatpickr-time-separator\",\":\"),R=fa(\"flatpickr-hour\",{\"aria-label\":n.l10n.hourAriaLabel});n.hourElement=R.getElementsByTagName(\"input\")[0];var K=fa(\"flatpickr-minute\",{\"aria-label\":n.l10n.minuteAriaLabel});if(n.minuteElement=K.getElementsByTagName(\"input\")[0],n.hourElement.tabIndex=n.minuteElement.tabIndex=-1,n.hourElement.value=Mn(n.latestSelectedDateObj?n.latestSelectedDateObj.getHours():n.config.time_24hr?b.hours:u(b.hours)),n.minuteElement.value=Mn(n.latestSelectedDateObj?n.latestSelectedDateObj.getMinutes():b.minutes),n.hourElement.setAttribute(\"step\",n.config.hourIncrement.toString()),n.minuteElement.setAttribute(\"step\",n.config.minuteIncrement.toString()),n.hourElement.setAttribute(\"min\",n.config.time_24hr?\"0\":\"1\"),n.hourElement.setAttribute(\"max\",n.config.time_24hr?\"23\":\"12\"),n.hourElement.setAttribute(\"maxlength\",\"2\"),n.minuteElement.setAttribute(\"min\",\"0\"),n.minuteElement.setAttribute(\"max\",\"59\"),n.minuteElement.setAttribute(\"maxlength\",\"2\"),n.timeContainer.appendChild(R),n.timeContainer.appendChild(D),n.timeContainer.appendChild(K),n.config.time_24hr&&n.timeContainer.classList.add(\"time24hr\"),n.config.enableSeconds){n.timeContainer.classList.add(\"hasSeconds\");var fe=fa(\"flatpickr-second\");n.secondElement=fe.getElementsByTagName(\"input\")[0],n.secondElement.value=Mn(n.latestSelectedDateObj?n.latestSelectedDateObj.getSeconds():b.seconds),n.secondElement.setAttribute(\"step\",n.minuteElement.getAttribute(\"step\")),n.secondElement.setAttribute(\"min\",\"0\"),n.secondElement.setAttribute(\"max\",\"59\"),n.secondElement.setAttribute(\"maxlength\",\"2\"),n.timeContainer.appendChild(ot(\"span\",\"flatpickr-time-separator\",\":\")),n.timeContainer.appendChild(fe)}return n.config.time_24hr||(n.amPM=ot(\"span\",\"flatpickr-am-pm\",n.l10n.amPM[Kn((n.latestSelectedDateObj?n.hourElement.value:n.config.defaultHour)>11)]),n.amPM.title=n.l10n.toggleTitle,n.amPM.tabIndex=-1,n.timeContainer.appendChild(n.amPM)),n.timeContainer}function ee(){n.weekdayContainer?ua(n.weekdayContainer):n.weekdayContainer=ot(\"div\",\"flatpickr-weekdays\");for(var b=n.config.showMonths;b--;){var D=ot(\"div\",\"flatpickr-weekdaycontainer\");n.weekdayContainer.appendChild(D)}return Te(),n.weekdayContainer}function Te(){if(n.weekdayContainer){var b=n.l10n.firstDayOfWeek,D=Xh(n.l10n.weekdays.shorthand);b>0&&b<D.length&&(D=Xh(D.splice(b,D.length),D.splice(0,b)));for(var R=n.config.showMonths;R--;)n.weekdayContainer.children[R].innerHTML=`\n      <span class='flatpickr-weekday'>\n        `+D.join(\"</span><span class='flatpickr-weekday'>\")+`\n      </span>\n      `}}function ze(){n.calendarContainer.classList.add(\"hasWeeks\");var b=ot(\"div\",\"flatpickr-weekwrapper\");b.appendChild(ot(\"span\",\"flatpickr-weekday\",n.l10n.weekAbbreviation));var D=ot(\"div\",\"flatpickr-weeks\");return b.appendChild(D),{weekWrapper:b,weekNumbers:D}}function De(b,D){D===void 0&&(D=!0);var R=D?b:b-n.currentMonth;R<0&&n._hidePrevMonthArrow===!0||R>0&&n._hideNextMonthArrow===!0||(n.currentMonth+=R,(n.currentMonth<0||n.currentMonth>11)&&(n.currentYear+=n.currentMonth>11?1:-1,n.currentMonth=(n.currentMonth+12)%12,X(\"onYearChange\"),V()),P(),X(\"onMonthChange\"),ue())}function $e(b,D){if(b===void 0&&(b=!0),D===void 0&&(D=!0),n.input.value=\"\",n.altInput!==void 0&&(n.altInput.value=\"\"),n.mobileInput!==void 0&&(n.mobileInput.value=\"\"),n.selectedDates=[],n.latestSelectedDateObj=void 0,D===!0&&(n.currentYear=n._initialDate.getFullYear(),n.currentMonth=n._initialDate.getMonth()),n.config.enableTime===!0){var R=Kc(n.config),K=R.hours,fe=R.minutes,pe=R.seconds;p(K,fe,pe)}n.redraw(),b&&X(\"onChange\")}function Ve(){n.isOpen=!1,n.isMobile||(n.calendarContainer!==void 0&&n.calendarContainer.classList.remove(\"open\"),n._input!==void 0&&n._input.classList.remove(\"active\")),X(\"onClose\")}function Ke(){n.config!==void 0&&X(\"onDestroy\");for(var b=n._handlers.length;b--;)n._handlers[b].remove();if(n._handlers=[],n.mobileInput)n.mobileInput.parentNode&&n.mobileInput.parentNode.removeChild(n.mobileInput),n.mobileInput=void 0;else if(n.calendarContainer&&n.calendarContainer.parentNode)if(n.config.static&&n.calendarContainer.parentNode){var D=n.calendarContainer.parentNode;if(D.lastChild&&D.removeChild(D.lastChild),D.parentNode){for(;D.firstChild;)D.parentNode.insertBefore(D.firstChild,D);D.parentNode.removeChild(D)}}else n.calendarContainer.parentNode.removeChild(n.calendarContainer);n.altInput&&(n.input.type=\"text\",n.altInput.parentNode&&n.altInput.parentNode.removeChild(n.altInput),delete n.altInput),n.input&&(n.input.type=n.input._type,n.input.classList.remove(\"flatpickr-input\"),n.input.removeAttribute(\"readonly\")),[\"_showTimeInput\",\"latestSelectedDateObj\",\"_hideNextMonthArrow\",\"_hidePrevMonthArrow\",\"__hideNextMonthArrow\",\"__hidePrevMonthArrow\",\"isMobile\",\"isOpen\",\"selectedDateElem\",\"minDateHasTime\",\"maxDateHasTime\",\"days\",\"daysContainer\",\"_input\",\"_positionElement\",\"innerContainer\",\"rContainer\",\"monthNav\",\"todayDateElem\",\"calendarContainer\",\"weekdayContainer\",\"prevMonthNav\",\"nextMonthNav\",\"monthsDropdownContainer\",\"currentMonthElement\",\"currentYearElement\",\"navigationCurrentMonth\",\"selectedDateElem\",\"config\"].forEach(function(R){try{delete n[R]}catch{}})}function Ie(b){return n.calendarContainer.contains(b)}function re(b){if(n.isOpen&&!n.config.inline){var D=kn(b),R=Ie(D),K=D===n.input||D===n.altInput||n.element.contains(D)||b.path&&b.path.indexOf&&(~b.path.indexOf(n.input)||~b.path.indexOf(n.altInput)),fe=!K&&!R&&!Ie(b.relatedTarget),pe=!n.config.ignoredFocusElements.some(function(je){return je.contains(D)});fe&&pe&&(n.config.allowInput&&n.setDate(n._input.value,!1,n.config.altInput?n.config.altFormat:n.config.dateFormat),n.timeContainer!==void 0&&n.minuteElement!==void 0&&n.hourElement!==void 0&&n.input.value!==\"\"&&n.input.value!==void 0&&l(),n.close(),n.config&&n.config.mode===\"range\"&&n.selectedDates.length===1&&n.clear(!1))}}function me(b){if(!(!b||n.config.minDate&&b<n.config.minDate.getFullYear()||n.config.maxDate&&b>n.config.maxDate.getFullYear())){var D=b,R=n.currentYear!==D;n.currentYear=D||n.currentYear,n.config.maxDate&&n.currentYear===n.config.maxDate.getFullYear()?n.currentMonth=Math.min(n.config.maxDate.getMonth(),n.currentMonth):n.config.minDate&&n.currentYear===n.config.minDate.getFullYear()&&(n.currentMonth=Math.max(n.config.minDate.getMonth(),n.currentMonth)),R&&(n.redraw(),X(\"onYearChange\"),V())}}function xe(b,D){var R;D===void 0&&(D=!0);var K=n.parseDate(b,void 0,D);if(n.config.minDate&&K&&Fn(K,n.config.minDate,D!==void 0?D:!n.minDateHasTime)<0||n.config.maxDate&&K&&Fn(K,n.config.maxDate,D!==void 0?D:!n.maxDateHasTime)>0)return!1;if(!n.config.enable&&n.config.disable.length===0)return!0;if(K===void 0)return!1;for(var fe=!!n.config.enable,pe=(R=n.config.enable)!==null&&R!==void 0?R:n.config.disable,je=0,Ce=void 0;je<pe.length;je++){if(Ce=pe[je],typeof Ce==\"function\"&&Ce(K))return fe;if(Ce instanceof Date&&K!==void 0&&Ce.getTime()===K.getTime())return fe;if(typeof Ce==\"string\"){var Ge=n.parseDate(Ce,void 0,!0);return Ge&&Ge.getTime()===K.getTime()?fe:!fe}else if(typeof Ce==\"object\"&&K!==void 0&&Ce.from&&Ce.to&&K.getTime()>=Ce.from.getTime()&&K.getTime()<=Ce.to.getTime())return fe}return!fe}function Ne(b){return n.daysContainer!==void 0?b.className.indexOf(\"hidden\")===-1&&b.className.indexOf(\"flatpickr-disabled\")===-1&&n.daysContainer.contains(b):!1}function ut(b){var D=b.target===n._input,R=n._input.value.trimEnd()!==ve();D&&R&&!(b.relatedTarget&&Ie(b.relatedTarget))&&n.setDate(n._input.value,!0,b.target===n.altInput?n.config.altFormat:n.config.dateFormat)}function dt(b){var D=kn(b),R=n.config.wrap?e.contains(D):D===n._input,K=n.config.allowInput,fe=n.isOpen&&(!K||!R),pe=n.config.inline&&R&&!K;if(b.keyCode===13&&R){if(K)return n.setDate(n._input.value,!0,D===n.altInput?n.config.altFormat:n.config.dateFormat),n.close(),D.blur();n.open()}else if(Ie(D)||fe||pe){var je=!!n.timeContainer&&n.timeContainer.contains(D);switch(b.keyCode){case 13:je?(b.preventDefault(),l(),Se()):ce(b);break;case 27:b.preventDefault(),Se();break;case 8:case 46:R&&!n.config.allowInput&&(b.preventDefault(),n.clear());break;case 37:case 39:if(!je&&!R){b.preventDefault();var Ce=s();if(n.daysContainer!==void 0&&(K===!1||Ce&&Ne(Ce))){var Ge=b.keyCode===39?1:-1;b.ctrlKey?(b.stopPropagation(),De(Ge),x(j(1),0)):x(void 0,Ge)}}else n.hourElement&&n.hourElement.focus();break;case 38:case 40:b.preventDefault();var be=b.keyCode===40?1:-1;n.daysContainer&&D.$i!==void 0||D===n.input||D===n.altInput?b.ctrlKey?(b.stopPropagation(),me(n.currentYear-be),x(j(1),0)):je||x(void 0,be*7):D===n.currentYearElement?me(n.currentYear-be):n.config.enableTime&&(!je&&n.hourElement&&n.hourElement.focus(),l(b),n._debouncedChange());break;case 9:if(je){var Re=[n.hourElement,n.minuteElement,n.secondElement,n.amPM].concat(n.pluginElements).filter(function(Kt){return Kt}),ft=Re.indexOf(D);if(ft!==-1){var Ln=Re[ft+(b.shiftKey?-1:1)];b.preventDefault(),(Ln||n._input).focus()}}else!n.config.noCalendar&&n.daysContainer&&n.daysContainer.contains(D)&&b.shiftKey&&(b.preventDefault(),n._input.focus());break}}if(n.amPM!==void 0&&D===n.amPM)switch(b.key){case n.l10n.amPM[0].charAt(0):case n.l10n.amPM[0].charAt(0).toLowerCase():n.amPM.textContent=n.l10n.amPM[0],f(),Ee();break;case n.l10n.amPM[1].charAt(0):case n.l10n.amPM[1].charAt(0).toLowerCase():n.amPM.textContent=n.l10n.amPM[1],f(),Ee();break}(R||Ie(D))&&X(\"onKeyDown\",b)}function Qe(b,D){if(D===void 0&&(D=\"flatpickr-day\"),!(n.selectedDates.length!==1||b&&(!b.classList.contains(D)||b.classList.contains(\"flatpickr-disabled\")))){for(var R=b?b.dateObj.getTime():n.days.firstElementChild.dateObj.getTime(),K=n.parseDate(n.selectedDates[0],void 0,!0).getTime(),fe=Math.min(R,n.selectedDates[0].getTime()),pe=Math.max(R,n.selectedDates[0].getTime()),je=!1,Ce=0,Ge=0,be=fe;be<pe;be+=pO.DAY)xe(new Date(be),!0)||(je=je||be>fe&&be<pe,be<K&&(!Ce||be>Ce)?Ce=be:be>K&&(!Ge||be<Ge)&&(Ge=be));var Re=Array.from(n.rContainer.querySelectorAll(\"*:nth-child(-n+\"+n.config.showMonths+\") > .\"+D));Re.forEach(function(ft){var Ln=ft.dateObj,Kt=Ln.getTime(),Ur=Ce>0&&Kt<Ce||Ge>0&&Kt>Ge;if(Ur){ft.classList.add(\"notAllowed\"),[\"inRange\",\"startRange\",\"endRange\"].forEach(function(Zt){ft.classList.remove(Zt)});return}else if(je&&!Ur)return;[\"startRange\",\"inRange\",\"endRange\",\"notAllowed\"].forEach(function(Zt){ft.classList.remove(Zt)}),b!==void 0&&(b.classList.add(R<=n.selectedDates[0].getTime()?\"startRange\":\"endRange\"),K<R&&Kt===K?ft.classList.add(\"startRange\"):K>R&&Kt===K&&ft.classList.add(\"endRange\"),Kt>=Ce&&(Ge===0||Kt<=Ge)&&dO(Kt,K,R)&&ft.classList.add(\"inRange\"))})}}function _(){n.isOpen&&!n.config.static&&!n.config.inline&&se()}function N(b,D){if(D===void 0&&(D=n._positionElement),n.isMobile===!0){if(b){b.preventDefault();var R=kn(b);R&&R.blur()}n.mobileInput!==void 0&&(n.mobileInput.focus(),n.mobileInput.click()),X(\"onOpen\");return}else if(n._input.disabled||n.config.inline)return;var K=n.isOpen;n.isOpen=!0,K||(n.calendarContainer.classList.add(\"open\"),n._input.classList.add(\"active\"),X(\"onOpen\"),se(D)),n.config.enableTime===!0&&n.config.noCalendar===!0&&n.config.allowInput===!1&&(b===void 0||!n.timeContainer.contains(b.relatedTarget))&&setTimeout(function(){return n.hourElement.select()},50)}function Y(b){return function(D){var R=n.config[\"_\"+b+\"Date\"]=n.parseDate(D,n.config.dateFormat),K=n.config[\"_\"+(b===\"min\"?\"max\":\"min\")+\"Date\"];R!==void 0&&(n[b===\"min\"?\"minDateHasTime\":\"maxDateHasTime\"]=R.getHours()>0||R.getMinutes()>0||R.getSeconds()>0),n.selectedDates&&(n.selectedDates=n.selectedDates.filter(function(fe){return xe(fe)}),!n.selectedDates.length&&b===\"min\"&&d(R),Ee()),n.daysContainer&&(te(),R!==void 0?n.currentYearElement[b]=R.getFullYear().toString():n.currentYearElement.removeAttribute(b),n.currentYearElement.disabled=!!K&&R!==void 0&&K.getFullYear()===R.getFullYear())}}function Q(){var b=[\"wrap\",\"weekNumbers\",\"allowInput\",\"allowInvalidPreload\",\"clickOpens\",\"time_24hr\",\"enableTime\",\"noCalendar\",\"altInput\",\"shorthandCurrentMonth\",\"inline\",\"static\",\"enableSeconds\",\"disableMobile\"],D=sn(sn({},JSON.parse(JSON.stringify(e.dataset||{}))),t),R={};n.config.parseDate=D.parseDate,n.config.formatDate=D.formatDate,Object.defineProperty(n.config,\"enable\",{get:function(){return n.config._enable},set:function(Re){n.config._enable=L(Re)}}),Object.defineProperty(n.config,\"disable\",{get:function(){return n.config._disable},set:function(Re){n.config._disable=L(Re)}});var K=D.mode===\"time\";if(!D.dateFormat&&(D.enableTime||K)){var fe=Lt.defaultConfig.dateFormat||is.dateFormat;R.dateFormat=D.noCalendar||K?\"H:i\"+(D.enableSeconds?\":S\":\"\"):fe+\" H:i\"+(D.enableSeconds?\":S\":\"\")}if(D.altInput&&(D.enableTime||K)&&!D.altFormat){var pe=Lt.defaultConfig.altFormat||is.altFormat;R.altFormat=D.noCalendar||K?\"h:i\"+(D.enableSeconds?\":S K\":\" K\"):pe+(\" h:i\"+(D.enableSeconds?\":S\":\"\")+\" K\")}Object.defineProperty(n.config,\"minDate\",{get:function(){return n.config._minDate},set:Y(\"min\")}),Object.defineProperty(n.config,\"maxDate\",{get:function(){return n.config._maxDate},set:Y(\"max\")});var je=function(Re){return function(ft){n.config[Re===\"min\"?\"_minTime\":\"_maxTime\"]=n.parseDate(ft,\"H:i:S\")}};Object.defineProperty(n.config,\"minTime\",{get:function(){return n.config._minTime},set:je(\"min\")}),Object.defineProperty(n.config,\"maxTime\",{get:function(){return n.config._maxTime},set:je(\"max\")}),D.mode===\"time\"&&(n.config.noCalendar=!0,n.config.enableTime=!0),Object.assign(n.config,R,D);for(var Ce=0;Ce<b.length;Ce++)n.config[b[Ce]]=n.config[b[Ce]]===!0||n.config[b[Ce]]===\"true\";$c.filter(function(Re){return n.config[Re]!==void 0}).forEach(function(Re){n.config[Re]=Wc(n.config[Re]||[]).map(o)}),n.isMobile=!n.config.disableMobile&&!n.config.inline&&n.config.mode===\"single\"&&!n.config.disable.length&&!n.config.enable&&!n.config.weekNumbers&&/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);for(var Ce=0;Ce<n.config.plugins.length;Ce++){var Ge=n.config.plugins[Ce](n)||{};for(var be in Ge)$c.indexOf(be)>-1?n.config[be]=Wc(Ge[be]).map(o).concat(n.config[be]):typeof D[be]>\"u\"&&(n.config[be]=Ge[be])}D.altInputClass||(n.config.altInputClass=J().className+\" \"+n.config.altInputClass),X(\"onParseConfig\")}function J(){return n.config.wrap?e.querySelector(\"[data-input]\"):e}function q(){typeof n.config.locale!=\"object\"&&typeof Lt.l10ns[n.config.locale]>\"u\"&&n.config.errorHandler(new Error(\"flatpickr: invalid locale \"+n.config.locale)),n.l10n=sn(sn({},Lt.l10ns.default),typeof n.config.locale==\"object\"?n.config.locale:n.config.locale!==\"default\"?Lt.l10ns[n.config.locale]:void 0),gi.D=\"(\"+n.l10n.weekdays.shorthand.join(\"|\")+\")\",gi.l=\"(\"+n.l10n.weekdays.longhand.join(\"|\")+\")\",gi.M=\"(\"+n.l10n.months.shorthand.join(\"|\")+\")\",gi.F=\"(\"+n.l10n.months.longhand.join(\"|\")+\")\",gi.K=\"(\"+n.l10n.amPM[0]+\"|\"+n.l10n.amPM[1]+\"|\"+n.l10n.amPM[0].toLowerCase()+\"|\"+n.l10n.amPM[1].toLowerCase()+\")\";var b=sn(sn({},t),JSON.parse(JSON.stringify(e.dataset||{})));b.time_24hr===void 0&&Lt.defaultConfig.time_24hr===void 0&&(n.config.time_24hr=n.l10n.time_24hr),n.formatDate=By(n),n.parseDate=Yu({config:n.config,l10n:n.l10n})}function se(b){if(typeof n.config.position==\"function\")return void n.config.position(n,b);if(n.calendarContainer!==void 0){X(\"onPreCalendarPosition\");var D=b||n._positionElement,R=Array.prototype.reduce.call(n.calendarContainer.children,function(Oe,ht){return Oe+ht.offsetHeight},0),K=n.calendarContainer.offsetWidth,fe=n.config.position.split(\" \"),pe=fe[0],je=fe.length>1?fe[1]:null,Ce=D.getBoundingClientRect(),Ge=window.innerHeight-Ce.bottom,be=pe===\"above\"||pe!==\"below\"&&Ge<R&&Ce.top>R,Re=window.pageYOffset+Ce.top+(be?-R-2:D.offsetHeight+2);if(hn(n.calendarContainer,\"arrowTop\",!be),hn(n.calendarContainer,\"arrowBottom\",be),!n.config.inline){var ft=window.pageXOffset+Ce.left,Ln=!1,Kt=!1;je===\"center\"?(ft-=(K-Ce.width)/2,Ln=!0):je===\"right\"&&(ft-=K-Ce.width,Kt=!0),hn(n.calendarContainer,\"arrowLeft\",!Ln&&!Kt),hn(n.calendarContainer,\"arrowCenter\",Ln),hn(n.calendarContainer,\"arrowRight\",Kt);var Ur=window.document.body.offsetWidth-(window.pageXOffset+Ce.right),Zt=ft+K>window.document.body.offsetWidth,Go=Ur+K>window.document.body.offsetWidth;if(hn(n.calendarContainer,\"rightMost\",Zt),!n.config.static)if(n.calendarContainer.style.top=Re+\"px\",!Zt)n.calendarContainer.style.left=ft+\"px\",n.calendarContainer.style.right=\"auto\";else if(!Go)n.calendarContainer.style.left=\"auto\",n.calendarContainer.style.right=Ur+\"px\";else{var ji=ne();if(ji===void 0)return;var Xo=window.document.body.offsetWidth,Jo=Math.max(0,Xo/2-K/2),Dc=\".flatpickr-calendar.centerMost:before\",Me=\".flatpickr-calendar.centerMost:after\",I=ji.cssRules.length,le=\"{left:\"+Ce.left+\"px;right:auto;}\";hn(n.calendarContainer,\"rightMost\",!1),hn(n.calendarContainer,\"centerMost\",!0),ji.insertRule(Dc+\",\"+Me+le,I),n.calendarContainer.style.left=Jo+\"px\",n.calendarContainer.style.right=\"auto\"}}}}function ne(){for(var b=null,D=0;D<document.styleSheets.length;D++){var R=document.styleSheets[D];if(R.cssRules){try{R.cssRules}catch{continue}b=R;break}}return b??ie()}function ie(){var b=document.createElement(\"style\");return document.head.appendChild(b),b.sheet}function te(){n.config.noCalendar||n.isMobile||(V(),ue(),P())}function Se(){n._input.focus(),window.navigator.userAgent.indexOf(\"MSIE\")!==-1||navigator.msMaxTouchPoints!==void 0?setTimeout(n.close,0):n.close()}function ce(b){b.preventDefault(),b.stopPropagation();var D=function(Re){return Re.classList&&Re.classList.contains(\"flatpickr-day\")&&!Re.classList.contains(\"flatpickr-disabled\")&&!Re.classList.contains(\"notAllowed\")},R=Vy(kn(b),D);if(R!==void 0){var K=R,fe=n.latestSelectedDateObj=new Date(K.dateObj.getTime()),pe=(fe.getMonth()<n.currentMonth||fe.getMonth()>n.currentMonth+n.config.showMonths-1)&&n.config.mode!==\"range\";if(n.selectedDateElem=K,n.config.mode===\"single\")n.selectedDates=[fe];else if(n.config.mode===\"multiple\"){var je=ae(fe);je?n.selectedDates.splice(parseInt(je),1):n.selectedDates.push(fe)}else n.config.mode===\"range\"&&(n.selectedDates.length===2&&n.clear(!1,!1),n.latestSelectedDateObj=fe,n.selectedDates.push(fe),Fn(fe,n.selectedDates[0],!0)!==0&&n.selectedDates.sort(function(Re,ft){return Re.getTime()-ft.getTime()}));if(f(),pe){var Ce=n.currentYear!==fe.getFullYear();n.currentYear=fe.getFullYear(),n.currentMonth=fe.getMonth(),Ce&&(X(\"onYearChange\"),V()),X(\"onMonthChange\")}if(ue(),P(),Ee(),!pe&&n.config.mode!==\"range\"&&n.config.showMonths===1?B(K):n.selectedDateElem!==void 0&&n.hourElement===void 0&&n.selectedDateElem&&n.selectedDateElem.focus(),n.hourElement!==void 0&&n.hourElement!==void 0&&n.hourElement.focus(),n.config.closeOnSelect){var Ge=n.config.mode===\"single\"&&!n.config.enableTime,be=n.config.mode===\"range\"&&n.selectedDates.length===2&&!n.config.enableTime;(Ge||be)&&Se()}v()}}var ge={locale:[q,Te],showMonths:[Z,a,ee],minDate:[S],maxDate:[S],positionElement:[O],clickOpens:[function(){n.config.clickOpens===!0?(g(n._input,\"focus\",n.open),g(n._input,\"click\",n.open)):(n._input.removeEventListener(\"focus\",n.open),n._input.removeEventListener(\"click\",n.open))}]};function we(b,D){if(b!==null&&typeof b==\"object\"){Object.assign(n.config,b);for(var R in b)ge[R]!==void 0&&ge[R].forEach(function(K){return K()})}else n.config[b]=D,ge[b]!==void 0?ge[b].forEach(function(K){return K()}):$c.indexOf(b)>-1&&(n.config[b]=Wc(D));n.redraw(),Ee(!0)}function Fe(b,D){var R=[];if(b instanceof Array)R=b.map(function(K){return n.parseDate(K,D)});else if(b instanceof Date||typeof b==\"number\")R=[n.parseDate(b,D)];else if(typeof b==\"string\")switch(n.config.mode){case\"single\":case\"time\":R=[n.parseDate(b,D)];break;case\"multiple\":R=b.split(n.config.conjunction).map(function(K){return n.parseDate(K,D)});break;case\"range\":R=b.split(n.l10n.rangeSeparator).map(function(K){return n.parseDate(K,D)});break}else n.config.errorHandler(new Error(\"Invalid date supplied: \"+JSON.stringify(b)));n.selectedDates=n.config.allowInvalidPreload?R:R.filter(function(K){return K instanceof Date&&xe(K,!1)}),n.config.mode===\"range\"&&n.selectedDates.sort(function(K,fe){return K.getTime()-fe.getTime()})}function Xe(b,D,R){if(D===void 0&&(D=!1),R===void 0&&(R=n.config.dateFormat),b!==0&&!b||b instanceof Array&&b.length===0)return n.clear(D);Fe(b,R),n.latestSelectedDateObj=n.selectedDates[n.selectedDates.length-1],n.redraw(),S(void 0,D),d(),n.selectedDates.length===0&&n.clear(!1),Ee(D),D&&X(\"onChange\")}function L(b){return b.slice().map(function(D){return typeof D==\"string\"||typeof D==\"number\"||D instanceof Date?n.parseDate(D,void 0,!0):D&&typeof D==\"object\"&&D.from&&D.to?{from:n.parseDate(D.from,void 0),to:n.parseDate(D.to,void 0)}:D}).filter(function(D){return D})}function H(){n.selectedDates=[],n.now=n.parseDate(n.config.now)||new Date;var b=n.config.defaultDate||((n.input.nodeName===\"INPUT\"||n.input.nodeName===\"TEXTAREA\")&&n.input.placeholder&&n.input.value===n.input.placeholder?null:n.input.value);b&&Fe(b,n.config.dateFormat),n._initialDate=n.selectedDates.length>0?n.selectedDates[0]:n.config.minDate&&n.config.minDate.getTime()>n.now.getTime()?n.config.minDate:n.config.maxDate&&n.config.maxDate.getTime()<n.now.getTime()?n.config.maxDate:n.now,n.currentYear=n._initialDate.getFullYear(),n.currentMonth=n._initialDate.getMonth(),n.selectedDates.length>0&&(n.latestSelectedDateObj=n.selectedDates[0]),n.config.minTime!==void 0&&(n.config.minTime=n.parseDate(n.config.minTime,\"H:i\")),n.config.maxTime!==void 0&&(n.config.maxTime=n.parseDate(n.config.maxTime,\"H:i\")),n.minDateHasTime=!!n.config.minDate&&(n.config.minDate.getHours()>0||n.config.minDate.getMinutes()>0||n.config.minDate.getSeconds()>0),n.maxDateHasTime=!!n.config.maxDate&&(n.config.maxDate.getHours()>0||n.config.maxDate.getMinutes()>0||n.config.maxDate.getSeconds()>0)}function T(){if(n.input=J(),!n.input){n.config.errorHandler(new Error(\"Invalid input element specified\"));return}n.input._type=n.input.type,n.input.type=\"text\",n.input.classList.add(\"flatpickr-input\"),n._input=n.input,n.config.altInput&&(n.altInput=ot(n.input.nodeName,n.config.altInputClass),n._input=n.altInput,n.altInput.placeholder=n.input.placeholder,n.altInput.disabled=n.input.disabled,n.altInput.required=n.input.required,n.altInput.tabIndex=n.input.tabIndex,n.altInput.type=\"text\",n.input.setAttribute(\"type\",\"hidden\"),!n.config.static&&n.input.parentNode&&n.input.parentNode.insertBefore(n.altInput,n.input.nextSibling)),n.config.allowInput||n._input.setAttribute(\"readonly\",\"readonly\"),O()}function O(){n._positionElement=n.config.positionElement||n._input}function F(){var b=n.config.enableTime?n.config.noCalendar?\"time\":\"datetime-local\":\"date\";n.mobileInput=ot(\"input\",n.input.className+\" flatpickr-mobile\"),n.mobileInput.tabIndex=1,n.mobileInput.type=b,n.mobileInput.disabled=n.input.disabled,n.mobileInput.required=n.input.required,n.mobileInput.placeholder=n.input.placeholder,n.mobileFormatStr=b===\"datetime-local\"?\"Y-m-d\\\\TH:i:S\":b===\"date\"?\"Y-m-d\":\"H:i:S\",n.selectedDates.length>0&&(n.mobileInput.defaultValue=n.mobileInput.value=n.formatDate(n.selectedDates[0],n.mobileFormatStr)),n.config.minDate&&(n.mobileInput.min=n.formatDate(n.config.minDate,\"Y-m-d\")),n.config.maxDate&&(n.mobileInput.max=n.formatDate(n.config.maxDate,\"Y-m-d\")),n.input.getAttribute(\"step\")&&(n.mobileInput.step=String(n.input.getAttribute(\"step\"))),n.input.type=\"hidden\",n.altInput!==void 0&&(n.altInput.type=\"hidden\");try{n.input.parentNode&&n.input.parentNode.insertBefore(n.mobileInput,n.input.nextSibling)}catch{}g(n.mobileInput,\"change\",function(D){n.setDate(kn(D).value,!1,n.mobileFormatStr),X(\"onChange\"),X(\"onClose\")})}function G(b){if(n.isOpen===!0)return n.close();n.open(b)}function X(b,D){if(n.config!==void 0){var R=n.config[b];if(R!==void 0&&R.length>0)for(var K=0;R[K]&&K<R.length;K++)R[K](n.selectedDates,n.input.value,n,D);b===\"onChange\"&&(n.input.dispatchEvent(oe(\"change\")),n.input.dispatchEvent(oe(\"input\")))}}function oe(b){var D=document.createEvent(\"Event\");return D.initEvent(b,!0,!0),D}function ae(b){for(var D=0;D<n.selectedDates.length;D++){var R=n.selectedDates[D];if(R instanceof Date&&Fn(R,b)===0)return\"\"+D}return!1}function he(b){return n.config.mode!==\"range\"||n.selectedDates.length<2?!1:Fn(b,n.selectedDates[0])>=0&&Fn(b,n.selectedDates[1])<=0}function ue(){n.config.noCalendar||n.isMobile||!n.monthNav||(n.yearElements.forEach(function(b,D){var R=new Date(n.currentYear,n.currentMonth,1);R.setMonth(n.currentMonth+D),n.config.showMonths>1||n.config.monthSelectorType===\"static\"?n.monthElements[D].textContent=yl(R.getMonth(),n.config.shorthandCurrentMonth,n.l10n)+\" \":n.monthsDropdownContainer.value=R.getMonth().toString(),b.value=R.getFullYear().toString()}),n._hidePrevMonthArrow=n.config.minDate!==void 0&&(n.currentYear===n.config.minDate.getFullYear()?n.currentMonth<=n.config.minDate.getMonth():n.currentYear<n.config.minDate.getFullYear()),n._hideNextMonthArrow=n.config.maxDate!==void 0&&(n.currentYear===n.config.maxDate.getFullYear()?n.currentMonth+1>n.config.maxDate.getMonth():n.currentYear>n.config.maxDate.getFullYear()))}function ve(b){var D=b||(n.config.altInput?n.config.altFormat:n.config.dateFormat);return n.selectedDates.map(function(R){return n.formatDate(R,D)}).filter(function(R,K,fe){return n.config.mode!==\"range\"||n.config.enableTime||fe.indexOf(R)===K}).join(n.config.mode!==\"range\"?n.config.conjunction:n.l10n.rangeSeparator)}function Ee(b){b===void 0&&(b=!0),n.mobileInput!==void 0&&n.mobileFormatStr&&(n.mobileInput.value=n.latestSelectedDateObj!==void 0?n.formatDate(n.latestSelectedDateObj,n.mobileFormatStr):\"\"),n.input.value=ve(n.config.dateFormat),n.altInput!==void 0&&(n.altInput.value=ve(n.config.altFormat)),b!==!1&&X(\"onValueUpdate\")}function _e(b){var D=kn(b),R=n.prevMonthNav.contains(D),K=n.nextMonthNav.contains(D);R||K?De(R?-1:1):n.yearElements.indexOf(D)>=0?D.select():D.classList.contains(\"arrowUp\")?n.changeYear(n.currentYear+1):D.classList.contains(\"arrowDown\")&&n.changeYear(n.currentYear-1)}function it(b){b.preventDefault();var D=b.type===\"keydown\",R=kn(b),K=R;n.amPM!==void 0&&R===n.amPM&&(n.amPM.textContent=n.l10n.amPM[Kn(n.amPM.textContent===n.l10n.amPM[0])]);var fe=parseFloat(K.getAttribute(\"min\")),pe=parseFloat(K.getAttribute(\"max\")),je=parseFloat(K.getAttribute(\"step\")),Ce=parseInt(K.value,10),Ge=b.delta||(D?b.which===38?1:-1:0),be=Ce+je*Ge;if(typeof K.value<\"u\"&&K.value.length===2){var Re=K===n.hourElement,ft=K===n.minuteElement;be<fe?(be=pe+be+Kn(!Re)+(Kn(Re)&&Kn(!n.amPM)),ft&&E(void 0,-1,n.hourElement)):be>pe&&(be=K===n.hourElement?be-pe-Kn(!n.amPM):fe,ft&&E(void 0,1,n.hourElement)),n.amPM&&Re&&(je===1?be+Ce===23:Math.abs(be-Ce)>je)&&(n.amPM.textContent=n.l10n.amPM[Kn(n.amPM.textContent===n.l10n.amPM[0])]),K.value=Mn(be)}}return i(),n}function ss(e,t){for(var n=Array.prototype.slice.call(e).filter(function(o){return o instanceof HTMLElement}),r=[],i=0;i<n.length;i++){var s=n[i];try{if(s.getAttribute(\"data-fp-omit\")!==null)continue;s._flatpickr!==void 0&&(s._flatpickr.destroy(),s._flatpickr=void 0),s._flatpickr=gO(s,t||{}),r.push(s._flatpickr)}catch(o){console.error(o)}}return r.length===1?r[0]:r}typeof HTMLElement<\"u\"&&typeof HTMLCollection<\"u\"&&typeof NodeList<\"u\"&&(HTMLCollection.prototype.flatpickr=NodeList.prototype.flatpickr=function(e){return ss(this,e)},HTMLElement.prototype.flatpickr=function(e){return ss([this],e)});var Lt=function(e,t){return typeof e==\"string\"?ss(window.document.querySelectorAll(e),t):e instanceof Node?ss([e],t):ss(e,t)};Lt.defaultConfig={};Lt.l10ns={en:sn({},_o),default:sn({},_o)};Lt.localize=function(e){Lt.l10ns.default=sn(sn({},Lt.l10ns.default),e)};Lt.setDefaults=function(e){Lt.defaultConfig=sn(sn({},Lt.defaultConfig),e)};Lt.parseDate=Yu({});Lt.formatDate=By({});Lt.compareDates=Fn;typeof jQuery<\"u\"&&typeof jQuery.fn<\"u\"&&(jQuery.fn.flatpickr=function(e){return ss(this,e)});Date.prototype.fp_incr=function(e){return new Date(this.getFullYear(),this.getMonth(),this.getDate()+(typeof e==\"string\"?parseInt(e,10):e))};typeof window<\"u\"&&(window.flatpickr=Lt);var Wo=typeof globalThis<\"u\"?globalThis:typeof window<\"u\"?window:typeof global<\"u\"?global:typeof self<\"u\"?self:{};function vO(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\"default\")?e.default:e}function Ec(e){if(e.__esModule)return e;var t=e.default;if(typeof t==\"function\"){var n=function r(){return this instanceof r?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};n.prototype=t.prototype}else n={};return Object.defineProperty(n,\"__esModule\",{value:!0}),Object.keys(e).forEach(function(r){var i=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,i.get?i:{enumerable:!0,get:function(){return e[r]}})}),n}var zu={exports:{}};(function(e,t){(function(n,r){r(t)})(Wo,function(n){var r=typeof window<\"u\"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},i={weekdays:{shorthand:[\"Dom\",\"Lun\",\"Mar\",\"Mié\",\"Jue\",\"Vie\",\"Sáb\"],longhand:[\"Domingo\",\"Lunes\",\"Martes\",\"Miércoles\",\"Jueves\",\"Viernes\",\"Sábado\"]},months:{shorthand:[\"Ene\",\"Feb\",\"Mar\",\"Abr\",\"May\",\"Jun\",\"Jul\",\"Ago\",\"Sep\",\"Oct\",\"Nov\",\"Dic\"],longhand:[\"Enero\",\"Febrero\",\"Marzo\",\"Abril\",\"Mayo\",\"Junio\",\"Julio\",\"Agosto\",\"Septiembre\",\"Octubre\",\"Noviembre\",\"Diciembre\"]},ordinal:function(){return\"º\"},firstDayOfWeek:1,rangeSeparator:\" a \",time_24hr:!0};r.l10ns.es=i;var s=r.l10ns;n.Spanish=i,n.default=s,Object.defineProperty(n,\"__esModule\",{value:!0})})})(zu,zu.exports);var yO=zu.exports,Ku={exports:{}};(function(e,t){(function(n,r){r(t)})(Wo,function(n){var r=typeof window<\"u\"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},i={weekdays:{shorthand:[\"أحد\",\"اثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"],longhand:[\"الأحد\",\"الاثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"]},months:{shorthand:[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\",\"11\",\"12\"],longhand:[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"]},firstDayOfWeek:6,rangeSeparator:\" إلى \",weekAbbreviation:\"Wk\",scrollTitle:\"قم بالتمرير للزيادة\",toggleTitle:\"اضغط للتبديل\",amPM:[\"ص\",\"م\"],yearAriaLabel:\"سنة\",monthAriaLabel:\"شهر\",hourAriaLabel:\"ساعة\",minuteAriaLabel:\"دقيقة\",time_24hr:!1};r.l10ns.ar=i;var s=r.l10ns;n.Arabic=i,n.default=s,Object.defineProperty(n,\"__esModule\",{value:!0})})})(Ku,Ku.exports);var EO=Ku.exports,Gu={exports:{}};(function(e,t){(function(n,r){r(t)})(Wo,function(n){var r=typeof window<\"u\"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},i={weekdays:{shorthand:[\"یک\",\"دو\",\"سه\",\"چهار\",\"پنج\",\"جمعه\",\"شنبه\"],longhand:[\"یک‌شنبه\",\"دوشنبه\",\"سه‌شنبه\",\"چهارشنبه\",\"پنچ‌شنبه\",\"جمعه\",\"شنبه\"]},months:{shorthand:[\"ژانویه\",\"فوریه\",\"مارس\",\"آوریل\",\"مه\",\"ژوئن\",\"ژوئیه\",\"اوت\",\"سپتامبر\",\"اکتبر\",\"نوامبر\",\"دسامبر\"],longhand:[\"ژانویه\",\"فوریه\",\"مارس\",\"آوریل\",\"مه\",\"ژوئن\",\"ژوئیه\",\"اوت\",\"سپتامبر\",\"اکتبر\",\"نوامبر\",\"دسامبر\"]},firstDayOfWeek:6,ordinal:function(){return\"\"}};r.l10ns.fa=i;var s=r.l10ns;n.Persian=i,n.default=s,Object.defineProperty(n,\"__esModule\",{value:!0})})})(Gu,Gu.exports);var bO=Gu.exports,Xu={exports:{}};(function(e,t){(function(n,r){r(t)})(Wo,function(n){var r=typeof window<\"u\"&&window.flatpickr!==void 0?window.flatpickr:{l10ns:{}},i={weekdays:{shorthand:[\"Paz\",\"Pzt\",\"Sal\",\"Çar\",\"Per\",\"Cum\",\"Cmt\"],longhand:[\"Pazar\",\"Pazartesi\",\"Salı\",\"Çarşamba\",\"Perşembe\",\"Cuma\",\"Cumartesi\"]},months:{shorthand:[\"Oca\",\"Şub\",\"Mar\",\"Nis\",\"May\",\"Haz\",\"Tem\",\"Ağu\",\"Eyl\",\"Eki\",\"Kas\",\"Ara\"],longhand:[\"Ocak\",\"Şubat\",\"Mart\",\"Nisan\",\"Mayıs\",\"Haziran\",\"Temmuz\",\"Ağustos\",\"Eylül\",\"Ekim\",\"Kasım\",\"Aralık\"]},firstDayOfWeek:1,ordinal:function(){return\".\"},rangeSeparator:\" - \",weekAbbreviation:\"Hf\",scrollTitle:\"Artırmak için kaydırın\",toggleTitle:\"Aç/Kapa\",amPM:[\"ÖÖ\",\"ÖS\"],time_24hr:!0};r.l10ns.tr=i;var s=r.l10ns;n.Turkish=i,n.default=s,Object.defineProperty(n,\"__esModule\",{value:!0})})})(Xu,Xu.exports);var SO=Xu.exports;const TO={install:e=>{window.Flatpickr=Lt,(()=>{const i=document.documentElement.lang||\"en\",o={es:yO.Spanish,ar:EO.Arabic,fa:bO.Persian,tr:SO.Turkish}[i]||null;o&&window.Flatpickr.localize(o)})();const n=i=>{var o;if((o=document.getElementById(\"flatpickr\"))==null||o.remove(),i===\"light\")return;const s=document.createElement(\"link\");s.rel=\"stylesheet\",s.type=\"text/css\",s.href=`https://npmcdn.com/flatpickr/dist/themes/${i}.css`,s.id=\"flatpickr\",document.head.appendChild(s)},r=document.documentElement.classList.contains(\"dark\")?\"dark\":\"light\";n(r),window.emitter.on(\"change-theme\",i=>n(i))}};var Gc={exports:{}},Xc={};const wO=Ec(MD),DO=Ec(lv),CO=Ec(db);/**\n* vue v3.5.16\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/var Jh;function OO(){return Jh||(Jh=1,function(e){Object.defineProperty(e,\"__esModule\",{value:!0});var t=wO,n=DO,r=CO;function i(l){var c=Object.create(null);if(l)for(var u in l)c[u]=l[u];return c.default=l,Object.freeze(c)}var s=i(n);const o=Object.create(null);function a(l,c){if(!r.isString(l))if(l.nodeType)l=l.innerHTML;else return r.NOOP;const u=r.genCacheKey(l,c),f=o[u];if(f)return f;if(l[0]===\"#\"){const g=document.querySelector(l);l=g?g.innerHTML:\"\"}const d=r.extend({hoistStatic:!0,onError:void 0,onWarn:r.NOOP},c);!d.isCustomElement&&typeof customElements<\"u\"&&(d.isCustomElement=g=>!!customElements.get(g));const{code:p}=t.compile(l,d),m=new Function(\"Vue\",p)(s);return m._rc=!0,o[u]=m}n.registerRuntimeCompiler(a),e.compile=a,Object.keys(n).forEach(function(l){l!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,l)&&(e[l]=n[l])})}(Xc)),Xc}var Zh;function jy(){return Zh||(Zh=1,Gc.exports=OO()),Gc.exports}var h=jy();/**\n  * vee-validate v4.15.1\n  * (c) 2025 Abdelrahman Awad\n  * @license MIT\n  */function Yt(e){return typeof e==\"function\"}function Hy(e){return e==null}const Fi=e=>e!==null&&!!e&&typeof e==\"object\"&&!Array.isArray(e);function Ed(e){return Number(e)>=0}function AO(e){const t=parseFloat(e);return isNaN(t)?e:t}function _O(e){return typeof e==\"object\"&&e!==null}function MO(e){return e==null?e===void 0?\"[object Undefined]\":\"[object Null]\":Object.prototype.toString.call(e)}function Qh(e){if(!_O(e)||MO(e)!==\"[object Object]\")return!1;if(Object.getPrototypeOf(e)===null)return!0;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}function Mo(e,t){return Object.keys(t).forEach(n=>{if(Qh(t[n])&&Qh(e[n])){e[n]||(e[n]={}),Mo(e[n],t[n]);return}e[n]=t[n]}),e}function $s(e){const t=e.split(\".\");if(!t.length)return\"\";let n=String(t[0]);for(let r=1;r<t.length;r++){if(Ed(t[r])){n+=`[${t[r]}]`;continue}n+=`.${t[r]}`}return n}const Uy={};function dr(e,t){NO(e,t),Uy[e]=t}function xO(e){return Uy[e]}function NO(e,t){if(!Yt(t))throw new Error(`Extension Error: The validator '${e}' must be a function.`)}function qh(e,t,n){typeof n.value==\"object\"&&(n.value=at(n.value)),!n.enumerable||n.get||n.set||!n.configurable||!n.writable||t===\"__proto__\"?Object.defineProperty(e,t,n):e[t]=n.value}function at(e){if(typeof e!=\"object\")return e;var t=0,n,r,i,s=Object.prototype.toString.call(e);if(s===\"[object Object]\"?i=Object.create(e.__proto__||null):s===\"[object Array]\"?i=Array(e.length):s===\"[object Set]\"?(i=new Set,e.forEach(function(o){i.add(at(o))})):s===\"[object Map]\"?(i=new Map,e.forEach(function(o,a){i.set(at(a),at(o))})):s===\"[object Date]\"?i=new Date(+e):s===\"[object RegExp]\"?i=new RegExp(e.source,e.flags):s===\"[object DataView]\"?i=new e.constructor(at(e.buffer)):s===\"[object ArrayBuffer]\"?i=e.slice(0):s.slice(-6)===\"Array]\"&&(i=new e.constructor(e)),i){for(r=Object.getOwnPropertySymbols(e);t<r.length;t++)qh(i,r[t],Object.getOwnPropertyDescriptor(e,r[t]));for(t=0,r=Object.getOwnPropertyNames(e);t<r.length;t++)Object.hasOwnProperty.call(i,n=r[t])&&i[n]===e[n]||qh(i,n,Object.getOwnPropertyDescriptor(e,n))}return i||e}const bc=Symbol(\"vee-validate-form\"),IO=Symbol(\"vee-validate-form-context\"),RO=Symbol(\"vee-validate-field-instance\"),El=Symbol(\"Default empty value\"),PO=typeof window<\"u\";function Ju(e){return Yt(e)&&!!e.__locatorRef}function ar(e){return!!e&&Yt(e.parse)&&e.__type===\"VVTypedSchema\"}function bl(e){return!!e&&Yt(e.validate)}function Yo(e){return e===\"checkbox\"||e===\"radio\"}function LO(e){return Fi(e)||Array.isArray(e)}function kO(e){return Array.isArray(e)?e.length===0:Fi(e)&&Object.keys(e).length===0}function Sc(e){return/^\\[.+\\]$/i.test(e)}function FO(e){return $y(e)&&e.multiple}function $y(e){return e.tagName===\"SELECT\"}function VO(e,t){const n=![!1,null,void 0,0].includes(t.multiple)&&!Number.isNaN(t.multiple);return e===\"select\"&&\"multiple\"in t&&n}function BO(e,t){return!VO(e,t)&&t.type!==\"file\"&&!Yo(t.type)}function Wy(e){return bd(e)&&e.target&&\"submit\"in e.target}function bd(e){return e?!!(typeof Event<\"u\"&&Yt(Event)&&e instanceof Event||e&&e.srcElement):!1}function ep(e,t){return t in e&&e[t]!==El}function bn(e,t){if(e===t)return!0;if(e&&t&&typeof e==\"object\"&&typeof t==\"object\"){if(e.constructor!==t.constructor)return!1;var n,r,i;if(Array.isArray(e)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(!bn(e[r],t[r]))return!1;return!0}if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(r of e.entries())if(!t.has(r[0]))return!1;for(r of e.entries())if(!bn(r[1],t.get(r[0])))return!1;return!0}if(np(e)&&np(t))return!(e.size!==t.size||e.name!==t.name||e.lastModified!==t.lastModified||e.type!==t.type);if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(r of e.entries())if(!t.has(r[0]))return!1;return!0}if(ArrayBuffer.isView(e)&&ArrayBuffer.isView(t)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(e[r]!==t[r])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();if(e=tp(e),t=tp(t),i=Object.keys(e),n=i.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!Object.prototype.hasOwnProperty.call(t,i[r]))return!1;for(r=n;r--!==0;){var s=i[r];if(!bn(e[s],t[s]))return!1}return!0}return e!==e&&t!==t}function tp(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function np(e){return PO?e instanceof File:!1}function Sd(e){return Sc(e)?e.replace(/\\[|\\]/gi,\"\"):e}function Nn(e,t,n){return e?Sc(t)?e[Sd(t)]:(t||\"\").split(/\\.|\\[(\\d+)\\]/).filter(Boolean).reduce((i,s)=>LO(i)&&s in i?i[s]:n,e):n}function Tr(e,t,n){if(Sc(t)){e[Sd(t)]=n;return}const r=t.split(/\\.|\\[(\\d+)\\]/).filter(Boolean);let i=e;for(let s=0;s<r.length;s++){if(s===r.length-1){i[r[s]]=n;return}(!(r[s]in i)||Hy(i[r[s]]))&&(i[r[s]]=Ed(r[s+1])?[]:{}),i=i[r[s]]}}function Jc(e,t){if(Array.isArray(e)&&Ed(t)){e.splice(Number(t),1);return}Fi(e)&&delete e[t]}function rp(e,t){if(Sc(t)){delete e[Sd(t)];return}const n=t.split(/\\.|\\[(\\d+)\\]/).filter(Boolean);let r=e;for(let s=0;s<n.length;s++){if(s===n.length-1){Jc(r,n[s]);break}if(!(n[s]in r)||Hy(r[n[s]]))break;r=r[n[s]]}const i=n.map((s,o)=>Nn(e,n.slice(0,o).join(\".\")));for(let s=i.length-1;s>=0;s--)if(kO(i[s])){if(s===0){Jc(e,n[0]);continue}Jc(i[s-1],n[s-1])}}function jn(e){return Object.keys(e)}function Yy(e,t=void 0){const n=h.getCurrentInstance();return(n==null?void 0:n.provides[e])||h.inject(e,t)}function ip(e,t,n){if(Array.isArray(e)){const r=[...e],i=r.findIndex(s=>bn(s,t));return i>=0?r.splice(i,1):r.push(t),r}return bn(e,t)?n:t}function sp(e,t=0){let n=null,r=[];return function(...i){return n&&clearTimeout(n),n=setTimeout(()=>{const s=e(...i);r.forEach(o=>o(s)),r=[]},t),new Promise(s=>r.push(s))}}function jO(e,t){return Fi(t)&&t.number?AO(e):e}function Zu(e,t){let n;return async function(...i){const s=e(...i);n=s;const o=await s;return s!==n?o:(n=void 0,t(o,i))}}function Qu(e){return Array.isArray(e)?e:e?[e]:[]}function da(e,t){const n={};for(const r in e)t.includes(r)||(n[r]=e[r]);return n}function HO(e){let t=null,n=[];return function(...r){const i=h.nextTick(()=>{if(t!==i)return;const s=e(...r);n.forEach(o=>o(s)),n=[],t=null});return t=i,new Promise(s=>n.push(s))}}function Td(e,t,n){return t.slots.default?typeof e==\"string\"||!e?t.slots.default(n()):{default:()=>{var r,i;return(i=(r=t.slots).default)===null||i===void 0?void 0:i.call(r,n())}}:t.slots.default}function Zc(e){if(zy(e))return e._value}function zy(e){return\"_value\"in e}function UO(e){return e.type===\"number\"||e.type===\"range\"?Number.isNaN(e.valueAsNumber)?e.value:e.valueAsNumber:e.value}function Sl(e){if(!bd(e))return e;const t=e.target;if(Yo(t.type)&&zy(t))return Zc(t);if(t.type===\"file\"&&t.files){const n=Array.from(t.files);return t.multiple?n:n[0]}if(FO(t))return Array.from(t.options).filter(n=>n.selected&&!n.disabled).map(Zc);if($y(t)){const n=Array.from(t.options).find(r=>r.selected);return n?Zc(n):t.value}return UO(t)}function Ky(e){const t={};return Object.defineProperty(t,\"_$$isNormalized\",{value:!0,writable:!1,enumerable:!1,configurable:!1}),e?Fi(e)&&e._$$isNormalized?e:Fi(e)?Object.keys(e).reduce((n,r)=>{const i=$O(e[r]);return e[r]!==!1&&(n[r]=op(i)),n},t):typeof e!=\"string\"?t:e.split(\"|\").reduce((n,r)=>{const i=WO(r);return i.name&&(n[i.name]=op(i.params)),n},t):t}function $O(e){return e===!0?[]:Array.isArray(e)||Fi(e)?e:[e]}function op(e){const t=n=>typeof n==\"string\"&&n[0]===\"@\"?YO(n.slice(1)):n;return Array.isArray(e)?e.map(t):e instanceof RegExp?[e]:Object.keys(e).reduce((n,r)=>(n[r]=t(e[r]),n),{})}const WO=e=>{let t=[];const n=e.split(\":\")[0];return e.includes(\":\")&&(t=e.split(\":\").slice(1).join(\":\").split(\",\")),{name:n,params:t}};function YO(e){const t=n=>{var r;return(r=Nn(n,e))!==null&&r!==void 0?r:n[e]};return t.__locatorRef=e,t}function zO(e){return Array.isArray(e)?e.filter(Ju):jn(e).filter(t=>Ju(e[t])).map(t=>e[t])}const KO={generateMessage:({field:e})=>`${e} is not valid.`,bails:!0,validateOnBlur:!0,validateOnChange:!0,validateOnInput:!1,validateOnModelUpdate:!0};let qu=Object.assign({},KO);const Ei=()=>qu,GO=e=>{qu=Object.assign(Object.assign({},qu),e)},XO=GO;async function Gy(e,t,n={}){const r=n==null?void 0:n.bails,i={name:(n==null?void 0:n.name)||\"{field}\",rules:t,label:n==null?void 0:n.label,bails:r??!0,formData:(n==null?void 0:n.values)||{}},s=await JO(i,e);return Object.assign(Object.assign({},s),{valid:!s.errors.length})}async function JO(e,t){const n=e.rules;if(ar(n)||bl(n))return QO(t,Object.assign(Object.assign({},e),{rules:n}));if(Yt(n)||Array.isArray(n)){const a={field:e.label||e.name,name:e.name,label:e.label,form:e.formData,value:t},l=Array.isArray(n)?n:[n],c=l.length,u=[];for(let f=0;f<c;f++){const d=l[f],p=await d(t,a);if(!(typeof p!=\"string\"&&!Array.isArray(p)&&p)){if(Array.isArray(p))u.push(...p);else{const g=typeof p==\"string\"?p:Jy(a);u.push(g)}if(e.bails)return{errors:u}}}return{errors:u}}const r=Object.assign(Object.assign({},e),{rules:Ky(n)}),i=[],s=Object.keys(r.rules),o=s.length;for(let a=0;a<o;a++){const l=s[a],c=await qO(r,t,{name:l,params:r.rules[l]});if(c.error&&(i.push(c.error),e.bails))return{errors:i}}return{errors:i}}function ZO(e){return!!e&&e.name===\"ValidationError\"}function Xy(e){return{__type:\"VVTypedSchema\",async parse(n,r){var i;try{return{output:await e.validate(n,{abortEarly:!1,context:(r==null?void 0:r.formData)||{}}),errors:[]}}catch(s){if(!ZO(s))throw s;if(!(!((i=s.inner)===null||i===void 0)&&i.length)&&s.errors.length)return{errors:[{path:s.path,errors:s.errors}]};const o=s.inner.reduce((a,l)=>{const c=l.path||\"\";return a[c]||(a[c]={errors:[],path:c}),a[c].errors.push(...l.errors),a},{});return{errors:Object.values(o)}}}}}async function QO(e,t){const r=await(ar(t.rules)?t.rules:Xy(t.rules)).parse(e,{formData:t.formData}),i=[];for(const s of r.errors)s.errors.length&&i.push(...s.errors);return{value:r.value,errors:i}}async function qO(e,t,n){const r=xO(n.name);if(!r)throw new Error(`No such validator '${n.name}' exists.`);const i=eA(n.params,e.formData),s={field:e.label||e.name,name:e.name,label:e.label,value:t,form:e.formData,rule:Object.assign(Object.assign({},n),{params:i})},o=await r(t,i,s);return typeof o==\"string\"?{error:o}:{error:o?void 0:Jy(s)}}function Jy(e){const t=Ei().generateMessage;return t?t(e):\"Field is invalid\"}function eA(e,t){const n=r=>Ju(r)?r(t):r;return Array.isArray(e)?e.map(n):Object.keys(e).reduce((r,i)=>(r[i]=n(e[i]),r),{})}async function tA(e,t){const r=await(ar(e)?e:Xy(e)).parse(at(t),{formData:at(t)}),i={},s={};for(const o of r.errors){const a=o.errors,l=(o.path||\"\").replace(/\\[\"(\\d+)\"\\]/g,(c,u)=>`[${u}]`);i[l]={valid:!a.length,errors:a},a.length&&(s[l]=a[0])}return{valid:!r.errors.length,results:i,errors:s,values:r.value,source:\"schema\"}}async function nA(e,t,n){const i=jn(e).map(async c=>{var u,f,d;const p=(u=n==null?void 0:n.names)===null||u===void 0?void 0:u[c],m=await Gy(Nn(t,c),e[c],{name:(p==null?void 0:p.name)||c,label:p==null?void 0:p.label,values:t,bails:(d=(f=n==null?void 0:n.bailsMap)===null||f===void 0?void 0:f[c])!==null&&d!==void 0?d:!0});return Object.assign(Object.assign({},m),{path:c})});let s=!0;const o=await Promise.all(i),a={},l={};for(const c of o)a[c.path]={valid:c.valid,errors:c.errors},c.valid||(s=!1,l[c.path]=c.errors[0]);return{valid:s,results:a,errors:l,source:\"schema\"}}let ap=0;function rA(e,t){const{value:n,initialValue:r,setInitialValue:i}=iA(e,t.modelValue,t.form);if(!t.form){let l=function(p){var m;\"value\"in p&&(n.value=p.value),\"errors\"in p&&u(p.errors),\"touched\"in p&&(d.touched=(m=p.touched)!==null&&m!==void 0?m:d.touched),\"initialValue\"in p&&i(p.initialValue)};const{errors:c,setErrors:u}=aA(),f=ap>=Number.MAX_SAFE_INTEGER?0:++ap,d=oA(n,r,c,t.schema);return{id:f,path:e,value:n,initialValue:r,meta:d,flags:{pendingUnmount:{[f]:!1},pendingReset:!1},errors:c,setState:l}}const s=t.form.createPathState(e,{bails:t.bails,label:t.label,type:t.type,validate:t.validate,schema:t.schema}),o=h.computed(()=>s.errors);function a(l){var c,u,f;\"value\"in l&&(n.value=l.value),\"errors\"in l&&((c=t.form)===null||c===void 0||c.setFieldError(h.unref(e),l.errors)),\"touched\"in l&&((u=t.form)===null||u===void 0||u.setFieldTouched(h.unref(e),(f=l.touched)!==null&&f!==void 0?f:!1)),\"initialValue\"in l&&i(l.initialValue)}return{id:Array.isArray(s.id)?s.id[s.id.length-1]:s.id,path:e,value:n,errors:o,meta:s,initialValue:r,flags:s.__flags,setState:a}}function iA(e,t,n){const r=h.ref(h.unref(t));function i(){return n?Nn(n.initialValues.value,h.unref(e),h.unref(r)):h.unref(r)}function s(c){if(!n){r.value=c;return}n.setFieldInitialValue(h.unref(e),c,!0)}const o=h.computed(i);if(!n)return{value:h.ref(i()),initialValue:o,setInitialValue:s};const a=sA(t,n,o,e);return n.stageInitialValue(h.unref(e),a,!0),{value:h.computed({get(){return Nn(n.values,h.unref(e))},set(c){n.setFieldValue(h.unref(e),c,!1)}}),initialValue:o,setInitialValue:s}}function sA(e,t,n,r){return h.isRef(e)?h.unref(e):e!==void 0?e:Nn(t.values,h.unref(r),h.unref(n))}function oA(e,t,n,r){const i=h.computed(()=>{var o,a,l;return(l=(a=(o=h.toValue(r))===null||o===void 0?void 0:o.describe)===null||a===void 0?void 0:a.call(o).required)!==null&&l!==void 0?l:!1}),s=h.reactive({touched:!1,pending:!1,valid:!0,required:i,validated:!!h.unref(n).length,initialValue:h.computed(()=>h.unref(t)),dirty:h.computed(()=>!bn(h.unref(e),h.unref(t)))});return h.watch(n,o=>{s.valid=!o.length},{immediate:!0,flush:\"sync\"}),s}function aA(){const e=h.ref([]);return{errors:e,setErrors:t=>{e.value=Qu(t)}}}function lA(e,t,n){return Yo(n==null?void 0:n.type)?uA(e,t,n):Zy(e,t,n)}function Zy(e,t,n){const{initialValue:r,validateOnMount:i,bails:s,type:o,checkedValue:a,label:l,validateOnValueUpdate:c,uncheckedValue:u,controlled:f,keepValueOnUnmount:d,syncVModel:p,form:m}=cA(n),g=f?Yy(bc):void 0,v=m||g,w=h.computed(()=>$s(h.toValue(e))),S=h.computed(()=>{if(h.toValue(v==null?void 0:v.schema))return;const me=h.unref(t);return bl(me)||ar(me)||Yt(me)||Array.isArray(me)?me:Ky(me)}),y=!Yt(S.value)&&ar(h.toValue(t)),{id:E,value:C,initialValue:M,meta:B,setState:j,errors:A,flags:x}=rA(w,{modelValue:r,form:v,bails:s,label:l,type:o,validate:S.value?U:void 0,schema:y?t:void 0}),k=h.computed(()=>A.value[0]);p&&fA({value:C,prop:p,handleChange:W,shouldValidate:()=>c&&!x.pendingReset});const P=(re,me=!1)=>{B.touched=!0,me&&$()};async function V(re){var me,xe;if(v!=null&&v.validateSchema){const{results:Ne}=await v.validateSchema(re);return(me=Ne[h.toValue(w)])!==null&&me!==void 0?me:{valid:!0,errors:[]}}return S.value?Gy(C.value,S.value,{name:h.toValue(w),label:h.toValue(l),values:(xe=v==null?void 0:v.values)!==null&&xe!==void 0?xe:{},bails:s}):{valid:!0,errors:[]}}const $=Zu(async()=>(B.pending=!0,B.validated=!0,V(\"validated-only\")),re=>(x.pendingUnmount[Ke.id]||(j({errors:re.errors}),B.pending=!1,B.valid=re.valid),re)),Z=Zu(async()=>V(\"silent\"),re=>(B.valid=re.valid,re));function U(re){return(re==null?void 0:re.mode)===\"silent\"?Z():$()}function W(re,me=!0){const xe=Sl(re);De(xe,me)}h.onMounted(()=>{if(i)return $();(!v||!v.validateSchema)&&Z()});function ee(re){B.touched=re}function Te(re){var me;const xe=re&&\"value\"in re?re.value:M.value;j({value:at(xe),initialValue:at(xe),touched:(me=re==null?void 0:re.touched)!==null&&me!==void 0?me:!1,errors:(re==null?void 0:re.errors)||[]}),B.pending=!1,B.validated=!1,Z()}const ze=h.getCurrentInstance();function De(re,me=!0){C.value=ze&&p?jO(re,ze.props.modelModifiers):re,(me?$:Z)()}function $e(re){j({errors:Array.isArray(re)?re:[re]})}const Ve=h.computed({get(){return C.value},set(re){De(re,c)}}),Ke={id:E,name:w,label:l,value:Ve,meta:B,errors:A,errorMessage:k,type:o,checkedValue:a,uncheckedValue:u,bails:s,keepValueOnUnmount:d,resetField:Te,handleReset:()=>Te(),validate:U,handleChange:W,handleBlur:P,setState:j,setTouched:ee,setErrors:$e,setValue:De};if(h.provide(RO,Ke),h.isRef(t)&&typeof h.unref(t)!=\"function\"&&h.watch(t,(re,me)=>{bn(re,me)||(B.validated?$():Z())},{deep:!0}),!v)return Ke;const Ie=h.computed(()=>{const re=S.value;return!re||Yt(re)||bl(re)||ar(re)||Array.isArray(re)?{}:Object.keys(re).reduce((me,xe)=>{const Ne=zO(re[xe]).map(ut=>ut.__locatorRef).reduce((ut,dt)=>{const Qe=Nn(v.values,dt)||v.values[dt];return Qe!==void 0&&(ut[dt]=Qe),ut},{});return Object.assign(me,Ne),me},{})});return h.watch(Ie,(re,me)=>{if(!Object.keys(re).length)return;!bn(re,me)&&(B.validated?$():Z())}),h.onBeforeUnmount(()=>{var re;const me=(re=h.toValue(Ke.keepValueOnUnmount))!==null&&re!==void 0?re:h.toValue(v.keepValuesOnUnmount),xe=h.toValue(w);if(me||!v||x.pendingUnmount[Ke.id]){v==null||v.removePathState(xe,E);return}x.pendingUnmount[Ke.id]=!0;const Ne=v.getPathState(xe);if(Array.isArray(Ne==null?void 0:Ne.id)&&(Ne!=null&&Ne.multiple)?Ne!=null&&Ne.id.includes(Ke.id):(Ne==null?void 0:Ne.id)===Ke.id){if(Ne!=null&&Ne.multiple&&Array.isArray(Ne.value)){const dt=Ne.value.findIndex(Qe=>bn(Qe,h.toValue(Ke.checkedValue)));if(dt>-1){const Qe=[...Ne.value];Qe.splice(dt,1),v.setFieldValue(xe,Qe)}Array.isArray(Ne.id)&&Ne.id.splice(Ne.id.indexOf(Ke.id),1)}else v.unsetPathValue(h.toValue(w));v.removePathState(xe,E)}}),Ke}function cA(e){const t=()=>({initialValue:void 0,validateOnMount:!1,bails:!0,label:void 0,validateOnValueUpdate:!0,keepValueOnUnmount:void 0,syncVModel:!1,controlled:!0}),n=!!(e!=null&&e.syncVModel),r=typeof(e==null?void 0:e.syncVModel)==\"string\"?e.syncVModel:(e==null?void 0:e.modelPropName)||\"modelValue\",i=n&&!(\"initialValue\"in(e||{}))?ef(h.getCurrentInstance(),r):e==null?void 0:e.initialValue;if(!e)return Object.assign(Object.assign({},t()),{initialValue:i});const s=\"valueProp\"in e?e.valueProp:e.checkedValue,o=\"standalone\"in e?!e.standalone:e.controlled,a=(e==null?void 0:e.modelPropName)||(e==null?void 0:e.syncVModel)||!1;return Object.assign(Object.assign(Object.assign({},t()),e||{}),{initialValue:i,controlled:o??!0,checkedValue:s,syncVModel:a})}function uA(e,t,n){const r=n!=null&&n.standalone?void 0:Yy(bc),i=n==null?void 0:n.checkedValue,s=n==null?void 0:n.uncheckedValue;function o(a){const l=a.handleChange,c=h.computed(()=>{const f=h.toValue(a.value),d=h.toValue(i);return Array.isArray(f)?f.findIndex(p=>bn(p,d))>=0:bn(d,f)});function u(f,d=!0){var p,m;if(c.value===((p=f==null?void 0:f.target)===null||p===void 0?void 0:p.checked)){d&&a.validate();return}const g=h.toValue(e),v=r==null?void 0:r.getPathState(g),w=Sl(f);let S=(m=h.toValue(i))!==null&&m!==void 0?m:w;r&&(v!=null&&v.multiple)&&v.type===\"checkbox\"?S=ip(Nn(r.values,g)||[],S,void 0):(n==null?void 0:n.type)===\"checkbox\"&&(S=ip(h.toValue(a.value),S,h.toValue(s))),l(S,d)}return Object.assign(Object.assign({},a),{checked:c,checkedValue:i,uncheckedValue:s,handleChange:u})}return o(Zy(e,t,n))}function fA({prop:e,value:t,handleChange:n,shouldValidate:r}){const i=h.getCurrentInstance();if(!i||!e)return;const s=typeof e==\"string\"?e:\"modelValue\",o=`update:${s}`;s in i.props&&(h.watch(t,a=>{bn(a,ef(i,s))||i.emit(o,a)}),h.watch(()=>ef(i,s),a=>{if(a===El&&t.value===void 0)return;const l=a===El?void 0:a;bn(l,t.value)||n(l,r())}))}function ef(e,t){if(e)return e.props[t]}const dA=h.defineComponent({name:\"Field\",inheritAttrs:!1,props:{as:{type:[String,Object],default:void 0},name:{type:String,required:!0},rules:{type:[Object,String,Function],default:void 0},validateOnMount:{type:Boolean,default:!1},validateOnBlur:{type:Boolean,default:void 0},validateOnChange:{type:Boolean,default:void 0},validateOnInput:{type:Boolean,default:void 0},validateOnModelUpdate:{type:Boolean,default:void 0},bails:{type:Boolean,default:()=>Ei().bails},label:{type:String,default:void 0},uncheckedValue:{type:null,default:void 0},modelValue:{type:null,default:El},modelModifiers:{type:null,default:()=>({})},\"onUpdate:modelValue\":{type:null,default:void 0},standalone:{type:Boolean,default:!1},keepValue:{type:Boolean,default:void 0}},setup(e,t){const n=h.toRef(e,\"rules\"),r=h.toRef(e,\"name\"),i=h.toRef(e,\"label\"),s=h.toRef(e,\"uncheckedValue\"),o=h.toRef(e,\"keepValue\"),{errors:a,value:l,errorMessage:c,validate:u,handleChange:f,handleBlur:d,setTouched:p,resetField:m,handleReset:g,meta:v,checked:w,setErrors:S,setValue:y}=lA(r,n,{validateOnMount:e.validateOnMount,bails:e.bails,standalone:e.standalone,type:t.attrs.type,initialValue:pA(e,t),checkedValue:t.attrs.value,uncheckedValue:s,label:i,validateOnValueUpdate:e.validateOnModelUpdate,keepValueOnUnmount:o,syncVModel:!0}),E=function(x,k=!0){f(x,k)},C=h.computed(()=>{const{validateOnInput:A,validateOnChange:x,validateOnBlur:k,validateOnModelUpdate:P}=hA(e);function V(W){d(W,k),Yt(t.attrs.onBlur)&&t.attrs.onBlur(W)}function $(W){E(W,A),Yt(t.attrs.onInput)&&t.attrs.onInput(W)}function Z(W){E(W,x),Yt(t.attrs.onChange)&&t.attrs.onChange(W)}const U={name:e.name,onBlur:V,onInput:$,onChange:Z};return U[\"onUpdate:modelValue\"]=W=>E(W,P),U}),M=h.computed(()=>{const A=Object.assign({},C.value);Yo(t.attrs.type)&&w&&(A.checked=w.value);const x=lp(e,t);return BO(x,t.attrs)&&(A.value=l.value),A}),B=h.computed(()=>Object.assign(Object.assign({},C.value),{modelValue:l.value}));function j(){return{field:M.value,componentField:B.value,value:l.value,meta:v,errors:a.value,errorMessage:c.value,validate:u,resetField:m,handleChange:E,handleInput:A=>E(A,!1),handleReset:g,handleBlur:C.value.onBlur,setTouched:p,setErrors:S,setValue:y}}return t.expose({value:l,meta:v,errors:a,errorMessage:c,setErrors:S,setTouched:p,setValue:y,reset:m,validate:u,handleChange:f}),()=>{const A=h.resolveDynamicComponent(lp(e,t)),x=Td(A,t,j);return A?h.h(A,Object.assign(Object.assign({},t.attrs),M.value),x):x}}});function lp(e,t){let n=e.as||\"\";return!e.as&&!t.slots.default&&(n=\"input\"),n}function hA(e){var t,n,r,i;const{validateOnInput:s,validateOnChange:o,validateOnBlur:a,validateOnModelUpdate:l}=Ei();return{validateOnInput:(t=e.validateOnInput)!==null&&t!==void 0?t:s,validateOnChange:(n=e.validateOnChange)!==null&&n!==void 0?n:o,validateOnBlur:(r=e.validateOnBlur)!==null&&r!==void 0?r:a,validateOnModelUpdate:(i=e.validateOnModelUpdate)!==null&&i!==void 0?i:l}}function pA(e,t){return Yo(t.attrs.type)?ep(e,\"modelValue\")?e.modelValue:void 0:ep(e,\"modelValue\")?e.modelValue:t.attrs.value}const mA=dA;let gA=0;const ha=[\"bails\",\"fieldsCount\",\"id\",\"multiple\",\"type\",\"validate\"];function Qy(e){const t=(e==null?void 0:e.initialValues)||{},n=Object.assign({},h.toValue(t)),r=h.unref(e==null?void 0:e.validationSchema);return r&&ar(r)&&Yt(r.cast)?at(r.cast(n)||{}):at(n)}function vA(e){var t;const n=gA++,r=(e==null?void 0:e.name)||\"Form\";let i=0;const s=h.ref(!1),o=h.ref(!1),a=h.ref(0),l=[],c=h.reactive(Qy(e)),u=h.ref([]),f=h.ref({}),d=h.ref({}),p=HO(()=>{d.value=u.value.reduce((T,O)=>(T[$s(h.toValue(O.path))]=O,T),{})});function m(T,O){const F=W(T);if(!F){typeof T==\"string\"&&(f.value[$s(T)]=Qu(O));return}if(typeof T==\"string\"){const G=$s(T);f.value[G]&&delete f.value[G]}F.errors=Qu(O),F.valid=!F.errors.length}function g(T){jn(T).forEach(O=>{m(O,T[O])})}e!=null&&e.initialErrors&&g(e.initialErrors);const v=h.computed(()=>{const T=u.value.reduce((O,F)=>(F.errors.length&&(O[h.toValue(F.path)]=F.errors),O),{});return Object.assign(Object.assign({},f.value),T)}),w=h.computed(()=>jn(v.value).reduce((T,O)=>{const F=v.value[O];return F!=null&&F.length&&(T[O]=F[0]),T},{})),S=h.computed(()=>u.value.reduce((T,O)=>(T[h.toValue(O.path)]={name:h.toValue(O.path)||\"\",label:O.label||\"\"},T),{})),y=h.computed(()=>u.value.reduce((T,O)=>{var F;return T[h.toValue(O.path)]=(F=O.bails)!==null&&F!==void 0?F:!0,T},{})),E=Object.assign({},(e==null?void 0:e.initialErrors)||{}),C=(t=e==null?void 0:e.keepValuesOnUnmount)!==null&&t!==void 0?t:!1,{initialValues:M,originalInitialValues:B,setInitialValues:j}=EA(u,c,e),A=yA(u,c,B,w),x=h.computed(()=>u.value.reduce((T,O)=>{const F=Nn(c,h.toValue(O.path));return Tr(T,h.toValue(O.path),F),T},{})),k=e==null?void 0:e.validationSchema;function P(T,O){var F,G;const X=h.computed(()=>Nn(M.value,h.toValue(T))),oe=d.value[h.toValue(T)],ae=(O==null?void 0:O.type)===\"checkbox\"||(O==null?void 0:O.type)===\"radio\";if(oe&&ae){oe.multiple=!0;const b=i++;return Array.isArray(oe.id)?oe.id.push(b):oe.id=[oe.id,b],oe.fieldsCount++,oe.__flags.pendingUnmount[b]=!1,oe}const he=h.computed(()=>Nn(c,h.toValue(T))),ue=h.toValue(T),ve=Te.findIndex(b=>b===ue);ve!==-1&&Te.splice(ve,1);const Ee=h.computed(()=>{var b,D,R,K;const fe=h.toValue(k);if(ar(fe))return(D=(b=fe.describe)===null||b===void 0?void 0:b.call(fe,h.toValue(T)).required)!==null&&D!==void 0?D:!1;const pe=h.toValue(O==null?void 0:O.schema);return ar(pe)&&(K=(R=pe.describe)===null||R===void 0?void 0:R.call(pe).required)!==null&&K!==void 0?K:!1}),_e=i++,it=h.reactive({id:_e,path:T,touched:!1,pending:!1,valid:!0,validated:!!(!((F=E[ue])===null||F===void 0)&&F.length),required:Ee,initialValue:X,errors:h.shallowRef([]),bails:(G=O==null?void 0:O.bails)!==null&&G!==void 0?G:!1,label:O==null?void 0:O.label,type:(O==null?void 0:O.type)||\"default\",value:he,multiple:!1,__flags:{pendingUnmount:{[_e]:!1},pendingReset:!1},fieldsCount:1,validate:O==null?void 0:O.validate,dirty:h.computed(()=>!bn(h.unref(he),h.unref(X)))});return u.value.push(it),d.value[ue]=it,p(),w.value[ue]&&!E[ue]&&h.nextTick(()=>{ne(ue,{mode:\"silent\"})}),h.isRef(T)&&h.watch(T,b=>{p();const D=at(he.value);d.value[b]=it,h.nextTick(()=>{Tr(c,b,D)})}),it}const V=sp(ce,5),$=sp(ce,5),Z=Zu(async T=>await(T===\"silent\"?V():$()),(T,[O])=>{const F=jn(me.errorBag.value),X=[...new Set([...jn(T.results),...u.value.map(oe=>oe.path),...F])].sort().reduce((oe,ae)=>{var he;const ue=ae,ve=W(ue)||ee(ue),Ee=((he=T.results[ue])===null||he===void 0?void 0:he.errors)||[],_e=h.toValue(ve==null?void 0:ve.path)||ue,it=bA({errors:Ee,valid:!Ee.length},oe.results[_e]);return oe.results[_e]=it,it.valid||(oe.errors[_e]=it.errors[0]),ve&&f.value[_e]&&delete f.value[_e],ve?(ve.valid=it.valid,O===\"silent\"||O===\"validated-only\"&&!ve.validated||m(ve,it.errors),oe):(m(_e,Ee),oe)},{valid:T.valid,results:{},errors:{},source:T.source});return T.values&&(X.values=T.values,X.source=T.source),jn(X.results).forEach(oe=>{var ae;const he=W(oe);he&&O!==\"silent\"&&(O===\"validated-only\"&&!he.validated||m(he,(ae=X.results[oe])===null||ae===void 0?void 0:ae.errors))}),X});function U(T){u.value.forEach(T)}function W(T){const O=typeof T==\"string\"?$s(T):T;return typeof O==\"string\"?d.value[O]:O}function ee(T){return u.value.filter(F=>T.startsWith(h.toValue(F.path))).reduce((F,G)=>F?G.path.length>F.path.length?G:F:G,void 0)}let Te=[],ze;function De(T){return Te.push(T),ze||(ze=h.nextTick(()=>{[...Te].sort().reverse().forEach(F=>{rp(c,F)}),Te=[],ze=null})),ze}function $e(T){return function(F,G){return function(oe){return oe instanceof Event&&(oe.preventDefault(),oe.stopPropagation()),U(ae=>ae.touched=!0),s.value=!0,a.value++,se().then(ae=>{const he=at(c);if(ae.valid&&typeof F==\"function\"){const ue=at(x.value);let ve=T?ue:he;return ae.values&&(ve=ae.source===\"schema\"?ae.values:Object.assign({},ve,ae.values)),F(ve,{evt:oe,controlledValues:ue,setErrors:g,setFieldError:m,setTouched:Q,setFieldTouched:Qe,setValues:ut,setFieldValue:xe,resetForm:q,resetField:J})}!ae.valid&&typeof G==\"function\"&&G({values:he,evt:oe,errors:ae.errors,results:ae.results})}).then(ae=>(s.value=!1,ae),ae=>{throw s.value=!1,ae})}}}const Ke=$e(!1);Ke.withControlled=$e(!0);function Ie(T,O){const F=u.value.findIndex(X=>X.path===T&&(Array.isArray(X.id)?X.id.includes(O):X.id===O)),G=u.value[F];if(!(F===-1||!G)){if(h.nextTick(()=>{ne(T,{mode:\"silent\",warn:!1})}),G.multiple&&G.fieldsCount&&G.fieldsCount--,Array.isArray(G.id)){const X=G.id.indexOf(O);X>=0&&G.id.splice(X,1),delete G.__flags.pendingUnmount[O]}(!G.multiple||G.fieldsCount<=0)&&(u.value.splice(F,1),ie(T),p(),delete d.value[T])}}function re(T){jn(d.value).forEach(O=>{O.startsWith(T)&&delete d.value[O]}),u.value=u.value.filter(O=>!O.path.startsWith(T)),h.nextTick(()=>{p()})}const me={name:r,formId:n,values:c,controlledValues:x,errorBag:v,errors:w,schema:k,submitCount:a,meta:A,isSubmitting:s,isValidating:o,fieldArrays:l,keepValuesOnUnmount:C,validateSchema:h.unref(k)?Z:void 0,validate:se,setFieldError:m,validateField:ne,setFieldValue:xe,setValues:ut,setErrors:g,setFieldTouched:Qe,setTouched:Q,resetForm:q,resetField:J,handleSubmit:Ke,useFieldModel:Fe,defineInputBinds:Xe,defineComponentBinds:L,defineField:we,stageInitialValue:te,unsetInitialValue:ie,setFieldInitialValue:Se,createPathState:P,getPathState:W,unsetPathValue:De,removePathState:Ie,initialValues:M,getAllPathStates:()=>u.value,destroyPath:re,isFieldTouched:_,isFieldDirty:N,isFieldValid:Y};function xe(T,O,F=!0){const G=at(O),X=typeof T==\"string\"?T:T.path;W(X)||P(X),Tr(c,X,G),F&&ne(X)}function Ne(T,O=!0){jn(c).forEach(F=>{delete c[F]}),jn(T).forEach(F=>{xe(F,T[F],!1)}),O&&se()}function ut(T,O=!0){Mo(c,T),l.forEach(F=>F&&F.reset()),O&&se()}function dt(T,O){const F=W(h.toValue(T))||P(T);return h.computed({get(){return F.value},set(G){var X;const oe=h.toValue(T);xe(oe,G,(X=h.toValue(O))!==null&&X!==void 0?X:!1)}})}function Qe(T,O){const F=W(T);F&&(F.touched=O)}function _(T){const O=W(T);return O?O.touched:u.value.filter(F=>F.path.startsWith(T)).some(F=>F.touched)}function N(T){const O=W(T);return O?O.dirty:u.value.filter(F=>F.path.startsWith(T)).some(F=>F.dirty)}function Y(T){const O=W(T);return O?O.valid:u.value.filter(F=>F.path.startsWith(T)).every(F=>F.valid)}function Q(T){if(typeof T==\"boolean\"){U(O=>{O.touched=T});return}jn(T).forEach(O=>{Qe(O,!!T[O])})}function J(T,O){var F;const G=O&&\"value\"in O?O.value:Nn(M.value,T),X=W(T);X&&(X.__flags.pendingReset=!0),Se(T,at(G),!0),xe(T,G,!1),Qe(T,(F=O==null?void 0:O.touched)!==null&&F!==void 0?F:!1),m(T,(O==null?void 0:O.errors)||[]),h.nextTick(()=>{X&&(X.__flags.pendingReset=!1)})}function q(T,O){let F=at(T!=null&&T.values?T.values:B.value);F=O!=null&&O.force?F:Mo(B.value,F),F=ar(k)&&Yt(k.cast)?k.cast(F):F,j(F,{force:O==null?void 0:O.force}),U(G=>{var X;G.__flags.pendingReset=!0,G.validated=!1,G.touched=((X=T==null?void 0:T.touched)===null||X===void 0?void 0:X[h.toValue(G.path)])||!1,xe(h.toValue(G.path),Nn(F,h.toValue(G.path)),!1),m(h.toValue(G.path),void 0)}),O!=null&&O.force?Ne(F,!1):ut(F,!1),g((T==null?void 0:T.errors)||{}),a.value=(T==null?void 0:T.submitCount)||0,h.nextTick(()=>{se({mode:\"silent\"}),U(G=>{G.__flags.pendingReset=!1})})}async function se(T){const O=(T==null?void 0:T.mode)||\"force\";if(O===\"force\"&&U(ae=>ae.validated=!0),me.validateSchema)return me.validateSchema(O);o.value=!0;const F=await Promise.all(u.value.map(ae=>ae.validate?ae.validate(T).then(he=>({key:h.toValue(ae.path),valid:he.valid,errors:he.errors,value:he.value})):Promise.resolve({key:h.toValue(ae.path),valid:!0,errors:[],value:void 0})));o.value=!1;const G={},X={},oe={};for(const ae of F)G[ae.key]={valid:ae.valid,errors:ae.errors},ae.value&&Tr(oe,ae.key,ae.value),ae.errors.length&&(X[ae.key]=ae.errors[0]);return{valid:F.every(ae=>ae.valid),results:G,errors:X,values:oe,source:\"fields\"}}async function ne(T,O){var F;const G=W(T);if(G&&(O==null?void 0:O.mode)!==\"silent\"&&(G.validated=!0),k){const{results:X}=await Z((O==null?void 0:O.mode)||\"validated-only\");return X[T]||{errors:[],valid:!0}}return G!=null&&G.validate?G.validate(O):(!G&&(F=O==null?void 0:O.warn),Promise.resolve({errors:[],valid:!0}))}function ie(T){rp(M.value,T)}function te(T,O,F=!1){Se(T,O),Tr(c,T,O),F&&!(e!=null&&e.initialValues)&&Tr(B.value,T,at(O))}function Se(T,O,F=!1){Tr(M.value,T,at(O)),F&&Tr(B.value,T,at(O))}async function ce(){const T=h.unref(k);if(!T)return{valid:!0,results:{},errors:{},source:\"none\"};o.value=!0;const O=bl(T)||ar(T)?await tA(T,c):await nA(T,c,{names:S.value,bailsMap:y.value});return o.value=!1,O}const ge=Ke((T,{evt:O})=>{Wy(O)&&O.target.submit()});h.onMounted(()=>{if(e!=null&&e.initialErrors&&g(e.initialErrors),e!=null&&e.initialTouched&&Q(e.initialTouched),e!=null&&e.validateOnMount){se();return}me.validateSchema&&me.validateSchema(\"silent\")}),h.isRef(k)&&h.watch(k,()=>{var T;(T=me.validateSchema)===null||T===void 0||T.call(me,\"validated-only\")}),h.provide(bc,me);function we(T,O){const F=Yt(O)||O==null?void 0:O.label,G=W(h.toValue(T))||P(T,{label:F}),X=()=>Yt(O)?O(da(G,ha)):O||{};function oe(){var Ee;G.touched=!0,((Ee=X().validateOnBlur)!==null&&Ee!==void 0?Ee:Ei().validateOnBlur)&&ne(h.toValue(G.path))}function ae(){var Ee;((Ee=X().validateOnInput)!==null&&Ee!==void 0?Ee:Ei().validateOnInput)&&h.nextTick(()=>{ne(h.toValue(G.path))})}function he(){var Ee;((Ee=X().validateOnChange)!==null&&Ee!==void 0?Ee:Ei().validateOnChange)&&h.nextTick(()=>{ne(h.toValue(G.path))})}const ue=h.computed(()=>{const Ee={onChange:he,onInput:ae,onBlur:oe};return Yt(O)?Object.assign(Object.assign({},Ee),O(da(G,ha)).props||{}):O!=null&&O.props?Object.assign(Object.assign({},Ee),O.props(da(G,ha))):Ee});return[dt(T,()=>{var Ee,_e,it;return(it=(Ee=X().validateOnModelUpdate)!==null&&Ee!==void 0?Ee:(_e=Ei())===null||_e===void 0?void 0:_e.validateOnModelUpdate)!==null&&it!==void 0?it:!0}),ue]}function Fe(T){return Array.isArray(T)?T.map(O=>dt(O,!0)):dt(T)}function Xe(T,O){const[F,G]=we(T,O);function X(){G.value.onBlur()}function oe(he){const ue=Sl(he);xe(h.toValue(T),ue,!1),G.value.onInput()}function ae(he){const ue=Sl(he);xe(h.toValue(T),ue,!1),G.value.onChange()}return h.computed(()=>Object.assign(Object.assign({},G.value),{onBlur:X,onInput:oe,onChange:ae,value:F.value}))}function L(T,O){const[F,G]=we(T,O),X=W(h.toValue(T));function oe(ae){F.value=ae}return h.computed(()=>{const ae=Yt(O)?O(da(X,ha)):O||{};return Object.assign({[ae.model||\"modelValue\"]:F.value,[`onUpdate:${ae.model||\"modelValue\"}`]:oe},G.value)})}const H=Object.assign(Object.assign({},me),{values:h.readonly(c),handleReset:()=>q(),submitForm:ge});return h.provide(IO,H),H}function yA(e,t,n,r){const i={touched:\"some\",pending:\"some\",valid:\"every\"},s=h.computed(()=>!bn(t,h.unref(n)));function o(){const l=e.value;return jn(i).reduce((c,u)=>{const f=i[u];return c[u]=l[f](d=>d[u]),c},{})}const a=h.reactive(o());return h.watchEffect(()=>{const l=o();a.touched=l.touched,a.valid=l.valid,a.pending=l.pending}),h.computed(()=>Object.assign(Object.assign({initialValues:h.unref(n)},a),{valid:a.valid&&!jn(r.value).length,dirty:s.value}))}function EA(e,t,n){const r=Qy(n),i=h.ref(r),s=h.ref(at(r));function o(a,l){l!=null&&l.force?(i.value=at(a),s.value=at(a)):(i.value=Mo(at(i.value)||{},at(a)),s.value=Mo(at(s.value)||{},at(a))),l!=null&&l.updateFields&&e.value.forEach(c=>{if(c.touched)return;const f=Nn(i.value,h.toValue(c.path));Tr(t,h.toValue(c.path),at(f))})}return{initialValues:i,originalInitialValues:s,setInitialValues:o}}function bA(e,t){return t?{valid:e.valid&&t.valid,errors:[...e.errors,...t.errors]}:e}const SA=h.defineComponent({name:\"Form\",inheritAttrs:!1,props:{as:{type:null,default:\"form\"},validationSchema:{type:Object,default:void 0},initialValues:{type:Object,default:void 0},initialErrors:{type:Object,default:void 0},initialTouched:{type:Object,default:void 0},validateOnMount:{type:Boolean,default:!1},onSubmit:{type:Function,default:void 0},onInvalidSubmit:{type:Function,default:void 0},keepValues:{type:Boolean,default:!1},name:{type:String,default:\"Form\"}},setup(e,t){const n=h.toRef(e,\"validationSchema\"),r=h.toRef(e,\"keepValues\"),{errors:i,errorBag:s,values:o,meta:a,isSubmitting:l,isValidating:c,submitCount:u,controlledValues:f,validate:d,validateField:p,handleReset:m,resetForm:g,handleSubmit:v,setErrors:w,setFieldError:S,setFieldValue:y,setValues:E,setFieldTouched:C,setTouched:M,resetField:B}=vA({validationSchema:n.value?n:void 0,initialValues:e.initialValues,initialErrors:e.initialErrors,initialTouched:e.initialTouched,validateOnMount:e.validateOnMount,keepValuesOnUnmount:r,name:e.name}),j=v((U,{evt:W})=>{Wy(W)&&W.target.submit()},e.onInvalidSubmit),A=e.onSubmit?v(e.onSubmit,e.onInvalidSubmit):j;function x(U){bd(U)&&U.preventDefault(),m(),typeof t.attrs.onReset==\"function\"&&t.attrs.onReset()}function k(U,W){return v(typeof U==\"function\"&&!W?U:W,e.onInvalidSubmit)(U)}function P(){return at(o)}function V(){return at(a.value)}function $(){return at(i.value)}function Z(){return{meta:a.value,errors:i.value,errorBag:s.value,values:o,isSubmitting:l.value,isValidating:c.value,submitCount:u.value,controlledValues:f.value,validate:d,validateField:p,handleSubmit:k,handleReset:m,submitForm:j,setErrors:w,setFieldError:S,setFieldValue:y,setValues:E,setFieldTouched:C,setTouched:M,resetForm:g,resetField:B,getValues:P,getMeta:V,getErrors:$}}return t.expose({setFieldError:S,setErrors:w,setFieldValue:y,setValues:E,setFieldTouched:C,setTouched:M,resetForm:g,validate:d,validateField:p,resetField:B,getValues:P,getMeta:V,getErrors:$,values:o,meta:a,errors:i}),function(){const W=e.as===\"form\"?e.as:e.as?h.resolveDynamicComponent(e.as):null,ee=Td(W,t,Z);if(!W)return ee;const Te=W===\"form\"?{novalidate:!0}:{};return h.h(W,Object.assign(Object.assign(Object.assign({},Te),t.attrs),{onSubmit:A,onReset:x}),ee)}}}),TA=SA,wA=h.defineComponent({name:\"ErrorMessage\",props:{as:{type:String,default:void 0},name:{type:String,required:!0}},setup(e,t){const n=h.inject(bc,void 0),r=h.computed(()=>n==null?void 0:n.errors.value[e.name]);function i(){return{message:r.value}}return()=>{if(!r.value)return;const s=e.as?h.resolveDynamicComponent(e.as):e.as,o=Td(s,t,i),a=Object.assign({role:\"alert\"},t.attrs);return!s&&(Array.isArray(o)||!o)&&(o!=null&&o.length)?o:(Array.isArray(o)||!o)&&!(o!=null&&o.length)?h.h(s||\"span\",a,r.value):h.h(s,a,o)}}}),DA=wA;/**\n  * vee-validate v4.15.1\n  * (c) 2025 Abdelrahman Awad\n  * @license MIT\n  */function cp(e){return typeof e==\"function\"}function CA(e){return typeof e==\"object\"&&e!==null}function OA(e){return e==null?e===void 0?\"[object Undefined]\":\"[object Null]\":Object.prototype.toString.call(e)}function up(e){if(!CA(e)||OA(e)!==\"[object Object]\")return!1;if(Object.getPrototypeOf(e)===null)return!0;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}function qy(e,t){return Object.keys(t).forEach(n=>{if(up(t[n])&&up(e[n])){e[n]||(e[n]={}),qy(e[n],t[n]);return}e[n]=t[n]}),e}function fp(e,t,n){const{prefix:r,suffix:i}=n,s=AA(r,i);return e.replace(s,function(o,a,l){if(!a||!t.params)return l in t?t[l]:t.params&&l in t.params?t.params[l]:`${r}${l}${i}`;if(!Array.isArray(t.params))return l in t.params?t.params[l]:`${r}${l}${i}`;const c=Number(a.replace(\":\",\"\"));return c in t.params?t.params[c]:`${a}${r}${l}${i}`})}function dp(e){return e.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}function AA(e,t){const n=dp(e),r=dp(t);return new RegExp(`([0-9]:)?${n}((?:(?!${r}).)+)${r}`,\"g\")}class _A{constructor(t,n,r={prefix:\"{\",suffix:\"}\"}){this.container={},this.locale=t,this.interpolateOptions=r,this.merge(n)}resolve(t,n){let r=this.format(this.locale,t,n);return!r&&this.fallbackLocale&&this.fallbackLocale!==this.locale&&(r=this.format(this.fallbackLocale,t,n)),r||this.getDefaultMessage(this.locale,t)}getDefaultMessage(t,n){const{label:r,name:i}=n;return`${this.resolveLabel(t,i,r)} is not valid`}getLocaleDefault(t,n){var r,i,s,o,a;return((s=(i=(r=this.container[t])===null||r===void 0?void 0:r.fields)===null||i===void 0?void 0:i[n])===null||s===void 0?void 0:s._default)||((a=(o=this.container[t])===null||o===void 0?void 0:o.messages)===null||a===void 0?void 0:a._default)}resolveLabel(t,n,r){var i,s,o,a;return r?((s=(i=this.container[t])===null||i===void 0?void 0:i.names)===null||s===void 0?void 0:s[r])||r:((a=(o=this.container[t])===null||o===void 0?void 0:o.names)===null||a===void 0?void 0:a[n])||n}format(t,n,r){var i,s,o,a,l;let c;const{rule:u,form:f,label:d,name:p}=n,m=this.resolveLabel(t,p,d);return u?(c=((o=(s=(i=this.container[t])===null||i===void 0?void 0:i.fields)===null||s===void 0?void 0:s[p])===null||o===void 0?void 0:o[u.name])||((l=(a=this.container[t])===null||a===void 0?void 0:a.messages)===null||l===void 0?void 0:l[u.name]),c||(c=this.getLocaleDefault(t,p)||\"\"),cp(c)?c(n):fp(c,Object.assign(Object.assign({},f),{field:m,params:u.params}),r??this.interpolateOptions)):(c=this.getLocaleDefault(t,p)||\"\",cp(c)?c(n):fp(c,Object.assign(Object.assign({},f),{field:m}),r??this.interpolateOptions))}merge(t){qy(this.container,t)}}const Ba=new _A(\"en\",{});function MA(e,t,n){const r=i=>Ba.resolve(i,n);return typeof e==\"string\"?(Ba.locale=e,r):(Ba.merge(e),r)}function xA(e){Ba.locale=e}const NA=\"ar\",IA={alpha:\"{field} يجب ان يحتوي على حروف فقط\",alpha_num:\"{field} قد يحتوي فقط على حروف وارقام\",alpha_dash:\"{field} قد يحتوي على حروف او الرموز - و _\",alpha_spaces:\"{field} قد يحتوي فقط على حروف ومسافات\",between:\"قيمة {field} يجب ان تكون ما بين 0:{min} و 1:{max}\",confirmed:\"{field} لا يماثل التأكيد\",digits:\"{field} يجب ان تحتوي فقط على ارقام والا يزيد عددها عن 0:{length} رقم\",dimensions:\"{field} يجب ان تكون بمقاس 0:{width} بكسل في 1:{height} بكسل\",email:\"{field} يجب ان يكون بريدا اليكتروني صحيح\",not_one_of:\"الحقل {field} غير صحيح\",ext:\"نوع ملف {field} غير صحيح\",image:\"{field} يجب ان تكون صورة\",integer:\"الحقل {field} يجب ان يكون عدداً صحيحاً\",length:\"حقل {field} يجب الا يزيد عن 0:{length}\",max_value:\"قيمة الحقل {field} يجب ان تكون اصغر من 0:{min} او تساويها\",max:\"الحقل {field} يجب ان يحتوي على 0:{length} حروف على الأكثر\",mimes:\"نوع ملف {field} غير صحيح\",min_value:\"قيمة الحقل {field} يجب ان تكون اكبر من 0:{min} او تساويها\",min:\"الحقل {field} يجب ان يحتوي على 0:{length} حروف على الأقل\",numeric:\"{field} يمكن ان يحتوي فقط على ارقام\",one_of:\"الحقل {field} يجب ان يكون قيمة صحيحة\",regex:\"الحقل {field} غير صحيح\",required:\"{field} مطلوب\",required_if:\"حقل {field} مطلوب\",size:\"{field} يجب ان يكون اقل من 0:{size} كيلوبايت\",url:\"حقل {field} ليس رابطاً صحيحاً\"},hp={code:NA,messages:IA},RA=\"en\",PA={_default:\"The {field} is not valid\",alpha:\"The {field} field may only contain alphabetic characters\",alpha_num:\"The {field} field may only contain alpha-numeric characters\",alpha_dash:\"The {field} field may contain alpha-numeric characters as well as dashes and underscores\",alpha_spaces:\"The {field} field may only contain alphabetic characters as well as spaces\",between:\"The {field} field must be between 0:{min} and 1:{max}\",confirmed:\"The {field} field confirmation does not match\",digits:\"The {field} field must be numeric and exactly contain 0:{length} digits\",dimensions:\"The {field} field must be 0:{width} pixels by 1:{height} pixels\",email:\"The {field} field must be a valid email\",not_one_of:\"The {field} field is not a valid value\",ext:\"The {field} field is not a valid file\",image:\"The {field} field must be an image\",integer:\"The {field} field must be an integer\",length:\"The {field} field must be 0:{length} long\",max_value:\"The {field} field must be 0:{max} or less\",max:\"The {field} field may not be greater than 0:{length} characters\",mimes:\"The {field} field must have a valid file type\",min_value:\"The {field} field must be 0:{min} or more\",min:\"The {field} field must be at least 0:{length} characters\",numeric:\"The {field} field may only contain numeric characters\",one_of:\"The {field} field is not a valid value\",regex:\"The {field} field format is invalid\",required_if:\"The {field} field is required\",required:\"The {field} field is required\",size:\"The {field} field size must be less than 0:{size}KB\",url:\"The {field} field is not a valid URL\"},pp={code:RA,messages:PA},LA=\"es\",kA={alpha:\"El campo {field} solo debe contener letras\",alpha_dash:\"El campo {field} solo debe contener letras, números y guiones\",alpha_num:\"El campo {field} solo debe contener letras y números\",alpha_spaces:\"El campo {field} solo debe contener letras y espacios\",between:\"El campo {field} debe estar entre 0:{min} y 1:{max}\",confirmed:\"El campo {field} no coincide\",digits:\"El campo {field} debe ser numérico y contener exactamente 0:{length} dígitos\",dimensions:\"El campo {field} debe ser de 0:{width} píxeles por 1:{height} píxeles\",email:\"El campo {field} debe ser un correo electrónico válido\",not_one_of:\"El campo {field} debe ser un valor válido\",ext:\"El campo {field} debe ser un archivo válido\",image:\"El campo {field} debe ser una imagen\",one_of:\"El campo {field} debe ser un valor válido\",integer:\"El campo {field} debe ser un entero\",length:\"El largo del campo {field} debe ser 0:{length}\",max:\"El campo {field} no debe ser mayor a 0:{length} caracteres\",max_value:\"El campo {field} debe de ser 0:{max} o menor\",mimes:\"El campo {field} debe ser un tipo de archivo válido\",min:\"El campo {field} debe tener al menos 0:{length} caracteres\",min_value:\"El campo {field} debe ser 0:{min} o superior\",numeric:\"El campo {field} debe contener solo caracteres numéricos\",regex:\"El formato del campo {field} no es válido\",required:\"El campo {field} es obligatorio\",required_if:\"El campo {field} es obligatorio\",size:\"El campo {field} debe ser menor a 0:{size}KB\"},mp={code:LA,messages:kA},FA=\"fa\",VA={alpha:\"{field} فقط می تواند از حروف تشکیل شود\",alpha_num:\"{field} فقط میتواند از حروف و اعداد تشکیل شود\",alpha_dash:\"{field} فقط می تواند از حروف، اعداد، خط فاصله و زیرخط تشکیل شود\",alpha_spaces:\"{field} فقط می تواند از حروف و فاصله تشکیل شود\",between:\"{field} باید بین 0:{min} و 1:{max} کارکتر باشد\",confirmed:\"{field} با تاییدیه اش مطابقت ندارد\",digits:\"{field} باید یک مقدار عددی و دقیقاً 0:{length} رقم باشد\",dimensions:\"{field} باید در اندازه 0:{width} پیکسل عرض و 1:{height} پیکسل ارتفاع باشد\",email:\"{field} باید یک پست الکترونیک معتبر باشد\",not_one_of:\"{field}باید یک مقدار معتبر باشد\",ext:\"{field} باید یک فایل معتبر باشد\",image:\"{field} باید یک تصویر باشد\",integer:\"{field} باید یک عدد صحیح باشد\",length:\"{field} باید دقیقا 0:{length} کاراکتر باشد\",max_value:\"مقدار {field} باید 0:{max} یا کمتر باشد\",max:\"{field} نباید بیشتر از 0:{length} کارکتر باشد\",mimes:\"{field} باید از نوع معتبر باشد\",min_value:\"مقدار {field} باید 0:{min} یا بیشتر باشد\",min:\"{field} باید حداقل 0:{length} کارکتر باشد\",numeric:\"{field} فقط می تواند عددی باشد\",one_of:\"{field} باید یک مقدار معتبر باشد\",regex:\"قالب {field} قابل قبول نیست\",required_if:\"{field} الزامی است\",required:\"{field} الزامی است\",size:\"حجم {field} کمتر از 0:{size}KB باشد\"},gp={code:FA,messages:VA},BA=\"tr\",jA={alpha:\"{field} yalnızca harf içerebilir\",alpha_dash:\"{field} alanı harf ve tire (-) ya da alttan tire (_) içerebilir\",alpha_num:\"{field} yalnızca harf ve rakam içerebilir\",alpha_spaces:\"{field} yalnızca harf boşluk (space) içerebilir\",between:\"{field} 0:{min} ile 1:{max} aralığında olmalıdır\",confirmed:\"{field} doğrulaması hatalı\",digits:\"{field} sayısal ve 0:{length} basamaklı olmalıdır\",dimensions:\"{field} alanı 0:{width} piksel ile 1:{height} piksel arasında olmalıdır\",email:\"{field} alanının geçerli bir e-posta olması gerekir\",not_one_of:\"{field} alanına geçerli bir değer giriniz\",ext:\"{field} alanı geçerli bir dosya olmalıdır\",image:\"{field} alanı resim dosyası olmalıdır\",integer:\"{field} alanı bir tamsayı olmalıdır\",length:\"{field} alanı 0:{length} uzunluğunda olmalıdır\",one_of:\"{field} alanına geçerli bir değer giriniz\",max:\"{field} alanı 0:{length} karakterden fazla olmamalıdır\",max_value:\"{field} alanı 0:{max} ya da daha az bir değer olmalıdır\",mimes:\"{field} geçerli bir dosya olmalıdır\",min:\"{field} alanına en az 0:{length} karakter girilmelidir\",min_value:\"{field} alanı 0:{min} ya da daha fazla bir değer olmalıdır\",numeric:\"{field} alanına sayısal bir değer giriniz\",regex:\"{field} formatı geçersiz\",required:\"{field} alanı gereklidir\",required_if:\"{field} alanı gereklidir\",size:\"{field} alanı 0:{size}KB'dan daha az olmalıdır\",url:\"{field} geçerli bir URL değil\"},vp={code:BA,messages:jA};/**\n  * vee-validate v4.15.1\n  * (c) 2025 Abdelrahman Awad\n  * @license MIT\n  */const pa={en:/^[A-Z]*$/i,cs:/^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]*$/i,da:/^[A-ZÆØÅ]*$/i,de:/^[A-ZÄÖÜß]*$/i,es:/^[A-ZÁÉÍÑÓÚÜ]*$/i,fr:/^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]*$/i,it:/^[A-Z\\xC0-\\xFF]*$/i,lt:/^[A-ZĄČĘĖĮŠŲŪŽ]*$/i,nl:/^[A-ZÉËÏÓÖÜ]*$/i,hu:/^[A-ZÁÉÍÓÖŐÚÜŰ]*$/i,pl:/^[A-ZĄĆĘŚŁŃÓŻŹ]*$/i,pt:/^[A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]*$/i,ru:/^[А-ЯЁ]*$/i,kz:/^[А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA]*$/i,sk:/^[A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ]*$/i,sr:/^[A-ZČĆŽŠĐ]*$/i,sv:/^[A-ZÅÄÖ]*$/i,tr:/^[A-ZÇĞİıÖŞÜ]*$/i,uk:/^[А-ЩЬЮЯЄІЇҐ]*$/i,ar:/^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]*$/,az:/^[A-ZÇƏĞİıÖŞÜ]*$/i,ug:/^[A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ]*$/i},ma={en:/^[A-Z\\s]*$/i,cs:/^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ\\s]*$/i,da:/^[A-ZÆØÅ\\s]*$/i,de:/^[A-ZÄÖÜß\\s]*$/i,es:/^[A-ZÁÉÍÑÓÚÜ\\s]*$/i,fr:/^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ\\s]*$/i,it:/^[A-Z\\xC0-\\xFF\\s]*$/i,lt:/^[A-ZĄČĘĖĮŠŲŪŽ\\s]*$/i,nl:/^[A-ZÉËÏÓÖÜ\\s]*$/i,hu:/^[A-ZÁÉÍÓÖŐÚÜŰ\\s]*$/i,pl:/^[A-ZĄĆĘŚŁŃÓŻŹ\\s]*$/i,pt:/^[A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ\\s]*$/i,ru:/^[А-ЯЁ\\s]*$/i,kz:/^[А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA\\s]*$/i,sk:/^[A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ\\s]*$/i,sr:/^[A-ZČĆŽŠĐ\\s]*$/i,sv:/^[A-ZÅÄÖ\\s]*$/i,tr:/^[A-ZÇĞİıÖŞÜ\\s]*$/i,uk:/^[А-ЩЬЮЯЄІЇҐ\\s]*$/i,ar:/^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ\\s]*$/,az:/^[A-ZÇƏĞİıÖŞÜ\\s]*$/i,ug:/^[A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ\\s]*$/i},ga={en:/^[0-9A-Z]*$/i,cs:/^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]*$/i,da:/^[0-9A-ZÆØÅ]$/i,de:/^[0-9A-ZÄÖÜß]*$/i,es:/^[0-9A-ZÁÉÍÑÓÚÜ]*$/i,fr:/^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]*$/i,it:/^[0-9A-Z\\xC0-\\xFF]*$/i,lt:/^[0-9A-ZĄČĘĖĮŠŲŪŽ]*$/i,hu:/^[0-9A-ZÁÉÍÓÖŐÚÜŰ]*$/i,nl:/^[0-9A-ZÉËÏÓÖÜ]*$/i,pl:/^[0-9A-ZĄĆĘŚŁŃÓŻŹ]*$/i,pt:/^[0-9A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]*$/i,ru:/^[0-9А-ЯЁ]*$/i,kz:/^[0-9А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA]*$/i,sk:/^[0-9A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ]*$/i,sr:/^[0-9A-ZČĆŽŠĐ]*$/i,sv:/^[0-9A-ZÅÄÖ]*$/i,tr:/^[0-9A-ZÇĞİıÖŞÜ]*$/i,uk:/^[0-9А-ЩЬЮЯЄІЇҐ]*$/i,ar:/^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]*$/,az:/^[0-9A-ZÇƏĞİıÖŞÜ]*$/i,ug:/^[0-9A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ]*$/i},va={en:/^[0-9A-Z_-]*$/i,cs:/^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ_-]*$/i,da:/^[0-9A-ZÆØÅ_-]*$/i,de:/^[0-9A-ZÄÖÜß_-]*$/i,es:/^[0-9A-ZÁÉÍÑÓÚÜ_-]*$/i,fr:/^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ_-]*$/i,it:/^[0-9A-Z\\xC0-\\xFF_-]*$/i,lt:/^[0-9A-ZĄČĘĖĮŠŲŪŽ_-]*$/i,nl:/^[0-9A-ZÉËÏÓÖÜ_-]*$/i,hu:/^[0-9A-ZÁÉÍÓÖŐÚÜŰ_-]*$/i,pl:/^[0-9A-ZĄĆĘŚŁŃÓŻŹ_-]*$/i,pt:/^[0-9A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ_-]*$/i,ru:/^[0-9А-ЯЁ_-]*$/i,kz:/^[0-9А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA_-]*$/i,sk:/^[0-9A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ_-]*$/i,sr:/^[0-9A-ZČĆŽŠĐ_-]*$/i,sv:/^[0-9A-ZÅÄÖ_-]*$/i,tr:/^[0-9A-ZÇĞİıÖŞÜ_-]*$/i,uk:/^[0-9А-ЩЬЮЯЄІЇҐ_-]*$/i,ar:/^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ_-]*$/,az:/^[0-9A-ZÇƏĞİıÖŞÜ_-]*$/i,ug:/^[0-9A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ_-]*$/i},Tc=e=>{if(e)return Array.isArray(e)?e[0]:e.locale};function er(e,t){return Array.isArray(e)?e[0]:e[t]}function Ot(e){return!!(e==null||e===\"\"||Array.isArray(e)&&e.length===0)}const eE=(e,t)=>{if(Ot(e))return!0;const n=Tc(t);if(Array.isArray(e))return e.every(i=>eE(i,{locale:n}));const r=String(e);return n?(pa[n]||pa.en).test(r):Object.keys(pa).some(i=>pa[i].test(r))},tE=(e,t)=>{if(Ot(e))return!0;const n=Tc(t);if(Array.isArray(e))return e.every(i=>tE(i,{locale:n}));const r=String(e);return n?(va[n]||va.en).test(r):Object.keys(va).some(i=>va[i].test(r))},nE=(e,t)=>{if(Ot(e))return!0;const n=Tc(t);if(Array.isArray(e))return e.every(i=>nE(i,{locale:n}));const r=String(e);return n?(ga[n]||ga.en).test(r):Object.keys(ga).some(i=>ga[i].test(r))},rE=(e,t)=>{if(Ot(e))return!0;const n=Tc(t);if(Array.isArray(e))return e.every(i=>rE(i,{locale:n}));const r=String(e);return n?(ma[n]||ma.en).test(r):Object.keys(ma).some(i=>ma[i].test(r))};function HA(e){return Array.isArray(e)?{min:e[0],max:e[1]}:e}const iE=(e,t)=>{if(Ot(e))return!0;const{min:n,max:r}=HA(t);if(Array.isArray(e))return e.every(s=>iE(s,{min:n,max:r}));const i=Number(e);return Number(n)<=i&&Number(r)>=i},UA=(e,t)=>{const n=er(t,\"target\");return String(e)===String(n)},sE=(e,t)=>{if(Ot(e))return!0;const n=er(t,\"length\");if(Array.isArray(e))return e.every(i=>sE(i,{length:n}));const r=String(e);return/^[0-9]*$/.test(r)&&r.length===Number(n)},$A=(e,t,n)=>{const r=window.URL||window.webkitURL;return new Promise(i=>{const s=new Image;s.onerror=()=>i(!1),s.onload=()=>i(s.width===t&&s.height===n),s.src=r.createObjectURL(e)})};function WA(e){return e?Array.isArray(e)?{width:Number(e[0]),height:Number(e[1])}:{width:Number(e.width),height:Number(e.height)}:{width:0,height:0}}const YA=(e,t)=>{if(Ot(e))return!0;const{width:n,height:r}=WA(t),i=[],s=Array.isArray(e)?e:[e];for(let o=0;o<s.length;o++){if(!/\\.(jpg|svg|jpeg|png|bmp|gif)$/i.test(s[o].name))return Promise.resolve(!1);i.push(s[o])}return Promise.all(i.map(o=>$A(o,n,r))).then(o=>o.every(a=>a))},yp=/^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i,zA=e=>Ot(e)?!0:Array.isArray(e)?e.every(t=>yp.test(String(t))):yp.test(String(e)),KA=(e,t)=>{if(Ot(e))return!0;const n=new RegExp(`\\\\.(${t.join(\"|\")})$`,\"i\");return Array.isArray(e)?e.every(r=>n.test(r.name)):n.test(e.name)},GA=e=>{if(Ot(e))return!0;const t=/\\.(jpg|svg|jpeg|png|bmp|gif|webp)$/i;return Array.isArray(e)?e.every(n=>t.test(n.name)):t.test(e.name)},XA=e=>Ot(e)?!0:Array.isArray(e)?e.every(t=>/^-?[0-9]+$/.test(String(t))):/^-?[0-9]+$/.test(String(e)),JA=(e,t)=>{const n=er(t,\"other\");return e===n},ZA=(e,t)=>{const n=er(t,\"other\");return e!==n},QA=(e,t)=>{if(Ot(e))return!0;const n=er(t,\"length\");return typeof e==\"number\"&&(e=String(e)),e.length||(e=Array.from(e)),e.length===Number(n)},oE=(e,t)=>{if(Ot(e))return!0;const n=er(t,\"length\");return Array.isArray(e)?e.every(r=>oE(r,{length:n})):[...String(e)].length<=Number(n)},aE=(e,t)=>{if(Ot(e))return!0;const n=er(t,\"max\");return Array.isArray(e)?e.length>0&&e.every(r=>aE(r,{max:n})):Number(e)<=Number(n)},Ep=/\\+(.+)?/;function qA(e){let t=e;return Ep.test(e)&&(t=e.replace(Ep,\"(\\\\+$1)?\")),new RegExp(t.replace(\"*\",\".+\"),\"i\")}const e1=(e,t)=>{if(Ot(e))return!0;t||(t=[]);const n=t.map(qA);return Array.isArray(e)?e.every(r=>n.some(i=>i.test(r.type))):n.some(r=>r.test(e.type))},lE=(e,t)=>{if(Ot(e))return!0;const n=er(t,\"length\");return Array.isArray(e)?e.every(r=>lE(r,{length:n})):[...String(e)].length>=Number(n)},cE=(e,t)=>{if(Ot(e))return!0;const n=er(t,\"min\");return Array.isArray(e)?e.length>0&&e.every(r=>cE(r,{min:n})):Number(e)>=Number(n)},wd=(e,t)=>Ot(e)?!0:Array.isArray(e)?e.every(n=>wd(n,t)):Array.from(t).some(n=>n==e),t1=(e,t)=>Ot(e)?!0:!wd(e,t),n1=/^[٠١٢٣٤٥٦٧٨٩]+$/,r1=/^[0-9]+$/,i1=e=>{if(Ot(e))return!0;const t=n=>{const r=String(n);return r1.test(r)||n1.test(r)};return Array.isArray(e)?e.every(t):t(e)},uE=(e,t)=>{if(Ot(e))return!0;let n=er(t,\"regex\");return typeof n==\"string\"&&(n=new RegExp(n)),Array.isArray(e)?e.every(r=>uE(r,{regex:n})):n.test(String(e))};function s1(e){return e==null}function o1(e){return Array.isArray(e)&&e.length===0}const a1=e=>s1(e)||o1(e)||e===!1?!1:!!String(e).trim().length,l1=(e,t)=>{if(Ot(e))return!0;let n=er(t,\"size\");if(n=Number(n),isNaN(n))return!1;const r=n*1024;if(!Array.isArray(e))return e.size<=r;for(let i=0;i<e.length;i++)if(e[i].size>r)return!1;return!0},c1=(e,t)=>{var n;if(Ot(e))return!0;let r=er(t,\"pattern\");typeof r==\"string\"&&(r=new RegExp(r));try{new URL(e)}catch{return!1}return(n=r==null?void 0:r.test(e))!==null&&n!==void 0?n:!0},u1={alpha_dash:tE,alpha_num:nE,alpha_spaces:rE,alpha:eE,between:iE,confirmed:UA,digits:sE,dimensions:YA,email:zA,ext:KA,image:GA,integer:XA,is_not:ZA,is:JA,length:QA,max_value:aE,max:oE,mimes:e1,min_value:cE,min:lE,not_one_of:t1,numeric:i1,one_of:wd,regex:uE,required:a1,size:l1,url:c1};window.defineRule=dr;const f1={install:e=>{e.component(\"VForm\",TA),e.component(\"VField\",mA),e.component(\"VErrorMessage\",DA),window.addEventListener(\"load\",()=>xA(document.documentElement.attributes.lang.value)),Object.entries(u1).forEach(([t,n])=>dr(t,n)),dr(\"phone\",t=>!t||!t.length?!0:!!/^\\+?\\d+$/.test(t)),dr(\"address\",t=>!t||!t.length?!0:!!/^[a-zA-Z0-9\\s.\\/*'\\u0600-\\u06FF\\u0750-\\u077F\\u08A0-\\u08FF\\u0590-\\u05FF\\u3040-\\u309F\\u30A0-\\u30FF\\u0400-\\u04FF\\u0D80-\\u0DFF\\u3400-\\u4DBF\\u2000-\\u2A6D\\u00C0-\\u017F\\u0980-\\u09FF\\u0900-\\u097F\\u4E00-\\u9FFF,\\(\\)-]{1,60}$/iu.test(t)),dr(\"postcode\",t=>!t||!t.length?!0:!!/^[a-zA-Z0-9][a-zA-Z0-9\\s-]*[a-zA-Z0-9]$/.test(t)),dr(\"decimal\",(t,{decimals:n=\"*\",separator:r=\".\"}={})=>{if(t==null||t===\"\")return!0;if(Number(n)===0)return/^-?\\d*$/.test(t);const i=n===\"*\"?\"+\":`{1,${n}}`;return new RegExp(`^[-+]?\\\\d*(\\\\${r}\\\\d${i})?([eE]{1}[-]?\\\\d+)?$`).test(t)}),dr(\"required_if\",(t,{condition:n=!0}={})=>!(n&&(t==null||t===\"\"))),dr(\"\",()=>!0),dr(\"date_format\",t=>/^\\d{4}-\\d{2}-\\d{2}$/.test(t)),dr(\"after\",t=>{const n=new Date,r=new Date(t);return n.setHours(0,0,0,0),r.setHours(0,0,0,0),r>=n}),XO({generateMessage:MA({ar:{...hp,messages:{...hp.messages,phone:\"يجب أن يكون هذا {field} رقم هاتف صالحًا\",after:\"يجب أن يكون {field} تاريخًا في المستقبل أو اليوم.\"}},en:{...pp,messages:{...pp.messages,phone:\"This {field} must be a valid phone number\",after:\"The {field} must be a date in the future or today.\"}},es:{...mp,messages:{...mp.messages,phone:\"Este {field} debe ser un número de teléfono válido.\",after:\"El {field} debe ser una fecha en el futuro o hoy.\"}},fa:{...gp,messages:{...gp.messages,phone:\"این {field} باید یک شماره تلفن معتبر باشد.\",after:\"{field} باید یک تاریخ در آینده یا امروز باشد.\"}},tr:{...vp,messages:{...vp.messages,phone:\"Bu {field} geçerli bir telefon numarası olmalıdır.\",after:\"{field} gelecekte veya bugün olmalıdır.\"}}}),validateOnBlur:!0,validateOnInput:!0,validateOnChange:!0})}},d1={install(e){e.config.globalProperties.$h=Vf,e.config.globalProperties.$resolveComponent=Qm}};var fE={exports:{}};/**!\n * Sortable 1.14.0\n * @author\tRubaXa   <trash@rubaxa.org>\n * @author\towenm    <owen23355@gmail.com>\n * @license MIT\n */function bp(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function vr(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?bp(Object(n),!0).forEach(function(r){h1(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):bp(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function ja(e){\"@babel/helpers - typeof\";return typeof Symbol==\"function\"&&typeof Symbol.iterator==\"symbol\"?ja=function(t){return typeof t}:ja=function(t){return t&&typeof Symbol==\"function\"&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},ja(e)}function h1(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Zn(){return Zn=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},Zn.apply(this,arguments)}function p1(e,t){if(e==null)return{};var n={},r=Object.keys(e),i,s;for(s=0;s<r.length;s++)i=r[s],!(t.indexOf(i)>=0)&&(n[i]=e[i]);return n}function m1(e,t){if(e==null)return{};var n=p1(e,t),r,i;if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(i=0;i<s.length;i++)r=s[i],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}function g1(e){return v1(e)||y1(e)||E1(e)||b1()}function v1(e){if(Array.isArray(e))return tf(e)}function y1(e){if(typeof Symbol<\"u\"&&e[Symbol.iterator]!=null||e[\"@@iterator\"]!=null)return Array.from(e)}function E1(e,t){if(e){if(typeof e==\"string\")return tf(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if(n===\"Object\"&&e.constructor&&(n=e.constructor.name),n===\"Map\"||n===\"Set\")return Array.from(e);if(n===\"Arguments\"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return tf(e,t)}}function tf(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function b1(){throw new TypeError(`Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var S1=\"1.14.0\";function Rr(e){if(typeof window<\"u\"&&window.navigator)return!!navigator.userAgent.match(e)}var Hr=Rr(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i),zo=Rr(/Edge/i),Sp=Rr(/firefox/i),ro=Rr(/safari/i)&&!Rr(/chrome/i)&&!Rr(/android/i),dE=Rr(/iP(ad|od|hone)/i),T1=Rr(/chrome/i)&&Rr(/android/i),hE={capture:!1,passive:!1};function tt(e,t,n){e.addEventListener(t,n,!Hr&&hE)}function Je(e,t,n){e.removeEventListener(t,n,!Hr&&hE)}function Tl(e,t){if(t){if(t[0]===\">\"&&(t=t.substring(1)),e)try{if(e.matches)return e.matches(t);if(e.msMatchesSelector)return e.msMatchesSelector(t);if(e.webkitMatchesSelector)return e.webkitMatchesSelector(t)}catch{return!1}return!1}}function w1(e){return e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode}function sr(e,t,n,r){if(e){n=n||document;do{if(t!=null&&(t[0]===\">\"?e.parentNode===n&&Tl(e,t):Tl(e,t))||r&&e===n)return e;if(e===n)break}while(e=w1(e))}return null}var Tp=/\\s+/g;function Dt(e,t,n){if(e&&t)if(e.classList)e.classList[n?\"add\":\"remove\"](t);else{var r=(\" \"+e.className+\" \").replace(Tp,\" \").replace(\" \"+t+\" \",\" \");e.className=(r+(n?\" \"+t:\"\")).replace(Tp,\" \")}}function Ae(e,t,n){var r=e&&e.style;if(r){if(n===void 0)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(e,\"\"):e.currentStyle&&(n=e.currentStyle),t===void 0?n:n[t];!(t in r)&&t.indexOf(\"webkit\")===-1&&(t=\"-webkit-\"+t),r[t]=n+(typeof n==\"string\"?\"\":\"px\")}}function Mi(e,t){var n=\"\";if(typeof e==\"string\")n=e;else do{var r=Ae(e,\"transform\");r&&r!==\"none\"&&(n=r+\" \"+n)}while(!t&&(e=e.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function pE(e,t,n){if(e){var r=e.getElementsByTagName(t),i=0,s=r.length;if(n)for(;i<s;i++)n(r[i],i);return r}return[]}function mr(){var e=document.scrollingElement;return e||document.documentElement}function St(e,t,n,r,i){if(!(!e.getBoundingClientRect&&e!==window)){var s,o,a,l,c,u,f;if(e!==window&&e.parentNode&&e!==mr()?(s=e.getBoundingClientRect(),o=s.top,a=s.left,l=s.bottom,c=s.right,u=s.height,f=s.width):(o=0,a=0,l=window.innerHeight,c=window.innerWidth,u=window.innerHeight,f=window.innerWidth),(t||n)&&e!==window&&(i=i||e.parentNode,!Hr))do if(i&&i.getBoundingClientRect&&(Ae(i,\"transform\")!==\"none\"||n&&Ae(i,\"position\")!==\"static\")){var d=i.getBoundingClientRect();o-=d.top+parseInt(Ae(i,\"border-top-width\")),a-=d.left+parseInt(Ae(i,\"border-left-width\")),l=o+s.height,c=a+s.width;break}while(i=i.parentNode);if(r&&e!==window){var p=Mi(i||e),m=p&&p.a,g=p&&p.d;p&&(o/=g,a/=m,f/=m,u/=g,l=o+u,c=a+f)}return{top:o,left:a,bottom:l,right:c,width:f,height:u}}}function wp(e,t,n){for(var r=ei(e,!0),i=St(e)[t];r;){var s=St(r)[n],o=void 0;if(o=i>=s,!o)return r;if(r===mr())break;r=ei(r,!1)}return!1}function gs(e,t,n,r){for(var i=0,s=0,o=e.children;s<o.length;){if(o[s].style.display!==\"none\"&&o[s]!==Le.ghost&&(r||o[s]!==Le.dragged)&&sr(o[s],n.draggable,e,!1)){if(i===t)return o[s];i++}s++}return null}function Dd(e,t){for(var n=e.lastElementChild;n&&(n===Le.ghost||Ae(n,\"display\")===\"none\"||t&&!Tl(n,t));)n=n.previousElementSibling;return n||null}function Mt(e,t){var n=0;if(!e||!e.parentNode)return-1;for(;e=e.previousElementSibling;)e.nodeName.toUpperCase()!==\"TEMPLATE\"&&e!==Le.clone&&(!t||Tl(e,t))&&n++;return n}function Dp(e){var t=0,n=0,r=mr();if(e)do{var i=Mi(e),s=i.a,o=i.d;t+=e.scrollLeft*s,n+=e.scrollTop*o}while(e!==r&&(e=e.parentNode));return[t,n]}function D1(e,t){for(var n in e)if(e.hasOwnProperty(n)){for(var r in t)if(t.hasOwnProperty(r)&&t[r]===e[n][r])return Number(n)}return-1}function ei(e,t){if(!e||!e.getBoundingClientRect)return mr();var n=e,r=!1;do if(n.clientWidth<n.scrollWidth||n.clientHeight<n.scrollHeight){var i=Ae(n);if(n.clientWidth<n.scrollWidth&&(i.overflowX==\"auto\"||i.overflowX==\"scroll\")||n.clientHeight<n.scrollHeight&&(i.overflowY==\"auto\"||i.overflowY==\"scroll\")){if(!n.getBoundingClientRect||n===document.body)return mr();if(r||t)return n;r=!0}}while(n=n.parentNode);return mr()}function C1(e,t){if(e&&t)for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function Qc(e,t){return Math.round(e.top)===Math.round(t.top)&&Math.round(e.left)===Math.round(t.left)&&Math.round(e.height)===Math.round(t.height)&&Math.round(e.width)===Math.round(t.width)}var io;function mE(e,t){return function(){if(!io){var n=arguments,r=this;n.length===1?e.call(r,n[0]):e.apply(r,n),io=setTimeout(function(){io=void 0},t)}}}function O1(){clearTimeout(io),io=void 0}function gE(e,t,n){e.scrollLeft+=t,e.scrollTop+=n}function Cd(e){var t=window.Polymer,n=window.jQuery||window.Zepto;return t&&t.dom?t.dom(e).cloneNode(!0):n?n(e).clone(!0)[0]:e.cloneNode(!0)}function Cp(e,t){Ae(e,\"position\",\"absolute\"),Ae(e,\"top\",t.top),Ae(e,\"left\",t.left),Ae(e,\"width\",t.width),Ae(e,\"height\",t.height)}function qc(e){Ae(e,\"position\",\"\"),Ae(e,\"top\",\"\"),Ae(e,\"left\",\"\"),Ae(e,\"width\",\"\"),Ae(e,\"height\",\"\")}var un=\"Sortable\"+new Date().getTime();function A1(){var e=[],t;return{captureAnimationState:function(){if(e=[],!!this.options.animation){var r=[].slice.call(this.el.children);r.forEach(function(i){if(!(Ae(i,\"display\")===\"none\"||i===Le.ghost)){e.push({target:i,rect:St(i)});var s=vr({},e[e.length-1].rect);if(i.thisAnimationDuration){var o=Mi(i,!0);o&&(s.top-=o.f,s.left-=o.e)}i.fromRect=s}})}},addAnimationState:function(r){e.push(r)},removeAnimationState:function(r){e.splice(D1(e,{target:r}),1)},animateAll:function(r){var i=this;if(!this.options.animation){clearTimeout(t),typeof r==\"function\"&&r();return}var s=!1,o=0;e.forEach(function(a){var l=0,c=a.target,u=c.fromRect,f=St(c),d=c.prevFromRect,p=c.prevToRect,m=a.rect,g=Mi(c,!0);g&&(f.top-=g.f,f.left-=g.e),c.toRect=f,c.thisAnimationDuration&&Qc(d,f)&&!Qc(u,f)&&(m.top-f.top)/(m.left-f.left)===(u.top-f.top)/(u.left-f.left)&&(l=M1(m,d,p,i.options)),Qc(f,u)||(c.prevFromRect=u,c.prevToRect=f,l||(l=i.options.animation),i.animate(c,m,f,l)),l&&(s=!0,o=Math.max(o,l),clearTimeout(c.animationResetTimer),c.animationResetTimer=setTimeout(function(){c.animationTime=0,c.prevFromRect=null,c.fromRect=null,c.prevToRect=null,c.thisAnimationDuration=null},l),c.thisAnimationDuration=l)}),clearTimeout(t),s?t=setTimeout(function(){typeof r==\"function\"&&r()},o):typeof r==\"function\"&&r(),e=[]},animate:function(r,i,s,o){if(o){Ae(r,\"transition\",\"\"),Ae(r,\"transform\",\"\");var a=Mi(this.el),l=a&&a.a,c=a&&a.d,u=(i.left-s.left)/(l||1),f=(i.top-s.top)/(c||1);r.animatingX=!!u,r.animatingY=!!f,Ae(r,\"transform\",\"translate3d(\"+u+\"px,\"+f+\"px,0)\"),this.forRepaintDummy=_1(r),Ae(r,\"transition\",\"transform \"+o+\"ms\"+(this.options.easing?\" \"+this.options.easing:\"\")),Ae(r,\"transform\",\"translate3d(0,0,0)\"),typeof r.animated==\"number\"&&clearTimeout(r.animated),r.animated=setTimeout(function(){Ae(r,\"transition\",\"\"),Ae(r,\"transform\",\"\"),r.animated=!1,r.animatingX=!1,r.animatingY=!1},o)}}}}function _1(e){return e.offsetWidth}function M1(e,t,n,r){return Math.sqrt(Math.pow(t.top-e.top,2)+Math.pow(t.left-e.left,2))/Math.sqrt(Math.pow(t.top-n.top,2)+Math.pow(t.left-n.left,2))*r.animation}var Wi=[],eu={initializeByDefault:!0},Ko={mount:function(t){for(var n in eu)eu.hasOwnProperty(n)&&!(n in t)&&(t[n]=eu[n]);Wi.forEach(function(r){if(r.pluginName===t.pluginName)throw\"Sortable: Cannot mount plugin \".concat(t.pluginName,\" more than once\")}),Wi.push(t)},pluginEvent:function(t,n,r){var i=this;this.eventCanceled=!1,r.cancel=function(){i.eventCanceled=!0};var s=t+\"Global\";Wi.forEach(function(o){n[o.pluginName]&&(n[o.pluginName][s]&&n[o.pluginName][s](vr({sortable:n},r)),n.options[o.pluginName]&&n[o.pluginName][t]&&n[o.pluginName][t](vr({sortable:n},r)))})},initializePlugins:function(t,n,r,i){Wi.forEach(function(a){var l=a.pluginName;if(!(!t.options[l]&&!a.initializeByDefault)){var c=new a(t,n,t.options);c.sortable=t,c.options=t.options,t[l]=c,Zn(r,c.defaults)}});for(var s in t.options)if(t.options.hasOwnProperty(s)){var o=this.modifyOption(t,s,t.options[s]);typeof o<\"u\"&&(t.options[s]=o)}},getEventProperties:function(t,n){var r={};return Wi.forEach(function(i){typeof i.eventProperties==\"function\"&&Zn(r,i.eventProperties.call(n[i.pluginName],t))}),r},modifyOption:function(t,n,r){var i;return Wi.forEach(function(s){t[s.pluginName]&&s.optionListeners&&typeof s.optionListeners[n]==\"function\"&&(i=s.optionListeners[n].call(t[s.pluginName],r))}),i}};function Ws(e){var t=e.sortable,n=e.rootEl,r=e.name,i=e.targetEl,s=e.cloneEl,o=e.toEl,a=e.fromEl,l=e.oldIndex,c=e.newIndex,u=e.oldDraggableIndex,f=e.newDraggableIndex,d=e.originalEvent,p=e.putSortable,m=e.extraEventProperties;if(t=t||n&&n[un],!!t){var g,v=t.options,w=\"on\"+r.charAt(0).toUpperCase()+r.substr(1);window.CustomEvent&&!Hr&&!zo?g=new CustomEvent(r,{bubbles:!0,cancelable:!0}):(g=document.createEvent(\"Event\"),g.initEvent(r,!0,!0)),g.to=o||n,g.from=a||n,g.item=i||n,g.clone=s,g.oldIndex=l,g.newIndex=c,g.oldDraggableIndex=u,g.newDraggableIndex=f,g.originalEvent=d,g.pullMode=p?p.lastPutMode:void 0;var S=vr(vr({},m),Ko.getEventProperties(r,t));for(var y in S)g[y]=S[y];n&&n.dispatchEvent(g),v[w]&&v[w].call(t,g)}}var x1=[\"evt\"],Cn=function(t,n){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},i=r.evt,s=m1(r,x1);Ko.pluginEvent.bind(Le)(t,n,vr({dragEl:de,parentEl:At,ghostEl:We,rootEl:Et,nextEl:mi,lastDownEl:Ha,cloneEl:_t,cloneHidden:Qr,dragStarted:Ys,putSortable:Gt,activeSortable:Le.active,originalEvent:i,oldIndex:qi,oldDraggableIndex:so,newIndex:Bn,newDraggableIndex:Zr,hideGhostForTarget:bE,unhideGhostForTarget:SE,cloneNowHidden:function(){Qr=!0},cloneNowShown:function(){Qr=!1},dispatchSortableEvent:function(a){gn({sortable:n,name:a,originalEvent:i})}},s))};function gn(e){Ws(vr({putSortable:Gt,cloneEl:_t,targetEl:de,rootEl:Et,oldIndex:qi,oldDraggableIndex:so,newIndex:Bn,newDraggableIndex:Zr},e))}var de,At,We,Et,mi,Ha,_t,Qr,qi,Bn,so,Zr,ya,Gt,Ji=!1,wl=!1,Dl=[],di,tr,tu,nu,Op,Ap,Ys,Yi,oo,ao=!1,Ea=!1,Ua,tn,ru=[],nf=!1,Cl=[],wc=typeof document<\"u\",ba=dE,_p=zo||Hr?\"cssFloat\":\"float\",N1=wc&&!T1&&!dE&&\"draggable\"in document.createElement(\"div\"),vE=function(){if(wc){if(Hr)return!1;var e=document.createElement(\"x\");return e.style.cssText=\"pointer-events:auto\",e.style.pointerEvents===\"auto\"}}(),yE=function(t,n){var r=Ae(t),i=parseInt(r.width)-parseInt(r.paddingLeft)-parseInt(r.paddingRight)-parseInt(r.borderLeftWidth)-parseInt(r.borderRightWidth),s=gs(t,0,n),o=gs(t,1,n),a=s&&Ae(s),l=o&&Ae(o),c=a&&parseInt(a.marginLeft)+parseInt(a.marginRight)+St(s).width,u=l&&parseInt(l.marginLeft)+parseInt(l.marginRight)+St(o).width;if(r.display===\"flex\")return r.flexDirection===\"column\"||r.flexDirection===\"column-reverse\"?\"vertical\":\"horizontal\";if(r.display===\"grid\")return r.gridTemplateColumns.split(\" \").length<=1?\"vertical\":\"horizontal\";if(s&&a.float&&a.float!==\"none\"){var f=a.float===\"left\"?\"left\":\"right\";return o&&(l.clear===\"both\"||l.clear===f)?\"vertical\":\"horizontal\"}return s&&(a.display===\"block\"||a.display===\"flex\"||a.display===\"table\"||a.display===\"grid\"||c>=i&&r[_p]===\"none\"||o&&r[_p]===\"none\"&&c+u>i)?\"vertical\":\"horizontal\"},I1=function(t,n,r){var i=r?t.left:t.top,s=r?t.right:t.bottom,o=r?t.width:t.height,a=r?n.left:n.top,l=r?n.right:n.bottom,c=r?n.width:n.height;return i===a||s===l||i+o/2===a+c/2},R1=function(t,n){var r;return Dl.some(function(i){var s=i[un].options.emptyInsertThreshold;if(!(!s||Dd(i))){var o=St(i),a=t>=o.left-s&&t<=o.right+s,l=n>=o.top-s&&n<=o.bottom+s;if(a&&l)return r=i}}),r},EE=function(t){function n(s,o){return function(a,l,c,u){var f=a.options.group.name&&l.options.group.name&&a.options.group.name===l.options.group.name;if(s==null&&(o||f))return!0;if(s==null||s===!1)return!1;if(o&&s===\"clone\")return s;if(typeof s==\"function\")return n(s(a,l,c,u),o)(a,l,c,u);var d=(o?a:l).options.group.name;return s===!0||typeof s==\"string\"&&s===d||s.join&&s.indexOf(d)>-1}}var r={},i=t.group;(!i||ja(i)!=\"object\")&&(i={name:i}),r.name=i.name,r.checkPull=n(i.pull,!0),r.checkPut=n(i.put),r.revertClone=i.revertClone,t.group=r},bE=function(){!vE&&We&&Ae(We,\"display\",\"none\")},SE=function(){!vE&&We&&Ae(We,\"display\",\"\")};wc&&document.addEventListener(\"click\",function(e){if(wl)return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),wl=!1,!1},!0);var hi=function(t){if(de){t=t.touches?t.touches[0]:t;var n=R1(t.clientX,t.clientY);if(n){var r={};for(var i in t)t.hasOwnProperty(i)&&(r[i]=t[i]);r.target=r.rootEl=n,r.preventDefault=void 0,r.stopPropagation=void 0,n[un]._onDragOver(r)}}},P1=function(t){de&&de.parentNode[un]._isOutsideThisEl(t.target)};function Le(e,t){if(!(e&&e.nodeType&&e.nodeType===1))throw\"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(e));this.el=e,this.options=t=Zn({},t),e[un]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(e.nodeName)?\">li\":\">*\",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return yE(e,this.options)},ghostClass:\"sortable-ghost\",chosenClass:\"sortable-chosen\",dragClass:\"sortable-drag\",ignore:\"a, img\",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(o,a){o.setData(\"Text\",a.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:\"data-id\",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:\"sortable-fallback\",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:Le.supportPointer!==!1&&\"PointerEvent\"in window&&!ro,emptyInsertThreshold:5};Ko.initializePlugins(this,e,n);for(var r in n)!(r in t)&&(t[r]=n[r]);EE(t);for(var i in this)i.charAt(0)===\"_\"&&typeof this[i]==\"function\"&&(this[i]=this[i].bind(this));this.nativeDraggable=t.forceFallback?!1:N1,this.nativeDraggable&&(this.options.touchStartThreshold=1),t.supportPointer?tt(e,\"pointerdown\",this._onTapStart):(tt(e,\"mousedown\",this._onTapStart),tt(e,\"touchstart\",this._onTapStart)),this.nativeDraggable&&(tt(e,\"dragover\",this),tt(e,\"dragenter\",this)),Dl.push(this.el),t.store&&t.store.get&&this.sort(t.store.get(this)||[]),Zn(this,A1())}Le.prototype={constructor:Le,_isOutsideThisEl:function(t){!this.el.contains(t)&&t!==this.el&&(Yi=null)},_getDirection:function(t,n){return typeof this.options.direction==\"function\"?this.options.direction.call(this,t,n,de):this.options.direction},_onTapStart:function(t){if(t.cancelable){var n=this,r=this.el,i=this.options,s=i.preventOnFilter,o=t.type,a=t.touches&&t.touches[0]||t.pointerType&&t.pointerType===\"touch\"&&t,l=(a||t).target,c=t.target.shadowRoot&&(t.path&&t.path[0]||t.composedPath&&t.composedPath()[0])||l,u=i.filter;if(U1(r),!de&&!(/mousedown|pointerdown/.test(o)&&t.button!==0||i.disabled)&&!c.isContentEditable&&!(!this.nativeDraggable&&ro&&l&&l.tagName.toUpperCase()===\"SELECT\")&&(l=sr(l,i.draggable,r,!1),!(l&&l.animated)&&Ha!==l)){if(qi=Mt(l),so=Mt(l,i.draggable),typeof u==\"function\"){if(u.call(this,t,l,this)){gn({sortable:n,rootEl:c,name:\"filter\",targetEl:l,toEl:r,fromEl:r}),Cn(\"filter\",n,{evt:t}),s&&t.cancelable&&t.preventDefault();return}}else if(u&&(u=u.split(\",\").some(function(f){if(f=sr(c,f.trim(),r,!1),f)return gn({sortable:n,rootEl:f,name:\"filter\",targetEl:l,fromEl:r,toEl:r}),Cn(\"filter\",n,{evt:t}),!0}),u)){s&&t.cancelable&&t.preventDefault();return}i.handle&&!sr(c,i.handle,r,!1)||this._prepareDragStart(t,a,l)}}},_prepareDragStart:function(t,n,r){var i=this,s=i.el,o=i.options,a=s.ownerDocument,l;if(r&&!de&&r.parentNode===s){var c=St(r);if(Et=s,de=r,At=de.parentNode,mi=de.nextSibling,Ha=r,ya=o.group,Le.dragged=de,di={target:de,clientX:(n||t).clientX,clientY:(n||t).clientY},Op=di.clientX-c.left,Ap=di.clientY-c.top,this._lastX=(n||t).clientX,this._lastY=(n||t).clientY,de.style[\"will-change\"]=\"all\",l=function(){if(Cn(\"delayEnded\",i,{evt:t}),Le.eventCanceled){i._onDrop();return}i._disableDelayedDragEvents(),!Sp&&i.nativeDraggable&&(de.draggable=!0),i._triggerDragStart(t,n),gn({sortable:i,name:\"choose\",originalEvent:t}),Dt(de,o.chosenClass,!0)},o.ignore.split(\",\").forEach(function(u){pE(de,u.trim(),iu)}),tt(a,\"dragover\",hi),tt(a,\"mousemove\",hi),tt(a,\"touchmove\",hi),tt(a,\"mouseup\",i._onDrop),tt(a,\"touchend\",i._onDrop),tt(a,\"touchcancel\",i._onDrop),Sp&&this.nativeDraggable&&(this.options.touchStartThreshold=4,de.draggable=!0),Cn(\"delayStart\",this,{evt:t}),o.delay&&(!o.delayOnTouchOnly||n)&&(!this.nativeDraggable||!(zo||Hr))){if(Le.eventCanceled){this._onDrop();return}tt(a,\"mouseup\",i._disableDelayedDrag),tt(a,\"touchend\",i._disableDelayedDrag),tt(a,\"touchcancel\",i._disableDelayedDrag),tt(a,\"mousemove\",i._delayedDragTouchMoveHandler),tt(a,\"touchmove\",i._delayedDragTouchMoveHandler),o.supportPointer&&tt(a,\"pointermove\",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(l,o.delay)}else l()}},_delayedDragTouchMoveHandler:function(t){var n=t.touches?t.touches[0]:t;Math.max(Math.abs(n.clientX-this._lastX),Math.abs(n.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){de&&iu(de),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;Je(t,\"mouseup\",this._disableDelayedDrag),Je(t,\"touchend\",this._disableDelayedDrag),Je(t,\"touchcancel\",this._disableDelayedDrag),Je(t,\"mousemove\",this._delayedDragTouchMoveHandler),Je(t,\"touchmove\",this._delayedDragTouchMoveHandler),Je(t,\"pointermove\",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,n){n=n||t.pointerType==\"touch\"&&t,!this.nativeDraggable||n?this.options.supportPointer?tt(document,\"pointermove\",this._onTouchMove):n?tt(document,\"touchmove\",this._onTouchMove):tt(document,\"mousemove\",this._onTouchMove):(tt(de,\"dragend\",this),tt(Et,\"dragstart\",this._onDragStart));try{document.selection?$a(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch{}},_dragStarted:function(t,n){if(Ji=!1,Et&&de){Cn(\"dragStarted\",this,{evt:n}),this.nativeDraggable&&tt(document,\"dragover\",P1);var r=this.options;!t&&Dt(de,r.dragClass,!1),Dt(de,r.ghostClass,!0),Le.active=this,t&&this._appendGhost(),gn({sortable:this,name:\"start\",originalEvent:n})}else this._nulling()},_emulateDragOver:function(){if(tr){this._lastX=tr.clientX,this._lastY=tr.clientY,bE();for(var t=document.elementFromPoint(tr.clientX,tr.clientY),n=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(tr.clientX,tr.clientY),t!==n);)n=t;if(de.parentNode[un]._isOutsideThisEl(t),n)do{if(n[un]){var r=void 0;if(r=n[un]._onDragOver({clientX:tr.clientX,clientY:tr.clientY,target:t,rootEl:n}),r&&!this.options.dragoverBubble)break}t=n}while(n=n.parentNode);SE()}},_onTouchMove:function(t){if(di){var n=this.options,r=n.fallbackTolerance,i=n.fallbackOffset,s=t.touches?t.touches[0]:t,o=We&&Mi(We,!0),a=We&&o&&o.a,l=We&&o&&o.d,c=ba&&tn&&Dp(tn),u=(s.clientX-di.clientX+i.x)/(a||1)+(c?c[0]-ru[0]:0)/(a||1),f=(s.clientY-di.clientY+i.y)/(l||1)+(c?c[1]-ru[1]:0)/(l||1);if(!Le.active&&!Ji){if(r&&Math.max(Math.abs(s.clientX-this._lastX),Math.abs(s.clientY-this._lastY))<r)return;this._onDragStart(t,!0)}if(We){o?(o.e+=u-(tu||0),o.f+=f-(nu||0)):o={a:1,b:0,c:0,d:1,e:u,f};var d=\"matrix(\".concat(o.a,\",\").concat(o.b,\",\").concat(o.c,\",\").concat(o.d,\",\").concat(o.e,\",\").concat(o.f,\")\");Ae(We,\"webkitTransform\",d),Ae(We,\"mozTransform\",d),Ae(We,\"msTransform\",d),Ae(We,\"transform\",d),tu=u,nu=f,tr=s}t.cancelable&&t.preventDefault()}},_appendGhost:function(){if(!We){var t=this.options.fallbackOnBody?document.body:Et,n=St(de,!0,ba,!0,t),r=this.options;if(ba){for(tn=t;Ae(tn,\"position\")===\"static\"&&Ae(tn,\"transform\")===\"none\"&&tn!==document;)tn=tn.parentNode;tn!==document.body&&tn!==document.documentElement?(tn===document&&(tn=mr()),n.top+=tn.scrollTop,n.left+=tn.scrollLeft):tn=mr(),ru=Dp(tn)}We=de.cloneNode(!0),Dt(We,r.ghostClass,!1),Dt(We,r.fallbackClass,!0),Dt(We,r.dragClass,!0),Ae(We,\"transition\",\"\"),Ae(We,\"transform\",\"\"),Ae(We,\"box-sizing\",\"border-box\"),Ae(We,\"margin\",0),Ae(We,\"top\",n.top),Ae(We,\"left\",n.left),Ae(We,\"width\",n.width),Ae(We,\"height\",n.height),Ae(We,\"opacity\",\"0.8\"),Ae(We,\"position\",ba?\"absolute\":\"fixed\"),Ae(We,\"zIndex\",\"100000\"),Ae(We,\"pointerEvents\",\"none\"),Le.ghost=We,t.appendChild(We),Ae(We,\"transform-origin\",Op/parseInt(We.style.width)*100+\"% \"+Ap/parseInt(We.style.height)*100+\"%\")}},_onDragStart:function(t,n){var r=this,i=t.dataTransfer,s=r.options;if(Cn(\"dragStart\",this,{evt:t}),Le.eventCanceled){this._onDrop();return}Cn(\"setupClone\",this),Le.eventCanceled||(_t=Cd(de),_t.draggable=!1,_t.style[\"will-change\"]=\"\",this._hideClone(),Dt(_t,this.options.chosenClass,!1),Le.clone=_t),r.cloneId=$a(function(){Cn(\"clone\",r),!Le.eventCanceled&&(r.options.removeCloneOnHide||Et.insertBefore(_t,de),r._hideClone(),gn({sortable:r,name:\"clone\"}))}),!n&&Dt(de,s.dragClass,!0),n?(wl=!0,r._loopId=setInterval(r._emulateDragOver,50)):(Je(document,\"mouseup\",r._onDrop),Je(document,\"touchend\",r._onDrop),Je(document,\"touchcancel\",r._onDrop),i&&(i.effectAllowed=\"move\",s.setData&&s.setData.call(r,i,de)),tt(document,\"drop\",r),Ae(de,\"transform\",\"translateZ(0)\")),Ji=!0,r._dragStartId=$a(r._dragStarted.bind(r,n,t)),tt(document,\"selectstart\",r),Ys=!0,ro&&Ae(document.body,\"user-select\",\"none\")},_onDragOver:function(t){var n=this.el,r=t.target,i,s,o,a=this.options,l=a.group,c=Le.active,u=ya===l,f=a.sort,d=Gt||c,p,m=this,g=!1;if(nf)return;function v(ee,Te){Cn(ee,m,vr({evt:t,isOwner:u,axis:p?\"vertical\":\"horizontal\",revert:o,dragRect:i,targetRect:s,canSort:f,fromSortable:d,target:r,completed:S,onMove:function(De,$e){return Sa(Et,n,de,i,De,St(De),t,$e)},changed:y},Te))}function w(){v(\"dragOverAnimationCapture\"),m.captureAnimationState(),m!==d&&d.captureAnimationState()}function S(ee){return v(\"dragOverCompleted\",{insertion:ee}),ee&&(u?c._hideClone():c._showClone(m),m!==d&&(Dt(de,Gt?Gt.options.ghostClass:c.options.ghostClass,!1),Dt(de,a.ghostClass,!0)),Gt!==m&&m!==Le.active?Gt=m:m===Le.active&&Gt&&(Gt=null),d===m&&(m._ignoreWhileAnimating=r),m.animateAll(function(){v(\"dragOverAnimationComplete\"),m._ignoreWhileAnimating=null}),m!==d&&(d.animateAll(),d._ignoreWhileAnimating=null)),(r===de&&!de.animated||r===n&&!r.animated)&&(Yi=null),!a.dragoverBubble&&!t.rootEl&&r!==document&&(de.parentNode[un]._isOutsideThisEl(t.target),!ee&&hi(t)),!a.dragoverBubble&&t.stopPropagation&&t.stopPropagation(),g=!0}function y(){Bn=Mt(de),Zr=Mt(de,a.draggable),gn({sortable:m,name:\"change\",toEl:n,newIndex:Bn,newDraggableIndex:Zr,originalEvent:t})}if(t.preventDefault!==void 0&&t.cancelable&&t.preventDefault(),r=sr(r,a.draggable,n,!0),v(\"dragOver\"),Le.eventCanceled)return g;if(de.contains(t.target)||r.animated&&r.animatingX&&r.animatingY||m._ignoreWhileAnimating===r)return S(!1);if(wl=!1,c&&!a.disabled&&(u?f||(o=At!==Et):Gt===this||(this.lastPutMode=ya.checkPull(this,c,de,t))&&l.checkPut(this,c,de,t))){if(p=this._getDirection(t,r)===\"vertical\",i=St(de),v(\"dragOverValid\"),Le.eventCanceled)return g;if(o)return At=Et,w(),this._hideClone(),v(\"revert\"),Le.eventCanceled||(mi?Et.insertBefore(de,mi):Et.appendChild(de)),S(!0);var E=Dd(n,a.draggable);if(!E||V1(t,p,this)&&!E.animated){if(E===de)return S(!1);if(E&&n===t.target&&(r=E),r&&(s=St(r)),Sa(Et,n,de,i,r,s,t,!!r)!==!1)return w(),n.appendChild(de),At=n,y(),S(!0)}else if(E&&F1(t,p,this)){var C=gs(n,0,a,!0);if(C===de)return S(!1);if(r=C,s=St(r),Sa(Et,n,de,i,r,s,t,!1)!==!1)return w(),n.insertBefore(de,C),At=n,y(),S(!0)}else if(r.parentNode===n){s=St(r);var M=0,B,j=de.parentNode!==n,A=!I1(de.animated&&de.toRect||i,r.animated&&r.toRect||s,p),x=p?\"top\":\"left\",k=wp(r,\"top\",\"top\")||wp(de,\"top\",\"top\"),P=k?k.scrollTop:void 0;Yi!==r&&(B=s[x],ao=!1,Ea=!A&&a.invertSwap||j),M=B1(t,r,s,p,A?1:a.swapThreshold,a.invertedSwapThreshold==null?a.swapThreshold:a.invertedSwapThreshold,Ea,Yi===r);var V;if(M!==0){var $=Mt(de);do $-=M,V=At.children[$];while(V&&(Ae(V,\"display\")===\"none\"||V===We))}if(M===0||V===r)return S(!1);Yi=r,oo=M;var Z=r.nextElementSibling,U=!1;U=M===1;var W=Sa(Et,n,de,i,r,s,t,U);if(W!==!1)return(W===1||W===-1)&&(U=W===1),nf=!0,setTimeout(k1,30),w(),U&&!Z?n.appendChild(de):r.parentNode.insertBefore(de,U?Z:r),k&&gE(k,0,P-k.scrollTop),At=de.parentNode,B!==void 0&&!Ea&&(Ua=Math.abs(B-St(r)[x])),y(),S(!0)}if(n.contains(de))return S(!1)}return!1},_ignoreWhileAnimating:null,_offMoveEvents:function(){Je(document,\"mousemove\",this._onTouchMove),Je(document,\"touchmove\",this._onTouchMove),Je(document,\"pointermove\",this._onTouchMove),Je(document,\"dragover\",hi),Je(document,\"mousemove\",hi),Je(document,\"touchmove\",hi)},_offUpEvents:function(){var t=this.el.ownerDocument;Je(t,\"mouseup\",this._onDrop),Je(t,\"touchend\",this._onDrop),Je(t,\"pointerup\",this._onDrop),Je(t,\"touchcancel\",this._onDrop),Je(document,\"selectstart\",this)},_onDrop:function(t){var n=this.el,r=this.options;if(Bn=Mt(de),Zr=Mt(de,r.draggable),Cn(\"drop\",this,{evt:t}),At=de&&de.parentNode,Bn=Mt(de),Zr=Mt(de,r.draggable),Le.eventCanceled){this._nulling();return}Ji=!1,Ea=!1,ao=!1,clearInterval(this._loopId),clearTimeout(this._dragStartTimer),rf(this.cloneId),rf(this._dragStartId),this.nativeDraggable&&(Je(document,\"drop\",this),Je(n,\"dragstart\",this._onDragStart)),this._offMoveEvents(),this._offUpEvents(),ro&&Ae(document.body,\"user-select\",\"\"),Ae(de,\"transform\",\"\"),t&&(Ys&&(t.cancelable&&t.preventDefault(),!r.dropBubble&&t.stopPropagation()),We&&We.parentNode&&We.parentNode.removeChild(We),(Et===At||Gt&&Gt.lastPutMode!==\"clone\")&&_t&&_t.parentNode&&_t.parentNode.removeChild(_t),de&&(this.nativeDraggable&&Je(de,\"dragend\",this),iu(de),de.style[\"will-change\"]=\"\",Ys&&!Ji&&Dt(de,Gt?Gt.options.ghostClass:this.options.ghostClass,!1),Dt(de,this.options.chosenClass,!1),gn({sortable:this,name:\"unchoose\",toEl:At,newIndex:null,newDraggableIndex:null,originalEvent:t}),Et!==At?(Bn>=0&&(gn({rootEl:At,name:\"add\",toEl:At,fromEl:Et,originalEvent:t}),gn({sortable:this,name:\"remove\",toEl:At,originalEvent:t}),gn({rootEl:At,name:\"sort\",toEl:At,fromEl:Et,originalEvent:t}),gn({sortable:this,name:\"sort\",toEl:At,originalEvent:t})),Gt&&Gt.save()):Bn!==qi&&Bn>=0&&(gn({sortable:this,name:\"update\",toEl:At,originalEvent:t}),gn({sortable:this,name:\"sort\",toEl:At,originalEvent:t})),Le.active&&((Bn==null||Bn===-1)&&(Bn=qi,Zr=so),gn({sortable:this,name:\"end\",toEl:At,originalEvent:t}),this.save()))),this._nulling()},_nulling:function(){Cn(\"nulling\",this),Et=de=At=We=mi=_t=Ha=Qr=di=tr=Ys=Bn=Zr=qi=so=Yi=oo=Gt=ya=Le.dragged=Le.ghost=Le.clone=Le.active=null,Cl.forEach(function(t){t.checked=!0}),Cl.length=tu=nu=0},handleEvent:function(t){switch(t.type){case\"drop\":case\"dragend\":this._onDrop(t);break;case\"dragenter\":case\"dragover\":de&&(this._onDragOver(t),L1(t));break;case\"selectstart\":t.preventDefault();break}},toArray:function(){for(var t=[],n,r=this.el.children,i=0,s=r.length,o=this.options;i<s;i++)n=r[i],sr(n,o.draggable,this.el,!1)&&t.push(n.getAttribute(o.dataIdAttr)||H1(n));return t},sort:function(t,n){var r={},i=this.el;this.toArray().forEach(function(s,o){var a=i.children[o];sr(a,this.options.draggable,i,!1)&&(r[s]=a)},this),n&&this.captureAnimationState(),t.forEach(function(s){r[s]&&(i.removeChild(r[s]),i.appendChild(r[s]))}),n&&this.animateAll()},save:function(){var t=this.options.store;t&&t.set&&t.set(this)},closest:function(t,n){return sr(t,n||this.options.draggable,this.el,!1)},option:function(t,n){var r=this.options;if(n===void 0)return r[t];var i=Ko.modifyOption(this,t,n);typeof i<\"u\"?r[t]=i:r[t]=n,t===\"group\"&&EE(r)},destroy:function(){Cn(\"destroy\",this);var t=this.el;t[un]=null,Je(t,\"mousedown\",this._onTapStart),Je(t,\"touchstart\",this._onTapStart),Je(t,\"pointerdown\",this._onTapStart),this.nativeDraggable&&(Je(t,\"dragover\",this),Je(t,\"dragenter\",this)),Array.prototype.forEach.call(t.querySelectorAll(\"[draggable]\"),function(n){n.removeAttribute(\"draggable\")}),this._onDrop(),this._disableDelayedDragEvents(),Dl.splice(Dl.indexOf(this.el),1),this.el=t=null},_hideClone:function(){if(!Qr){if(Cn(\"hideClone\",this),Le.eventCanceled)return;Ae(_t,\"display\",\"none\"),this.options.removeCloneOnHide&&_t.parentNode&&_t.parentNode.removeChild(_t),Qr=!0}},_showClone:function(t){if(t.lastPutMode!==\"clone\"){this._hideClone();return}if(Qr){if(Cn(\"showClone\",this),Le.eventCanceled)return;de.parentNode==Et&&!this.options.group.revertClone?Et.insertBefore(_t,de):mi?Et.insertBefore(_t,mi):Et.appendChild(_t),this.options.group.revertClone&&this.animate(de,_t),Ae(_t,\"display\",\"\"),Qr=!1}}};function L1(e){e.dataTransfer&&(e.dataTransfer.dropEffect=\"move\"),e.cancelable&&e.preventDefault()}function Sa(e,t,n,r,i,s,o,a){var l,c=e[un],u=c.options.onMove,f;return window.CustomEvent&&!Hr&&!zo?l=new CustomEvent(\"move\",{bubbles:!0,cancelable:!0}):(l=document.createEvent(\"Event\"),l.initEvent(\"move\",!0,!0)),l.to=t,l.from=e,l.dragged=n,l.draggedRect=r,l.related=i||t,l.relatedRect=s||St(t),l.willInsertAfter=a,l.originalEvent=o,e.dispatchEvent(l),u&&(f=u.call(c,l,o)),f}function iu(e){e.draggable=!1}function k1(){nf=!1}function F1(e,t,n){var r=St(gs(n.el,0,n.options,!0)),i=10;return t?e.clientX<r.left-i||e.clientY<r.top&&e.clientX<r.right:e.clientY<r.top-i||e.clientY<r.bottom&&e.clientX<r.left}function V1(e,t,n){var r=St(Dd(n.el,n.options.draggable)),i=10;return t?e.clientX>r.right+i||e.clientX<=r.right&&e.clientY>r.bottom&&e.clientX>=r.left:e.clientX>r.right&&e.clientY>r.top||e.clientX<=r.right&&e.clientY>r.bottom+i}function B1(e,t,n,r,i,s,o,a){var l=r?e.clientY:e.clientX,c=r?n.height:n.width,u=r?n.top:n.left,f=r?n.bottom:n.right,d=!1;if(!o){if(a&&Ua<c*i){if(!ao&&(oo===1?l>u+c*s/2:l<f-c*s/2)&&(ao=!0),ao)d=!0;else if(oo===1?l<u+Ua:l>f-Ua)return-oo}else if(l>u+c*(1-i)/2&&l<f-c*(1-i)/2)return j1(t)}return d=d||o,d&&(l<u+c*s/2||l>f-c*s/2)?l>u+c/2?1:-1:0}function j1(e){return Mt(de)<Mt(e)?1:-1}function H1(e){for(var t=e.tagName+e.className+e.src+e.href+e.textContent,n=t.length,r=0;n--;)r+=t.charCodeAt(n);return r.toString(36)}function U1(e){Cl.length=0;for(var t=e.getElementsByTagName(\"input\"),n=t.length;n--;){var r=t[n];r.checked&&Cl.push(r)}}function $a(e){return setTimeout(e,0)}function rf(e){return clearTimeout(e)}wc&&tt(document,\"touchmove\",function(e){(Le.active||Ji)&&e.cancelable&&e.preventDefault()});Le.utils={on:tt,off:Je,css:Ae,find:pE,is:function(t,n){return!!sr(t,n,t,!1)},extend:C1,throttle:mE,closest:sr,toggleClass:Dt,clone:Cd,index:Mt,nextTick:$a,cancelNextTick:rf,detectDirection:yE,getChild:gs};Le.get=function(e){return e[un]};Le.mount=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t[0].constructor===Array&&(t=t[0]),t.forEach(function(r){if(!r.prototype||!r.prototype.constructor)throw\"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(r));r.utils&&(Le.utils=vr(vr({},Le.utils),r.utils)),Ko.mount(r)})};Le.create=function(e,t){return new Le(e,t)};Le.version=S1;var Pt=[],zs,sf,of=!1,su,ou,Ol,Ks;function $1(){function e(){this.defaults={scroll:!0,forceAutoScrollFallback:!1,scrollSensitivity:30,scrollSpeed:10,bubbleScroll:!0};for(var t in this)t.charAt(0)===\"_\"&&typeof this[t]==\"function\"&&(this[t]=this[t].bind(this))}return e.prototype={dragStarted:function(n){var r=n.originalEvent;this.sortable.nativeDraggable?tt(document,\"dragover\",this._handleAutoScroll):this.options.supportPointer?tt(document,\"pointermove\",this._handleFallbackAutoScroll):r.touches?tt(document,\"touchmove\",this._handleFallbackAutoScroll):tt(document,\"mousemove\",this._handleFallbackAutoScroll)},dragOverCompleted:function(n){var r=n.originalEvent;!this.options.dragOverBubble&&!r.rootEl&&this._handleAutoScroll(r)},drop:function(){this.sortable.nativeDraggable?Je(document,\"dragover\",this._handleAutoScroll):(Je(document,\"pointermove\",this._handleFallbackAutoScroll),Je(document,\"touchmove\",this._handleFallbackAutoScroll),Je(document,\"mousemove\",this._handleFallbackAutoScroll)),Mp(),Wa(),O1()},nulling:function(){Ol=sf=zs=of=Ks=su=ou=null,Pt.length=0},_handleFallbackAutoScroll:function(n){this._handleAutoScroll(n,!0)},_handleAutoScroll:function(n,r){var i=this,s=(n.touches?n.touches[0]:n).clientX,o=(n.touches?n.touches[0]:n).clientY,a=document.elementFromPoint(s,o);if(Ol=n,r||this.options.forceAutoScrollFallback||zo||Hr||ro){au(n,this.options,a,r);var l=ei(a,!0);of&&(!Ks||s!==su||o!==ou)&&(Ks&&Mp(),Ks=setInterval(function(){var c=ei(document.elementFromPoint(s,o),!0);c!==l&&(l=c,Wa()),au(n,i.options,c,r)},10),su=s,ou=o)}else{if(!this.options.bubbleScroll||ei(a,!0)===mr()){Wa();return}au(n,this.options,ei(a,!1),!1)}}},Zn(e,{pluginName:\"scroll\",initializeByDefault:!0})}function Wa(){Pt.forEach(function(e){clearInterval(e.pid)}),Pt=[]}function Mp(){clearInterval(Ks)}var au=mE(function(e,t,n,r){if(t.scroll){var i=(e.touches?e.touches[0]:e).clientX,s=(e.touches?e.touches[0]:e).clientY,o=t.scrollSensitivity,a=t.scrollSpeed,l=mr(),c=!1,u;sf!==n&&(sf=n,Wa(),zs=t.scroll,u=t.scrollFn,zs===!0&&(zs=ei(n,!0)));var f=0,d=zs;do{var p=d,m=St(p),g=m.top,v=m.bottom,w=m.left,S=m.right,y=m.width,E=m.height,C=void 0,M=void 0,B=p.scrollWidth,j=p.scrollHeight,A=Ae(p),x=p.scrollLeft,k=p.scrollTop;p===l?(C=y<B&&(A.overflowX===\"auto\"||A.overflowX===\"scroll\"||A.overflowX===\"visible\"),M=E<j&&(A.overflowY===\"auto\"||A.overflowY===\"scroll\"||A.overflowY===\"visible\")):(C=y<B&&(A.overflowX===\"auto\"||A.overflowX===\"scroll\"),M=E<j&&(A.overflowY===\"auto\"||A.overflowY===\"scroll\"));var P=C&&(Math.abs(S-i)<=o&&x+y<B)-(Math.abs(w-i)<=o&&!!x),V=M&&(Math.abs(v-s)<=o&&k+E<j)-(Math.abs(g-s)<=o&&!!k);if(!Pt[f])for(var $=0;$<=f;$++)Pt[$]||(Pt[$]={});(Pt[f].vx!=P||Pt[f].vy!=V||Pt[f].el!==p)&&(Pt[f].el=p,Pt[f].vx=P,Pt[f].vy=V,clearInterval(Pt[f].pid),(P!=0||V!=0)&&(c=!0,Pt[f].pid=setInterval((function(){r&&this.layer===0&&Le.active._onTouchMove(Ol);var Z=Pt[this.layer].vy?Pt[this.layer].vy*a:0,U=Pt[this.layer].vx?Pt[this.layer].vx*a:0;typeof u==\"function\"&&u.call(Le.dragged.parentNode[un],U,Z,e,Ol,Pt[this.layer].el)!==\"continue\"||gE(Pt[this.layer].el,U,Z)}).bind({layer:f}),24))),f++}while(t.bubbleScroll&&d!==l&&(d=ei(d,!1)));of=c}},30),TE=function(t){var n=t.originalEvent,r=t.putSortable,i=t.dragEl,s=t.activeSortable,o=t.dispatchSortableEvent,a=t.hideGhostForTarget,l=t.unhideGhostForTarget;if(n){var c=r||s;a();var u=n.changedTouches&&n.changedTouches.length?n.changedTouches[0]:n,f=document.elementFromPoint(u.clientX,u.clientY);l(),c&&!c.el.contains(f)&&(o(\"spill\"),this.onSpill({dragEl:i,putSortable:r}))}};function Od(){}Od.prototype={startIndex:null,dragStart:function(t){var n=t.oldDraggableIndex;this.startIndex=n},onSpill:function(t){var n=t.dragEl,r=t.putSortable;this.sortable.captureAnimationState(),r&&r.captureAnimationState();var i=gs(this.sortable.el,this.startIndex,this.options);i?this.sortable.el.insertBefore(n,i):this.sortable.el.appendChild(n),this.sortable.animateAll(),r&&r.animateAll()},drop:TE};Zn(Od,{pluginName:\"revertOnSpill\"});function Ad(){}Ad.prototype={onSpill:function(t){var n=t.dragEl,r=t.putSortable,i=r||this.sortable;i.captureAnimationState(),n.parentNode&&n.parentNode.removeChild(n),i.animateAll()},drop:TE};Zn(Ad,{pluginName:\"removeOnSpill\"});var Yn;function W1(){function e(){this.defaults={swapClass:\"sortable-swap-highlight\"}}return e.prototype={dragStart:function(n){var r=n.dragEl;Yn=r},dragOverValid:function(n){var r=n.completed,i=n.target,s=n.onMove,o=n.activeSortable,a=n.changed,l=n.cancel;if(o.options.swap){var c=this.sortable.el,u=this.options;if(i&&i!==c){var f=Yn;s(i)!==!1?(Dt(i,u.swapClass,!0),Yn=i):Yn=null,f&&f!==Yn&&Dt(f,u.swapClass,!1)}a(),r(!0),l()}},drop:function(n){var r=n.activeSortable,i=n.putSortable,s=n.dragEl,o=i||this.sortable,a=this.options;Yn&&Dt(Yn,a.swapClass,!1),Yn&&(a.swap||i&&i.options.swap)&&s!==Yn&&(o.captureAnimationState(),o!==r&&r.captureAnimationState(),Y1(s,Yn),o.animateAll(),o!==r&&r.animateAll())},nulling:function(){Yn=null}},Zn(e,{pluginName:\"swap\",eventProperties:function(){return{swapItem:Yn}}})}function Y1(e,t){var n=e.parentNode,r=t.parentNode,i,s;!n||!r||n.isEqualNode(t)||r.isEqualNode(e)||(i=Mt(e),s=Mt(t),n.isEqualNode(r)&&i<s&&s++,n.insertBefore(t,n.children[i]),r.insertBefore(e,r.children[s]))}var Ue=[],Vn=[],xs,nr,Ns=!1,On=!1,zi=!1,pt,Is,Ta;function z1(){function e(t){for(var n in this)n.charAt(0)===\"_\"&&typeof this[n]==\"function\"&&(this[n]=this[n].bind(this));t.options.supportPointer?tt(document,\"pointerup\",this._deselectMultiDrag):(tt(document,\"mouseup\",this._deselectMultiDrag),tt(document,\"touchend\",this._deselectMultiDrag)),tt(document,\"keydown\",this._checkKeyDown),tt(document,\"keyup\",this._checkKeyUp),this.defaults={selectedClass:\"sortable-selected\",multiDragKey:null,setData:function(i,s){var o=\"\";Ue.length&&nr===t?Ue.forEach(function(a,l){o+=(l?\", \":\"\")+a.textContent}):o=s.textContent,i.setData(\"Text\",o)}}}return e.prototype={multiDragKeyDown:!1,isMultiDrag:!1,delayStartGlobal:function(n){var r=n.dragEl;pt=r},delayEnded:function(){this.isMultiDrag=~Ue.indexOf(pt)},setupClone:function(n){var r=n.sortable,i=n.cancel;if(this.isMultiDrag){for(var s=0;s<Ue.length;s++)Vn.push(Cd(Ue[s])),Vn[s].sortableIndex=Ue[s].sortableIndex,Vn[s].draggable=!1,Vn[s].style[\"will-change\"]=\"\",Dt(Vn[s],this.options.selectedClass,!1),Ue[s]===pt&&Dt(Vn[s],this.options.chosenClass,!1);r._hideClone(),i()}},clone:function(n){var r=n.sortable,i=n.rootEl,s=n.dispatchSortableEvent,o=n.cancel;this.isMultiDrag&&(this.options.removeCloneOnHide||Ue.length&&nr===r&&(xp(!0,i),s(\"clone\"),o()))},showClone:function(n){var r=n.cloneNowShown,i=n.rootEl,s=n.cancel;this.isMultiDrag&&(xp(!1,i),Vn.forEach(function(o){Ae(o,\"display\",\"\")}),r(),Ta=!1,s())},hideClone:function(n){var r=this;n.sortable;var i=n.cloneNowHidden,s=n.cancel;this.isMultiDrag&&(Vn.forEach(function(o){Ae(o,\"display\",\"none\"),r.options.removeCloneOnHide&&o.parentNode&&o.parentNode.removeChild(o)}),i(),Ta=!0,s())},dragStartGlobal:function(n){n.sortable,!this.isMultiDrag&&nr&&nr.multiDrag._deselectMultiDrag(),Ue.forEach(function(r){r.sortableIndex=Mt(r)}),Ue=Ue.sort(function(r,i){return r.sortableIndex-i.sortableIndex}),zi=!0},dragStarted:function(n){var r=this,i=n.sortable;if(this.isMultiDrag){if(this.options.sort&&(i.captureAnimationState(),this.options.animation)){Ue.forEach(function(o){o!==pt&&Ae(o,\"position\",\"absolute\")});var s=St(pt,!1,!0,!0);Ue.forEach(function(o){o!==pt&&Cp(o,s)}),On=!0,Ns=!0}i.animateAll(function(){On=!1,Ns=!1,r.options.animation&&Ue.forEach(function(o){qc(o)}),r.options.sort&&wa()})}},dragOver:function(n){var r=n.target,i=n.completed,s=n.cancel;On&&~Ue.indexOf(r)&&(i(!1),s())},revert:function(n){var r=n.fromSortable,i=n.rootEl,s=n.sortable,o=n.dragRect;Ue.length>1&&(Ue.forEach(function(a){s.addAnimationState({target:a,rect:On?St(a):o}),qc(a),a.fromRect=o,r.removeAnimationState(a)}),On=!1,K1(!this.options.removeCloneOnHide,i))},dragOverCompleted:function(n){var r=n.sortable,i=n.isOwner,s=n.insertion,o=n.activeSortable,a=n.parentEl,l=n.putSortable,c=this.options;if(s){if(i&&o._hideClone(),Ns=!1,c.animation&&Ue.length>1&&(On||!i&&!o.options.sort&&!l)){var u=St(pt,!1,!0,!0);Ue.forEach(function(d){d!==pt&&(Cp(d,u),a.appendChild(d))}),On=!0}if(!i)if(On||wa(),Ue.length>1){var f=Ta;o._showClone(r),o.options.animation&&!Ta&&f&&Vn.forEach(function(d){o.addAnimationState({target:d,rect:Is}),d.fromRect=Is,d.thisAnimationDuration=null})}else o._showClone(r)}},dragOverAnimationCapture:function(n){var r=n.dragRect,i=n.isOwner,s=n.activeSortable;if(Ue.forEach(function(a){a.thisAnimationDuration=null}),s.options.animation&&!i&&s.multiDrag.isMultiDrag){Is=Zn({},r);var o=Mi(pt,!0);Is.top-=o.f,Is.left-=o.e}},dragOverAnimationComplete:function(){On&&(On=!1,wa())},drop:function(n){var r=n.originalEvent,i=n.rootEl,s=n.parentEl,o=n.sortable,a=n.dispatchSortableEvent,l=n.oldIndex,c=n.putSortable,u=c||this.sortable;if(r){var f=this.options,d=s.children;if(!zi)if(f.multiDragKey&&!this.multiDragKeyDown&&this._deselectMultiDrag(),Dt(pt,f.selectedClass,!~Ue.indexOf(pt)),~Ue.indexOf(pt))Ue.splice(Ue.indexOf(pt),1),xs=null,Ws({sortable:o,rootEl:i,name:\"deselect\",targetEl:pt});else{if(Ue.push(pt),Ws({sortable:o,rootEl:i,name:\"select\",targetEl:pt}),r.shiftKey&&xs&&o.el.contains(xs)){var p=Mt(xs),m=Mt(pt);if(~p&&~m&&p!==m){var g,v;for(m>p?(v=p,g=m):(v=m,g=p+1);v<g;v++)~Ue.indexOf(d[v])||(Dt(d[v],f.selectedClass,!0),Ue.push(d[v]),Ws({sortable:o,rootEl:i,name:\"select\",targetEl:d[v]}))}}else xs=pt;nr=u}if(zi&&this.isMultiDrag){if(On=!1,(s[un].options.sort||s!==i)&&Ue.length>1){var w=St(pt),S=Mt(pt,\":not(.\"+this.options.selectedClass+\")\");if(!Ns&&f.animation&&(pt.thisAnimationDuration=null),u.captureAnimationState(),!Ns&&(f.animation&&(pt.fromRect=w,Ue.forEach(function(E){if(E.thisAnimationDuration=null,E!==pt){var C=On?St(E):w;E.fromRect=C,u.addAnimationState({target:E,rect:C})}})),wa(),Ue.forEach(function(E){d[S]?s.insertBefore(E,d[S]):s.appendChild(E),S++}),l===Mt(pt))){var y=!1;Ue.forEach(function(E){if(E.sortableIndex!==Mt(E)){y=!0;return}}),y&&a(\"update\")}Ue.forEach(function(E){qc(E)}),u.animateAll()}nr=u}(i===s||c&&c.lastPutMode!==\"clone\")&&Vn.forEach(function(E){E.parentNode&&E.parentNode.removeChild(E)})}},nullingGlobal:function(){this.isMultiDrag=zi=!1,Vn.length=0},destroyGlobal:function(){this._deselectMultiDrag(),Je(document,\"pointerup\",this._deselectMultiDrag),Je(document,\"mouseup\",this._deselectMultiDrag),Je(document,\"touchend\",this._deselectMultiDrag),Je(document,\"keydown\",this._checkKeyDown),Je(document,\"keyup\",this._checkKeyUp)},_deselectMultiDrag:function(n){if(!(typeof zi<\"u\"&&zi)&&nr===this.sortable&&!(n&&sr(n.target,this.options.draggable,this.sortable.el,!1))&&!(n&&n.button!==0))for(;Ue.length;){var r=Ue[0];Dt(r,this.options.selectedClass,!1),Ue.shift(),Ws({sortable:this.sortable,rootEl:this.sortable.el,name:\"deselect\",targetEl:r})}},_checkKeyDown:function(n){n.key===this.options.multiDragKey&&(this.multiDragKeyDown=!0)},_checkKeyUp:function(n){n.key===this.options.multiDragKey&&(this.multiDragKeyDown=!1)}},Zn(e,{pluginName:\"multiDrag\",utils:{select:function(n){var r=n.parentNode[un];!r||!r.options.multiDrag||~Ue.indexOf(n)||(nr&&nr!==r&&(nr.multiDrag._deselectMultiDrag(),nr=r),Dt(n,r.options.selectedClass,!0),Ue.push(n))},deselect:function(n){var r=n.parentNode[un],i=Ue.indexOf(n);!r||!r.options.multiDrag||!~i||(Dt(n,r.options.selectedClass,!1),Ue.splice(i,1))}},eventProperties:function(){var n=this,r=[],i=[];return Ue.forEach(function(s){r.push({multiDragElement:s,index:s.sortableIndex});var o;On&&s!==pt?o=-1:On?o=Mt(s,\":not(.\"+n.options.selectedClass+\")\"):o=Mt(s),i.push({multiDragElement:s,index:o})}),{items:g1(Ue),clones:[].concat(Vn),oldIndicies:r,newIndicies:i}},optionListeners:{multiDragKey:function(n){return n=n.toLowerCase(),n===\"ctrl\"?n=\"Control\":n.length>1&&(n=n.charAt(0).toUpperCase()+n.substr(1)),n}}})}function K1(e,t){Ue.forEach(function(n,r){var i=t.children[n.sortableIndex+(e?Number(r):0)];i?t.insertBefore(n,i):t.appendChild(n)})}function xp(e,t){Vn.forEach(function(n,r){var i=t.children[n.sortableIndex+(e?Number(r):0)];i?t.insertBefore(n,i):t.appendChild(n)})}function wa(){Ue.forEach(function(e){e!==pt&&e.parentNode&&e.parentNode.removeChild(e)})}Le.mount(new $1);Le.mount(Ad,Od);const G1=Object.freeze(Object.defineProperty({__proto__:null,MultiDrag:z1,Sortable:Le,Swap:W1,default:Le},Symbol.toStringTag,{value:\"Module\"})),X1=Ec(G1);(function(e,t){(function(r,i){e.exports=i(jy(),X1)})(typeof self<\"u\"?self:Wo,function(n,r){return function(i){var s={};function o(a){if(s[a])return s[a].exports;var l=s[a]={i:a,l:!1,exports:{}};return i[a].call(l.exports,l,l.exports,o),l.l=!0,l.exports}return o.m=i,o.c=s,o.d=function(a,l,c){o.o(a,l)||Object.defineProperty(a,l,{enumerable:!0,get:c})},o.r=function(a){typeof Symbol<\"u\"&&Symbol.toStringTag&&Object.defineProperty(a,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(a,\"__esModule\",{value:!0})},o.t=function(a,l){if(l&1&&(a=o(a)),l&8||l&4&&typeof a==\"object\"&&a&&a.__esModule)return a;var c=Object.create(null);if(o.r(c),Object.defineProperty(c,\"default\",{enumerable:!0,value:a}),l&2&&typeof a!=\"string\")for(var u in a)o.d(c,u,(function(f){return a[f]}).bind(null,u));return c},o.n=function(a){var l=a&&a.__esModule?function(){return a.default}:function(){return a};return o.d(l,\"a\",l),l},o.o=function(a,l){return Object.prototype.hasOwnProperty.call(a,l)},o.p=\"\",o(o.s=\"fb15\")}({\"00ee\":function(i,s,o){var a=o(\"b622\"),l=a(\"toStringTag\"),c={};c[l]=\"z\",i.exports=String(c)===\"[object z]\"},\"0366\":function(i,s,o){var a=o(\"1c0b\");i.exports=function(l,c,u){if(a(l),c===void 0)return l;switch(u){case 0:return function(){return l.call(c)};case 1:return function(f){return l.call(c,f)};case 2:return function(f,d){return l.call(c,f,d)};case 3:return function(f,d,p){return l.call(c,f,d,p)}}return function(){return l.apply(c,arguments)}}},\"057f\":function(i,s,o){var a=o(\"fc6a\"),l=o(\"241c\").f,c={}.toString,u=typeof window==\"object\"&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],f=function(d){try{return l(d)}catch{return u.slice()}};i.exports.f=function(p){return u&&c.call(p)==\"[object Window]\"?f(p):l(a(p))}},\"06cf\":function(i,s,o){var a=o(\"83ab\"),l=o(\"d1e7\"),c=o(\"5c6c\"),u=o(\"fc6a\"),f=o(\"c04e\"),d=o(\"5135\"),p=o(\"0cfb\"),m=Object.getOwnPropertyDescriptor;s.f=a?m:function(v,w){if(v=u(v),w=f(w,!0),p)try{return m(v,w)}catch{}if(d(v,w))return c(!l.f.call(v,w),v[w])}},\"0cfb\":function(i,s,o){var a=o(\"83ab\"),l=o(\"d039\"),c=o(\"cc12\");i.exports=!a&&!l(function(){return Object.defineProperty(c(\"div\"),\"a\",{get:function(){return 7}}).a!=7})},\"13d5\":function(i,s,o){var a=o(\"23e7\"),l=o(\"d58f\").left,c=o(\"a640\"),u=o(\"ae40\"),f=c(\"reduce\"),d=u(\"reduce\",{1:0});a({target:\"Array\",proto:!0,forced:!f||!d},{reduce:function(m){return l(this,m,arguments.length,arguments.length>1?arguments[1]:void 0)}})},\"14c3\":function(i,s,o){var a=o(\"c6b6\"),l=o(\"9263\");i.exports=function(c,u){var f=c.exec;if(typeof f==\"function\"){var d=f.call(c,u);if(typeof d!=\"object\")throw TypeError(\"RegExp exec method returned something other than an Object or null\");return d}if(a(c)!==\"RegExp\")throw TypeError(\"RegExp#exec called on incompatible receiver\");return l.call(c,u)}},\"159b\":function(i,s,o){var a=o(\"da84\"),l=o(\"fdbc\"),c=o(\"17c2\"),u=o(\"9112\");for(var f in l){var d=a[f],p=d&&d.prototype;if(p&&p.forEach!==c)try{u(p,\"forEach\",c)}catch{p.forEach=c}}},\"17c2\":function(i,s,o){var a=o(\"b727\").forEach,l=o(\"a640\"),c=o(\"ae40\"),u=l(\"forEach\"),f=c(\"forEach\");i.exports=!u||!f?function(p){return a(this,p,arguments.length>1?arguments[1]:void 0)}:[].forEach},\"1be4\":function(i,s,o){var a=o(\"d066\");i.exports=a(\"document\",\"documentElement\")},\"1c0b\":function(i,s){i.exports=function(o){if(typeof o!=\"function\")throw TypeError(String(o)+\" is not a function\");return o}},\"1c7e\":function(i,s,o){var a=o(\"b622\"),l=a(\"iterator\"),c=!1;try{var u=0,f={next:function(){return{done:!!u++}},return:function(){c=!0}};f[l]=function(){return this},Array.from(f,function(){throw 2})}catch{}i.exports=function(d,p){if(!p&&!c)return!1;var m=!1;try{var g={};g[l]=function(){return{next:function(){return{done:m=!0}}}},d(g)}catch{}return m}},\"1d80\":function(i,s){i.exports=function(o){if(o==null)throw TypeError(\"Can't call method on \"+o);return o}},\"1dde\":function(i,s,o){var a=o(\"d039\"),l=o(\"b622\"),c=o(\"2d00\"),u=l(\"species\");i.exports=function(f){return c>=51||!a(function(){var d=[],p=d.constructor={};return p[u]=function(){return{foo:1}},d[f](Boolean).foo!==1})}},\"23cb\":function(i,s,o){var a=o(\"a691\"),l=Math.max,c=Math.min;i.exports=function(u,f){var d=a(u);return d<0?l(d+f,0):c(d,f)}},\"23e7\":function(i,s,o){var a=o(\"da84\"),l=o(\"06cf\").f,c=o(\"9112\"),u=o(\"6eeb\"),f=o(\"ce4e\"),d=o(\"e893\"),p=o(\"94ca\");i.exports=function(m,g){var v=m.target,w=m.global,S=m.stat,y,E,C,M,B,j;if(w?E=a:S?E=a[v]||f(v,{}):E=(a[v]||{}).prototype,E)for(C in g){if(B=g[C],m.noTargetGet?(j=l(E,C),M=j&&j.value):M=E[C],y=p(w?C:v+(S?\".\":\"#\")+C,m.forced),!y&&M!==void 0){if(typeof B==typeof M)continue;d(B,M)}(m.sham||M&&M.sham)&&c(B,\"sham\",!0),u(E,C,B,m)}}},\"241c\":function(i,s,o){var a=o(\"ca84\"),l=o(\"7839\"),c=l.concat(\"length\",\"prototype\");s.f=Object.getOwnPropertyNames||function(f){return a(f,c)}},\"25f0\":function(i,s,o){var a=o(\"6eeb\"),l=o(\"825a\"),c=o(\"d039\"),u=o(\"ad6d\"),f=\"toString\",d=RegExp.prototype,p=d[f],m=c(function(){return p.call({source:\"a\",flags:\"b\"})!=\"/a/b\"}),g=p.name!=f;(m||g)&&a(RegExp.prototype,f,function(){var w=l(this),S=String(w.source),y=w.flags,E=String(y===void 0&&w instanceof RegExp&&!(\"flags\"in d)?u.call(w):y);return\"/\"+S+\"/\"+E},{unsafe:!0})},\"2ca0\":function(i,s,o){var a=o(\"23e7\"),l=o(\"06cf\").f,c=o(\"50c4\"),u=o(\"5a34\"),f=o(\"1d80\"),d=o(\"ab13\"),p=o(\"c430\"),m=\"\".startsWith,g=Math.min,v=d(\"startsWith\"),w=!p&&!v&&!!function(){var S=l(String.prototype,\"startsWith\");return S&&!S.writable}();a({target:\"String\",proto:!0,forced:!w&&!v},{startsWith:function(y){var E=String(f(this));u(y);var C=c(g(arguments.length>1?arguments[1]:void 0,E.length)),M=String(y);return m?m.call(E,M,C):E.slice(C,C+M.length)===M}})},\"2d00\":function(i,s,o){var a=o(\"da84\"),l=o(\"342f\"),c=a.process,u=c&&c.versions,f=u&&u.v8,d,p;f?(d=f.split(\".\"),p=d[0]+d[1]):l&&(d=l.match(/Edge\\/(\\d+)/),(!d||d[1]>=74)&&(d=l.match(/Chrome\\/(\\d+)/),d&&(p=d[1]))),i.exports=p&&+p},\"342f\":function(i,s,o){var a=o(\"d066\");i.exports=a(\"navigator\",\"userAgent\")||\"\"},\"35a1\":function(i,s,o){var a=o(\"f5df\"),l=o(\"3f8c\"),c=o(\"b622\"),u=c(\"iterator\");i.exports=function(f){if(f!=null)return f[u]||f[\"@@iterator\"]||l[a(f)]}},\"37e8\":function(i,s,o){var a=o(\"83ab\"),l=o(\"9bf2\"),c=o(\"825a\"),u=o(\"df75\");i.exports=a?Object.defineProperties:function(d,p){c(d);for(var m=u(p),g=m.length,v=0,w;g>v;)l.f(d,w=m[v++],p[w]);return d}},\"3bbe\":function(i,s,o){var a=o(\"861d\");i.exports=function(l){if(!a(l)&&l!==null)throw TypeError(\"Can't set \"+String(l)+\" as a prototype\");return l}},\"3ca3\":function(i,s,o){var a=o(\"6547\").charAt,l=o(\"69f3\"),c=o(\"7dd0\"),u=\"String Iterator\",f=l.set,d=l.getterFor(u);c(String,\"String\",function(p){f(this,{type:u,string:String(p),index:0})},function(){var m=d(this),g=m.string,v=m.index,w;return v>=g.length?{value:void 0,done:!0}:(w=a(g,v),m.index+=w.length,{value:w,done:!1})})},\"3f8c\":function(i,s){i.exports={}},4160:function(i,s,o){var a=o(\"23e7\"),l=o(\"17c2\");a({target:\"Array\",proto:!0,forced:[].forEach!=l},{forEach:l})},\"428f\":function(i,s,o){var a=o(\"da84\");i.exports=a},\"44ad\":function(i,s,o){var a=o(\"d039\"),l=o(\"c6b6\"),c=\"\".split;i.exports=a(function(){return!Object(\"z\").propertyIsEnumerable(0)})?function(u){return l(u)==\"String\"?c.call(u,\"\"):Object(u)}:Object},\"44d2\":function(i,s,o){var a=o(\"b622\"),l=o(\"7c73\"),c=o(\"9bf2\"),u=a(\"unscopables\"),f=Array.prototype;f[u]==null&&c.f(f,u,{configurable:!0,value:l(null)}),i.exports=function(d){f[u][d]=!0}},\"44e7\":function(i,s,o){var a=o(\"861d\"),l=o(\"c6b6\"),c=o(\"b622\"),u=c(\"match\");i.exports=function(f){var d;return a(f)&&((d=f[u])!==void 0?!!d:l(f)==\"RegExp\")}},4930:function(i,s,o){var a=o(\"d039\");i.exports=!!Object.getOwnPropertySymbols&&!a(function(){return!String(Symbol())})},\"4d64\":function(i,s,o){var a=o(\"fc6a\"),l=o(\"50c4\"),c=o(\"23cb\"),u=function(f){return function(d,p,m){var g=a(d),v=l(g.length),w=c(m,v),S;if(f&&p!=p){for(;v>w;)if(S=g[w++],S!=S)return!0}else for(;v>w;w++)if((f||w in g)&&g[w]===p)return f||w||0;return!f&&-1}};i.exports={includes:u(!0),indexOf:u(!1)}},\"4de4\":function(i,s,o){var a=o(\"23e7\"),l=o(\"b727\").filter,c=o(\"1dde\"),u=o(\"ae40\"),f=c(\"filter\"),d=u(\"filter\");a({target:\"Array\",proto:!0,forced:!f||!d},{filter:function(m){return l(this,m,arguments.length>1?arguments[1]:void 0)}})},\"4df4\":function(i,s,o){var a=o(\"0366\"),l=o(\"7b0b\"),c=o(\"9bdd\"),u=o(\"e95a\"),f=o(\"50c4\"),d=o(\"8418\"),p=o(\"35a1\");i.exports=function(g){var v=l(g),w=typeof this==\"function\"?this:Array,S=arguments.length,y=S>1?arguments[1]:void 0,E=y!==void 0,C=p(v),M=0,B,j,A,x,k,P;if(E&&(y=a(y,S>2?arguments[2]:void 0,2)),C!=null&&!(w==Array&&u(C)))for(x=C.call(v),k=x.next,j=new w;!(A=k.call(x)).done;M++)P=E?c(x,y,[A.value,M],!0):A.value,d(j,M,P);else for(B=f(v.length),j=new w(B);B>M;M++)P=E?y(v[M],M):v[M],d(j,M,P);return j.length=M,j}},\"4fad\":function(i,s,o){var a=o(\"23e7\"),l=o(\"6f53\").entries;a({target:\"Object\",stat:!0},{entries:function(u){return l(u)}})},\"50c4\":function(i,s,o){var a=o(\"a691\"),l=Math.min;i.exports=function(c){return c>0?l(a(c),9007199254740991):0}},5135:function(i,s){var o={}.hasOwnProperty;i.exports=function(a,l){return o.call(a,l)}},5319:function(i,s,o){var a=o(\"d784\"),l=o(\"825a\"),c=o(\"7b0b\"),u=o(\"50c4\"),f=o(\"a691\"),d=o(\"1d80\"),p=o(\"8aa5\"),m=o(\"14c3\"),g=Math.max,v=Math.min,w=Math.floor,S=/\\$([$&'`]|\\d\\d?|<[^>]*>)/g,y=/\\$([$&'`]|\\d\\d?)/g,E=function(C){return C===void 0?C:String(C)};a(\"replace\",2,function(C,M,B,j){var A=j.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,x=j.REPLACE_KEEPS_$0,k=A?\"$\":\"$0\";return[function($,Z){var U=d(this),W=$==null?void 0:$[C];return W!==void 0?W.call($,U,Z):M.call(String(U),$,Z)},function(V,$){if(!A&&x||typeof $==\"string\"&&$.indexOf(k)===-1){var Z=B(M,V,this,$);if(Z.done)return Z.value}var U=l(V),W=String(this),ee=typeof $==\"function\";ee||($=String($));var Te=U.global;if(Te){var ze=U.unicode;U.lastIndex=0}for(var De=[];;){var $e=m(U,W);if($e===null||(De.push($e),!Te))break;var Ve=String($e[0]);Ve===\"\"&&(U.lastIndex=p(W,u(U.lastIndex),ze))}for(var Ke=\"\",Ie=0,re=0;re<De.length;re++){$e=De[re];for(var me=String($e[0]),xe=g(v(f($e.index),W.length),0),Ne=[],ut=1;ut<$e.length;ut++)Ne.push(E($e[ut]));var dt=$e.groups;if(ee){var Qe=[me].concat(Ne,xe,W);dt!==void 0&&Qe.push(dt);var _=String($.apply(void 0,Qe))}else _=P(me,W,xe,Ne,dt,$);xe>=Ie&&(Ke+=W.slice(Ie,xe)+_,Ie=xe+me.length)}return Ke+W.slice(Ie)}];function P(V,$,Z,U,W,ee){var Te=Z+V.length,ze=U.length,De=y;return W!==void 0&&(W=c(W),De=S),M.call(ee,De,function($e,Ve){var Ke;switch(Ve.charAt(0)){case\"$\":return\"$\";case\"&\":return V;case\"`\":return $.slice(0,Z);case\"'\":return $.slice(Te);case\"<\":Ke=W[Ve.slice(1,-1)];break;default:var Ie=+Ve;if(Ie===0)return $e;if(Ie>ze){var re=w(Ie/10);return re===0?$e:re<=ze?U[re-1]===void 0?Ve.charAt(1):U[re-1]+Ve.charAt(1):$e}Ke=U[Ie-1]}return Ke===void 0?\"\":Ke})}})},5692:function(i,s,o){var a=o(\"c430\"),l=o(\"c6cd\");(i.exports=function(c,u){return l[c]||(l[c]=u!==void 0?u:{})})(\"versions\",[]).push({version:\"3.6.5\",mode:a?\"pure\":\"global\",copyright:\"© 2020 Denis Pushkarev (zloirock.ru)\"})},\"56ef\":function(i,s,o){var a=o(\"d066\"),l=o(\"241c\"),c=o(\"7418\"),u=o(\"825a\");i.exports=a(\"Reflect\",\"ownKeys\")||function(d){var p=l.f(u(d)),m=c.f;return m?p.concat(m(d)):p}},\"5a34\":function(i,s,o){var a=o(\"44e7\");i.exports=function(l){if(a(l))throw TypeError(\"The method doesn't accept regular expressions\");return l}},\"5c6c\":function(i,s){i.exports=function(o,a){return{enumerable:!(o&1),configurable:!(o&2),writable:!(o&4),value:a}}},\"5db7\":function(i,s,o){var a=o(\"23e7\"),l=o(\"a2bf\"),c=o(\"7b0b\"),u=o(\"50c4\"),f=o(\"1c0b\"),d=o(\"65f0\");a({target:\"Array\",proto:!0},{flatMap:function(m){var g=c(this),v=u(g.length),w;return f(m),w=d(g,0),w.length=l(w,g,g,v,0,1,m,arguments.length>1?arguments[1]:void 0),w}})},6547:function(i,s,o){var a=o(\"a691\"),l=o(\"1d80\"),c=function(u){return function(f,d){var p=String(l(f)),m=a(d),g=p.length,v,w;return m<0||m>=g?u?\"\":void 0:(v=p.charCodeAt(m),v<55296||v>56319||m+1===g||(w=p.charCodeAt(m+1))<56320||w>57343?u?p.charAt(m):v:u?p.slice(m,m+2):(v-55296<<10)+(w-56320)+65536)}};i.exports={codeAt:c(!1),charAt:c(!0)}},\"65f0\":function(i,s,o){var a=o(\"861d\"),l=o(\"e8b5\"),c=o(\"b622\"),u=c(\"species\");i.exports=function(f,d){var p;return l(f)&&(p=f.constructor,typeof p==\"function\"&&(p===Array||l(p.prototype))?p=void 0:a(p)&&(p=p[u],p===null&&(p=void 0))),new(p===void 0?Array:p)(d===0?0:d)}},\"69f3\":function(i,s,o){var a=o(\"7f9a\"),l=o(\"da84\"),c=o(\"861d\"),u=o(\"9112\"),f=o(\"5135\"),d=o(\"f772\"),p=o(\"d012\"),m=l.WeakMap,g,v,w,S=function(A){return w(A)?v(A):g(A,{})},y=function(A){return function(x){var k;if(!c(x)||(k=v(x)).type!==A)throw TypeError(\"Incompatible receiver, \"+A+\" required\");return k}};if(a){var E=new m,C=E.get,M=E.has,B=E.set;g=function(A,x){return B.call(E,A,x),x},v=function(A){return C.call(E,A)||{}},w=function(A){return M.call(E,A)}}else{var j=d(\"state\");p[j]=!0,g=function(A,x){return u(A,j,x),x},v=function(A){return f(A,j)?A[j]:{}},w=function(A){return f(A,j)}}i.exports={set:g,get:v,has:w,enforce:S,getterFor:y}},\"6eeb\":function(i,s,o){var a=o(\"da84\"),l=o(\"9112\"),c=o(\"5135\"),u=o(\"ce4e\"),f=o(\"8925\"),d=o(\"69f3\"),p=d.get,m=d.enforce,g=String(String).split(\"String\");(i.exports=function(v,w,S,y){var E=y?!!y.unsafe:!1,C=y?!!y.enumerable:!1,M=y?!!y.noTargetGet:!1;if(typeof S==\"function\"&&(typeof w==\"string\"&&!c(S,\"name\")&&l(S,\"name\",w),m(S).source=g.join(typeof w==\"string\"?w:\"\")),v===a){C?v[w]=S:u(w,S);return}else E?!M&&v[w]&&(C=!0):delete v[w];C?v[w]=S:l(v,w,S)})(Function.prototype,\"toString\",function(){return typeof this==\"function\"&&p(this).source||f(this)})},\"6f53\":function(i,s,o){var a=o(\"83ab\"),l=o(\"df75\"),c=o(\"fc6a\"),u=o(\"d1e7\").f,f=function(d){return function(p){for(var m=c(p),g=l(m),v=g.length,w=0,S=[],y;v>w;)y=g[w++],(!a||u.call(m,y))&&S.push(d?[y,m[y]]:m[y]);return S}};i.exports={entries:f(!0),values:f(!1)}},\"73d9\":function(i,s,o){var a=o(\"44d2\");a(\"flatMap\")},7418:function(i,s){s.f=Object.getOwnPropertySymbols},\"746f\":function(i,s,o){var a=o(\"428f\"),l=o(\"5135\"),c=o(\"e538\"),u=o(\"9bf2\").f;i.exports=function(f){var d=a.Symbol||(a.Symbol={});l(d,f)||u(d,f,{value:c.f(f)})}},7839:function(i,s){i.exports=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"]},\"7b0b\":function(i,s,o){var a=o(\"1d80\");i.exports=function(l){return Object(a(l))}},\"7c73\":function(i,s,o){var a=o(\"825a\"),l=o(\"37e8\"),c=o(\"7839\"),u=o(\"d012\"),f=o(\"1be4\"),d=o(\"cc12\"),p=o(\"f772\"),m=\">\",g=\"<\",v=\"prototype\",w=\"script\",S=p(\"IE_PROTO\"),y=function(){},E=function(A){return g+w+m+A+g+\"/\"+w+m},C=function(A){A.write(E(\"\")),A.close();var x=A.parentWindow.Object;return A=null,x},M=function(){var A=d(\"iframe\"),x=\"java\"+w+\":\",k;return A.style.display=\"none\",f.appendChild(A),A.src=String(x),k=A.contentWindow.document,k.open(),k.write(E(\"document.F=Object\")),k.close(),k.F},B,j=function(){try{B=document.domain&&new ActiveXObject(\"htmlfile\")}catch{}j=B?C(B):M();for(var A=c.length;A--;)delete j[v][c[A]];return j()};u[S]=!0,i.exports=Object.create||function(x,k){var P;return x!==null?(y[v]=a(x),P=new y,y[v]=null,P[S]=x):P=j(),k===void 0?P:l(P,k)}},\"7dd0\":function(i,s,o){var a=o(\"23e7\"),l=o(\"9ed3\"),c=o(\"e163\"),u=o(\"d2bb\"),f=o(\"d44e\"),d=o(\"9112\"),p=o(\"6eeb\"),m=o(\"b622\"),g=o(\"c430\"),v=o(\"3f8c\"),w=o(\"ae93\"),S=w.IteratorPrototype,y=w.BUGGY_SAFARI_ITERATORS,E=m(\"iterator\"),C=\"keys\",M=\"values\",B=\"entries\",j=function(){return this};i.exports=function(A,x,k,P,V,$,Z){l(k,x,P);var U=function(re){if(re===V&&De)return De;if(!y&&re in Te)return Te[re];switch(re){case C:return function(){return new k(this,re)};case M:return function(){return new k(this,re)};case B:return function(){return new k(this,re)}}return function(){return new k(this)}},W=x+\" Iterator\",ee=!1,Te=A.prototype,ze=Te[E]||Te[\"@@iterator\"]||V&&Te[V],De=!y&&ze||U(V),$e=x==\"Array\"&&Te.entries||ze,Ve,Ke,Ie;if($e&&(Ve=c($e.call(new A)),S!==Object.prototype&&Ve.next&&(!g&&c(Ve)!==S&&(u?u(Ve,S):typeof Ve[E]!=\"function\"&&d(Ve,E,j)),f(Ve,W,!0,!0),g&&(v[W]=j))),V==M&&ze&&ze.name!==M&&(ee=!0,De=function(){return ze.call(this)}),(!g||Z)&&Te[E]!==De&&d(Te,E,De),v[x]=De,V)if(Ke={values:U(M),keys:$?De:U(C),entries:U(B)},Z)for(Ie in Ke)(y||ee||!(Ie in Te))&&p(Te,Ie,Ke[Ie]);else a({target:x,proto:!0,forced:y||ee},Ke);return Ke}},\"7f9a\":function(i,s,o){var a=o(\"da84\"),l=o(\"8925\"),c=a.WeakMap;i.exports=typeof c==\"function\"&&/native code/.test(l(c))},\"825a\":function(i,s,o){var a=o(\"861d\");i.exports=function(l){if(!a(l))throw TypeError(String(l)+\" is not an object\");return l}},\"83ab\":function(i,s,o){var a=o(\"d039\");i.exports=!a(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!=7})},8418:function(i,s,o){var a=o(\"c04e\"),l=o(\"9bf2\"),c=o(\"5c6c\");i.exports=function(u,f,d){var p=a(f);p in u?l.f(u,p,c(0,d)):u[p]=d}},\"861d\":function(i,s){i.exports=function(o){return typeof o==\"object\"?o!==null:typeof o==\"function\"}},8875:function(i,s,o){var a,l,c;(function(u,f){l=[],a=f,c=typeof a==\"function\"?a.apply(s,l):a,c!==void 0&&(i.exports=c)})(typeof self<\"u\"?self:this,function(){function u(){var f=Object.getOwnPropertyDescriptor(document,\"currentScript\");if(!f&&\"currentScript\"in document&&document.currentScript||f&&f.get!==u&&document.currentScript)return document.currentScript;try{throw new Error}catch(B){var d=/.*at [^(]*\\((.*):(.+):(.+)\\)$/ig,p=/@([^@]*):(\\d+):(\\d+)\\s*$/ig,m=d.exec(B.stack)||p.exec(B.stack),g=m&&m[1]||!1,v=m&&m[2]||!1,w=document.location.href.replace(document.location.hash,\"\"),S,y,E,C=document.getElementsByTagName(\"script\");g===w&&(S=document.documentElement.outerHTML,y=new RegExp(\"(?:[^\\\\n]+?\\\\n){0,\"+(v-2)+\"}[^<]*<script>([\\\\d\\\\D]*?)<\\\\/script>[\\\\d\\\\D]*\",\"i\"),E=S.replace(y,\"$1\").trim());for(var M=0;M<C.length;M++)if(C[M].readyState===\"interactive\"||C[M].src===g||g===w&&C[M].innerHTML&&C[M].innerHTML.trim()===E)return C[M];return null}}return u})},8925:function(i,s,o){var a=o(\"c6cd\"),l=Function.toString;typeof a.inspectSource!=\"function\"&&(a.inspectSource=function(c){return l.call(c)}),i.exports=a.inspectSource},\"8aa5\":function(i,s,o){var a=o(\"6547\").charAt;i.exports=function(l,c,u){return c+(u?a(l,c).length:1)}},\"8bbf\":function(i,s){i.exports=n},\"90e3\":function(i,s){var o=0,a=Math.random();i.exports=function(l){return\"Symbol(\"+String(l===void 0?\"\":l)+\")_\"+(++o+a).toString(36)}},9112:function(i,s,o){var a=o(\"83ab\"),l=o(\"9bf2\"),c=o(\"5c6c\");i.exports=a?function(u,f,d){return l.f(u,f,c(1,d))}:function(u,f,d){return u[f]=d,u}},9263:function(i,s,o){var a=o(\"ad6d\"),l=o(\"9f7f\"),c=RegExp.prototype.exec,u=String.prototype.replace,f=c,d=function(){var v=/a/,w=/b*/g;return c.call(v,\"a\"),c.call(w,\"a\"),v.lastIndex!==0||w.lastIndex!==0}(),p=l.UNSUPPORTED_Y||l.BROKEN_CARET,m=/()??/.exec(\"\")[1]!==void 0,g=d||m||p;g&&(f=function(w){var S=this,y,E,C,M,B=p&&S.sticky,j=a.call(S),A=S.source,x=0,k=w;return B&&(j=j.replace(\"y\",\"\"),j.indexOf(\"g\")===-1&&(j+=\"g\"),k=String(w).slice(S.lastIndex),S.lastIndex>0&&(!S.multiline||S.multiline&&w[S.lastIndex-1]!==`\n`)&&(A=\"(?: \"+A+\")\",k=\" \"+k,x++),E=new RegExp(\"^(?:\"+A+\")\",j)),m&&(E=new RegExp(\"^\"+A+\"$(?!\\\\s)\",j)),d&&(y=S.lastIndex),C=c.call(B?E:S,k),B?C?(C.input=C.input.slice(x),C[0]=C[0].slice(x),C.index=S.lastIndex,S.lastIndex+=C[0].length):S.lastIndex=0:d&&C&&(S.lastIndex=S.global?C.index+C[0].length:y),m&&C&&C.length>1&&u.call(C[0],E,function(){for(M=1;M<arguments.length-2;M++)arguments[M]===void 0&&(C[M]=void 0)}),C}),i.exports=f},\"94ca\":function(i,s,o){var a=o(\"d039\"),l=/#|\\.prototype\\./,c=function(m,g){var v=f[u(m)];return v==p?!0:v==d?!1:typeof g==\"function\"?a(g):!!g},u=c.normalize=function(m){return String(m).replace(l,\".\").toLowerCase()},f=c.data={},d=c.NATIVE=\"N\",p=c.POLYFILL=\"P\";i.exports=c},\"99af\":function(i,s,o){var a=o(\"23e7\"),l=o(\"d039\"),c=o(\"e8b5\"),u=o(\"861d\"),f=o(\"7b0b\"),d=o(\"50c4\"),p=o(\"8418\"),m=o(\"65f0\"),g=o(\"1dde\"),v=o(\"b622\"),w=o(\"2d00\"),S=v(\"isConcatSpreadable\"),y=9007199254740991,E=\"Maximum allowed index exceeded\",C=w>=51||!l(function(){var A=[];return A[S]=!1,A.concat()[0]!==A}),M=g(\"concat\"),B=function(A){if(!u(A))return!1;var x=A[S];return x!==void 0?!!x:c(A)},j=!C||!M;a({target:\"Array\",proto:!0,forced:j},{concat:function(x){var k=f(this),P=m(k,0),V=0,$,Z,U,W,ee;for($=-1,U=arguments.length;$<U;$++)if(ee=$===-1?k:arguments[$],B(ee)){if(W=d(ee.length),V+W>y)throw TypeError(E);for(Z=0;Z<W;Z++,V++)Z in ee&&p(P,V,ee[Z])}else{if(V>=y)throw TypeError(E);p(P,V++,ee)}return P.length=V,P}})},\"9bdd\":function(i,s,o){var a=o(\"825a\");i.exports=function(l,c,u,f){try{return f?c(a(u)[0],u[1]):c(u)}catch(p){var d=l.return;throw d!==void 0&&a(d.call(l)),p}}},\"9bf2\":function(i,s,o){var a=o(\"83ab\"),l=o(\"0cfb\"),c=o(\"825a\"),u=o(\"c04e\"),f=Object.defineProperty;s.f=a?f:function(p,m,g){if(c(p),m=u(m,!0),c(g),l)try{return f(p,m,g)}catch{}if(\"get\"in g||\"set\"in g)throw TypeError(\"Accessors not supported\");return\"value\"in g&&(p[m]=g.value),p}},\"9ed3\":function(i,s,o){var a=o(\"ae93\").IteratorPrototype,l=o(\"7c73\"),c=o(\"5c6c\"),u=o(\"d44e\"),f=o(\"3f8c\"),d=function(){return this};i.exports=function(p,m,g){var v=m+\" Iterator\";return p.prototype=l(a,{next:c(1,g)}),u(p,v,!1,!0),f[v]=d,p}},\"9f7f\":function(i,s,o){var a=o(\"d039\");function l(c,u){return RegExp(c,u)}s.UNSUPPORTED_Y=a(function(){var c=l(\"a\",\"y\");return c.lastIndex=2,c.exec(\"abcd\")!=null}),s.BROKEN_CARET=a(function(){var c=l(\"^r\",\"gy\");return c.lastIndex=2,c.exec(\"str\")!=null})},a2bf:function(i,s,o){var a=o(\"e8b5\"),l=o(\"50c4\"),c=o(\"0366\"),u=function(f,d,p,m,g,v,w,S){for(var y=g,E=0,C=w?c(w,S,3):!1,M;E<m;){if(E in p){if(M=C?C(p[E],E,d):p[E],v>0&&a(M))y=u(f,d,M,l(M.length),y,v-1)-1;else{if(y>=9007199254740991)throw TypeError(\"Exceed the acceptable array length\");f[y]=M}y++}E++}return y};i.exports=u},a352:function(i,s){i.exports=r},a434:function(i,s,o){var a=o(\"23e7\"),l=o(\"23cb\"),c=o(\"a691\"),u=o(\"50c4\"),f=o(\"7b0b\"),d=o(\"65f0\"),p=o(\"8418\"),m=o(\"1dde\"),g=o(\"ae40\"),v=m(\"splice\"),w=g(\"splice\",{ACCESSORS:!0,0:0,1:2}),S=Math.max,y=Math.min,E=9007199254740991,C=\"Maximum allowed length exceeded\";a({target:\"Array\",proto:!0,forced:!v||!w},{splice:function(B,j){var A=f(this),x=u(A.length),k=l(B,x),P=arguments.length,V,$,Z,U,W,ee;if(P===0?V=$=0:P===1?(V=0,$=x-k):(V=P-2,$=y(S(c(j),0),x-k)),x+V-$>E)throw TypeError(C);for(Z=d(A,$),U=0;U<$;U++)W=k+U,W in A&&p(Z,U,A[W]);if(Z.length=$,V<$){for(U=k;U<x-$;U++)W=U+$,ee=U+V,W in A?A[ee]=A[W]:delete A[ee];for(U=x;U>x-$+V;U--)delete A[U-1]}else if(V>$)for(U=x-$;U>k;U--)W=U+$-1,ee=U+V-1,W in A?A[ee]=A[W]:delete A[ee];for(U=0;U<V;U++)A[U+k]=arguments[U+2];return A.length=x-$+V,Z}})},a4d3:function(i,s,o){var a=o(\"23e7\"),l=o(\"da84\"),c=o(\"d066\"),u=o(\"c430\"),f=o(\"83ab\"),d=o(\"4930\"),p=o(\"fdbf\"),m=o(\"d039\"),g=o(\"5135\"),v=o(\"e8b5\"),w=o(\"861d\"),S=o(\"825a\"),y=o(\"7b0b\"),E=o(\"fc6a\"),C=o(\"c04e\"),M=o(\"5c6c\"),B=o(\"7c73\"),j=o(\"df75\"),A=o(\"241c\"),x=o(\"057f\"),k=o(\"7418\"),P=o(\"06cf\"),V=o(\"9bf2\"),$=o(\"d1e7\"),Z=o(\"9112\"),U=o(\"6eeb\"),W=o(\"5692\"),ee=o(\"f772\"),Te=o(\"d012\"),ze=o(\"90e3\"),De=o(\"b622\"),$e=o(\"e538\"),Ve=o(\"746f\"),Ke=o(\"d44e\"),Ie=o(\"69f3\"),re=o(\"b727\").forEach,me=ee(\"hidden\"),xe=\"Symbol\",Ne=\"prototype\",ut=De(\"toPrimitive\"),dt=Ie.set,Qe=Ie.getterFor(xe),_=Object[Ne],N=l.Symbol,Y=c(\"JSON\",\"stringify\"),Q=P.f,J=V.f,q=x.f,se=$.f,ne=W(\"symbols\"),ie=W(\"op-symbols\"),te=W(\"string-to-symbol-registry\"),Se=W(\"symbol-to-string-registry\"),ce=W(\"wks\"),ge=l.QObject,we=!ge||!ge[Ne]||!ge[Ne].findChild,Fe=f&&m(function(){return B(J({},\"a\",{get:function(){return J(this,\"a\",{value:7}).a}})).a!=7})?function(he,ue,ve){var Ee=Q(_,ue);Ee&&delete _[ue],J(he,ue,ve),Ee&&he!==_&&J(_,ue,Ee)}:J,Xe=function(he,ue){var ve=ne[he]=B(N[Ne]);return dt(ve,{type:xe,tag:he,description:ue}),f||(ve.description=ue),ve},L=p?function(he){return typeof he==\"symbol\"}:function(he){return Object(he)instanceof N},H=function(ue,ve,Ee){ue===_&&H(ie,ve,Ee),S(ue);var _e=C(ve,!0);return S(Ee),g(ne,_e)?(Ee.enumerable?(g(ue,me)&&ue[me][_e]&&(ue[me][_e]=!1),Ee=B(Ee,{enumerable:M(0,!1)})):(g(ue,me)||J(ue,me,M(1,{})),ue[me][_e]=!0),Fe(ue,_e,Ee)):J(ue,_e,Ee)},T=function(ue,ve){S(ue);var Ee=E(ve),_e=j(Ee).concat(oe(Ee));return re(_e,function(it){(!f||F.call(Ee,it))&&H(ue,it,Ee[it])}),ue},O=function(ue,ve){return ve===void 0?B(ue):T(B(ue),ve)},F=function(ue){var ve=C(ue,!0),Ee=se.call(this,ve);return this===_&&g(ne,ve)&&!g(ie,ve)?!1:Ee||!g(this,ve)||!g(ne,ve)||g(this,me)&&this[me][ve]?Ee:!0},G=function(ue,ve){var Ee=E(ue),_e=C(ve,!0);if(!(Ee===_&&g(ne,_e)&&!g(ie,_e))){var it=Q(Ee,_e);return it&&g(ne,_e)&&!(g(Ee,me)&&Ee[me][_e])&&(it.enumerable=!0),it}},X=function(ue){var ve=q(E(ue)),Ee=[];return re(ve,function(_e){!g(ne,_e)&&!g(Te,_e)&&Ee.push(_e)}),Ee},oe=function(ue){var ve=ue===_,Ee=q(ve?ie:E(ue)),_e=[];return re(Ee,function(it){g(ne,it)&&(!ve||g(_,it))&&_e.push(ne[it])}),_e};if(d||(N=function(){if(this instanceof N)throw TypeError(\"Symbol is not a constructor\");var ue=!arguments.length||arguments[0]===void 0?void 0:String(arguments[0]),ve=ze(ue),Ee=function(_e){this===_&&Ee.call(ie,_e),g(this,me)&&g(this[me],ve)&&(this[me][ve]=!1),Fe(this,ve,M(1,_e))};return f&&we&&Fe(_,ve,{configurable:!0,set:Ee}),Xe(ve,ue)},U(N[Ne],\"toString\",function(){return Qe(this).tag}),U(N,\"withoutSetter\",function(he){return Xe(ze(he),he)}),$.f=F,V.f=H,P.f=G,A.f=x.f=X,k.f=oe,$e.f=function(he){return Xe(De(he),he)},f&&(J(N[Ne],\"description\",{configurable:!0,get:function(){return Qe(this).description}}),u||U(_,\"propertyIsEnumerable\",F,{unsafe:!0}))),a({global:!0,wrap:!0,forced:!d,sham:!d},{Symbol:N}),re(j(ce),function(he){Ve(he)}),a({target:xe,stat:!0,forced:!d},{for:function(he){var ue=String(he);if(g(te,ue))return te[ue];var ve=N(ue);return te[ue]=ve,Se[ve]=ue,ve},keyFor:function(ue){if(!L(ue))throw TypeError(ue+\" is not a symbol\");if(g(Se,ue))return Se[ue]},useSetter:function(){we=!0},useSimple:function(){we=!1}}),a({target:\"Object\",stat:!0,forced:!d,sham:!f},{create:O,defineProperty:H,defineProperties:T,getOwnPropertyDescriptor:G}),a({target:\"Object\",stat:!0,forced:!d},{getOwnPropertyNames:X,getOwnPropertySymbols:oe}),a({target:\"Object\",stat:!0,forced:m(function(){k.f(1)})},{getOwnPropertySymbols:function(ue){return k.f(y(ue))}}),Y){var ae=!d||m(function(){var he=N();return Y([he])!=\"[null]\"||Y({a:he})!=\"{}\"||Y(Object(he))!=\"{}\"});a({target:\"JSON\",stat:!0,forced:ae},{stringify:function(ue,ve,Ee){for(var _e=[ue],it=1,b;arguments.length>it;)_e.push(arguments[it++]);if(b=ve,!(!w(ve)&&ue===void 0||L(ue)))return v(ve)||(ve=function(D,R){if(typeof b==\"function\"&&(R=b.call(this,D,R)),!L(R))return R}),_e[1]=ve,Y.apply(null,_e)}})}N[Ne][ut]||Z(N[Ne],ut,N[Ne].valueOf),Ke(N,xe),Te[me]=!0},a630:function(i,s,o){var a=o(\"23e7\"),l=o(\"4df4\"),c=o(\"1c7e\"),u=!c(function(f){Array.from(f)});a({target:\"Array\",stat:!0,forced:u},{from:l})},a640:function(i,s,o){var a=o(\"d039\");i.exports=function(l,c){var u=[][l];return!!u&&a(function(){u.call(null,c||function(){throw 1},1)})}},a691:function(i,s){var o=Math.ceil,a=Math.floor;i.exports=function(l){return isNaN(l=+l)?0:(l>0?a:o)(l)}},ab13:function(i,s,o){var a=o(\"b622\"),l=a(\"match\");i.exports=function(c){var u=/./;try{\"/./\"[c](u)}catch{try{return u[l]=!1,\"/./\"[c](u)}catch{}}return!1}},ac1f:function(i,s,o){var a=o(\"23e7\"),l=o(\"9263\");a({target:\"RegExp\",proto:!0,forced:/./.exec!==l},{exec:l})},ad6d:function(i,s,o){var a=o(\"825a\");i.exports=function(){var l=a(this),c=\"\";return l.global&&(c+=\"g\"),l.ignoreCase&&(c+=\"i\"),l.multiline&&(c+=\"m\"),l.dotAll&&(c+=\"s\"),l.unicode&&(c+=\"u\"),l.sticky&&(c+=\"y\"),c}},ae40:function(i,s,o){var a=o(\"83ab\"),l=o(\"d039\"),c=o(\"5135\"),u=Object.defineProperty,f={},d=function(p){throw p};i.exports=function(p,m){if(c(f,p))return f[p];m||(m={});var g=[][p],v=c(m,\"ACCESSORS\")?m.ACCESSORS:!1,w=c(m,0)?m[0]:d,S=c(m,1)?m[1]:void 0;return f[p]=!!g&&!l(function(){if(v&&!a)return!0;var y={length:-1};v?u(y,1,{enumerable:!0,get:d}):y[1]=1,g.call(y,w,S)})}},ae93:function(i,s,o){var a=o(\"e163\"),l=o(\"9112\"),c=o(\"5135\"),u=o(\"b622\"),f=o(\"c430\"),d=u(\"iterator\"),p=!1,m=function(){return this},g,v,w;[].keys&&(w=[].keys(),\"next\"in w?(v=a(a(w)),v!==Object.prototype&&(g=v)):p=!0),g==null&&(g={}),!f&&!c(g,d)&&l(g,d,m),i.exports={IteratorPrototype:g,BUGGY_SAFARI_ITERATORS:p}},b041:function(i,s,o){var a=o(\"00ee\"),l=o(\"f5df\");i.exports=a?{}.toString:function(){return\"[object \"+l(this)+\"]\"}},b0c0:function(i,s,o){var a=o(\"83ab\"),l=o(\"9bf2\").f,c=Function.prototype,u=c.toString,f=/^\\s*function ([^ (]*)/,d=\"name\";a&&!(d in c)&&l(c,d,{configurable:!0,get:function(){try{return u.call(this).match(f)[1]}catch{return\"\"}}})},b622:function(i,s,o){var a=o(\"da84\"),l=o(\"5692\"),c=o(\"5135\"),u=o(\"90e3\"),f=o(\"4930\"),d=o(\"fdbf\"),p=l(\"wks\"),m=a.Symbol,g=d?m:m&&m.withoutSetter||u;i.exports=function(v){return c(p,v)||(f&&c(m,v)?p[v]=m[v]:p[v]=g(\"Symbol.\"+v)),p[v]}},b64b:function(i,s,o){var a=o(\"23e7\"),l=o(\"7b0b\"),c=o(\"df75\"),u=o(\"d039\"),f=u(function(){c(1)});a({target:\"Object\",stat:!0,forced:f},{keys:function(p){return c(l(p))}})},b727:function(i,s,o){var a=o(\"0366\"),l=o(\"44ad\"),c=o(\"7b0b\"),u=o(\"50c4\"),f=o(\"65f0\"),d=[].push,p=function(m){var g=m==1,v=m==2,w=m==3,S=m==4,y=m==6,E=m==5||y;return function(C,M,B,j){for(var A=c(C),x=l(A),k=a(M,B,3),P=u(x.length),V=0,$=j||f,Z=g?$(C,P):v?$(C,0):void 0,U,W;P>V;V++)if((E||V in x)&&(U=x[V],W=k(U,V,A),m)){if(g)Z[V]=W;else if(W)switch(m){case 3:return!0;case 5:return U;case 6:return V;case 2:d.call(Z,U)}else if(S)return!1}return y?-1:w||S?S:Z}};i.exports={forEach:p(0),map:p(1),filter:p(2),some:p(3),every:p(4),find:p(5),findIndex:p(6)}},c04e:function(i,s,o){var a=o(\"861d\");i.exports=function(l,c){if(!a(l))return l;var u,f;if(c&&typeof(u=l.toString)==\"function\"&&!a(f=u.call(l))||typeof(u=l.valueOf)==\"function\"&&!a(f=u.call(l))||!c&&typeof(u=l.toString)==\"function\"&&!a(f=u.call(l)))return f;throw TypeError(\"Can't convert object to primitive value\")}},c430:function(i,s){i.exports=!1},c6b6:function(i,s){var o={}.toString;i.exports=function(a){return o.call(a).slice(8,-1)}},c6cd:function(i,s,o){var a=o(\"da84\"),l=o(\"ce4e\"),c=\"__core-js_shared__\",u=a[c]||l(c,{});i.exports=u},c740:function(i,s,o){var a=o(\"23e7\"),l=o(\"b727\").findIndex,c=o(\"44d2\"),u=o(\"ae40\"),f=\"findIndex\",d=!0,p=u(f);f in[]&&Array(1)[f](function(){d=!1}),a({target:\"Array\",proto:!0,forced:d||!p},{findIndex:function(g){return l(this,g,arguments.length>1?arguments[1]:void 0)}}),c(f)},c8ba:function(i,s){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch{typeof window==\"object\"&&(o=window)}i.exports=o},c975:function(i,s,o){var a=o(\"23e7\"),l=o(\"4d64\").indexOf,c=o(\"a640\"),u=o(\"ae40\"),f=[].indexOf,d=!!f&&1/[1].indexOf(1,-0)<0,p=c(\"indexOf\"),m=u(\"indexOf\",{ACCESSORS:!0,1:0});a({target:\"Array\",proto:!0,forced:d||!p||!m},{indexOf:function(v){return d?f.apply(this,arguments)||0:l(this,v,arguments.length>1?arguments[1]:void 0)}})},ca84:function(i,s,o){var a=o(\"5135\"),l=o(\"fc6a\"),c=o(\"4d64\").indexOf,u=o(\"d012\");i.exports=function(f,d){var p=l(f),m=0,g=[],v;for(v in p)!a(u,v)&&a(p,v)&&g.push(v);for(;d.length>m;)a(p,v=d[m++])&&(~c(g,v)||g.push(v));return g}},caad:function(i,s,o){var a=o(\"23e7\"),l=o(\"4d64\").includes,c=o(\"44d2\"),u=o(\"ae40\"),f=u(\"indexOf\",{ACCESSORS:!0,1:0});a({target:\"Array\",proto:!0,forced:!f},{includes:function(p){return l(this,p,arguments.length>1?arguments[1]:void 0)}}),c(\"includes\")},cc12:function(i,s,o){var a=o(\"da84\"),l=o(\"861d\"),c=a.document,u=l(c)&&l(c.createElement);i.exports=function(f){return u?c.createElement(f):{}}},ce4e:function(i,s,o){var a=o(\"da84\"),l=o(\"9112\");i.exports=function(c,u){try{l(a,c,u)}catch{a[c]=u}return u}},d012:function(i,s){i.exports={}},d039:function(i,s){i.exports=function(o){try{return!!o()}catch{return!0}}},d066:function(i,s,o){var a=o(\"428f\"),l=o(\"da84\"),c=function(u){return typeof u==\"function\"?u:void 0};i.exports=function(u,f){return arguments.length<2?c(a[u])||c(l[u]):a[u]&&a[u][f]||l[u]&&l[u][f]}},d1e7:function(i,s,o){var a={}.propertyIsEnumerable,l=Object.getOwnPropertyDescriptor,c=l&&!a.call({1:2},1);s.f=c?function(f){var d=l(this,f);return!!d&&d.enumerable}:a},d28b:function(i,s,o){var a=o(\"746f\");a(\"iterator\")},d2bb:function(i,s,o){var a=o(\"825a\"),l=o(\"3bbe\");i.exports=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var c=!1,u={},f;try{f=Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set,f.call(u,[]),c=u instanceof Array}catch{}return function(p,m){return a(p),l(m),c?f.call(p,m):p.__proto__=m,p}}():void 0)},d3b7:function(i,s,o){var a=o(\"00ee\"),l=o(\"6eeb\"),c=o(\"b041\");a||l(Object.prototype,\"toString\",c,{unsafe:!0})},d44e:function(i,s,o){var a=o(\"9bf2\").f,l=o(\"5135\"),c=o(\"b622\"),u=c(\"toStringTag\");i.exports=function(f,d,p){f&&!l(f=p?f:f.prototype,u)&&a(f,u,{configurable:!0,value:d})}},d58f:function(i,s,o){var a=o(\"1c0b\"),l=o(\"7b0b\"),c=o(\"44ad\"),u=o(\"50c4\"),f=function(d){return function(p,m,g,v){a(m);var w=l(p),S=c(w),y=u(w.length),E=d?y-1:0,C=d?-1:1;if(g<2)for(;;){if(E in S){v=S[E],E+=C;break}if(E+=C,d?E<0:y<=E)throw TypeError(\"Reduce of empty array with no initial value\")}for(;d?E>=0:y>E;E+=C)E in S&&(v=m(v,S[E],E,w));return v}};i.exports={left:f(!1),right:f(!0)}},d784:function(i,s,o){o(\"ac1f\");var a=o(\"6eeb\"),l=o(\"d039\"),c=o(\"b622\"),u=o(\"9263\"),f=o(\"9112\"),d=c(\"species\"),p=!l(function(){var S=/./;return S.exec=function(){var y=[];return y.groups={a:\"7\"},y},\"\".replace(S,\"$<a>\")!==\"7\"}),m=function(){return\"a\".replace(/./,\"$0\")===\"$0\"}(),g=c(\"replace\"),v=function(){return/./[g]?/./[g](\"a\",\"$0\")===\"\":!1}(),w=!l(function(){var S=/(?:)/,y=S.exec;S.exec=function(){return y.apply(this,arguments)};var E=\"ab\".split(S);return E.length!==2||E[0]!==\"a\"||E[1]!==\"b\"});i.exports=function(S,y,E,C){var M=c(S),B=!l(function(){var V={};return V[M]=function(){return 7},\"\"[S](V)!=7}),j=B&&!l(function(){var V=!1,$=/a/;return S===\"split\"&&($={},$.constructor={},$.constructor[d]=function(){return $},$.flags=\"\",$[M]=/./[M]),$.exec=function(){return V=!0,null},$[M](\"\"),!V});if(!B||!j||S===\"replace\"&&!(p&&m&&!v)||S===\"split\"&&!w){var A=/./[M],x=E(M,\"\"[S],function(V,$,Z,U,W){return $.exec===u?B&&!W?{done:!0,value:A.call($,Z,U)}:{done:!0,value:V.call(Z,$,U)}:{done:!1}},{REPLACE_KEEPS_$0:m,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:v}),k=x[0],P=x[1];a(String.prototype,S,k),a(RegExp.prototype,M,y==2?function(V,$){return P.call(V,this,$)}:function(V){return P.call(V,this)})}C&&f(RegExp.prototype[M],\"sham\",!0)}},d81d:function(i,s,o){var a=o(\"23e7\"),l=o(\"b727\").map,c=o(\"1dde\"),u=o(\"ae40\"),f=c(\"map\"),d=u(\"map\");a({target:\"Array\",proto:!0,forced:!f||!d},{map:function(m){return l(this,m,arguments.length>1?arguments[1]:void 0)}})},da84:function(i,s,o){(function(a){var l=function(c){return c&&c.Math==Math&&c};i.exports=l(typeof globalThis==\"object\"&&globalThis)||l(typeof window==\"object\"&&window)||l(typeof self==\"object\"&&self)||l(typeof a==\"object\"&&a)||Function(\"return this\")()}).call(this,o(\"c8ba\"))},dbb4:function(i,s,o){var a=o(\"23e7\"),l=o(\"83ab\"),c=o(\"56ef\"),u=o(\"fc6a\"),f=o(\"06cf\"),d=o(\"8418\");a({target:\"Object\",stat:!0,sham:!l},{getOwnPropertyDescriptors:function(m){for(var g=u(m),v=f.f,w=c(g),S={},y=0,E,C;w.length>y;)C=v(g,E=w[y++]),C!==void 0&&d(S,E,C);return S}})},dbf1:function(i,s,o){(function(a){o.d(s,\"a\",function(){return c});function l(){return typeof window<\"u\"?window.console:a.console}var c=l()}).call(this,o(\"c8ba\"))},ddb0:function(i,s,o){var a=o(\"da84\"),l=o(\"fdbc\"),c=o(\"e260\"),u=o(\"9112\"),f=o(\"b622\"),d=f(\"iterator\"),p=f(\"toStringTag\"),m=c.values;for(var g in l){var v=a[g],w=v&&v.prototype;if(w){if(w[d]!==m)try{u(w,d,m)}catch{w[d]=m}if(w[p]||u(w,p,g),l[g]){for(var S in c)if(w[S]!==c[S])try{u(w,S,c[S])}catch{w[S]=c[S]}}}}},df75:function(i,s,o){var a=o(\"ca84\"),l=o(\"7839\");i.exports=Object.keys||function(u){return a(u,l)}},e01a:function(i,s,o){var a=o(\"23e7\"),l=o(\"83ab\"),c=o(\"da84\"),u=o(\"5135\"),f=o(\"861d\"),d=o(\"9bf2\").f,p=o(\"e893\"),m=c.Symbol;if(l&&typeof m==\"function\"&&(!(\"description\"in m.prototype)||m().description!==void 0)){var g={},v=function(){var M=arguments.length<1||arguments[0]===void 0?void 0:String(arguments[0]),B=this instanceof v?new m(M):M===void 0?m():m(M);return M===\"\"&&(g[B]=!0),B};p(v,m);var w=v.prototype=m.prototype;w.constructor=v;var S=w.toString,y=String(m(\"test\"))==\"Symbol(test)\",E=/^Symbol\\((.*)\\)[^)]+$/;d(w,\"description\",{configurable:!0,get:function(){var M=f(this)?this.valueOf():this,B=S.call(M);if(u(g,M))return\"\";var j=y?B.slice(7,-1):B.replace(E,\"$1\");return j===\"\"?void 0:j}}),a({global:!0,forced:!0},{Symbol:v})}},e163:function(i,s,o){var a=o(\"5135\"),l=o(\"7b0b\"),c=o(\"f772\"),u=o(\"e177\"),f=c(\"IE_PROTO\"),d=Object.prototype;i.exports=u?Object.getPrototypeOf:function(p){return p=l(p),a(p,f)?p[f]:typeof p.constructor==\"function\"&&p instanceof p.constructor?p.constructor.prototype:p instanceof Object?d:null}},e177:function(i,s,o){var a=o(\"d039\");i.exports=!a(function(){function l(){}return l.prototype.constructor=null,Object.getPrototypeOf(new l)!==l.prototype})},e260:function(i,s,o){var a=o(\"fc6a\"),l=o(\"44d2\"),c=o(\"3f8c\"),u=o(\"69f3\"),f=o(\"7dd0\"),d=\"Array Iterator\",p=u.set,m=u.getterFor(d);i.exports=f(Array,\"Array\",function(g,v){p(this,{type:d,target:a(g),index:0,kind:v})},function(){var g=m(this),v=g.target,w=g.kind,S=g.index++;return!v||S>=v.length?(g.target=void 0,{value:void 0,done:!0}):w==\"keys\"?{value:S,done:!1}:w==\"values\"?{value:v[S],done:!1}:{value:[S,v[S]],done:!1}},\"values\"),c.Arguments=c.Array,l(\"keys\"),l(\"values\"),l(\"entries\")},e439:function(i,s,o){var a=o(\"23e7\"),l=o(\"d039\"),c=o(\"fc6a\"),u=o(\"06cf\").f,f=o(\"83ab\"),d=l(function(){u(1)}),p=!f||d;a({target:\"Object\",stat:!0,forced:p,sham:!f},{getOwnPropertyDescriptor:function(g,v){return u(c(g),v)}})},e538:function(i,s,o){var a=o(\"b622\");s.f=a},e893:function(i,s,o){var a=o(\"5135\"),l=o(\"56ef\"),c=o(\"06cf\"),u=o(\"9bf2\");i.exports=function(f,d){for(var p=l(d),m=u.f,g=c.f,v=0;v<p.length;v++){var w=p[v];a(f,w)||m(f,w,g(d,w))}}},e8b5:function(i,s,o){var a=o(\"c6b6\");i.exports=Array.isArray||function(c){return a(c)==\"Array\"}},e95a:function(i,s,o){var a=o(\"b622\"),l=o(\"3f8c\"),c=a(\"iterator\"),u=Array.prototype;i.exports=function(f){return f!==void 0&&(l.Array===f||u[c]===f)}},f5df:function(i,s,o){var a=o(\"00ee\"),l=o(\"c6b6\"),c=o(\"b622\"),u=c(\"toStringTag\"),f=l(function(){return arguments}())==\"Arguments\",d=function(p,m){try{return p[m]}catch{}};i.exports=a?l:function(p){var m,g,v;return p===void 0?\"Undefined\":p===null?\"Null\":typeof(g=d(m=Object(p),u))==\"string\"?g:f?l(m):(v=l(m))==\"Object\"&&typeof m.callee==\"function\"?\"Arguments\":v}},f772:function(i,s,o){var a=o(\"5692\"),l=o(\"90e3\"),c=a(\"keys\");i.exports=function(u){return c[u]||(c[u]=l(u))}},fb15:function(i,s,o){if(o.r(s),typeof window<\"u\"){var a=window.document.currentScript;{var l=o(\"8875\");a=l(),\"currentScript\"in document||Object.defineProperty(document,\"currentScript\",{get:l})}var c=a&&a.src.match(/(.+\\/)[^/]+\\.js(\\?.*)?$/);c&&(o.p=c[1])}o(\"99af\"),o(\"4de4\"),o(\"4160\"),o(\"c975\"),o(\"d81d\"),o(\"a434\"),o(\"159b\"),o(\"a4d3\"),o(\"e439\"),o(\"dbb4\"),o(\"b64b\");function u(L,H,T){return H in L?Object.defineProperty(L,H,{value:T,enumerable:!0,configurable:!0,writable:!0}):L[H]=T,L}function f(L,H){var T=Object.keys(L);if(Object.getOwnPropertySymbols){var O=Object.getOwnPropertySymbols(L);H&&(O=O.filter(function(F){return Object.getOwnPropertyDescriptor(L,F).enumerable})),T.push.apply(T,O)}return T}function d(L){for(var H=1;H<arguments.length;H++){var T=arguments[H]!=null?arguments[H]:{};H%2?f(Object(T),!0).forEach(function(O){u(L,O,T[O])}):Object.getOwnPropertyDescriptors?Object.defineProperties(L,Object.getOwnPropertyDescriptors(T)):f(Object(T)).forEach(function(O){Object.defineProperty(L,O,Object.getOwnPropertyDescriptor(T,O))})}return L}function p(L){if(Array.isArray(L))return L}o(\"e01a\"),o(\"d28b\"),o(\"e260\"),o(\"d3b7\"),o(\"3ca3\"),o(\"ddb0\");function m(L,H){if(!(typeof Symbol>\"u\"||!(Symbol.iterator in Object(L)))){var T=[],O=!0,F=!1,G=void 0;try{for(var X=L[Symbol.iterator](),oe;!(O=(oe=X.next()).done)&&(T.push(oe.value),!(H&&T.length===H));O=!0);}catch(ae){F=!0,G=ae}finally{try{!O&&X.return!=null&&X.return()}finally{if(F)throw G}}return T}}o(\"a630\"),o(\"fb6a\"),o(\"b0c0\"),o(\"25f0\");function g(L,H){(H==null||H>L.length)&&(H=L.length);for(var T=0,O=new Array(H);T<H;T++)O[T]=L[T];return O}function v(L,H){if(L){if(typeof L==\"string\")return g(L,H);var T=Object.prototype.toString.call(L).slice(8,-1);if(T===\"Object\"&&L.constructor&&(T=L.constructor.name),T===\"Map\"||T===\"Set\")return Array.from(L);if(T===\"Arguments\"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(T))return g(L,H)}}function w(){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 S(L,H){return p(L)||m(L,H)||v(L,H)||w()}function y(L){if(Array.isArray(L))return g(L)}function E(L){if(typeof Symbol<\"u\"&&Symbol.iterator in Object(L))return Array.from(L)}function C(){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 M(L){return y(L)||E(L)||v(L)||C()}var B=o(\"a352\"),j=o.n(B);function A(L){L.parentElement!==null&&L.parentElement.removeChild(L)}function x(L,H,T){var O=T===0?L.children[0]:L.children[T-1].nextSibling;L.insertBefore(H,O)}var k=o(\"dbf1\");o(\"13d5\"),o(\"4fad\"),o(\"ac1f\"),o(\"5319\");function P(L){var H=Object.create(null);return function(O){var F=H[O];return F||(H[O]=L(O))}}var V=/-(\\w)/g,$=P(function(L){return L.replace(V,function(H,T){return T.toUpperCase()})});o(\"5db7\"),o(\"73d9\");var Z=[\"Start\",\"Add\",\"Remove\",\"Update\",\"End\"],U=[\"Choose\",\"Unchoose\",\"Sort\",\"Filter\",\"Clone\"],W=[\"Move\"],ee=[W,Z,U].flatMap(function(L){return L}).map(function(L){return\"on\".concat(L)}),Te={manage:W,manageAndEmit:Z,emit:U};function ze(L){return ee.indexOf(L)!==-1}o(\"caad\"),o(\"2ca0\");var De=[\"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\",\"label\",\"legend\",\"li\",\"link\",\"main\",\"map\",\"mark\",\"math\",\"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\",\"slot\",\"small\",\"source\",\"span\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"svg\",\"table\",\"tbody\",\"td\",\"template\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"title\",\"tr\",\"track\",\"u\",\"ul\",\"var\",\"video\",\"wbr\"];function $e(L){return De.includes(L)}function Ve(L){return[\"transition-group\",\"TransitionGroup\"].includes(L)}function Ke(L){return[\"id\",\"class\",\"role\",\"style\"].includes(L)||L.startsWith(\"data-\")||L.startsWith(\"aria-\")||L.startsWith(\"on\")}function Ie(L){return L.reduce(function(H,T){var O=S(T,2),F=O[0],G=O[1];return H[F]=G,H},{})}function re(L){var H=L.$attrs,T=L.componentData,O=T===void 0?{}:T,F=Ie(Object.entries(H).filter(function(G){var X=S(G,2),oe=X[0];return X[1],Ke(oe)}));return d(d({},F),O)}function me(L){var H=L.$attrs,T=L.callBackBuilder,O=Ie(xe(H));Object.entries(T).forEach(function(G){var X=S(G,2),oe=X[0],ae=X[1];Te[oe].forEach(function(he){O[\"on\".concat(he)]=ae(he)})});var F=\"[data-draggable]\".concat(O.draggable||\"\");return d(d({},O),{},{draggable:F})}function xe(L){return Object.entries(L).filter(function(H){var T=S(H,2),O=T[0];return T[1],!Ke(O)}).map(function(H){var T=S(H,2),O=T[0],F=T[1];return[$(O),F]}).filter(function(H){var T=S(H,2),O=T[0];return T[1],!ze(O)})}o(\"c740\");function Ne(L,H){if(!(L instanceof H))throw new TypeError(\"Cannot call a class as a function\")}function ut(L,H){for(var T=0;T<H.length;T++){var O=H[T];O.enumerable=O.enumerable||!1,O.configurable=!0,\"value\"in O&&(O.writable=!0),Object.defineProperty(L,O.key,O)}}function dt(L,H,T){return H&&ut(L.prototype,H),L}var Qe=function(H){var T=H.el;return T},_=function(H,T){return H.__draggable_context=T},N=function(H){return H.__draggable_context},Y=function(){function L(H){var T=H.nodes,O=T.header,F=T.default,G=T.footer,X=H.root,oe=H.realList;Ne(this,L),this.defaultNodes=F,this.children=[].concat(M(O),M(F),M(G)),this.externalComponent=X.externalComponent,this.rootTransition=X.transition,this.tag=X.tag,this.realList=oe}return dt(L,[{key:\"render\",value:function(T,O){var F=this.tag,G=this.children,X=this._isRootComponent,oe=X?{default:function(){return G}}:G;return T(F,O,oe)}},{key:\"updated\",value:function(){var T=this.defaultNodes,O=this.realList;T.forEach(function(F,G){_(Qe(F),{element:O[G],index:G})})}},{key:\"getUnderlyingVm\",value:function(T){return N(T)}},{key:\"getVmIndexFromDomIndex\",value:function(T,O){var F=this.defaultNodes,G=F.length,X=O.children,oe=X.item(T);if(oe===null)return G;var ae=N(oe);if(ae)return ae.index;if(G===0)return 0;var he=Qe(F[0]),ue=M(X).findIndex(function(ve){return ve===he});return T<ue?0:G}},{key:\"_isRootComponent\",get:function(){return this.externalComponent||this.rootTransition}}]),L}(),Q=o(\"8bbf\");function J(L,H){var T=L[H];return T?T():[]}function q(L){var H=L.$slots,T=L.realList,O=L.getKey,F=T||[],G=[\"header\",\"footer\"].map(function(ve){return J(H,ve)}),X=S(G,2),oe=X[0],ae=X[1],he=H.item;if(!he)throw new Error(\"draggable element must have an item slot\");var ue=F.flatMap(function(ve,Ee){return he({element:ve,index:Ee}).map(function(_e){return _e.key=O(ve),_e.props=d(d({},_e.props||{}),{},{\"data-draggable\":!0}),_e})});if(ue.length!==F.length)throw new Error(\"Item slot must have only one child\");return{header:oe,footer:ae,default:ue}}function se(L){var H=Ve(L),T=!$e(L)&&!H;return{transition:H,externalComponent:T,tag:T?Object(Q.resolveComponent)(L):H?Q.TransitionGroup:L}}function ne(L){var H=L.$slots,T=L.tag,O=L.realList,F=L.getKey,G=q({$slots:H,realList:O,getKey:F}),X=se(T);return new Y({nodes:G,root:X,realList:O})}function ie(L,H){var T=this;Object(Q.nextTick)(function(){return T.$emit(L.toLowerCase(),H)})}function te(L){var H=this;return function(T,O){if(H.realList!==null)return H[\"onDrag\".concat(L)](T,O)}}function Se(L){var H=this,T=te.call(this,L);return function(O,F){T.call(H,O,F),ie.call(H,L,O)}}var ce=null,ge={list:{type:Array,required:!1,default:null},modelValue:{type:Array,required:!1,default:null},itemKey:{type:[String,Function],required:!0},clone:{type:Function,default:function(H){return H}},tag:{type:String,default:\"div\"},move:{type:Function,default:null},componentData:{type:Object,required:!1,default:null}},we=[\"update:modelValue\",\"change\"].concat(M([].concat(M(Te.manageAndEmit),M(Te.emit)).map(function(L){return L.toLowerCase()}))),Fe=Object(Q.defineComponent)({name:\"draggable\",inheritAttrs:!1,props:ge,emits:we,data:function(){return{error:!1}},render:function(){try{this.error=!1;var H=this.$slots,T=this.$attrs,O=this.tag,F=this.componentData,G=this.realList,X=this.getKey,oe=ne({$slots:H,tag:O,realList:G,getKey:X});this.componentStructure=oe;var ae=re({$attrs:T,componentData:F});return oe.render(Q.h,ae)}catch(he){return this.error=!0,Object(Q.h)(\"pre\",{style:{color:\"red\"}},he.stack)}},created:function(){this.list!==null&&this.modelValue!==null&&k.a.error(\"modelValue and list props are mutually exclusive! Please set one or another.\")},mounted:function(){var H=this;if(!this.error){var T=this.$attrs,O=this.$el,F=this.componentStructure;F.updated();var G=me({$attrs:T,callBackBuilder:{manageAndEmit:function(ae){return Se.call(H,ae)},emit:function(ae){return ie.bind(H,ae)},manage:function(ae){return te.call(H,ae)}}}),X=O.nodeType===1?O:O.parentElement;this._sortable=new j.a(X,G),this.targetDomElement=X,X.__draggable_component__=this}},updated:function(){this.componentStructure.updated()},beforeUnmount:function(){this._sortable!==void 0&&this._sortable.destroy()},computed:{realList:function(){var H=this.list;return H||this.modelValue},getKey:function(){var H=this.itemKey;return typeof H==\"function\"?H:function(T){return T[H]}}},watch:{$attrs:{handler:function(H){var T=this._sortable;T&&xe(H).forEach(function(O){var F=S(O,2),G=F[0],X=F[1];T.option(G,X)})},deep:!0}},methods:{getUnderlyingVm:function(H){return this.componentStructure.getUnderlyingVm(H)||null},getUnderlyingPotencialDraggableComponent:function(H){return H.__draggable_component__},emitChanges:function(H){var T=this;Object(Q.nextTick)(function(){return T.$emit(\"change\",H)})},alterList:function(H){if(this.list){H(this.list);return}var T=M(this.modelValue);H(T),this.$emit(\"update:modelValue\",T)},spliceList:function(){var H=arguments,T=function(F){return F.splice.apply(F,M(H))};this.alterList(T)},updatePosition:function(H,T){var O=function(G){return G.splice(T,0,G.splice(H,1)[0])};this.alterList(O)},getRelatedContextFromMoveEvent:function(H){var T=H.to,O=H.related,F=this.getUnderlyingPotencialDraggableComponent(T);if(!F)return{component:F};var G=F.realList,X={list:G,component:F};if(T!==O&&G){var oe=F.getUnderlyingVm(O)||{};return d(d({},oe),X)}return X},getVmIndexFromDomIndex:function(H){return this.componentStructure.getVmIndexFromDomIndex(H,this.targetDomElement)},onDragStart:function(H){this.context=this.getUnderlyingVm(H.item),H.item._underlying_vm_=this.clone(this.context.element),ce=H.item},onDragAdd:function(H){var T=H.item._underlying_vm_;if(T!==void 0){A(H.item);var O=this.getVmIndexFromDomIndex(H.newIndex);this.spliceList(O,0,T);var F={element:T,newIndex:O};this.emitChanges({added:F})}},onDragRemove:function(H){if(x(this.$el,H.item,H.oldIndex),H.pullMode===\"clone\"){A(H.clone);return}var T=this.context,O=T.index,F=T.element;this.spliceList(O,1);var G={element:F,oldIndex:O};this.emitChanges({removed:G})},onDragUpdate:function(H){A(H.item),x(H.from,H.item,H.oldIndex);var T=this.context.index,O=this.getVmIndexFromDomIndex(H.newIndex);this.updatePosition(T,O);var F={element:this.context.element,oldIndex:T,newIndex:O};this.emitChanges({moved:F})},computeFutureIndex:function(H,T){if(!H.element)return 0;var O=M(T.to.children).filter(function(oe){return oe.style.display!==\"none\"}),F=O.indexOf(T.related),G=H.component.getVmIndexFromDomIndex(F),X=O.indexOf(ce)!==-1;return X||!T.willInsertAfter?G:G+1},onDragMove:function(H,T){var O=this.move,F=this.realList;if(!O||!F)return!0;var G=this.getRelatedContextFromMoveEvent(H),X=this.computeFutureIndex(G,H),oe=d(d({},this.context),{},{futureIndex:X}),ae=d(d({},H),{},{relatedContext:G,draggedContext:oe});return O(ae,T)},onDragEnd:function(){ce=null}}}),Xe=Fe;s.default=Xe},fb6a:function(i,s,o){var a=o(\"23e7\"),l=o(\"861d\"),c=o(\"e8b5\"),u=o(\"23cb\"),f=o(\"50c4\"),d=o(\"fc6a\"),p=o(\"8418\"),m=o(\"b622\"),g=o(\"1dde\"),v=o(\"ae40\"),w=g(\"slice\"),S=v(\"slice\",{ACCESSORS:!0,0:0,1:2}),y=m(\"species\"),E=[].slice,C=Math.max;a({target:\"Array\",proto:!0,forced:!w||!S},{slice:function(B,j){var A=d(this),x=f(A.length),k=u(B,x),P=u(j===void 0?x:j,x),V,$,Z;if(c(A)&&(V=A.constructor,typeof V==\"function\"&&(V===Array||c(V.prototype))?V=void 0:l(V)&&(V=V[y],V===null&&(V=void 0)),V===Array||V===void 0))return E.call(A,k,P);for($=new(V===void 0?Array:V)(C(P-k,0)),Z=0;k<P;k++,Z++)k in A&&p($,Z,A[k]);return $.length=Z,$}})},fc6a:function(i,s,o){var a=o(\"44ad\"),l=o(\"1d80\");i.exports=function(c){return a(l(c))}},fdbc:function(i,s){i.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},fdbf:function(i,s,o){var a=o(\"4930\");i.exports=a&&!Symbol.sham&&typeof Symbol.iterator==\"symbol\"}}).default})})(fE);var J1=fE.exports;const Z1=vO(J1),Q1={install:e=>{e.component(\"draggable\",Z1)}};var q1=Object.defineProperty,e_=(e,t,n)=>t in e?q1(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Mr=(e,t,n)=>e_(e,typeof t!=\"symbol\"?t+\"\":t,n);const t_=(e,t,n)=>{const r=e[t];return r?typeof r==\"function\"?r():Promise.resolve(r):new Promise((i,s)=>{(typeof queueMicrotask==\"function\"?queueMicrotask:setTimeout)(s.bind(null,new Error(\"Unknown variable dynamic import: \"+t+(t.split(\"/\").length!==n?\". Note that variables only represent file names one level deep.\":\"\"))))})};let Rs,Np,Ip,zn,Ps={},Ki={};class n_{constructor(t,n=!1){Mr(this,\"texts\",{}),Mr(this,\"dateToMinutes\",r=>r.getHours()*60+r.getMinutes()),zn=this,this._texts=t,!n&&Date&&!Date.prototype.addDays&&this._initDatePrototypes()}_initDatePrototypes(){Date.prototype.addDays=function(t){return zn.addDays(this,t)},Date.prototype.subtractDays=function(t){return zn.subtractDays(this,t)},Date.prototype.addHours=function(t){return zn.addHours(this,t)},Date.prototype.subtractHours=function(t){return zn.subtractHours(this,t)},Date.prototype.addMinutes=function(t){return zn.addMinutes(this,t)},Date.prototype.subtractMinutes=function(t){return zn.subtractMinutes(this,t)},Date.prototype.getWeek=function(){return zn.getWeek(this)},Date.prototype.isToday=function(){return zn.isToday(this)},Date.prototype.isLeapYear=function(){return zn.isLeapYear(this)},Date.prototype.format=function(t=\"YYYY-MM-DD\"){return zn.formatDate(this,t)},Date.prototype.formatTime=function(t=\"HH:mm\"){return zn.formatTime(this,t)}}removePrototypes(){delete Date.prototype.addDays,delete Date.prototype.subtractDays,delete Date.prototype.addHours,delete Date.prototype.subtractHours,delete Date.prototype.addMinutes,delete Date.prototype.subtractMinutes,delete Date.prototype.getWeek,delete Date.prototype.isToday,delete Date.prototype.isLeapYear,delete Date.prototype.format,delete Date.prototype.formatTime}updateTexts(t){this._texts=t}_todayFormatted(){return Np!==new Date().getDate()&&(Rs=new Date,Np=Rs.getDate(),Ip=`${Rs.getFullYear()}-${Rs.getMonth()}-${Rs.getDate()}`),Ip}addDays(t,n){const r=new Date(t.valueOf());return r.setDate(r.getDate()+n),r}subtractDays(t,n){const r=new Date(t.valueOf());return r.setDate(r.getDate()-n),r}addHours(t,n){const r=new Date(t.valueOf());return r.setHours(r.getHours()+n),r}subtractHours(t,n){const r=new Date(t.valueOf());return r.setHours(r.getHours()-n),r}addMinutes(t,n){const r=new Date(t.valueOf());return r.setMinutes(r.getMinutes()+n),r}subtractMinutes(t,n){const r=new Date(t.valueOf());return r.setMinutes(r.getMinutes()-n),r}getWeek(t){const n=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate())),r=n.getUTCDay()||7;n.setUTCDate(n.getUTCDate()+4-r);const i=new Date(Date.UTC(n.getUTCFullYear(),0,1));return Math.ceil(((n-i)/864e5+1)/7)}isToday(t){return`${t.getFullYear()}-${t.getMonth()}-${t.getDate()}`===this._todayFormatted()}isLeapYear(t){const n=t.getFullYear();return!(n%400)||n%100&&!(n%4)}getPreviousFirstDayOfWeek(t=null,n){const r=t&&new Date(t.valueOf())||new Date,i=n?7:6;return r.setDate(r.getDate()-(r.getDay()+i)%7),r}stringToDate(t){return t instanceof Date?t:(t.length===10&&(t+=\" 00:00\"),new Date(t.replace(/-/g,\"/\")))}countDays(t,n){typeof t==\"string\"&&(t=t.replace(/-/g,\"/\")),typeof n==\"string\"&&(n=n.replace(/-/g,\"/\")),t=new Date(t).setHours(0,0,0,0),n=new Date(n).setHours(0,0,1,0);const r=(new Date(n).getTimezoneOffset()-new Date(t).getTimezoneOffset())*60*1e3;return Math.ceil((n-t-r)/(24*3600*1e3))}datesInSameTimeStep(t,n,r){return Math.abs(t.getTime()-n.getTime())<=r*60*1e3}formatDate(t,n=\"YYYY-MM-DD\",r=null){if(r||(r=this._texts),n||(n=\"YYYY-MM-DD\"),n===\"YYYY-MM-DD\")return this.formatDateLite(t);Ps={},Ki={};const i={YYYY:()=>this._hydrateDateObject(t,r).YYYY,YY:()=>this._hydrateDateObject(t,r).YY(),M:()=>this._hydrateDateObject(t,r).M,MM:()=>this._hydrateDateObject(t,r).MM(),MMM:()=>this._hydrateDateObject(t,r).MMM(),MMMM:()=>this._hydrateDateObject(t,r).MMMM(),MMMMG:()=>this._hydrateDateObject(t,r).MMMMG(),D:()=>this._hydrateDateObject(t,r).D,DD:()=>this._hydrateDateObject(t,r).DD(),S:()=>this._hydrateDateObject(t,r).S(),d:()=>this._hydrateDateObject(t,r).d,dd:()=>this._hydrateDateObject(t,r).dd(),ddd:()=>this._hydrateDateObject(t,r).ddd(),dddd:()=>this._hydrateDateObject(t,r).dddd(),HH:()=>this._hydrateTimeObject(t,r).HH,H:()=>this._hydrateTimeObject(t,r).H,hh:()=>this._hydrateTimeObject(t,r).hh,h:()=>this._hydrateTimeObject(t,r).h,am:()=>this._hydrateTimeObject(t,r).am,AM:()=>this._hydrateTimeObject(t,r).AM,mm:()=>this._hydrateTimeObject(t,r).mm,m:()=>this._hydrateTimeObject(t,r).m};return n.replace(/(\\{[a-zA-Z]+\\}|[a-zA-Z]+)/g,(s,o)=>{const a=i[o.replace(/\\{|\\}/g,\"\")];return a!==void 0?a():o})}formatDateLite(t){const n=t.getMonth()+1,r=t.getDate();return`${t.getFullYear()}-${n<10?\"0\":\"\"}${n}-${r<10?\"0\":\"\"}${r}`}formatTime(t,n=\"HH:mm\",r=null,i=!1){let s=!1;if(i){const[l,c,u]=[t.getHours(),t.getMinutes(),t.getSeconds()];l+c+u===141&&(s=!0)}if(t instanceof Date&&n===\"HH:mm\")return s?\"24:00\":this.formatTimeLite(t);Ki={},r||(r=this._texts);const o=this._hydrateTimeObject(t,r),a=n.replace(/(\\{[a-zA-Z]+\\}|[a-zA-Z]+)/g,(l,c)=>{const u=o[c.replace(/\\{|\\}/g,\"\")];return u!==void 0?u:c});return s?a.replace(\"23:59\",\"24:00\"):a}formatTimeLite(t){const n=t.getHours(),r=t.getMinutes();return`${(n<10?\"0\":\"\")+n}:${(r<10?\"0\":\"\")+r}`}_nth(t){if(t>3&&t<21)return\"th\";switch(t%10){case 1:return\"st\";case 2:return\"nd\";case 3:return\"rd\";default:return\"th\"}}_hydrateDateObject(t,n){if(Ps.D)return Ps;const r=t.getFullYear(),i=t.getMonth()+1,s=t.getDate(),a=(t.getDay()-1+7)%7;return Ps={YYYY:r,YY:()=>r.toString().substring(2),M:i,MM:()=>(i<10?\"0\":\"\")+i,MMM:()=>n.months[i-1].substring(0,3),MMMM:()=>n.months[i-1],MMMMG:()=>(n.monthsGenitive||n.months)[i-1],D:s,DD:()=>(s<10?\"0\":\"\")+s,S:()=>this._nth(s),d:a+1,dd:()=>n.weekDays[a][0],ddd:()=>n.weekDays[a].substr(0,3),dddd:()=>n.weekDays[a]},Ps}_hydrateTimeObject(t,n){if(Ki.am)return Ki;let r,i;t instanceof Date?(r=t.getHours(),i=t.getMinutes()):(r=Math.floor(t/60),i=Math.floor(t%60));const s=r%12?r%12:12,o=(n||{am:\"am\",pm:\"pm\"})[r===24||r<12?\"am\":\"pm\"];return Ki={H:r,h:s,HH:(r<10?\"0\":\"\")+r,hh:(s<10?\"0\":\"\")+s,am:o,AM:o.toUpperCase(),m:i,mm:(i<10?\"0\":\"\")+i},Ki}}const r_=24*60;class i_{constructor(t){Mr(this,\"_vuecal\",null),Mr(this,\"selectCell\",(n=!1,r,i)=>{this._vuecal.$emit(\"cell-click\",i?{date:r,split:i}:r),this._vuecal.clickToNavigate||n?this._vuecal.switchToNarrowerView():this._vuecal.dblclickToNavigate&&\"ontouchstart\"in window&&(this._vuecal.domEvents.dblTapACell.taps++,setTimeout(()=>this._vuecal.domEvents.dblTapACell.taps=0,this._vuecal.domEvents.dblTapACell.timeout),this._vuecal.domEvents.dblTapACell.taps>=2&&(this._vuecal.domEvents.dblTapACell.taps=0,this._vuecal.switchToNarrowerView(),this._vuecal.$emit(\"cell-dblclick\",i?{date:r,split:i}:r)))}),Mr(this,\"keyPressEnterCell\",(n,r)=>{this._vuecal.$emit(\"cell-keypress-enter\",r?{date:n,split:r}:n),this._vuecal.switchToNarrowerView()}),Mr(this,\"getPosition\",n=>{const{left:r,top:i}=this._vuecal.cellsEl.getBoundingClientRect(),{clientX:s,clientY:o}=\"ontouchstart\"in window&&n.touches?n.touches[0]:n;return{x:s-r,y:o-i}}),Mr(this,\"minutesAtCursor\",n=>{let r=0,i={x:0,y:0};const{timeStep:s,timeCellHeight:o,timeFrom:a}=this._vuecal.$props;return typeof n==\"number\"?r=n:typeof n==\"object\"&&(i=this.getPosition(n),r=Math.round(i.y*s/parseInt(o)+a)),{minutes:Math.max(Math.min(r,r_),0),cursorCoords:i}}),this._vuecal=t}}const s_=2,lu=24*60;let Tt,wt,cu;class o_{constructor(t,n){Mr(this,\"_vuecal\",null),Mr(this,\"eventDefaults\",{_eid:null,start:\"\",startTimeMinutes:0,end:\"\",endTimeMinutes:0,title:\"\",content:\"\",background:!1,allDay:!1,segments:null,repeat:null,daysCount:1,deletable:!0,deleting:!1,titleEditable:!0,resizable:!0,resizing:!1,draggable:!0,dragging:!1,draggingStatic:!1,focused:!1,class:\"\"}),this._vuecal=t,Tt=n}createAnEvent(t,n,r){if(typeof t==\"string\"&&(t=Tt.stringToDate(t)),!(t instanceof Date))return!1;const i=Tt.dateToMinutes(t);n=n*1||s_*60;const s=i+n,o=Tt.addMinutes(new Date(t),n);r.end&&(typeof r.end==\"string\"&&(r.end=Tt.stringToDate(r.end)),r.endTimeMinutes=Tt.dateToMinutes(r.end));const a={...this.eventDefaults,_eid:`${this._vuecal._.uid}_${this._vuecal.eventIdIncrement++}`,start:t,startTimeMinutes:i,end:o,endTimeMinutes:s,segments:null,...r};if(!(typeof this._vuecal.onEventCreate==\"function\"&&!this._vuecal.onEventCreate(a,()=>this.deleteAnEvent(a))))return a.startDateF!==a.endDateF&&(a.daysCount=Tt.countDays(a.start,a.end)),this._vuecal.mutableEvents.push(a),this._vuecal.addEventsToView([a]),this._vuecal.emitWithEvent(\"event-create\",a),this._vuecal.$emit(\"event-change\",{event:this._vuecal.cleanupEvent(a),originalEvent:null}),a}addEventSegment(t){t.segments||(t.segments={},t.segments[Tt.formatDateLite(t.start)]={start:t.start,startTimeMinutes:t.startTimeMinutes,endTimeMinutes:lu,isFirstDay:!0,isLastDay:!1});const n=t.segments[Tt.formatDateLite(t.end)];n&&(n.isLastDay=!1,n.endTimeMinutes=lu);const r=Tt.addDays(t.end,1),i=Tt.formatDateLite(r);return r.setHours(0,0,0,0),t.segments[i]={start:r,startTimeMinutes:0,endTimeMinutes:t.endTimeMinutes,isFirstDay:!1,isLastDay:!0},t.end=Tt.addMinutes(r,t.endTimeMinutes),t.daysCount=Object.keys(t.segments).length,i}removeEventSegment(t){let n=Object.keys(t.segments).length;if(n<=1)return Tt.formatDateLite(t.end);delete t.segments[Tt.formatDateLite(t.end)],n--;const r=Tt.subtractDays(t.end,1),i=Tt.formatDateLite(r),s=t.segments[i];return n?s&&(s.isLastDay=!0,s.endTimeMinutes=t.endTimeMinutes):t.segments=null,t.daysCount=n||1,t.end=r,i}createEventSegments(t,n,r){const i=n.getTime(),s=r.getTime();let o=t.start.getTime(),a=t.end.getTime(),l=!1,c,u,f;for(!t.end.getHours()&&!t.end.getMinutes()&&(a-=1e3),t.segments={},t.repeat?(c=i,u=Math.min(s,t.repeat.until?Tt.stringToDate(t.repeat.until).getTime():s)):(c=Math.max(i,o),u=Math.min(s,a));c<=u;){let d=!1;const p=Tt.addDays(new Date(c),1).setHours(0,0,0,0);let m,g,v,w;if(t.repeat){const S=new Date(c),y=Tt.formatDateLite(S);(l||t.occurrences&&t.occurrences[y])&&(l||(o=t.occurrences[y].start,f=new Date(o).setHours(0,0,0,0),a=t.occurrences[y].end),l=!0,d=!0),m=c===f,g=y===Tt.formatDateLite(new Date(a)),v=new Date(m?o:c),w=Tt.formatDateLite(v),g&&(l=!1)}else d=!0,m=c===o,g=u===a&&p>u,v=m?t.start:new Date(c),w=Tt.formatDateLite(m?t.start:v);d&&(t.segments[w]={start:v,startTimeMinutes:m?t.startTimeMinutes:0,endTimeMinutes:g?t.endTimeMinutes:lu,isFirstDay:m,isLastDay:g}),c=p}return t}deleteAnEvent(t){this._vuecal.emitWithEvent(\"event-delete\",t),this._vuecal.mutableEvents=this._vuecal.mutableEvents.filter(n=>n._eid!==t._eid),this._vuecal.view.events=this._vuecal.view.events.filter(n=>n._eid!==t._eid)}checkCellOverlappingEvents(t,n){cu=t.slice(0),wt={},t.forEach(i=>{cu.shift(),wt[i._eid]||(wt[i._eid]={overlaps:[],start:i.start,position:0}),wt[i._eid].position=0,cu.forEach(s=>{wt[s._eid]||(wt[s._eid]={overlaps:[],start:s.start,position:0});const o=this.eventInRange(s,i.start,i.end),a=n.overlapsPerTimeStep?Tt.datesInSameTimeStep(i.start,s.start,n.timeStep):1;if(!i.background&&!i.allDay&&!s.background&&!s.allDay&&o&&a)wt[i._eid].overlaps.push(s._eid),wt[i._eid].overlaps=[...new Set(wt[i._eid].overlaps)],wt[s._eid].overlaps.push(i._eid),wt[s._eid].overlaps=[...new Set(wt[s._eid].overlaps)],wt[s._eid].position++;else{let l,c;(l=(wt[i._eid]||{overlaps:[]}).overlaps.indexOf(s._eid))>-1&&wt[i._eid].overlaps.splice(l,1),(c=(wt[s._eid]||{overlaps:[]}).overlaps.indexOf(i._eid))>-1&&wt[s._eid].overlaps.splice(c,1),wt[s._eid].position--}})});let r=0;for(const i in wt){const s=wt[i],o=s.overlaps.map(a=>({id:a,start:wt[a].start}));o.push({id:i,start:s.start}),o.sort((a,l)=>a.start<l.start?-1:a.start>l.start?1:a.id>l.id?-1:1),s.position=o.findIndex(a=>a.id===i),r=Math.max(this.getOverlapsStreak(s,wt),r)}return[wt,r]}getOverlapsStreak(t,n={}){let r=t.overlaps.length+1,i=[];return t.overlaps.forEach(s=>{i.includes(s)||t.overlaps.filter(a=>a!==s).forEach(a=>{n[a].overlaps.includes(s)||i.push(a)})}),i=[...new Set(i)],r-=i.length,r}eventInRange(t,n,r){if(t.allDay||!this._vuecal.time){const o=new Date(t.start).setHours(0,0,0,0);return new Date(t.end).setHours(23,59,0,0)>=new Date(n).setHours(0,0,0,0)&&o<=new Date(r).setHours(0,0,0,0)}const i=t.start.getTime(),s=t.end.getTime();return i<r.getTime()&&s>n.getTime()}}const a_={class:\"vuecal__flex vuecal__weekdays-headings\"},l_=[\"onClick\"],c_={class:\"vuecal__flex weekday-label\",grow:\"\"},u_={class:\"full\"},f_={class:\"small\"},d_={class:\"xsmall\"},h_={key:0},p_={key:0,class:\"vuecal__flex vuecal__split-days-headers\",grow:\"\"};function m_(e,t,n,r,i,s){return h.openBlock(),h.createElementBlock(\"div\",a_,[(h.openBlock(!0),h.createElementBlock(h.Fragment,null,h.renderList(s.headings,(o,a)=>(h.openBlock(),h.createElementBlock(h.Fragment,{key:a},[o.hide?h.createCommentVNode(\"\",!0):(h.openBlock(),h.createElementBlock(\"div\",{key:0,class:h.normalizeClass([\"vuecal__flex vuecal__heading\",{today:o.today,clickable:s.cellHeadingsClickable}]),style:h.normalizeStyle(s.weekdayCellStyles),onClick:l=>s.view.id===\"week\"&&s.selectCell(o.date,l),onDblclick:t[0]||(t[0]=l=>s.view.id===\"week\"&&s.vuecal.dblclickToNavigate&&n.switchToNarrowerView())},[h.createVNode(h.Transition,{name:`slide-fade--${n.transitionDirection}`,appear:s.vuecal.transitions},{default:h.withCtx(()=>[(h.openBlock(),h.createElementBlock(\"div\",{class:\"vuecal__flex\",column:\"\",key:s.vuecal.transitions?`${a}-${o.dayOfMonth}`:!1},[h.createElementVNode(\"div\",c_,[h.renderSlot(e.$slots,\"weekday-heading\",{heading:s.cleanupHeading(o),view:s.view},()=>[h.createElementVNode(\"span\",u_,h.toDisplayString(o.full),1),h.createElementVNode(\"span\",f_,h.toDisplayString(o.small),1),h.createElementVNode(\"span\",d_,h.toDisplayString(o.xsmall),1),o.dayOfMonth?(h.openBlock(),h.createElementBlock(\"span\",h_,\" \"+h.toDisplayString(o.dayOfMonth),1)):h.createCommentVNode(\"\",!0)])]),s.vuecal.hasSplits&&s.vuecal.stickySplitLabels?(h.openBlock(),h.createElementBlock(\"div\",p_,[(h.openBlock(!0),h.createElementBlock(h.Fragment,null,h.renderList(s.vuecal.daySplits,(l,c)=>(h.openBlock(),h.createElementBlock(\"div\",{class:h.normalizeClass([\"day-split-header\",l.class||!1]),key:c},[h.renderSlot(e.$slots,\"split-label\",{split:l,view:s.view},()=>[h.createTextVNode(h.toDisplayString(l.label),1)])],2))),128))])):h.createCommentVNode(\"\",!0)]))]),_:2},1032,[\"name\",\"appear\"])],46,l_))],64))),128))])}const Ds=(e,t)=>{const n=e.__vccOpts||e;for(const[r,i]of t)n[r]=i;return n},g_={inject:[\"vuecal\",\"utils\",\"view\"],props:{transitionDirection:{type:String,default:\"right\"},weekDays:{type:Array,default:()=>[]},switchToNarrowerView:{type:Function,default:()=>{}}},methods:{selectCell(e,t){e.getTime()!==this.view.selectedDate.getTime()&&(this.view.selectedDate=e),this.utils.cell.selectCell(!1,e,t)},cleanupHeading:e=>({label:e.full,date:e.date,...e.today?{today:e.today}:{}})},computed:{headings(){if(![\"month\",\"week\"].includes(this.view.id))return[];let e=!1;return this.weekDays.map((n,r)=>{const i=this.utils.date.addDays(this.view.startDate,this.vuecal.startWeekOnSunday&&this.vuecal.hideWeekends?r-1:r);return{hide:n.hide,full:n.label,small:n.short||n.label.substr(0,3),xsmall:n.short||n.label.substr(0,1),...this.view.id===\"week\"?{dayOfMonth:i.getDate(),date:i,today:!e&&this.utils.date.isToday(i)&&!e++}:{}}})},cellWidth(){return 100/(7-this.weekDays.reduce((e,t)=>e+t.hide,0))},weekdayCellStyles(){return{...this.vuecal.hideWeekdays.length?{width:`${this.cellWidth}%`}:{}}},cellHeadingsClickable(){return this.view.id===\"week\"&&(this.vuecal.clickToNavigate||this.vuecal.dblclickToNavigate)}}},wE=Ds(g_,[[\"render\",m_]]),v_={class:\"vuecal__header\"},y_={key:0,class:\"vuecal__flex vuecal__menu\",role:\"tablist\",\"aria-label\":\"Calendar views navigation\"},E_=[\"onDragenter\",\"onDragleave\",\"onClick\",\"aria-label\"],b_={key:1,class:\"vuecal__title-bar\"},S_=[\"aria-label\"],T_={class:\"vuecal__flex vuecal__title\",grow:\"\"},w_=[\"aria-label\"],D_={key:0,class:\"vuecal__flex vuecal__split-days-headers\"};function C_(e,t,n,r,i,s){const o=h.resolveComponent(\"weekdays-headings\");return h.openBlock(),h.createElementBlock(\"div\",v_,[n.options.hideViewSelector?h.createCommentVNode(\"\",!0):(h.openBlock(),h.createElementBlock(\"div\",y_,[(h.openBlock(!0),h.createElementBlock(h.Fragment,null,h.renderList(n.viewProps.views,(a,l)=>(h.openBlock(),h.createElementBlock(h.Fragment,{key:l},[a.enabled?(h.openBlock(),h.createElementBlock(\"button\",{key:0,class:h.normalizeClass([\"vuecal__view-btn\",{\"vuecal__view-btn--active\":s.view.id===l,\"vuecal__view-btn--highlighted\":e.highlightedControl===l}]),type:\"button\",onDragenter:c=>n.editEvents.drag&&s.dnd&&s.dnd.viewSelectorDragEnter(c,l,e.$data),onDragleave:c=>n.editEvents.drag&&s.dnd&&s.dnd.viewSelectorDragLeave(c,l,e.$data),onClick:c=>s.switchView(l,null,!0),\"aria-label\":`${a.label} view`},h.toDisplayString(a.label),43,E_)):h.createCommentVNode(\"\",!0)],64))),128))])),n.options.hideTitleBar?h.createCommentVNode(\"\",!0):(h.openBlock(),h.createElementBlock(\"div\",b_,[h.createElementVNode(\"button\",{class:h.normalizeClass([\"vuecal__arrow vuecal__arrow--prev\",{\"vuecal__arrow--highlighted\":e.highlightedControl===\"previous\"}]),type:\"button\",onClick:t[0]||(t[0]=(...a)=>s.previous&&s.previous(...a)),onDragenter:t[1]||(t[1]=a=>n.editEvents.drag&&s.dnd&&s.dnd.viewSelectorDragEnter(a,\"previous\",e.$data)),onDragleave:t[2]||(t[2]=a=>n.editEvents.drag&&s.dnd&&s.dnd.viewSelectorDragLeave(a,\"previous\",e.$data)),\"aria-label\":`Previous ${s.view.id}`},[h.renderSlot(e.$slots,\"arrow-prev\")],42,S_),h.createElementVNode(\"div\",T_,[h.createVNode(h.Transition,{name:n.options.transitions?`slide-fade--${s.transitionDirection}`:\"\"},{default:h.withCtx(()=>[(h.openBlock(),h.createBlock(h.resolveDynamicComponent(s.broaderView?\"button\":\"span\"),{type:!!s.broaderView&&\"button\",key:`${s.view.id}${s.view.startDate.toString()}`,onClick:t[3]||(t[3]=a=>!!s.broaderView&&s.switchToBroaderView()),\"aria-label\":!!s.broaderView&&`Go to ${s.broaderView} view`},{default:h.withCtx(()=>[h.renderSlot(e.$slots,\"title\")]),_:3},8,[\"type\",\"aria-label\"]))]),_:3},8,[\"name\"])]),n.options.todayButton?(h.openBlock(),h.createElementBlock(\"button\",{key:0,class:h.normalizeClass([\"vuecal__today-btn\",{\"vuecal__today-btn--highlighted\":e.highlightedControl===\"today\"}]),type:\"button\",onClick:t[4]||(t[4]=(...a)=>s.goToToday&&s.goToToday(...a)),onDragenter:t[5]||(t[5]=a=>n.editEvents.drag&&s.dnd&&s.dnd.viewSelectorDragEnter(a,\"today\",e.$data)),onDragleave:t[6]||(t[6]=a=>n.editEvents.drag&&s.dnd&&s.dnd.viewSelectorDragLeave(a,\"today\",e.$data)),\"aria-label\":\"Today\"},[h.renderSlot(e.$slots,\"today-button\")],34)):h.createCommentVNode(\"\",!0),h.createElementVNode(\"button\",{class:h.normalizeClass([\"vuecal__arrow vuecal__arrow--next\",{\"vuecal__arrow--highlighted\":e.highlightedControl===\"next\"}]),type:\"button\",onClick:t[7]||(t[7]=(...a)=>s.next&&s.next(...a)),onDragenter:t[8]||(t[8]=a=>n.editEvents.drag&&s.dnd&&s.dnd.viewSelectorDragEnter(a,\"next\",e.$data)),onDragleave:t[9]||(t[9]=a=>n.editEvents.drag&&s.dnd&&s.dnd.viewSelectorDragLeave(a,\"next\",e.$data)),\"aria-label\":`Next ${s.view.id}`},[h.renderSlot(e.$slots,\"arrow-next\")],42,w_)])),n.viewProps.weekDaysInHeader?(h.openBlock(),h.createBlock(o,{key:2,\"week-days\":n.weekDays,\"transition-direction\":s.transitionDirection,\"switch-to-narrower-view\":n.switchToNarrowerView},h.createSlots({_:2},[e.$slots[\"weekday-heading\"]?{name:\"weekday-heading\",fn:h.withCtx(({heading:a,view:l})=>[h.renderSlot(e.$slots,\"weekday-heading\",{heading:a,view:l})]),key:\"0\"}:void 0,e.$slots[\"split-label\"]?{name:\"split-label\",fn:h.withCtx(({split:a})=>[h.renderSlot(e.$slots,\"split-label\",{split:a,view:s.view})]),key:\"1\"}:void 0]),1032,[\"week-days\",\"transition-direction\",\"switch-to-narrower-view\"])):h.createCommentVNode(\"\",!0),h.createVNode(h.Transition,{name:`slide-fade--${s.transitionDirection}`},{default:h.withCtx(()=>[s.showDaySplits?(h.openBlock(),h.createElementBlock(\"div\",D_,[(h.openBlock(!0),h.createElementBlock(h.Fragment,null,h.renderList(n.daySplits,(a,l)=>(h.openBlock(),h.createElementBlock(\"div\",{class:h.normalizeClass([\"day-split-header\",a.class||!1]),key:l},[h.renderSlot(e.$slots,\"split-label\",{split:a,view:s.view.id},()=>[h.createTextVNode(h.toDisplayString(a.label),1)])],2))),128))])):h.createCommentVNode(\"\",!0)]),_:3},8,[\"name\"])])}const O_={inject:[\"vuecal\",\"previous\",\"next\",\"switchView\",\"updateSelectedDate\",\"modules\",\"view\"],components:{WeekdaysHeadings:wE},props:{options:{type:Object,default:()=>({})},editEvents:{type:Object,required:!0},hasSplits:{type:[Boolean,Number],default:!1},daySplits:{type:Array,default:()=>[]},viewProps:{type:Object,default:()=>({})},weekDays:{type:Array,default:()=>[]},switchToNarrowerView:{type:Function,default:()=>{}}},data:()=>({highlightedControl:null}),methods:{goToToday(){this.updateSelectedDate(new Date(new Date().setHours(0,0,0,0)))},switchToBroaderView(){this.transitionDirection=\"left\",this.broaderView&&this.switchView(this.broaderView)}},computed:{transitionDirection:{get(){return this.vuecal.transitionDirection},set(e){this.vuecal.transitionDirection=e}},broaderView(){const{enabledViews:e}=this.vuecal;return e[e.indexOf(this.view.id)-1]},showDaySplits(){return this.view.id===\"day\"&&this.hasSplits&&this.options.stickySplitLabels&&!this.options.minSplitWidth},dnd(){return this.modules.dnd}}},A_=Ds(O_,[[\"render\",C_]]),__=[\"draggable\"];function M_(e,t,n,r,i,s){return h.openBlock(),h.createElementBlock(\"div\",{class:h.normalizeClass([\"vuecal__event\",s.eventClasses]),style:h.normalizeStyle(s.eventStyles),tabindex:\"0\",onFocus:t[4]||(t[4]=(...o)=>s.focusEvent&&s.focusEvent(...o)),onKeypress:t[5]||(t[5]=h.withKeys(h.withModifiers((...o)=>s.onEnterKeypress&&s.onEnterKeypress(...o),[\"stop\"]),[\"enter\"])),onMouseenter:t[6]||(t[6]=(...o)=>s.onMouseEnter&&s.onMouseEnter(...o)),onMouseleave:t[7]||(t[7]=(...o)=>s.onMouseLeave&&s.onMouseLeave(...o)),onTouchstart:t[8]||(t[8]=h.withModifiers((...o)=>s.onTouchStart&&s.onTouchStart(...o),[\"stop\"])),onMousedown:t[9]||(t[9]=o=>s.onMouseDown(o)),onMouseup:t[10]||(t[10]=(...o)=>s.onMouseUp&&s.onMouseUp(...o)),onTouchend:t[11]||(t[11]=(...o)=>s.onMouseUp&&s.onMouseUp(...o)),onTouchmove:t[12]||(t[12]=(...o)=>s.onTouchMove&&s.onTouchMove(...o)),onDblclick:t[13]||(t[13]=(...o)=>s.onDblClick&&s.onDblClick(...o)),draggable:s.draggable,onDragstart:t[14]||(t[14]=o=>s.draggable&&s.onDragStart(o)),onDragend:t[15]||(t[15]=o=>s.draggable&&s.onDragEnd())},[s.vuecal.editEvents.delete&&n.event.deletable?(h.openBlock(),h.createElementBlock(\"div\",{key:0,class:\"vuecal__event-delete\",onClick:t[0]||(t[0]=h.withModifiers((...o)=>s.deleteEvent&&s.deleteEvent(...o),[\"stop\"])),onTouchstart:t[1]||(t[1]=h.withModifiers((...o)=>s.touchDeleteEvent&&s.touchDeleteEvent(...o),[\"stop\"]))},h.toDisplayString(s.vuecal.texts.deleteEvent),33)):h.createCommentVNode(\"\",!0),h.renderSlot(e.$slots,\"event\",{event:n.event,view:s.view.id}),s.resizable?(h.openBlock(),h.createElementBlock(\"div\",{key:1,class:\"vuecal__event-resize-handle\",contenteditable:\"false\",onMousedown:t[2]||(t[2]=h.withModifiers((...o)=>s.onResizeHandleMouseDown&&s.onResizeHandleMouseDown(...o),[\"stop\",\"prevent\"])),onTouchstart:t[3]||(t[3]=h.withModifiers((...o)=>s.onResizeHandleMouseDown&&s.onResizeHandleMouseDown(...o),[\"stop\",\"prevent\"]))},null,32)):h.createCommentVNode(\"\",!0)],46,__)}const x_={inject:[\"vuecal\",\"utils\",\"modules\",\"view\",\"domEvents\",\"editEvents\"],props:{cellFormattedDate:{type:String,default:\"\"},event:{type:Object,default:()=>({})},cellEvents:{type:Array,default:()=>[]},overlaps:{type:Array,default:()=>[]},eventPosition:{type:Number,default:0},overlapsStreak:{type:Number,default:0},allDay:{type:Boolean,default:!1}},data:()=>({touch:{dragThreshold:30,startX:0,startY:0,dragged:!1}}),methods:{onMouseDown(e,t=!1){if(\"ontouchstart\"in window&&!t)return!1;const{clickHoldAnEvent:n,focusAnEvent:r,resizeAnEvent:i,dragAnEvent:s}=this.domEvents;if(r._eid===this.event._eid&&n._eid===this.event._eid)return!0;this.focusEvent(),n._eid=null,this.vuecal.editEvents.delete&&this.event.deletable&&(n.timeoutId=setTimeout(()=>{!i._eid&&!s._eid&&(n._eid=this.event._eid,this.event.deleting=!0)},n.timeout))},onMouseUp(e){this.domEvents.focusAnEvent._eid===this.event._eid&&!this.touch.dragged&&(this.domEvents.focusAnEvent.mousedUp=!0),this.touch.dragged=!1},onMouseEnter(e){e.preventDefault(),this.vuecal.emitWithEvent(\"event-mouse-enter\",this.event)},onMouseLeave(e){e.preventDefault(),this.vuecal.emitWithEvent(\"event-mouse-leave\",this.event)},onTouchMove(e){if(typeof this.vuecal.onEventClick!=\"function\")return;const{clientX:t,clientY:n}=e.touches[0],{startX:r,startY:i,dragThreshold:s}=this.touch;(Math.abs(t-r)>s||Math.abs(n-i)>s)&&(this.touch.dragged=!0)},onTouchStart(e){this.touch.startX=e.touches[0].clientX,this.touch.startY=e.touches[0].clientY,this.onMouseDown(e,!0)},onEnterKeypress(e){if(typeof this.vuecal.onEventClick==\"function\")return this.vuecal.onEventClick(this.event,e)},onDblClick(e){if(typeof this.vuecal.onEventDblclick==\"function\")return this.vuecal.onEventDblclick(this.event,e)},onDragStart(e){this.dnd&&this.dnd.eventDragStart(e,this.event)},onDragEnd(){this.dnd&&this.dnd.eventDragEnd(this.event)},onResizeHandleMouseDown(){this.focusEvent(),this.domEvents.dragAnEvent._eid=null,this.domEvents.resizeAnEvent=Object.assign(this.domEvents.resizeAnEvent,{_eid:this.event._eid,start:(this.segment||this.event).start,split:this.event.split||null,segment:!!this.segment&&this.utils.date.formatDateLite(this.segment.start),originalEnd:new Date((this.segment||this.event).end),originalEndTimeMinutes:this.event.endTimeMinutes}),this.event.resizing=!0},deleteEvent(e=!1){if(\"ontouchstart\"in window&&!e)return!1;this.utils.event.deleteAnEvent(this.event)},touchDeleteEvent(e){this.deleteEvent(!0)},cancelDeleteEvent(){this.event.deleting=!1},focusEvent(){const{focusAnEvent:e}=this.domEvents,t=e._eid;if(t!==this.event._eid){if(t){const n=this.view.events.find(r=>r._eid===t);n&&(n.focused=!1)}this.vuecal.cancelDelete(),this.vuecal.emitWithEvent(\"event-focus\",this.event),e._eid=this.event._eid,this.event.focused=!0}}},computed:{eventDimensions(){const{startTimeMinutes:e,endTimeMinutes:t}=this.segment||this.event;let n=e-this.vuecal.timeFrom;const r=Math.max(Math.round(n*this.vuecal.timeCellHeight/this.vuecal.timeStep),0);n=Math.min(t,this.vuecal.timeTo)-this.vuecal.timeFrom;const i=Math.round(n*this.vuecal.timeCellHeight/this.vuecal.timeStep),s=Math.max(i-r,5);return{top:r,height:s}},eventStyles(){if(this.event.allDay||!this.vuecal.time||!this.event.endTimeMinutes||this.view.id===\"month\"||this.allDay)return{};let e=100/Math.min(this.overlaps.length+1,this.overlapsStreak),t=100/(this.overlaps.length+1)*this.eventPosition;this.vuecal.minEventWidth&&e<this.vuecal.minEventWidth&&(e=this.vuecal.minEventWidth,t=(100-this.vuecal.minEventWidth)/this.overlaps.length*this.eventPosition);const{top:n,height:r}=this.eventDimensions;return{top:`${n}px`,height:`${r}px`,width:`${e}%`,left:this.event.left&&`${this.event.left}px`||`${t}%`}},eventClasses(){const{isFirstDay:e,isLastDay:t}=this.segment||{};return{[this.event.class]:!!this.event.class,\"vuecal__event--focus\":this.event.focused,\"vuecal__event--resizing\":this.event.resizing,\"vuecal__event--background\":this.event.background,\"vuecal__event--deletable\":this.event.deleting,\"vuecal__event--all-day\":this.event.allDay,\"vuecal__event--dragging\":!this.event.draggingStatic&&this.event.dragging,\"vuecal__event--static\":this.event.dragging&&this.event.draggingStatic,\"vuecal__event--multiple-days\":!!this.segment,\"event-start\":this.segment&&e&&!t,\"event-middle\":this.segment&&!e&&!t,\"event-end\":this.segment&&t&&!e}},segment(){return this.event.segments&&this.event.segments[this.cellFormattedDate]||null},draggable(){const{draggable:e,background:t,daysCount:n}=this.event;return this.vuecal.editEvents.drag&&e&&!t&&n===1},resizable(){const{editEvents:e,time:t}=this.vuecal;return e.resize&&this.event.resizable&&t&&!this.allDay&&(!this.segment||this.segment&&this.segment.isLastDay)&&this.view.id!==\"month\"},dnd(){return this.modules.dnd}}},N_=Ds(x_,[[\"render\",M_]]),I_=[\"data-split\",\"aria-label\",\"onTouchstart\",\"onMousedown\",\"onDragover\",\"onDrop\"],R_={key:0,class:\"cell-time-labels\"},P_=[\"innerHTML\"],L_={key:2,class:\"vuecal__cell-events\"},k_=[\"title\"];function F_(e,t,n,r,i,s){const o=h.resolveComponent(\"event\");return h.openBlock(),h.createBlock(h.TransitionGroup,{class:h.normalizeClass([\"vuecal__cell\",s.cellClasses]),name:`slide-fade--${s.transitionDirection}`,tag:\"div\",appear:n.options.transitions,style:h.normalizeStyle(s.cellStyles)},{default:h.withCtx(()=>[(h.openBlock(!0),h.createElementBlock(h.Fragment,null,h.renderList(s.splitsCount?s.splits:1,(a,l)=>(h.openBlock(),h.createElementBlock(\"div\",{class:h.normalizeClass([\"vuecal__flex vuecal__cell-content\",s.splitsCount&&s.splitClasses(a)]),key:n.options.transitions?`${s.view.id}-${n.data.content}-${l}`:l,\"data-split\":s.splitsCount?a.id:!1,column:\"\",tabindex:\"0\",\"aria-label\":n.data.content,onFocus:t[0]||(t[0]=c=>s.onCellFocus(c)),onKeypress:t[1]||(t[1]=h.withKeys(c=>s.onCellkeyPressEnter(c),[\"enter\"])),onTouchstart:c=>!s.isDisabled&&s.onCellTouchStart(c,s.splitsCount?a.id:null),onMousedown:c=>!s.isDisabled&&s.onCellMouseDown(c,s.splitsCount?a.id:null),onClick:t[2]||(t[2]=c=>!s.isDisabled&&s.onCellClick(c)),onDblclick:t[3]||(t[3]=c=>!s.isDisabled&&s.onCellDblClick(c)),onContextmenu:t[4]||(t[4]=c=>!s.isDisabled&&n.options.cellContextmenu&&s.onCellContextMenu(c)),onDragenter:t[5]||(t[5]=c=>!s.isDisabled&&n.editEvents.drag&&s.dnd&&s.dnd.cellDragEnter(c,e.$data,n.data.startDate)),onDragover:c=>!s.isDisabled&&n.editEvents.drag&&s.dnd&&s.dnd.cellDragOver(c,e.$data,n.data.startDate,s.splitsCount?a.id:null),onDragleave:t[6]||(t[6]=c=>!s.isDisabled&&n.editEvents.drag&&s.dnd&&s.dnd.cellDragLeave(c,e.$data,n.data.startDate)),onDrop:c=>!s.isDisabled&&n.editEvents.drag&&s.dnd&&s.dnd.cellDragDrop(c,e.$data,n.data.startDate,s.splitsCount?a.id:null)},[n.options.showTimeInCells&&n.options.time&&s.isWeekOrDayView&&!n.allDay?(h.openBlock(),h.createElementBlock(\"div\",R_,[(h.openBlock(!0),h.createElementBlock(h.Fragment,null,h.renderList(s.vuecal.timeCells,(c,u)=>(h.openBlock(),h.createElementBlock(\"span\",{class:\"cell-time-label\",key:u},h.toDisplayString(c.label),1))),128))])):h.createCommentVNode(\"\",!0),s.isWeekOrDayView&&!n.allDay&&s.specialHours.length?(h.openBlock(!0),h.createElementBlock(h.Fragment,{key:1},h.renderList(s.specialHours,(c,u)=>(h.openBlock(),h.createElementBlock(\"div\",{class:h.normalizeClass([\"vuecal__special-hours\",`vuecal__special-hours--day${c.day} ${c.class}`]),style:h.normalizeStyle(`height: ${c.height}px;top: ${c.top}px`)},[c.label?(h.openBlock(),h.createElementBlock(\"div\",{key:0,class:\"special-hours-label\",innerHTML:c.label},null,8,P_)):h.createCommentVNode(\"\",!0)],6))),256)):h.createCommentVNode(\"\",!0),h.renderSlot(e.$slots,\"cell-content\",{events:s.events,selectCell:c=>s.selectCell(c,!0),split:s.splitsCount?a:!1}),s.eventsCount&&(s.isWeekOrDayView||s.view.id===\"month\"&&n.options.eventsOnMonthView)?(h.openBlock(),h.createElementBlock(\"div\",L_,[(h.openBlock(!0),h.createElementBlock(h.Fragment,null,h.renderList(s.splitsCount?a.events:s.events,(c,u)=>(h.openBlock(),h.createBlock(o,{key:u,\"cell-formatted-date\":n.data.formattedDate,event:c,\"all-day\":n.allDay,\"cell-events\":s.splitsCount?a.events:s.events,overlaps:((s.splitsCount?a.overlaps[c._eid]:e.cellOverlaps[c._eid])||[]).overlaps,\"event-position\":((s.splitsCount?a.overlaps[c._eid]:e.cellOverlaps[c._eid])||[]).position,\"overlaps-streak\":s.splitsCount?a.overlapsStreak:e.cellOverlapsStreak},{event:h.withCtx(({event:f,view:d})=>[h.renderSlot(e.$slots,\"event\",{view:d,event:f})]),_:2},1032,[\"cell-formatted-date\",\"event\",\"all-day\",\"cell-events\",\"overlaps\",\"event-position\",\"overlaps-streak\"]))),128))])):h.createCommentVNode(\"\",!0)],42,I_))),128)),s.timelineVisible?(h.openBlock(),h.createElementBlock(\"div\",{class:\"vuecal__now-line\",style:h.normalizeStyle(`top: ${s.todaysTimePosition}px`),key:n.options.transitions?`${s.view.id}-now-line`:\"now-line\",title:s.utils.date.formatTime(s.vuecal.now)},null,12,k_)):h.createCommentVNode(\"\",!0)]),_:3},8,[\"class\",\"name\",\"appear\",\"style\"])}const V_={inject:[\"vuecal\",\"utils\",\"modules\",\"view\",\"domEvents\"],components:{Event:N_},props:{options:{type:Object,default:()=>({})},editEvents:{type:Object,required:!0},data:{type:Object,required:!0},cellSplits:{type:Array,default:()=>[]},minTimestamp:{type:[Number,null],default:null},maxTimestamp:{type:[Number,null],default:null},cellWidth:{type:[Number,Boolean],default:!1},allDay:{type:Boolean,default:!1}},data:()=>({cellOverlaps:{},cellOverlapsStreak:1,timeAtCursor:null,highlighted:!1,highlightedSplit:null}),methods:{getSplitAtCursor({target:e}){let n=e.classList.contains(\"vuecal__cell-split\")?e:this.vuecal.findAncestor(e,\"vuecal__cell-split\");return n&&(n=n.attributes[\"data-split\"].value,parseInt(n).toString()===n.toString()&&(n=parseInt(n))),n||null},splitClasses(e){return{\"vuecal__cell-split\":!0,\"vuecal__cell-split--highlighted\":this.highlightedSplit===e.id,[e.class]:!!e.class}},checkCellOverlappingEvents(){this.options.time&&this.eventsCount&&!this.splitsCount&&(this.eventsCount===1?(this.cellOverlaps=[],this.cellOverlapsStreak=1):[this.cellOverlaps,this.cellOverlapsStreak]=this.utils.event.checkCellOverlappingEvents(this.events,this.options))},isDOMElementAnEvent(e){return this.vuecal.isDOMElementAnEvent(e)},selectCell(e,t=!1){const n=this.splitsCount?this.getSplitAtCursor(e):null;this.utils.cell.selectCell(t,this.timeAtCursor,n),this.timeAtCursor=null},onCellkeyPressEnter(e){this.isSelected||this.onCellFocus(e);const t=this.splitsCount?this.getSplitAtCursor(e):null;this.utils.cell.keyPressEnterCell(this.timeAtCursor,t),this.timeAtCursor=null},onCellFocus(e){if(!this.isSelected&&!this.isDisabled){this.isSelected=this.data.startDate;const t=this.splitsCount?this.getSplitAtCursor(e):null,n=this.timeAtCursor||this.data.startDate;this.vuecal.$emit(\"cell-focus\",t?{date:n,split:t}:n)}},onCellMouseDown(e,t=null,n=!1){if(\"ontouchstart\"in window&&!n)return!1;this.isSelected||this.onCellFocus(e);const{clickHoldACell:r,focusAnEvent:i}=this.domEvents;this.domEvents.cancelClickEventCreation=!1,r.eventCreated=!1,this.timeAtCursor=new Date(this.data.startDate);const{minutes:s,cursorCoords:{y:o}}=this.vuecal.minutesAtCursor(e);this.timeAtCursor.setMinutes(s);const a=this.isDOMElementAnEvent(e.target);!a&&i._eid&&((this.view.events.find(l=>l._eid===i._eid)||{}).focused=!1),this.editEvents.create&&!a&&this.setUpEventCreation(e,o)},setUpEventCreation(e,t){if(this.options.dragToCreateEvent&&[\"week\",\"day\"].includes(this.view.id)){const{dragCreateAnEvent:n}=this.domEvents;if(n.startCursorY=t,n.split=this.splitsCount?this.getSplitAtCursor(e):null,n.start=this.timeAtCursor,this.options.snapToTime){let r=this.timeAtCursor.getHours()*60+this.timeAtCursor.getMinutes();const i=r+this.options.snapToTime/2;r=i-i%this.options.snapToTime,n.start.setHours(0,r,0,0)}}else this.options.cellClickHold&&[\"month\",\"week\",\"day\"].includes(this.view.id)&&this.setUpCellHoldTimer(e)},setUpCellHoldTimer(e){const{clickHoldACell:t}=this.domEvents;t.cellId=`${this.vuecal._.uid}_${this.data.formattedDate}`,t.split=this.splitsCount?this.getSplitAtCursor(e):null,t.timeoutId=setTimeout(()=>{if(t.cellId&&!this.domEvents.cancelClickEventCreation){const{_eid:n}=this.utils.event.createAnEvent(this.timeAtCursor,null,t.split?{split:t.split}:{});t.eventCreated=n}},t.timeout)},onCellTouchStart(e,t=null){this.onCellMouseDown(e,t,!0)},onCellClick(e){this.isDOMElementAnEvent(e.target)||this.selectCell(e)},onCellDblClick(e){const t=new Date(this.data.startDate);t.setMinutes(this.vuecal.minutesAtCursor(e).minutes);const n=this.splitsCount?this.getSplitAtCursor(e):null;this.vuecal.$emit(\"cell-dblclick\",n?{date:t,split:n}:t),this.options.dblclickToNavigate&&this.vuecal.switchToNarrowerView()},onCellContextMenu(e){e.stopPropagation(),e.preventDefault();const t=new Date(this.data.startDate),{cursorCoords:n,minutes:r}=this.vuecal.minutesAtCursor(e);t.setMinutes(r);const i=this.splitsCount?this.getSplitAtCursor(e):null;this.vuecal.$emit(\"cell-contextmenu\",{date:t,...n,...i||{},e})}},computed:{dnd(){return this.modules.dnd},nowInMinutes(){return this.utils.date.dateToMinutes(this.vuecal.now)},isBeforeMinDate(){return this.minTimestamp!==null&&this.minTimestamp>this.data.endDate.getTime()},isAfterMaxDate(){return this.maxTimestamp&&this.maxTimestamp<this.data.startDate.getTime()},isDisabled(){const{disableDays:e}=this.options,{isYearsOrYearView:t}=this.vuecal;return e.length&&e.includes(this.data.formattedDate)&&!t?!0:this.isBeforeMinDate||this.isAfterMaxDate},isSelected:{get(){let e=!1;const{selectedDate:t}=this.view;return this.view.id===\"years\"?e=t.getFullYear()===this.data.startDate.getFullYear():this.view.id===\"year\"?e=t.getFullYear()===this.data.startDate.getFullYear()&&t.getMonth()===this.data.startDate.getMonth():e=t.getTime()===this.data.startDate.getTime(),e},set(e){this.view.selectedDate=e,this.vuecal.$emit(\"update:selected-date\",this.view.selectedDate)}},isWeekOrDayView(){return[\"week\",\"day\"].includes(this.view.id)},transitionDirection(){return this.vuecal.transitionDirection},specialHours(){return this.data.specialHours.map(e=>{let{from:t,to:n}=e;return t=Math.max(t,this.options.timeFrom),n=Math.min(n,this.options.timeTo),{...e,height:(n-t)*this.timeScale,top:(t-this.options.timeFrom)*this.timeScale}})},events(){const{startDate:e,endDate:t}=this.data;let n=[];if(!([\"years\",\"year\"].includes(this.view.id)&&!this.options.eventsCountOnYearView)){if(n=this.view.events.slice(0),this.view.id===\"month\"&&n.push(...this.view.outOfScopeEvents),n=n.filter(r=>this.utils.event.eventInRange(r,e,t)),this.options.showAllDayEvents&&this.view.id!==\"month\"&&(n=n.filter(r=>!!r.allDay===this.allDay)),this.options.time&&this.isWeekOrDayView&&!this.allDay){const{timeFrom:r,timeTo:i}=this.options;n=n.filter(s=>{const o=s.daysCount>1&&s.segments[this.data.formattedDate]||{},a=s.daysCount===1&&s.startTimeMinutes<i&&s.endTimeMinutes>r,l=s.daysCount>1&&o.startTimeMinutes<i&&o.endTimeMinutes>r;return s.allDay||a||l||!1})}this.options.time&&this.isWeekOrDayView&&!(this.options.showAllDayEvents&&this.allDay)&&n.sort((r,i)=>r.start<i.start?-1:1),this.cellSplits.length||this.$nextTick(this.checkCellOverlappingEvents)}return n},eventsCount(){return this.events.length},splits(){return this.cellSplits.map((e,t)=>{const n=this.events.filter(s=>s.split===e.id),[r,i]=this.utils.event.checkCellOverlappingEvents(n.filter(s=>!s.background&&!s.allDay),this.options);return{...e,overlaps:r,overlapsStreak:i,events:n}})},splitsCount(){return this.splits.length},cellClasses(){return{[this.data.class]:!!this.data.class,\"vuecal__cell--current\":this.data.current,\"vuecal__cell--today\":this.data.today,\"vuecal__cell--out-of-scope\":this.data.outOfScope,\"vuecal__cell--before-min\":this.isDisabled&&this.isBeforeMinDate,\"vuecal__cell--after-max\":this.isDisabled&&this.isAfterMaxDate,\"vuecal__cell--disabled\":this.isDisabled,\"vuecal__cell--selected\":this.isSelected,\"vuecal__cell--highlighted\":this.highlighted,\"vuecal__cell--has-splits\":this.splitsCount,\"vuecal__cell--has-events\":this.eventsCount}},cellStyles(){return{...this.cellWidth?{width:`${this.cellWidth}%`}:{}}},timelineVisible(){const{time:e,timeTo:t}=this.options;return this.data.today&&this.isWeekOrDayView&&e&&!this.allDay&&this.nowInMinutes<=t},todaysTimePosition(){if(!this.data.today||!this.options.time)return;const e=this.nowInMinutes-this.options.timeFrom;return Math.round(e*this.timeScale)},timeScale(){return this.options.timeCellHeight/this.options.timeStep}}},DE=Ds(V_,[[\"render\",F_]]),B_={key:0,class:\"vuecal__all-day-text\",style:{width:\"3em\"}};function j_(e,t,n,r,i,s){const o=h.resolveComponent(\"vuecal-cell\");return h.openBlock(),h.createElementBlock(\"div\",{class:\"vuecal__flex vuecal__all-day\",style:h.normalizeStyle(n.cellOrSplitMinWidth&&{height:n.height})},[n.cellOrSplitMinWidth?h.createCommentVNode(\"\",!0):(h.openBlock(),h.createElementBlock(\"div\",B_,[h.createElementVNode(\"span\",null,h.toDisplayString(n.label),1)])),h.createElementVNode(\"div\",{class:h.normalizeClass([\"vuecal__flex vuecal__cells\",`${s.view.id}-view`]),grow:\"\",style:h.normalizeStyle(n.cellOrSplitMinWidth?`min-width: ${n.cellOrSplitMinWidth}px`:\"\")},[(h.openBlock(!0),h.createElementBlock(h.Fragment,null,h.renderList(n.cells,(a,l)=>(h.openBlock(),h.createBlock(o,{key:l,options:n.options,\"edit-events\":s.editEvents,data:a,\"all-day\":!0,\"cell-width\":n.options.hideWeekdays.length&&(s.vuecal.isWeekView||s.vuecal.isMonthView)&&s.vuecal.cellWidth,\"min-timestamp\":n.options.minTimestamp,\"max-timestamp\":n.options.maxTimestamp,\"cell-splits\":n.daySplits},{event:h.withCtx(({event:c,view:u})=>[h.renderSlot(e.$slots,\"event\",{view:u,event:c})]),_:2},1032,[\"options\",\"edit-events\",\"data\",\"cell-width\",\"min-timestamp\",\"max-timestamp\",\"cell-splits\"]))),128))],6)],4)}const H_={inject:[\"vuecal\",\"view\",\"editEvents\"],components:{\"vuecal-cell\":DE},props:{options:{type:Object,required:!0},cells:{type:Array,required:!0},label:{type:String,required:!0},daySplits:{type:Array,default:()=>[]},shortEvents:{type:Boolean,default:!0},height:{type:String,default:\"\"},cellOrSplitMinWidth:{type:Number,default:null}},computed:{hasCellOrSplitWidth(){return!!(this.options.minCellWidth||this.daySplits.length&&this.options.minSplitWidth)}}},U_=Ds(H_,[[\"render\",j_]]),$_=[\"lang\"],W_={class:\"default\"},Y_={key:0,class:\"vuecal__flex vuecal__body\",grow:\"\"},z_=[\"onBlur\",\"innerHTML\"],K_=[\"innerHTML\"],G_=[\"innerHTML\"],X_={class:\"vuecal__flex\",row:\"\",grow:\"\"},J_={key:0,class:\"vuecal__time-column\"},Z_={class:\"vuecal__time-cell-label\"},Q_={key:1,class:\"vuecal__flex vuecal__week-numbers\",column:\"\"},q_=[\"wrap\",\"column\"],eM=[\"onBlur\",\"innerHTML\"],tM=[\"innerHTML\"],nM=[\"innerHTML\"],rM=[\"wrap\"],iM=[\"innerHTML\"],sM=[\"innerHTML\"],oM={key:2,class:\"vuecal__cell-events-count\"},aM={key:3,class:\"vuecal__no-event\"},lM=[\"onBlur\",\"innerHTML\"],cM=[\"innerHTML\"],uM={key:2,class:\"vuecal__event-time\"},fM={key:0},dM={key:1,class:\"days-to-end\"},hM=[\"innerHTML\"],pM={key:0,class:\"vuecal__scrollbar-check\"};function mM(e,t,n,r,i,s){const o=h.resolveComponent(\"vuecal-header\"),a=h.resolveComponent(\"all-day-bar\"),l=h.resolveComponent(\"weekdays-headings\"),c=h.resolveComponent(\"vuecal-cell\");return h.openBlock(),h.createElementBlock(\"div\",{class:h.normalizeClass([\"vuecal__flex vuecal\",s.cssClasses]),column:\"\",ref:\"vuecal\",lang:n.locale},[h.createVNode(o,{options:e.$props,\"edit-events\":s.editEvents,\"view-props\":{views:s.views,weekDaysInHeader:s.weekDaysInHeader},\"week-days\":s.weekDays,\"has-splits\":s.hasSplits,\"day-splits\":s.daySplits,\"switch-to-narrower-view\":s.switchToNarrowerView},h.createSlots({\"arrow-prev\":h.withCtx(()=>[h.renderSlot(e.$slots,\"arrow-prev\",{},()=>[t[0]||(t[0]=h.createTextVNode(\" \")),t[1]||(t[1]=h.createElementVNode(\"i\",{class:\"angle\"},null,-1)),t[2]||(t[2]=h.createTextVNode(\" \"))])]),\"arrow-next\":h.withCtx(()=>[h.renderSlot(e.$slots,\"arrow-next\",{},()=>[t[3]||(t[3]=h.createTextVNode(\" \")),t[4]||(t[4]=h.createElementVNode(\"i\",{class:\"angle\"},null,-1)),t[5]||(t[5]=h.createTextVNode(\" \"))])]),\"today-button\":h.withCtx(()=>[h.renderSlot(e.$slots,\"today-button\",{},()=>[h.createElementVNode(\"span\",W_,h.toDisplayString(i.texts.today),1)])]),title:h.withCtx(()=>[h.renderSlot(e.$slots,\"title\",{title:s.viewTitle,view:i.view},()=>[h.createTextVNode(h.toDisplayString(s.viewTitle),1)])]),_:2},[e.$slots[\"weekday-heading\"]?{name:\"weekday-heading\",fn:h.withCtx(({heading:u,view:f})=>[h.renderSlot(e.$slots,\"weekday-heading\",{heading:u,view:f})]),key:\"0\"}:void 0,e.$slots[\"split-label\"]?{name:\"split-label\",fn:h.withCtx(({split:u})=>[h.renderSlot(e.$slots,\"split-label\",{split:u,view:i.view.id})]),key:\"1\"}:void 0]),1032,[\"options\",\"edit-events\",\"view-props\",\"week-days\",\"has-splits\",\"day-splits\",\"switch-to-narrower-view\"]),n.hideBody?h.createCommentVNode(\"\",!0):(h.openBlock(),h.createElementBlock(\"div\",Y_,[h.createVNode(h.Transition,{name:`slide-fade--${i.transitionDirection}`,appear:n.transitions},{default:h.withCtx(()=>[(h.openBlock(),h.createElementBlock(\"div\",{class:\"vuecal__flex\",style:{\"min-width\":\"100%\"},key:n.transitions?i.view.id:!1,column:\"\"},[n.showAllDayEvents&&s.hasTimeColumn&&(!s.cellOrSplitMinWidth||s.isDayView&&!n.minSplitWidth)?(h.openBlock(),h.createBlock(a,h.normalizeProps(h.mergeProps({key:0},s.allDayBar)),{event:h.withCtx(({event:u,view:f})=>[h.renderSlot(e.$slots,\"event\",{view:f,event:u},()=>[s.editEvents.title&&u.titleEditable?(h.openBlock(),h.createElementBlock(\"div\",{key:0,class:\"vuecal__event-title vuecal__event-title--edit\",contenteditable:\"\",onBlur:d=>s.onEventTitleBlur(d,u),innerHTML:u.title},null,40,z_)):u.title?(h.openBlock(),h.createElementBlock(\"div\",{key:1,class:\"vuecal__event-title\",innerHTML:u.title},null,8,K_)):h.createCommentVNode(\"\",!0),u.content&&!s.hasShortEvents&&!s.isShortMonthView?(h.openBlock(),h.createElementBlock(\"div\",{key:2,class:\"vuecal__event-content\",innerHTML:u.content},null,8,G_)):h.createCommentVNode(\"\",!0)])]),_:3},16)):h.createCommentVNode(\"\",!0),h.createElementVNode(\"div\",{class:h.normalizeClass([\"vuecal__bg\",{vuecal__flex:!s.hasTimeColumn}]),column:\"\"},[h.createElementVNode(\"div\",X_,[s.hasTimeColumn?(h.openBlock(),h.createElementBlock(\"div\",J_,[n.showAllDayEvents&&s.cellOrSplitMinWidth&&!(s.isDayView&&!n.minSplitWidth)?(h.openBlock(),h.createElementBlock(\"div\",{key:0,class:\"vuecal__all-day-text\",style:h.normalizeStyle({height:s.allDayBar.height})},[h.createElementVNode(\"span\",null,h.toDisplayString(i.texts.allDay),1)],4)):h.createCommentVNode(\"\",!0),(h.openBlock(!0),h.createElementBlock(h.Fragment,null,h.renderList(s.timeCells,(u,f)=>(h.openBlock(),h.createElementBlock(\"div\",{class:\"vuecal__time-cell\",key:f,style:h.normalizeStyle(`height: ${n.timeCellHeight}px`)},[h.renderSlot(e.$slots,\"time-cell\",{hours:u.hours,minutes:u.minutes},()=>[t[6]||(t[6]=h.createElementVNode(\"span\",{class:\"vuecal__time-cell-line\"},null,-1)),h.createElementVNode(\"span\",Z_,h.toDisplayString(u.label),1)])],4))),128))])):h.createCommentVNode(\"\",!0),n.showWeekNumbers&&s.isMonthView?(h.openBlock(),h.createElementBlock(\"div\",Q_,[(h.openBlock(),h.createElementBlock(h.Fragment,null,h.renderList(6,u=>h.createElementVNode(\"div\",{class:\"vuecal__flex vuecal__week-number-cell\",key:u,grow:\"\"},[h.renderSlot(e.$slots,\"week-number-cell\",{week:s.getWeekNumber(u-1)},()=>[h.createTextVNode(h.toDisplayString(s.getWeekNumber(u-1)),1)])])),64))])):h.createCommentVNode(\"\",!0),h.createElementVNode(\"div\",{class:h.normalizeClass([\"vuecal__flex vuecal__cells\",`${i.view.id}-view`]),grow:\"\",wrap:!s.cellOrSplitMinWidth||!s.isWeekView,column:!!s.cellOrSplitMinWidth},[s.cellOrSplitMinWidth&&s.isWeekView?(h.openBlock(),h.createBlock(l,{key:0,\"transition-direction\":i.transitionDirection,\"week-days\":s.weekDays,\"switch-to-narrower-view\":s.switchToNarrowerView,style:h.normalizeStyle(s.cellOrSplitMinWidth?`min-width: ${s.cellOrSplitMinWidth}px`:\"\")},h.createSlots({_:2},[e.$slots[\"weekday-heading\"]?{name:\"weekday-heading\",fn:h.withCtx(({heading:u,view:f})=>[h.renderSlot(e.$slots,\"weekday-heading\",{heading:u,view:f})]),key:\"0\"}:void 0,e.$slots[\"split-label\"]?{name:\"split-label\",fn:h.withCtx(({split:u})=>[h.renderSlot(e.$slots,\"split-label\",{split:u,view:i.view.id})]),key:\"1\"}:void 0]),1032,[\"transition-direction\",\"week-days\",\"switch-to-narrower-view\",\"style\"])):s.hasSplits&&n.stickySplitLabels&&n.minSplitWidth?(h.openBlock(),h.createElementBlock(\"div\",{key:1,class:\"vuecal__flex vuecal__split-days-headers\",style:h.normalizeStyle(s.cellOrSplitMinWidth?`min-width: ${s.cellOrSplitMinWidth}px`:\"\")},[(h.openBlock(!0),h.createElementBlock(h.Fragment,null,h.renderList(s.daySplits,(u,f)=>(h.openBlock(),h.createElementBlock(\"div\",{class:h.normalizeClass([\"day-split-header\",u.class||!1]),key:f},[h.renderSlot(e.$slots,\"split-label\",{split:u,view:i.view.id},()=>[h.createTextVNode(h.toDisplayString(u.label),1)])],2))),128))],4)):h.createCommentVNode(\"\",!0),n.showAllDayEvents&&s.hasTimeColumn&&(s.isWeekView&&s.cellOrSplitMinWidth||s.isDayView&&s.hasSplits&&n.minSplitWidth)?(h.openBlock(),h.createBlock(a,h.normalizeProps(h.mergeProps({key:2},s.allDayBar)),{event:h.withCtx(({event:u,view:f})=>[h.renderSlot(e.$slots,\"event\",{view:f,event:u},()=>[s.editEvents.title&&u.titleEditable?(h.openBlock(),h.createElementBlock(\"div\",{key:0,class:\"vuecal__event-title vuecal__event-title--edit\",contenteditable:\"\",onBlur:d=>s.onEventTitleBlur(d,u),innerHTML:u.title},null,40,eM)):u.title?(h.openBlock(),h.createElementBlock(\"div\",{key:1,class:\"vuecal__event-title\",innerHTML:u.title},null,8,tM)):h.createCommentVNode(\"\",!0),u.content&&!s.hasShortEvents&&!s.isShortMonthView?(h.openBlock(),h.createElementBlock(\"div\",{key:2,class:\"vuecal__event-content\",innerHTML:u.content},null,8,nM)):h.createCommentVNode(\"\",!0)])]),_:3},16)):h.createCommentVNode(\"\",!0),h.createElementVNode(\"div\",{class:\"vuecal__flex\",ref:u=>i.cellsEl=u,grow:\"\",wrap:!s.cellOrSplitMinWidth||!s.isWeekView,style:h.normalizeStyle(s.cellOrSplitMinWidth?`min-width: ${s.cellOrSplitMinWidth}px`:\"\")},[(h.openBlock(!0),h.createElementBlock(h.Fragment,null,h.renderList(s.viewCells,(u,f)=>(h.openBlock(),h.createBlock(c,{key:f,options:e.$props,\"edit-events\":s.editEvents,data:u,\"cell-width\":n.hideWeekdays.length&&(s.isWeekView||s.isMonthView)&&s.cellWidth,\"min-timestamp\":s.minTimestamp,\"max-timestamp\":s.maxTimestamp,\"cell-splits\":s.hasSplits&&s.daySplits||[]},{\"cell-content\":h.withCtx(({events:d,split:p,selectCell:m})=>[h.renderSlot(e.$slots,\"cell-content\",{cell:u,view:i.view,goNarrower:m,events:d},()=>[p&&!n.stickySplitLabels?(h.openBlock(),h.createElementBlock(\"div\",{key:0,class:\"split-label\",innerHTML:p.label},null,8,iM)):h.createCommentVNode(\"\",!0),u.content?(h.openBlock(),h.createElementBlock(\"div\",{key:1,class:\"vuecal__cell-date\",innerHTML:u.content},null,8,sM)):h.createCommentVNode(\"\",!0),(s.isMonthView&&!n.eventsOnMonthView||s.isYearsOrYearView&&n.eventsCountOnYearView)&&d.length?(h.openBlock(),h.createElementBlock(\"div\",oM,[h.renderSlot(e.$slots,\"events-count\",{view:i.view,events:d},()=>[h.createTextVNode(h.toDisplayString(d.length),1)])])):h.createCommentVNode(\"\",!0),!s.cellOrSplitHasEvents(d,p)&&s.isWeekOrDayView?(h.openBlock(),h.createElementBlock(\"div\",aM,[h.renderSlot(e.$slots,\"no-event\",{},()=>[h.createTextVNode(h.toDisplayString(i.texts.noEvent),1)])])):h.createCommentVNode(\"\",!0)])]),event:h.withCtx(({event:d,view:p})=>[h.renderSlot(e.$slots,\"event\",{view:p,event:d},()=>[s.editEvents.title&&d.titleEditable?(h.openBlock(),h.createElementBlock(\"div\",{key:0,class:\"vuecal__event-title vuecal__event-title--edit\",contenteditable:\"\",onBlur:m=>s.onEventTitleBlur(m,d),innerHTML:d.title},null,40,lM)):d.title?(h.openBlock(),h.createElementBlock(\"div\",{key:1,class:\"vuecal__event-title\",innerHTML:d.title},null,8,cM)):h.createCommentVNode(\"\",!0),n.time&&!d.allDay&&!(s.isMonthView&&(d.allDay||n.showAllDayEvents===\"short\"))&&!s.isShortMonthView?(h.openBlock(),h.createElementBlock(\"div\",uM,[h.createTextVNode(h.toDisplayString(i.utils.date.formatTime(d.start,s.TimeFormat)),1),d.endTimeMinutes?(h.openBlock(),h.createElementBlock(\"span\",fM,\" - \"+h.toDisplayString(i.utils.date.formatTime(d.end,s.TimeFormat,null,!0)),1)):h.createCommentVNode(\"\",!0),d.daysCount>1&&(d.segments[u.formattedDate]||{}).isFirstDay?(h.openBlock(),h.createElementBlock(\"small\",dM,\" +\"+h.toDisplayString(d.daysCount-1)+h.toDisplayString((i.texts.day[0]||\"\").toLowerCase()),1)):h.createCommentVNode(\"\",!0)])):h.createCommentVNode(\"\",!0),d.content&&!(s.isMonthView&&d.allDay&&n.showAllDayEvents===\"short\")&&!s.isShortMonthView?(h.openBlock(),h.createElementBlock(\"div\",{key:3,class:\"vuecal__event-content\",innerHTML:d.content},null,8,hM)):h.createCommentVNode(\"\",!0)])]),\"no-event\":h.withCtx(()=>[h.renderSlot(e.$slots,\"no-event\",{},()=>[h.createTextVNode(h.toDisplayString(i.texts.noEvent),1)])]),_:2},1032,[\"options\",\"edit-events\",\"data\",\"cell-width\",\"min-timestamp\",\"max-timestamp\",\"cell-splits\"]))),128))],12,rM)],10,q_)])],2)]))]),_:3},8,[\"name\",\"appear\"]),i.ready?h.createCommentVNode(\"\",!0):(h.openBlock(),h.createElementBlock(\"div\",pM,t[7]||(t[7]=[h.createElementVNode(\"div\",null,null,-1)])))]))],10,$_)}const Ls=24*60,Ya={weekDays:Array(7).fill(\"\"),weekDaysShort:[],months:Array(12).fill(\"\"),years:\"\",year:\"\",month:\"\",week:\"\",day:\"\",today:\"\",noEvent:\"\",allDay:\"\",deleteEvent:\"\",createEvent:\"\",dateFormat:\"dddd MMMM D, YYYY\",am:\"am\",pm:\"pm\"},Rp=[\"years\",\"year\",\"month\",\"week\",\"day\"],Pp=new n_(Ya),gM={name:\"vue-cal\",components:{\"vuecal-cell\":DE,\"vuecal-header\":A_,WeekdaysHeadings:wE,AllDayBar:U_},provide(){return{vuecal:this,utils:this.utils,modules:this.modules,previous:this.previous,next:this.next,switchView:this.switchView,updateSelectedDate:this.updateSelectedDate,editEvents:this.editEvents,view:this.view,domEvents:this.domEvents}},props:{activeView:{type:String,default:\"week\"},allDayBarHeight:{type:[String,Number],default:\"25px\"},cellClickHold:{type:Boolean,default:!0},cellContextmenu:{type:Boolean,default:!1},clickToNavigate:{type:Boolean,default:!1},dblclickToNavigate:{type:Boolean,default:!0},disableDatePrototypes:{type:Boolean,default:!1},disableDays:{type:Array,default:()=>[]},disableViews:{type:Array,default:()=>[]},dragToCreateEvent:{type:Boolean,default:!0},dragToCreateThreshold:{type:Number,default:15},editableEvents:{type:[Boolean,Object],default:!1},events:{type:Array,default:()=>[]},eventsCountOnYearView:{type:Boolean,default:!1},eventsOnMonthView:{type:[Boolean,String],default:!1},hideBody:{type:Boolean,default:!1},hideTitleBar:{type:Boolean,default:!1},hideViewSelector:{type:Boolean,default:!1},hideWeekdays:{type:Array,default:()=>[]},hideWeekends:{type:Boolean,default:!1},locale:{type:[String,Object],default:\"en\"},maxDate:{type:[String,Date],default:\"\"},minCellWidth:{type:Number,default:0},minDate:{type:[String,Date],default:\"\"},minEventWidth:{type:Number,default:0},minSplitWidth:{type:Number,default:0},onEventClick:{type:[Function,null],default:null},onEventCreate:{type:[Function,null],default:null},onEventDblclick:{type:[Function,null],default:null},overlapsPerTimeStep:{type:Boolean,default:!1},resizeX:{type:Boolean,default:!1},selectedDate:{type:[String,Date],default:\"\"},showAllDayEvents:{type:[Boolean,String],default:!1},showTimeInCells:{type:Boolean,default:!1},showWeekNumbers:{type:[Boolean,String],default:!1},snapToTime:{type:Number,default:0},small:{type:Boolean,default:!1},specialHours:{type:Object,default:()=>({})},splitDays:{type:Array,default:()=>[]},startWeekOnSunday:{type:Boolean,default:!1},stickySplitLabels:{type:Boolean,default:!1},time:{type:Boolean,default:!0},timeCellHeight:{type:Number,default:40},timeFormat:{type:String,default:\"\"},timeFrom:{type:Number,default:0},timeStep:{type:Number,default:60},timeTo:{type:Number,default:Ls},todayButton:{type:Boolean,default:!1},transitions:{type:Boolean,default:!0},twelveHour:{type:Boolean,default:!1},watchRealTime:{type:Boolean,default:!1},xsmall:{type:Boolean,default:!1}},data(){return{ready:!1,texts:{...Ya},utils:{date:(this.disableDatePrototypes?Pp.removePrototypes():!1)||Pp,cell:null,event:null},modules:{dnd:null},cellsEl:null,view:{id:\"\",title:\"\",startDate:null,endDate:null,firstCellDate:null,lastCellDate:null,selectedDate:null,events:[]},eventIdIncrement:1,now:new Date,timeTickerIds:[null,null],domEvents:{resizeAnEvent:{_eid:null,start:null,split:null,segment:null,originalEndTimeMinutes:0,originalEnd:null,end:null,startCell:null,endCell:null},dragAnEvent:{_eid:null},dragCreateAnEvent:{startCursorY:null,start:null,split:null,event:null},focusAnEvent:{_eid:null,mousedUp:!1},clickHoldAnEvent:{_eid:null,timeout:1200,timeoutId:null},dblTapACell:{taps:0,timeout:500},clickHoldACell:{cellId:null,split:null,timeout:1200,timeoutId:null,eventCreated:!1},cancelClickEventCreation:!1},mutableEvents:[],transitionDirection:\"right\"}},methods:{async loadLocale(e){if(typeof this.locale==\"object\"){this.texts=Object.assign({},Ya,e),this.utils.date.updateTexts(this.texts);return}const t=await t_(Object.assign({\"./i18n/ar.json\":()=>He(()=>import(\"./ar.es-CfdTYgcp.js\"),[],import.meta.url),\"./i18n/bg.json\":()=>He(()=>import(\"./bg.es-Ce0T19Qg.js\"),[],import.meta.url),\"./i18n/bn.json\":()=>He(()=>import(\"./bn.es-iWyup8_3.js\"),[],import.meta.url),\"./i18n/bs.json\":()=>He(()=>import(\"./bs.es-Cz58hpHx.js\"),[],import.meta.url),\"./i18n/ca.json\":()=>He(()=>import(\"./ca.es-CujU75Im.js\"),[],import.meta.url),\"./i18n/cs.json\":()=>He(()=>import(\"./cs.es-BHhRbaip.js\"),[],import.meta.url),\"./i18n/da.json\":()=>He(()=>import(\"./da.es-DglD7fV2.js\"),[],import.meta.url),\"./i18n/de.json\":()=>He(()=>import(\"./de.es-D_4ZyLTN.js\"),[],import.meta.url),\"./i18n/el.json\":()=>He(()=>import(\"./el.es-BC26X5xm.js\"),[],import.meta.url),\"./i18n/en.json\":()=>He(()=>import(\"./en.es-DDTuV2po.js\"),[],import.meta.url),\"./i18n/es.json\":()=>He(()=>import(\"./es.es-BvvfjN-O.js\"),[],import.meta.url),\"./i18n/et.json\":()=>He(()=>import(\"./et.es-C0rF9HtR.js\"),[],import.meta.url),\"./i18n/fa.json\":()=>He(()=>import(\"./fa.es-CibKJjgz.js\"),[],import.meta.url),\"./i18n/fi.json\":()=>He(()=>import(\"./fi.es-B0Iy6aas.js\"),[],import.meta.url),\"./i18n/fr.json\":()=>He(()=>import(\"./fr.es-B7WXlprl.js\"),[],import.meta.url),\"./i18n/he.json\":()=>He(()=>import(\"./he.es-K9Fk8xhK.js\"),[],import.meta.url),\"./i18n/hr.json\":()=>He(()=>import(\"./hr.es-ef5bxYFj.js\"),[],import.meta.url),\"./i18n/hu.json\":()=>He(()=>import(\"./hu.es-nZ65MV0n.js\"),[],import.meta.url),\"./i18n/id.json\":()=>He(()=>import(\"./id.es-CzHAK-XV.js\"),[],import.meta.url),\"./i18n/is.json\":()=>He(()=>import(\"./is.es-Dz07gBgt.js\"),[],import.meta.url),\"./i18n/it.json\":()=>He(()=>import(\"./it.es-CquQA5xx.js\"),[],import.meta.url),\"./i18n/ja.json\":()=>He(()=>import(\"./ja.es-D6pL26k_.js\"),[],import.meta.url),\"./i18n/ka.json\":()=>He(()=>import(\"./ka.es-Cb9X-eNS.js\"),[],import.meta.url),\"./i18n/ko.json\":()=>He(()=>import(\"./ko.es-CTpJlj0A.js\"),[],import.meta.url),\"./i18n/lt.json\":()=>He(()=>import(\"./lt.es-vqgjGyMx.js\"),[],import.meta.url),\"./i18n/mn.json\":()=>He(()=>import(\"./mn.es-YZet1as4.js\"),[],import.meta.url),\"./i18n/nl.json\":()=>He(()=>import(\"./nl.es-COp8PWbT.js\"),[],import.meta.url),\"./i18n/no.json\":()=>He(()=>import(\"./no.es-_2m-F2FS.js\"),[],import.meta.url),\"./i18n/pl.json\":()=>He(()=>import(\"./pl.es-jjNeJM5X.js\"),[],import.meta.url),\"./i18n/pt-br.json\":()=>He(()=>import(\"./pt-br.es-D8ojES2d.js\"),[],import.meta.url),\"./i18n/pt-pt.json\":()=>He(()=>import(\"./pt-pt.es-D8ojES2d.js\"),[],import.meta.url),\"./i18n/ro.json\":()=>He(()=>import(\"./ro.es-B6_ATXom.js\"),[],import.meta.url),\"./i18n/ru.json\":()=>He(()=>import(\"./ru.es-BGEpmv_x.js\"),[],import.meta.url),\"./i18n/sk.json\":()=>He(()=>import(\"./sk.es-V3h-1af8.js\"),[],import.meta.url),\"./i18n/sl.json\":()=>He(()=>import(\"./sl.es-mZjm0YDT.js\"),[],import.meta.url),\"./i18n/sq.json\":()=>He(()=>import(\"./sq.es-_6B4UQXy.js\"),[],import.meta.url),\"./i18n/sr.json\":()=>He(()=>import(\"./sr.es-BmdOpTOG.js\"),[],import.meta.url),\"./i18n/sv.json\":()=>He(()=>import(\"./sv.es-LwrPWbzy.js\"),[],import.meta.url),\"./i18n/tr.json\":()=>He(()=>import(\"./tr.es-CS80t-Rq.js\"),[],import.meta.url),\"./i18n/uk.json\":()=>He(()=>import(\"./uk.es-BVYlda65.js\"),[],import.meta.url),\"./i18n/vi.json\":()=>He(()=>import(\"./vi.es-B5CIRCK5.js\"),[],import.meta.url),\"./i18n/zh-cn.json\":()=>He(()=>import(\"./zh-cn.es-DKz-yscG.js\"),[],import.meta.url),\"./i18n/zh-hk.json\":()=>He(()=>import(\"./zh-hk.es-CFZP5Cvd.js\"),[],import.meta.url)}),`./i18n/${e}.json`,3);this.texts=Object.assign({},Ya,t),this.utils.date.updateTexts(this.texts)},loadDragAndDrop(){He(()=>import(\"./drag-and-drop.es-JkAdgoaa.js\"),[],import.meta.url).then(e=>{const{DragAndDrop:t}=e;this.modules.dnd=new t(this)}).catch(()=>console.warn(\"Vue Cal: Missing drag & drop module.\"))},validateView(e){return Rp.includes(e)||(console.error(`Vue Cal: invalid active-view parameter provided: \"${e}\".\nA valid view must be one of: ${Rp.join(\", \")}.`),e=\"week\"),this.enabledViews.includes(e)||(console.warn(`Vue Cal: the provided active-view \"${e}\" is disabled. Using the \"${this.enabledViews[0]}\" view instead.`),e=this.enabledViews[0]),e},switchToNarrowerView(e=null){this.transitionDirection=\"right\";const t=this.enabledViews[this.enabledViews.indexOf(this.view.id)+1];t&&this.switchView(t,e)},switchView(e,t=null,n=!1){e=this.validateView(e);const r=this.utils.date,i=this.view.startDate&&this.view.startDate.getTime();if(this.transitions&&n){if(this.view.id===e)return;const a=this.enabledViews;this.transitionDirection=a.indexOf(this.view.id)>a.indexOf(e)?\"left\":\"right\"}const s=this.view.id;switch(this.view.events=[],this.view.id=e,this.view.firstCellDate=null,this.view.lastCellDate=null,t||(t=this.view.selectedDate||this.view.startDate),e){case\"years\":{this.view.startDate=new Date(Math.floor(t.getFullYear()/25)*25||2e3,0,1),this.view.endDate=new Date(this.view.startDate.getFullYear()+25,0,1),this.view.endDate.setSeconds(-1);break}case\"year\":{this.view.startDate=new Date(t.getFullYear(),0,1),this.view.endDate=new Date(t.getFullYear()+1,0,1),this.view.endDate.setSeconds(-1);break}case\"month\":{this.view.startDate=new Date(t.getFullYear(),t.getMonth(),1),this.view.endDate=new Date(t.getFullYear(),t.getMonth()+1,1),this.view.endDate.setSeconds(-1);let a=new Date(this.view.startDate);if(a.getDay()!==(this.startWeekOnSunday?0:1)&&(a=r.getPreviousFirstDayOfWeek(a,this.startWeekOnSunday)),this.view.firstCellDate=a,this.view.lastCellDate=r.addDays(a,41),this.view.lastCellDate.setHours(23,59,59,0),this.hideWeekends){if([0,6].includes(this.view.firstCellDate.getDay())){const l=this.view.firstCellDate.getDay()===6&&!this.startWeekOnSunday?2:1;this.view.firstCellDate=r.addDays(this.view.firstCellDate,l)}if([0,6].includes(this.view.startDate.getDay())){const l=this.view.startDate.getDay()===6?2:1;this.view.startDate=r.addDays(this.view.startDate,l)}if([0,6].includes(this.view.lastCellDate.getDay())){const l=this.view.lastCellDate.getDay()===0&&!this.startWeekOnSunday?2:1;this.view.lastCellDate=r.subtractDays(this.view.lastCellDate,l)}if([0,6].includes(this.view.endDate.getDay())){const l=this.view.endDate.getDay()===0?2:1;this.view.endDate=r.subtractDays(this.view.endDate,l)}}break}case\"week\":{t=r.getPreviousFirstDayOfWeek(t,this.startWeekOnSunday);const a=this.hideWeekends?5:7;this.view.startDate=this.hideWeekends&&this.startWeekOnSunday?r.addDays(t,1):t,this.view.startDate.setHours(0,0,0,0),this.view.endDate=r.addDays(t,a),this.view.endDate.setSeconds(-1);break}case\"day\":{this.view.startDate=t,this.view.startDate.setHours(0,0,0,0),this.view.endDate=new Date(t),this.view.endDate.setHours(23,59,59,0);break}}this.addEventsToView();const o=this.view.startDate&&this.view.startDate.getTime();if(!(s===e&&o===i)&&(this.$emit(\"update:activeView\",e),this.ready)){const a=this.view.startDate,l={view:e,startDate:a,endDate:this.view.endDate,...this.isMonthView?{firstCellDate:this.view.firstCellDate,lastCellDate:this.view.lastCellDate,outOfScopeEvents:this.view.outOfScopeEvents.map(this.cleanupEvent)}:{},events:this.view.events.map(this.cleanupEvent),...this.isWeekView?{week:r.getWeek(this.startWeekOnSunday?r.addDays(a,1):a)}:{}};this.$emit(\"view-change\",l)}},previous(){this.previousNext(!1)},next(){this.previousNext()},previousNext(e=!0){const t=this.utils.date;this.transitionDirection=e?\"right\":\"left\";const n=e?1:-1;let r=null;const{startDate:i,id:s}=this.view;switch(s){case\"years\":r=new Date(i.getFullYear()+25*n,0,1);break;case\"year\":r=new Date(i.getFullYear()+1*n,1,1);break;case\"month\":r=new Date(i.getFullYear(),i.getMonth()+1*n,1);break;case\"week\":r=t[e?\"addDays\":\"subtractDays\"](t.getPreviousFirstDayOfWeek(i,this.startWeekOnSunday),7);break;case\"day\":r=t[e?\"addDays\":\"subtractDays\"](i,1);const o=r.getDay(),a=this.startWeekOnSunday?o:(o||7)-1;if(this.weekDays[a].hide){const c=this.weekDays.map((f,d)=>({...f,i:d}));let u=0;e?([...c.slice(a),...c].find(f=>(u++,!f.hide)).i,u--):[...c,...c.slice(0,a)].reverse().find(f=>(u++,!f.hide)).i,r=t[e?\"addDays\":\"subtractDays\"](r,u)}break}r&&this.switchView(s,r)},addEventsToView(e=[]){const t=this.utils.event,{startDate:n,endDate:r,firstCellDate:i,lastCellDate:s}=this.view;if(e.length||(this.view.events=[]),e=e.length?e:[...this.mutableEvents],!e||this.isYearsOrYearView&&!this.eventsCountOnYearView)return;let o=e.filter(a=>t.eventInRange(a,n,r));!this.isYearsOrYearView&&!(this.isMonthView&&!this.eventsOnMonthView)&&(o=o.map(a=>a.daysCount>1?t.createEventSegments(a,i||n,s||r):a)),this.view.events.push(...o),this.isMonthView&&(this.view.outOfScopeEvents=[],e.forEach(a=>{(t.eventInRange(a,i,n)||t.eventInRange(a,r,s))&&(this.view.events.some(l=>l._eid===a._eid)||this.view.outOfScopeEvents.push(a))}))},findAncestor(e,t){for(;(e=e.parentElement)&&!e.classList.contains(t););return e},isDOMElementAnEvent(e){return e.classList.contains(\"vuecal__event\")||this.findAncestor(e,\"vuecal__event\")},onMouseMove(e){const{resizeAnEvent:t,dragAnEvent:n,dragCreateAnEvent:r}=this.domEvents;t._eid===null&&n._eid===null&&!r.start||(e.preventDefault(),t._eid?this.eventResizing(e):this.dragToCreateEvent&&r.start&&this.eventDragCreation(e))},onMouseUp(e){const{focusAnEvent:t,resizeAnEvent:n,clickHoldAnEvent:r,clickHoldACell:i,dragCreateAnEvent:s}=this.domEvents,{_eid:o}=r,{_eid:a}=n;let l=!1;const{event:c,start:u}=s,f=this.isDOMElementAnEvent(e.target),d=t.mousedUp;if(t.mousedUp=!1,f&&(this.domEvents.cancelClickEventCreation=!0),i.eventCreated)return;if(a){const{originalEnd:m,originalEndTimeMinutes:g,endTimeMinutes:v}=n,w=this.view.events.find(S=>S._eid===n._eid);if(l=v&&v!==g,w&&w.end.getTime()!==m.getTime()){const S=this.mutableEvents.find(C=>C._eid===n._eid);S.endTimeMinutes=w.endTimeMinutes,S.end=w.end;const y=this.cleanupEvent(w),E={...this.cleanupEvent(w),end:m,endTimeMinutes:w.originalEndTimeMinutes};this.$emit(\"event-duration-change\",{event:y,oldDate:n.originalEnd,originalEvent:E}),this.$emit(\"event-change\",{event:y,originalEvent:E})}w&&(w.resizing=!1),n._eid=null,n.start=null,n.split=null,n.segment=null,n.originalEndTimeMinutes=null,n.originalEnd=null,n.endTimeMinutes=null,n.startCell=null,n.endCell=null}else u&&(c&&(this.emitWithEvent(\"event-drag-create\",c),s.event.resizing=!1),s.start=null,s.split=null,s.event=null);!f&&!a&&this.unfocusEvent(),r.timeoutId&&!o&&(clearTimeout(r.timeoutId),r.timeoutId=null),i.timeoutId&&(clearTimeout(i.timeoutId),i.timeoutId=null);const p=typeof this.onEventClick==\"function\";if(d&&!l&&!o&&!c&&p){let m=this.view.events.find(g=>g._eid===t._eid);return!m&&this.isMonthView&&(m=this.view.outOfScopeEvents.find(g=>g._eid===t._eid)),m&&this.onEventClick(m,e)}},onKeyUp(e){e.keyCode===27&&this.cancelDelete()},eventResizing(e){const{resizeAnEvent:t}=this.domEvents,n=this.view.events.find(c=>c._eid===t._eid)||{segments:{}},{minutes:r,cursorCoords:i}=this.minutesAtCursor(e),s=n.segments&&n.segments[t.segment],{date:o,event:a}=this.utils,l=Math.max(r,this.timeFrom+1,(s||n).startTimeMinutes+1);if(n.endTimeMinutes=t.endTimeMinutes=l,this.snapToTime){const c=n.endTimeMinutes+this.snapToTime/2;n.endTimeMinutes=c-c%this.snapToTime}if(s&&(s.endTimeMinutes=n.endTimeMinutes),n.end.setHours(0,n.endTimeMinutes,n.endTimeMinutes===Ls?-1:0,0),this.resizeX&&this.isWeekView){n.daysCount=o.countDays(n.start,n.end);const c=this.cellsEl,u=c.offsetWidth/c.childElementCount,f=Math.floor(i.x/u);if(t.startCell===null&&(t.startCell=f-(n.daysCount-1)),t.endCell!==f){t.endCell=f;const d=o.addDays(n.start,f-t.startCell),p=Math.max(o.countDays(n.start,d),1);if(p!==n.daysCount){let m=null;p>n.daysCount?m=a.addEventSegment(n):m=a.removeEventSegment(n),t.segment=m,n.endTimeMinutes+=.001}}}this.$emit(\"event-resizing\",{_eid:n._eid,end:n.end,endTimeMinutes:n.endTimeMinutes})},eventDragCreation(e){const{dragCreateAnEvent:t}=this.domEvents,{start:n,startCursorY:r,split:i}=t,s=new Date(n),{minutes:o,cursorCoords:{y:a}}=this.minutesAtCursor(e);if(!(!t.event&&Math.abs(r-a)<this.dragToCreateThreshold))if(t.event){if(s.setHours(0,o,o===Ls?-1:0,0),this.snapToTime){let u=s.getHours()*60+s.getMinutes();const f=u+this.snapToTime/2;u=f-f%this.snapToTime,s.setHours(0,u,0,0)}const l=n<s,{event:c}=t;c.start=l?n:s,c.end=l?s:n,c.startTimeMinutes=c.start.getHours()*60+c.start.getMinutes(),c.endTimeMinutes=c.end.getHours()*60+c.end.getMinutes()}else{if(t.event=this.utils.event.createAnEvent(n,1,{split:i}),!t.event){t.start=null,t.split=null,t.event=null;return}t.event.resizing=!0}},unfocusEvent(){const{focusAnEvent:e,clickHoldAnEvent:t}=this.domEvents,n=this.view.events.find(r=>r._eid===(e._eid||t._eid));e._eid=null,t._eid=null,n&&(n.focused=!1,n.deleting=!1)},cancelDelete(){const{clickHoldAnEvent:e}=this.domEvents;if(e._eid){const t=this.view.events.find(n=>n._eid===e._eid);t&&(t.deleting=!1),e._eid=null,e.timeoutId=null}},onEventTitleBlur(e,t){if(t.title===e.target.innerHTML)return;const n=t.title;t.title=e.target.innerHTML;const r=this.cleanupEvent(t);this.$emit(\"event-title-change\",{event:r,oldTitle:n}),this.$emit(\"event-change\",{event:r,originalEvent:{...r,title:n}})},updateMutableEvents(){const e=this.utils.date;this.mutableEvents=[],this.events.forEach(t=>{const n=typeof t.start==\"string\"?e.stringToDate(t.start):t.start,r=e.formatDateLite(n),i=e.dateToMinutes(n);let s=null;typeof t.end==\"string\"&&t.end.includes(\"24:00\")?(s=new Date(t.end.replace(\" 24:00\",\"\")),s.setHours(23,59,59,0)):s=typeof t.end==\"string\"?e.stringToDate(t.end):t.end;let o=e.formatDateLite(s),a=e.dateToMinutes(s);(!a||a===Ls)&&(!this.time||typeof t.end==\"string\"&&t.end.length===10?s.setHours(23,59,59,0):s.setSeconds(s.getSeconds()-1),o=e.formatDateLite(s),a=Ls);const l=r!==o;t=Object.assign({...this.utils.event.eventDefaults},t,{_eid:`${this._.uid}_${this.eventIdIncrement++}`,segments:l?{}:null,start:n,startTimeMinutes:i,end:s,endTimeMinutes:a,daysCount:l?e.countDays(n,s):1,class:t.class}),this.mutableEvents.push(t)})},minutesAtCursor(e){return this.utils.cell.minutesAtCursor(e)},createEvent(e,t,n={}){return this.utils.event.createAnEvent(e,t,n)},cleanupEvent(e){return e={...e},[\"segments\",\"deletable\",\"deleting\",\"titleEditable\",\"resizable\",\"resizing\",\"draggable\",\"dragging\",\"draggingStatic\",\"focused\"].forEach(n=>{n in e&&delete e[n]}),e.repeat||delete e.repeat,e},emitWithEvent(e,t){this.$emit(e,this.cleanupEvent(t))},updateSelectedDate(e){if(e&&typeof e==\"string\"?e=this.utils.date.stringToDate(e):e=new Date(e),e&&e instanceof Date){const{selectedDate:t}=this.view;t&&(this.transitionDirection=t.getTime()>e.getTime()?\"left\":\"right\"),e.setHours(0,0,0,0),(!t||t.getTime()!==e.getTime())&&(this.view.selectedDate=e),this.switchView(this.view.id)}this.$emit(\"update:selected-date\",this.view.selectedDate)},getWeekNumber(e){const t=this.utils.date,r=this.firstCellDateWeekNumber+e,i=this.startWeekOnSunday?1:0;return r>52?t.getWeek(t.addDays(this.view.firstCellDate,7*e+i)):r},timeTick(){this.now=new Date,this.timeTickerIds[1]=setTimeout(this.timeTick,60*1e3)},updateDateTexts(){this.utils.date.updateTexts(this.texts)},alignWithScrollbar(){if(document.getElementById(\"vuecal-align-with-scrollbar\"))return;const e=this.$refs.vuecal.getElementsByClassName(\"vuecal__scrollbar-check\")[0],t=e.offsetWidth-e.children[0].offsetWidth;if(t){const n=document.createElement(\"style\");n.id=\"vuecal-align-with-scrollbar\",n.type=\"text/css\",n.innerHTML=`.vuecal--view-with-time .vuecal__weekdays-headings,.vuecal--view-with-time .vuecal__all-day {padding-right: ${t}px}`,document.head.appendChild(n)}},cellOrSplitHasEvents(e,t=null){return e.length&&(!t&&e.length||t&&e.some(n=>n.split===t.id))}},created(){this.utils.cell=new i_(this),this.utils.event=new o_(this,this.utils.date),this.loadLocale(this.locale),this.editEvents.drag&&this.loadDragAndDrop(),this.updateMutableEvents(this.events),this.view.id=this.currentView,this.selectedDate?this.updateSelectedDate(this.selectedDate):(this.view.selectedDate=new Date,this.switchView(this.currentView)),this.time&&this.watchRealTime&&(this.timeTickerIds[0]=setTimeout(this.timeTick,(60-this.now.getSeconds())*1e3))},mounted(){const e=this.utils.date,t=\"ontouchstart\"in window,{resize:n,drag:r,create:i,delete:s,title:o}=this.editEvents,a=this.onEventClick&&typeof this.onEventClick==\"function\";(n||r||i||s||o||a)&&window.addEventListener(t?\"touchend\":\"mouseup\",this.onMouseUp),(n||r||i&&this.dragToCreateEvent)&&window.addEventListener(t?\"touchmove\":\"mousemove\",this.onMouseMove,{passive:!1}),o&&window.addEventListener(\"keyup\",this.onKeyUp),t&&(this.$refs.vuecal.oncontextmenu=function(u){u.preventDefault(),u.stopPropagation()}),this.hideBody||this.alignWithScrollbar();const l=this.view.startDate,c={view:this.view.id,startDate:l,endDate:this.view.endDate,...this.isMonthView?{firstCellDate:this.view.firstCellDate,lastCellDate:this.view.lastCellDate}:{},events:this.view.events.map(this.cleanupEvent),...this.isWeekView?{week:e.getWeek(this.startWeekOnSunday?e.addDays(l,1):l)}:{}};this.$emit(\"ready\",c),this.ready=!0},beforeUnmount(){const e=\"ontouchstart\"in window;window.removeEventListener(e?\"touchmove\":\"mousemove\",this.onMouseMove,{passive:!1}),window.removeEventListener(e?\"touchend\":\"mouseup\",this.onMouseUp),window.removeEventListener(\"keyup\",this.onKeyUp),this.timeTickerIds[0]&&clearTimeout(this.timeTickerIds[0]),this.timeTickerIds[1]&&clearTimeout(this.timeTickerIds[1]),this.timeTickerIds=[null,null]},computed:{editEvents(){return this.editableEvents&&typeof this.editableEvents==\"object\"?{title:!!this.editableEvents.title,drag:!!this.editableEvents.drag,resize:!!this.editableEvents.resize,create:!!this.editableEvents.create,delete:!!this.editableEvents.delete}:{title:!!this.editableEvents,drag:!!this.editableEvents,resize:!!this.editableEvents,create:!!this.editableEvents,delete:!!this.editableEvents}},views(){return{years:{label:this.texts.years,enabled:!this.disableViews.includes(\"years\")},year:{label:this.texts.year,enabled:!this.disableViews.includes(\"year\")},month:{label:this.texts.month,enabled:!this.disableViews.includes(\"month\")},week:{label:this.texts.week,enabled:!this.disableViews.includes(\"week\")},day:{label:this.texts.day,enabled:!this.disableViews.includes(\"day\")}}},currentView(){return this.validateView(this.activeView)},enabledViews(){return Object.keys(this.views).filter(e=>this.views[e].enabled)},hasTimeColumn(){return this.time&&this.isWeekOrDayView},isShortMonthView(){return this.isMonthView&&this.eventsOnMonthView===\"short\"},firstCellDateWeekNumber(){const e=this.utils.date,t=this.view.firstCellDate;return e.getWeek(this.startWeekOnSunday?e.addDays(t,1):t)},timeCells(){const e=[];for(let t=this.timeFrom,n=this.timeTo;t<n;t+=this.timeStep)e.push({hours:Math.floor(t/60),minutes:t%60,label:this.utils.date.formatTime(t,this.TimeFormat),value:t});return e},TimeFormat(){return this.timeFormat||(this.twelveHour?\"h:mm{am}\":\"HH:mm\")},daySplits(){return(this.splitDays.filter(e=>!e.hide)||[]).map((e,t)=>({...e,id:e.id||t+1}))},hasSplits(){return this.daySplits.length&&this.isWeekOrDayView},hasShortEvents(){return this.showAllDayEvents===\"short\"},cellOrSplitMinWidth(){let e=null;return this.hasSplits&&this.minSplitWidth?e=this.visibleDaysCount*this.minSplitWidth*this.daySplits.length:this.minCellWidth&&this.isWeekView&&(e=this.visibleDaysCount*this.minCellWidth),e},allDayBar(){let e=this.allDayBarHeight||null;return e&&!isNaN(e)&&(e+=\"px\"),{cells:this.viewCells,options:this.$props,label:this.texts.allDay,shortEvents:this.hasShortEvents,daySplits:this.hasSplits&&this.daySplits||[],cellOrSplitMinWidth:this.cellOrSplitMinWidth,height:e}},minTimestamp(){let e=null;return this.minDate&&typeof this.minDate==\"string\"?e=this.utils.date.stringToDate(this.minDate):this.minDate&&this.minDate instanceof Date&&(e=this.minDate),e?e.getTime():null},maxTimestamp(){let e=null;return this.maxDate&&typeof this.maxDate==\"string\"?e=this.utils.date.stringToDate(this.maxDate):this.maxDate&&this.maxDate instanceof Date&&(e=this.maxDate),e?e.getTime():null},weekDays(){let{weekDays:e,weekDaysShort:t=[]}=this.texts;return e=e.slice(0).map((n,r)=>({label:n,...t.length?{short:t[r]}:{},hide:this.hideWeekends&&r>=5||this.hideWeekdays.length&&this.hideWeekdays.includes(r+1)})),this.startWeekOnSunday&&e.unshift(e.pop()),e},weekDaysInHeader(){return this.isMonthView||this.isWeekView&&!this.minCellWidth&&!(this.hasSplits&&this.minSplitWidth)},months(){return this.texts.months.map(e=>({label:e}))},specialDayHours(){return!this.specialHours||!Object.keys(this.specialHours).length?{}:Array(7).fill(\"\").map((e,t)=>{let n=this.specialHours[t+1]||[];return Array.isArray(n)||(n=[n]),e=[],n.forEach(({from:r,to:i,class:s,label:o},a)=>{e[a]={day:t+1,from:[null,void 0].includes(r)?null:r*1,to:[null,void 0].includes(i)?null:i*1,class:s||\"\",label:o||\"\"}}),e})},viewTitle(){const e=this.utils.date;let t=\"\";const n=this.view.startDate,r=n.getFullYear(),i=n.getMonth();switch(this.view.id){case\"years\":{t=this.texts.years;break}case\"year\":{t=r;break}case\"month\":{t=`${this.months[i].label} ${r}`;break}case\"week\":{const s=this.view.endDate,o=n.getFullYear();let a=this.texts.months[n.getMonth()];this.xsmall&&(a=a.substring(0,3));let l=`${a} ${o}`;if(s.getMonth()!==n.getMonth()){const c=s.getFullYear();let u=this.texts.months[s.getMonth()];this.xsmall&&(u=u.substring(0,3)),o===c?l=`${a} - ${u} ${o}`:this.small?l=`${a.substring(0,3)} ${o} - ${u.substring(0,3)} ${c}`:l=`${a} ${o} - ${u} ${c}`}t=`${this.texts.week} ${e.getWeek(this.startWeekOnSunday?e.addDays(n,1):n)} (${l})`;break}case\"day\":{t=this.utils.date.formatDate(n,this.texts.dateFormat,this.texts);break}}return t},viewCells(){const e=this.utils.date;let t=[],n=null,r=!1;this.watchRealTime||(this.now=new Date);const i=this.now;switch(this.view.id){case\"years\":{n=this.view.startDate.getFullYear(),t=Array.apply(null,Array(25)).map((s,o)=>{const a=new Date(n+o,0,1),l=new Date(n+o+1,0,1);return l.setSeconds(-1),{startDate:a,formattedDate:e.formatDateLite(a),endDate:l,content:n+o,current:n+o===i.getFullYear()}});break}case\"year\":{n=this.view.startDate.getFullYear(),t=Array.apply(null,Array(12)).map((s,o)=>{const a=new Date(n,o,1),l=new Date(n,o+1,1);return l.setSeconds(-1),{startDate:a,formattedDate:e.formatDateLite(a),endDate:l,content:this.xsmall?this.months[o].label.substr(0,3):this.months[o].label,current:o===i.getMonth()&&n===i.getFullYear()}});break}case\"month\":{const s=this.view.startDate.getMonth(),o=new Date(this.view.firstCellDate);r=!1,t=Array.apply(null,Array(42)).map((a,l)=>{const c=e.addDays(o,l),u=new Date(c);u.setHours(23,59,59,0);const f=!r&&e.isToday(c)&&!r++;return{startDate:c,formattedDate:e.formatDateLite(c),endDate:u,content:c.getDate(),today:f,outOfScope:c.getMonth()!==s,class:`vuecal__cell--day${c.getDay()||7}`}}),(this.hideWeekends||this.hideWeekdays.length)&&(t=t.filter(a=>{const l=a.startDate.getDay()||7;return!(this.hideWeekends&&l>=6||this.hideWeekdays.length&&this.hideWeekdays.includes(l))}));break}case\"week\":{r=!1;const s=this.view.startDate,o=this.weekDays;t=o.map((a,l)=>{const c=e.addDays(s,this.startWeekOnSunday&&this.hideWeekends?l-1:l),u=new Date(c);u.setHours(23,59,59,0);const f=(c.getDay()||7)-1;return{startDate:c,formattedDate:e.formatDateLite(c),endDate:u,today:!r&&e.isToday(c)&&!r++,specialHours:this.specialDayHours[f]||[]}}).filter((a,l)=>!o[l].hide);break}case\"day\":{const s=this.view.startDate,o=new Date(this.view.startDate);o.setHours(23,59,59,0);const a=(s.getDay()||7)-1;t=[{startDate:s,formattedDate:e.formatDateLite(s),endDate:o,today:e.isToday(s),specialHours:this.specialDayHours[a]||[]}];break}}return t},visibleDaysCount(){return this.isDayView?1:7-this.weekDays.reduce((e,t)=>e+t.hide,0)},cellWidth(){return 100/this.visibleDaysCount},cssClasses(){const{resizeAnEvent:e,dragAnEvent:t,dragCreateAnEvent:n}=this.domEvents;return{[`vuecal--${this.view.id}-view`]:!0,[`vuecal--${this.locale}`]:this.locale,\"vuecal--no-time\":!this.time,\"vuecal--view-with-time\":this.hasTimeColumn,\"vuecal--week-numbers\":this.showWeekNumbers&&this.isMonthView,\"vuecal--twelve-hour\":this.twelveHour,\"vuecal--click-to-navigate\":this.clickToNavigate,\"vuecal--hide-weekends\":this.hideWeekends,\"vuecal--split-days\":this.hasSplits,\"vuecal--sticky-split-labels\":this.hasSplits&&this.stickySplitLabels,\"vuecal--overflow-x\":this.minCellWidth&&this.isWeekView||this.hasSplits&&this.minSplitWidth,\"vuecal--small\":this.small,\"vuecal--xsmall\":this.xsmall,\"vuecal--resizing-event\":e._eid,\"vuecal--drag-creating-event\":n.event,\"vuecal--dragging-event\":t._eid,\"vuecal--events-on-month-view\":this.eventsOnMonthView,\"vuecal--short-events\":this.isMonthView&&this.eventsOnMonthView===\"short\",\"vuecal--has-touch\":typeof window<\"u\"&&\"ontouchstart\"in window}},isYearsOrYearView(){return[\"years\",\"year\"].includes(this.view.id)},isYearsView(){return this.view.id===\"years\"},isYearView(){return this.view.id===\"year\"},isMonthView(){return this.view.id===\"month\"},isWeekOrDayView(){return[\"week\",\"day\"].includes(this.view.id)},isWeekView(){return this.view.id===\"week\"},isDayView(){return this.view.id===\"day\"}},watch:{events:{handler(e,t){this.updateMutableEvents(e),this.addEventsToView()},deep:!0},locale(e){this.loadLocale(e)},selectedDate(e){this.updateSelectedDate(e)},activeView(e){this.switchView(e)}}},vM=Ds(gM,[[\"render\",mM]]),yM={install:(e,t)=>e.component(\"v-vue-cal\",vM)};var Lp=null;const EM={mounted(e,t){let n=function(r){t.value!==t.oldValue&&(clearTimeout(Lp),Lp=setTimeout(function(){e.dispatchEvent(new Event(\"change\"))},t.value||500))};e.addEventListener(\"input\",n)}};/*! @license DOMPurify 3.2.6 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.6/LICENSE */const{entries:CE,setPrototypeOf:kp,isFrozen:bM,getPrototypeOf:SM,getOwnPropertyDescriptor:TM}=Object;let{freeze:Tn,seal:Qn,create:OE}=Object,{apply:af,construct:lf}=typeof Reflect<\"u\"&&Reflect;Tn||(Tn=function(t){return t});Qn||(Qn=function(t){return t});af||(af=function(t,n,r){return t.apply(n,r)});lf||(lf=function(t,n){return new t(...n)});const Da=wn(Array.prototype.forEach),wM=wn(Array.prototype.lastIndexOf),Fp=wn(Array.prototype.pop),ks=wn(Array.prototype.push),DM=wn(Array.prototype.splice),za=wn(String.prototype.toLowerCase),uu=wn(String.prototype.toString),Vp=wn(String.prototype.match),Fs=wn(String.prototype.replace),CM=wn(String.prototype.indexOf),OM=wn(String.prototype.trim),ir=wn(Object.prototype.hasOwnProperty),pn=wn(RegExp.prototype.test),Vs=AM(TypeError);function wn(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);for(var n=arguments.length,r=new Array(n>1?n-1:0),i=1;i<n;i++)r[i-1]=arguments[i];return af(e,t,r)}}function AM(e){return function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return lf(e,n)}}function qe(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:za;kp&&kp(e,null);let r=t.length;for(;r--;){let i=t[r];if(typeof i==\"string\"){const s=n(i);s!==i&&(bM(t)||(t[r]=s),i=s)}e[i]=!0}return e}function _M(e){for(let t=0;t<e.length;t++)ir(e,t)||(e[t]=null);return e}function wr(e){const t=OE(null);for(const[n,r]of CE(e))ir(e,n)&&(Array.isArray(r)?t[n]=_M(r):r&&typeof r==\"object\"&&r.constructor===Object?t[n]=wr(r):t[n]=r);return t}function Bs(e,t){for(;e!==null;){const r=TM(e,t);if(r){if(r.get)return wn(r.get);if(typeof r.value==\"function\")return wn(r.value)}e=SM(e)}function n(){return null}return n}const Bp=Tn([\"a\",\"abbr\",\"acronym\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"bdi\",\"bdo\",\"big\",\"blink\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"center\",\"cite\",\"code\",\"col\",\"colgroup\",\"content\",\"data\",\"datalist\",\"dd\",\"decorator\",\"del\",\"details\",\"dfn\",\"dialog\",\"dir\",\"div\",\"dl\",\"dt\",\"element\",\"em\",\"fieldset\",\"figcaption\",\"figure\",\"font\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"img\",\"input\",\"ins\",\"kbd\",\"label\",\"legend\",\"li\",\"main\",\"map\",\"mark\",\"marquee\",\"menu\",\"menuitem\",\"meter\",\"nav\",\"nobr\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"picture\",\"pre\",\"progress\",\"q\",\"rp\",\"rt\",\"ruby\",\"s\",\"samp\",\"section\",\"select\",\"shadow\",\"small\",\"source\",\"spacer\",\"span\",\"strike\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"table\",\"tbody\",\"td\",\"template\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"tr\",\"track\",\"tt\",\"u\",\"ul\",\"var\",\"video\",\"wbr\"]),fu=Tn([\"svg\",\"a\",\"altglyph\",\"altglyphdef\",\"altglyphitem\",\"animatecolor\",\"animatemotion\",\"animatetransform\",\"circle\",\"clippath\",\"defs\",\"desc\",\"ellipse\",\"filter\",\"font\",\"g\",\"glyph\",\"glyphref\",\"hkern\",\"image\",\"line\",\"lineargradient\",\"marker\",\"mask\",\"metadata\",\"mpath\",\"path\",\"pattern\",\"polygon\",\"polyline\",\"radialgradient\",\"rect\",\"stop\",\"style\",\"switch\",\"symbol\",\"text\",\"textpath\",\"title\",\"tref\",\"tspan\",\"view\",\"vkern\"]),du=Tn([\"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\"]),MM=Tn([\"animate\",\"color-profile\",\"cursor\",\"discard\",\"font-face\",\"font-face-format\",\"font-face-name\",\"font-face-src\",\"font-face-uri\",\"foreignobject\",\"hatch\",\"hatchpath\",\"mesh\",\"meshgradient\",\"meshpatch\",\"meshrow\",\"missing-glyph\",\"script\",\"set\",\"solidcolor\",\"unknown\",\"use\"]),hu=Tn([\"math\",\"menclose\",\"merror\",\"mfenced\",\"mfrac\",\"mglyph\",\"mi\",\"mlabeledtr\",\"mmultiscripts\",\"mn\",\"mo\",\"mover\",\"mpadded\",\"mphantom\",\"mroot\",\"mrow\",\"ms\",\"mspace\",\"msqrt\",\"mstyle\",\"msub\",\"msup\",\"msubsup\",\"mtable\",\"mtd\",\"mtext\",\"mtr\",\"munder\",\"munderover\",\"mprescripts\"]),xM=Tn([\"maction\",\"maligngroup\",\"malignmark\",\"mlongdiv\",\"mscarries\",\"mscarry\",\"msgroup\",\"mstack\",\"msline\",\"msrow\",\"semantics\",\"annotation\",\"annotation-xml\",\"mprescripts\",\"none\"]),jp=Tn([\"#text\"]),Hp=Tn([\"accept\",\"action\",\"align\",\"alt\",\"autocapitalize\",\"autocomplete\",\"autopictureinpicture\",\"autoplay\",\"background\",\"bgcolor\",\"border\",\"capture\",\"cellpadding\",\"cellspacing\",\"checked\",\"cite\",\"class\",\"clear\",\"color\",\"cols\",\"colspan\",\"controls\",\"controlslist\",\"coords\",\"crossorigin\",\"datetime\",\"decoding\",\"default\",\"dir\",\"disabled\",\"disablepictureinpicture\",\"disableremoteplayback\",\"download\",\"draggable\",\"enctype\",\"enterkeyhint\",\"face\",\"for\",\"headers\",\"height\",\"hidden\",\"high\",\"href\",\"hreflang\",\"id\",\"inputmode\",\"integrity\",\"ismap\",\"kind\",\"label\",\"lang\",\"list\",\"loading\",\"loop\",\"low\",\"max\",\"maxlength\",\"media\",\"method\",\"min\",\"minlength\",\"multiple\",\"muted\",\"name\",\"nonce\",\"noshade\",\"novalidate\",\"nowrap\",\"open\",\"optimum\",\"pattern\",\"placeholder\",\"playsinline\",\"popover\",\"popovertarget\",\"popovertargetaction\",\"poster\",\"preload\",\"pubdate\",\"radiogroup\",\"readonly\",\"rel\",\"required\",\"rev\",\"reversed\",\"role\",\"rows\",\"rowspan\",\"spellcheck\",\"scope\",\"selected\",\"shape\",\"size\",\"sizes\",\"span\",\"srclang\",\"start\",\"src\",\"srcset\",\"step\",\"style\",\"summary\",\"tabindex\",\"title\",\"translate\",\"type\",\"usemap\",\"valign\",\"value\",\"width\",\"wrap\",\"xmlns\",\"slot\"]),pu=Tn([\"accent-height\",\"accumulate\",\"additive\",\"alignment-baseline\",\"amplitude\",\"ascent\",\"attributename\",\"attributetype\",\"azimuth\",\"basefrequency\",\"baseline-shift\",\"begin\",\"bias\",\"by\",\"class\",\"clip\",\"clippathunits\",\"clip-path\",\"clip-rule\",\"color\",\"color-interpolation\",\"color-interpolation-filters\",\"color-profile\",\"color-rendering\",\"cx\",\"cy\",\"d\",\"dx\",\"dy\",\"diffuseconstant\",\"direction\",\"display\",\"divisor\",\"dur\",\"edgemode\",\"elevation\",\"end\",\"exponent\",\"fill\",\"fill-opacity\",\"fill-rule\",\"filter\",\"filterunits\",\"flood-color\",\"flood-opacity\",\"font-family\",\"font-size\",\"font-size-adjust\",\"font-stretch\",\"font-style\",\"font-variant\",\"font-weight\",\"fx\",\"fy\",\"g1\",\"g2\",\"glyph-name\",\"glyphref\",\"gradientunits\",\"gradienttransform\",\"height\",\"href\",\"id\",\"image-rendering\",\"in\",\"in2\",\"intercept\",\"k\",\"k1\",\"k2\",\"k3\",\"k4\",\"kerning\",\"keypoints\",\"keysplines\",\"keytimes\",\"lang\",\"lengthadjust\",\"letter-spacing\",\"kernelmatrix\",\"kernelunitlength\",\"lighting-color\",\"local\",\"marker-end\",\"marker-mid\",\"marker-start\",\"markerheight\",\"markerunits\",\"markerwidth\",\"maskcontentunits\",\"maskunits\",\"max\",\"mask\",\"media\",\"method\",\"mode\",\"min\",\"name\",\"numoctaves\",\"offset\",\"operator\",\"opacity\",\"order\",\"orient\",\"orientation\",\"origin\",\"overflow\",\"paint-order\",\"path\",\"pathlength\",\"patterncontentunits\",\"patterntransform\",\"patternunits\",\"points\",\"preservealpha\",\"preserveaspectratio\",\"primitiveunits\",\"r\",\"rx\",\"ry\",\"radius\",\"refx\",\"refy\",\"repeatcount\",\"repeatdur\",\"restart\",\"result\",\"rotate\",\"scale\",\"seed\",\"shape-rendering\",\"slope\",\"specularconstant\",\"specularexponent\",\"spreadmethod\",\"startoffset\",\"stddeviation\",\"stitchtiles\",\"stop-color\",\"stop-opacity\",\"stroke-dasharray\",\"stroke-dashoffset\",\"stroke-linecap\",\"stroke-linejoin\",\"stroke-miterlimit\",\"stroke-opacity\",\"stroke\",\"stroke-width\",\"style\",\"surfacescale\",\"systemlanguage\",\"tabindex\",\"tablevalues\",\"targetx\",\"targety\",\"transform\",\"transform-origin\",\"text-anchor\",\"text-decoration\",\"text-rendering\",\"textlength\",\"type\",\"u1\",\"u2\",\"unicode\",\"values\",\"viewbox\",\"visibility\",\"version\",\"vert-adv-y\",\"vert-origin-x\",\"vert-origin-y\",\"width\",\"word-spacing\",\"wrap\",\"writing-mode\",\"xchannelselector\",\"ychannelselector\",\"x\",\"x1\",\"x2\",\"xmlns\",\"y\",\"y1\",\"y2\",\"z\",\"zoomandpan\"]),Up=Tn([\"accent\",\"accentunder\",\"align\",\"bevelled\",\"close\",\"columnsalign\",\"columnlines\",\"columnspan\",\"denomalign\",\"depth\",\"dir\",\"display\",\"displaystyle\",\"encoding\",\"fence\",\"frame\",\"height\",\"href\",\"id\",\"largeop\",\"length\",\"linethickness\",\"lspace\",\"lquote\",\"mathbackground\",\"mathcolor\",\"mathsize\",\"mathvariant\",\"maxsize\",\"minsize\",\"movablelimits\",\"notation\",\"numalign\",\"open\",\"rowalign\",\"rowlines\",\"rowspacing\",\"rowspan\",\"rspace\",\"rquote\",\"scriptlevel\",\"scriptminsize\",\"scriptsizemultiplier\",\"selection\",\"separator\",\"separators\",\"stretchy\",\"subscriptshift\",\"supscriptshift\",\"symmetric\",\"voffset\",\"width\",\"xmlns\"]),Ca=Tn([\"xlink:href\",\"xml:id\",\"xlink:title\",\"xml:space\",\"xmlns:xlink\"]),NM=Qn(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm),IM=Qn(/<%[\\w\\W]*|[\\w\\W]*%>/gm),RM=Qn(/\\$\\{[\\w\\W]*/gm),PM=Qn(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/),LM=Qn(/^aria-[\\-\\w]+$/),AE=Qn(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i),kM=Qn(/^(?:\\w+script|data):/i),FM=Qn(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g),_E=Qn(/^html$/i),VM=Qn(/^[a-z][.\\w]*(-[.\\w]+)+$/i);var $p=Object.freeze({__proto__:null,ARIA_ATTR:LM,ATTR_WHITESPACE:FM,CUSTOM_ELEMENT:VM,DATA_ATTR:PM,DOCTYPE_NAME:_E,ERB_EXPR:IM,IS_ALLOWED_URI:AE,IS_SCRIPT_OR_DATA:kM,MUSTACHE_EXPR:NM,TMPLIT_EXPR:RM});const js={element:1,text:3,progressingInstruction:7,comment:8,document:9},BM=function(){return typeof window>\"u\"?null:window},jM=function(t,n){if(typeof t!=\"object\"||typeof t.createPolicy!=\"function\")return null;let r=null;const i=\"data-tt-policy-suffix\";n&&n.hasAttribute(i)&&(r=n.getAttribute(i));const s=\"dompurify\"+(r?\"#\"+r:\"\");try{return t.createPolicy(s,{createHTML(o){return o},createScriptURL(o){return o}})}catch{return console.warn(\"TrustedTypes policy \"+s+\" could not be created.\"),null}},Wp=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function ME(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:BM();const t=Me=>ME(Me);if(t.version=\"3.2.6\",t.removed=[],!e||!e.document||e.document.nodeType!==js.document||!e.Element)return t.isSupported=!1,t;let{document:n}=e;const r=n,i=r.currentScript,{DocumentFragment:s,HTMLTemplateElement:o,Node:a,Element:l,NodeFilter:c,NamedNodeMap:u=e.NamedNodeMap||e.MozNamedAttrMap,HTMLFormElement:f,DOMParser:d,trustedTypes:p}=e,m=l.prototype,g=Bs(m,\"cloneNode\"),v=Bs(m,\"remove\"),w=Bs(m,\"nextSibling\"),S=Bs(m,\"childNodes\"),y=Bs(m,\"parentNode\");if(typeof o==\"function\"){const Me=n.createElement(\"template\");Me.content&&Me.content.ownerDocument&&(n=Me.content.ownerDocument)}let E,C=\"\";const{implementation:M,createNodeIterator:B,createDocumentFragment:j,getElementsByTagName:A}=n,{importNode:x}=r;let k=Wp();t.isSupported=typeof CE==\"function\"&&typeof y==\"function\"&&M&&M.createHTMLDocument!==void 0;const{MUSTACHE_EXPR:P,ERB_EXPR:V,TMPLIT_EXPR:$,DATA_ATTR:Z,ARIA_ATTR:U,IS_SCRIPT_OR_DATA:W,ATTR_WHITESPACE:ee,CUSTOM_ELEMENT:Te}=$p;let{IS_ALLOWED_URI:ze}=$p,De=null;const $e=qe({},[...Bp,...fu,...du,...hu,...jp]);let Ve=null;const Ke=qe({},[...Hp,...pu,...Up,...Ca]);let Ie=Object.seal(OE(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),re=null,me=null,xe=!0,Ne=!0,ut=!1,dt=!0,Qe=!1,_=!0,N=!1,Y=!1,Q=!1,J=!1,q=!1,se=!1,ne=!0,ie=!1;const te=\"user-content-\";let Se=!0,ce=!1,ge={},we=null;const Fe=qe({},[\"annotation-xml\",\"audio\",\"colgroup\",\"desc\",\"foreignobject\",\"head\",\"iframe\",\"math\",\"mi\",\"mn\",\"mo\",\"ms\",\"mtext\",\"noembed\",\"noframes\",\"noscript\",\"plaintext\",\"script\",\"style\",\"svg\",\"template\",\"thead\",\"title\",\"video\",\"xmp\"]);let Xe=null;const L=qe({},[\"audio\",\"video\",\"img\",\"source\",\"image\",\"track\"]);let H=null;const T=qe({},[\"alt\",\"class\",\"for\",\"id\",\"label\",\"name\",\"pattern\",\"placeholder\",\"role\",\"summary\",\"title\",\"value\",\"style\",\"xmlns\"]),O=\"http://www.w3.org/1998/Math/MathML\",F=\"http://www.w3.org/2000/svg\",G=\"http://www.w3.org/1999/xhtml\";let X=G,oe=!1,ae=null;const he=qe({},[O,F,G],uu);let ue=qe({},[\"mi\",\"mo\",\"mn\",\"ms\",\"mtext\"]),ve=qe({},[\"annotation-xml\"]);const Ee=qe({},[\"title\",\"style\",\"font\",\"a\",\"script\"]);let _e=null;const it=[\"application/xhtml+xml\",\"text/html\"],b=\"text/html\";let D=null,R=null;const K=n.createElement(\"form\"),fe=function(I){return I instanceof RegExp||I instanceof Function},pe=function(){let I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(R&&R===I)){if((!I||typeof I!=\"object\")&&(I={}),I=wr(I),_e=it.indexOf(I.PARSER_MEDIA_TYPE)===-1?b:I.PARSER_MEDIA_TYPE,D=_e===\"application/xhtml+xml\"?uu:za,De=ir(I,\"ALLOWED_TAGS\")?qe({},I.ALLOWED_TAGS,D):$e,Ve=ir(I,\"ALLOWED_ATTR\")?qe({},I.ALLOWED_ATTR,D):Ke,ae=ir(I,\"ALLOWED_NAMESPACES\")?qe({},I.ALLOWED_NAMESPACES,uu):he,H=ir(I,\"ADD_URI_SAFE_ATTR\")?qe(wr(T),I.ADD_URI_SAFE_ATTR,D):T,Xe=ir(I,\"ADD_DATA_URI_TAGS\")?qe(wr(L),I.ADD_DATA_URI_TAGS,D):L,we=ir(I,\"FORBID_CONTENTS\")?qe({},I.FORBID_CONTENTS,D):Fe,re=ir(I,\"FORBID_TAGS\")?qe({},I.FORBID_TAGS,D):wr({}),me=ir(I,\"FORBID_ATTR\")?qe({},I.FORBID_ATTR,D):wr({}),ge=ir(I,\"USE_PROFILES\")?I.USE_PROFILES:!1,xe=I.ALLOW_ARIA_ATTR!==!1,Ne=I.ALLOW_DATA_ATTR!==!1,ut=I.ALLOW_UNKNOWN_PROTOCOLS||!1,dt=I.ALLOW_SELF_CLOSE_IN_ATTR!==!1,Qe=I.SAFE_FOR_TEMPLATES||!1,_=I.SAFE_FOR_XML!==!1,N=I.WHOLE_DOCUMENT||!1,J=I.RETURN_DOM||!1,q=I.RETURN_DOM_FRAGMENT||!1,se=I.RETURN_TRUSTED_TYPE||!1,Q=I.FORCE_BODY||!1,ne=I.SANITIZE_DOM!==!1,ie=I.SANITIZE_NAMED_PROPS||!1,Se=I.KEEP_CONTENT!==!1,ce=I.IN_PLACE||!1,ze=I.ALLOWED_URI_REGEXP||AE,X=I.NAMESPACE||G,ue=I.MATHML_TEXT_INTEGRATION_POINTS||ue,ve=I.HTML_INTEGRATION_POINTS||ve,Ie=I.CUSTOM_ELEMENT_HANDLING||{},I.CUSTOM_ELEMENT_HANDLING&&fe(I.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Ie.tagNameCheck=I.CUSTOM_ELEMENT_HANDLING.tagNameCheck),I.CUSTOM_ELEMENT_HANDLING&&fe(I.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Ie.attributeNameCheck=I.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),I.CUSTOM_ELEMENT_HANDLING&&typeof I.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements==\"boolean\"&&(Ie.allowCustomizedBuiltInElements=I.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Qe&&(Ne=!1),q&&(J=!0),ge&&(De=qe({},jp),Ve=[],ge.html===!0&&(qe(De,Bp),qe(Ve,Hp)),ge.svg===!0&&(qe(De,fu),qe(Ve,pu),qe(Ve,Ca)),ge.svgFilters===!0&&(qe(De,du),qe(Ve,pu),qe(Ve,Ca)),ge.mathMl===!0&&(qe(De,hu),qe(Ve,Up),qe(Ve,Ca))),I.ADD_TAGS&&(De===$e&&(De=wr(De)),qe(De,I.ADD_TAGS,D)),I.ADD_ATTR&&(Ve===Ke&&(Ve=wr(Ve)),qe(Ve,I.ADD_ATTR,D)),I.ADD_URI_SAFE_ATTR&&qe(H,I.ADD_URI_SAFE_ATTR,D),I.FORBID_CONTENTS&&(we===Fe&&(we=wr(we)),qe(we,I.FORBID_CONTENTS,D)),Se&&(De[\"#text\"]=!0),N&&qe(De,[\"html\",\"head\",\"body\"]),De.table&&(qe(De,[\"tbody\"]),delete re.tbody),I.TRUSTED_TYPES_POLICY){if(typeof I.TRUSTED_TYPES_POLICY.createHTML!=\"function\")throw Vs('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');if(typeof I.TRUSTED_TYPES_POLICY.createScriptURL!=\"function\")throw Vs('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');E=I.TRUSTED_TYPES_POLICY,C=E.createHTML(\"\")}else E===void 0&&(E=jM(p,i)),E!==null&&typeof C==\"string\"&&(C=E.createHTML(\"\"));Tn&&Tn(I),R=I}},je=qe({},[...fu,...du,...MM]),Ce=qe({},[...hu,...xM]),Ge=function(I){let le=y(I);(!le||!le.tagName)&&(le={namespaceURI:X,tagName:\"template\"});const Oe=za(I.tagName),ht=za(le.tagName);return ae[I.namespaceURI]?I.namespaceURI===F?le.namespaceURI===G?Oe===\"svg\":le.namespaceURI===O?Oe===\"svg\"&&(ht===\"annotation-xml\"||ue[ht]):!!je[Oe]:I.namespaceURI===O?le.namespaceURI===G?Oe===\"math\":le.namespaceURI===F?Oe===\"math\"&&ve[ht]:!!Ce[Oe]:I.namespaceURI===G?le.namespaceURI===F&&!ve[ht]||le.namespaceURI===O&&!ue[ht]?!1:!Ce[Oe]&&(Ee[Oe]||!je[Oe]):!!(_e===\"application/xhtml+xml\"&&ae[I.namespaceURI]):!1},be=function(I){ks(t.removed,{element:I});try{y(I).removeChild(I)}catch{v(I)}},Re=function(I,le){try{ks(t.removed,{attribute:le.getAttributeNode(I),from:le})}catch{ks(t.removed,{attribute:null,from:le})}if(le.removeAttribute(I),I===\"is\")if(J||q)try{be(le)}catch{}else try{le.setAttribute(I,\"\")}catch{}},ft=function(I){let le=null,Oe=null;if(Q)I=\"<remove></remove>\"+I;else{const Vt=Vp(I,/^[\\r\\n\\t ]+/);Oe=Vt&&Vt[0]}_e===\"application/xhtml+xml\"&&X===G&&(I='<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>'+I+\"</body></html>\");const ht=E?E.createHTML(I):I;if(X===G)try{le=new d().parseFromString(ht,_e)}catch{}if(!le||!le.documentElement){le=M.createDocument(X,\"template\",null);try{le.documentElement.innerHTML=oe?C:ht}catch{}}const Qt=le.body||le.documentElement;return I&&Oe&&Qt.insertBefore(n.createTextNode(Oe),Qt.childNodes[0]||null),X===G?A.call(le,N?\"html\":\"body\")[0]:N?le.documentElement:Qt},Ln=function(I){return B.call(I.ownerDocument||I,I,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT|c.SHOW_PROCESSING_INSTRUCTION|c.SHOW_CDATA_SECTION,null)},Kt=function(I){return I instanceof f&&(typeof I.nodeName!=\"string\"||typeof I.textContent!=\"string\"||typeof I.removeChild!=\"function\"||!(I.attributes instanceof u)||typeof I.removeAttribute!=\"function\"||typeof I.setAttribute!=\"function\"||typeof I.namespaceURI!=\"string\"||typeof I.insertBefore!=\"function\"||typeof I.hasChildNodes!=\"function\")},Ur=function(I){return typeof a==\"function\"&&I instanceof a};function Zt(Me,I,le){Da(Me,Oe=>{Oe.call(t,I,le,R)})}const Go=function(I){let le=null;if(Zt(k.beforeSanitizeElements,I,null),Kt(I))return be(I),!0;const Oe=D(I.nodeName);if(Zt(k.uponSanitizeElement,I,{tagName:Oe,allowedTags:De}),_&&I.hasChildNodes()&&!Ur(I.firstElementChild)&&pn(/<[/\\w!]/g,I.innerHTML)&&pn(/<[/\\w!]/g,I.textContent)||I.nodeType===js.progressingInstruction||_&&I.nodeType===js.comment&&pn(/<[/\\w]/g,I.data))return be(I),!0;if(!De[Oe]||re[Oe]){if(!re[Oe]&&Xo(Oe)&&(Ie.tagNameCheck instanceof RegExp&&pn(Ie.tagNameCheck,Oe)||Ie.tagNameCheck instanceof Function&&Ie.tagNameCheck(Oe)))return!1;if(Se&&!we[Oe]){const ht=y(I)||I.parentNode,Qt=S(I)||I.childNodes;if(Qt&&ht){const Vt=Qt.length;for(let Dn=Vt-1;Dn>=0;--Dn){const yr=g(Qt[Dn],!0);yr.__removalCount=(I.__removalCount||0)+1,ht.insertBefore(yr,w(I))}}}return be(I),!0}return I instanceof l&&!Ge(I)||(Oe===\"noscript\"||Oe===\"noembed\"||Oe===\"noframes\")&&pn(/<\\/no(script|embed|frames)/i,I.innerHTML)?(be(I),!0):(Qe&&I.nodeType===js.text&&(le=I.textContent,Da([P,V,$],ht=>{le=Fs(le,ht,\" \")}),I.textContent!==le&&(ks(t.removed,{element:I.cloneNode()}),I.textContent=le)),Zt(k.afterSanitizeElements,I,null),!1)},ji=function(I,le,Oe){if(ne&&(le===\"id\"||le===\"name\")&&(Oe in n||Oe in K))return!1;if(!(Ne&&!me[le]&&pn(Z,le))){if(!(xe&&pn(U,le))){if(!Ve[le]||me[le]){if(!(Xo(I)&&(Ie.tagNameCheck instanceof RegExp&&pn(Ie.tagNameCheck,I)||Ie.tagNameCheck instanceof Function&&Ie.tagNameCheck(I))&&(Ie.attributeNameCheck instanceof RegExp&&pn(Ie.attributeNameCheck,le)||Ie.attributeNameCheck instanceof Function&&Ie.attributeNameCheck(le))||le===\"is\"&&Ie.allowCustomizedBuiltInElements&&(Ie.tagNameCheck instanceof RegExp&&pn(Ie.tagNameCheck,Oe)||Ie.tagNameCheck instanceof Function&&Ie.tagNameCheck(Oe))))return!1}else if(!H[le]){if(!pn(ze,Fs(Oe,ee,\"\"))){if(!((le===\"src\"||le===\"xlink:href\"||le===\"href\")&&I!==\"script\"&&CM(Oe,\"data:\")===0&&Xe[I])){if(!(ut&&!pn(W,Fs(Oe,ee,\"\")))){if(Oe)return!1}}}}}}return!0},Xo=function(I){return I!==\"annotation-xml\"&&Vp(I,Te)},Jo=function(I){Zt(k.beforeSanitizeAttributes,I,null);const{attributes:le}=I;if(!le||Kt(I))return;const Oe={attrName:\"\",attrValue:\"\",keepAttr:!0,allowedAttributes:Ve,forceKeepAttr:void 0};let ht=le.length;for(;ht--;){const Qt=le[ht],{name:Vt,namespaceURI:Dn,value:yr}=Qt,Cs=D(Vt),Cc=yr;let qt=Vt===\"value\"?Cc:OM(Cc);if(Oe.attrName=Cs,Oe.attrValue=qt,Oe.keepAttr=!0,Oe.forceKeepAttr=void 0,Zt(k.uponSanitizeAttribute,I,Oe),qt=Oe.attrValue,ie&&(Cs===\"id\"||Cs===\"name\")&&(Re(Vt,I),qt=te+qt),_&&pn(/((--!?|])>)|<\\/(style|title)/i,qt)){Re(Vt,I);continue}if(Oe.forceKeepAttr)continue;if(!Oe.keepAttr){Re(Vt,I);continue}if(!dt&&pn(/\\/>/i,qt)){Re(Vt,I);continue}Qe&&Da([P,V,$],Md=>{qt=Fs(qt,Md,\" \")});const _d=D(I.nodeName);if(!ji(_d,Cs,qt)){Re(Vt,I);continue}if(E&&typeof p==\"object\"&&typeof p.getAttributeType==\"function\"&&!Dn)switch(p.getAttributeType(_d,Cs)){case\"TrustedHTML\":{qt=E.createHTML(qt);break}case\"TrustedScriptURL\":{qt=E.createScriptURL(qt);break}}if(qt!==Cc)try{Dn?I.setAttributeNS(Dn,Vt,qt):I.setAttribute(Vt,qt),Kt(I)?be(I):Fp(t.removed)}catch{Re(Vt,I)}}Zt(k.afterSanitizeAttributes,I,null)},Dc=function Me(I){let le=null;const Oe=Ln(I);for(Zt(k.beforeSanitizeShadowDOM,I,null);le=Oe.nextNode();)Zt(k.uponSanitizeShadowNode,le,null),Go(le),Jo(le),le.content instanceof s&&Me(le.content);Zt(k.afterSanitizeShadowDOM,I,null)};return t.sanitize=function(Me){let I=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},le=null,Oe=null,ht=null,Qt=null;if(oe=!Me,oe&&(Me=\"<!-->\"),typeof Me!=\"string\"&&!Ur(Me))if(typeof Me.toString==\"function\"){if(Me=Me.toString(),typeof Me!=\"string\")throw Vs(\"dirty is not a string, aborting\")}else throw Vs(\"toString is not a function\");if(!t.isSupported)return Me;if(Y||pe(I),t.removed=[],typeof Me==\"string\"&&(ce=!1),ce){if(Me.nodeName){const yr=D(Me.nodeName);if(!De[yr]||re[yr])throw Vs(\"root node is forbidden and cannot be sanitized in-place\")}}else if(Me instanceof a)le=ft(\"<!---->\"),Oe=le.ownerDocument.importNode(Me,!0),Oe.nodeType===js.element&&Oe.nodeName===\"BODY\"||Oe.nodeName===\"HTML\"?le=Oe:le.appendChild(Oe);else{if(!J&&!Qe&&!N&&Me.indexOf(\"<\")===-1)return E&&se?E.createHTML(Me):Me;if(le=ft(Me),!le)return J?null:se?C:\"\"}le&&Q&&be(le.firstChild);const Vt=Ln(ce?Me:le);for(;ht=Vt.nextNode();)Go(ht),Jo(ht),ht.content instanceof s&&Dc(ht.content);if(ce)return Me;if(J){if(q)for(Qt=j.call(le.ownerDocument);le.firstChild;)Qt.appendChild(le.firstChild);else Qt=le;return(Ve.shadowroot||Ve.shadowrootmode)&&(Qt=x.call(r,Qt,!0)),Qt}let Dn=N?le.outerHTML:le.innerHTML;return N&&De[\"!doctype\"]&&le.ownerDocument&&le.ownerDocument.doctype&&le.ownerDocument.doctype.name&&pn(_E,le.ownerDocument.doctype.name)&&(Dn=\"<!DOCTYPE \"+le.ownerDocument.doctype.name+`>\n`+Dn),Qe&&Da([P,V,$],yr=>{Dn=Fs(Dn,yr,\" \")}),E&&se?E.createHTML(Dn):Dn},t.setConfig=function(){let Me=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};pe(Me),Y=!0},t.clearConfig=function(){R=null,Y=!1},t.isValidAttribute=function(Me,I,le){R||pe({});const Oe=D(Me),ht=D(I);return ji(Oe,ht,le)},t.addHook=function(Me,I){typeof I==\"function\"&&ks(k[Me],I)},t.removeHook=function(Me,I){if(I!==void 0){const le=wM(k[Me],I);return le===-1?void 0:DM(k[Me],le,1)[0]}return Fp(k[Me])},t.removeHooks=function(Me){k[Me]=[]},t.removeAllHooks=function(){k=Wp()},t}var Yp=ME();const HM={beforeMount(e,t){e.innerHTML=Yp.sanitize(t.value)},updated(e,t){e.innerHTML=Yp.sanitize(t.value)}},UM={mounted(e,t){zp(e,t)},updated(e,t){zp(e,t)}},zp=(e,t)=>{const r={...{placement:\"top\",trigger:\"hover\",html:!1,content:\"\",delay:{show:200,hide:100}},...typeof t.value==\"object\"?t.value:{content:t.value}};let i=document.getElementById(`tooltip-${e.tooltipId}`);if(i){const s=i.querySelector(\".tooltip-inner\");r.html?s.innerHTML=r.content:s.textContent=r.content}else{e.tooltipId=Math.random().toString(36).substring(2,9),i=document.createElement(\"div\"),i.id=`tooltip-${e.tooltipId}`,i.className=\"max-w-[250px] break-words rounded-lg bg-gray-800 px-4 py-3 text-sm leading-snug text-white shadow-lg transition-opacity transition-transform duration-200\",i.style.display=\"none\",i.style.position=\"absolute\",i.style.zIndex=\"10000\";const s=document.createElement(\"div\");s.className=\"tooltip-inner\";const o=document.createElement(\"div\");o.className=\"absolute h-0 w-0 border-solid\",i.appendChild(s),i.appendChild(o),document.body.appendChild(i),r.html?s.innerHTML=r.content:s.textContent=r.content,e._tooltip=i;const a=()=>{i.style.display=\"block\";const c=e.getBoundingClientRect(),u=i.getBoundingClientRect();let f,d;switch(r.placement){case\"top\":f=c.top-u.height-10,d=c.left+c.width/2-u.width/2,o.style.top=\"auto\",o.style.bottom=\"-5px\",o.style.left=\"50%\",o.style.transform=\"translateX(-50%)\";break;case\"bottom\":f=c.bottom+10,d=c.left+c.width/2-u.width/2,o.style.bottom=\"auto\",o.style.top=\"-5px\",o.style.left=\"50%\",o.style.transform=\"translateX(-50%) rotate(180deg)\";break;case\"left\":f=c.top+c.height/2-u.height/2,d=c.left-u.width-10,o.style.top=\"50%\",o.style.left=\"auto\",o.style.right=\"-5px\",o.style.transform=\"translateY(-50%) rotate(-90deg)\";break;case\"right\":f=c.top+c.height/2-u.height/2,d=c.right+10,o.style.top=\"50%\",o.style.right=\"auto\",o.style.left=\"-5px\",o.style.transform=\"translateY(-50%) rotate(90deg)\";break}f<0&&(f=0),d<0&&(d=0),d+u.width>window.innerWidth&&(d=window.innerWidth-u.width),i.style.top=`${f+window.scrollY}px`,i.style.left=`${d+window.scrollX}px`},l=()=>{i.style.display=\"none\"};r.trigger===\"hover\"?(e.addEventListener(\"mouseenter\",()=>{e._showTimeout=setTimeout(a,r.delay.show)}),e.addEventListener(\"mouseleave\",()=>{clearTimeout(e._showTimeout),e._hideTimeout=setTimeout(l,r.delay.hide)})):r.trigger===\"click\"&&(e.addEventListener(\"click\",a),document.addEventListener(\"click\",c=>{c.target!==e&&!e.contains(c.target)&&l()}))}};window.app=ll({data(){return{isMenuActive:!1,hoveringMenu:\"\"}},created(){window.addEventListener(\"click\",this.handleFocusOut)},beforeDestroy(){window.removeEventListener(\"click\",this.handleFocusOut)},methods:{onSubmit(){},onInvalidSubmit({values:e,errors:t,results:n}){setTimeout(()=>{const r=Object.entries(t).map(([s,o])=>({key:s,value:o})).filter(s=>s.value.length);document.querySelector('[name=\"'+r[0].key+'\"]').scrollIntoView({behavior:\"smooth\",block:\"center\"})},100)},handleMouseOver(e){if(this.isMenuActive)return;const t=e.currentTarget.parentElement;t.classList.contains(\"sidebar-collapsed\")&&(t.classList.remove(\"sidebar-collapsed\"),t.classList.add(\"sidebar-not-collapsed\"))},handleMouseLeave(e){if(this.isMenuActive)return;const t=e.currentTarget.parentElement;t.classList.contains(\"sidebar-not-collapsed\")&&(t.classList.remove(\"sidebar-not-collapsed\"),t.classList.add(\"sidebar-collapsed\"))},handleFocusOut(e){const t=this.$refs.sidebar;if(t&&!t.contains(e.target)){this.isMenuActive=!1;const n=t.parentElement;n.classList.contains(\"sidebar-not-collapsed\")&&(n.classList.remove(\"sidebar-not-collapsed\"),n.classList.add(\"sidebar-collapsed\"))}}}});[ND,lO,uO,d1,Q1,TO,f1,yM].forEach(e=>app.use(e));app.directive(\"debounce\",EM);app.directive(\"safe-html\",HM);app.directive(\"tooltip\",UM);app;\n"
  },
  {
    "path": "public/admin/build/assets/app-C2Wq9G4i.css",
    "content": ".flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,.08);box-shadow:1px 0 #e6e6e6,-1px 0 #e6e6e6,0 1px #e6e6e6,0 -1px #e6e6e6,0 3px 13px #00000014}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1);animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none!important;box-shadow:none!important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:\"\";height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:#000000e6;fill:#000000e6;height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:#000000e6;fill:#000000e6}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{left:0}.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{right:0}.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:#0000001a}.numInputWrapper span:active{background:#0003}.numInputWrapper span:after{display:block;content:\"\";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:#00000080}.numInputWrapper:hover{background:#0000000d}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0px,0px,0px);transform:translateZ(0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:#0000000d}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch�;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:#000000e6}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:#000000e6}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:#00000080;background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:#0000000d}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:#0000008a;line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0px,0px,0px);transform:translateZ(0);opacity:1}.dayContainer+.dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:#3939394d;background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:#3939391a}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 #569ff7,5px 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:#3939394d;background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:\"\";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:700}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:700;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}}@keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}}.vuecal__weekdays-headings{border-bottom:1px solid #ddd;margin-bottom:-1px}.vuecal--week-numbers .vuecal__weekdays-headings,.vuecal--view-with-time .vuecal__weekdays-headings{padding-left:3em}.vuecal--view-with-time.vuecal--twelve-hour .vuecal__weekdays-headings{font-size:.9em;padding-left:4em}.vuecal--overflow-x.vuecal--view-with-time .vuecal__weekdays-headings{padding-left:0}.vuecal__heading{width:100%;height:2.8em;font-weight:400;justify-content:center;text-align:center;align-items:center;position:relative;overflow:hidden}.vuecal__heading>.vuecal__flex{width:100%;height:100%;align-items:initial!important}.vuecal--sticky-split-labels .vuecal__heading{height:3.4em}.vuecal--month-view .vuecal__heading,.vuecal--week-view .vuecal__heading,.vuecal--day-view .vuecal__heading{width:14.2857%}.vuecal--hide-weekends.vuecal--month-view .vuecal__heading,.vuecal--hide-weekends.vuecal--week-view .vuecal__heading,.vuecal--hide-weekends.vuecal--day-view .vuecal__heading,.vuecal--years-view .vuecal__heading{width:20%}.vuecal--year-view .vuecal__heading{width:33.33%}.vuecal__heading .weekday-label{flex-shrink:0;display:flex;justify-content:center;align-items:center}.vuecal--small .vuecal__heading .small,.vuecal--xsmall .vuecal__heading .xsmall{display:block}.vuecal__heading .small,.vuecal__heading .xsmall,.vuecal--small .vuecal__heading .full,.vuecal--small .vuecal__heading .xsmall,.vuecal--xsmall .vuecal__heading .full,.vuecal--xsmall .vuecal__heading .small{display:none}.vuecal .vuecal__split-days-headers{align-items:center}@media screen and (max-width: 550px){.vuecal__heading{line-height:1.2}.vuecal__heading .small,.vuecal--small .vuecal__heading .small,.vuecal--xsmall .vuecal__heading .xsmall{display:block}.vuecal__heading .full,.vuecal__heading .xsmall,.vuecal--small .vuecal__heading .full,.vuecal--small .vuecal__heading .xsmall,.vuecal--xsmall .vuecal__heading .full,.vuecal--xsmall .vuecal__heading .small{display:none}.vuecal--overflow-x .vuecal__heading .full,.vuecal--small.vuecal--overflow-x .vuecal__heading .small,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .xsmall{display:block}.vuecal--overflow-x .vuecal__heading .small,.vuecal--overflow-x .vuecal__heading .xsmall,.vuecal--small.vuecal--overflow-x .vuecal__heading .full,.vuecal--small.vuecal--overflow-x .vuecal__heading .xsmall,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .full,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .small{display:none}}@media screen and (max-width: 450px){.vuecal__heading .xsmall,.vuecal--small .vuecal__heading .xsmall,.vuecal--xsmall .vuecal__heading .xsmall{display:block}.vuecal__heading .full,.vuecal__heading .small,.vuecal--small .vuecal__heading .full,.vuecal--small .vuecal__heading .small,.vuecal--xsmall .vuecal__heading .full,.vuecal--xsmall .vuecal__heading .small{display:none}.vuecal--small.vuecal--overflow-x .vuecal__heading .small,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .xsmall{display:block}.vuecal--small.vuecal--overflow-x .vuecal__heading .full,.vuecal--small.vuecal--overflow-x .vuecal__heading .xsmall,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .full,.vuecal--xsmall.vuecal--overflow-x .vuecal__heading .small{display:none}}.vuecal__header button{outline:none;font-family:inherit}.vuecal__menu{padding:0;margin:0;list-style-type:none;justify-content:center;background-color:#00000005}.vuecal__view-btn{background:none;border:none;padding:.3em 1em;height:2.2em;font-size:1.3em;border-bottom:0 solid currentColor;cursor:pointer;color:inherit;box-sizing:border-box;transition:.2s}.vuecal__view-btn--active{border-bottom-width:2px;background:#ffffff26}.vuecal__title-bar{background-color:#0000001a;display:flex;align-items:center;text-align:center;justify-content:space-between;font-size:1.4em;line-height:1.3;min-height:2em}.vuecal--xsmall .vuecal__title-bar{font-size:1.3em}.vuecal__title{position:relative;justify-content:center}.vuecal__title button{cursor:pointer;background:none;border:none}.vuecal__title button.slide-fade--left-leave-active,.vuecal__title button.slide-fade--right-leave-active{width:100%}.vuecal__today-btn{position:relative;align-items:center;display:flex;font-size:.8em;background:none;border:none}.vuecal__today-btn span.default{font-size:.8em;padding:3px 6px;text-transform:uppercase;cursor:pointer}.vuecal__arrow{cursor:pointer;position:relative;z-index:1;background:none;border:none;white-space:nowrap}.vuecal__arrow--prev{margin-left:.6em}.vuecal__arrow--next{margin-right:.6em}.vuecal__arrow i.angle{display:inline-block;border:solid currentColor;border-width:0 2px 2px 0;padding:.25em;transform:rotate(-45deg)}.vuecal__arrow--prev i.angle{border-width:2px 0 0 2px}.vuecal__arrow--highlighted,.vuecal__today-btn--highlighted,.vuecal__view-btn--highlighted{position:relative;background-color:#0000000a}.vuecal__arrow--highlighted *,.vuecal__today-btn--highlighted *,.vuecal__view-btn--highlighted *{pointer-events:none}.vuecal__arrow--highlighted:before,.vuecal__arrow--highlighted:after,.vuecal__today-btn--highlighted:before,.vuecal__today-btn--highlighted:after,.vuecal__view-btn--highlighted:before,.vuecal__view-btn--highlighted:after{content:\"\";background-color:inherit;animation:sonar .8s infinite ease-out;position:absolute;top:50%;left:50%;pointer-events:none}.vuecal__arrow--highlighted:before,.vuecal__today-btn--highlighted:before,.vuecal__view-btn--highlighted:before{width:3em;height:3em;border-radius:3em;margin-top:-1.5em;margin-left:-1.5em}.vuecal__arrow--highlighted:after,.vuecal__today-btn--highlighted:after,.vuecal__view-btn--highlighted:after{animation-duration:1.5s;animation-delay:.1s;width:2.6em;height:2.6em;border-radius:2.6em;margin-top:-1.3em;margin-left:-1.3em}@keyframes sonar{0%,20%{opacity:1}to{transform:scale(2.5);opacity:0}}@media screen and (max-width: 450px){.vuecal__title{font-size:.9em}.vuecal__view-btn{padding-left:.6em;padding-right:.6em}}@media screen and (max-width: 350px){.vuecal__view-btn{font-size:1.1em}}.vuecal__event{color:#666;background-color:#f8f8f8cc;position:relative;box-sizing:border-box;left:0;width:100%;z-index:1;transition:box-shadow .3s,left .3s,width .3s;overflow:hidden}.vuecal--no-time .vuecal__event{min-height:8px}.vuecal:not(.vuecal--dragging-event) .vuecal__event:hover{z-index:2}.vuecal__cell .vuecal__event *{-webkit-user-select:text;-moz-user-select:text;user-select:text}.vuecal--view-with-time .vuecal__event:not(.vuecal__event--all-day){position:absolute}.vuecal--view-with-time .vuecal__bg .vuecal__event--all-day{position:absolute;top:0;bottom:0;z-index:0;opacity:.6;width:auto;right:0}.vuecal--view-with-time .vuecal__all-day .vuecal__event--all-day{position:relative;left:0}.vuecal__event--background{z-index:0}.vuecal__event--focus,.vuecal__event:focus{box-shadow:1px 1px 6px #0003;z-index:3;outline:none}.vuecal__event.vuecal__event--dragging{opacity:.7}.vuecal__event.vuecal__event--static{opacity:0;transition:opacity .1s}@-moz-document url-prefix(){.vuecal__event.vuecal__event--dragging{opacity:1}}.vuecal__event-resize-handle{position:absolute;bottom:0;left:0;right:0;height:1em;background-color:#ffffff4d;opacity:0;transform:translateY(110%);transition:.3s;cursor:ns-resize}.vuecal__event:hover .vuecal__event-resize-handle,.vuecal__event:focus .vuecal__event-resize-handle,.vuecal__event--focus .vuecal__event-resize-handle,.vuecal__event--resizing .vuecal__event-resize-handle{opacity:1;transform:translateY(0)}.vuecal__event--dragging .vuecal__event-resize-handle{display:none}.vuecal__event-delete{position:absolute;top:0;left:0;right:0;display:flex;flex-direction:column;align-items:center;justify-content:center;height:1.4em;line-height:1.4em;background-color:#dd3333d9;color:#fff;z-index:0;cursor:pointer;transform:translateY(-110%);transition:.3s}.vuecal__event .vuecal__event-delete{-webkit-user-select:none;-moz-user-select:none;user-select:none}.vuecal--full-height-delete .vuecal__event-delete{height:auto;bottom:0}.vuecal--full-height-delete .vuecal__event-delete:before{content:\"\";width:1.7em;height:1.8em;display:block;background-image:url('data:image/svg+xml;utf8,<svg width=\"512\" height=\"512\" viewBox=\"0 0 512 512\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12 1.5a10.5 10.5 0 100 21 10.5 10.5 0 000-21zm5 14.1c.2 0 .2.2.2.2l-.1.3-1 1-.3.1h-.2L12 13.5l-3.5 3.6h-.3-.3l-1-1v-.4-.2l3.6-3.6-3.6-3.5A.4.4 0 017 8l1-1 .3-.2c.1 0 .2 0 .2.2l3.6 3.5L15.6 7l.2-.2c.1 0 .2 0 .3.2l1 1v.5L13.5 12z\" fill=\"%23fff\" opacity=\".9\"/></svg>')}.vuecal__event--deletable .vuecal__event-delete{transform:translateY(0);z-index:1}.vuecal__event--deletable.vuecal__event--dragging .vuecal__event-delete{opacity:0;transition:none}.vuecal--month-view .vuecal__event-title{font-size:.85em}.vuecal--short-events .vuecal__event-title{text-align:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding:0 3px}.vuecal__event-title,.vuecal__event-content{-webkit-hyphens:auto;hyphens:auto}.vuecal__event-title--edit{border-bottom:1px solid transparent;text-align:center;transition:.3s;color:inherit;background-image:url('data:image/svg+xml;utf8,<svg viewBox=\"0 0 512 512\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M442 150l-39 39-80-80 39-39q6-6 15-6t15 6l50 50q6 6 6 15t-6 15zM64 368l236-236 80 80-236 236H64v-80z\" fill=\"%23000\" opacity=\".4\"/></svg>');background-repeat:no-repeat;background-position:120% .15em;background-size:.4em;outline:none;width:100%}.vuecal__event-title--edit:hover,.vuecal__event-title--edit:focus{border-color:#0006;background-position:99% .15em;background-size:1.2em}.vuecal__cell{position:relative;width:100%;display:flex;justify-content:center;align-items:center;text-align:center;transition:.15s ease-in-out background-color}.vuecal__cells.month-view .vuecal__cell,.vuecal__cells.week-view .vuecal__cell{width:14.2857%}.vuecal--hide-weekends .vuecal__cells.month-view .vuecal__cell,.vuecal--hide-weekends .vuecal__cells.week-view .vuecal__cell,.vuecal__cells.years-view .vuecal__cell{width:20%}.vuecal__cells.year-view .vuecal__cell{width:33.33%}.vuecal__cells.day-view .vuecal__cell{flex:1}.vuecal--overflow-x.vuecal--day-view .vuecal__cell{width:auto}.vuecal--click-to-navigate .vuecal__cell:not(.vuecal__cell--disabled){cursor:pointer}.vuecal--view-with-time .vuecal__cell,.vuecal--week-view.vuecal--no-time .vuecal__cell:not(.vuecal__cell--has-splits),.vuecal--day-view.vuecal--no-time .vuecal__cell:not(.vuecal__cell--has-splits){display:block}.vuecal__cell.vuecal__cell--has-splits{flex-direction:row;display:flex}.vuecal__cell:before{content:\"\";position:absolute;z-index:0;top:0;left:0;right:-1px;bottom:-1px;border:1px solid rgba(196,196,196,.25)}.vuecal--overflow-x.vuecal--day-view .vuecal__cell:before{bottom:0}.vuecal__cell--today,.vuecal__cell--current{background-color:#f0f0ff66;z-index:1}.vuecal__cell--selected{background-color:#ebfff566;z-index:2}.vuecal--day-view .vuecal__cell--selected{background:none}.vuecal__cell--out-of-scope{color:#00000040}.vuecal__cell--disabled{color:#00000040;cursor:not-allowed}.vuecal__cell--highlighted:not(.vuecal__cell--has-splits),.vuecal__cell-split.vuecal__cell-split--highlighted{background-color:#0000000a;transition-duration:5ms}.vuecal__cell-content{position:relative;width:100%;height:100%;outline:none}.vuecal--years-view .vuecal__cell-content,.vuecal--year-view .vuecal__cell-content,.vuecal--month-view .vuecal__cell-content{justify-content:center}.vuecal__cell .cell-time-labels{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;flex-direction:column}.vuecal__cell .cell-time-label{flex-grow:1;font-size:.8em;opacity:.3;line-height:1.7}.vuecal__cell-split{display:flex;flex-grow:1;flex-direction:column;height:100%;position:relative;transition:.15s ease-in-out background-color}.vuecal__cell-events{width:100%}.vuecal__cell-events-count{position:absolute;left:50%;top:65%;transform:translate(-50%);min-width:12px;height:12px;line-height:12px;padding:0 3px;background:#999;color:#fff;border-radius:12px;font-size:10px;box-sizing:border-box}.vuecal__cell .vuecal__special-hours{position:absolute;left:0;right:0;box-sizing:border-box}.vuecal--overflow-x.vuecal--week-view .vuecal__cell,.vuecal__cell-split{overflow:hidden}.vuecal__no-event{padding-top:1em;color:#aaa;justify-self:flex-start;margin-bottom:auto}.vuecal__all-day .vuecal__no-event{display:none}.vuecal__now-line{position:absolute;left:0;width:100%;height:0;color:red;border-top:1px solid currentColor;opacity:.6;z-index:1}.vuecal__now-line:before{content:\"\";position:absolute;top:-6px;left:0;border:5px solid transparent;border-left-color:currentColor}.vuecal{height:100%;box-shadow:0 0 0 1px inset #00000014}.vuecal *{-webkit-user-select:none;-moz-user-select:none;user-select:none}.vuecal--has-touch *:not(.vuecal__event-title--edit){-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.vuecal .clickable{cursor:pointer}.vuecal--resizing-event,.vuecal--drag-creating-event{cursor:ns-resize}.vuecal--dragging-event{cursor:move;cursor:grabbing}.vuecal .dragging-helper{position:absolute;width:60px;height:40px;background:#8abee6cc;border:1px solid #61a9e0;z-index:10}.vuecal--xsmall{font-size:.9em}.vuecal__flex{display:flex;flex-direction:row}.vuecal__flex[column]{flex-direction:column;flex:1 1 auto}.vuecal__flex[grow]{flex:1 1 auto;width:100%}.vuecal__flex[wrap]{flex-wrap:wrap}.vuecal__split-days-headers.slide-fade--right-leave-active{display:none}.vuecal--week-numbers.vuecal--month-view .vuecal__split-days-headers{margin-left:3em}.vuecal--day-view:not(.vuecal--overflow-x) .vuecal__split-days-headers{margin-left:3em;height:2.2em}.vuecal--day-view.vuecal--twelve-hour:not(.vuecal--overflow-x) .vuecal__split-days-headers{margin-left:4em}.vuecal__split-days-headers .day-split-header{display:flex;flex-grow:1;flex-basis:0;justify-content:center;align-items:center;height:100%}.vuecal__split-days-headers .vuecal--day-view.vuecal--overflow-x.vuecal--sticky-split-labels .day-split-header{height:1.5em}.vuecal__body{position:relative;overflow:hidden}.vuecal__all-day{min-height:1.7em;margin-bottom:-1px;flex-shrink:0}.vuecal__all-day-text{width:3em;box-sizing:border-box;color:#999;padding-right:2px;display:flex;flex-shrink:0;align-items:center;justify-content:flex-end;border-bottom:1px solid #ddd;-webkit-hyphens:auto;hyphens:auto}.vuecal__all-day-text span{font-size:.85em;text-align:right;line-height:1.1}.vuecal--twelve-hour .vuecal__all-day>span{width:4em}.vuecal__bg{overflow:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;min-height:60px;position:relative;width:100%}.vuecal--no-time .vuecal__bg{display:flex;flex:1 1 auto;overflow:auto}.vuecal__week-numbers{width:3em;flex-shrink:0!important}.vuecal__week-numbers .vuecal__week-number-cell{opacity:.4;font-size:.9em;align-items:center;justify-items:center;justify-content:center}.vuecal__scrollbar-check{position:absolute;top:0;left:0;right:0;bottom:0;overflow:scroll;visibility:hidden;z-index:-1}.vuecal__scrollbar-check div{height:120%}.vuecal__time-column{width:3em;height:100%;flex-shrink:0}.vuecal--twelve-hour .vuecal__time-column{width:4em;font-size:.9em}.vuecal--overflow-x.vuecal--week-view .vuecal__time-column{margin-top:2.8em;box-shadow:0 1px 1px #0000004d}.vuecal--overflow-x.vuecal--week-view.vuecal--sticky-split-labels .vuecal__time-column{margin-top:3.4em}.vuecal--overflow-x.vuecal--day-view.vuecal--sticky-split-labels .vuecal__time-column{margin-top:1.5em}.vuecal__time-column .vuecal__time-cell{color:#999;text-align:right;padding-right:2px;font-size:.9em}.vuecal__time-column .vuecal__time-cell-line:before{content:\"\";position:absolute;left:0;right:0;border-top:1px solid rgba(196,196,196,.3)}.vuecal__cells{margin:0 1px 1px 0}.vuecal--overflow-x.vuecal--day-view .vuecal__cells{margin:0}.vuecal--events-on-month-view.vuecal--short-events .vuecal__cells{width:99.9%}.vuecal--overflow-x.vuecal--day-view .vuecal__cells,.vuecal--overflow-x.vuecal--week-view .vuecal__cells{flex-wrap:nowrap;overflow:auto}.slide-fade--left-enter-active,.slide-fade--left-leave-active,.slide-fade--right-enter-active,.slide-fade--right-leave-active{transition:.25s ease-out}.slide-fade--left-enter-from,.slide-fade--right-leave-to{transform:translate(-15px);opacity:0}.slide-fade--left-leave-to,.slide-fade--right-enter-from{transform:translate(15px);opacity:0}.slide-fade--left-leave-active,.slide-fade--right-leave-active{position:absolute!important;height:100%}.vuecal__title-bar .slide-fade--left-leave-active,.vuecal__title-bar .slide-fade--right-leave-active{left:0;right:0;height:auto}.vuecal__heading .slide-fade--left-leave-active,.vuecal__heading .slide-fade--right-leave-active{display:flex;align-items:center}.vuecal--green-theme .vuecal__menu,.vuecal--green-theme .vuecal__cell-events-count{background-color:#42b983;color:#fff}.vuecal--green-theme .vuecal__title-bar{background-color:#e4f5ef}.vuecal--green-theme .vuecal__cell--today,.vuecal--green-theme .vuecal__cell--current{background-color:#f0f0ff66}.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell--selected{background-color:#ebfff566}.vuecal--green-theme .vuecal__cell--selected:before{border-color:#42b98380}.vuecal--green-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),.vuecal--green-theme .vuecal__cell-split--highlighted{background-color:#c3ffe180}.vuecal--green-theme .vuecal__arrow--highlighted,.vuecal--green-theme .vuecal__today-btn--highlighted,.vuecal--green-theme .vuecal__view-btn--highlighted{background-color:#88ecbf40}.vuecal--blue-theme .vuecal__menu,.vuecal--blue-theme .vuecal__cell-events-count{background-color:#42a3b9cc;color:#fff}.vuecal--blue-theme .vuecal__title-bar{background-color:#00a5bc4d}.vuecal--blue-theme .vuecal__cell--today,.vuecal--blue-theme .vuecal__cell--current{background-color:#f0f0ff66}.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell--selected{background-color:#ebfdff66}.vuecal--blue-theme .vuecal__cell--selected:before{border-color:#73bfcc80}.vuecal--blue-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),.vuecal--blue-theme .vuecal__cell-split--highlighted{background-color:#00a5bc0f}.vuecal--blue-theme .vuecal__arrow--highlighted,.vuecal--blue-theme .vuecal__today-btn--highlighted,.vuecal--blue-theme .vuecal__view-btn--highlighted{background-color:#42a3b933}.vuecal--rounded-theme .vuecal__weekdays-headings{border:none}.vuecal--rounded-theme .vuecal__cell,.vuecal--rounded-theme .vuecal__cell:before{background:none;border:none}.vuecal--rounded-theme .vuecal__cell--out-of-scope{opacity:.4}.vuecal--rounded-theme .vuecal__cell-content{width:30px;height:30px;flex-grow:0;border:1px solid transparent;border-radius:30px;color:#333}.vuecal--rounded-theme.vuecal--day-view .vuecal__cell-content{width:auto;background:none}.vuecal--rounded-theme.vuecal--year-view .vuecal__cell{width:33.33%}.vuecal--rounded-theme.vuecal--year-view .vuecal__cell-content{width:85px}.vuecal--rounded-theme.vuecal--years-view .vuecal__cell-content{width:52px}.vuecal--rounded-theme .vuecal__cell{background-color:transparent!important}.vuecal--rounded-theme.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell-content{background-color:#f1faf7}.vuecal--rounded-theme.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell--today .vuecal__cell-content{background-color:#42b983;color:#fff}.vuecal--rounded-theme.vuecal--green-theme .vuecal--day-view .vuecal__cell--today:before{background-color:#42b9830d}.vuecal--rounded-theme.vuecal--green-theme:not(.vuecal--day-view) .vuecal__cell--selected .vuecal__cell-content{border-color:#42b983}.vuecal--rounded-theme.vuecal--green-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),.vuecal--rounded-theme.vuecal--green-theme .vuecal__cell-split--highlighted{background-color:#c3ffe180}.vuecal--rounded-theme.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell-content{background-color:#64b6ff33}.vuecal--rounded-theme.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell--today .vuecal__cell-content{background-color:#8fb7e4;color:#fff}.vuecal--rounded-theme.vuecal--blue-theme .vuecal--day-view .vuecal__cell--today:before{background-color:#8fb7e41a}.vuecal--rounded-theme.vuecal--blue-theme:not(.vuecal--day-view) .vuecal__cell--selected .vuecal__cell-content{border-color:#61a9e0}.vuecal--rounded-theme.vuecal--blue-theme .vuecal__cell--highlighted:not(.vuecal__cell--has-splits),.vuecal--rounded-theme.vuecal--blue-theme .vuecal__cell-split--highlighted{background-color:#00a5bc0f}.vuecal--date-picker .vuecal__title-bar{font-size:1.2em}.vuecal--date-picker .vuecal__heading{height:2.2em;font-weight:500;opacity:.4}.vuecal--date-picker .vuecal__weekdays-headings{border:none}.vuecal--date-picker .vuecal__body{margin-left:1px}.vuecal--date-picker .vuecal__cell,.vuecal--date-picker .vuecal__cell:before{background:none;border:none}.vuecal--date-picker .vuecal__cell-content{height:26px;flex-grow:0;border:1px solid transparent;border-radius:25px;transition:background-color .2s cubic-bezier(.39,.58,.57,1)}.vuecal--date-picker.vuecal--years-view .vuecal__cell-content{flex:0;padding:0 4px;height:24px}.vuecal--date-picker.vuecal--year-view .vuecal__cell-content{flex:0;padding:0 15px}.vuecal--date-picker.vuecal--month-view .vuecal__cell-content{width:26px}.vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell-content:hover{background-color:#0000001a}.vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell--selected .vuecal__cell-content{background-color:#42b982;color:#fff}.vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell--current .vuecal__cell-content,.vuecal--date-picker:not(.vuecal--day-view) .vuecal__cell--today .vuecal__cell-content{border-color:#42b982}\n"
  },
  {
    "path": "public/admin/build/assets/app-xcMAMgaV.css",
    "content": "*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: \"\"}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%;margin-right:auto;margin-left:auto;padding-right:16px;padding-left:16px}@media (min-width: 1920px){.container{max-width:1920px}}.icon-image:before{content:\"\"}.icon-bookmark:before{content:\"\"}.icon-bookmark-active:before{content:\"\"}.icon-error:before{content:\"\"}.icon-info:before{content:\"\"}.icon-success:before{content:\"\"}.icon-warning:before{content:\"\"}.icon-stats-down:before{content:\"\"}.icon-stats-up:before{content:\"\"}.icon-attribute:before{content:\"\"}.icon-download:before{content:\"\"}.icon-settings-warehouse:before{content:\"\"}.icon-move:before{content:\"\"}.icon-organization:before{content:\"\"}.icon-role:before{content:\"\"}.icon-user:before{content:\"\"}.icon-system-generate:before{content:\"\"}.icon-settings-attributes:before{content:\"\"}.icon-settings-flow:before{content:\"\"}.icon-settings-group:before{content:\"\"}.icon-settings-mail:before{content:\"\"}.icon-settings-pipeline:before{content:\"\"}.icon-settings-roles:before{content:\"\"}.icon-settings-sources:before{content:\"\"}.icon-settings-tag:before{content:\"\"}.icon-settings-type:before{content:\"\"}.icon-settings-user:before{content:\"\"}.icon-settings-webforms:before{content:\"\"}.icon-settings-webhooks:before{content:\"\"}.icon-attached-file:before{content:\"\"}.icon-forward:before{content:\"\"}.icon-location:before{content:\"\"}.icon-pin:before{content:\"\"}.icon-print:before{content:\"\"}.icon-reply-all:before{content:\"\"}.icon-reply:before{content:\"\"}.icon-rotten:before{content:\"\"}.icon-tag:before{content:\"\"}.icon-list:before{content:\"\"}.icon-enter:before{content:\"\"}.icon-kanban:before{content:\"\"}.icon-tick:before{content:\"\"}.icon-eye-hide:before{content:\"\"}.icon-percentage:before{content:\"\"}.icon-dollar:before{content:\"\"}.icon-radio-selected:before{content:\"\"}.icon-radio-normal:before{content:\"\"}.icon-folder:before{content:\"\"}.icon-file:before{content:\"\"}.icon-eye:before{content:\"\"}.icon-notification:before{content:\"\"}.icon-configuration:before{content:\"\"}.icon-note:before{content:\"\"}.icon-edit:before{content:\"\"}.icon-menu:before{content:\"\"}.icon-calendar:before{content:\"\"}.icon-delete:before{content:\"\"}.icon-more:before{content:\"\"}.icon-checkbox-multiple:before{content:\"\"}.icon-checkbox-select:before{content:\"\"}.icon-checkbox-outline:before{content:\"\"}.icon-message:before{content:\"\"}.icon-video:before{content:\"\"}.icon-attachment:before{content:\"\"}.icon-sent:before{content:\"\"}.icon-call:before{content:\"\"}.icon-meeting:before{content:\"\"}.icon-light:before{content:\"\"}.icon-dark:before{content:\"\"}.icon-mail:before{content:\"\"}.icon-leads:before{content:\"\"}.icon-filter:before{content:\"\"}.icon-setting:before{content:\"\"}.icon-product:before{content:\"\"}.icon-contact:before{content:\"\"}.icon-activity:before{content:\"\"}.icon-perosnal:before{content:\"\"}.icon-quote:before{content:\"\"}.icon-dashboard:before{content:\"\"}.icon-cross-large:before{content:\"\"}.icon-left-arrow:before{content:\"\"}.icon-right-arrow:before{content:\"\"}.icon-up-arrow:before{content:\"\"}.icon-down-arrow:before{content:\"\"}.icon-search:before{content:\"\"}.icon-add:before{content:\"\"}.icon-add-2:before{content:\"\"}.label-active{max-width:-moz-max-content;max-width:max-content;border-radius:.375rem;--tw-bg-opacity: 1;background-color:rgb(167 243 208 / var(--tw-bg-opacity, 1));padding:.375rem .75rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(6 78 59 / var(--tw-text-opacity, 1))}.label-inactive{max-width:-moz-max-content;max-width:max-content;border-radius:.375rem;--tw-bg-opacity: 1;background-color:rgb(254 202 202 / var(--tw-bg-opacity, 1));padding:.375rem .75rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}[dir=ltr] .sidebar-rounded:after{pointer-events:none;position:absolute;top:0;right:-30px;height:30px;width:30px;background-image:url(corner-clip-CRLTKrCT.svg);background-repeat:no-repeat;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;--tw-content: \"\";content:var(--tw-content)}[dir=rtl] .sidebar-rounded:before{pointer-events:none;position:absolute;top:0;left:-30px;height:30px;width:30px;--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));background-image:url(corner-clip-CRLTKrCT.svg);background-repeat:no-repeat;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;--tw-content: \"\";content:var(--tw-content)}.dark .sidebar-rounded:after{background-image:url(dark-corner-clip-Deux0RQO.svg)}.dark .sidebar-rounded:before{background-image:url(dark-corner-clip-Deux0RQO.svg)}.stage:after{content:\"\";position:absolute;top:50%;right:-10px;width:24px;height:24px;z-index:1;border-radius:0 0 0 25px;transform:translateY(-50%) rotate(45deg);border-right:4px solid #f3f4f6;border-top:4px solid #f3f4f6}.dark .stage:after{content:\"\";position:absolute;top:50%;right:-10px;width:24px;height:24px;z-index:1;border-radius:0 0 0 25px;transform:translateY(-50%) rotate(45deg);border-right:4px solid #030712;border-top:4px solid #030712}[dir=rtl] .stage:before{content:\"\";position:absolute;top:50%;left:-10px;width:24px;height:24px;z-index:1;border-radius:0 0 0 25px;transform:translateY(-50%) rotate(225deg);border-right:4px solid #f3f4f6;border-top:4px solid #f3f4f6}[dir=rtl] .stage:after{display:none}.dark\\:bg-gray-400:is(.dark *){--tw-bg-opacity: 1 !important;background-color:#1f2937!important;border:#111827 solid!important;color:#e5e7eb!important}.dark\\:bg-gray-800:is(.dark *){--tw-bg-opacity: 1;background-color:#101827}.shimmer{animation-duration:2.2s;animation-fill-mode:forwards;animation-iteration-count:infinite;animation-name:skeleton;animation-timing-function:linear;background:linear-gradient(to right,#f6f6f6 8%,#f0f0f0 18%,#f6f6f6 33%);background-size:1250px 100%}.light-shimmer-bg{background:linear-gradient(to right,#fafafa 8%,#f5f5f5 18%,#fafafa 33%);background-size:1250px 100%}.dark .shimmer{background:linear-gradient(to right,#1f2937 8%,#1a2232 18%,#1f2937 33%)}.primary-button{display:flex;cursor:pointer;place-content:center;align-items:center;-moz-column-gap:.25rem;column-gap:.25rem;border-radius:.375rem;border-width:1px;border-color:var(--brand-color);background-color:var(--brand-color);padding:.375rem .75rem;font-weight:600;--tw-text-opacity: 1;color:rgb(249 250 251 / var(--tw-text-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.primary-button:hover{opacity:.9}.primary-button:focus{opacity:.9}.secondary-button{display:flex;cursor:pointer;place-content:center;align-items:center;-moz-column-gap:.25rem;column-gap:.25rem;white-space:nowrap;border-radius:.375rem;border-width:2px;border-color:var(--brand-color);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.375rem .75rem;font-weight:600;color:var(--brand-color);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.secondary-button:hover{background-color:#eff6ff61}.secondary-button:focus{background-color:#eff6ff61}.secondary-button:is(.dark *){--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.secondary-button:hover:is(.dark *){opacity:.8}.transparent-button{display:flex;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;place-content:center;align-items:center;-moz-column-gap:.25rem;column-gap:.25rem;white-space:nowrap;border-radius:.375rem;border-width:2px;border-color:transparent;padding:.375rem .75rem;font-weight:600;--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transparent-button *::marker{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.transparent-button::marker{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.transparent-button:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.transparent-button:focus{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.transparent-button:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.transparent-button:focus:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}::-webkit-scrollbar{width:12px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb{background:#888;border-radius:6px}::-webkit-scrollbar-thumb:hover{background:#555}*{scrollbar-width:thin;scrollbar-color:#888 #f1f1f1}::-moz-selection{background-color:#0044f233}::selection{background-color:#0044f233}body{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}button:disabled{cursor:not-allowed;opacity:.5}button:disabled:hover{cursor:not-allowed;opacity:.5}.draggable-ghost{opacity:.5;background:#e0e7ff}html.dark [class^=icon-],html.dark [class*=\" icon-\"]{color:#d1d5db}p{font-size:14px;line-height:17px!important}input,textarea,select{outline:2px solid transparent;outline-offset:2px}.journal-scroll::-webkit-scrollbar{width:14px;cursor:pointer;display:none}.journal-scroll::-webkit-scrollbar-track{background-color:#fff;cursor:pointer;border-radius:12px;border:1px solid #e9e9e9}.journal-scroll::-webkit-scrollbar-thumb{cursor:pointer;background-color:#e9e9e9;border-radius:12px;border:3px solid transparent;background-clip:content-box}.custom-select{-webkit-appearance:none;-moz-appearance:none;background:transparent;background-image:url(\"data:image/svg+xml;utf8,<svg fill='black' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/><path d='M0 0h24v24H0z' fill='none'/></svg>\");background-repeat:no-repeat;background-position-x:calc(100% - 10px);background-position-y:50%}.dark .custom-select{background-image:url(\"data:image/svg+xml;utf8,<svg fill='white' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/><path d='M0 0h24v24H0z' fill='none'/></svg>\")}[dir=rtl] .custom-select{background-position-x:calc(100% - (100% - 10px))}.draggable-ghost{border-width:1px;border-style:dashed;--tw-border-opacity: 1 !important;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))!important}@keyframes skeleton{0%{background-position:-1250px 0}to{background-position:1250px 0}}.required:after{--tw-content: \"*\";content:var(--tw-content)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.\\!static{position:static!important}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.\\!bottom-12{bottom:3rem!important}.\\!top-7{top:1.75rem!important}.\\!top-\\[30px\\]{top:30px!important}.\\!top-auto{top:auto!important}.-bottom-0\\.5{bottom:-.125rem}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-10{bottom:2.5rem}.bottom-4{bottom:1rem}.bottom-5{bottom:1.25rem}.bottom-full{bottom:100%}.left-0{left:0}.left-1\\/2{left:50%}.left-4{left:1rem}.left-\\[6px\\]{left:6px}.right-0{right:0}.right-1{right:.25rem}.right-1\\.5{right:.375rem}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.right-7{right:1.75rem}.right-8{right:2rem}.right-\\[6px\\]{right:6px}.top-0{top:0}.top-1\\.5{top:.375rem}.top-1\\/2{top:50%}.top-10{top:2.5rem}.top-11{top:2.75rem}.top-2{top:.5rem}.top-3{top:.75rem}.top-4{top:1rem}.top-5{top:1.25rem}.top-\\[60px\\]{top:60px}.top-\\[6px\\]{top:6px}.top-\\[9px\\]{top:9px}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-\\[10001\\]{z-index:10001}.z-\\[10002\\]{z-index:10002}.z-\\[10003\\]{z-index:10003}.z-\\[10004\\]{z-index:10004}.z-\\[1000\\]{z-index:1000}.z-\\[999\\]{z-index:999}.float-right{float:right}.m-2{margin:.5rem}.m-3{margin:.75rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-2\\.5{margin-top:.625rem;margin-bottom:.625rem}.my-4{margin-top:1rem;margin-bottom:1rem}.\\!mb-0{margin-bottom:0!important}.\\!mb-2{margin-bottom:.5rem!important}.\\!mt-6{margin-top:1.5rem!important}.-mb-px{margin-bottom:-1px}.-mt-2{margin-top:-.5rem}.-mt-px{margin-top:-1px}.mb-0{margin-bottom:0}.mb-0\\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-2\\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-7{margin-bottom:1.75rem}.ml-1{margin-left:.25rem}.ml-4{margin-left:1rem}.mr-1{margin-right:.25rem}.ms-2{margin-inline-start:.5rem}.mt-0\\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-3\\.5{margin-top:.875rem}.mt-4{margin-top:1rem}.mt-auto{margin-top:auto}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.\\!flex{display:flex!important}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-\\[3\\.23\\/1\\]{aspect-ratio:3.23/1}.\\!h-10{height:2.5rem!important}.\\!h-\\[34px\\]{height:34px!important}.h-0{height:0px}.h-1{height:.25rem}.h-1\\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-20{height:5rem}.h-3{height:.75rem}.h-3\\.5{height:.875rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-9{height:2.25rem}.h-\\[100vh\\]{height:100vh}.h-\\[120px\\]{height:120px}.h-\\[15px\\]{height:15px}.h-\\[17px\\]{height:17px}.h-\\[18px\\]{height:18px}.h-\\[19px\\]{height:19px}.h-\\[21px\\]{height:21px}.h-\\[223px\\]{height:223px}.h-\\[26px\\]{height:26px}.h-\\[271px\\]{height:271px}.h-\\[280px\\]{height:280px}.h-\\[28px\\]{height:28px}.h-\\[33px\\]{height:33px}.h-\\[34px\\]{height:34px}.h-\\[380px\\]{height:380px}.h-\\[38px\\]{height:38px}.h-\\[39px\\]{height:39px}.h-\\[40px\\]{height:40px}.h-\\[42px\\]{height:42px}.h-\\[44px\\]{height:44px}.h-\\[49px\\]{height:49px}.h-\\[59px\\]{height:59px}.h-\\[74px\\]{height:74px}.h-\\[calc\\(100vh-100px\\)\\]{height:calc(100vh - 100px)}.h-\\[calc\\(100vh-317px\\)\\]{height:calc(100vh - 317px)}.h-fit{height:-moz-fit-content;height:fit-content}.h-full{height:100%}.max-h-0{max-height:0px}.max-h-40{max-height:10rem}.max-h-80{max-height:20rem}.max-h-9{max-height:2.25rem}.max-h-\\[120px\\]{max-height:120px}.max-h-\\[200px\\]{max-height:200px}.max-h-\\[400px\\]{max-height:400px}.max-h-\\[500px\\]{max-height:500px}.max-h-\\[80vh\\]{max-height:80vh}.min-h-0{min-height:0px}.min-h-9{min-height:2.25rem}.min-h-\\[110px\\]{min-height:110px}.min-h-\\[38px\\]{min-height:38px}.min-h-\\[39px\\]{min-height:39px}.min-h-\\[400px\\]{min-height:400px}.min-h-\\[47px\\]{min-height:47px}.min-h-\\[calc\\(100vh-62px\\)\\]{min-height:calc(100vh - 62px)}.min-h-full{min-height:100%}.\\!w-1\\/2{width:50%!important}.\\!w-1\\/3{width:33.333333%!important}.\\!w-1\\/4{width:25%!important}.\\!w-1\\/6{width:16.666667%!important}.\\!w-12{width:3rem!important}.\\!w-24{width:6rem!important}.\\!w-56{width:14rem!important}.\\!w-\\[140px\\]{width:140px!important}.\\!w-\\[150px\\]{width:150px!important}.\\!w-full{width:100%!important}.w-0{width:0px}.w-1\\.5{width:.375rem}.w-1\\/2{width:50%}.w-1\\/3{width:33.333333%}.w-1\\/5{width:20%}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\\.5{width:.875rem}.w-3\\/4{width:75%}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\\[100px\\]{width:100px}.w-\\[101px\\]{width:101px}.w-\\[105px\\]{width:105px}.w-\\[110px\\]{width:110px}.w-\\[120px\\]{width:120px}.w-\\[125px\\]{width:125px}.w-\\[136px\\]{width:136px}.w-\\[140px\\]{width:140px}.w-\\[141px\\]{width:141px}.w-\\[150px\\]{width:150px}.w-\\[172px\\]{width:172px}.w-\\[200px\\]{width:200px}.w-\\[210px\\]{width:210px}.w-\\[250px\\]{width:250px}.w-\\[254px\\]{width:254px}.w-\\[264px\\]{width:264px}.w-\\[26px\\]{width:26px}.w-\\[280px\\]{width:280px}.w-\\[28px\\]{width:28px}.w-\\[33px\\]{width:33px}.w-\\[348px\\]{width:348px}.w-\\[350px\\]{width:350px}.w-\\[360px\\]{width:360px}.w-\\[378px\\]{width:378px}.w-\\[38px\\]{width:38px}.w-\\[39px\\]{width:39px}.w-\\[50px\\]{width:50px}.w-\\[525px\\]{width:525px}.w-\\[52px\\]{width:52px}.w-\\[550px\\]{width:550px}.w-\\[60px\\]{width:60px}.w-\\[62px\\]{width:62px}.w-\\[650px\\]{width:650px}.w-\\[66px\\]{width:66px}.w-\\[68px\\]{width:68px}.w-\\[70px\\]{width:70px}.w-\\[72px\\]{width:72px}.w-\\[75px\\]{width:75px}.w-\\[76px\\]{width:76px}.w-\\[80px\\]{width:80px}.w-\\[84px\\]{width:84px}.w-\\[926px\\]{width:926px}.w-\\[94px\\]{width:94px}.w-\\[calc\\(100\\%-62px\\)\\]{width:calc(100% - 62px)}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.\\!min-w-40{min-width:10rem!important}.\\!min-w-\\[600px\\]{min-width:600px!important}.min-w-0{min-width:0px}.min-w-24{min-width:6rem}.min-w-9{min-width:2.25rem}.min-w-\\[110px\\]{min-width:110px}.min-w-\\[120px\\]{min-width:120px}.min-w-\\[140px\\]{min-width:140px}.min-w-\\[177px\\]{min-width:177px}.min-w-\\[210px\\]{min-width:210px}.min-w-\\[275px\\]{min-width:275px}.min-w-\\[300px\\]{min-width:300px}.min-w-\\[394px\\]{min-width:394px}.min-w-\\[800px\\]{min-width:800px}.min-w-\\[80px\\]{min-width:80px}.max-w-9{max-width:2.25rem}.max-w-\\[110px\\]{max-width:110px}.max-w-\\[120px\\]{max-width:120px}.max-w-\\[210px\\]{max-width:210px}.max-w-\\[250px\\]{max-width:250px}.max-w-\\[275px\\]{max-width:275px}.max-w-\\[360px\\]{max-width:360px}.max-w-\\[394px\\]{max-width:394px}.max-w-\\[400px\\]{max-width:400px}.max-w-\\[445px\\]{max-width:445px}.max-w-\\[525px\\]{max-width:525px}.max-w-\\[550px\\]{max-width:550px}.max-w-\\[745px\\]{max-width:745px}.max-w-\\[768px\\]{max-width:768px}.max-w-\\[950px\\]{max-width:950px}.max-w-full{max-width:100%}.max-w-max{max-width:-moz-max-content;max-width:max-content}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.\\!table-auto{table-layout:auto!important}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.origin-top{transform-origin:top}.-translate-x-1\\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\\/2,.-translate-y-2\\/4{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-4{--tw-translate-y: -1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-full{--tw-translate-y: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-4{--tw-translate-y: 1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-full{--tw-translate-y: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-45{--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\\[on-fade_0\\.5s_ease-in-out\\]{animation:on-fade .5s ease-in-out}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize{resize:both}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-\\[\\.1fr_\\.2fr_\\.2fr_\\.2fr_\\.2fr_\\.2fr\\]{grid-template-columns:.1fr .2fr .2fr .2fr .2fr .2fr}.grid-cols-\\[\\.3fr_\\.1fr_\\.3fr_\\.5fr\\]{grid-template-columns:.3fr .1fr .3fr .5fr}.grid-cols-\\[1fr_2fr\\]{grid-template-columns:1fr 2fr}.grid-cols-\\[2fr_1fr_1fr\\]{grid-template-columns:2fr 1fr 1fr}.grid-cols-\\[2fr_7fr_\\.0\\.3fr\\]{grid-template-columns:2fr 7fr 0.3fr}.grid-cols-\\[2fr_7fr_\\.1fr\\]{grid-template-columns:2fr 7fr .1fr}.grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.place-content-start{place-content:start}.place-content-between{place-content:space-between}.place-items-start{place-items:start}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-items-end{justify-items:end}.justify-items-center{justify-items:center}.gap-0\\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\\.5{gap:.375rem}.gap-10{gap:2.5rem}.gap-11{gap:2.75rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-2\\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-3\\.5{gap:.875rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-\\[100px\\]{gap:100px}.gap-\\[124px\\]{gap:124px}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-x-1\\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-2\\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-x-3\\.5{-moz-column-gap:.875rem;column-gap:.875rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-y-2\\.5{row-gap:.625rem}.gap-y-6{row-gap:1.5rem}.gap-y-8{row-gap:2rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.25rem * var(--tw-space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--tw-space-x-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(243 244 246 / var(--tw-divide-opacity, 1))}.divide-slate-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(226 232 240 / var(--tw-divide-opacity, 1))}.place-self-start{place-self:start}.place-self-end{place-self:end}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.\\!rounded-lg{border-radius:.5rem!important}.\\!rounded-none{border-radius:0!important}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.\\!rounded-l-none{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.\\!rounded-r-none{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-x-0{border-left-width:0px;border-right-width:0px}.border-y{border-top-width:1px;border-bottom-width:1px}.\\!border-b-0{border-bottom-width:0px!important}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0px}.border-t-2{border-top-width:2px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.\\!border-none{border-style:none!important}.\\!border-red-600{--tw-border-opacity: 1 !important;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))!important}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-600{--tw-border-opacity: 1;border-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-brandColor{border-color:var(--brand-color)}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-400{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.border-gray-500{--tw-border-opacity: 1;border-color:rgb(107 114 128 / var(--tw-border-opacity, 1))}.border-gray-800{--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-orange-200{--tw-border-opacity: 1;border-color:rgb(254 215 170 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-slate-300{--tw-border-opacity: 1;border-color:rgb(203 213 225 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-b-gray-300{--tw-border-opacity: 1;border-bottom-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-l-brandColor{border-left-color:var(--brand-color)}.\\!bg-green-500{--tw-bg-opacity: 1 !important;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))!important}.\\!bg-red-500{--tw-bg-opacity: 1 !important;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))!important}.bg-\\[\\#63CFE5\\]{--tw-bg-opacity: 1;background-color:rgb(99 207 229 / var(--tw-bg-opacity, 1))}.bg-\\[\\#8979FF\\]{--tw-bg-opacity: 1;background-color:rgb(137 121 255 / var(--tw-bg-opacity, 1))}.bg-\\[\\#FFA8A1\\]{--tw-bg-opacity: 1;background-color:rgb(255 168 161 / var(--tw-bg-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-200{--tw-bg-opacity: 1;background-color:rgb(191 219 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-brandColor{background-color:var(--brand-color)}.bg-cyan-200{--tw-bg-opacity: 1;background-color:rgb(165 243 252 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-300{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-gray-950{--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-200{--tw-bg-opacity: 1;background-color:rgb(187 247 208 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-lime-200{--tw-bg-opacity: 1;background-color:rgb(217 249 157 / var(--tw-bg-opacity, 1))}.bg-neutral-100{--tw-bg-opacity: 1;background-color:rgb(245 245 245 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-orange-200{--tw-bg-opacity: 1;background-color:rgb(254 215 170 / var(--tw-bg-opacity, 1))}.bg-orange-50{--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.bg-pink-200{--tw-bg-opacity: 1;background-color:rgb(251 207 232 / var(--tw-bg-opacity, 1))}.bg-pink-400{--tw-bg-opacity: 1;background-color:rgb(244 114 182 / var(--tw-bg-opacity, 1))}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-200{--tw-bg-opacity: 1;background-color:rgb(254 202 202 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-rose-100{--tw-bg-opacity: 1;background-color:rgb(255 228 230 / var(--tw-bg-opacity, 1))}.bg-sky-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity, 1))}.bg-sky-600{--tw-bg-opacity: 1;background-color:rgb(2 132 199 / var(--tw-bg-opacity, 1))}.bg-slate-100{--tw-bg-opacity: 1;background-color:rgb(241 245 249 / var(--tw-bg-opacity, 1))}.bg-slate-200{--tw-bg-opacity: 1;background-color:rgb(226 232 240 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-200{--tw-bg-opacity: 1;background-color:rgb(254 240 138 / var(--tw-bg-opacity, 1))}.bg-yellow-400{--tw-bg-opacity: 1;background-color:rgb(250 204 21 / var(--tw-bg-opacity, 1))}.bg-opacity-50{--tw-bg-opacity: .5}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-transparent{--tw-gradient-from: transparent var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 0 0 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-gray-50{--tw-gradient-to: rgb(249 250 251 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #f9fafb var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-gray-100{--tw-gradient-to: #f3f4f6 var(--tw-gradient-to-position)}.object-cover{-o-object-fit:cover;object-fit:cover}.\\!p-0{padding:0!important}.\\!p-2{padding:.5rem!important}.p-0\\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\\.5{padding:.625rem}.p-3{padding:.75rem}.p-3\\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.\\!px-0{padding-left:0!important;padding-right:0!important}.\\!px-2{padding-left:.5rem!important;padding-right:.5rem!important}.\\!px-4{padding-left:1rem!important;padding-right:1rem!important}.\\!py-0{padding-top:0!important;padding-bottom:0!important}.\\!py-\\[22px\\]{padding-top:22px!important;padding-bottom:22px!important}.px-1{padding-left:.25rem;padding-right:.25rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-12{padding-left:3rem;padding-right:3rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-\\[11px\\]{padding-top:11px;padding-bottom:11px}.py-\\[7px\\]{padding-top:7px;padding-bottom:7px}.py-\\[9px\\]{padding-top:9px;padding-bottom:9px}.py-px{padding-top:1px;padding-bottom:1px}.\\!pb-0{padding-bottom:0!important}.\\!pb-3{padding-bottom:.75rem!important}.pb-2\\.5{padding-bottom:.625rem}.pb-3\\.5{padding-bottom:.875rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pb-8{padding-bottom:2rem}.pb-\\[9px\\]{padding-bottom:9px}.pl-10{padding-left:2.5rem}.pl-2{padding-left:.5rem}.pl-2\\.5{padding-left:.625rem}.pl-4{padding-left:1rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pl-\\[2px\\]{padding-left:2px}.pr-10{padding-right:2.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-6{padding-right:1.5rem}.pt-2{padding-top:.5rem}.pt-2\\.5{padding-top:.625rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-end{text-align:end}.align-top{vertical-align:top}.align-text-bottom{vertical-align:text-bottom}.font-inter{font-family:Inter}.\\!text-base{font-size:1rem!important;line-height:1.5rem!important}.\\!text-sm{font-size:.875rem!important;line-height:1.25rem!important}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\\[10px\\]{font-size:10px}.text-\\[26px\\]{font-size:26px}.text-\\[38px\\]{font-size:38px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.\\!font-bold{font-weight:700!important}.\\!font-normal{font-weight:400!important}.\\!font-semibold{font-weight:600!important}.font-bold{font-weight:700}.font-light{font-weight:300}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-8{line-height:2rem}.leading-\\[140\\%\\]{line-height:140%}.leading-none{line-height:1}.leading-normal{line-height:1.5}.leading-snug{line-height:1.375}.\\!text-brandColor{color:var(--brand-color)!important}.\\!text-gray-500{--tw-text-opacity: 1 !important;color:rgb(107 114 128 / var(--tw-text-opacity, 1))!important}.\\!text-gray-600{--tw-text-opacity: 1 !important;color:rgb(75 85 99 / var(--tw-text-opacity, 1))!important}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-blue-900{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.text-brandColor{color:var(--brand-color)}.text-cyan-800{--tw-text-opacity: 1;color:rgb(21 94 117 / var(--tw-text-opacity, 1))}.text-cyan-900{--tw-text-opacity: 1;color:rgb(22 78 99 / var(--tw-text-opacity, 1))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-green-900{--tw-text-opacity: 1;color:rgb(20 83 45 / var(--tw-text-opacity, 1))}.text-lime-900{--tw-text-opacity: 1;color:rgb(54 83 20 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-orange-800{--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.text-orange-900{--tw-text-opacity: 1;color:rgb(124 45 18 / var(--tw-text-opacity, 1))}.text-pink-900{--tw-text-opacity: 1;color:rgb(131 24 67 / var(--tw-text-opacity, 1))}.text-purple-800{--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-red-900{--tw-text-opacity: 1;color:rgb(127 29 29 / var(--tw-text-opacity, 1))}.text-rose-600{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.text-sky-600{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.text-slate-900{--tw-text-opacity: 1;color:rgb(15 23 42 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-900{--tw-text-opacity: 1;color:rgb(113 63 18 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.\\!shadow-none{--tw-shadow: 0 0 #0000 !important;--tw-shadow-colored: 0 0 #0000 !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\\[0_5px_20px_rgba\\(0\\,0\\,0\\,0\\.15\\)\\]{--tw-shadow: 0 5px 20px rgba(0,0,0,.15);--tw-shadow-colored: 0 5px 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\\[0px_0px_0px_0px_rgba\\(0\\,0\\,0\\,0\\.10\\)\\,0px_1px_3px_0px_rgba\\(0\\,0\\,0\\,0\\.10\\)\\,0px_5px_5px_0px_rgba\\(0\\,0\\,0\\,0\\.09\\)\\,0px_12px_7px_0px_rgba\\(0\\,0\\,0\\,0\\.05\\)\\,0px_22px_9px_0px_rgba\\(0\\,0\\,0\\,0\\.01\\)\\,0px_34px_9px_0px_rgba\\(0\\,0\\,0\\,0\\.00\\)\\]{--tw-shadow: 0px 0px 0px 0px rgba(0,0,0,.1),0px 1px 3px 0px rgba(0,0,0,.1),0px 5px 5px 0px rgba(0,0,0,.09),0px 12px 7px 0px rgba(0,0,0,.05),0px 22px 9px 0px rgba(0,0,0,.01),0px 34px 9px 0px rgba(0,0,0,0);--tw-shadow-colored: 0px 0px 0px 0px var(--tw-shadow-color), 0px 1px 3px 0px var(--tw-shadow-color), 0px 5px 5px 0px var(--tw-shadow-color), 0px 12px 7px 0px var(--tw-shadow-color), 0px 22px 9px 0px var(--tw-shadow-color), 0px 34px 9px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\\[0px_10px_20px_0px_\\#0000001F\\]{--tw-shadow: 0px 10px 20px 0px #0000001F;--tw-shadow-colored: 0px 10px 20px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\\[0px_10px_20px_0px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow: 0px 10px 20px 0px rgba(0,0,0,.12);--tw-shadow-colored: 0px 10px 20px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-75{transition-duration:75ms}.ease-\\[cubic-bezier\\(\\.4\\,0\\,\\.2\\,1\\)\\]{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@font-face{font-family:icomoon;src:url(icomoon-BbY1GX-d.woff?w2trdd) format(\"woff\");font-weight:400;font-style:normal;font-display:block}[class^=icon-],[class*=\" icon-\"]{font-family:icomoon!important;speak:never;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tox .tox-toolbar__group:last-child button{padding:6px 8px;background:#eff6ff;color:#2563eb}.tox .tox-toolbar__group:last-child button:hover{background:#dbeafe}.tox .tox-toolbar__group:last-child button[aria-disabled=true]{cursor:not-allowed;opacity:.5}.tox .tox-toolbar__group:last-child button{background-color:transparent!important}.tox .tox-toolbar__group:last-child button:hover{border-width:0px;--tw-bg-opacity: 1 !important;background-color:rgb(51 137 236 / var(--tw-bg-opacity, 1))!important;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.tox.tox-silver-sink.tox-tinymce-aux{z-index:99999}.peer:checked~.peer-checked\\:icon-radio-selected:before{content:\"\"}.peer:checked~.peer-checked\\:icon-checkbox-multiple:before{content:\"\"}.peer:checked~.peer-checked\\:icon-checkbox-select:before{content:\"\"}.dark\\:shimmer:is(.dark *){animation-duration:2.2s;animation-fill-mode:forwards;animation-iteration-count:infinite;animation-name:skeleton;animation-timing-function:linear;background:linear-gradient(to right,#f6f6f6 8%,#f0f0f0 18%,#f6f6f6 33%);background-size:1250px 100%}.dark .dark\\:shimmer:is(.dark *){background:linear-gradient(to right,#1f2937 8%,#1a2232 18%,#1f2937 33%)}.rtl\\:icon-left-arrow:where([dir=rtl],[dir=rtl] *):before{content:\"\"}.rtl\\:icon-right-arrow:where([dir=rtl],[dir=rtl] *):before{content:\"\"}.marker\\:shadow *::marker{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.marker\\:shadow::marker{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.after\\:absolute:after{content:var(--tw-content);position:absolute}.after\\:-right-\\[30px\\]:after{content:var(--tw-content);right:-30px}.after\\:top-0\\.5:after{content:var(--tw-content);top:.125rem}.after\\:h-4:after{content:var(--tw-content);height:1rem}.after\\:w-4:after{content:var(--tw-content);width:1rem}.after\\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\\:border:after{content:var(--tw-content);border-width:1px}.after\\:border-gray-300:after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.after\\:bg-green-500:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.after\\:bg-red-500:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.after\\:bg-white:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.after\\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.after\\:content-\\[\\'\\'\\]:after{--tw-content: \"\";content:var(--tw-content)}.after\\:content-\\[\\'\\,_\\'\\]:after{--tw-content: \", \";content:var(--tw-content)}.after\\:content-\\[\\'\\/\\'\\]:after{--tw-content: \"/\";content:var(--tw-content)}.first\\:rounded-l-lg:first-child{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.last\\:\\!mb-0:last-child{margin-bottom:0!important}.last\\:mb-0:last-child{margin-bottom:0}.last\\:cursor-default:last-child{cursor:default}.last\\:border-b-0:last-child{border-bottom-width:0px}.last\\:border-none:last-child{border-style:none}.after\\:last\\:hidden:last-child:after{content:var(--tw-content);display:none}.last\\:after\\:content-\\[\\'\\'\\]:last-child:after{--tw-content: \"\";content:var(--tw-content)}.focus-within\\:border-gray-400:focus-within{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.hover\\:rounded-lg:hover{border-radius:.5rem}.hover\\:rounded-md:hover{border-radius:.375rem}.hover\\:rounded-sm:hover{border-radius:.125rem}.hover\\:border-blue-400:hover{--tw-border-opacity: 1;border-color:rgb(96 165 250 / var(--tw-border-opacity, 1))}.hover\\:border-cyan-400:hover{--tw-border-opacity: 1;border-color:rgb(34 211 238 / var(--tw-border-opacity, 1))}.hover\\:border-gray-400:hover{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.hover\\:border-green-400:hover{--tw-border-opacity: 1;border-color:rgb(74 222 128 / var(--tw-border-opacity, 1))}.hover\\:border-orange-400:hover{--tw-border-opacity: 1;border-color:rgb(251 146 60 / var(--tw-border-opacity, 1))}.hover\\:border-red-600:hover{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.hover\\:bg-blue-100:hover{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.hover\\:bg-brandColor:hover{background-color:var(--brand-color)}.hover\\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\\:bg-green-200:hover{--tw-bg-opacity: 1;background-color:rgb(187 247 208 / var(--tw-bg-opacity, 1))}.hover\\:bg-red-200:hover{--tw-bg-opacity: 1;background-color:rgb(254 202 202 / var(--tw-bg-opacity, 1))}.hover\\:text-brandColor:hover{color:var(--brand-color)}.hover\\:text-gray-800:hover{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.hover\\:text-sky-600:hover{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.hover\\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:opacity-80:hover{opacity:.8}.focus\\:border-gray-400:focus{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.focus\\:opacity-80:focus{opacity:.8}.focus\\:ring-black:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity, 1))}.active\\:border-gray-300:active{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.group\\/item:hover .group-hover\\/item\\:visible,.group:hover .group-hover\\:visible{visibility:visible}.group:hover .group-hover\\:flex{display:flex}.group:hover .group-hover\\:text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.group:hover .group-hover\\:opacity-100{opacity:1}.group\\/container.sidebar-collapsed .group-\\[\\.sidebar-collapsed\\]\\/container\\:hidden{display:none}.group\\/container.sidebar-collapsed .group-\\[\\.sidebar-collapsed\\]\\/container\\:w-\\[70px\\]{width:70px}.group\\/container.sidebar-collapsed .group-\\[\\.sidebar-collapsed\\]\\/container\\:overflow-visible{overflow:visible}.peer:checked~.peer-checked\\:border-2{border-width:2px}.peer:checked~.peer-checked\\:border-4{border-width:4px}.peer:checked~.peer-checked\\:border-solid{border-style:solid}.peer:checked~.peer-checked\\:border-brandColor{border-color:var(--brand-color)}.peer:checked~.peer-checked\\:border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.peer:checked~.peer-checked\\:bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.peer:checked~.peer-checked\\:bg-brandColor{background-color:var(--brand-color)}.peer:checked~.peer-checked\\:\\!text-brandColor{color:var(--brand-color)!important}.peer:checked~.peer-checked\\:text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.peer:checked~.peer-checked\\:text-brandColor{color:var(--brand-color)}.peer:checked~.peer-checked\\:after\\:border-white:after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.peer:focus~.peer-focus\\:outline-none{outline:2px solid transparent;outline-offset:2px}.peer:focus~.peer-focus\\:ring-blue-300{--tw-ring-opacity: 1;--tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity, 1))}.dark\\:divide-gray-700:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(55 65 81 / var(--tw-divide-opacity, 1))}.dark\\:divide-gray-800:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(31 41 55 / var(--tw-divide-opacity, 1))}.dark\\:border-gray-300:is(.dark *){--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.dark\\:border-gray-400:is(.dark *){--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.dark\\:border-gray-600:is(.dark *){--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.dark\\:border-gray-700:is(.dark *){--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.dark\\:border-gray-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity, 1))}.dark\\:border-gray-900:is(.dark *){--tw-border-opacity: 1;border-color:rgb(17 24 39 / var(--tw-border-opacity, 1))}.dark\\:\\!bg-gray-900:is(.dark *){--tw-bg-opacity: 1 !important;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))!important}.dark\\:bg-brandColor:is(.dark *){background-color:var(--brand-color)}.dark\\:bg-gray-400:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.dark\\:bg-gray-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.dark\\:bg-gray-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\\:bg-gray-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.dark\\:bg-gray-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.dark\\:bg-green-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.dark\\:bg-slate-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1))}.dark\\:bg-white:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.dark\\:via-gray-900:is(.dark *){--tw-gradient-to: rgb(17 24 39 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #111827 var(--tw-gradient-via-position), var(--tw-gradient-to)}.dark\\:to-gray-900:is(.dark *){--tw-gradient-to: #111827 var(--tw-gradient-to-position)}.dark\\:\\!text-blue-600:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(37 99 235 / var(--tw-text-opacity, 1))!important}.dark\\:\\!text-blue-800:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(30 64 175 / var(--tw-text-opacity, 1))!important}.dark\\:\\!text-cyan-800:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(21 94 117 / var(--tw-text-opacity, 1))!important}.dark\\:\\!text-cyan-900:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(22 78 99 / var(--tw-text-opacity, 1))!important}.dark\\:\\!text-gray-300:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(209 213 219 / var(--tw-text-opacity, 1))!important}.dark\\:\\!text-green-500:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(34 197 94 / var(--tw-text-opacity, 1))!important}.dark\\:\\!text-green-600:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(22 163 74 / var(--tw-text-opacity, 1))!important}.dark\\:\\!text-green-900:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(20 83 45 / var(--tw-text-opacity, 1))!important}.dark\\:\\!text-orange-600:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(234 88 12 / var(--tw-text-opacity, 1))!important}.dark\\:\\!text-orange-800:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(154 52 18 / var(--tw-text-opacity, 1))!important}.dark\\:\\!text-red-500:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(239 68 68 / var(--tw-text-opacity, 1))!important}.dark\\:\\!text-red-600:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(220 38 38 / var(--tw-text-opacity, 1))!important}.dark\\:\\!text-yellow-900:is(.dark *){--tw-text-opacity: 1 !important;color:rgb(113 63 18 / var(--tw-text-opacity, 1))!important}.dark\\:text-brandColor:is(.dark *){color:var(--brand-color)}.dark\\:text-gray-100:is(.dark *){--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.dark\\:text-gray-300:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\\:text-gray-400:is(.dark *){--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.dark\\:text-gray-600:is(.dark *){--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.dark\\:text-gray-800:is(.dark *){--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.dark\\:text-gray-900:is(.dark *){--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.dark\\:text-white:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\\:mix-blend-exclusion:is(.dark *){mix-blend-mode:exclusion}.dark\\:ring-offset-gray-800:is(.dark *){--tw-ring-offset-color: #1f2937}.dark\\:invert:is(.dark *){--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.dark\\:file\\:bg-gray-800:is(.dark *)::file-selector-button{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\\:file\\:dark\\:text-white:is(.dark *):is(.dark *)::file-selector-button{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\\:after\\:border-white:is(.dark *):after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.dark\\:after\\:bg-white:is(.dark *):after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.dark\\:hover\\:border-gray-400:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.dark\\:hover\\:bg-gray-800:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.dark\\:hover\\:bg-gray-900:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.dark\\:hover\\:bg-gray-950:hover:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.hover\\:dark\\:bg-gray-950:is(.dark *):hover{--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.dark\\:hover\\:text-white:hover:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.dark\\:focus\\:border-gray-400:focus:is(.dark *){--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.dark\\:focus\\:bg-gray-800:focus:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.peer:checked~.dark\\:peer-checked\\:bg-gray-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}@media not all and (min-width: 1240px){.max-xl\\:w-full{width:100%}.max-xl\\:flex-auto{flex:1 1 auto}.max-xl\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.max-xl\\:flex-wrap{flex-wrap:wrap}.max-xl\\:flex-wrap-reverse{flex-wrap:wrap-reverse}}@media not all and (min-width: 1024px){.max-lg\\:mt-6{margin-top:1.5rem}.max-lg\\:block{display:block}.max-lg\\:hidden{display:none}.max-lg\\:w-\\[400px\\]{width:400px}.max-lg\\:min-w-full{min-width:100%}.max-lg\\:max-w-full{max-width:100%}.max-lg\\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-lg\\:flex-wrap{flex-wrap:wrap}.max-lg\\:gap-4{gap:1rem}.max-lg\\:gap-y-4{row-gap:1rem}}@media not all and (min-width: 768px){.max-md\\:hidden{display:none}.max-md\\:w-\\[90\\%\\]{width:90%}.max-md\\:w-full{width:100%}.max-md\\:max-w-full{max-width:100%}.max-md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.max-md\\:flex-wrap{flex-wrap:wrap}.max-md\\:\\!justify-between{justify-content:space-between!important}.max-md\\:justify-between{justify-content:space-between}.max-md\\:p-4{padding:1rem}.max-md\\:py-3{padding-top:.75rem;padding-bottom:.75rem}}@media not all and (min-width: 525px){.max-sm\\:hidden{display:none}.max-sm\\:\\!w-\\[calc\\(100\\%-24px\\)\\]{width:calc(100% - 24px)!important}.max-sm\\:w-full{width:100%}.max-sm\\:max-w-full{max-width:100%}.max-sm\\:flex-1{flex:1 1 0%}.max-sm\\:flex-auto{flex:1 1 auto}.max-sm\\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-sm\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.max-sm\\:flex-wrap{flex-wrap:wrap}.max-sm\\:gap-2\\.5{gap:.625rem}.max-sm\\:place-self-center{place-self:center}.max-sm\\:px-4{padding-left:1rem;padding-right:1rem}}@media (min-width: 525px){.sm\\:absolute{position:absolute}.sm\\:mt-0{margin-top:0}.sm\\:hidden{display:none}.sm\\:flex-row{flex-direction:row}.sm\\:items-center{align-items:center}.sm\\:p-0{padding:0}.sm\\:px-4{padding-left:1rem;padding-right:1rem}.sm\\:py-3{padding-top:.75rem;padding-bottom:.75rem}.sm\\:text-right{text-align:right}.sm\\:text-base{font-size:1rem;line-height:1.5rem}}@media (min-width: 768px){.md\\:hidden{display:none}.md\\:translate-y-0{--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\\:scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\\:scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.md\\:flex-col{flex-direction:column}}@media (min-width: 1024px){.lg\\:sticky{position:sticky}.lg\\:top-\\[73px\\]{top:73px}.lg\\:mt-6{margin-top:1.5rem}.lg\\:hidden{display:none}}.ltr\\:left-0:where([dir=ltr],[dir=ltr] *){left:0}.ltr\\:left-3:where([dir=ltr],[dir=ltr] *){left:.75rem}.ltr\\:left-4:where([dir=ltr],[dir=ltr] *){left:1rem}.ltr\\:left-\\[200px\\]:where([dir=ltr],[dir=ltr] *){left:200px}.ltr\\:right-0:where([dir=ltr],[dir=ltr] *){right:0}.ltr\\:right-1\\.5:where([dir=ltr],[dir=ltr] *){right:.375rem}.ltr\\:right-2:where([dir=ltr],[dir=ltr] *){right:.5rem}.ltr\\:right-3:where([dir=ltr],[dir=ltr] *){right:.75rem}.ltr\\:right-4:where([dir=ltr],[dir=ltr] *){right:1rem}.ltr\\:ml-1\\.5:where([dir=ltr],[dir=ltr] *){margin-left:.375rem}.ltr\\:ml-11:where([dir=ltr],[dir=ltr] *){margin-left:2.75rem}.ltr\\:ml-2\\.5:where([dir=ltr],[dir=ltr] *){margin-left:.625rem}.ltr\\:mr-1:where([dir=ltr],[dir=ltr] *){margin-right:.25rem}.ltr\\:mr-11:where([dir=ltr],[dir=ltr] *){margin-right:2.75rem}.ltr\\:mr-5:where([dir=ltr],[dir=ltr] *){margin-right:1.25rem}.ltr\\:mr-6:where([dir=ltr],[dir=ltr] *){margin-right:1.5rem}.ltr\\:-translate-x-full:where([dir=ltr],[dir=ltr] *){--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ltr\\:translate-x-full:where([dir=ltr],[dir=ltr] *){--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ltr\\:translate-y-0:where([dir=ltr],[dir=ltr] *){--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ltr\\:translate-y-full:where([dir=ltr],[dir=ltr] *){--tw-translate-y: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ltr\\:rounded-l-md:where([dir=ltr],[dir=ltr] *){border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.ltr\\:rounded-r-md:where([dir=ltr],[dir=ltr] *){border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.ltr\\:border-r:where([dir=ltr],[dir=ltr] *){border-right-width:1px}.ltr\\:\\!pl-14:where([dir=ltr],[dir=ltr] *){padding-left:3.5rem!important}.ltr\\:\\!pl-5:where([dir=ltr],[dir=ltr] *){padding-left:1.25rem!important}.ltr\\:pl-10:where([dir=ltr],[dir=ltr] *){padding-left:2.5rem}.ltr\\:pl-2:where([dir=ltr],[dir=ltr] *){padding-left:.5rem}.ltr\\:pl-2\\.5:where([dir=ltr],[dir=ltr] *){padding-left:.625rem}.ltr\\:pl-4:where([dir=ltr],[dir=ltr] *){padding-left:1rem}.ltr\\:pr-1\\.5:where([dir=ltr],[dir=ltr] *){padding-right:.375rem}.ltr\\:pr-10:where([dir=ltr],[dir=ltr] *){padding-right:2.5rem}.ltr\\:pr-14:where([dir=ltr],[dir=ltr] *){padding-right:3.5rem}.ltr\\:pr-16:where([dir=ltr],[dir=ltr] *){padding-right:4rem}.ltr\\:pr-20:where([dir=ltr],[dir=ltr] *){padding-right:5rem}.ltr\\:pr-3:where([dir=ltr],[dir=ltr] *){padding-right:.75rem}.ltr\\:pr-8:where([dir=ltr],[dir=ltr] *){padding-right:2rem}.ltr\\:text-left:where([dir=ltr],[dir=ltr] *){text-align:left}.ltr\\:text-right:where([dir=ltr],[dir=ltr] *){text-align:right}.after\\:ltr\\:left-0\\.5:where([dir=ltr],[dir=ltr] *):after{content:var(--tw-content);left:.125rem}.ltr\\:after\\:bg-green-500:where([dir=ltr],[dir=ltr] *):after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.ltr\\:after\\:bg-red-500:where([dir=ltr],[dir=ltr] *):after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.ltr\\:first\\:rounded-l-lg:first-child:where([dir=ltr],[dir=ltr] *){border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.peer:checked~.peer-checked\\:after\\:ltr\\:translate-x-full:where([dir=ltr],[dir=ltr] *):after{content:var(--tw-content);--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@media (min-width: 1024px){.ltr\\:lg\\:pl-\\[85px\\]:where([dir=ltr],[dir=ltr] *){padding-left:85px}}.rtl\\:left-0:where([dir=rtl],[dir=rtl] *){left:0}.rtl\\:left-1\\.5:where([dir=rtl],[dir=rtl] *){left:.375rem}.rtl\\:left-2:where([dir=rtl],[dir=rtl] *){left:.5rem}.rtl\\:left-3:where([dir=rtl],[dir=rtl] *){left:.75rem}.rtl\\:left-4:where([dir=rtl],[dir=rtl] *){left:1rem}.rtl\\:right-0:where([dir=rtl],[dir=rtl] *){right:0}.rtl\\:right-3:where([dir=rtl],[dir=rtl] *){right:.75rem}.rtl\\:right-4:where([dir=rtl],[dir=rtl] *){right:1rem}.rtl\\:right-\\[199px\\]:where([dir=rtl],[dir=rtl] *){right:199px}.rtl\\:ml-1:where([dir=rtl],[dir=rtl] *){margin-left:.25rem}.rtl\\:ml-11:where([dir=rtl],[dir=rtl] *){margin-left:2.75rem}.rtl\\:ml-5:where([dir=rtl],[dir=rtl] *){margin-left:1.25rem}.rtl\\:ml-6:where([dir=rtl],[dir=rtl] *){margin-left:1.5rem}.rtl\\:mr-1\\.5:where([dir=rtl],[dir=rtl] *){margin-right:.375rem}.rtl\\:mr-11:where([dir=rtl],[dir=rtl] *){margin-right:2.75rem}.rtl\\:mr-2\\.5:where([dir=rtl],[dir=rtl] *){margin-right:.625rem}.rtl\\:-translate-x-full:where([dir=rtl],[dir=rtl] *){--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\\:-translate-y-0:where([dir=rtl],[dir=rtl] *){--tw-translate-y: -0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\\:-translate-y-full:where([dir=rtl],[dir=rtl] *){--tw-translate-y: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\\:translate-x-full:where([dir=rtl],[dir=rtl] *){--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\\:rounded-l-md:where([dir=rtl],[dir=rtl] *){border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rtl\\:rounded-r-md:where([dir=rtl],[dir=rtl] *){border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rtl\\:border-x:where([dir=rtl],[dir=rtl] *){border-left-width:1px;border-right-width:1px}.rtl\\:border-l:where([dir=rtl],[dir=rtl] *){border-left-width:1px}.rtl\\:\\!pr-14:where([dir=rtl],[dir=rtl] *){padding-right:3.5rem!important}.rtl\\:\\!pr-5:where([dir=rtl],[dir=rtl] *){padding-right:1.25rem!important}.rtl\\:pl-1\\.5:where([dir=rtl],[dir=rtl] *){padding-left:.375rem}.rtl\\:pl-10:where([dir=rtl],[dir=rtl] *){padding-left:2.5rem}.rtl\\:pl-14:where([dir=rtl],[dir=rtl] *){padding-left:3.5rem}.rtl\\:pl-16:where([dir=rtl],[dir=rtl] *){padding-left:4rem}.rtl\\:pl-20:where([dir=rtl],[dir=rtl] *){padding-left:5rem}.rtl\\:pl-3:where([dir=rtl],[dir=rtl] *){padding-left:.75rem}.rtl\\:pl-8:where([dir=rtl],[dir=rtl] *){padding-left:2rem}.rtl\\:pr-10:where([dir=rtl],[dir=rtl] *){padding-right:2.5rem}.rtl\\:pr-2:where([dir=rtl],[dir=rtl] *){padding-right:.5rem}.rtl\\:pr-2\\.5:where([dir=rtl],[dir=rtl] *){padding-right:.625rem}.rtl\\:pr-4:where([dir=rtl],[dir=rtl] *){padding-right:1rem}.rtl\\:text-left:where([dir=rtl],[dir=rtl] *){text-align:left}.rtl\\:text-right:where([dir=rtl],[dir=rtl] *){text-align:right}.rtl\\:before\\:bg-green-500:where([dir=rtl],[dir=rtl] *):before{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.rtl\\:before\\:bg-red-500:where([dir=rtl],[dir=rtl] *):before{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.after\\:rtl\\:right-0\\.5:where([dir=rtl],[dir=rtl] *):after{content:var(--tw-content);right:.125rem}.rtl\\:first\\:rounded-r-lg:first-child:where([dir=rtl],[dir=rtl] *){border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.peer:checked~.peer-checked\\:after\\:rtl\\:-translate-x-full:where([dir=rtl],[dir=rtl] *):after{content:var(--tw-content);--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@media (min-width: 1024px){.rtl\\:lg\\:pr-\\[85px\\]:where([dir=rtl],[dir=rtl] *){padding-right:85px}}.\\[\\&\\.active\\>\\.v-tree-item\\]\\:block.active>.v-tree-item{display:block}@media not all and (min-width: 1024px){.\\[\\&\\>\\*\\>\\*\\:nth-child\\(1\\)\\]\\:max-lg\\:\\!flex-wrap>*>*:nth-child(1){flex-wrap:wrap!important}.\\[\\&\\>\\*\\>\\*\\>\\*\\.toolbarRight\\]\\:max-lg\\:w-full>*>*>*.toolbarRight{width:100%}.\\[\\&\\>\\*\\>\\*\\>\\*\\.toolbarRight\\]\\:max-lg\\:justify-between>*>*>*.toolbarRight{justify-content:space-between}}@media not all and (min-width: 768px){.\\[\\&\\>\\*\\>\\*\\>\\*\\.toolbarRight\\]\\:max-md\\:flex-wrap>*>*>*.toolbarRight{flex-wrap:wrap}.\\[\\&\\>\\*\\>\\*\\>\\*\\.toolbarRight\\]\\:max-md\\:gap-y-2>*>*>*.toolbarRight{row-gap:.5rem}}.\\[\\&\\>\\*\\]\\:after\\:content-\\[\\'_\\/_\\'\\]>*:after{--tw-content: \" / \";content:var(--tw-content)}.\\[\\&\\>\\.v-tree-item\\]\\:hidden>.v-tree-item{display:none}.\\[\\&\\>\\.v-tree-item\\]\\:ltr\\:pl-6:where([dir=ltr],[dir=ltr] *)>.v-tree-item{padding-left:1.5rem}.\\[\\&\\>\\.v-tree-item\\]\\:rtl\\:pr-6:where([dir=rtl],[dir=rtl] *)>.v-tree-item{padding-right:1.5rem}.\\[\\&\\>\\:nth-child\\(3\\)\\]\\:\\!m-0>:nth-child(3){margin:0!important}.\\[\\&\\>\\:nth-child\\(3\\)\\]\\:\\!rounded-l-none>:nth-child(3){border-top-left-radius:0!important;border-bottom-left-radius:0!important}@media not all and (min-width: 525px){.\\[\\&\\>\\:nth-child\\(3\\)\\]\\:max-sm\\:\\!w-\\[80\\%\\]>:nth-child(3){width:80%!important}}.\\[\\&\\>div\\:last-child\\]\\:border-b-0>div:last-child{border-bottom-width:0px}.ltr\\:\\[\\&\\>span\\>i\\]\\:right-14>span>i:where([dir=ltr],[dir=ltr] *){right:3.5rem}.rtl\\:\\[\\&\\>span\\>i\\]\\:left-14>span>i:where([dir=rtl],[dir=rtl] *){left:3.5rem}\n"
  },
  {
    "path": "public/admin/build/assets/ar.es-CfdTYgcp.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"الإثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\",\"الأحد\"],n=[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\" ديسمبر\"],o=\"سنوات\",s=\"سنة\",e=\"شهر\",c=\"أسبوع\",a=\"يوم\",d=\"اليوم\",r=\"لا حدث\",y=\"طوال اليوم\",l=\"حذف\",M=\"إنشاء حدث\",Y=\"dddd D MMMM YYYY\",m={weekDays:t,months:n,years:o,year:s,month:e,week:c,day:a,today:d,noEvent:r,allDay:y,deleteEvent:l,createEvent:M,dateFormat:Y};export{y as allDay,M as createEvent,Y as dateFormat,a as day,m as default,l as deleteEvent,e as month,n as months,r as noEvent,d as today,c as week,t as weekDays,s as year,o as years};\n"
  },
  {
    "path": "public/admin/build/assets/bg.es-Ce0T19Qg.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"Понеделник\",\"Вторник\",\"Сряда\",\"Четвъртък\",\"Петък\",\"Събота\",\"Неделя\"],n=[\"Януари\",\"Февруари\",\"Март\",\"Април\",\"Май\",\"Юни\",\"Юли\",\"Август\",\"Септември\",\"Октомври\",\"Ноември\",\"Декември\"],o=\"Години\",s=\"Година\",e=\"Месец\",c=\"Седмица\",a=\"Ден\",d=\"Днес\",y=\"Няма събития\",r=\"Цял ден\",l=\"Изтрий\",M=\"Създай събитие\",Y=\"dddd D MMMM YYYY\",m={weekDays:t,months:n,years:o,year:s,month:e,week:c,day:a,today:d,noEvent:y,allDay:r,deleteEvent:l,createEvent:M,dateFormat:Y};export{r as allDay,M as createEvent,Y as dateFormat,a as day,m as default,l as deleteEvent,e as month,n as months,y as noEvent,d as today,c as week,t as weekDays,s as year,o as years};\n"
  },
  {
    "path": "public/admin/build/assets/bn.es-iWyup8_3.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"সোম\",\"মঙ্গল\",\"বুধ\",\"বৃহস্পতি\",\"শুক্র\",\"শনি\",\"রবি\"],n=[\"জানুয়ারি\",\"ফেব্ুয়ারী\",\"মার্চ\",\"এপ্রিল\",\"মে\",\"জুন\",\"জুলাই\",\"অগাস্ট\",\"সেপ্টেম্বর\",\"অক্টোবর\",\"নভেম্বর\",\"ডিসেম্বর\"],o=\"বছর\",s=\"বছর\",e=\"মাস\",c=\"সপ্তাহ\",a=\"দিন\",d=\"আজ\",y=\"কার্যসূচী\",r=\"সারাদিন\",l=\"মুছুন\",M=\"কার্যসূচী তৈরি করুন\",Y=\"dddd D MMMM YYYY\",m={weekDays:t,months:n,years:o,year:s,month:e,week:c,day:a,today:d,noEvent:y,allDay:r,deleteEvent:l,createEvent:M,dateFormat:Y};export{r as allDay,M as createEvent,Y as dateFormat,a as day,m as default,l as deleteEvent,e as month,n as months,y as noEvent,d as today,c as week,t as weekDays,s as year,o as years};\n"
  },
  {
    "path": "public/admin/build/assets/bs.es-Cz58hpHx.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const a=[\"Ponedjeljak\",\"Utorak\",\"Srijeda\",\"Četvrtak\",\"Petak\",\"Subota\",\"Nedjelja\"],e=[\"Januar\",\"Februar\",\"Mart\",\"April\",\"Maj\",\"Jun\",\"Jul\",\"Avgust\",\"Septembar\",\"Oktobar\",\"Novembar\",\"Decembar\"],t=\"Godine\",o=\"Godina\",n=\"Mjesec\",s=\"Sedmica\",r=\"Dan\",c=\"Danas\",d=\"Nema događaja\",j=\"Cijeli dan\",i=\"Obriši\",l=\"Kreiraj događaj\",b=\"dddd D MMMM YYYY\",m={weekDays:a,months:e,years:t,year:o,month:n,week:s,day:r,today:c,noEvent:d,allDay:j,deleteEvent:i,createEvent:l,dateFormat:b};export{j as allDay,l as createEvent,b as dateFormat,r as day,m as default,i as deleteEvent,n as month,e as months,d as noEvent,c as today,s as week,a as weekDays,o as year,t as years};\n"
  },
  {
    "path": "public/admin/build/assets/ca.es-CujU75Im.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Dilluns\",\"Dimarts\",\"Dimecres\",\"Dijous\",\"Divendres\",\"Dissabte\",\"Diumenge\"],t=[\"Dl\",\"Dt\",\"Dc\",\"Dj\",\"Dv\",\"Ds\",\"Dg\"],n=[\"Gener\",\"Febrer\",\"Març\",\"Abril\",\"Maig\",\"Juny\",\"Juliol\",\"Agost\",\"Setembre\",\"Octubre\",\"Novembre\",\"Desembre\"],s=\"Anys\",o=\"Any\",a=\"Mes\",r=\"Setmana\",c=\"Dia\",D=\"Avui\",i=\"No hi ha esdeveniments\",d=\"Tot el dia\",m=\"Eliminar\",l=\"Crear un esdeveniment\",y=\"dddd D MMMM YYYY\",u={weekDays:e,weekDaysShort:t,months:n,years:s,year:o,month:a,week:r,day:c,today:D,noEvent:i,allDay:d,deleteEvent:m,createEvent:l,dateFormat:y};export{d as allDay,l as createEvent,y as dateFormat,c as day,u as default,m as deleteEvent,a as month,n as months,i as noEvent,D as today,r as week,e as weekDays,t as weekDaysShort,o as year,s as years};\n"
  },
  {
    "path": "public/admin/build/assets/chart-D1u1Dgzh.js",
    "content": "var jr=Object.defineProperty;var $r=(ot,W,Nt)=>W in ot?jr(ot,W,{enumerable:!0,configurable:!0,writable:!0,value:Nt}):ot[W]=Nt;var Yr=(ot,W)=>()=>(W||ot((W={exports:{}}).exports,W),W.exports);var S=(ot,W,Nt)=>$r(ot,typeof W!=\"symbol\"?W+\"\":W,Nt);var Ur=Yr((la,Ds)=>{/*!\n * Chart.js v4.4.0\n * https://www.chartjs.org\n * (c) 2023 Chart.js Contributors\n * Released under the MIT License\n */(function(ot,W){typeof la==\"object\"&&typeof Ds<\"u\"?Ds.exports=W():typeof define==\"function\"&&define.amd?define(W):(ot=typeof globalThis<\"u\"?globalThis:ot||self).Chart=W()})(void 0,function(){var Ee,Re,Ie,_i,ze,Fe,le,Ve,Be,yi,vi;var ot=Object.freeze({__proto__:null,get Colors(){return Cr},get Decimation(){return Or},get Filler(){return zr},get Legend(){return Fr},get SubTitle(){return Br},get Title(){return Vr},get Tooltip(){return Hr}});function W(){}const Nt=(()=>{let i=0;return()=>i++})();function z(i){return i==null}function j(i){if(Array.isArray&&Array.isArray(i))return!0;const t=Object.prototype.toString.call(i);return t.slice(0,7)===\"[object\"&&t.slice(-6)===\"Array]\"}function I(i){return i!==null&&Object.prototype.toString.call(i)===\"[object Object]\"}function U(i){return(typeof i==\"number\"||i instanceof Number)&&isFinite(+i)}function et(i,t){return U(i)?i:t}function R(i,t){return i===void 0?t:i}const Cs=(i,t)=>typeof i==\"string\"&&i.endsWith(\"%\")?parseFloat(i)/100:+i/t,Mi=(i,t)=>typeof i==\"string\"&&i.endsWith(\"%\")?parseFloat(i)/100*t:+i;function N(i,t,e){if(i&&typeof i.call==\"function\")return i.apply(e,t)}function V(i,t,e,s){let n,o,a;if(j(i))if(o=i.length,s)for(n=o-1;n>=0;n--)t.call(e,i[n],n);else for(n=0;n<o;n++)t.call(e,i[n],n);else if(I(i))for(a=Object.keys(i),o=a.length,n=0;n<o;n++)t.call(e,i[a[n]],a[n])}function he(i,t){let e,s,n,o;if(!i||!t||i.length!==t.length)return!1;for(e=0,s=i.length;e<s;++e)if(n=i[e],o=t[e],n.datasetIndex!==o.datasetIndex||n.index!==o.index)return!1;return!0}function ce(i){if(j(i))return i.map(ce);if(I(i)){const t=Object.create(null),e=Object.keys(i),s=e.length;let n=0;for(;n<s;++n)t[e[n]]=ce(i[e[n]]);return t}return i}function Os(i){return[\"__proto__\",\"prototype\",\"constructor\"].indexOf(i)===-1}function As(i,t,e,s){if(!Os(i))return;const n=t[i],o=e[i];I(n)&&I(o)?Gt(n,o,s):t[i]=ce(o)}function Gt(i,t,e){const s=j(t)?t:[t],n=s.length;if(!I(i))return i;const o=(e=e||{}).merger||As;let a;for(let r=0;r<n;++r){if(a=s[r],!I(a))continue;const l=Object.keys(a);for(let h=0,d=l.length;h<d;++h)o(l[h],i,a,e)}return i}function Zt(i,t){return Gt(i,t,{merger:Ts})}function Ts(i,t,e){if(!Os(i))return;const s=t[i],n=e[i];I(s)&&I(n)?Zt(s,n):Object.prototype.hasOwnProperty.call(t,i)||(t[i]=ce(n))}const Ls={\"\":i=>i,x:i=>i.x,y:i=>i.y};function Es(i){const t=i.split(\".\"),e=[];let s=\"\";for(const n of t)s+=n,s.endsWith(\"\\\\\")?s=s.slice(0,-1)+\".\":(e.push(s),s=\"\");return e}function Mt(i,t){return(Ls[t]||(Ls[t]=function(s){const n=Es(s);return o=>{for(const a of n){if(a===\"\")break;o=o&&o[a]}return o}}(t)))(i)}function We(i){return i.charAt(0).toUpperCase()+i.slice(1)}const Qt=i=>i!==void 0,wt=i=>typeof i==\"function\",wi=(i,t)=>{if(i.size!==t.size)return!1;for(const e of i)if(!t.has(e))return!1;return!0};function Rs(i){return i.type===\"mouseup\"||i.type===\"click\"||i.type===\"contextmenu\"}const $=Math.PI,Y=2*$,Is=Y+$,de=Number.POSITIVE_INFINITY,zs=$/180,X=$/2,At=$/4,ki=2*$/3,kt=Math.log10,ft=Math.sign;function Jt(i,t,e){return Math.abs(i-t)<e}function Si(i){const t=Math.round(i);i=Jt(i,t,i/1e3)?t:i;const e=Math.pow(10,Math.floor(kt(i))),s=i/e;return(s<=1?1:s<=2?2:s<=5?5:10)*e}function Fs(i){const t=[],e=Math.sqrt(i);let s;for(s=1;s<e;s++)i%s==0&&(t.push(s),t.push(i/s));return e===(0|e)&&t.push(e),t.sort((n,o)=>n-o).pop(),t}function Ht(i){return!isNaN(parseFloat(i))&&isFinite(i)}function Vs(i,t){const e=Math.round(i);return e-t<=i&&e+t>=i}function Pi(i,t,e){let s,n,o;for(s=0,n=i.length;s<n;s++)o=i[s][e],isNaN(o)||(t.min=Math.min(t.min,o),t.max=Math.max(t.max,o))}function lt(i){return i*($/180)}function Ne(i){return i*(180/$)}function Di(i){if(!U(i))return;let t=1,e=0;for(;Math.round(i*t)/t!==i;)t*=10,e++;return e}function Ci(i,t){const e=t.x-i.x,s=t.y-i.y,n=Math.sqrt(e*e+s*s);let o=Math.atan2(s,e);return o<-.5*$&&(o+=Y),{angle:o,distance:n}}function He(i,t){return Math.sqrt(Math.pow(t.x-i.x,2)+Math.pow(t.y-i.y,2))}function Bs(i,t){return(i-t+Is)%Y-$}function it(i){return(i%Y+Y)%Y}function te(i,t,e,s){const n=it(i),o=it(t),a=it(e),r=it(o-n),l=it(a-n),h=it(n-o),d=it(n-a);return n===o||n===a||s&&o===a||r>l&&h<d}function G(i,t,e){return Math.max(t,Math.min(e,i))}function Ws(i){return G(i,-32768,32767)}function bt(i,t,e,s=1e-6){return i>=Math.min(t,e)-s&&i<=Math.max(t,e)+s}function je(i,t,e){e=e||(a=>i[a]<t);let s,n=i.length-1,o=0;for(;n-o>1;)s=o+n>>1,e(s)?o=s:n=s;return{lo:o,hi:n}}const xt=(i,t,e,s)=>je(i,e,s?n=>{const o=i[n][t];return o<e||o===e&&i[n+1][t]===e}:n=>i[n][t]<e),Ns=(i,t,e)=>je(i,e,s=>i[s][t]>=e);function Hs(i,t,e){let s=0,n=i.length;for(;s<n&&i[s]<t;)s++;for(;n>s&&i[n-1]>e;)n--;return s>0||n<i.length?i.slice(s,n):i}const js=[\"push\",\"pop\",\"shift\",\"splice\",\"unshift\"];function $s(i,t){i._chartjs?i._chartjs.listeners.push(t):(Object.defineProperty(i,\"_chartjs\",{configurable:!0,enumerable:!1,value:{listeners:[t]}}),js.forEach(e=>{const s=\"_onData\"+We(e),n=i[e];Object.defineProperty(i,e,{configurable:!0,enumerable:!1,value(...o){const a=n.apply(this,o);return i._chartjs.listeners.forEach(r=>{typeof r[s]==\"function\"&&r[s](...o)}),a}})}))}function Oi(i,t){const e=i._chartjs;if(!e)return;const s=e.listeners,n=s.indexOf(t);n!==-1&&s.splice(n,1),s.length>0||(js.forEach(o=>{delete i[o]}),delete i._chartjs)}function Ai(i){const t=new Set(i);return t.size===i.length?i:Array.from(t)}const Ti=typeof window>\"u\"?function(i){return i()}:window.requestAnimationFrame;function Li(i,t){let e=[],s=!1;return function(...n){e=n,s||(s=!0,Ti.call(window,()=>{s=!1,i.apply(t,e)}))}}function Ys(i,t){let e;return function(...s){return t?(clearTimeout(e),e=setTimeout(i,t,s)):i.apply(this,s),t}}const $e=i=>i===\"start\"?\"left\":i===\"end\"?\"right\":\"center\",Z=(i,t,e)=>i===\"start\"?t:i===\"end\"?e:(t+e)/2,Us=(i,t,e,s)=>i===(s?\"left\":\"right\")?e:i===\"center\"?(t+e)/2:t;function Ei(i,t,e){const s=t.length;let n=0,o=s;if(i._sorted){const{iScale:a,_parsed:r}=i,l=a.axis,{min:h,max:d,minDefined:c,maxDefined:u}=a.getUserBounds();c&&(n=G(Math.min(xt(r,l,h).lo,e?s:xt(t,l,a.getPixelForValue(h)).lo),0,s-1)),o=u?G(Math.max(xt(r,a.axis,d,!0).hi+1,e?0:xt(t,l,a.getPixelForValue(d),!0).hi+1),n,s)-n:s-n}return{start:n,count:o}}function Ri(i){const{xScale:t,yScale:e,_scaleRanges:s}=i,n={xmin:t.min,xmax:t.max,ymin:e.min,ymax:e.max};if(!s)return i._scaleRanges=n,!0;const o=s.xmin!==t.min||s.xmax!==t.max||s.ymin!==e.min||s.ymax!==e.max;return Object.assign(s,n),o}class ha{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,s,n){const o=e.listeners[n],a=e.duration;o.forEach(r=>r({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(s-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=Ti.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((s,n)=>{if(!s.running||!s.items.length)return;const o=s.items;let a,r=o.length-1,l=!1;for(;r>=0;--r)a=o[r],a._active?(a._total>s.duration&&(s.duration=a._total),a.tick(t),l=!0):(o[r]=o[o.length-1],o.pop());l&&(n.draw(),this._notify(n,s,t,\"progress\")),o.length||(s.running=!1,this._notify(n,s,t,\"complete\"),s.initial=!1),e+=o.length}),this._lastDate=t,e===0&&(this._running=!1)}_getAnims(t){const e=this._charts;let s=e.get(t);return s||(s={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,s)),s}listen(t,e,s){this._getAnims(t).listeners[e].push(s)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((s,n)=>Math.max(s,n._duration),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const s=e.items;let n=s.length-1;for(;n>=0;--n)s[n].cancel();e.items=[],this._notify(t,e,Date.now(),\"complete\")}remove(t){return this._charts.delete(t)}}var _t=new ha;/*!\n * @kurkle/color v0.3.2\n * https://github.com/kurkle/color#readme\n * (c) 2023 Jukka Kurkela\n * Released under the MIT License\n */function ue(i){return i+.5|0}const Tt=(i,t,e)=>Math.max(Math.min(i,e),t);function fe(i){return Tt(ue(2.55*i),0,255)}function Lt(i){return Tt(ue(255*i),0,255)}function St(i){return Tt(ue(i/2.55)/100,0,1)}function Xs(i){return Tt(ue(100*i),0,100)}const ht={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},Ii=[...\"0123456789ABCDEF\"],ca=i=>Ii[15&i],da=i=>Ii[(240&i)>>4]+Ii[15&i],Ye=i=>(240&i)>>4==(15&i);function ua(i){var t=(e=>Ye(e.r)&&Ye(e.g)&&Ye(e.b)&&Ye(e.a))(i)?ca:da;return i?\"#\"+t(i.r)+t(i.g)+t(i.b)+((e,s)=>e<255?s(e):\"\")(i.a,t):void 0}const fa=/^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;function qs(i,t,e){const s=t*Math.min(e,1-e),n=(o,a=(o+i/30)%12)=>e-s*Math.max(Math.min(a-3,9-a,1),-1);return[n(0),n(8),n(4)]}function ga(i,t,e){const s=(n,o=(n+i/60)%6)=>e-e*t*Math.max(Math.min(o,4-o,1),0);return[s(5),s(3),s(1)]}function pa(i,t,e){const s=qs(i,1,.5);let n;for(t+e>1&&(n=1/(t+e),t*=n,e*=n),n=0;n<3;n++)s[n]*=1-t-e,s[n]+=t;return s}function zi(i){const t=i.r/255,e=i.g/255,s=i.b/255,n=Math.max(t,e,s),o=Math.min(t,e,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=function(d,c,u,f,p){return d===p?(c-u)/f+(c<u?6:0):c===p?(u-d)/f+2:(d-c)/f+4}(t,e,s,h,n),r=60*r+.5),[0|r,l||0,a]}function Fi(i,t,e,s){return(Array.isArray(t)?i(t[0],t[1],t[2]):i(t,e,s)).map(Lt)}function Vi(i,t,e){return Fi(qs,i,t,e)}function Ks(i){return(i%360+360)%360}function ma(i){const t=fa.exec(i);let e,s=255;if(!t)return;t[5]!==e&&(s=t[6]?fe(+t[5]):Lt(+t[5]));const n=Ks(+t[2]),o=+t[3]/100,a=+t[4]/100;return e=t[1]===\"hwb\"?function(r,l,h){return Fi(pa,r,l,h)}(n,o,a):t[1]===\"hsv\"?function(r,l,h){return Fi(ga,r,l,h)}(n,o,a):Vi(n,o,a),{r:e[0],g:e[1],b:e[2],a:s}}const Gs={x:\"dark\",Z:\"light\",Y:\"re\",X:\"blu\",W:\"gr\",V:\"medium\",U:\"slate\",A:\"ee\",T:\"ol\",S:\"or\",B:\"ra\",C:\"lateg\",D:\"ights\",R:\"in\",Q:\"turquois\",E:\"hi\",P:\"ro\",O:\"al\",N:\"le\",M:\"de\",L:\"yello\",F:\"en\",K:\"ch\",G:\"arks\",H:\"ea\",I:\"ightg\",J:\"wh\"},Zs={OiceXe:\"f0f8ff\",antiquewEte:\"faebd7\",aqua:\"ffff\",aquamarRe:\"7fffd4\",azuY:\"f0ffff\",beige:\"f5f5dc\",bisque:\"ffe4c4\",black:\"0\",blanKedOmond:\"ffebcd\",Xe:\"ff\",XeviTet:\"8a2be2\",bPwn:\"a52a2a\",burlywood:\"deb887\",caMtXe:\"5f9ea0\",KartYuse:\"7fff00\",KocTate:\"d2691e\",cSO:\"ff7f50\",cSnflowerXe:\"6495ed\",cSnsilk:\"fff8dc\",crimson:\"dc143c\",cyan:\"ffff\",xXe:\"8b\",xcyan:\"8b8b\",xgTMnPd:\"b8860b\",xWay:\"a9a9a9\",xgYF:\"6400\",xgYy:\"a9a9a9\",xkhaki:\"bdb76b\",xmagFta:\"8b008b\",xTivegYF:\"556b2f\",xSange:\"ff8c00\",xScEd:\"9932cc\",xYd:\"8b0000\",xsOmon:\"e9967a\",xsHgYF:\"8fbc8f\",xUXe:\"483d8b\",xUWay:\"2f4f4f\",xUgYy:\"2f4f4f\",xQe:\"ced1\",xviTet:\"9400d3\",dAppRk:\"ff1493\",dApskyXe:\"bfff\",dimWay:\"696969\",dimgYy:\"696969\",dodgerXe:\"1e90ff\",fiYbrick:\"b22222\",flSOwEte:\"fffaf0\",foYstWAn:\"228b22\",fuKsia:\"ff00ff\",gaRsbSo:\"dcdcdc\",ghostwEte:\"f8f8ff\",gTd:\"ffd700\",gTMnPd:\"daa520\",Way:\"808080\",gYF:\"8000\",gYFLw:\"adff2f\",gYy:\"808080\",honeyMw:\"f0fff0\",hotpRk:\"ff69b4\",RdianYd:\"cd5c5c\",Rdigo:\"4b0082\",ivSy:\"fffff0\",khaki:\"f0e68c\",lavFMr:\"e6e6fa\",lavFMrXsh:\"fff0f5\",lawngYF:\"7cfc00\",NmoncEffon:\"fffacd\",ZXe:\"add8e6\",ZcSO:\"f08080\",Zcyan:\"e0ffff\",ZgTMnPdLw:\"fafad2\",ZWay:\"d3d3d3\",ZgYF:\"90ee90\",ZgYy:\"d3d3d3\",ZpRk:\"ffb6c1\",ZsOmon:\"ffa07a\",ZsHgYF:\"20b2aa\",ZskyXe:\"87cefa\",ZUWay:\"778899\",ZUgYy:\"778899\",ZstAlXe:\"b0c4de\",ZLw:\"ffffe0\",lime:\"ff00\",limegYF:\"32cd32\",lRF:\"faf0e6\",magFta:\"ff00ff\",maPon:\"800000\",VaquamarRe:\"66cdaa\",VXe:\"cd\",VScEd:\"ba55d3\",VpurpN:\"9370db\",VsHgYF:\"3cb371\",VUXe:\"7b68ee\",VsprRggYF:\"fa9a\",VQe:\"48d1cc\",VviTetYd:\"c71585\",midnightXe:\"191970\",mRtcYam:\"f5fffa\",mistyPse:\"ffe4e1\",moccasR:\"ffe4b5\",navajowEte:\"ffdead\",navy:\"80\",Tdlace:\"fdf5e6\",Tive:\"808000\",TivedBb:\"6b8e23\",Sange:\"ffa500\",SangeYd:\"ff4500\",ScEd:\"da70d6\",pOegTMnPd:\"eee8aa\",pOegYF:\"98fb98\",pOeQe:\"afeeee\",pOeviTetYd:\"db7093\",papayawEp:\"ffefd5\",pHKpuff:\"ffdab9\",peru:\"cd853f\",pRk:\"ffc0cb\",plum:\"dda0dd\",powMrXe:\"b0e0e6\",purpN:\"800080\",YbeccapurpN:\"663399\",Yd:\"ff0000\",Psybrown:\"bc8f8f\",PyOXe:\"4169e1\",saddNbPwn:\"8b4513\",sOmon:\"fa8072\",sandybPwn:\"f4a460\",sHgYF:\"2e8b57\",sHshell:\"fff5ee\",siFna:\"a0522d\",silver:\"c0c0c0\",skyXe:\"87ceeb\",UXe:\"6a5acd\",UWay:\"708090\",UgYy:\"708090\",snow:\"fffafa\",sprRggYF:\"ff7f\",stAlXe:\"4682b4\",tan:\"d2b48c\",teO:\"8080\",tEstN:\"d8bfd8\",tomato:\"ff6347\",Qe:\"40e0d0\",viTet:\"ee82ee\",JHt:\"f5deb3\",wEte:\"ffffff\",wEtesmoke:\"f5f5f5\",Lw:\"ffff00\",LwgYF:\"9acd32\"};let Ue;function ba(i){Ue||(Ue=function(){const e={},s=Object.keys(Zs),n=Object.keys(Gs);let o,a,r,l,h;for(o=0;o<s.length;o++){for(l=h=s[o],a=0;a<n.length;a++)r=n[a],h=h.replace(r,Gs[r]);r=parseInt(Zs[l],16),e[h]=[r>>16&255,r>>8&255,255&r]}return e}(),Ue.transparent=[0,0,0,0]);const t=Ue[i.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}const xa=/^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/,Bi=i=>i<=.0031308?12.92*i:1.055*Math.pow(i,1/2.4)-.055,ee=i=>i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4);function Xe(i,t,e){if(i){let s=zi(i);s[t]=Math.max(0,Math.min(s[t]+s[t]*e,t===0?360:1)),s=Vi(s),i.r=s[0],i.g=s[1],i.b=s[2]}}function Qs(i,t){return i&&Object.assign(t||{},i)}function Js(i){var t={r:0,g:0,b:0,a:255};return Array.isArray(i)?i.length>=3&&(t={r:i[0],g:i[1],b:i[2],a:255},i.length>3&&(t.a=Lt(i[3]))):(t=Qs(i,{r:0,g:0,b:0,a:1})).a=Lt(t.a),t}function _a(i){return i.charAt(0)===\"r\"?function(t){const e=xa.exec(t);let s,n,o,a=255;if(e){if(e[7]!==s){const r=+e[7];a=e[8]?fe(r):Tt(255*r,0,255)}return s=+e[1],n=+e[3],o=+e[5],s=255&(e[2]?fe(s):Tt(s,0,255)),n=255&(e[4]?fe(n):Tt(n,0,255)),o=255&(e[6]?fe(o):Tt(o,0,255)),{r:s,g:n,b:o,a}}}(i):ma(i)}class ge{constructor(t){if(t instanceof ge)return t;const e=typeof t;let s;var n,o,a;e===\"object\"?s=Js(t):e===\"string\"&&(a=(n=t).length,n[0]===\"#\"&&(a===4||a===5?o={r:255&17*ht[n[1]],g:255&17*ht[n[2]],b:255&17*ht[n[3]],a:a===5?17*ht[n[4]]:255}:a!==7&&a!==9||(o={r:ht[n[1]]<<4|ht[n[2]],g:ht[n[3]]<<4|ht[n[4]],b:ht[n[5]]<<4|ht[n[6]],a:a===9?ht[n[7]]<<4|ht[n[8]]:255})),s=o||ba(t)||_a(t)),this._rgb=s,this._valid=!!s}get valid(){return this._valid}get rgb(){var t=Qs(this._rgb);return t&&(t.a=St(t.a)),t}set rgb(t){this._rgb=Js(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${St(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):void 0;var t}hexString(){return this._valid?ua(this._rgb):void 0}hslString(){return this._valid?function(t){if(!t)return;const e=zi(t),s=e[0],n=Xs(e[1]),o=Xs(e[2]);return t.a<255?`hsla(${s}, ${n}%, ${o}%, ${St(t.a)})`:`hsl(${s}, ${n}%, ${o}%)`}(this._rgb):void 0}mix(t,e){if(t){const s=this.rgb,n=t.rgb;let o;const a=e===o?.5:e,r=2*a-1,l=s.a-n.a,h=((r*l==-1?r:(r+l)/(1+r*l))+1)/2;o=1-h,s.r=255&h*s.r+o*n.r+.5,s.g=255&h*s.g+o*n.g+.5,s.b=255&h*s.b+o*n.b+.5,s.a=a*s.a+(1-a)*n.a,this.rgb=s}return this}interpolate(t,e){return t&&(this._rgb=function(s,n,o){const a=ee(St(s.r)),r=ee(St(s.g)),l=ee(St(s.b));return{r:Lt(Bi(a+o*(ee(St(n.r))-a))),g:Lt(Bi(r+o*(ee(St(n.g))-r))),b:Lt(Bi(l+o*(ee(St(n.b))-l))),a:s.a+o*(n.a-s.a)}}(this._rgb,t._rgb,e)),this}clone(){return new ge(this.rgb)}alpha(t){return this._rgb.a=Lt(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=ue(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Xe(this._rgb,2,t),this}darken(t){return Xe(this._rgb,2,-t),this}saturate(t){return Xe(this._rgb,1,t),this}desaturate(t){return Xe(this._rgb,1,-t),this}rotate(t){return function(e,s){var n=zi(e);n[0]=Ks(n[0]+s),n=Vi(n),e.r=n[0],e.g=n[1],e.b=n[2]}(this._rgb,t),this}}function qe(i){if(i&&typeof i==\"object\"){const t=i.toString();return t===\"[object CanvasPattern]\"||t===\"[object CanvasGradient]\"}return!1}function Wi(i){return qe(i)?i:new ge(i)}function Ke(i){return qe(i)?i:new ge(i).saturate(.5).darken(.1).hexString()}const ya=[\"x\",\"y\",\"borderWidth\",\"radius\",\"tension\"],va=[\"color\",\"borderColor\",\"backgroundColor\"],tn=new Map;function ie(i,t,e){return function(s,n){n=n||{};const o=s+JSON.stringify(n);let a=tn.get(o);return a||(a=new Intl.NumberFormat(s,n),tn.set(o,a)),a}(t,e).format(i)}const en={values:i=>j(i)?i:\"\"+i,numeric(i,t,e){if(i===0)return\"0\";const s=this.chart.options.locale;let n,o=i;if(e.length>1){const h=Math.max(Math.abs(e[0].value),Math.abs(e[e.length-1].value));(h<1e-4||h>1e15)&&(n=\"scientific\"),o=function(d,c){let u=c.length>3?c[2].value-c[1].value:c[1].value-c[0].value;return Math.abs(u)>=1&&d!==Math.floor(d)&&(u=d-Math.floor(d)),u}(i,e)}const a=kt(Math.abs(o)),r=isNaN(a)?1:Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),ie(i,s,l)},logarithmic(i,t,e){if(i===0)return\"0\";const s=e[t].significand||i/Math.pow(10,Math.floor(kt(i)));return[1,2,3,5,10,15].includes(s)||t>.8*e.length?en.numeric.call(this,i,t,e):\"\"}};var pe={formatters:en};const jt=Object.create(null),Ni=Object.create(null);function me(i,t){if(!t)return i;const e=t.split(\".\");for(let s=0,n=e.length;s<n;++s){const o=e[s];i=i[o]||(i[o]=Object.create(null))}return i}function Hi(i,t,e){return typeof t==\"string\"?Gt(me(i,t),e):Gt(me(i,\"\"),t)}class Ma{constructor(t,e){this.animation=void 0,this.backgroundColor=\"rgba(0,0,0,0.1)\",this.borderColor=\"rgba(0,0,0,0.1)\",this.color=\"#666\",this.datasets={},this.devicePixelRatio=s=>s.chart.platform.getDevicePixelRatio(),this.elements={},this.events=[\"mousemove\",\"mouseout\",\"click\",\"touchstart\",\"touchmove\"],this.font={family:\"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",size:12,style:\"normal\",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(s,n)=>Ke(n.backgroundColor),this.hoverBorderColor=(s,n)=>Ke(n.borderColor),this.hoverColor=(s,n)=>Ke(n.color),this.indexAxis=\"x\",this.interaction={mode:\"nearest\",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return Hi(this,t,e)}get(t){return me(this,t)}describe(t,e){return Hi(Ni,t,e)}override(t,e){return Hi(jt,t,e)}route(t,e,s,n){const o=me(this,t),a=me(this,s),r=\"_\"+e;Object.defineProperties(o,{[r]:{value:o[e],writable:!0},[e]:{enumerable:!0,get(){const l=this[r],h=a[n];return I(l)?Object.assign({},h,l):R(l,h)},set(l){this[r]=l}}})}apply(t){t.forEach(e=>e(this))}}var q=new Ma({_scriptable:i=>!i.startsWith(\"on\"),_indexable:i=>i!==\"events\",hover:{_fallback:\"interaction\"},interaction:{_scriptable:!1,_indexable:!1}},[function(i){i.set(\"animation\",{delay:void 0,duration:1e3,easing:\"easeOutQuart\",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),i.describe(\"animation\",{_fallback:!1,_indexable:!1,_scriptable:t=>t!==\"onProgress\"&&t!==\"onComplete\"&&t!==\"fn\"}),i.set(\"animations\",{colors:{type:\"color\",properties:va},numbers:{type:\"number\",properties:ya}}),i.describe(\"animations\",{_fallback:\"animation\"}),i.set(\"transitions\",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:\"transparent\"},visible:{type:\"boolean\",duration:0}}},hide:{animations:{colors:{to:\"transparent\"},visible:{type:\"boolean\",easing:\"linear\",fn:t=>0|t}}}})},function(i){i.set(\"layout\",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(i){i.set(\"scale\",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:\"ticks\",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:\"\",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:\"\",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:pe.formatters.values,minor:{},major:{},align:\"center\",crossAlign:\"near\",showLabelBackdrop:!1,backdropColor:\"rgba(255, 255, 255, 0.75)\",backdropPadding:2}}),i.route(\"scale.ticks\",\"color\",\"\",\"color\"),i.route(\"scale.grid\",\"color\",\"\",\"borderColor\"),i.route(\"scale.border\",\"color\",\"\",\"borderColor\"),i.route(\"scale.title\",\"color\",\"\",\"color\"),i.describe(\"scale\",{_fallback:!1,_scriptable:t=>!t.startsWith(\"before\")&&!t.startsWith(\"after\")&&t!==\"callback\"&&t!==\"parser\",_indexable:t=>t!==\"borderDash\"&&t!==\"tickBorderDash\"&&t!==\"dash\"}),i.describe(\"scales\",{_fallback:\"scale\"}),i.describe(\"scale.ticks\",{_scriptable:t=>t!==\"backdropPadding\"&&t!==\"callback\",_indexable:t=>t!==\"backdropPadding\"})}]);function ji(){return typeof window<\"u\"&&typeof document<\"u\"}function Ge(i){let t=i.parentNode;return t&&t.toString()===\"[object ShadowRoot]\"&&(t=t.host),t}function Ze(i,t,e){let s;return typeof i==\"string\"?(s=parseInt(i,10),i.indexOf(\"%\")!==-1&&(s=s/100*t.parentNode[e])):s=i,s}const Qe=i=>i.ownerDocument.defaultView.getComputedStyle(i,null);function sn(i,t){return Qe(i).getPropertyValue(t)}const wa=[\"top\",\"right\",\"bottom\",\"left\"];function $t(i,t,e){const s={};e=e?\"-\"+e:\"\";for(let n=0;n<4;n++){const o=wa[n];s[o]=parseFloat(i[t+\"-\"+o+e])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}const ka=(i,t,e)=>(i>0||t>0)&&(!e||!e.shadowRoot);function Et(i,t){if(\"native\"in i)return i;const{canvas:e,currentDevicePixelRatio:s}=t,n=Qe(e),o=n.boxSizing===\"border-box\",a=$t(n,\"padding\"),r=$t(n,\"border\",\"width\"),{x:l,y:h,box:d}=function(g,m){const b=g.touches,_=b&&b.length?b[0]:g,{offsetX:y,offsetY:x}=_;let v,M,w=!1;if(ka(y,x,g.target))v=y,M=x;else{const k=m.getBoundingClientRect();v=_.clientX-k.left,M=_.clientY-k.top,w=!0}return{x:v,y:M,box:w}}(i,e),c=a.left+(d&&r.left),u=a.top+(d&&r.top);let{width:f,height:p}=t;return o&&(f-=a.width+r.width,p-=a.height+r.height),{x:Math.round((l-c)/f*e.width/s),y:Math.round((h-u)/p*e.height/s)}}const Je=i=>Math.round(10*i)/10;function nn(i,t,e,s){const n=Qe(i),o=$t(n,\"margin\"),a=Ze(n.maxWidth,i,\"clientWidth\")||de,r=Ze(n.maxHeight,i,\"clientHeight\")||de,l=function(c,u,f){let p,g;if(u===void 0||f===void 0){const m=Ge(c);if(m){const b=m.getBoundingClientRect(),_=Qe(m),y=$t(_,\"border\",\"width\"),x=$t(_,\"padding\");u=b.width-x.width-y.width,f=b.height-x.height-y.height,p=Ze(_.maxWidth,m,\"clientWidth\"),g=Ze(_.maxHeight,m,\"clientHeight\")}else u=c.clientWidth,f=c.clientHeight}return{width:u,height:f,maxWidth:p||de,maxHeight:g||de}}(i,t,e);let{width:h,height:d}=l;if(n.boxSizing===\"content-box\"){const c=$t(n,\"border\",\"width\"),u=$t(n,\"padding\");h-=u.width+c.width,d-=u.height+c.height}return h=Math.max(0,h-o.width),d=Math.max(0,s?h/s:d-o.height),h=Je(Math.min(h,a,l.maxWidth)),d=Je(Math.min(d,r,l.maxHeight)),h&&!d&&(d=Je(h/2)),(t!==void 0||e!==void 0)&&s&&l.height&&d>l.height&&(d=l.height,h=Je(Math.floor(d*s))),{width:h,height:d}}function $i(i,t,e){const s=t||1,n=Math.floor(i.height*s),o=Math.floor(i.width*s);i.height=Math.floor(i.height),i.width=Math.floor(i.width);const a=i.canvas;return a.style&&(e||!a.style.height&&!a.style.width)&&(a.style.height=`${i.height}px`,a.style.width=`${i.width}px`),(i.currentDevicePixelRatio!==s||a.height!==n||a.width!==o)&&(i.currentDevicePixelRatio=s,a.height=n,a.width=o,i.ctx.setTransform(s,0,0,s,0,0),!0)}const on=function(){let i=!1;try{const t={get passive(){return i=!0,!1}};window.addEventListener(\"test\",null,t),window.removeEventListener(\"test\",null,t)}catch{}return i}();function Yi(i,t){const e=sn(i,t),s=e&&e.match(/^(\\d+)(\\.\\d+)?px$/);return s?+s[1]:void 0}function an(i){return!i||z(i.size)||z(i.family)?null:(i.style?i.style+\" \":\"\")+(i.weight?i.weight+\" \":\"\")+i.size+\"px \"+i.family}function be(i,t,e,s,n){let o=t[n];return o||(o=t[n]=i.measureText(n).width,e.push(n)),o>s&&(s=o),s}function rn(i,t,e,s){let n=(s=s||{}).data=s.data||{},o=s.garbageCollect=s.garbageCollect||[];s.font!==t&&(n=s.data={},o=s.garbageCollect=[],s.font=t),i.save(),i.font=t;let a=0;const r=e.length;let l,h,d,c,u;for(l=0;l<r;l++)if(c=e[l],c==null||j(c)){if(j(c))for(h=0,d=c.length;h<d;h++)u=c[h],u==null||j(u)||(a=be(i,n,o,a,u))}else a=be(i,n,o,a,c);i.restore();const f=o.length/2;if(f>e.length){for(l=0;l<f;l++)delete n[o[l]];o.splice(0,f)}return a}function Rt(i,t,e){const s=i.currentDevicePixelRatio,n=e!==0?Math.max(e/2,.5):0;return Math.round((t-n)*s)/s+n}function Ui(i,t){(t=t||i.getContext(\"2d\")).save(),t.resetTransform(),t.clearRect(0,0,i.width,i.height),t.restore()}function ti(i,t,e,s){Xi(i,t,e,s,null)}function Xi(i,t,e,s,n){let o,a,r,l,h,d,c,u;const f=t.pointStyle,p=t.rotation,g=t.radius;let m=(p||0)*zs;if(f&&typeof f==\"object\"&&(o=f.toString(),o===\"[object HTMLImageElement]\"||o===\"[object HTMLCanvasElement]\"))return i.save(),i.translate(e,s),i.rotate(m),i.drawImage(f,-f.width/2,-f.height/2,f.width,f.height),void i.restore();if(!(isNaN(g)||g<=0)){switch(i.beginPath(),f){default:n?i.ellipse(e,s,n/2,g,0,0,Y):i.arc(e,s,g,0,Y),i.closePath();break;case\"triangle\":d=n?n/2:g,i.moveTo(e+Math.sin(m)*d,s-Math.cos(m)*g),m+=ki,i.lineTo(e+Math.sin(m)*d,s-Math.cos(m)*g),m+=ki,i.lineTo(e+Math.sin(m)*d,s-Math.cos(m)*g),i.closePath();break;case\"rectRounded\":h=.516*g,l=g-h,a=Math.cos(m+At)*l,c=Math.cos(m+At)*(n?n/2-h:l),r=Math.sin(m+At)*l,u=Math.sin(m+At)*(n?n/2-h:l),i.arc(e-c,s-r,h,m-$,m-X),i.arc(e+u,s-a,h,m-X,m),i.arc(e+c,s+r,h,m,m+X),i.arc(e-u,s+a,h,m+X,m+$),i.closePath();break;case\"rect\":if(!p){l=Math.SQRT1_2*g,d=n?n/2:l,i.rect(e-d,s-l,2*d,2*l);break}m+=At;case\"rectRot\":c=Math.cos(m)*(n?n/2:g),a=Math.cos(m)*g,r=Math.sin(m)*g,u=Math.sin(m)*(n?n/2:g),i.moveTo(e-c,s-r),i.lineTo(e+u,s-a),i.lineTo(e+c,s+r),i.lineTo(e-u,s+a),i.closePath();break;case\"crossRot\":m+=At;case\"cross\":c=Math.cos(m)*(n?n/2:g),a=Math.cos(m)*g,r=Math.sin(m)*g,u=Math.sin(m)*(n?n/2:g),i.moveTo(e-c,s-r),i.lineTo(e+c,s+r),i.moveTo(e+u,s-a),i.lineTo(e-u,s+a);break;case\"star\":c=Math.cos(m)*(n?n/2:g),a=Math.cos(m)*g,r=Math.sin(m)*g,u=Math.sin(m)*(n?n/2:g),i.moveTo(e-c,s-r),i.lineTo(e+c,s+r),i.moveTo(e+u,s-a),i.lineTo(e-u,s+a),m+=At,c=Math.cos(m)*(n?n/2:g),a=Math.cos(m)*g,r=Math.sin(m)*g,u=Math.sin(m)*(n?n/2:g),i.moveTo(e-c,s-r),i.lineTo(e+c,s+r),i.moveTo(e+u,s-a),i.lineTo(e-u,s+a);break;case\"line\":a=n?n/2:Math.cos(m)*g,r=Math.sin(m)*g,i.moveTo(e-a,s-r),i.lineTo(e+a,s+r);break;case\"dash\":i.moveTo(e,s),i.lineTo(e+Math.cos(m)*(n?n/2:g),s+Math.sin(m)*g);break;case!1:i.closePath()}i.fill(),t.borderWidth>0&&i.stroke()}}function yt(i,t,e){return e=e||.5,!t||i&&i.x>t.left-e&&i.x<t.right+e&&i.y>t.top-e&&i.y<t.bottom+e}function xe(i,t){i.save(),i.beginPath(),i.rect(t.left,t.top,t.right-t.left,t.bottom-t.top),i.clip()}function _e(i){i.restore()}function ln(i,t,e,s,n){if(!t)return i.lineTo(e.x,e.y);if(n===\"middle\"){const o=(t.x+e.x)/2;i.lineTo(o,t.y),i.lineTo(o,e.y)}else n===\"after\"!=!!s?i.lineTo(t.x,e.y):i.lineTo(e.x,t.y);i.lineTo(e.x,e.y)}function hn(i,t,e,s){if(!t)return i.lineTo(e.x,e.y);i.bezierCurveTo(s?t.cp1x:t.cp2x,s?t.cp1y:t.cp2y,s?e.cp2x:e.cp1x,s?e.cp2y:e.cp1y,e.x,e.y)}function Sa(i,t,e,s,n){if(n.strikethrough||n.underline){const o=i.measureText(s),a=t-o.actualBoundingBoxLeft,r=t+o.actualBoundingBoxRight,l=e-o.actualBoundingBoxAscent,h=e+o.actualBoundingBoxDescent,d=n.strikethrough?(l+h)/2:h;i.strokeStyle=i.fillStyle,i.beginPath(),i.lineWidth=n.decorationWidth||2,i.moveTo(a,d),i.lineTo(r,d),i.stroke()}}function Pa(i,t){const e=i.fillStyle;i.fillStyle=t.color,i.fillRect(t.left,t.top,t.width,t.height),i.fillStyle=e}function It(i,t,e,s,n,o={}){const a=j(t)?t:[t],r=o.strokeWidth>0&&o.strokeColor!==\"\";let l,h;for(i.save(),i.font=n.string,function(d,c){c.translation&&d.translate(c.translation[0],c.translation[1]),z(c.rotation)||d.rotate(c.rotation),c.color&&(d.fillStyle=c.color),c.textAlign&&(d.textAlign=c.textAlign),c.textBaseline&&(d.textBaseline=c.textBaseline)}(i,o),l=0;l<a.length;++l)h=a[l],o.backdrop&&Pa(i,o.backdrop),r&&(o.strokeColor&&(i.strokeStyle=o.strokeColor),z(o.strokeWidth)||(i.lineWidth=o.strokeWidth),i.strokeText(h,e,s,o.maxWidth)),i.fillText(h,e,s,o.maxWidth),Sa(i,e,s,h,o),s+=Number(n.lineHeight);i.restore()}function se(i,t){const{x:e,y:s,w:n,h:o,radius:a}=t;i.arc(e+a.topLeft,s+a.topLeft,a.topLeft,1.5*$,$,!0),i.lineTo(e,s+o-a.bottomLeft),i.arc(e+a.bottomLeft,s+o-a.bottomLeft,a.bottomLeft,$,X,!0),i.lineTo(e+n-a.bottomRight,s+o),i.arc(e+n-a.bottomRight,s+o-a.bottomRight,a.bottomRight,X,0,!0),i.lineTo(e+n,s+a.topRight),i.arc(e+n-a.topRight,s+a.topRight,a.topRight,0,-X,!0),i.lineTo(e+a.topLeft,s)}function ei(i,t=[\"\"],e,s,n=()=>i[0]){const o=e||i;s===void 0&&(s=fn(\"_fallback\",i));const a={[Symbol.toStringTag]:\"Object\",_cacheable:!0,_scopes:i,_rootScopes:o,_fallback:s,_getTarget:n,override:r=>ei([r,...i],t,o,s)};return new Proxy(a,{deleteProperty:(r,l)=>(delete r[l],delete r._keys,delete i[0][l],!0),get:(r,l)=>cn(r,l,()=>function(h,d,c,u){let f;for(const p of d)if(f=fn(Da(p,h),c),f!==void 0)return Ki(h,f)?Gi(c,u,h,f):f}(l,t,i,r)),getOwnPropertyDescriptor:(r,l)=>Reflect.getOwnPropertyDescriptor(r._scopes[0],l),getPrototypeOf:()=>Reflect.getPrototypeOf(i[0]),has:(r,l)=>gn(r).includes(l),ownKeys:r=>gn(r),set(r,l,h){const d=r._storage||(r._storage=n());return r[l]=d[l]=h,delete r._keys,!0}})}function Yt(i,t,e,s){const n={_cacheable:!1,_proxy:i,_context:t,_subProxy:e,_stack:new Set,_descriptors:qi(i,s),setContext:o=>Yt(i,o,e,s),override:o=>Yt(i.override(o),t,e,s)};return new Proxy(n,{deleteProperty:(o,a)=>(delete o[a],delete i[a],!0),get:(o,a,r)=>cn(o,a,()=>function(l,h,d){const{_proxy:c,_context:u,_subProxy:f,_descriptors:p}=l;let g=c[h];return wt(g)&&p.isScriptable(h)&&(g=function(m,b,_,y){const{_proxy:x,_context:v,_subProxy:M,_stack:w}=_;if(w.has(m))throw new Error(\"Recursion detected: \"+Array.from(w).join(\"->\")+\"->\"+m);w.add(m);let k=b(v,M||y);return w.delete(m),Ki(m,k)&&(k=Gi(x._scopes,x,m,k)),k}(h,g,l,d)),j(g)&&g.length&&(g=function(m,b,_,y){const{_proxy:x,_context:v,_subProxy:M,_descriptors:w}=_;if(v.index!==void 0&&y(m))return b[v.index%b.length];if(I(b[0])){const k=b,C=x._scopes.filter(P=>P!==k);b=[];for(const P of k){const L=Gi(C,x,m,P);b.push(Yt(L,v,M&&M[m],w))}}return b}(h,g,l,p.isIndexable)),Ki(h,g)&&(g=Yt(g,u,f&&f[h],p)),g}(o,a,r)),getOwnPropertyDescriptor:(o,a)=>o._descriptors.allKeys?Reflect.has(i,a)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(i,a),getPrototypeOf:()=>Reflect.getPrototypeOf(i),has:(o,a)=>Reflect.has(i,a),ownKeys:()=>Reflect.ownKeys(i),set:(o,a,r)=>(i[a]=r,delete o[a],!0)})}function qi(i,t={scriptable:!0,indexable:!0}){const{_scriptable:e=t.scriptable,_indexable:s=t.indexable,_allKeys:n=t.allKeys}=i;return{allKeys:n,scriptable:e,indexable:s,isScriptable:wt(e)?e:()=>e,isIndexable:wt(s)?s:()=>s}}const Da=(i,t)=>i?i+We(t):t,Ki=(i,t)=>I(t)&&i!==\"adapters\"&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function cn(i,t,e){if(Object.prototype.hasOwnProperty.call(i,t))return i[t];const s=e();return i[t]=s,s}function dn(i,t,e){return wt(i)?i(t,e):i}const Ca=(i,t)=>i===!0?t:typeof i==\"string\"?Mt(t,i):void 0;function Oa(i,t,e,s,n){for(const o of t){const a=Ca(e,o);if(a){i.add(a);const r=dn(a._fallback,e,n);if(r!==void 0&&r!==e&&r!==s)return r}else if(a===!1&&s!==void 0&&e!==s)return null}return!1}function Gi(i,t,e,s){const n=t._rootScopes,o=dn(t._fallback,e,s),a=[...i,...n],r=new Set;r.add(s);let l=un(r,a,e,o||e,s);return l!==null&&(o===void 0||o===e||(l=un(r,a,o,l,s),l!==null))&&ei(Array.from(r),[\"\"],n,o,()=>function(h,d,c){const u=h._getTarget();d in u||(u[d]={});const f=u[d];return j(f)&&I(c)?c:f||{}}(t,e,s))}function un(i,t,e,s,n){for(;e;)e=Oa(i,t,e,s,n);return e}function fn(i,t){for(const e of t){if(!e)continue;const s=e[i];if(s!==void 0)return s}}function gn(i){let t=i._keys;return t||(t=i._keys=function(e){const s=new Set;for(const n of e)for(const o of Object.keys(n).filter(a=>!a.startsWith(\"_\")))s.add(o);return Array.from(s)}(i._scopes)),t}function Zi(i,t,e,s){const{iScale:n}=i,{key:o=\"r\"}=this._parsing,a=new Array(s);let r,l,h,d;for(r=0,l=s;r<l;++r)h=r+e,d=t[h],a[r]={r:n.parse(Mt(d,o),h)};return a}const Aa=Number.EPSILON||1e-14,ne=(i,t)=>t<i.length&&!i[t].skip&&i[t],pn=i=>i===\"x\"?\"y\":\"x\";function mn(i,t,e,s){const n=i.skip?t:i,o=t,a=e.skip?t:e,r=He(o,n),l=He(a,o);let h=r/(r+l),d=l/(r+l);h=isNaN(h)?0:h,d=isNaN(d)?0:d;const c=s*h,u=s*d;return{previous:{x:o.x-c*(a.x-n.x),y:o.y-c*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function bn(i,t=\"x\"){const e=pn(t),s=i.length,n=Array(s).fill(0),o=Array(s);let a,r,l,h=ne(i,0);for(a=0;a<s;++a)if(r=l,l=h,h=ne(i,a+1),l){if(h){const d=h[t]-l[t];n[a]=d!==0?(h[e]-l[e])/d:0}o[a]=r?h?ft(n[a-1])!==ft(n[a])?0:(n[a-1]+n[a])/2:n[a-1]:n[a]}(function(d,c,u){const f=d.length;let p,g,m,b,_,y=ne(d,0);for(let x=0;x<f-1;++x)_=y,y=ne(d,x+1),_&&y&&(Jt(c[x],0,Aa)?u[x]=u[x+1]=0:(p=u[x]/c[x],g=u[x+1]/c[x],b=Math.pow(p,2)+Math.pow(g,2),b<=9||(m=3/Math.sqrt(b),u[x]=p*m*c[x],u[x+1]=g*m*c[x])))})(i,n,o),function(d,c,u=\"x\"){const f=pn(u),p=d.length;let g,m,b,_=ne(d,0);for(let y=0;y<p;++y){if(m=b,b=_,_=ne(d,y+1),!b)continue;const x=b[u],v=b[f];m&&(g=(x-m[u])/3,b[`cp1${u}`]=x-g,b[`cp1${f}`]=v-g*c[y]),_&&(g=(_[u]-x)/3,b[`cp2${u}`]=x+g,b[`cp2${f}`]=v+g*c[y])}}(i,o,t)}function ii(i,t,e){return Math.max(Math.min(i,e),t)}function xn(i,t,e,s,n){let o,a,r,l;if(t.spanGaps&&(i=i.filter(h=>!h.skip)),t.cubicInterpolationMode===\"monotone\")bn(i,n);else{let h=s?i[i.length-1]:i[0];for(o=0,a=i.length;o<a;++o)r=i[o],l=mn(h,r,i[Math.min(o+1,a-(s?0:1))%a],t.tension),r.cp1x=l.previous.x,r.cp1y=l.previous.y,r.cp2x=l.next.x,r.cp2y=l.next.y,h=r}t.capBezierPoints&&function(h,d){let c,u,f,p,g,m=yt(h[0],d);for(c=0,u=h.length;c<u;++c)g=p,p=m,m=c<u-1&&yt(h[c+1],d),p&&(f=h[c],g&&(f.cp1x=ii(f.cp1x,d.left,d.right),f.cp1y=ii(f.cp1y,d.top,d.bottom)),m&&(f.cp2x=ii(f.cp2x,d.left,d.right),f.cp2y=ii(f.cp2y,d.top,d.bottom)))}(i,e)}const si=i=>i===0||i===1,_n=(i,t,e)=>-Math.pow(2,10*(i-=1))*Math.sin((i-t)*Y/e),yn=(i,t,e)=>Math.pow(2,-10*i)*Math.sin((i-t)*Y/e)+1,oe={linear:i=>i,easeInQuad:i=>i*i,easeOutQuad:i=>-i*(i-2),easeInOutQuad:i=>(i/=.5)<1?.5*i*i:-.5*(--i*(i-2)-1),easeInCubic:i=>i*i*i,easeOutCubic:i=>(i-=1)*i*i+1,easeInOutCubic:i=>(i/=.5)<1?.5*i*i*i:.5*((i-=2)*i*i+2),easeInQuart:i=>i*i*i*i,easeOutQuart:i=>-((i-=1)*i*i*i-1),easeInOutQuart:i=>(i/=.5)<1?.5*i*i*i*i:-.5*((i-=2)*i*i*i-2),easeInQuint:i=>i*i*i*i*i,easeOutQuint:i=>(i-=1)*i*i*i*i+1,easeInOutQuint:i=>(i/=.5)<1?.5*i*i*i*i*i:.5*((i-=2)*i*i*i*i+2),easeInSine:i=>1-Math.cos(i*X),easeOutSine:i=>Math.sin(i*X),easeInOutSine:i=>-.5*(Math.cos($*i)-1),easeInExpo:i=>i===0?0:Math.pow(2,10*(i-1)),easeOutExpo:i=>i===1?1:1-Math.pow(2,-10*i),easeInOutExpo:i=>si(i)?i:i<.5?.5*Math.pow(2,10*(2*i-1)):.5*(2-Math.pow(2,-10*(2*i-1))),easeInCirc:i=>i>=1?i:-(Math.sqrt(1-i*i)-1),easeOutCirc:i=>Math.sqrt(1-(i-=1)*i),easeInOutCirc:i=>(i/=.5)<1?-.5*(Math.sqrt(1-i*i)-1):.5*(Math.sqrt(1-(i-=2)*i)+1),easeInElastic:i=>si(i)?i:_n(i,.075,.3),easeOutElastic:i=>si(i)?i:yn(i,.075,.3),easeInOutElastic(i){return si(i)?i:i<.5?.5*_n(2*i,.1125,.45):.5+.5*yn(2*i-1,.1125,.45)},easeInBack(i){return i*i*((1.70158+1)*i-1.70158)},easeOutBack(i){return(i-=1)*i*((1.70158+1)*i+1.70158)+1},easeInOutBack(i){let t=1.70158;return(i/=.5)<1?i*i*((1+(t*=1.525))*i-t)*.5:.5*((i-=2)*i*((1+(t*=1.525))*i+t)+2)},easeInBounce:i=>1-oe.easeOutBounce(1-i),easeOutBounce(i){return i<1/2.75?7.5625*i*i:i<2/2.75?7.5625*(i-=1.5/2.75)*i+.75:i<2.5/2.75?7.5625*(i-=2.25/2.75)*i+.9375:7.5625*(i-=2.625/2.75)*i+.984375},easeInOutBounce:i=>i<.5?.5*oe.easeInBounce(2*i):.5*oe.easeOutBounce(2*i-1)+.5};function zt(i,t,e,s){return{x:i.x+e*(t.x-i.x),y:i.y+e*(t.y-i.y)}}function vn(i,t,e,s){return{x:i.x+e*(t.x-i.x),y:s===\"middle\"?e<.5?i.y:t.y:s===\"after\"?e<1?i.y:t.y:e>0?t.y:i.y}}function Mn(i,t,e,s){const n={x:i.cp2x,y:i.cp2y},o={x:t.cp1x,y:t.cp1y},a=zt(i,n,e),r=zt(n,o,e),l=zt(o,t,e),h=zt(a,r,e),d=zt(r,l,e);return zt(h,d,e)}const Ta=/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/,La=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function wn(i,t){const e=(\"\"+i).match(Ta);if(!e||e[1]===\"normal\")return 1.2*t;switch(i=+e[2],e[3]){case\"px\":return i;case\"%\":i/=100}return t*i}const Ea=i=>+i||0;function ni(i,t){const e={},s=I(t),n=s?Object.keys(t):t,o=I(i)?s?a=>R(i[a],i[t[a]]):a=>i[a]:()=>i;for(const a of n)e[a]=Ea(o(a));return e}function Qi(i){return ni(i,{top:\"y\",right:\"x\",bottom:\"y\",left:\"x\"})}function Ft(i){return ni(i,[\"topLeft\",\"topRight\",\"bottomLeft\",\"bottomRight\"])}function Q(i){const t=Qi(i);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function K(i,t){i=i||{},t=t||q.font;let e=R(i.size,t.size);typeof e==\"string\"&&(e=parseInt(e,10));let s=R(i.style,t.style);s&&!(\"\"+s).match(La)&&(console.warn('Invalid font style specified: \"'+s+'\"'),s=void 0);const n={family:R(i.family,t.family),lineHeight:wn(R(i.lineHeight,t.lineHeight),e),size:e,style:s,weight:R(i.weight,t.weight),string:\"\"};return n.string=an(n),n}function ae(i,t,e,s){let n,o,a,r=!0;for(n=0,o=i.length;n<o;++n)if(a=i[n],a!==void 0&&(t!==void 0&&typeof a==\"function\"&&(a=a(t),r=!1),e!==void 0&&j(a)&&(a=a[e%a.length],r=!1),a!==void 0))return s&&!r&&(s.cacheable=!1),a}function kn(i,t,e){const{min:s,max:n}=i,o=Mi(t,(n-s)/2),a=(r,l)=>e&&r===0?0:r+l;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function Pt(i,t){return Object.assign(Object.create(i),t)}function Ut(i,t,e){return i?function(s,n){return{x:o=>s+s+n-o,setWidth(o){n=o},textAlign:o=>o===\"center\"?o:o===\"right\"?\"left\":\"right\",xPlus:(o,a)=>o-a,leftForLtr:(o,a)=>o-a}}(t,e):{x:s=>s,setWidth(s){},textAlign:s=>s,xPlus:(s,n)=>s+n,leftForLtr:(s,n)=>s}}function Ji(i,t){let e,s;t!==\"ltr\"&&t!==\"rtl\"||(e=i.canvas.style,s=[e.getPropertyValue(\"direction\"),e.getPropertyPriority(\"direction\")],e.setProperty(\"direction\",t,\"important\"),i.prevTextDirection=s)}function ts(i,t){t!==void 0&&(delete i.prevTextDirection,i.canvas.style.setProperty(\"direction\",t[0],t[1]))}function Sn(i){return i===\"angle\"?{between:te,compare:Bs,normalize:it}:{between:bt,compare:(t,e)=>t-e,normalize:t=>t}}function Pn({start:i,end:t,count:e,loop:s,style:n}){return{start:i%e,end:t%e,loop:s&&(t-i+1)%e==0,style:n}}function es(i,t,e){if(!e)return[i];const{property:s,start:n,end:o}=e,a=t.length,{compare:r,between:l,normalize:h}=Sn(s),{start:d,end:c,loop:u,style:f}=function(M,w,k){const{property:C,start:P,end:L}=k,{between:T,normalize:D}=Sn(C),A=w.length;let O,E,{start:B,end:F,loop:tt}=M;if(tt){for(B+=A,F+=A,O=0,E=A;O<E&&T(D(w[B%A][C]),P,L);++O)B--,F--;B%=A,F%=A}return F<B&&(F+=A),{start:B,end:F,loop:tt,style:M.style}}(i,t,e),p=[];let g,m,b,_=!1,y=null;const x=()=>_||l(n,b,g)&&r(n,b)!==0,v=()=>!_||r(o,g)===0||l(o,b,g);for(let M=d,w=d;M<=c;++M)m=t[M%a],m.skip||(g=h(m[s]),g!==b&&(_=l(g,n,o),y===null&&x()&&(y=r(g,n)===0?M:w),y!==null&&v()&&(p.push(Pn({start:y,end:M,loop:u,count:a,style:f})),y=null),w=M,b=g));return y!==null&&p.push(Pn({start:y,end:c,loop:u,count:a,style:f})),p}function is(i,t){const e=[],s=i.segments;for(let n=0;n<s.length;n++){const o=es(s[n],i.points,t);o.length&&e.push(...o)}return e}function Dn(i,t){const e=i.points,s=i.options.spanGaps,n=e.length;if(!n)return[];const o=!!i._loop,{start:a,end:r}=function(l,h,d,c){let u=0,f=h-1;if(d&&!c)for(;u<h&&!l[u].skip;)u++;for(;u<h&&l[u].skip;)u++;for(u%=h,d&&(f+=u);f>u&&l[f%h].skip;)f--;return f%=h,{start:u,end:f}}(e,n,o,s);return s===!0?Cn(i,[{start:a,end:r,loop:o}],e,t):Cn(i,function(l,h,d,c){const u=l.length,f=[];let p,g=h,m=l[h];for(p=h+1;p<=d;++p){const b=l[p%u];b.skip||b.stop?m.skip||(c=!1,f.push({start:h%u,end:(p-1)%u,loop:c}),h=g=b.stop?p:null):(g=p,m.skip&&(h=p)),m=b}return g!==null&&f.push({start:h%u,end:g%u,loop:c}),f}(e,a,r<a?r+n:r,!!i._fullLoop&&a===0&&r===n-1),e,t)}function Cn(i,t,e,s){return s&&s.setContext&&e?function(n,o,a,r){const l=n._chart.getContext(),h=On(n.options),{_datasetIndex:d,options:{spanGaps:c}}=n,u=a.length,f=[];let p=h,g=o[0].start,m=g;function b(_,y,x,v){const M=c?-1:1;if(_!==y){for(_+=u;a[_%u].skip;)_-=M;for(;a[y%u].skip;)y+=M;_%u!=y%u&&(f.push({start:_%u,end:y%u,loop:x,style:v}),p=v,g=y%u)}}for(const _ of o){g=c?g:_.start;let y,x=a[g%u];for(m=g+1;m<=_.end;m++){const v=a[m%u];y=On(r.setContext(Pt(l,{type:\"segment\",p0:x,p1:v,p0DataIndex:(m-1)%u,p1DataIndex:m%u,datasetIndex:d}))),Ra(y,p)&&b(g,m-1,_.loop,p),x=v,p=y}g<m-1&&b(g,m-1,_.loop,p)}return f}(i,t,e,s):t}function On(i){return{backgroundColor:i.backgroundColor,borderCapStyle:i.borderCapStyle,borderDash:i.borderDash,borderDashOffset:i.borderDashOffset,borderJoinStyle:i.borderJoinStyle,borderWidth:i.borderWidth,borderColor:i.borderColor}}function Ra(i,t){if(!t)return!1;const e=[],s=function(n,o){return qe(o)?(e.includes(o)||e.push(o),e.indexOf(o)):o};return JSON.stringify(i,s)!==JSON.stringify(t,s)}var Ia=Object.freeze({__proto__:null,HALF_PI:X,INFINITY:de,PI:$,PITAU:Is,QUARTER_PI:At,RAD_PER_DEG:zs,TAU:Y,TWO_THIRDS_PI:ki,_addGrace:kn,_alignPixel:Rt,_alignStartEnd:Z,_angleBetween:te,_angleDiff:Bs,_arrayUnique:Ai,_attachContext:Yt,_bezierCurveTo:hn,_bezierInterpolation:Mn,_boundSegment:es,_boundSegments:is,_capitalize:We,_computeSegments:Dn,_createResolver:ei,_decimalPlaces:Di,_deprecated:function(i,t,e,s){t!==void 0&&console.warn(i+': \"'+e+'\" is deprecated. Please use \"'+s+'\" instead')},_descriptors:qi,_elementsEqual:he,_factorize:Fs,_filterBetween:Hs,_getParentNode:Ge,_getStartAndCountOfVisiblePoints:Ei,_int16Range:Ws,_isBetween:bt,_isClickEvent:Rs,_isDomSupported:ji,_isPointInArea:yt,_limitValue:G,_longestText:rn,_lookup:je,_lookupByKey:xt,_measureText:be,_merger:As,_mergerIf:Ts,_normalizeAngle:it,_parseObjectDataRadialScale:Zi,_pointInLine:zt,_readValueToProps:ni,_rlookupByKey:Ns,_scaleRangesChanged:Ri,_setMinAndMaxByKey:Pi,_splitKey:Es,_steppedInterpolation:vn,_steppedLineTo:ln,_textX:Us,_toLeftRightCenter:$e,_updateBezierControlPoints:xn,addRoundedRectPath:se,almostEquals:Jt,almostWhole:Vs,callback:N,clearCanvas:Ui,clipArea:xe,clone:ce,color:Wi,createContext:Pt,debounce:Ys,defined:Qt,distanceBetweenPoints:He,drawPoint:ti,drawPointLegend:Xi,each:V,easingEffects:oe,finiteOrDefault:et,fontString:function(i,t,e){return t+\" \"+i+\"px \"+e},formatNumber:ie,getAngleFromPoint:Ci,getHoverColor:Ke,getMaximumSize:nn,getRelativePosition:Et,getRtlAdapter:Ut,getStyle:sn,isArray:j,isFinite:U,isFunction:wt,isNullOrUndef:z,isNumber:Ht,isObject:I,isPatternOrGradient:qe,listenArrayEvents:$s,log10:kt,merge:Gt,mergeIf:Zt,niceNum:Si,noop:W,overrideTextDirection:Ji,readUsedSize:Yi,renderText:It,requestAnimFrame:Ti,resolve:ae,resolveObjectKey:Mt,restoreTextDirection:ts,retinaScale:$i,setsEqual:wi,sign:ft,splineCurve:mn,splineCurveMonotone:bn,supportsEventListenerOptions:on,throttled:Li,toDegrees:Ne,toDimension:Mi,toFont:K,toFontString:an,toLineHeight:wn,toPadding:Q,toPercentage:Cs,toRadians:lt,toTRBL:Qi,toTRBLCorners:Ft,uid:Nt,unclipArea:_e,unlistenArrayEvents:Oi,valueOrDefault:R});function za(i,t,e,s){const{controller:n,data:o,_sorted:a}=i,r=n._cachedMeta.iScale;if(r&&t===r.axis&&t!==\"r\"&&a&&o.length){const l=r._reversePixels?Ns:xt;if(!s)return l(o,t,e);if(n._sharedOptions){const h=o[0],d=typeof h.getRange==\"function\"&&h.getRange(t);if(d){const c=l(o,t,e-d),u=l(o,t,e+d);return{lo:c.lo,hi:u.hi}}}}return{lo:0,hi:o.length-1}}function ye(i,t,e,s,n){const o=i.getSortedVisibleDatasetMetas(),a=e[t];for(let r=0,l=o.length;r<l;++r){const{index:h,data:d}=o[r],{lo:c,hi:u}=za(o[r],t,a,n);for(let f=c;f<=u;++f){const p=d[f];p.skip||s(p,h,f)}}}function ss(i,t,e,s,n){const o=[];return!n&&!i.isPointInArea(t)||ye(i,e,t,function(a,r,l){(n||yt(a,i.chartArea,0))&&a.inRange(t.x,t.y,s)&&o.push({element:a,datasetIndex:r,index:l})},!0),o}function Fa(i,t,e,s,n,o){let a=[];const r=function(h){const d=h.indexOf(\"x\")!==-1,c=h.indexOf(\"y\")!==-1;return function(u,f){const p=d?Math.abs(u.x-f.x):0,g=c?Math.abs(u.y-f.y):0;return Math.sqrt(Math.pow(p,2)+Math.pow(g,2))}}(e);let l=Number.POSITIVE_INFINITY;return ye(i,e,t,function(h,d,c){const u=h.inRange(t.x,t.y,n);if(s&&!u)return;const f=h.getCenterPoint(n);if(!(o||i.isPointInArea(f))&&!u)return;const p=r(t,f);p<l?(a=[{element:h,datasetIndex:d,index:c}],l=p):p===l&&a.push({element:h,datasetIndex:d,index:c})}),a}function ns(i,t,e,s,n,o){return o||i.isPointInArea(t)?e!==\"r\"||s?Fa(i,t,e,s,n,o):function(a,r,l,h){let d=[];return ye(a,l,r,function(c,u,f){const{startAngle:p,endAngle:g}=c.getProps([\"startAngle\",\"endAngle\"],h),{angle:m}=Ci(c,{x:r.x,y:r.y});te(m,p,g)&&d.push({element:c,datasetIndex:u,index:f})}),d}(i,t,e,n):[]}function An(i,t,e,s,n){const o=[],a=e===\"x\"?\"inXRange\":\"inYRange\";let r=!1;return ye(i,e,t,(l,h,d)=>{l[a](t[e],n)&&(o.push({element:l,datasetIndex:h,index:d}),r=r||l.inRange(t.x,t.y,n))}),s&&!r?[]:o}var Tn={evaluateInteractionItems:ye,modes:{index(i,t,e,s){const n=Et(t,i),o=e.axis||\"x\",a=e.includeInvisible||!1,r=e.intersect?ss(i,n,o,s,a):ns(i,n,o,!1,s,a),l=[];return r.length?(i.getSortedVisibleDatasetMetas().forEach(h=>{const d=r[0].index,c=h.data[d];c&&!c.skip&&l.push({element:c,datasetIndex:h.index,index:d})}),l):[]},dataset(i,t,e,s){const n=Et(t,i),o=e.axis||\"xy\",a=e.includeInvisible||!1;let r=e.intersect?ss(i,n,o,s,a):ns(i,n,o,!1,s,a);if(r.length>0){const l=r[0].datasetIndex,h=i.getDatasetMeta(l).data;r=[];for(let d=0;d<h.length;++d)r.push({element:h[d],datasetIndex:l,index:d})}return r},point:(i,t,e,s)=>ss(i,Et(t,i),e.axis||\"xy\",s,e.includeInvisible||!1),nearest(i,t,e,s){const n=Et(t,i),o=e.axis||\"xy\",a=e.includeInvisible||!1;return ns(i,n,o,e.intersect,s,a)},x:(i,t,e,s)=>An(i,Et(t,i),\"x\",e.intersect,s),y:(i,t,e,s)=>An(i,Et(t,i),\"y\",e.intersect,s)}};const Ln=[\"left\",\"top\",\"right\",\"bottom\"];function ve(i,t){return i.filter(e=>e.pos===t)}function En(i,t){return i.filter(e=>Ln.indexOf(e.pos)===-1&&e.box.axis===t)}function Me(i,t){return i.sort((e,s)=>{const n=t?s:e,o=t?e:s;return n.weight===o.weight?n.index-o.index:n.weight-o.weight})}function Va(i,t){const e=function(l){const h={};for(const d of l){const{stack:c,pos:u,stackWeight:f}=d;if(!c||!Ln.includes(u))continue;const p=h[c]||(h[c]={count:0,placed:0,weight:0,size:0});p.count++,p.weight+=f}return h}(i),{vBoxMaxWidth:s,hBoxMaxHeight:n}=t;let o,a,r;for(o=0,a=i.length;o<a;++o){r=i[o];const{fullSize:l}=r.box,h=e[r.stack],d=h&&r.stackWeight/h.weight;r.horizontal?(r.width=d?d*s:l&&t.availableWidth,r.height=n):(r.width=s,r.height=d?d*n:l&&t.availableHeight)}return e}function Rn(i,t,e,s){return Math.max(i[e],t[e])+Math.max(i[s],t[s])}function In(i,t){i.top=Math.max(i.top,t.top),i.left=Math.max(i.left,t.left),i.bottom=Math.max(i.bottom,t.bottom),i.right=Math.max(i.right,t.right)}function Ba(i,t,e,s){const{pos:n,box:o}=e,a=i.maxPadding;if(!I(n)){e.size&&(i[n]-=e.size);const c=s[e.stack]||{size:0,count:1};c.size=Math.max(c.size,e.horizontal?o.height:o.width),e.size=c.size/c.count,i[n]+=e.size}o.getPadding&&In(a,o.getPadding());const r=Math.max(0,t.outerWidth-Rn(a,i,\"left\",\"right\")),l=Math.max(0,t.outerHeight-Rn(a,i,\"top\",\"bottom\")),h=r!==i.w,d=l!==i.h;return i.w=r,i.h=l,e.horizontal?{same:h,other:d}:{same:d,other:h}}function Wa(i,t){const e=t.maxPadding;function s(n){const o={left:0,top:0,right:0,bottom:0};return n.forEach(a=>{o[a]=Math.max(t[a],e[a])}),o}return s(i?[\"left\",\"right\"]:[\"top\",\"bottom\"])}function we(i,t,e,s){const n=[];let o,a,r,l,h,d;for(o=0,a=i.length,h=0;o<a;++o){r=i[o],l=r.box,l.update(r.width||t.w,r.height||t.h,Wa(r.horizontal,t));const{same:c,other:u}=Ba(t,e,r,s);h|=c&&n.length,d=d||u,l.fullSize||n.push(r)}return h&&we(n,t,e,s)||d}function oi(i,t,e,s,n){i.top=e,i.left=t,i.right=t+s,i.bottom=e+n,i.width=s,i.height=n}function zn(i,t,e,s){const n=e.padding;let{x:o,y:a}=t;for(const r of i){const l=r.box,h=s[r.stack]||{placed:0,weight:1},d=r.stackWeight/h.weight||1;if(r.horizontal){const c=t.w*d,u=h.size||l.height;Qt(h.start)&&(a=h.start),l.fullSize?oi(l,n.left,a,e.outerWidth-n.right-n.left,u):oi(l,t.left+h.placed,a,c,u),h.start=a,h.placed+=c,a=l.bottom}else{const c=t.h*d,u=h.size||l.width;Qt(h.start)&&(o=h.start),l.fullSize?oi(l,o,n.top,u,e.outerHeight-n.bottom-n.top):oi(l,o,t.top+h.placed,u,c),h.start=o,h.placed+=c,o=l.right}}t.x=o,t.y=a}var J={addBox(i,t){i.boxes||(i.boxes=[]),t.fullSize=t.fullSize||!1,t.position=t.position||\"top\",t.weight=t.weight||0,t._layers=t._layers||function(){return[{z:0,draw(e){t.draw(e)}}]},i.boxes.push(t)},removeBox(i,t){const e=i.boxes?i.boxes.indexOf(t):-1;e!==-1&&i.boxes.splice(e,1)},configure(i,t,e){t.fullSize=e.fullSize,t.position=e.position,t.weight=e.weight},update(i,t,e,s){if(!i)return;const n=Q(i.options.layout.padding),o=Math.max(t-n.width,0),a=Math.max(e-n.height,0),r=function(g){const m=function(k){const C=[];let P,L,T,D,A,O;for(P=0,L=(k||[]).length;P<L;++P)T=k[P],{position:D,options:{stack:A,stackWeight:O=1}}=T,C.push({index:P,box:T,pos:D,horizontal:T.isHorizontal(),weight:T.weight,stack:A&&D+A,stackWeight:O});return C}(g),b=Me(m.filter(k=>k.box.fullSize),!0),_=Me(ve(m,\"left\"),!0),y=Me(ve(m,\"right\")),x=Me(ve(m,\"top\"),!0),v=Me(ve(m,\"bottom\")),M=En(m,\"x\"),w=En(m,\"y\");return{fullSize:b,leftAndTop:_.concat(x),rightAndBottom:y.concat(w).concat(v).concat(M),chartArea:ve(m,\"chartArea\"),vertical:_.concat(y).concat(w),horizontal:x.concat(v).concat(M)}}(i.boxes),l=r.vertical,h=r.horizontal;V(i.boxes,g=>{typeof g.beforeLayout==\"function\"&&g.beforeLayout()});const d=l.reduce((g,m)=>m.box.options&&m.box.options.display===!1?g:g+1,0)||1,c=Object.freeze({outerWidth:t,outerHeight:e,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/d,hBoxMaxHeight:a/2}),u=Object.assign({},n);In(u,Q(s));const f=Object.assign({maxPadding:u,w:o,h:a,x:n.left,y:n.top},n),p=Va(l.concat(h),c);we(r.fullSize,f,c,p),we(l,f,c,p),we(h,f,c,p)&&we(l,f,c,p),function(g){const m=g.maxPadding;function b(_){const y=Math.max(m[_]-g[_],0);return g[_]+=y,y}g.y+=b(\"top\"),g.x+=b(\"left\"),b(\"right\"),b(\"bottom\")}(f),zn(r.leftAndTop,f,c,p),f.x+=f.w,f.y+=f.h,zn(r.rightAndBottom,f,c,p),i.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},V(r.chartArea,g=>{const m=g.box;Object.assign(m,i.chartArea),m.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})})}};class os{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,s){}removeEventListener(t,e,s){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,s,n){return e=Math.max(0,e||t.width),s=s||t.height,{width:e,height:Math.max(0,n?Math.floor(e/n):s)}}isAttached(t){return!0}updateConfig(t){}}class Fn extends os{acquireContext(t){return t&&t.getContext&&t.getContext(\"2d\")||null}updateConfig(t){t.options.animation=!1}}const ai=\"$chartjs\",Na={touchstart:\"mousedown\",touchmove:\"mousemove\",touchend:\"mouseup\",pointerenter:\"mouseenter\",pointerdown:\"mousedown\",pointermove:\"mousemove\",pointerup:\"mouseup\",pointerleave:\"mouseout\",pointerout:\"mouseout\"},Vn=i=>i===null||i===\"\",Bn=!!on&&{passive:!0};function Ha(i,t,e){i.canvas.removeEventListener(t,e,Bn)}function ri(i,t){for(const e of i)if(e===t||e.contains(t))return!0}function ja(i,t,e){const s=i.canvas,n=new MutationObserver(o=>{let a=!1;for(const r of o)a=a||ri(r.addedNodes,s),a=a&&!ri(r.removedNodes,s);a&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}function $a(i,t,e){const s=i.canvas,n=new MutationObserver(o=>{let a=!1;for(const r of o)a=a||ri(r.removedNodes,s),a=a&&!ri(r.addedNodes,s);a&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}const ke=new Map;let Wn=0;function Nn(){const i=window.devicePixelRatio;i!==Wn&&(Wn=i,ke.forEach((t,e)=>{e.currentDevicePixelRatio!==i&&t()}))}function Ya(i,t,e){const s=i.canvas,n=s&&Ge(s);if(!n)return;const o=Li((r,l)=>{const h=n.clientWidth;e(r,l),h<n.clientWidth&&e()},window),a=new ResizeObserver(r=>{const l=r[0],h=l.contentRect.width,d=l.contentRect.height;h===0&&d===0||o(h,d)});return a.observe(n),function(r,l){ke.size||window.addEventListener(\"resize\",Nn),ke.set(r,l)}(i,o),a}function as(i,t,e){e&&e.disconnect(),t===\"resize\"&&function(s){ke.delete(s),ke.size||window.removeEventListener(\"resize\",Nn)}(i)}function Ua(i,t,e){const s=i.canvas,n=Li(o=>{i.ctx!==null&&e(function(a,r){const l=Na[a.type]||a.type,{x:h,y:d}=Et(a,r);return{type:l,chart:r,native:a,x:h!==void 0?h:null,y:d!==void 0?d:null}}(o,i))},i);return function(o,a,r){o.addEventListener(a,r,Bn)}(s,t,n),n}class Hn extends os{acquireContext(t,e){const s=t&&t.getContext&&t.getContext(\"2d\");return s&&s.canvas===t?(function(n,o){const a=n.style,r=n.getAttribute(\"height\"),l=n.getAttribute(\"width\");if(n[ai]={initial:{height:r,width:l,style:{display:a.display,height:a.height,width:a.width}}},a.display=a.display||\"block\",a.boxSizing=a.boxSizing||\"border-box\",Vn(l)){const h=Yi(n,\"width\");h!==void 0&&(n.width=h)}if(Vn(r))if(n.style.height===\"\")n.height=n.width/(o||2);else{const h=Yi(n,\"height\");h!==void 0&&(n.height=h)}}(t,e),s):null}releaseContext(t){const e=t.canvas;if(!e[ai])return!1;const s=e[ai].initial;[\"height\",\"width\"].forEach(o=>{const a=s[o];z(a)?e.removeAttribute(o):e.setAttribute(o,a)});const n=s.style||{};return Object.keys(n).forEach(o=>{e.style[o]=n[o]}),e.width=e.width,delete e[ai],!0}addEventListener(t,e,s){this.removeEventListener(t,e);const n=t.$proxies||(t.$proxies={}),o={attach:ja,detach:$a,resize:Ya}[e]||Ua;n[e]=o(t,e,s)}removeEventListener(t,e){const s=t.$proxies||(t.$proxies={}),n=s[e];n&&(({attach:as,detach:as,resize:as}[e]||Ha)(t,e,n),s[e]=void 0)}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,s,n){return nn(t,e,s,n)}isAttached(t){const e=Ge(t);return!(!e||!e.isConnected)}}function jn(i){return!ji()||typeof OffscreenCanvas<\"u\"&&i instanceof OffscreenCanvas?Fn:Hn}var $n=Object.freeze({__proto__:null,BasePlatform:os,BasicPlatform:Fn,DomPlatform:Hn,_detectPlatform:jn});const Yn=\"transparent\",Xa={boolean:(i,t,e)=>e>.5?t:i,color(i,t,e){const s=Wi(i||Yn),n=s.valid&&Wi(t||Yn);return n&&n.valid?n.mix(s,e).hexString():t},number:(i,t,e)=>i+(t-i)*e};class Un{constructor(t,e,s,n){const o=e[s];n=ae([t.to,n,o,t.from]);const a=ae([t.from,o,n]);this._active=!0,this._fn=t.fn||Xa[t.type||typeof a],this._easing=oe[t.easing]||oe.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=s,this._from=a,this._to=n,this._promises=void 0}active(){return this._active}update(t,e,s){if(this._active){this._notify(!1);const n=this._target[this._prop],o=s-this._start,a=this._duration-o;this._start=s,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=o,this._loop=!!t.loop,this._to=ae([t.to,e,n,t.from]),this._from=ae([t.from,n,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,s=this._duration,n=this._prop,o=this._from,a=this._loop,r=this._to;let l;if(this._active=o!==r&&(a||e<s),!this._active)return this._target[n]=r,void this._notify(!0);e<0?this._target[n]=o:(l=e/s%2,l=a&&l>1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[n]=this._fn(o,r,l))}wait(){const t=this._promises||(this._promises=[]);return new Promise((e,s)=>{t.push({res:e,rej:s})})}_notify(t){const e=t?\"res\":\"rej\",s=this._promises||[];for(let n=0;n<s.length;n++)s[n][e]()}}class rs{constructor(t,e){this._chart=t,this._properties=new Map,this.configure(e)}configure(t){if(!I(t))return;const e=Object.keys(q.animation),s=this._properties;Object.getOwnPropertyNames(t).forEach(n=>{const o=t[n];if(!I(o))return;const a={};for(const r of e)a[r]=o[r];(j(o.properties)&&o.properties||[n]).forEach(r=>{r!==n&&s.has(r)||s.set(r,a)})})}_animateOptions(t,e){const s=e.options,n=function(a,r){if(!r)return;let l=a.options;return l?(l.$shared&&(a.options=l=Object.assign({},l,{$shared:!1,$animations:{}})),l):void(a.options=r)}(t,s);if(!n)return[];const o=this._createAnimations(n,s);return s.$shared&&function(a,r){const l=[],h=Object.keys(r);for(let d=0;d<h.length;d++){const c=a[h[d]];c&&c.active()&&l.push(c.wait())}return Promise.all(l)}(t.options.$animations,s).then(()=>{t.options=s},()=>{}),o}_createAnimations(t,e){const s=this._properties,n=[],o=t.$animations||(t.$animations={}),a=Object.keys(e),r=Date.now();let l;for(l=a.length-1;l>=0;--l){const h=a[l];if(h.charAt(0)===\"$\")continue;if(h===\"options\"){n.push(...this._animateOptions(t,e));continue}const d=e[h];let c=o[h];const u=s.get(h);if(c){if(u&&c.active()){c.update(u,d,r);continue}c.cancel()}u&&u.duration?(o[h]=c=new Un(u,t,h,d),n.push(c)):t[h]=d}return n}update(t,e){if(this._properties.size===0)return void Object.assign(t,e);const s=this._createAnimations(t,e);return s.length?(_t.add(this._chart,s),!0):void 0}}function Xn(i,t){const e=i&&i.options||{},s=e.reverse,n=e.min===void 0?t:0,o=e.max===void 0?t:0;return{start:s?o:n,end:s?n:o}}function qn(i,t){const e=[],s=i._getSortedDatasetMetas(t);let n,o;for(n=0,o=s.length;n<o;++n)e.push(s[n].index);return e}function Kn(i,t,e,s={}){const n=i.keys,o=s.mode===\"single\";let a,r,l,h;if(t!==null){for(a=0,r=n.length;a<r;++a){if(l=+n[a],l===e){if(s.all)continue;break}h=i.values[l],U(h)&&(o||t===0||ft(t)===ft(h))&&(t+=h)}return t}}function Gn(i,t){const e=i&&i.options.stacked;return e||e===void 0&&t.stack!==void 0}function qa(i,t,e){const s=i[t]||(i[t]={});return s[e]||(s[e]={})}function Zn(i,t,e,s){for(const n of t.getMatchingVisibleMetas(s).reverse()){const o=i[n.index];if(e&&o>0||!e&&o<0)return n.index}return null}function Qn(i,t){const{chart:e,_cachedMeta:s}=i,n=e._stacks||(e._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,h=a.axis,d=function(f,p,g){return`${f.id}.${p.id}.${g.stack||g.type}`}(o,a,s),c=t.length;let u;for(let f=0;f<c;++f){const p=t[f],{[l]:g,[h]:m}=p;u=(p._stacks||(p._stacks={}))[h]=qa(n,d,g),u[r]=m,u._top=Zn(u,a,!0,s.type),u._bottom=Zn(u,a,!1,s.type),(u._visualValues||(u._visualValues={}))[r]=m}}function ls(i,t){const e=i.scales;return Object.keys(e).filter(s=>e[s].axis===t).shift()}function Se(i,t){const e=i.controller.index,s=i.vScale&&i.vScale.axis;if(s){t=t||i._parsed;for(const n of t){const o=n._stacks;if(!o||o[s]===void 0||o[s][e]===void 0)return;delete o[s][e],o[s]._visualValues!==void 0&&o[s]._visualValues[e]!==void 0&&delete o[s]._visualValues[e]}}}const hs=i=>i===\"reset\"||i===\"none\",Jn=(i,t)=>t?i:Object.assign({},i);class ct{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=Gn(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled(\"filler\")&&console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\")}updateIndex(t){this.index!==t&&Se(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,s=this.getDataset(),n=(c,u,f,p)=>c===\"x\"?u:c===\"r\"?p:f,o=e.xAxisID=R(s.xAxisID,ls(t,\"x\")),a=e.yAxisID=R(s.yAxisID,ls(t,\"y\")),r=e.rAxisID=R(s.rAxisID,ls(t,\"r\")),l=e.indexAxis,h=e.iAxisID=n(l,o,a,r),d=e.vAxisID=n(l,a,o,r);e.xScale=this.getScaleForId(o),e.yScale=this.getScaleForId(a),e.rScale=this.getScaleForId(r),e.iScale=this.getScaleForId(h),e.vScale=this.getScaleForId(d)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update(\"reset\")}_destroy(){const t=this._cachedMeta;this._data&&Oi(this._data,this),t._stacked&&Se(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),s=this._data;if(I(e))this._data=function(n){const o=Object.keys(n),a=new Array(o.length);let r,l,h;for(r=0,l=o.length;r<l;++r)h=o[r],a[r]={x:h,y:n[h]};return a}(e);else if(s!==e){if(s){Oi(s,this);const n=this._cachedMeta;Se(n),n._parsed=[]}e&&Object.isExtensible(e)&&$s(e,this),this._syncList=[],this._data=e}}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const e=this._cachedMeta,s=this.getDataset();let n=!1;this._dataCheck();const o=e._stacked;e._stacked=Gn(e.vScale,e),e.stack!==s.stack&&(n=!0,Se(e),e.stack=s.stack),this._resyncElements(t),(n||o!==e._stacked)&&Qn(this,e._parsed)}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),s=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(s,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:s,_data:n}=this,{iScale:o,_stacked:a}=s,r=o.axis;let l,h,d,c=t===0&&e===n.length||s._sorted,u=t>0&&s._parsed[t-1];if(this._parsing===!1)s._parsed=n,s._sorted=!0,d=n;else{d=j(n[t])?this.parseArrayData(s,n,t,e):I(n[t])?this.parseObjectData(s,n,t,e):this.parsePrimitiveData(s,n,t,e);const f=()=>h[r]===null||u&&h[r]<u[r];for(l=0;l<e;++l)s._parsed[l+t]=h=d[l],c&&(f()&&(c=!1),u=h);s._sorted=c}a&&Qn(this,d)}parsePrimitiveData(t,e,s,n){const{iScale:o,vScale:a}=t,r=o.axis,l=a.axis,h=o.getLabels(),d=o===a,c=new Array(n);let u,f,p;for(u=0,f=n;u<f;++u)p=u+s,c[u]={[r]:d||o.parse(h[p],p),[l]:a.parse(e[p],p)};return c}parseArrayData(t,e,s,n){const{xScale:o,yScale:a}=t,r=new Array(n);let l,h,d,c;for(l=0,h=n;l<h;++l)d=l+s,c=e[d],r[l]={x:o.parse(c[0],d),y:a.parse(c[1],d)};return r}parseObjectData(t,e,s,n){const{xScale:o,yScale:a}=t,{xAxisKey:r=\"x\",yAxisKey:l=\"y\"}=this._parsing,h=new Array(n);let d,c,u,f;for(d=0,c=n;d<c;++d)u=d+s,f=e[u],h[d]={x:o.parse(Mt(f,r),u),y:a.parse(Mt(f,l),u)};return h}getParsed(t){return this._cachedMeta._parsed[t]}getDataElement(t){return this._cachedMeta.data[t]}applyStack(t,e,s){const n=this.chart,o=this._cachedMeta,a=e[t.axis];return Kn({keys:qn(n,!0),values:e._stacks[t.axis]._visualValues},a,o.index,{mode:s})}updateRangeFromParsed(t,e,s,n){const o=s[e.axis];let a=o===null?NaN:o;const r=n&&s._stacks[e.axis];n&&r&&(n.values=r,a=Kn(n,o,this._cachedMeta.index)),t.min=Math.min(t.min,a),t.max=Math.max(t.max,a)}getMinMax(t,e){const s=this._cachedMeta,n=s._parsed,o=s._sorted&&t===s.iScale,a=n.length,r=this._getOtherScale(t),l=((g,m,b)=>g&&!m.hidden&&m._stacked&&{keys:qn(b,!0),values:null})(e,s,this.chart),h={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:d,max:c}=function(g){const{min:m,max:b,minDefined:_,maxDefined:y}=g.getUserBounds();return{min:_?m:Number.NEGATIVE_INFINITY,max:y?b:Number.POSITIVE_INFINITY}}(r);let u,f;function p(){f=n[u];const g=f[r.axis];return!U(f[t.axis])||d>g||c<g}for(u=0;u<a&&(p()||(this.updateRangeFromParsed(h,t,f,l),!o));++u);if(o){for(u=a-1;u>=0;--u)if(!p()){this.updateRangeFromParsed(h,t,f,l);break}}return h}getAllParsedValues(t){const e=this._cachedMeta._parsed,s=[];let n,o,a;for(n=0,o=e.length;n<o;++n)a=e[n][t.axis],U(a)&&s.push(a);return s}getMaxOverflow(){return!1}getLabelAndValue(t){const e=this._cachedMeta,s=e.iScale,n=e.vScale,o=this.getParsed(t);return{label:s?\"\"+s.getLabelForValue(o[s.axis]):\"\",value:n?\"\"+n.getLabelForValue(o[n.axis]):\"\"}}_update(t){const e=this._cachedMeta;this.update(t||\"default\"),e._clip=function(s){let n,o,a,r;return I(s)?(n=s.top,o=s.right,a=s.bottom,r=s.left):n=o=a=r=s,{top:n,right:o,bottom:a,left:r,disabled:s===!1}}(R(this.options.clip,function(s,n,o){if(o===!1)return!1;const a=Xn(s,o),r=Xn(n,o);return{top:r.end,right:a.end,bottom:r.start,left:a.start}}(e.xScale,e.yScale,this.getMaxOverflow())))}update(t){}draw(){const t=this._ctx,e=this.chart,s=this._cachedMeta,n=s.data||[],o=e.chartArea,a=[],r=this._drawStart||0,l=this._drawCount||n.length-r,h=this.options.drawActiveElementsOnTop;let d;for(s.dataset&&s.dataset.draw(t,o,r,l),d=r;d<r+l;++d){const c=n[d];c.hidden||(c.active&&h?a.push(c):c.draw(t,o))}for(d=0;d<a.length;++d)a[d].draw(t,o)}getStyle(t,e){const s=e?\"active\":\"default\";return t===void 0&&this._cachedMeta.dataset?this.resolveDatasetElementOptions(s):this.resolveDataElementOptions(t||0,s)}getContext(t,e,s){const n=this.getDataset();let o;if(t>=0&&t<this._cachedMeta.data.length){const a=this._cachedMeta.data[t];o=a.$context||(a.$context=function(r,l,h){return Pt(r,{active:!1,dataIndex:l,parsed:void 0,raw:void 0,element:h,index:l,mode:\"default\",type:\"data\"})}(this.getContext(),t,a)),o.parsed=this.getParsed(t),o.raw=n.data[t],o.index=o.dataIndex=t}else o=this.$context||(this.$context=function(a,r){return Pt(a,{active:!1,dataset:void 0,datasetIndex:r,index:r,mode:\"default\",type:\"dataset\"})}(this.chart.getContext(),this.index)),o.dataset=n,o.index=o.datasetIndex=this.index;return o.active=!!e,o.mode=s,o}resolveDatasetElementOptions(t){return this._resolveElementOptions(this.datasetElementType.id,t)}resolveDataElementOptions(t,e){return this._resolveElementOptions(this.dataElementType.id,e,t)}_resolveElementOptions(t,e=\"default\",s){const n=e===\"active\",o=this._cachedDataOpts,a=t+\"-\"+e,r=o[a],l=this.enableOptionSharing&&Qt(s);if(r)return Jn(r,l);const h=this.chart.config,d=h.datasetElementScopeKeys(this._type,t),c=n?[`${t}Hover`,\"hover\",t,\"\"]:[t,\"\"],u=h.getOptionScopes(this.getDataset(),d),f=Object.keys(q.elements[t]),p=h.resolveNamedOptions(u,f,()=>this.getContext(s,n,e),c);return p.$shared&&(p.$shared=l,o[a]=Object.freeze(Jn(p,l))),p}_resolveAnimations(t,e,s){const n=this.chart,o=this._cachedDataOpts,a=`animation-${e}`,r=o[a];if(r)return r;let l;if(n.options.animation!==!1){const d=this.chart.config,c=d.datasetAnimationScopeKeys(this._type,e),u=d.getOptionScopes(this.getDataset(),c);l=d.createResolver(u,this.getContext(t,s,e))}const h=new rs(n,l&&l.animations);return l&&l._cacheable&&(o[a]=Object.freeze(h)),h}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||hs(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const s=this.resolveDataElementOptions(t,e),n=this._sharedOptions,o=this.getSharedOptions(s),a=this.includeOptions(e,o)||o!==n;return this.updateSharedOptions(o,e,s),{sharedOptions:o,includeOptions:a}}updateElement(t,e,s,n){hs(n)?Object.assign(t,s):this._resolveAnimations(e,n).update(t,s)}updateSharedOptions(t,e,s){t&&!hs(e)&&this._resolveAnimations(void 0,e).update(t,s)}_setStyle(t,e,s,n){t.active=n;const o=this.getStyle(e,n);this._resolveAnimations(e,s,n).update(t,{options:!n&&this.getSharedOptions(o)||o})}removeHoverStyle(t,e,s){this._setStyle(t,s,\"active\",!1)}setHoverStyle(t,e,s){this._setStyle(t,s,\"active\",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,\"active\",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,\"active\",!0)}_resyncElements(t){const e=this._data,s=this._cachedMeta.data;for(const[r,l,h]of this._syncList)this[r](l,h);this._syncList=[];const n=s.length,o=e.length,a=Math.min(o,n);a&&this.parse(0,a),o>n?this._insertElements(n,o-n,t):o<n&&this._removeElements(o,n-o)}_insertElements(t,e,s=!0){const n=this._cachedMeta,o=n.data,a=t+e;let r;const l=h=>{for(h.length+=e,r=h.length-1;r>=a;r--)h[r]=h[r-e]};for(l(o),r=t;r<a;++r)o[r]=new this.dataElementType;this._parsing&&l(n._parsed),this.parse(t,e),s&&this.updateElements(o,t,e,\"reset\")}updateElements(t,e,s,n){}_removeElements(t,e){const s=this._cachedMeta;if(this._parsing){const n=s._parsed.splice(t,e);s._stacked&&Se(s,n)}s.data.splice(t,e)}_sync(t){if(this._parsing)this._syncList.push(t);else{const[e,s,n]=t;this[e](s,n)}this.chart._dataChanges.push([this.index,...t])}_onDataPush(){const t=arguments.length;this._sync([\"_insertElements\",this.getDataset().data.length-t,t])}_onDataPop(){this._sync([\"_removeElements\",this._cachedMeta.data.length-1,1])}_onDataShift(){this._sync([\"_removeElements\",0,1])}_onDataSplice(t,e){e&&this._sync([\"_removeElements\",t,e]);const s=arguments.length-2;s&&this._sync([\"_insertElements\",t,s])}_onDataUnshift(){this._sync([\"_insertElements\",0,arguments.length])}}S(ct,\"defaults\",{}),S(ct,\"datasetElementType\",null),S(ct,\"dataElementType\",null);class dt{constructor(){S(this,\"x\");S(this,\"y\");S(this,\"active\",!1);S(this,\"options\");S(this,\"$animations\")}tooltipPosition(t){const{x:e,y:s}=this.getProps([\"x\",\"y\"],t);return{x:e,y:s}}hasValue(){return Ht(this.x)&&Ht(this.y)}getProps(t,e){const s=this.$animations;if(!e||!s)return this;const n={};return t.forEach(o=>{n[o]=s[o]&&s[o].active()?s[o]._to:this[o]}),n}}S(dt,\"defaults\",{}),S(dt,\"defaultRoutes\");function Ka(i,t){const e=i.options.ticks,s=function(c){const u=c.options.offset,f=c._tickSize(),p=c._length/f+(u?0:1),g=c._maxLength/f;return Math.floor(Math.min(p,g))}(i),n=Math.min(e.maxTicksLimit||s,s),o=e.major.enabled?function(c){const u=[];let f,p;for(f=0,p=c.length;f<p;f++)c[f].major&&u.push(f);return u}(t):[],a=o.length,r=o[0],l=o[a-1],h=[];if(a>n)return function(c,u,f,p){let g,m=0,b=f[0];for(p=Math.ceil(p),g=0;g<c.length;g++)g===b&&(u.push(c[g]),m++,b=f[m*p])}(t,h,o,a/n),h;const d=function(c,u,f){const p=function(b){const _=b.length;let y,x;if(_<2)return!1;for(x=b[0],y=1;y<_;++y)if(b[y]-b[y-1]!==x)return!1;return x}(c),g=u.length/f;if(!p)return Math.max(g,1);const m=Fs(p);for(let b=0,_=m.length-1;b<_;b++){const y=m[b];if(y>g)return y}return Math.max(g,1)}(o,t,n);if(a>0){let c,u;const f=a>1?Math.round((l-r)/(a-1)):null;for(li(t,h,d,z(f)?0:r-f,r),c=0,u=a-1;c<u;c++)li(t,h,d,o[c],o[c+1]);return li(t,h,d,l,z(f)?t.length:l+f),h}return li(t,h,d),h}function li(i,t,e,s,n){const o=R(s,0),a=Math.min(R(n,i.length),i.length);let r,l,h,d=0;for(e=Math.ceil(e),n&&(r=n-s,e=r/Math.floor(r/e)),h=o;h<0;)d++,h=Math.round(o+d*e);for(l=Math.max(o,0);l<a;l++)l===h&&(t.push(i[l]),d++,h=Math.round(o+d*e))}const to=(i,t,e)=>t===\"top\"||t===\"left\"?i[t]+e:i[t]-e,eo=(i,t)=>Math.min(t||i,i);function io(i,t){const e=[],s=i.length/t,n=i.length;let o=0;for(;o<n;o+=s)e.push(i[Math.floor(o)]);return e}function Ga(i,t,e){const s=i.ticks.length,n=Math.min(t,s-1),o=i._startPixel,a=i._endPixel,r=1e-6;let l,h=i.getPixelForTick(n);if(!(e&&(l=s===1?Math.max(h-o,a-h):t===0?(i.getPixelForTick(1)-h)/2:(h-i.getPixelForTick(n-1))/2,h+=n<t?l:-l,h<o-r||h>a+r)))return h}function Pe(i){return i.drawTicks?i.tickLength:0}function so(i,t){if(!i.display)return 0;const e=K(i.font,t),s=Q(i.padding);return(j(i.text)?i.text.length:1)*e.lineHeight+s.height}function Za(i,t,e){let s=$e(i);return(e&&t!==\"right\"||!e&&t===\"right\")&&(s=(n=>n===\"left\"?\"right\":n===\"right\"?\"left\":n)(s)),s}class Vt extends dt{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:s,_suggestedMax:n}=this;return t=et(t,Number.POSITIVE_INFINITY),e=et(e,Number.NEGATIVE_INFINITY),s=et(s,Number.POSITIVE_INFINITY),n=et(n,Number.NEGATIVE_INFINITY),{min:et(t,s),max:et(e,n),minDefined:U(t),maxDefined:U(e)}}getMinMax(t){let e,{min:s,max:n,minDefined:o,maxDefined:a}=this.getUserBounds();if(o&&a)return{min:s,max:n};const r=this.getMatchingVisibleMetas();for(let l=0,h=r.length;l<h;++l)e=r[l].controller.getMinMax(this,t),o||(s=Math.min(s,e.min)),a||(n=Math.max(n,e.max));return s=a&&s>n?n:s,n=o&&s>n?s:n,{min:et(s,et(n,s)),max:et(n,et(s,n))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){N(this.options.beforeUpdate,[this])}update(t,e,s){const{beginAtZero:n,grace:o,ticks:a}=this.options,r=a.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=s=Object.assign({left:0,right:0,top:0,bottom:0},s),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+s.left+s.right:this.height+s.top+s.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=kn(this,o,n),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const l=r<this.ticks.length;this._convertTicksToLabels(l?io(this.ticks,r):this.ticks),this.configure(),this.beforeCalculateLabelRotation(),this.calculateLabelRotation(),this.afterCalculateLabelRotation(),a.display&&(a.autoSkip||a.source===\"auto\")&&(this.ticks=Ka(this,this.ticks),this._labelSizes=null,this.afterAutoSkip()),l&&this._convertTicksToLabels(this.ticks),this.beforeFit(),this.fit(),this.afterFit(),this.afterUpdate()}configure(){let t,e,s=this.options.reverse;this.isHorizontal()?(t=this.left,e=this.right):(t=this.top,e=this.bottom,s=!s),this._startPixel=t,this._endPixel=e,this._reversePixels=s,this._length=e-t,this._alignToPixels=this.options.alignToPixels}afterUpdate(){N(this.options.afterUpdate,[this])}beforeSetDimensions(){N(this.options.beforeSetDimensions,[this])}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=0,this.right=this.width):(this.height=this.maxHeight,this.top=0,this.bottom=this.height),this.paddingLeft=0,this.paddingTop=0,this.paddingRight=0,this.paddingBottom=0}afterSetDimensions(){N(this.options.afterSetDimensions,[this])}_callHooks(t){this.chart.notifyPlugins(t,this.getContext()),N(this.options[t],[this])}beforeDataLimits(){this._callHooks(\"beforeDataLimits\")}determineDataLimits(){}afterDataLimits(){this._callHooks(\"afterDataLimits\")}beforeBuildTicks(){this._callHooks(\"beforeBuildTicks\")}buildTicks(){return[]}afterBuildTicks(){this._callHooks(\"afterBuildTicks\")}beforeTickToLabelConversion(){N(this.options.beforeTickToLabelConversion,[this])}generateTickLabels(t){const e=this.options.ticks;let s,n,o;for(s=0,n=t.length;s<n;s++)o=t[s],o.label=N(e.callback,[o.value,s,t],this)}afterTickToLabelConversion(){N(this.options.afterTickToLabelConversion,[this])}beforeCalculateLabelRotation(){N(this.options.beforeCalculateLabelRotation,[this])}calculateLabelRotation(){const t=this.options,e=t.ticks,s=eo(this.ticks.length,t.ticks.maxTicksLimit),n=e.minRotation||0,o=e.maxRotation;let a,r,l,h=n;if(!this._isVisible()||!e.display||n>=o||s<=1||!this.isHorizontal())return void(this.labelRotation=n);const d=this._getLabelSizes(),c=d.widest.width,u=d.highest.height,f=G(this.chart.width-c,0,this.maxWidth);a=t.offset?this.maxWidth/s:f/(s-1),c+6>a&&(a=f/(s-(t.offset?.5:1)),r=this.maxHeight-Pe(t.grid)-e.padding-so(t.title,this.chart.options.font),l=Math.sqrt(c*c+u*u),h=Ne(Math.min(Math.asin(G((d.highest.height+6)/a,-1,1)),Math.asin(G(r/l,-1,1))-Math.asin(G(u/l,-1,1)))),h=Math.max(n,Math.min(o,h))),this.labelRotation=h}afterCalculateLabelRotation(){N(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){N(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:s,title:n,grid:o}}=this,a=this._isVisible(),r=this.isHorizontal();if(a){const l=so(n,e.options.font);if(r?(t.width=this.maxWidth,t.height=Pe(o)+l):(t.height=this.maxHeight,t.width=Pe(o)+l),s.display&&this.ticks.length){const{first:h,last:d,widest:c,highest:u}=this._getLabelSizes(),f=2*s.padding,p=lt(this.labelRotation),g=Math.cos(p),m=Math.sin(p);if(r){const b=s.mirror?0:m*c.width+g*u.height;t.height=Math.min(this.maxHeight,t.height+b+f)}else{const b=s.mirror?0:g*c.width+m*u.height;t.width=Math.min(this.maxWidth,t.width+b+f)}this._calculatePadding(h,d,m,g)}}this._handleMargins(),r?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,s,n){const{ticks:{align:o,padding:a},position:r}=this.options,l=this.labelRotation!==0,h=r!==\"top\"&&this.axis===\"x\";if(this.isHorizontal()){const d=this.getPixelForTick(0)-this.left,c=this.right-this.getPixelForTick(this.ticks.length-1);let u=0,f=0;l?h?(u=n*t.width,f=s*e.height):(u=s*t.height,f=n*e.width):o===\"start\"?f=e.width:o===\"end\"?u=t.width:o!==\"inner\"&&(u=t.width/2,f=e.width/2),this.paddingLeft=Math.max((u-d+a)*this.width/(this.width-d),0),this.paddingRight=Math.max((f-c+a)*this.width/(this.width-c),0)}else{let d=e.height/2,c=t.height/2;o===\"start\"?(d=0,c=t.height):o===\"end\"&&(d=e.height,c=0),this.paddingTop=d+a,this.paddingBottom=c+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){N(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return e===\"top\"||e===\"bottom\"||t===\"x\"}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,s;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,s=t.length;e<s;e++)z(t[e].label)&&(t.splice(e,1),s--,e--);this.afterTickToLabelConversion()}_getLabelSizes(){let t=this._labelSizes;if(!t){const e=this.options.ticks.sampleSize;let s=this.ticks;e<s.length&&(s=io(s,e)),this._labelSizes=t=this._computeLabelSizes(s,s.length,this.options.ticks.maxTicksLimit)}return t}_computeLabelSizes(t,e,s){const{ctx:n,_longestTextCache:o}=this,a=[],r=[],l=Math.floor(e/eo(e,s));let h,d,c,u,f,p,g,m,b,_,y,x=0,v=0;for(h=0;h<e;h+=l){if(u=t[h].label,f=this._resolveTickFontOptions(h),n.font=p=f.string,g=o[p]=o[p]||{data:{},gc:[]},m=f.lineHeight,b=_=0,z(u)||j(u)){if(j(u))for(d=0,c=u.length;d<c;++d)y=u[d],z(y)||j(y)||(b=be(n,g.data,g.gc,b,y),_+=m)}else b=be(n,g.data,g.gc,b,u),_=m;a.push(b),r.push(_),x=Math.max(b,x),v=Math.max(_,v)}(function(C,P){V(C,L=>{const T=L.gc,D=T.length/2;let A;if(D>P){for(A=0;A<D;++A)delete L.data[T[A]];T.splice(0,D)}})})(o,e);const M=a.indexOf(x),w=r.indexOf(v),k=C=>({width:a[C]||0,height:r[C]||0});return{first:k(0),last:k(e-1),widest:k(M),highest:k(w),widths:a,heights:r}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return Ws(this._alignToPixels?Rt(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&t<e.length){const s=e[t];return s.$context||(s.$context=function(n,o,a){return Pt(n,{tick:a,index:o,type:\"tick\"})}(this.getContext(),t,s))}return this.$context||(this.$context=Pt(this.chart.getContext(),{scale:this,type:\"scale\"}))}_tickSize(){const t=this.options.ticks,e=lt(this.labelRotation),s=Math.abs(Math.cos(e)),n=Math.abs(Math.sin(e)),o=this._getLabelSizes(),a=t.autoSkipPadding||0,r=o?o.widest.width+a:0,l=o?o.highest.height+a:0;return this.isHorizontal()?l*s>r*n?r/s:l/n:l*n<r*s?l/s:r/n}_isVisible(){const t=this.options.display;return t!==\"auto\"?!!t:this.getMatchingVisibleMetas().length>0}_computeGridLineItems(t){const e=this.axis,s=this.chart,n=this.options,{grid:o,position:a,border:r}=n,l=o.offset,h=this.isHorizontal(),d=this.ticks.length+(l?1:0),c=Pe(o),u=[],f=r.setContext(this.getContext()),p=f.display?f.width:0,g=p/2,m=function(O){return Rt(s,O,p)};let b,_,y,x,v,M,w,k,C,P,L,T;if(a===\"top\")b=m(this.bottom),M=this.bottom-c,k=b-g,P=m(t.top)+g,T=t.bottom;else if(a===\"bottom\")b=m(this.top),P=t.top,T=m(t.bottom)-g,M=b+g,k=this.top+c;else if(a===\"left\")b=m(this.right),v=this.right-c,w=b-g,C=m(t.left)+g,L=t.right;else if(a===\"right\")b=m(this.left),C=t.left,L=m(t.right)-g,v=b+g,w=this.left+c;else if(e===\"x\"){if(a===\"center\")b=m((t.top+t.bottom)/2+.5);else if(I(a)){const O=Object.keys(a)[0],E=a[O];b=m(this.chart.scales[O].getPixelForValue(E))}P=t.top,T=t.bottom,M=b+g,k=M+c}else if(e===\"y\"){if(a===\"center\")b=m((t.left+t.right)/2);else if(I(a)){const O=Object.keys(a)[0],E=a[O];b=m(this.chart.scales[O].getPixelForValue(E))}v=b-g,w=v-c,C=t.left,L=t.right}const D=R(n.ticks.maxTicksLimit,d),A=Math.max(1,Math.ceil(d/D));for(_=0;_<d;_+=A){const O=this.getContext(_),E=o.setContext(O),B=r.setContext(O),F=E.lineWidth,tt=E.color,at=B.dash||[],rt=B.dashOffset,ut=E.tickWidth,pt=E.tickColor,Ct=E.tickBorderDash||[],mt=E.tickBorderDashOffset;y=Ga(this,_,l),y!==void 0&&(x=Rt(s,y,F),h?v=w=C=L=x:M=k=P=T=x,u.push({tx1:v,ty1:M,tx2:w,ty2:k,x1:C,y1:P,x2:L,y2:T,width:F,color:tt,borderDash:at,borderDashOffset:rt,tickWidth:ut,tickColor:pt,tickBorderDash:Ct,tickBorderDashOffset:mt}))}return this._ticksLength=d,this._borderValue=b,u}_computeLabelItems(t){const e=this.axis,s=this.options,{position:n,ticks:o}=s,a=this.isHorizontal(),r=this.ticks,{align:l,crossAlign:h,padding:d,mirror:c}=o,u=Pe(s.grid),f=u+d,p=c?-d:f,g=-lt(this.labelRotation),m=[];let b,_,y,x,v,M,w,k,C,P,L,T,D=\"middle\";if(n===\"top\")M=this.bottom-p,w=this._getXAxisLabelAlignment();else if(n===\"bottom\")M=this.top+p,w=this._getXAxisLabelAlignment();else if(n===\"left\"){const O=this._getYAxisLabelAlignment(u);w=O.textAlign,v=O.x}else if(n===\"right\"){const O=this._getYAxisLabelAlignment(u);w=O.textAlign,v=O.x}else if(e===\"x\"){if(n===\"center\")M=(t.top+t.bottom)/2+f;else if(I(n)){const O=Object.keys(n)[0],E=n[O];M=this.chart.scales[O].getPixelForValue(E)+f}w=this._getXAxisLabelAlignment()}else if(e===\"y\"){if(n===\"center\")v=(t.left+t.right)/2-f;else if(I(n)){const O=Object.keys(n)[0],E=n[O];v=this.chart.scales[O].getPixelForValue(E)}w=this._getYAxisLabelAlignment(u).textAlign}e===\"y\"&&(l===\"start\"?D=\"top\":l===\"end\"&&(D=\"bottom\"));const A=this._getLabelSizes();for(b=0,_=r.length;b<_;++b){y=r[b],x=y.label;const O=o.setContext(this.getContext(b));k=this.getPixelForTick(b)+o.labelOffset,C=this._resolveTickFontOptions(b),P=C.lineHeight,L=j(x)?x.length:1;const E=L/2,B=O.color,F=O.textStrokeColor,tt=O.textStrokeWidth;let at,rt=w;if(a?(v=k,w===\"inner\"&&(rt=b===_-1?this.options.reverse?\"left\":\"right\":b===0?this.options.reverse?\"right\":\"left\":\"center\"),T=n===\"top\"?h===\"near\"||g!==0?-L*P+P/2:h===\"center\"?-A.highest.height/2-E*P+P:-A.highest.height+P/2:h===\"near\"||g!==0?P/2:h===\"center\"?A.highest.height/2-E*P:A.highest.height-L*P,c&&(T*=-1),g===0||O.showLabelBackdrop||(v+=P/2*Math.sin(g))):(M=k,T=(1-L)*P/2),O.showLabelBackdrop){const ut=Q(O.backdropPadding),pt=A.heights[b],Ct=A.widths[b];let mt=T-ut.top,Ot=0-ut.left;switch(D){case\"middle\":mt-=pt/2;break;case\"bottom\":mt-=pt}switch(w){case\"center\":Ot-=Ct/2;break;case\"right\":Ot-=Ct}at={left:Ot,top:mt,width:Ct+ut.width,height:pt+ut.height,color:O.backdropColor}}m.push({label:x,font:C,textOffset:T,options:{rotation:g,color:B,strokeColor:F,strokeWidth:tt,textAlign:rt,textBaseline:D,translation:[v,M],backdrop:at}})}return m}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options;if(-lt(this.labelRotation))return t===\"top\"?\"left\":\"right\";let s=\"center\";return e.align===\"start\"?s=\"left\":e.align===\"end\"?s=\"right\":e.align===\"inner\"&&(s=\"inner\"),s}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:s,mirror:n,padding:o}}=this.options,a=t+o,r=this._getLabelSizes().widest.width;let l,h;return e===\"left\"?n?(h=this.right+o,s===\"near\"?l=\"left\":s===\"center\"?(l=\"center\",h+=r/2):(l=\"right\",h+=r)):(h=this.right-a,s===\"near\"?l=\"right\":s===\"center\"?(l=\"center\",h-=r/2):(l=\"left\",h=this.left)):e===\"right\"?n?(h=this.left+o,s===\"near\"?l=\"right\":s===\"center\"?(l=\"center\",h-=r/2):(l=\"left\",h-=r)):(h=this.left+a,s===\"near\"?l=\"left\":s===\"center\"?(l=\"center\",h+=r/2):(l=\"right\",h=this.right)):l=\"right\",{textAlign:l,x:h}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;return e===\"left\"||e===\"right\"?{top:0,left:this.left,bottom:t.height,right:this.right}:e===\"top\"||e===\"bottom\"?{top:this.top,left:0,bottom:this.bottom,right:t.width}:void 0}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:s,top:n,width:o,height:a}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(s,n,o,a),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const s=this.ticks.findIndex(n=>n.value===t);return s>=0?e.setContext(this.getContext(s)).lineWidth:0}drawGrid(t){const e=this.options.grid,s=this.ctx,n=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let o,a;const r=(l,h,d)=>{d.width&&d.color&&(s.save(),s.lineWidth=d.width,s.strokeStyle=d.color,s.setLineDash(d.borderDash||[]),s.lineDashOffset=d.borderDashOffset,s.beginPath(),s.moveTo(l.x,l.y),s.lineTo(h.x,h.y),s.stroke(),s.restore())};if(e.display)for(o=0,a=n.length;o<a;++o){const l=n[o];e.drawOnChartArea&&r({x:l.x1,y:l.y1},{x:l.x2,y:l.y2},l),e.drawTicks&&r({x:l.tx1,y:l.ty1},{x:l.tx2,y:l.ty2},{color:l.tickColor,width:l.tickWidth,borderDash:l.tickBorderDash,borderDashOffset:l.tickBorderDashOffset})}}drawBorder(){const{chart:t,ctx:e,options:{border:s,grid:n}}=this,o=s.setContext(this.getContext()),a=s.display?o.width:0;if(!a)return;const r=n.setContext(this.getContext(0)).lineWidth,l=this._borderValue;let h,d,c,u;this.isHorizontal()?(h=Rt(t,this.left,a)-a/2,d=Rt(t,this.right,r)+r/2,c=u=l):(c=Rt(t,this.top,a)-a/2,u=Rt(t,this.bottom,r)+r/2,h=d=l),e.save(),e.lineWidth=o.width,e.strokeStyle=o.color,e.beginPath(),e.moveTo(h,c),e.lineTo(d,u),e.stroke(),e.restore()}drawLabels(t){if(!this.options.ticks.display)return;const e=this.ctx,s=this._computeLabelArea();s&&xe(e,s);const n=this.getLabelItems(t);for(const o of n){const a=o.options,r=o.font;It(e,o.label,0,o.textOffset,r,a)}s&&_e(e)}drawTitle(){const{ctx:t,options:{position:e,title:s,reverse:n}}=this;if(!s.display)return;const o=K(s.font),a=Q(s.padding),r=s.align;let l=o.lineHeight/2;e===\"bottom\"||e===\"center\"||I(e)?(l+=a.bottom,j(s.text)&&(l+=o.lineHeight*(s.text.length-1))):l+=a.top;const{titleX:h,titleY:d,maxWidth:c,rotation:u}=function(f,p,g,m){const{top:b,left:_,bottom:y,right:x,chart:v}=f,{chartArea:M,scales:w}=v;let k,C,P,L=0;const T=y-b,D=x-_;if(f.isHorizontal()){if(C=Z(m,_,x),I(g)){const A=Object.keys(g)[0],O=g[A];P=w[A].getPixelForValue(O)+T-p}else P=g===\"center\"?(M.bottom+M.top)/2+T-p:to(f,g,p);k=x-_}else{if(I(g)){const A=Object.keys(g)[0],O=g[A];C=w[A].getPixelForValue(O)-D+p}else C=g===\"center\"?(M.left+M.right)/2-D+p:to(f,g,p);P=Z(m,y,b),L=g===\"left\"?-X:X}return{titleX:C,titleY:P,maxWidth:k,rotation:L}}(this,l,e,r);It(t,s.text,0,0,o,{color:s.color,maxWidth:c,rotation:u,textAlign:Za(r,e,n),textBaseline:\"middle\",translation:[h,d]})}draw(t){this._isVisible()&&(this.drawBackground(),this.drawGrid(t),this.drawBorder(),this.drawTitle(),this.drawLabels(t))}_layers(){const t=this.options,e=t.ticks&&t.ticks.z||0,s=R(t.grid&&t.grid.z,-1),n=R(t.border&&t.border.z,0);return this._isVisible()&&this.draw===Vt.prototype.draw?[{z:s,draw:o=>{this.drawBackground(),this.drawGrid(o),this.drawTitle()}},{z:n,draw:()=>{this.drawBorder()}},{z:e,draw:o=>{this.drawLabels(o)}}]:[{z:e,draw:o=>{this.draw(o)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),s=this.axis+\"AxisID\",n=[];let o,a;for(o=0,a=e.length;o<a;++o){const r=e[o];r[s]!==this.id||t&&r.type!==t||n.push(r)}return n}_resolveTickFontOptions(t){return K(this.options.ticks.setContext(this.getContext(t)).font)}_maxDigits(){const t=this._resolveTickFontOptions(0).lineHeight;return(this.isHorizontal()?this.width:this.height)/t}}class hi{constructor(t,e,s){this.type=t,this.scope=e,this.override=s,this.items=Object.create(null)}isForType(t){return Object.prototype.isPrototypeOf.call(this.type.prototype,t.prototype)}register(t){const e=Object.getPrototypeOf(t);let s;(function(r){return\"id\"in r&&\"defaults\"in r})(e)&&(s=this.register(e));const n=this.items,o=t.id,a=this.scope+\".\"+o;if(!o)throw new Error(\"class does not have id: \"+t);return o in n||(n[o]=t,function(r,l,h){const d=Gt(Object.create(null),[h?q.get(h):{},q.get(l),r.defaults]);q.set(l,d),r.defaultRoutes&&function(c,u){Object.keys(u).forEach(f=>{const p=f.split(\".\"),g=p.pop(),m=[c].concat(p).join(\".\"),b=u[f].split(\".\"),_=b.pop(),y=b.join(\".\");q.route(m,g,y,_)})}(l,r.defaultRoutes),r.descriptors&&q.describe(l,r.descriptors)}(t,a,s),this.override&&q.override(t.id,t.overrides)),a}get(t){return this.items[t]}unregister(t){const e=this.items,s=t.id,n=this.scope;s in e&&delete e[s],n&&s in q[n]&&(delete q[n][s],this.override&&delete jt[s])}}class Qa{constructor(){this.controllers=new hi(ct,\"datasets\",!0),this.elements=new hi(dt,\"elements\"),this.plugins=new hi(Object,\"plugins\"),this.scales=new hi(Vt,\"scales\"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each(\"register\",t)}remove(...t){this._each(\"unregister\",t)}addControllers(...t){this._each(\"register\",t,this.controllers)}addElements(...t){this._each(\"register\",t,this.elements)}addPlugins(...t){this._each(\"register\",t,this.plugins)}addScales(...t){this._each(\"register\",t,this.scales)}getController(t){return this._get(t,this.controllers,\"controller\")}getElement(t){return this._get(t,this.elements,\"element\")}getPlugin(t){return this._get(t,this.plugins,\"plugin\")}getScale(t){return this._get(t,this.scales,\"scale\")}removeControllers(...t){this._each(\"unregister\",t,this.controllers)}removeElements(...t){this._each(\"unregister\",t,this.elements)}removePlugins(...t){this._each(\"unregister\",t,this.plugins)}removeScales(...t){this._each(\"unregister\",t,this.scales)}_each(t,e,s){[...e].forEach(n=>{const o=s||this._getRegistryForType(n);s||o.isForType(n)||o===this.plugins&&n.id?this._exec(t,o,n):V(n,a=>{const r=s||this._getRegistryForType(a);this._exec(t,r,a)})})}_exec(t,e,s){const n=We(t);N(s[\"before\"+n],[],s),e[t](s),N(s[\"after\"+n],[],s)}_getRegistryForType(t){for(let e=0;e<this._typedRegistries.length;e++){const s=this._typedRegistries[e];if(s.isForType(t))return s}return this.plugins}_get(t,e,s){const n=e.get(t);if(n===void 0)throw new Error('\"'+t+'\" is not a registered '+s+\".\");return n}}var gt=new Qa;class Ja{constructor(){this._init=[]}notify(t,e,s,n){e===\"beforeInit\"&&(this._init=this._createDescriptors(t,!0),this._notify(this._init,t,\"install\"));const o=n?this._descriptors(t).filter(n):this._descriptors(t),a=this._notify(o,t,e,s);return e===\"afterDestroy\"&&(this._notify(o,t,\"stop\"),this._notify(this._init,t,\"uninstall\")),a}_notify(t,e,s,n){n=n||{};for(const o of t){const a=o.plugin;if(N(a[s],[e,n,o.options],a)===!1&&n.cancelable)return!1}return!0}invalidate(){z(this._cache)||(this._oldCache=this._cache,this._cache=void 0)}_descriptors(t){if(this._cache)return this._cache;const e=this._cache=this._createDescriptors(t);return this._notifyStateChanges(t),e}_createDescriptors(t,e){const s=t&&t.config,n=R(s.options&&s.options.plugins,{}),o=function(a){const r={},l=[],h=Object.keys(gt.plugins.items);for(let c=0;c<h.length;c++)l.push(gt.getPlugin(h[c]));const d=a.plugins||[];for(let c=0;c<d.length;c++){const u=d[c];l.indexOf(u)===-1&&(l.push(u),r[u.id]=!0)}return{plugins:l,localIds:r}}(s);return n!==!1||e?function(a,{plugins:r,localIds:l},h,d){const c=[],u=a.getContext();for(const f of r){const p=f.id,g=tr(h[p],d);g!==null&&c.push({plugin:f,options:er(a.config,{plugin:f,local:l[p]},g,u)})}return c}(t,o,n,e):[]}_notifyStateChanges(t){const e=this._oldCache||[],s=this._cache,n=(o,a)=>o.filter(r=>!a.some(l=>r.plugin.id===l.plugin.id));this._notify(n(e,s),t,\"stop\"),this._notify(n(s,e),t,\"start\")}}function tr(i,t){return t||i!==!1?i===!0?{}:i:null}function er(i,{plugin:t,local:e},s,n){const o=i.pluginScopeKeys(t),a=i.getOptionScopes(s,o);return e&&t.defaults&&a.push(t.defaults),i.createResolver(a,n,[\"\"],{scriptable:!1,indexable:!1,allKeys:!0})}function cs(i,t){const e=q.datasets[i]||{};return((t.datasets||{})[i]||{}).indexAxis||t.indexAxis||e.indexAxis||\"x\"}function no(i){if(i===\"x\"||i===\"y\"||i===\"r\")return i}function ds(i,...t){if(no(i))return i;for(const s of t){const n=s.axis||((e=s.position)===\"top\"||e===\"bottom\"?\"x\":e===\"left\"||e===\"right\"?\"y\":void 0)||i.length>1&&no(i[0].toLowerCase());if(n)return n}var e;throw new Error(`Cannot determine type of '${i}' axis. Please provide 'axis' or 'position' option.`)}function oo(i,t,e){if(e[t+\"AxisID\"]===i)return{axis:t}}function ir(i,t){const e=jt[i.type]||{scales:{}},s=t.scales||{},n=cs(i.type,t),o=Object.create(null);return Object.keys(s).forEach(a=>{const r=s[a];if(!I(r))return console.error(`Invalid scale configuration for scale: ${a}`);if(r._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${a}`);const l=ds(a,r,function(c,u){if(u.data&&u.data.datasets){const f=u.data.datasets.filter(p=>p.xAxisID===c||p.yAxisID===c);if(f.length)return oo(c,\"x\",f[0])||oo(c,\"y\",f[0])}return{}}(a,i),q.scales[r.type]),h=function(c,u){return c===u?\"_index_\":\"_value_\"}(l,n),d=e.scales||{};o[a]=Zt(Object.create(null),[{axis:l},r,d[l],d[h]])}),i.data.datasets.forEach(a=>{const r=a.type||i.type,l=a.indexAxis||cs(r,t),h=(jt[r]||{}).scales||{};Object.keys(h).forEach(d=>{const c=function(f,p){let g=f;return f===\"_index_\"?g=p:f===\"_value_\"&&(g=p===\"x\"?\"y\":\"x\"),g}(d,l),u=a[c+\"AxisID\"]||c;o[u]=o[u]||Object.create(null),Zt(o[u],[{axis:c},s[u],h[d]])})}),Object.keys(o).forEach(a=>{const r=o[a];Zt(r,[q.scales[r.type],q.scale])}),o}function ao(i){const t=i.options||(i.options={});t.plugins=R(t.plugins,{}),t.scales=ir(i,t)}function ro(i){return(i=i||{}).datasets=i.datasets||[],i.labels=i.labels||[],i}const lo=new Map,ho=new Set;function ci(i,t){let e=lo.get(i);return e||(e=t(),lo.set(i,e),ho.add(e)),e}const De=(i,t,e)=>{const s=Mt(t,e);s!==void 0&&i.add(s)};class sr{constructor(t){this._config=function(e){return(e=e||{}).data=ro(e.data),ao(e),e}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=ro(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),ao(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return ci(t,()=>[[`datasets.${t}`,\"\"]])}datasetAnimationScopeKeys(t,e){return ci(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,\"\"]])}datasetElementScopeKeys(t,e){return ci(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,\"\"]])}pluginScopeKeys(t){const e=t.id;return ci(`${this.type}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){const s=this._scopeCache;let n=s.get(t);return n&&!e||(n=new Map,s.set(t,n)),n}getOptionScopes(t,e,s){const{options:n,type:o}=this,a=this._cachedScopes(t,s),r=a.get(e);if(r)return r;const l=new Set;e.forEach(d=>{t&&(l.add(t),d.forEach(c=>De(l,t,c))),d.forEach(c=>De(l,n,c)),d.forEach(c=>De(l,jt[o]||{},c)),d.forEach(c=>De(l,q,c)),d.forEach(c=>De(l,Ni,c))});const h=Array.from(l);return h.length===0&&h.push(Object.create(null)),ho.has(e)&&a.set(e,h),h}chartOptionScopes(){const{options:t,type:e}=this;return[t,jt[e]||{},q.datasets[e]||{},{type:e},q,Ni]}resolveNamedOptions(t,e,s,n=[\"\"]){const o={$shared:!0},{resolver:a,subPrefixes:r}=co(this._resolverCache,t,n);let l=a;(function(h,d){const{isScriptable:c,isIndexable:u}=qi(h);for(const f of d){const p=c(f),g=u(f),m=(g||p)&&h[f];if(p&&(wt(m)||nr(m))||g&&j(m))return!0}return!1})(a,e)&&(o.$shared=!1,l=Yt(a,s=wt(s)?s():s,this.createResolver(t,s,r)));for(const h of e)o[h]=l[h];return o}createResolver(t,e,s=[\"\"],n){const{resolver:o}=co(this._resolverCache,t,s);return I(e)?Yt(o,e,void 0,n):o}}function co(i,t,e){let s=i.get(t);s||(s=new Map,i.set(t,s));const n=e.join();let o=s.get(n);return o||(o={resolver:ei(t,e),subPrefixes:e.filter(a=>!a.toLowerCase().includes(\"hover\"))},s.set(n,o)),o}const nr=i=>I(i)&&Object.getOwnPropertyNames(i).reduce((t,e)=>t||wt(i[e]),!1),or=[\"top\",\"bottom\",\"left\",\"right\",\"chartArea\"];function uo(i,t){return i===\"top\"||i===\"bottom\"||or.indexOf(i)===-1&&t===\"x\"}function fo(i,t){return function(e,s){return e[i]===s[i]?e[t]-s[t]:e[i]-s[i]}}function go(i){const t=i.chart,e=t.options.animation;t.notifyPlugins(\"afterRender\"),N(e&&e.onComplete,[i],t)}function ar(i){const t=i.chart,e=t.options.animation;N(e&&e.onProgress,[i],t)}function po(i){return ji()&&typeof i==\"string\"?i=document.getElementById(i):i&&i.length&&(i=i[0]),i&&i.canvas&&(i=i.canvas),i}const di={},mo=i=>{const t=po(i);return Object.values(di).filter(e=>e.canvas===t).pop()};function rr(i,t,e){const s=Object.keys(i);for(const n of s){const o=+n;if(o>=t){const a=i[n];delete i[n],(e>0||o>t)&&(i[o+e]=a)}}}function ui(i,t,e){return i.options.clip?i[e]:t[e]}class H{static register(...t){gt.add(...t),bo()}static unregister(...t){gt.remove(...t),bo()}constructor(t,e){const s=this.config=new sr(e),n=po(t),o=mo(n);if(o)throw new Error(\"Canvas is already in use. Chart with ID '\"+o.id+\"' must be destroyed before the canvas with ID '\"+o.canvas.id+\"' can be reused.\");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||jn(n)),this.platform.updateConfig(s);const r=this.platform.acquireContext(n,a.aspectRatio),l=r&&r.canvas,h=l&&l.height,d=l&&l.width;this.id=Nt(),this.ctx=r,this.canvas=l,this.width=d,this.height=h,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Ja,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=Ys(c=>this.update(c),a.resizeDelay||0),this._dataChanges=[],di[this.id]=this,r&&l?(_t.listen(this,\"complete\",go),_t.listen(this,\"progress\",ar),this._initialize(),this.attached&&this.update()):console.error(\"Failed to create chart: can't acquire context from the given item\")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:s,height:n,_aspectRatio:o}=this;return z(t)?e&&o?o:n?s/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return gt}_initialize(){return this.notifyPlugins(\"beforeInit\"),this.options.responsive?this.resize():$i(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins(\"afterInit\"),this}clear(){return Ui(this.canvas,this.ctx),this}stop(){return _t.stop(this),this}resize(t,e){_t.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const s=this.options,n=this.canvas,o=s.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(n,t,e,o),r=s.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?\"resize\":\"attach\";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,$i(this,r,!0)&&(this.notifyPlugins(\"resize\",{size:a}),N(s.onResize,[this,a],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){V(this.options.scales||{},(t,e)=>{t.id=e})}buildOrUpdateScales(){const t=this.options,e=t.scales,s=this.scales,n=Object.keys(s).reduce((a,r)=>(a[r]=!1,a),{});let o=[];e&&(o=o.concat(Object.keys(e).map(a=>{const r=e[a],l=ds(a,r),h=l===\"r\",d=l===\"x\";return{options:r,dposition:h?\"chartArea\":d?\"bottom\":\"left\",dtype:h?\"radialLinear\":d?\"category\":\"linear\"}}))),V(o,a=>{const r=a.options,l=r.id,h=ds(l,r),d=R(r.type,a.dtype);r.position!==void 0&&uo(r.position,h)===uo(a.dposition)||(r.position=a.dposition),n[l]=!0;let c=null;l in s&&s[l].type===d?c=s[l]:(c=new(gt.getScale(d))({id:l,type:d,ctx:this.ctx,chart:this}),s[c.id]=c),c.init(r,t)}),V(n,(a,r)=>{a||delete s[r]}),V(s,a=>{J.configure(this,a,a.options),J.addBox(this,a)})}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,s=t.length;if(t.sort((n,o)=>n.index-o.index),s>e){for(let n=e;n<s;++n)this._destroyDatasetMeta(n);t.splice(e,s-e)}this._sortedMetasets=t.slice(0).sort(fo(\"order\",\"index\"))}_removeUnreferencedMetasets(){const{_metasets:t,data:{datasets:e}}=this;t.length>e.length&&delete this._stacks,t.forEach((s,n)=>{e.filter(o=>o===s._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let s,n;for(this._removeUnreferencedMetasets(),s=0,n=e.length;s<n;s++){const o=e[s];let a=this.getDatasetMeta(s);const r=o.type||this.config.type;if(a.type&&a.type!==r&&(this._destroyDatasetMeta(s),a=this.getDatasetMeta(s)),a.type=r,a.indexAxis=o.indexAxis||cs(r,this.options),a.order=o.order||0,a.index=s,a.label=\"\"+o.label,a.visible=this.isDatasetVisible(s),a.controller)a.controller.updateIndex(s),a.controller.linkScales();else{const l=gt.getController(r),{datasetElementType:h,dataElementType:d}=q.datasets[r];Object.assign(l,{dataElementType:gt.getElement(d),datasetElementType:h&&gt.getElement(h)}),a.controller=new l(this,s),t.push(a.controller)}}return this._updateMetasets(),t}_resetElements(){V(this.data.datasets,(t,e)=>{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins(\"reset\")}update(t){const e=this.config;e.update();const s=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),n=this._animationsDisabled=!s.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins(\"beforeUpdate\",{mode:t,cancelable:!0})===!1)return;const o=this.buildOrUpdateControllers();this.notifyPlugins(\"beforeElementsUpdate\");let a=0;for(let h=0,d=this.data.datasets.length;h<d;h++){const{controller:c}=this.getDatasetMeta(h),u=!n&&o.indexOf(c)===-1;c.buildOrUpdateElements(u),a=Math.max(+c.getMaxOverflow(),a)}a=this._minPadding=s.layout.autoPadding?a:0,this._updateLayout(a),n||V(o,h=>{h.reset()}),this._updateDatasets(t),this.notifyPlugins(\"afterUpdate\",{mode:t}),this._layers.sort(fo(\"z\",\"_idx\"));const{_active:r,_lastEvent:l}=this;l?this._eventHandler(l,!0):r.length&&this._updateHoverStyles(r,r,!0),this.render()}_updateScales(){V(this.scales,t=>{J.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),s=new Set(t.events);wi(e,s)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:s,start:n,count:o}of e)rr(t,n,s===\"_removeElements\"?-o:o)}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,s=o=>new Set(t.filter(a=>a[0]===o).map((a,r)=>r+\",\"+a.splice(1).join(\",\"))),n=s(0);for(let o=1;o<e;o++)if(!wi(n,s(o)))return;return Array.from(n).map(o=>o.split(\",\")).map(o=>({method:o[1],start:+o[2],count:+o[3]}))}_updateLayout(t){if(this.notifyPlugins(\"beforeLayout\",{cancelable:!0})===!1)return;J.update(this,this.width,this.height,t);const e=this.chartArea,s=e.width<=0||e.height<=0;this._layers=[],V(this.boxes,n=>{s&&n.position===\"chartArea\"||(n.configure&&n.configure(),this._layers.push(...n._layers()))},this),this._layers.forEach((n,o)=>{n._idx=o}),this.notifyPlugins(\"afterLayout\")}_updateDatasets(t){if(this.notifyPlugins(\"beforeDatasetsUpdate\",{mode:t,cancelable:!0})!==!1){for(let e=0,s=this.data.datasets.length;e<s;++e)this.getDatasetMeta(e).controller.configure();for(let e=0,s=this.data.datasets.length;e<s;++e)this._updateDataset(e,wt(t)?t({datasetIndex:e}):t);this.notifyPlugins(\"afterDatasetsUpdate\",{mode:t})}}_updateDataset(t,e){const s=this.getDatasetMeta(t),n={meta:s,index:t,mode:e,cancelable:!0};this.notifyPlugins(\"beforeDatasetUpdate\",n)!==!1&&(s.controller._update(e),n.cancelable=!1,this.notifyPlugins(\"afterDatasetUpdate\",n))}render(){this.notifyPlugins(\"beforeRender\",{cancelable:!0})!==!1&&(_t.has(this)?this.attached&&!_t.running(this)&&_t.start(this):(this.draw(),go({chart:this})))}draw(){let t;if(this._resizeBeforeDraw){const{width:s,height:n}=this._resizeBeforeDraw;this._resize(s,n),this._resizeBeforeDraw=null}if(this.clear(),this.width<=0||this.height<=0||this.notifyPlugins(\"beforeDraw\",{cancelable:!0})===!1)return;const e=this._layers;for(t=0;t<e.length&&e[t].z<=0;++t)e[t].draw(this.chartArea);for(this._drawDatasets();t<e.length;++t)e[t].draw(this.chartArea);this.notifyPlugins(\"afterDraw\")}_getSortedDatasetMetas(t){const e=this._sortedMetasets,s=[];let n,o;for(n=0,o=e.length;n<o;++n){const a=e[n];t&&!a.visible||s.push(a)}return s}getSortedVisibleDatasetMetas(){return this._getSortedDatasetMetas(!0)}_drawDatasets(){if(this.notifyPlugins(\"beforeDatasetsDraw\",{cancelable:!0})===!1)return;const t=this.getSortedVisibleDatasetMetas();for(let e=t.length-1;e>=0;--e)this._drawDataset(t[e]);this.notifyPlugins(\"afterDatasetsDraw\")}_drawDataset(t){const e=this.ctx,s=t._clip,n=!s.disabled,o=function(r,l){const{xScale:h,yScale:d}=r;return h&&d?{left:ui(h,l,\"left\"),right:ui(h,l,\"right\"),top:ui(d,l,\"top\"),bottom:ui(d,l,\"bottom\")}:l}(t,this.chartArea),a={meta:t,index:t.index,cancelable:!0};this.notifyPlugins(\"beforeDatasetDraw\",a)!==!1&&(n&&xe(e,{left:s.left===!1?0:o.left-s.left,right:s.right===!1?this.width:o.right+s.right,top:s.top===!1?0:o.top-s.top,bottom:s.bottom===!1?this.height:o.bottom+s.bottom}),t.controller.draw(),n&&_e(e),a.cancelable=!1,this.notifyPlugins(\"afterDatasetDraw\",a))}isPointInArea(t){return yt(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,s,n){const o=Tn.modes[e];return typeof o==\"function\"?o(this,t,s,n):[]}getDatasetMeta(t){const e=this.data.datasets[t],s=this._metasets;let n=s.filter(o=>o&&o._dataset===e).pop();return n||(n={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},s.push(n)),n}getContext(){return this.$context||(this.$context=Pt(null,{chart:this,type:\"chart\"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const s=this.getDatasetMeta(t);return typeof s.hidden==\"boolean\"?!s.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,s){const n=s?\"show\":\"hide\",o=this.getDatasetMeta(t),a=o.controller._resolveAnimations(void 0,n);Qt(e)?(o.data[e].hidden=!s,this.update()):(this.setDatasetVisibility(t,s),a.update(o,{visible:s}),this.update(r=>r.datasetIndex===t?n:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),_t.remove(this),t=0,e=this.data.datasets.length;t<e;++t)this._destroyDatasetMeta(t)}destroy(){this.notifyPlugins(\"beforeDestroy\");const{canvas:t,ctx:e}=this;this._stop(),this.config.clearCache(),t&&(this.unbindEvents(),Ui(t,e),this.platform.releaseContext(e),this.canvas=null,this.ctx=null),delete di[this.id],this.notifyPlugins(\"afterDestroy\")}toBase64Image(...t){return this.canvas.toDataURL(...t)}bindEvents(){this.bindUserEvents(),this.options.responsive?this.bindResponsiveEvents():this.attached=!0}bindUserEvents(){const t=this._listeners,e=this.platform,s=(o,a)=>{e.addEventListener(this,o,a),t[o]=a},n=(o,a,r)=>{o.offsetX=a,o.offsetY=r,this._eventHandler(o)};V(this.options.events,o=>s(o,n))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,s=(l,h)=>{e.addEventListener(this,l,h),t[l]=h},n=(l,h)=>{t[l]&&(e.removeEventListener(this,l,h),delete t[l])},o=(l,h)=>{this.canvas&&this.resize(l,h)};let a;const r=()=>{n(\"attach\",r),this.attached=!0,this.resize(),s(\"resize\",o),s(\"detach\",a)};a=()=>{this.attached=!1,n(\"resize\",o),this._stop(),this._resize(0,0),s(\"attach\",r)},e.isAttached(this.canvas)?r():a()}unbindEvents(){V(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},V(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,s){const n=s?\"set\":\"remove\";let o,a,r,l;for(e===\"dataset\"&&(o=this.getDatasetMeta(t[0].datasetIndex),o.controller[\"_\"+n+\"DatasetHoverStyle\"]()),r=0,l=t.length;r<l;++r){a=t[r];const h=a&&this.getDatasetMeta(a.datasetIndex).controller;h&&h[n+\"HoverStyle\"](a.element,a.datasetIndex,a.index)}}getActiveElements(){return this._active||[]}setActiveElements(t){const e=this._active||[],s=t.map(({datasetIndex:n,index:o})=>{const a=this.getDatasetMeta(n);if(!a)throw new Error(\"No dataset found at index \"+n);return{datasetIndex:n,element:a.data[o],index:o}});!he(s,e)&&(this._active=s,this._lastEvent=null,this._updateHoverStyles(s,e))}notifyPlugins(t,e,s){return this._plugins.notify(this,t,e,s)}isPluginEnabled(t){return this._plugins._cache.filter(e=>e.plugin.id===t).length===1}_updateHoverStyles(t,e,s){const n=this.options.hover,o=(l,h)=>l.filter(d=>!h.some(c=>d.datasetIndex===c.datasetIndex&&d.index===c.index)),a=o(e,t),r=s?t:o(t,e);a.length&&this.updateHoverStyle(a,n.mode,!1),r.length&&n.mode&&this.updateHoverStyle(r,n.mode,!0)}_eventHandler(t,e){const s={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},n=a=>(a.options.events||this.options.events).includes(t.native.type);if(this.notifyPlugins(\"beforeEvent\",s,n)===!1)return;const o=this._handleEvent(t,e,s.inChartArea);return s.cancelable=!1,this.notifyPlugins(\"afterEvent\",s,n),(o||s.changed)&&this.render(),this}_handleEvent(t,e,s){const{_active:n=[],options:o}=this,a=e,r=this._getActiveElements(t,n,s,a),l=Rs(t),h=function(c,u,f,p){return f&&c.type!==\"mouseout\"?p?u:c:null}(t,this._lastEvent,s,l);s&&(this._lastEvent=null,N(o.onHover,[t,r,this],this),l&&N(o.onClick,[t,r,this],this));const d=!he(r,n);return(d||e)&&(this._active=r,this._updateHoverStyles(r,n,e)),this._lastEvent=h,d}_getActiveElements(t,e,s,n){if(t.type===\"mouseout\")return[];if(!s)return e;const o=this.options.hover;return this.getElementsAtEventForMode(t,o.mode,o,n)}}S(H,\"defaults\",q),S(H,\"instances\",di),S(H,\"overrides\",jt),S(H,\"registry\",gt),S(H,\"version\",\"4.4.0\"),S(H,\"getChart\",mo);function bo(){return V(H.instances,i=>i._plugins.invalidate())}function Xt(){throw new Error(\"This method is not implemented: Check that a complete date adapter is provided.\")}class us{constructor(t){S(this,\"options\");this.options=t||{}}static override(t){Object.assign(us.prototype,t)}init(){}formats(){return Xt()}parse(){return Xt()}format(){return Xt()}add(){return Xt()}diff(){return Xt()}startOf(){return Xt()}endOf(){return Xt()}}var xo={_date:us};function lr(i){const t=i.iScale,e=function(h,d){if(!h._cache.$bar){const c=h.getMatchingVisibleMetas(d);let u=[];for(let f=0,p=c.length;f<p;f++)u=u.concat(c[f].controller.getAllParsedValues(h));h._cache.$bar=Ai(u.sort((f,p)=>f-p))}return h._cache.$bar}(t,i.type);let s,n,o,a,r=t._length;const l=()=>{o!==32767&&o!==-32768&&(Qt(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=e.length;s<n;++s)o=t.getPixelForValue(e[s]),l();for(a=void 0,s=0,n=t.ticks.length;s<n;++s)o=t.getPixelForTick(s),l();return r}function _o(i,t,e,s){return j(i)?function(n,o,a,r){const l=a.parse(n[0],r),h=a.parse(n[1],r),d=Math.min(l,h),c=Math.max(l,h);let u=d,f=c;Math.abs(d)>Math.abs(c)&&(u=c,f=d),o[a.axis]=f,o._custom={barStart:u,barEnd:f,start:l,end:h,min:d,max:c}}(i,t,e,s):t[e.axis]=e.parse(i,s),t}function yo(i,t,e,s){const n=i.iScale,o=i.vScale,a=n.getLabels(),r=n===o,l=[];let h,d,c,u;for(h=e,d=e+s;h<d;++h)u=t[h],c={},c[n.axis]=r||n.parse(a[h],h),l.push(_o(u,c,o,h));return l}function fs(i){return i&&i.barStart!==void 0&&i.barEnd!==void 0}function hr(i,t,e,s){let n=t.borderSkipped;const o={};if(!n)return void(i.borderSkipped=o);if(n===!0)return void(i.borderSkipped={top:!0,right:!0,bottom:!0,left:!0});const{start:a,end:r,reverse:l,top:h,bottom:d}=function(c){let u,f,p,g,m;return c.horizontal?(u=c.base>c.x,f=\"left\",p=\"right\"):(u=c.base<c.y,f=\"bottom\",p=\"top\"),u?(g=\"end\",m=\"start\"):(g=\"start\",m=\"end\"),{start:f,end:p,reverse:u,top:g,bottom:m}}(i);n===\"middle\"&&e&&(i.enableBorderRadius=!0,(e._top||0)===s?n=h:(e._bottom||0)===s?n=d:(o[vo(d,a,r,l)]=!0,n=h)),o[vo(n,a,r,l)]=!0,i.borderSkipped=o}function vo(i,t,e,s){var n,o,a;return s?(a=e,i=Mo(i=(n=i)===(o=t)?a:n===a?o:n,e,t)):i=Mo(i,t,e),i}function Mo(i,t,e){return i===\"start\"?t:i===\"end\"?e:i}function cr(i,{inflateAmount:t},e){i.inflateAmount=t===\"auto\"?e===1?.33:0:t}class qt extends ct{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const s=this.getDataset().data,n=this._cachedMeta;if(this._parsing===!1)n._parsed=s;else{let o,a,r=l=>+s[l];if(I(s[t])){const{key:l=\"value\"}=this._parsing;r=h=>+Mt(s[h],l)}for(o=t,a=t+e;o<a;++o)n._parsed[o]=r(o)}}_getRotation(){return lt(this.options.rotation-90)}_getCircumference(){return lt(this.options.circumference)}_getRotationExtents(){let t=Y,e=-Y;for(let s=0;s<this.chart.data.datasets.length;++s)if(this.chart.isDatasetVisible(s)&&this.chart.getDatasetMeta(s).type===this._type){const n=this.chart.getDatasetMeta(s).controller,o=n._getRotation(),a=n._getCircumference();t=Math.min(t,o),e=Math.max(e,o+a)}return{rotation:t,circumference:e-t}}update(t){const e=this.chart,{chartArea:s}=e,n=this._cachedMeta,o=n.data,a=this.getMaxBorderWidth()+this.getMaxOffset(o)+this.options.spacing,r=Math.max((Math.min(s.width,s.height)-a)/2,0),l=Math.min(Cs(this.options.cutout,r),1),h=this._getRingWeight(this.index),{circumference:d,rotation:c}=this._getRotationExtents(),{ratioX:u,ratioY:f,offsetX:p,offsetY:g}=function(v,M,w){let k=1,C=1,P=0,L=0;if(M<Y){const T=v,D=T+M,A=Math.cos(T),O=Math.sin(T),E=Math.cos(D),B=Math.sin(D),F=(Ct,mt,Ot)=>te(Ct,T,D,!0)?1:Math.max(mt,mt*w,Ot,Ot*w),tt=(Ct,mt,Ot)=>te(Ct,T,D,!0)?-1:Math.min(mt,mt*w,Ot,Ot*w),at=F(0,A,E),rt=F(X,O,B),ut=tt($,A,E),pt=tt($+X,O,B);k=(at-ut)/2,C=(rt-pt)/2,P=-(at+ut)/2,L=-(rt+pt)/2}return{ratioX:k,ratioY:C,offsetX:P,offsetY:L}}(c,d,l),m=(s.width-a)/u,b=(s.height-a)/f,_=Math.max(Math.min(m,b)/2,0),y=Mi(this.options.radius,_),x=(y-Math.max(y*l,0))/this._getVisibleDatasetWeightTotal();this.offsetX=p*y,this.offsetY=g*y,n.total=this.calculateTotal(),this.outerRadius=y-x*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-x*h,0),this.updateElements(o,0,o.length,t)}_circumference(t,e){const s=this.options,n=this._cachedMeta,o=this._getCircumference();return e&&s.animation.animateRotate||!this.chart.getDataVisibility(t)||n._parsed[t]===null||n.data[t].hidden?0:this.calculateCircumference(n._parsed[t]*o/Y)}updateElements(t,e,s,n){const o=n===\"reset\",a=this.chart,r=a.chartArea,l=a.options.animation,h=(r.left+r.right)/2,d=(r.top+r.bottom)/2,c=o&&l.animateScale,u=c?0:this.innerRadius,f=c?0:this.outerRadius,{sharedOptions:p,includeOptions:g}=this._getSharedOptions(e,n);let m,b=this._getRotation();for(m=0;m<e;++m)b+=this._circumference(m,o);for(m=e;m<e+s;++m){const _=this._circumference(m,o),y=t[m],x={x:h+this.offsetX,y:d+this.offsetY,startAngle:b,endAngle:b+_,circumference:_,outerRadius:f,innerRadius:u};g&&(x.options=p||this.resolveDataElementOptions(m,y.active?\"active\":n)),b+=_,this.updateElement(y,m,x,n)}}calculateTotal(){const t=this._cachedMeta,e=t.data;let s,n=0;for(s=0;s<e.length;s++){const o=t._parsed[s];o===null||isNaN(o)||!this.chart.getDataVisibility(s)||e[s].hidden||(n+=Math.abs(o))}return n}calculateCircumference(t){const e=this._cachedMeta.total;return e>0&&!isNaN(t)?Y*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,n=s.data.labels||[],o=ie(e._parsed[t],s.options.locale);return{label:n[t]||\"\",value:o}}getMaxBorderWidth(t){let e=0;const s=this.chart;let n,o,a,r,l;if(!t){for(n=0,o=s.data.datasets.length;n<o;++n)if(s.isDatasetVisible(n)){a=s.getDatasetMeta(n),t=a.data,r=a.controller;break}}if(!t)return 0;for(n=0,o=t.length;n<o;++n)l=r.resolveDataElementOptions(n),l.borderAlign!==\"inner\"&&(e=Math.max(e,l.borderWidth||0,l.hoverBorderWidth||0));return e}getMaxOffset(t){let e=0;for(let s=0,n=t.length;s<n;++s){const o=this.resolveDataElementOptions(s);e=Math.max(e,o.offset||0,o.hoverOffset||0)}return e}_getRingWeightOffset(t){let e=0;for(let s=0;s<t;++s)this.chart.isDatasetVisible(s)&&(e+=this._getRingWeight(s));return e}_getRingWeight(t){return Math.max(R(this.chart.data.datasets[t].weight,1),0)}_getVisibleDatasetWeightTotal(){return this._getRingWeightOffset(this.chart.data.datasets.length)||1}}S(qt,\"id\",\"doughnut\"),S(qt,\"defaults\",{datasetElementType:!1,dataElementType:\"arc\",animation:{animateRotate:!0,animateScale:!1},animations:{numbers:{type:\"number\",properties:[\"circumference\",\"endAngle\",\"innerRadius\",\"outerRadius\",\"startAngle\",\"x\",\"y\",\"offset\",\"borderWidth\",\"spacing\"]}},cutout:\"50%\",rotation:0,circumference:360,radius:\"100%\",spacing:0,indexAxis:\"r\"}),S(qt,\"descriptors\",{_scriptable:t=>t!==\"spacing\",_indexable:t=>t!==\"spacing\"&&!t.startsWith(\"borderDash\")&&!t.startsWith(\"hoverBorderDash\")}),S(qt,\"overrides\",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:s,color:n}}=t.legend.options;return e.labels.map((o,a)=>{const r=t.getDatasetMeta(0).controller.getStyle(a);return{text:o,fillStyle:r.backgroundColor,strokeStyle:r.borderColor,fontColor:n,lineWidth:r.borderWidth,pointStyle:s,hidden:!t.getDataVisibility(a),index:a}})}return[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}}});class Ce extends ct{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,n=s.data.labels||[],o=ie(e._parsed[t].r,s.options.locale);return{label:n[t]||\"\",value:o}}parseObjectData(t,e,s,n){return Zi.bind(this)(t,e,s,n)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((s,n)=>{const o=this.getParsed(n).r;!isNaN(o)&&this.chart.getDataVisibility(n)&&(o<e.min&&(e.min=o),o>e.max&&(e.max=o))}),e}_updateRadius(){const t=this.chart,e=t.chartArea,s=t.options,n=Math.min(e.right-e.left,e.bottom-e.top),o=Math.max(n/2,0),a=(o-Math.max(s.cutoutPercentage?o/100*s.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=o-a*this.index,this.innerRadius=this.outerRadius-a}updateElements(t,e,s,n){const o=n===\"reset\",a=this.chart,r=a.options.animation,l=this._cachedMeta.rScale,h=l.xCenter,d=l.yCenter,c=l.getIndexAngle(0)-.5*$;let u,f=c;const p=360/this.countVisibleElements();for(u=0;u<e;++u)f+=this._computeAngle(u,n,p);for(u=e;u<e+s;u++){const g=t[u];let m=f,b=f+this._computeAngle(u,n,p),_=a.getDataVisibility(u)?l.getDistanceFromCenterForValue(this.getParsed(u).r):0;f=b,o&&(r.animateScale&&(_=0),r.animateRotate&&(m=b=c));const y={x:h,y:d,innerRadius:0,outerRadius:_,startAngle:m,endAngle:b,options:this.resolveDataElementOptions(u,g.active?\"active\":n)};this.updateElement(g,u,y,n)}}countVisibleElements(){const t=this._cachedMeta;let e=0;return t.data.forEach((s,n)=>{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&e++}),e}_computeAngle(t,e,s){return this.chart.getDataVisibility(t)?lt(this.resolveDataElementOptions(t,e).angle||s):0}}S(Ce,\"id\",\"polarArea\"),S(Ce,\"defaults\",{dataElementType:\"arc\",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"startAngle\",\"endAngle\",\"innerRadius\",\"outerRadius\"]}},indexAxis:\"r\",startAngle:0}),S(Ce,\"overrides\",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:s,color:n}}=t.legend.options;return e.labels.map((o,a)=>{const r=t.getDatasetMeta(0).controller.getStyle(a);return{text:o,fillStyle:r.backgroundColor,strokeStyle:r.borderColor,fontColor:n,lineWidth:r.borderWidth,pointStyle:s,hidden:!t.getDataVisibility(a),index:a}})}return[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}},scales:{r:{type:\"radialLinear\",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});var wo=Object.freeze({__proto__:null,BarController:(Ee=class extends ct{parsePrimitiveData(i,t,e,s){return yo(i,t,e,s)}parseArrayData(i,t,e,s){return yo(i,t,e,s)}parseObjectData(i,t,e,s){const{iScale:n,vScale:o}=i,{xAxisKey:a=\"x\",yAxisKey:r=\"y\"}=this._parsing,l=n.axis===\"x\"?a:r,h=o.axis===\"x\"?a:r,d=[];let c,u,f,p;for(c=e,u=e+s;c<u;++c)p=t[c],f={},f[n.axis]=n.parse(Mt(p,l),c),d.push(_o(Mt(p,h),f,o,c));return d}updateRangeFromParsed(i,t,e,s){super.updateRangeFromParsed(i,t,e,s);const n=e._custom;n&&t===this._cachedMeta.vScale&&(i.min=Math.min(i.min,n.min),i.max=Math.max(i.max,n.max))}getMaxOverflow(){return 0}getLabelAndValue(i){const t=this._cachedMeta,{iScale:e,vScale:s}=t,n=this.getParsed(i),o=n._custom,a=fs(o)?\"[\"+o.start+\", \"+o.end+\"]\":\"\"+s.getLabelForValue(n[s.axis]);return{label:\"\"+e.getLabelForValue(n[e.axis]),value:a}}initialize(){this.enableOptionSharing=!0,super.initialize(),this._cachedMeta.stack=this.getDataset().stack}update(i){const t=this._cachedMeta;this.updateElements(t.data,0,t.data.length,i)}updateElements(i,t,e,s){const n=s===\"reset\",{index:o,_cachedMeta:{vScale:a}}=this,r=a.getBasePixel(),l=a.isHorizontal(),h=this._getRuler(),{sharedOptions:d,includeOptions:c}=this._getSharedOptions(t,s);for(let u=t;u<t+e;u++){const f=this.getParsed(u),p=n||z(f[a.axis])?{base:r,head:r}:this._calculateBarValuePixels(u),g=this._calculateBarIndexPixels(u,h),m=(f._stacks||{})[a.axis],b={horizontal:l,base:p.base,enableBorderRadius:!m||fs(f._custom)||o===m._top||o===m._bottom,x:l?p.head:g.center,y:l?g.center:p.head,height:l?g.size:Math.abs(p.size),width:l?Math.abs(p.size):g.size};c&&(b.options=d||this.resolveDataElementOptions(u,i[u].active?\"active\":s));const _=b.options||i[u].options;hr(b,_,m,o),cr(b,_,h.ratio),this.updateElement(i[u],u,b,s)}}_getStacks(i,t){const{iScale:e}=this._cachedMeta,s=e.getMatchingVisibleMetas(this._type).filter(r=>r.controller.options.grouped),n=e.options.stacked,o=[],a=r=>{const l=r.controller.getParsed(t),h=l&&l[r.vScale.axis];if(z(h)||isNaN(h))return!0};for(const r of s)if((t===void 0||!a(r))&&((n===!1||o.indexOf(r.stack)===-1||n===void 0&&r.stack===void 0)&&o.push(r.stack),r.index===i))break;return o.length||o.push(void 0),o}_getStackCount(i){return this._getStacks(void 0,i).length}_getStackIndex(i,t,e){const s=this._getStacks(i,e),n=t!==void 0?s.indexOf(t):-1;return n===-1?s.length-1:n}_getRuler(){const i=this.options,t=this._cachedMeta,e=t.iScale,s=[];let n,o;for(n=0,o=t.data.length;n<o;++n)s.push(e.getPixelForValue(this.getParsed(n)[e.axis],n));const a=i.barThickness;return{min:a||lr(t),pixels:s,start:e._startPixel,end:e._endPixel,stackCount:this._getStackCount(),scale:e,grouped:i.grouped,ratio:a?1:i.categoryPercentage*i.barPercentage}}_calculateBarValuePixels(i){const{_cachedMeta:{vScale:t,_stacked:e,index:s},options:{base:n,minBarLength:o}}=this,a=n||0,r=this.getParsed(i),l=r._custom,h=fs(l);let d,c,u=r[t.axis],f=0,p=e?this.applyStack(t,r,e):u;p!==u&&(f=p-u,p=u),h&&(u=l.barStart,p=l.barEnd-l.barStart,u!==0&&ft(u)!==ft(l.barEnd)&&(f=0),f+=u);const g=z(n)||h?f:n;let m=t.getPixelForValue(g);if(d=this.chart.getDataVisibility(i)?t.getPixelForValue(f+p):m,c=d-m,Math.abs(c)<o){c=function(v,M,w){return v!==0?ft(v):(M.isHorizontal()?1:-1)*(M.min>=w?1:-1)}(c,t,a)*o,u===a&&(m-=c/2);const b=t.getPixelForDecimal(0),_=t.getPixelForDecimal(1),y=Math.min(b,_),x=Math.max(b,_);m=Math.max(Math.min(m,x),y),d=m+c,e&&!h&&(r._stacks[t.axis]._visualValues[s]=t.getValueForPixel(d)-t.getValueForPixel(m))}if(m===t.getPixelForValue(a)){const b=ft(c)*t.getLineWidthForValue(a)/2;m+=b,c-=b}return{size:c,base:m,head:d,center:d+c/2}}_calculateBarIndexPixels(i,t){const e=t.scale,s=this.options,n=s.skipNull,o=R(s.maxBarThickness,1/0);let a,r;if(t.grouped){const l=n?this._getStackCount(i):t.stackCount,h=s.barThickness===\"flex\"?function(c,u,f,p){const g=u.pixels,m=g[c];let b=c>0?g[c-1]:null,_=c<g.length-1?g[c+1]:null;const y=f.categoryPercentage;b===null&&(b=m-(_===null?u.end-u.start:_-m)),_===null&&(_=m+m-b);const x=m-(m-Math.min(b,_))/2*y;return{chunk:Math.abs(_-b)/2*y/p,ratio:f.barPercentage,start:x}}(i,t,s,l):function(c,u,f,p){const g=f.barThickness;let m,b;return z(g)?(m=u.min*f.categoryPercentage,b=f.barPercentage):(m=g*p,b=1),{chunk:m/p,ratio:b,start:u.pixels[c]-m/2}}(i,t,s,l),d=this._getStackIndex(this.index,this._cachedMeta.stack,n?i:void 0);a=h.start+h.chunk*d+h.chunk/2,r=Math.min(o,h.chunk*h.ratio)}else a=e.getPixelForValue(this.getParsed(i)[e.axis],i),r=Math.min(o,t.min*t.ratio);return{base:a-r/2,head:a+r/2,center:a,size:r}}draw(){const i=this._cachedMeta,t=i.vScale,e=i.data,s=e.length;let n=0;for(;n<s;++n)this.getParsed(n)[t.axis]!==null&&e[n].draw(this._ctx)}},S(Ee,\"id\",\"bar\"),S(Ee,\"defaults\",{datasetElementType:!1,dataElementType:\"bar\",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"base\",\"width\",\"height\"]}}}),S(Ee,\"overrides\",{scales:{_index_:{type:\"category\",offset:!0,grid:{offset:!0}},_value_:{type:\"linear\",beginAtZero:!0}}}),Ee),BubbleController:(Re=class extends ct{initialize(){this.enableOptionSharing=!0,super.initialize()}parsePrimitiveData(i,t,e,s){const n=super.parsePrimitiveData(i,t,e,s);for(let o=0;o<n.length;o++)n[o]._custom=this.resolveDataElementOptions(o+e).radius;return n}parseArrayData(i,t,e,s){const n=super.parseArrayData(i,t,e,s);for(let o=0;o<n.length;o++){const a=t[e+o];n[o]._custom=R(a[2],this.resolveDataElementOptions(o+e).radius)}return n}parseObjectData(i,t,e,s){const n=super.parseObjectData(i,t,e,s);for(let o=0;o<n.length;o++){const a=t[e+o];n[o]._custom=R(a&&a.r&&+a.r,this.resolveDataElementOptions(o+e).radius)}return n}getMaxOverflow(){const i=this._cachedMeta.data;let t=0;for(let e=i.length-1;e>=0;--e)t=Math.max(t,i[e].size(this.resolveDataElementOptions(e))/2);return t>0&&t}getLabelAndValue(i){const t=this._cachedMeta,e=this.chart.data.labels||[],{xScale:s,yScale:n}=t,o=this.getParsed(i),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y),l=o._custom;return{label:e[i]||\"\",value:\"(\"+a+\", \"+r+(l?\", \"+l:\"\")+\")\"}}update(i){const t=this._cachedMeta.data;this.updateElements(t,0,t.length,i)}updateElements(i,t,e,s){const n=s===\"reset\",{iScale:o,vScale:a}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(t,s),h=o.axis,d=a.axis;for(let c=t;c<t+e;c++){const u=i[c],f=!n&&this.getParsed(c),p={},g=p[h]=n?o.getPixelForDecimal(.5):o.getPixelForValue(f[h]),m=p[d]=n?a.getBasePixel():a.getPixelForValue(f[d]);p.skip=isNaN(g)||isNaN(m),l&&(p.options=r||this.resolveDataElementOptions(c,u.active?\"active\":s),n&&(p.options.radius=0)),this.updateElement(u,c,p,s)}}resolveDataElementOptions(i,t){const e=this.getParsed(i);let s=super.resolveDataElementOptions(i,t);s.$shared&&(s=Object.assign({},s,{$shared:!1}));const n=s.radius;return t!==\"active\"&&(s.radius=0),s.radius+=R(e&&e._custom,n),s}},S(Re,\"id\",\"bubble\"),S(Re,\"defaults\",{datasetElementType:!1,dataElementType:\"point\",animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"borderWidth\",\"radius\"]}}}),S(Re,\"overrides\",{scales:{x:{type:\"linear\"},y:{type:\"linear\"}}}),Re),DoughnutController:qt,LineController:(Ie=class extends ct{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(i){const t=this._cachedMeta,{dataset:e,data:s=[],_dataset:n}=t,o=this.chart._animationsDisabled;let{start:a,count:r}=Ei(t,s,o);this._drawStart=a,this._drawCount=r,Ri(t)&&(a=0,r=s.length),e._chart=this.chart,e._datasetIndex=this.index,e._decimated=!!n._decimated,e.points=s;const l=this.resolveDatasetElementOptions(i);this.options.showLine||(l.borderWidth=0),l.segment=this.options.segment,this.updateElement(e,void 0,{animated:!o,options:l},i),this.updateElements(s,a,r,i)}updateElements(i,t,e,s){const n=s===\"reset\",{iScale:o,vScale:a,_stacked:r,_dataset:l}=this._cachedMeta,{sharedOptions:h,includeOptions:d}=this._getSharedOptions(t,s),c=o.axis,u=a.axis,{spanGaps:f,segment:p}=this.options,g=Ht(f)?f:Number.POSITIVE_INFINITY,m=this.chart._animationsDisabled||n||s===\"none\",b=t+e,_=i.length;let y=t>0&&this.getParsed(t-1);for(let x=0;x<_;++x){const v=i[x],M=m?v:{};if(x<t||x>=b){M.skip=!0;continue}const w=this.getParsed(x),k=z(w[u]),C=M[c]=o.getPixelForValue(w[c],x),P=M[u]=n||k?a.getBasePixel():a.getPixelForValue(r?this.applyStack(a,w,r):w[u],x);M.skip=isNaN(C)||isNaN(P)||k,M.stop=x>0&&Math.abs(w[c]-y[c])>g,p&&(M.parsed=w,M.raw=l.data[x]),d&&(M.options=h||this.resolveDataElementOptions(x,v.active?\"active\":s)),m||this.updateElement(v,x,M,s),y=w}}getMaxOverflow(){const i=this._cachedMeta,t=i.dataset,e=t.options&&t.options.borderWidth||0,s=i.data||[];if(!s.length)return e;const n=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(e,n,o)/2}draw(){const i=this._cachedMeta;i.dataset.updateControlPoints(this.chart.chartArea,i.iScale.axis),super.draw()}},S(Ie,\"id\",\"line\"),S(Ie,\"defaults\",{datasetElementType:\"line\",dataElementType:\"point\",showLine:!0,spanGaps:!1}),S(Ie,\"overrides\",{scales:{_index_:{type:\"category\"},_value_:{type:\"linear\"}}}),Ie),PieController:(_i=class extends qt{},S(_i,\"id\",\"pie\"),S(_i,\"defaults\",{cutout:0,rotation:0,circumference:360,radius:\"100%\"}),_i),PolarAreaController:Ce,RadarController:(ze=class extends ct{getLabelAndValue(i){const t=this._cachedMeta.vScale,e=this.getParsed(i);return{label:t.getLabels()[i],value:\"\"+t.getLabelForValue(e[t.axis])}}parseObjectData(i,t,e,s){return Zi.bind(this)(i,t,e,s)}update(i){const t=this._cachedMeta,e=t.dataset,s=t.data||[],n=t.iScale.getLabels();if(e.points=s,i!==\"resize\"){const o=this.resolveDatasetElementOptions(i);this.options.showLine||(o.borderWidth=0);const a={_loop:!0,_fullLoop:n.length===s.length,options:o};this.updateElement(e,void 0,a,i)}this.updateElements(s,0,s.length,i)}updateElements(i,t,e,s){const n=this._cachedMeta.rScale,o=s===\"reset\";for(let a=t;a<t+e;a++){const r=i[a],l=this.resolveDataElementOptions(a,r.active?\"active\":s),h=n.getPointPositionForValue(a,this.getParsed(a).r),d=o?n.xCenter:h.x,c=o?n.yCenter:h.y,u={x:d,y:c,angle:h.angle,skip:isNaN(d)||isNaN(c),options:l};this.updateElement(r,a,u,s)}}},S(ze,\"id\",\"radar\"),S(ze,\"defaults\",{datasetElementType:\"line\",dataElementType:\"point\",indexAxis:\"r\",showLine:!0,elements:{line:{fill:\"start\"}}}),S(ze,\"overrides\",{aspectRatio:1,scales:{r:{type:\"radialLinear\"}}}),ze),ScatterController:(Fe=class extends ct{getLabelAndValue(i){const t=this._cachedMeta,e=this.chart.data.labels||[],{xScale:s,yScale:n}=t,o=this.getParsed(i),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y);return{label:e[i]||\"\",value:\"(\"+a+\", \"+r+\")\"}}update(i){const t=this._cachedMeta,{data:e=[]}=t,s=this.chart._animationsDisabled;let{start:n,count:o}=Ei(t,e,s);if(this._drawStart=n,this._drawCount=o,Ri(t)&&(n=0,o=e.length),this.options.showLine){this.datasetElementType||this.addElements();const{dataset:a,_dataset:r}=t;a._chart=this.chart,a._datasetIndex=this.index,a._decimated=!!r._decimated,a.points=e;const l=this.resolveDatasetElementOptions(i);l.segment=this.options.segment,this.updateElement(a,void 0,{animated:!s,options:l},i)}else this.datasetElementType&&(delete t.dataset,this.datasetElementType=!1);this.updateElements(e,n,o,i)}addElements(){const{showLine:i}=this.options;!this.datasetElementType&&i&&(this.datasetElementType=this.chart.registry.getElement(\"line\")),super.addElements()}updateElements(i,t,e,s){const n=s===\"reset\",{iScale:o,vScale:a,_stacked:r,_dataset:l}=this._cachedMeta,h=this.resolveDataElementOptions(t,s),d=this.getSharedOptions(h),c=this.includeOptions(s,d),u=o.axis,f=a.axis,{spanGaps:p,segment:g}=this.options,m=Ht(p)?p:Number.POSITIVE_INFINITY,b=this.chart._animationsDisabled||n||s===\"none\";let _=t>0&&this.getParsed(t-1);for(let y=t;y<t+e;++y){const x=i[y],v=this.getParsed(y),M=b?x:{},w=z(v[f]),k=M[u]=o.getPixelForValue(v[u],y),C=M[f]=n||w?a.getBasePixel():a.getPixelForValue(r?this.applyStack(a,v,r):v[f],y);M.skip=isNaN(k)||isNaN(C)||w,M.stop=y>0&&Math.abs(v[u]-_[u])>m,g&&(M.parsed=v,M.raw=l.data[y]),c&&(M.options=d||this.resolveDataElementOptions(y,x.active?\"active\":s)),b||this.updateElement(x,y,M,s),_=v}this.updateSharedOptions(d,s,h)}getMaxOverflow(){const i=this._cachedMeta,t=i.data||[];if(!this.options.showLine){let a=0;for(let r=t.length-1;r>=0;--r)a=Math.max(a,t[r].size(this.resolveDataElementOptions(r))/2);return a>0&&a}const e=i.dataset,s=e.options&&e.options.borderWidth||0;if(!t.length)return s;const n=t[0].size(this.resolveDataElementOptions(0)),o=t[t.length-1].size(this.resolveDataElementOptions(t.length-1));return Math.max(s,n,o)/2}},S(Fe,\"id\",\"scatter\"),S(Fe,\"defaults\",{datasetElementType:!1,dataElementType:\"point\",showLine:!1,fill:!1}),S(Fe,\"overrides\",{interaction:{mode:\"point\"},scales:{x:{type:\"linear\"},y:{type:\"linear\"}}}),Fe)});function dr(i,t,e,s){const n=ni(i.options.borderRadius,[\"outerStart\",\"outerEnd\",\"innerStart\",\"innerEnd\"]),o=(e-t)/2,a=Math.min(o,s*t/2),r=l=>{const h=(e-Math.min(o,l))*s/2;return G(l,0,Math.min(o,h))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:G(n.innerStart,0,a),innerEnd:G(n.innerEnd,0,a)}}function re(i,t,e,s){return{x:e+i*Math.cos(t),y:s+i*Math.sin(t)}}function fi(i,t,e,s,n,o){const{x:a,y:r,startAngle:l,pixelMargin:h,innerRadius:d}=t,c=Math.max(t.outerRadius+s+e-h,0),u=d>0?d+s+e+h:0;let f=0;const p=n-l;if(s){const A=((d>0?d-s:0)+(c>0?c-s:0))/2;f=(p-(A!==0?p*A/(A+s):p))/2}const g=(p-Math.max(.001,p*c-e/$)/c)/2,m=l+g+f,b=n-g-f,{outerStart:_,outerEnd:y,innerStart:x,innerEnd:v}=dr(t,u,c,b-m),M=c-_,w=c-y,k=m+_/M,C=b-y/w,P=u+x,L=u+v,T=m+x/P,D=b-v/L;if(i.beginPath(),o){const A=(k+C)/2;if(i.arc(a,r,c,k,A),i.arc(a,r,c,A,C),y>0){const F=re(w,C,a,r);i.arc(F.x,F.y,y,C,b+X)}const O=re(L,b,a,r);if(i.lineTo(O.x,O.y),v>0){const F=re(L,D,a,r);i.arc(F.x,F.y,v,b+X,D+Math.PI)}const E=(b-v/u+(m+x/u))/2;if(i.arc(a,r,u,b-v/u,E,!0),i.arc(a,r,u,E,m+x/u,!0),x>0){const F=re(P,T,a,r);i.arc(F.x,F.y,x,T+Math.PI,m-X)}const B=re(M,m,a,r);if(i.lineTo(B.x,B.y),_>0){const F=re(M,k,a,r);i.arc(F.x,F.y,_,m-X,k)}}else{i.moveTo(a,r);const A=Math.cos(k)*c+a,O=Math.sin(k)*c+r;i.lineTo(A,O);const E=Math.cos(C)*c+a,B=Math.sin(C)*c+r;i.lineTo(E,B)}i.closePath()}function ur(i,t,e,s,n){const{fullCircles:o,startAngle:a,circumference:r,options:l}=t,{borderWidth:h,borderJoinStyle:d,borderDash:c,borderDashOffset:u}=l,f=l.borderAlign===\"inner\";if(!h)return;i.setLineDash(c||[]),i.lineDashOffset=u,f?(i.lineWidth=2*h,i.lineJoin=d||\"round\"):(i.lineWidth=h,i.lineJoin=d||\"bevel\");let p=t.endAngle;if(o){fi(i,t,e,s,p,n);for(let g=0;g<o;++g)i.stroke();isNaN(r)||(p=a+(r%Y||Y))}f&&function(g,m,b){const{startAngle:_,pixelMargin:y,x,y:v,outerRadius:M,innerRadius:w}=m;let k=y/M;g.beginPath(),g.arc(x,v,M,_-k,b+k),w>y?(k=y/w,g.arc(x,v,w,b+k,_-k,!0)):g.arc(x,v,y,b+X,_-X),g.closePath(),g.clip()}(i,t,p),o||(fi(i,t,e,s,p,n),i.stroke())}function ko(i,t,e=t){i.lineCap=R(e.borderCapStyle,t.borderCapStyle),i.setLineDash(R(e.borderDash,t.borderDash)),i.lineDashOffset=R(e.borderDashOffset,t.borderDashOffset),i.lineJoin=R(e.borderJoinStyle,t.borderJoinStyle),i.lineWidth=R(e.borderWidth,t.borderWidth),i.strokeStyle=R(e.borderColor,t.borderColor)}function fr(i,t,e){i.lineTo(e.x,e.y)}function So(i,t,e={}){const s=i.length,{start:n=0,end:o=s-1}=e,{start:a,end:r}=t,l=Math.max(n,a),h=Math.min(o,r),d=n<a&&o<a||n>r&&o>r;return{count:s,start:l,loop:t.loop,ilen:h<l&&!d?s+h-l:h-l}}function gr(i,t,e,s){const{points:n,options:o}=t,{count:a,start:r,loop:l,ilen:h}=So(n,e,s),d=function(m){return m.stepped?ln:m.tension||m.cubicInterpolationMode===\"monotone\"?hn:fr}(o);let c,u,f,{move:p=!0,reverse:g}=s||{};for(c=0;c<=h;++c)u=n[(r+(g?h-c:c))%a],u.skip||(p?(i.moveTo(u.x,u.y),p=!1):d(i,f,u,g,o.stepped),f=u);return l&&(u=n[(r+(g?h:0))%a],d(i,f,u,g,o.stepped)),!!l}function pr(i,t,e,s){const n=t.points,{count:o,start:a,ilen:r}=So(n,e,s),{move:l=!0,reverse:h}=s||{};let d,c,u,f,p,g,m=0,b=0;const _=x=>(a+(h?r-x:x))%o,y=()=>{f!==p&&(i.lineTo(m,p),i.lineTo(m,f),i.lineTo(m,g))};for(l&&(c=n[_(0)],i.moveTo(c.x,c.y)),d=0;d<=r;++d){if(c=n[_(d)],c.skip)continue;const x=c.x,v=c.y,M=0|x;M===u?(v<f?f=v:v>p&&(p=v),m=(b*m+x)/++b):(y(),i.lineTo(x,v),u=M,b=0,f=p=v),g=v}y()}function gs(i){const t=i.options,e=t.borderDash&&t.borderDash.length;return i._decimated||i._loop||t.tension||t.cubicInterpolationMode===\"monotone\"||t.stepped||e?gr:pr}const mr=typeof Path2D==\"function\";function br(i,t,e,s){mr&&!t.options.segment?function(n,o,a,r){let l=o._path;l||(l=o._path=new Path2D,o.path(l,a,r)&&l.closePath()),ko(n,o.options),n.stroke(l)}(i,t,e,s):function(n,o,a,r){const{segments:l,options:h}=o,d=gs(o);for(const c of l)ko(n,h,c.style),n.beginPath(),d(n,o,c,{start:a,end:a+r-1})&&n.closePath(),n.stroke()}(i,t,e,s)}class Bt extends dt{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const s=this.options;if((s.tension||s.cubicInterpolationMode===\"monotone\")&&!s.stepped&&!this._pointsUpdated){const n=s.spanGaps?this._loop:this._fullLoop;xn(this._points,s,t,n,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Dn(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,s=t.length;return s&&e[t[s-1].end]}interpolate(t,e){const s=this.options,n=t[e],o=this.points,a=is(this,{property:e,start:n,end:n});if(!a.length)return;const r=[],l=function(c){return c.stepped?vn:c.tension||c.cubicInterpolationMode===\"monotone\"?Mn:zt}(s);let h,d;for(h=0,d=a.length;h<d;++h){const{start:c,end:u}=a[h],f=o[c],p=o[u];if(f===p){r.push(f);continue}const g=l(f,p,Math.abs((n-f[e])/(p[e]-f[e])),s.stepped);g[e]=t[e],r.push(g)}return r.length===1?r[0]:r}pathSegment(t,e,s){return gs(this)(t,this,e,s)}path(t,e,s){const n=this.segments,o=gs(this);let a=this._loop;e=e||0,s=s||this.points.length-e;for(const r of n)a&=o(t,this,r,{start:e,end:e+s-1});return!!a}draw(t,e,s,n){const o=this.options||{};(this.points||[]).length&&o.borderWidth&&(t.save(),br(t,this,s,n),t.restore()),this.animated&&(this._pointsUpdated=!1,this._path=void 0)}}S(Bt,\"id\",\"line\"),S(Bt,\"defaults\",{borderCapStyle:\"butt\",borderDash:[],borderDashOffset:0,borderJoinStyle:\"miter\",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:\"default\",fill:!1,spanGaps:!1,stepped:!1,tension:0}),S(Bt,\"defaultRoutes\",{backgroundColor:\"backgroundColor\",borderColor:\"borderColor\"}),S(Bt,\"descriptors\",{_scriptable:!0,_indexable:t=>t!==\"borderDash\"&&t!==\"fill\"});function Po(i,t,e,s){const n=i.options,{[e]:o}=i.getProps([e],s);return Math.abs(t-o)<n.radius+n.hitRadius}function Do(i,t){const{x:e,y:s,base:n,width:o,height:a}=i.getProps([\"x\",\"y\",\"base\",\"width\",\"height\"],t);let r,l,h,d,c;return i.horizontal?(c=a/2,r=Math.min(e,n),l=Math.max(e,n),h=s-c,d=s+c):(c=o/2,r=e-c,l=e+c,h=Math.min(s,n),d=Math.max(s,n)),{left:r,top:h,right:l,bottom:d}}function Wt(i,t,e,s){return i?0:G(t,e,s)}function xr(i){const t=Do(i),e=t.right-t.left,s=t.bottom-t.top,n=function(a,r,l){const h=a.options.borderWidth,d=a.borderSkipped,c=Qi(h);return{t:Wt(d.top,c.top,0,l),r:Wt(d.right,c.right,0,r),b:Wt(d.bottom,c.bottom,0,l),l:Wt(d.left,c.left,0,r)}}(i,e/2,s/2),o=function(a,r,l){const{enableBorderRadius:h}=a.getProps([\"enableBorderRadius\"]),d=a.options.borderRadius,c=Ft(d),u=Math.min(r,l),f=a.borderSkipped,p=h||I(d);return{topLeft:Wt(!p||f.top||f.left,c.topLeft,0,u),topRight:Wt(!p||f.top||f.right,c.topRight,0,u),bottomLeft:Wt(!p||f.bottom||f.left,c.bottomLeft,0,u),bottomRight:Wt(!p||f.bottom||f.right,c.bottomRight,0,u)}}(i,e/2,s/2);return{outer:{x:t.left,y:t.top,w:e,h:s,radius:o},inner:{x:t.left+n.l,y:t.top+n.t,w:e-n.l-n.r,h:s-n.t-n.b,radius:{topLeft:Math.max(0,o.topLeft-Math.max(n.t,n.l)),topRight:Math.max(0,o.topRight-Math.max(n.t,n.r)),bottomLeft:Math.max(0,o.bottomLeft-Math.max(n.b,n.l)),bottomRight:Math.max(0,o.bottomRight-Math.max(n.b,n.r))}}}}function ps(i,t,e,s){const n=t===null,o=e===null,a=i&&!(n&&o)&&Do(i,s);return a&&(n||bt(t,a.left,a.right))&&(o||bt(e,a.top,a.bottom))}function _r(i,t){i.rect(t.x,t.y,t.w,t.h)}function ms(i,t,e={}){const s=i.x!==e.x?-t:0,n=i.y!==e.y?-t:0,o=(i.x+i.w!==e.x+e.w?t:0)-s,a=(i.y+i.h!==e.y+e.h?t:0)-n;return{x:i.x+s,y:i.y+n,w:i.w+o,h:i.h+a,radius:i.radius}}var bs=Object.freeze({__proto__:null,ArcElement:(le=class extends dt{constructor(t){super();S(this,\"circumference\");S(this,\"endAngle\");S(this,\"fullCircles\");S(this,\"innerRadius\");S(this,\"outerRadius\");S(this,\"pixelMargin\");S(this,\"startAngle\");this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,t&&Object.assign(this,t)}inRange(t,e,s){const n=this.getProps([\"x\",\"y\"],s),{angle:o,distance:a}=Ci(n,{x:t,y:e}),{startAngle:r,endAngle:l,innerRadius:h,outerRadius:d,circumference:c}=this.getProps([\"startAngle\",\"endAngle\",\"innerRadius\",\"outerRadius\",\"circumference\"],s),u=(this.options.spacing+this.options.borderWidth)/2,f=R(c,l-r)>=Y||te(o,r,l),p=bt(a,h+u,d+u);return f&&p}getCenterPoint(t){const{x:e,y:s,startAngle:n,endAngle:o,innerRadius:a,outerRadius:r}=this.getProps([\"x\",\"y\",\"startAngle\",\"endAngle\",\"innerRadius\",\"outerRadius\"],t),{offset:l,spacing:h}=this.options,d=(n+o)/2,c=(a+r+h+l)/2;return{x:e+Math.cos(d)*c,y:s+Math.sin(d)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:s}=this,n=(e.offset||0)/4,o=(e.spacing||0)/2,a=e.circular;if(this.pixelMargin=e.borderAlign===\"inner\"?.33:0,this.fullCircles=s>Y?Math.floor(s/Y):0,s===0||this.innerRadius<0||this.outerRadius<0)return;t.save();const r=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(r)*n,Math.sin(r)*n);const l=n*(1-Math.sin(Math.min($,s||0)));t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,function(h,d,c,u,f){const{fullCircles:p,startAngle:g,circumference:m}=d;let b=d.endAngle;if(p){fi(h,d,c,u,b,f);for(let _=0;_<p;++_)h.fill();isNaN(m)||(b=g+(m%Y||Y))}fi(h,d,c,u,b,f),h.fill()}(t,this,l,o,a),ur(t,this,l,o,a),t.restore()}},S(le,\"id\",\"arc\"),S(le,\"defaults\",{borderAlign:\"center\",borderColor:\"#fff\",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0}),S(le,\"defaultRoutes\",{backgroundColor:\"backgroundColor\"}),S(le,\"descriptors\",{_scriptable:!0,_indexable:t=>t!==\"borderDash\"}),le),BarElement:(Ve=class extends dt{constructor(i){super(),this.options=void 0,this.horizontal=void 0,this.base=void 0,this.width=void 0,this.height=void 0,this.inflateAmount=void 0,i&&Object.assign(this,i)}draw(i){const{inflateAmount:t,options:{borderColor:e,backgroundColor:s}}=this,{inner:n,outer:o}=xr(this),a=(r=o.radius).topLeft||r.topRight||r.bottomLeft||r.bottomRight?se:_r;var r;i.save(),o.w===n.w&&o.h===n.h||(i.beginPath(),a(i,ms(o,t,n)),i.clip(),a(i,ms(n,-t,o)),i.fillStyle=e,i.fill(\"evenodd\")),i.beginPath(),a(i,ms(n,t)),i.fillStyle=s,i.fill(),i.restore()}inRange(i,t,e){return ps(this,i,t,e)}inXRange(i,t){return ps(this,i,null,t)}inYRange(i,t){return ps(this,null,i,t)}getCenterPoint(i){const{x:t,y:e,base:s,horizontal:n}=this.getProps([\"x\",\"y\",\"base\",\"horizontal\"],i);return{x:n?(t+s)/2:t,y:n?e:(e+s)/2}}getRange(i){return i===\"x\"?this.width/2:this.height/2}},S(Ve,\"id\",\"bar\"),S(Ve,\"defaults\",{borderSkipped:\"start\",borderWidth:0,borderRadius:0,inflateAmount:\"auto\",pointStyle:void 0}),S(Ve,\"defaultRoutes\",{backgroundColor:\"backgroundColor\",borderColor:\"borderColor\"}),Ve),LineElement:Bt,PointElement:(Be=class extends dt{constructor(t){super();S(this,\"parsed\");S(this,\"skip\");S(this,\"stop\");this.options=void 0,this.parsed=void 0,this.skip=void 0,this.stop=void 0,t&&Object.assign(this,t)}inRange(t,e,s){const n=this.options,{x:o,y:a}=this.getProps([\"x\",\"y\"],s);return Math.pow(t-o,2)+Math.pow(e-a,2)<Math.pow(n.hitRadius+n.radius,2)}inXRange(t,e){return Po(this,t,\"x\",e)}inYRange(t,e){return Po(this,t,\"y\",e)}getCenterPoint(t){const{x:e,y:s}=this.getProps([\"x\",\"y\"],t);return{x:e,y:s}}size(t){let e=(t=t||this.options||{}).radius||0;return e=Math.max(e,e&&t.hoverRadius||0),2*(e+(e&&t.borderWidth||0))}draw(t,e){const s=this.options;this.skip||s.radius<.1||!yt(this,e,this.size(s)/2)||(t.strokeStyle=s.borderColor,t.lineWidth=s.borderWidth,t.fillStyle=s.backgroundColor,ti(t,s,this.x,this.y))}getRange(){const t=this.options||{};return t.radius+t.hitRadius}},S(Be,\"id\",\"point\"),S(Be,\"defaults\",{borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:\"circle\",radius:3,rotation:0}),S(Be,\"defaultRoutes\",{backgroundColor:\"backgroundColor\",borderColor:\"borderColor\"}),Be)});function yr(i,t,e,s){const n=i.indexOf(t);return n===-1?((o,a,r,l)=>(typeof a==\"string\"?(r=o.push(a)-1,l.unshift({index:r,label:a})):isNaN(a)&&(r=null),r))(i,t,e,s):n!==i.lastIndexOf(t)?e:n}function Co(i){const t=this.getLabels();return i>=0&&i<t.length?t[i]:i}function Oo(i,t,{horizontal:e,minRotation:s}){const n=lt(s),o=(e?Math.sin(n):Math.cos(n))||.001,a=.75*t*(\"\"+i).length;return Math.min(t/o,a)}class gi extends Vt{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return z(t)||(typeof t==\"number\"||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:s}=this.getUserBounds();let{min:n,max:o}=this;const a=l=>n=e?n:l,r=l=>o=s?o:l;if(t){const l=ft(n),h=ft(o);l<0&&h<0?r(0):l>0&&h>0&&a(0)}if(n===o){let l=o===0?1:Math.abs(.05*o);r(o+l),t||a(n-l)}this.min=n,this.max=o}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:s,stepSize:n}=t;return n?(e=Math.ceil(this.max/n)-Math.floor(this.min/n)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${n} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),s=s||11),s&&(e=Math.min(s,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let s=this.getTickLimit();s=Math.max(2,s);const n=function(o,a){const r=[],{bounds:l,step:h,min:d,max:c,precision:u,count:f,maxTicks:p,maxDigits:g,includeBounds:m}=o,b=h||1,_=p-1,{min:y,max:x}=a,v=!z(d),M=!z(c),w=!z(f),k=(x-y)/(g+1);let C,P,L,T,D=Si((x-y)/_/b)*b;if(D<1e-14&&!v&&!M)return[{value:y},{value:x}];T=Math.ceil(x/D)-Math.floor(y/D),T>_&&(D=Si(T*D/_/b)*b),z(u)||(C=Math.pow(10,u),D=Math.ceil(D*C)/C),l===\"ticks\"?(P=Math.floor(y/D)*D,L=Math.ceil(x/D)*D):(P=y,L=x),v&&M&&h&&Vs((c-d)/h,D/1e3)?(T=Math.round(Math.min((c-d)/D,p)),D=(c-d)/T,P=d,L=c):w?(P=v?d:P,L=M?c:L,T=f-1,D=(L-P)/T):(T=(L-P)/D,T=Jt(T,Math.round(T),D/1e3)?Math.round(T):Math.ceil(T));const A=Math.max(Di(D),Di(P));C=Math.pow(10,z(u)?A:u),P=Math.round(P*C)/C,L=Math.round(L*C)/C;let O=0;for(v&&(m&&P!==d?(r.push({value:d}),P<d&&O++,Jt(Math.round((P+O*D)*C)/C,d,Oo(d,k,o))&&O++):P<d&&O++);O<T;++O){const E=Math.round((P+O*D)*C)/C;if(M&&E>c)break;r.push({value:E})}return M&&m&&L!==c?r.length&&Jt(r[r.length-1].value,c,Oo(c,k,o))?r[r.length-1].value=c:r.push({value:c}):M&&L!==c||r.push({value:L}),r}({maxTicks:s,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:e.includeBounds!==!1},this._range||this);return t.bounds===\"ticks\"&&Pi(n,this,\"value\"),t.reverse?(n.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),n}configure(){const t=this.ticks;let e=this.min,s=this.max;if(super.configure(),this.options.offset&&t.length){const n=(s-e)/Math.max(t.length-1,1)/2;e-=n,s+=n}this._startValue=e,this._endValue=s,this._valueRange=s-e}getLabelForValue(t){return ie(t,this.chart.options.locale,this.options.ticks.format)}}class xs extends gi{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=U(t)?t:0,this.max=U(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,s=lt(this.options.ticks.minRotation),n=(t?Math.sin(s):Math.cos(s))||.001,o=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,o.lineHeight/n))}getPixelForValue(t){return t===null?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}S(xs,\"id\",\"linear\"),S(xs,\"defaults\",{ticks:{callback:pe.formatters.numeric}});const Oe=i=>Math.floor(kt(i)),Kt=(i,t)=>Math.pow(10,Oe(i)+t);function Ao(i){return i/Math.pow(10,Oe(i))===1}function To(i,t,e){const s=Math.pow(10,e),n=Math.floor(i/s);return Math.ceil(t/s)-n}function vr(i,{min:t,max:e}){t=et(i.min,t);const s=[],n=Oe(t);let o=function(p,g){let m=Oe(g-p);for(;To(p,g,m)>10;)m++;for(;To(p,g,m)<10;)m--;return Math.min(m,Oe(p))}(t,e),a=o<0?Math.pow(10,Math.abs(o)):1;const r=Math.pow(10,o),l=n>o?Math.pow(10,n):0,h=Math.round((t-l)*a)/a,d=Math.floor((t-l)/r/10)*r*10;let c=Math.floor((h-d)/Math.pow(10,o)),u=et(i.min,Math.round((l+d+c*Math.pow(10,o))*a)/a);for(;u<e;)s.push({value:u,major:Ao(u),significand:c}),c>=10?c=c<15?15:20:c++,c>=20&&(o++,c=2,a=o>=0?1:a),u=Math.round((l+d+c*Math.pow(10,o))*a)/a;const f=et(i.max,u);return s.push({value:f,major:Ao(f),significand:c}),s}class _s extends Vt{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const s=gi.prototype.parse.apply(this,[t,e]);if(s!==0)return U(s)&&s>0?s:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=U(t)?Math.max(0,t):null,this.max=U(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!U(this._userMin)&&(this.min=t===Kt(this.min,0)?Kt(this.min,-1):Kt(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let s=this.min,n=this.max;const o=r=>s=t?s:r,a=r=>n=e?n:r;s===n&&(s<=0?(o(1),a(10)):(o(Kt(s,-1)),a(Kt(n,1)))),s<=0&&o(Kt(n,-1)),n<=0&&a(Kt(s,1)),this.min=s,this.max=n}buildTicks(){const t=this.options,e=vr({min:this._userMin,max:this._userMax},this);return t.bounds===\"ticks\"&&Pi(e,this,\"value\"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}getLabelForValue(t){return t===void 0?\"0\":ie(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=kt(t),this._valueRange=kt(this.max)-kt(t)}getPixelForValue(t){return t!==void 0&&t!==0||(t=this.min),t===null||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(kt(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}S(_s,\"id\",\"logarithmic\"),S(_s,\"defaults\",{ticks:{callback:pe.formatters.logarithmic,major:{enabled:!0}}});function ys(i){const t=i.ticks;if(t.display&&i.display){const e=Q(t.backdropPadding);return R(t.font&&t.font.size,q.font.size)+e.height}return 0}function Lo(i,t,e,s,n){return i===s||i===n?{start:t-e/2,end:t+e/2}:i<s||i>n?{start:t-e,end:t}:{start:t,end:t+e}}function Mr(i){const t={l:i.left+i._padding.left,r:i.right-i._padding.right,t:i.top+i._padding.top,b:i.bottom-i._padding.bottom},e=Object.assign({},t),s=[],n=[],o=i._pointLabels.length,a=i.options.pointLabels,r=a.centerPointLabels?$/o:0;for(let c=0;c<o;c++){const u=a.setContext(i.getPointLabelContext(c));n[c]=u.padding;const f=i.getPointPosition(c,i.drawingArea+n[c],r),p=K(u.font),g=(l=i.ctx,h=p,d=j(d=i._pointLabels[c])?d:[d],{w:rn(l,h.string,d),h:d.length*h.lineHeight});s[c]=g;const m=it(i.getIndexAngle(c)+r),b=Math.round(Ne(m));wr(e,t,m,Lo(b,f.x,g.w,0,180),Lo(b,f.y,g.h,90,270))}var l,h,d;i.setCenterPoint(t.l-e.l,e.r-t.r,t.t-e.t,e.b-t.b),i._pointLabelItems=function(c,u,f){const p=[],g=c._pointLabels.length,m=c.options,{centerPointLabels:b,display:_}=m.pointLabels,y={extra:ys(m)/2,additionalAngle:b?$/g:0};let x;for(let v=0;v<g;v++){y.padding=f[v],y.size=u[v];const M=kr(c,v,y);p.push(M),_===\"auto\"&&(M.visible=Sr(M,x),M.visible&&(x=M))}return p}(i,s,n)}function wr(i,t,e,s,n){const o=Math.abs(Math.sin(e)),a=Math.abs(Math.cos(e));let r=0,l=0;s.start<t.l?(r=(t.l-s.start)/o,i.l=Math.min(i.l,t.l-r)):s.end>t.r&&(r=(s.end-t.r)/o,i.r=Math.max(i.r,t.r+r)),n.start<t.t?(l=(t.t-n.start)/a,i.t=Math.min(i.t,t.t-l)):n.end>t.b&&(l=(n.end-t.b)/a,i.b=Math.max(i.b,t.b+l))}function kr(i,t,e){const s=i.drawingArea,{extra:n,additionalAngle:o,padding:a,size:r}=e,l=i.getPointPosition(t,s+n+a,o),h=Math.round(Ne(it(l.angle+X))),d=function(f,p,g){return g===90||g===270?f-=p/2:(g>270||g<90)&&(f-=p),f}(l.y,r.h,h),c=function(f){return f===0||f===180?\"center\":f<180?\"left\":\"right\"}(h),u=function(f,p,g){return g===\"right\"?f-=p:g===\"center\"&&(f-=p/2),f}(l.x,r.w,c);return{visible:!0,x:l.x,y:d,textAlign:c,left:u,top:d,right:u+r.w,bottom:d+r.h}}function Sr(i,t){if(!t)return!0;const{left:e,top:s,right:n,bottom:o}=i;return!(yt({x:e,y:s},t)||yt({x:e,y:o},t)||yt({x:n,y:s},t)||yt({x:n,y:o},t))}function Pr(i,t,e){const{left:s,top:n,right:o,bottom:a}=e,{backdropColor:r}=t;if(!z(r)){const l=Ft(t.borderRadius),h=Q(t.backdropPadding);i.fillStyle=r;const d=s-h.left,c=n-h.top,u=o-s+h.width,f=a-n+h.height;Object.values(l).some(p=>p!==0)?(i.beginPath(),se(i,{x:d,y:c,w:u,h:f,radius:l}),i.fill()):i.fillRect(d,c,u,f)}}function Eo(i,t,e,s){const{ctx:n}=i;if(e)n.arc(i.xCenter,i.yCenter,t,0,Y);else{let o=i.getPointPosition(0,t);n.moveTo(o.x,o.y);for(let a=1;a<s;a++)o=i.getPointPosition(a,t),n.lineTo(o.x,o.y)}}class Ae extends gi{constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=Q(ys(this.options)/2),e=this.width=this.maxWidth-t.width,s=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+e/2+t.left),this.yCenter=Math.floor(this.top+s/2+t.top),this.drawingArea=Math.floor(Math.min(e,s)/2)}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!1);this.min=U(t)&&!isNaN(t)?t:0,this.max=U(e)&&!isNaN(e)?e:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/ys(this.options))}generateTickLabels(t){gi.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map((e,s)=>{const n=N(this.options.pointLabels.callback,[e,s],this);return n||n===0?n:\"\"}).filter((e,s)=>this.chart.getDataVisibility(s))}fit(){const t=this.options;t.display&&t.pointLabels.display?Mr(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,s,n){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((s-n)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,s,n))}getIndexAngle(t){return it(t*(Y/(this._pointLabels.length||1))+lt(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if(z(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(z(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t<e.length){const s=e[t];return function(n,o,a){return Pt(n,{label:a,index:o,type:\"pointLabel\"})}(this.getContext(),t,s)}}getPointPosition(t,e,s=0){const n=this.getIndexAngle(t)-X+s;return{x:Math.cos(n)*e+this.xCenter,y:Math.sin(n)*e+this.yCenter,angle:n}}getPointPositionForValue(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))}getBasePosition(t){return this.getPointPositionForValue(t||0,this.getBaseValue())}getPointLabelPosition(t){const{left:e,top:s,right:n,bottom:o}=this._pointLabelItems[t];return{left:e,top:s,right:n,bottom:o}}drawBackground(){const{backgroundColor:t,grid:{circular:e}}=this.options;if(t){const s=this.ctx;s.save(),s.beginPath(),Eo(this,this.getDistanceFromCenterForValue(this._endValue),e,this._pointLabels.length),s.closePath(),s.fillStyle=t,s.fill(),s.restore()}}drawGrid(){const t=this.ctx,e=this.options,{angleLines:s,grid:n,border:o}=e,a=this._pointLabels.length;let r,l,h;if(e.pointLabels.display&&function(d,c){const{ctx:u,options:{pointLabels:f}}=d;for(let p=c-1;p>=0;p--){const g=d._pointLabelItems[p];if(!g.visible)continue;const m=f.setContext(d.getPointLabelContext(p));Pr(u,m,g);const b=K(m.font),{x:_,y,textAlign:x}=g;It(u,d._pointLabels[p],_,y+b.lineHeight/2,b,{color:m.color,textAlign:x,textBaseline:\"middle\"})}}(this,a),n.display&&this.ticks.forEach((d,c)=>{if(c!==0){l=this.getDistanceFromCenterForValue(d.value);const u=this.getContext(c),f=n.setContext(u),p=o.setContext(u);(function(g,m,b,_,y){const x=g.ctx,v=m.circular,{color:M,lineWidth:w}=m;!v&&!_||!M||!w||b<0||(x.save(),x.strokeStyle=M,x.lineWidth=w,x.setLineDash(y.dash),x.lineDashOffset=y.dashOffset,x.beginPath(),Eo(g,b,v,_),x.closePath(),x.stroke(),x.restore())})(this,f,l,a,p)}}),s.display){for(t.save(),r=a-1;r>=0;r--){const d=s.setContext(this.getPointLabelContext(r)),{color:c,lineWidth:u}=d;u&&c&&(t.lineWidth=u,t.strokeStyle=c,t.setLineDash(d.borderDash),t.lineDashOffset=d.borderDashOffset,l=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),h=this.getPointPosition(r,l),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(h.x,h.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,s=e.ticks;if(!s.display)return;const n=this.getIndexAngle(0);let o,a;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(n),t.textAlign=\"center\",t.textBaseline=\"middle\",this.ticks.forEach((r,l)=>{if(l===0&&!e.reverse)return;const h=s.setContext(this.getContext(l)),d=K(h.font);if(o=this.getDistanceFromCenterForValue(this.ticks[l].value),h.showLabelBackdrop){t.font=d.string,a=t.measureText(r.label).width,t.fillStyle=h.backdropColor;const c=Q(h.backdropPadding);t.fillRect(-a/2-c.left,-o-d.size/2-c.top,a+c.width,d.size+c.height)}It(t,r.label,0,-o,d,{color:h.color,strokeColor:h.textStrokeColor,strokeWidth:h.textStrokeWidth})}),t.restore()}drawTitle(){}}S(Ae,\"id\",\"radialLinear\"),S(Ae,\"defaults\",{display:!0,animate:!0,position:\"chartArea\",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:pe.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback:t=>t,padding:5,centerPointLabels:!1}}),S(Ae,\"defaultRoutes\",{\"angleLines.color\":\"borderColor\",\"pointLabels.color\":\"color\",\"ticks.color\":\"color\"}),S(Ae,\"descriptors\",{angleLines:{_fallback:\"grid\"}});const pi={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},st=Object.keys(pi);function Ro(i,t){return i-t}function Io(i,t){if(z(t))return null;const e=i._adapter,{parser:s,round:n,isoWeekday:o}=i._parseOpts;let a=t;return typeof s==\"function\"&&(a=s(a)),U(a)||(a=typeof s==\"string\"?e.parse(a,s):e.parse(a)),a===null?null:(n&&(a=n!==\"week\"||!Ht(o)&&o!==!0?e.startOf(a,n):e.startOf(a,\"isoWeek\",o)),+a)}function zo(i,t,e,s){const n=st.length;for(let o=st.indexOf(i);o<n-1;++o){const a=pi[st[o]],r=a.steps?a.steps:Number.MAX_SAFE_INTEGER;if(a.common&&Math.ceil((e-t)/(r*a.size))<=s)return st[o]}return st[n-1]}function Fo(i,t,e){if(e){if(e.length){const{lo:s,hi:n}=je(e,t);i[e[s]>=t?e[s]:e[n]]=!0}}else i[t]=!0}function Vo(i,t,e){const s=[],n={},o=t.length;let a,r;for(a=0;a<o;++a)r=t[a],n[r]=a,s.push({value:r,major:!1});return o!==0&&e?function(l,h,d,c){const u=l._adapter,f=+u.startOf(h[0].value,c),p=h[h.length-1].value;let g,m;for(g=f;g<=p;g=+u.add(g,1,c))m=d[g],m>=0&&(h[m].major=!0);return h}(i,s,n,e):s}class Te extends Vt{constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit=\"day\",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e={}){const s=t.time||(t.time={}),n=this._adapter=new xo._date(t.adapters.date);n.init(e),Zt(s.displayFormats,n.formats()),this._parseOpts={parser:s.parser,round:s.round,isoWeekday:s.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return t===void 0?null:Io(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,s=t.time.unit||\"day\";let{min:n,max:o,minDefined:a,maxDefined:r}=this.getUserBounds();function l(h){a||isNaN(h.min)||(n=Math.min(n,h.min)),r||isNaN(h.max)||(o=Math.max(o,h.max))}a&&r||(l(this._getLabelBounds()),t.bounds===\"ticks\"&&t.ticks.source===\"labels\"||l(this.getMinMax(!1))),n=U(n)&&!isNaN(n)?n:+e.startOf(Date.now(),s),o=U(o)&&!isNaN(o)?o:+e.endOf(Date.now(),s)+1,this.min=Math.min(n,o-1),this.max=Math.max(n+1,o)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],s=t[t.length-1]),{min:e,max:s}}buildTicks(){const t=this.options,e=t.time,s=t.ticks,n=s.source===\"labels\"?this.getLabelTimestamps():this._generate();t.bounds===\"ticks\"&&n.length&&(this.min=this._userMin||n[0],this.max=this._userMax||n[n.length-1]);const o=this.min,a=Hs(n,o,this.max);return this._unit=e.unit||(s.autoSkip?zo(e.minUnit,this.min,this.max,this._getLabelCapacity(o)):function(r,l,h,d,c){for(let u=st.length-1;u>=st.indexOf(h);u--){const f=st[u];if(pi[f].common&&r._adapter.diff(c,d,f)>=l-1)return f}return st[h?st.indexOf(h):0]}(this,a.length,e.minUnit,this.min,this.max)),this._majorUnit=s.major.enabled&&this._unit!==\"year\"?function(r){for(let l=st.indexOf(r)+1,h=st.length;l<h;++l)if(pi[st[l]].common)return st[l]}(this._unit):void 0,this.initOffsets(n),t.reverse&&a.reverse(),Vo(this,a,this._majorUnit)}afterAutoSkip(){this.options.offsetAfterAutoskip&&this.initOffsets(this.ticks.map(t=>+t.value))}initOffsets(t=[]){let e,s,n=0,o=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),n=t.length===1?1-e:(this.getDecimalForValue(t[1])-e)/2,s=this.getDecimalForValue(t[t.length-1]),o=t.length===1?s:(s-this.getDecimalForValue(t[t.length-2]))/2);const a=t.length<3?.5:.25;n=G(n,0,a),o=G(o,0,a),this._offsets={start:n,end:o,factor:1/(n+1+o)}}_generate(){const t=this._adapter,e=this.min,s=this.max,n=this.options,o=n.time,a=o.unit||zo(o.minUnit,e,s,this._getLabelCapacity(e)),r=R(n.ticks.stepSize,1),l=a===\"week\"&&o.isoWeekday,h=Ht(l)||l===!0,d={};let c,u,f=e;if(h&&(f=+t.startOf(f,\"isoWeek\",l)),f=+t.startOf(f,h?\"day\":a),t.diff(s,e,a)>1e5*r)throw new Error(e+\" and \"+s+\" are too far apart with stepSize of \"+r+\" \"+a);const p=n.ticks.source===\"data\"&&this.getDataTimestamps();for(c=f,u=0;c<s;c=+t.add(c,r,a),u++)Fo(d,c,p);return c!==s&&n.bounds!==\"ticks\"&&u!==1||Fo(d,c,p),Object.keys(d).sort(Ro).map(g=>+g)}getLabelForValue(t){const e=this._adapter,s=this.options.time;return s.tooltipFormat?e.format(t,s.tooltipFormat):e.format(t,s.displayFormats.datetime)}format(t,e){const s=this.options.time.displayFormats,n=this._unit,o=e||s[n];return this._adapter.format(t,o)}_tickFormatFunction(t,e,s,n){const o=this.options,a=o.ticks.callback;if(a)return N(a,[t,e,s],this);const r=o.time.displayFormats,l=this._unit,h=this._majorUnit,d=l&&r[l],c=h&&r[h],u=s[e],f=h&&c&&u&&u.major;return this._adapter.format(t,n||(f?c:d))}generateTickLabels(t){let e,s,n;for(e=0,s=t.length;e<s;++e)n=t[e],n.label=this._tickFormatFunction(n.value,e,t)}getDecimalForValue(t){return t===null?NaN:(t-this.min)/(this.max-this.min)}getPixelForValue(t){const e=this._offsets,s=this.getDecimalForValue(t);return this.getPixelForDecimal((e.start+s)*e.factor)}getValueForPixel(t){const e=this._offsets,s=this.getDecimalForPixel(t)/e.factor-e.end;return this.min+s*(this.max-this.min)}_getLabelSize(t){const e=this.options.ticks,s=this.ctx.measureText(t).width,n=lt(this.isHorizontal()?e.maxRotation:e.minRotation),o=Math.cos(n),a=Math.sin(n),r=this._resolveTickFontOptions(0).size;return{w:s*o+r*a,h:s*a+r*o}}_getLabelCapacity(t){const e=this.options.time,s=e.displayFormats,n=s[e.unit]||s.millisecond,o=this._tickFormatFunction(t,0,Vo(this,[t],this._majorUnit),n),a=this._getLabelSize(o),r=Math.floor(this.isHorizontal()?this.width/a.w:this.height/a.h)-1;return r>0?r:1}getDataTimestamps(){let t,e,s=this._cache.data||[];if(s.length)return s;const n=this.getMatchingVisibleMetas();if(this._normalized&&n.length)return this._cache.data=n[0].controller.getAllParsedValues(this);for(t=0,e=n.length;t<e;++t)s=s.concat(n[t].controller.getAllParsedValues(this));return this._cache.data=this.normalize(s)}getLabelTimestamps(){const t=this._cache.labels||[];let e,s;if(t.length)return t;const n=this.getLabels();for(e=0,s=n.length;e<s;++e)t.push(Io(this,n[e]));return this._cache.labels=this._normalized?t:this.normalize(t)}normalize(t){return Ai(t.sort(Ro))}}S(Te,\"id\",\"time\"),S(Te,\"defaults\",{bounds:\"data\",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:\"millisecond\",displayFormats:{}},ticks:{source:\"auto\",callback:!1,major:{enabled:!1}}});function mi(i,t,e){let s,n,o,a,r=0,l=i.length-1;e?(t>=i[r].pos&&t<=i[l].pos&&({lo:r,hi:l}=xt(i,\"pos\",t)),{pos:s,time:o}=i[r],{pos:n,time:a}=i[l]):(t>=i[r].time&&t<=i[l].time&&({lo:r,hi:l}=xt(i,\"time\",t)),{time:s,pos:o}=i[r],{time:n,pos:a}=i[l]);const h=n-s;return h?o+(a-o)*(t-s)/h:o}var Bo=Object.freeze({__proto__:null,CategoryScale:(yi=class extends Vt{constructor(i){super(i),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(i){const t=this._addedLabels;if(t.length){const e=this.getLabels();for(const{index:s,label:n}of t)e[s]===n&&e.splice(s,1);this._addedLabels=[]}super.init(i)}parse(i,t){if(z(i))return null;const e=this.getLabels();return((s,n)=>s===null?null:G(Math.round(s),0,n))(t=isFinite(t)&&e[t]===i?t:yr(e,i,R(t,i),this._addedLabels),e.length-1)}determineDataLimits(){const{minDefined:i,maxDefined:t}=this.getUserBounds();let{min:e,max:s}=this.getMinMax(!0);this.options.bounds===\"ticks\"&&(i||(e=0),t||(s=this.getLabels().length-1)),this.min=e,this.max=s}buildTicks(){const i=this.min,t=this.max,e=this.options.offset,s=[];let n=this.getLabels();n=i===0&&t===n.length-1?n:n.slice(i,t+1),this._valueRange=Math.max(n.length-(e?0:1),1),this._startValue=this.min-(e?.5:0);for(let o=i;o<=t;o++)s.push({value:o});return s}getLabelForValue(i){return Co.call(this,i)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(i){return typeof i!=\"number\"&&(i=this.parse(i)),i===null?NaN:this.getPixelForDecimal((i-this._startValue)/this._valueRange)}getPixelForTick(i){const t=this.ticks;return i<0||i>t.length-1?null:this.getPixelForValue(t[i].value)}getValueForPixel(i){return Math.round(this._startValue+this.getDecimalForPixel(i)*this._valueRange)}getBasePixel(){return this.bottom}},S(yi,\"id\",\"category\"),S(yi,\"defaults\",{ticks:{callback:Co}}),yi),LinearScale:xs,LogarithmicScale:_s,RadialLinearScale:Ae,TimeScale:Te,TimeSeriesScale:(vi=class extends Te{constructor(i){super(i),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const i=this._getTimestampsForTable(),t=this._table=this.buildLookupTable(i);this._minPos=mi(t,this.min),this._tableRange=mi(t,this.max)-this._minPos,super.initOffsets(i)}buildLookupTable(i){const{min:t,max:e}=this,s=[],n=[];let o,a,r,l,h;for(o=0,a=i.length;o<a;++o)l=i[o],l>=t&&l<=e&&s.push(l);if(s.length<2)return[{time:t,pos:0},{time:e,pos:1}];for(o=0,a=s.length;o<a;++o)h=s[o+1],r=s[o-1],l=s[o],Math.round((h+r)/2)!==l&&n.push({time:l,pos:o/(a-1)});return n}_generate(){const i=this.min,t=this.max;let e=super.getDataTimestamps();return e.includes(i)&&e.length||e.splice(0,0,i),e.includes(t)&&e.length!==1||e.push(t),e.sort((s,n)=>s-n)}_getTimestampsForTable(){let i=this._cache.all||[];if(i.length)return i;const t=this.getDataTimestamps(),e=this.getLabelTimestamps();return i=t.length&&e.length?this.normalize(t.concat(e)):t.length?t:e,i=this._cache.all=i,i}getDecimalForValue(i){return(mi(this._table,i)-this._minPos)/this._tableRange}getValueForPixel(i){const t=this._offsets,e=this.getDecimalForPixel(i)/t.factor-t.end;return mi(this._table,e*this._tableRange+this._minPos,!0)}},S(vi,\"id\",\"timeseries\"),S(vi,\"defaults\",Te.defaults),vi)});const vs=[\"rgb(54, 162, 235)\",\"rgb(255, 99, 132)\",\"rgb(255, 159, 64)\",\"rgb(255, 205, 86)\",\"rgb(75, 192, 192)\",\"rgb(153, 102, 255)\",\"rgb(201, 203, 207)\"],Wo=vs.map(i=>i.replace(\"rgb(\",\"rgba(\").replace(\")\",\", 0.5)\"));function No(i){return vs[i%vs.length]}function Ho(i){return Wo[i%Wo.length]}function Dr(i){let t=0;return(e,s)=>{const n=i.getDatasetMeta(s).controller;n instanceof qt?t=function(o,a){return o.backgroundColor=o.data.map(()=>No(a++)),a}(e,t):n instanceof Ce?t=function(o,a){return o.backgroundColor=o.data.map(()=>Ho(a++)),a}(e,t):n&&(t=function(o,a){return o.borderColor=No(a),o.backgroundColor=Ho(a),++a}(e,t))}}function jo(i){let t;for(t in i)if(i[t].borderColor||i[t].backgroundColor)return!0;return!1}var Cr={id:\"colors\",defaults:{enabled:!0,forceOverride:!1},beforeLayout(i,t,e){if(!e.enabled)return;const{data:{datasets:s},options:n}=i.config,{elements:o}=n;if(!e.forceOverride&&(jo(s)||(a=n)&&(a.borderColor||a.backgroundColor)||o&&jo(o)))return;var a;const r=Dr(i);s.forEach(r)}};function $o(i){if(i._decimated){const t=i._data;delete i._decimated,delete i._data,Object.defineProperty(i,\"data\",{configurable:!0,enumerable:!0,writable:!0,value:t})}}function Yo(i){i.data.datasets.forEach(t=>{$o(t)})}var Or={id:\"decimation\",defaults:{algorithm:\"min-max\",enabled:!1},beforeElementsUpdate:(i,t,e)=>{if(!e.enabled)return void Yo(i);const s=i.width;i.data.datasets.forEach((n,o)=>{const{_data:a,indexAxis:r}=n,l=i.getDatasetMeta(o),h=a||n.data;if(ae([r,i.options.indexAxis])===\"y\"||!l.controller.supportsDecimation)return;const d=i.scales[l.xAxisID];if(d.type!==\"linear\"&&d.type!==\"time\"||i.options.parsing)return;let{start:c,count:u}=function(p,g){const m=g.length;let b,_=0;const{iScale:y}=p,{min:x,max:v,minDefined:M,maxDefined:w}=y.getUserBounds();return M&&(_=G(xt(g,y.axis,x).lo,0,m-1)),b=w?G(xt(g,y.axis,v).hi+1,_,m)-_:m-_,{start:_,count:b}}(l,h);if(u<=(e.threshold||4*s))return void $o(n);let f;switch(z(a)&&(n._data=h,delete n.data,Object.defineProperty(n,\"data\",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(p){this._data=p}})),e.algorithm){case\"lttb\":f=function(p,g,m,b,_){const y=_.samples||b;if(y>=m)return p.slice(g,g+m);const x=[],v=(m-2)/(y-2);let M=0;const w=g+m-1;let k,C,P,L,T,D=g;for(x[M++]=p[D],k=0;k<y-2;k++){let A,O=0,E=0;const B=Math.floor((k+1)*v)+1+g,F=Math.min(Math.floor((k+2)*v)+1,m)+g,tt=F-B;for(A=B;A<F;A++)O+=p[A].x,E+=p[A].y;O/=tt,E/=tt;const at=Math.floor(k*v)+1+g,rt=Math.min(Math.floor((k+1)*v)+1,m)+g,{x:ut,y:pt}=p[D];for(P=L=-1,A=at;A<rt;A++)L=.5*Math.abs((ut-O)*(p[A].y-pt)-(ut-p[A].x)*(E-pt)),L>P&&(P=L,C=p[A],T=A);x[M++]=C,D=T}return x[M++]=p[w],x}(h,c,u,s,e);break;case\"min-max\":f=function(p,g,m,b){let _,y,x,v,M,w,k,C,P,L,T=0,D=0;const A=[],O=g+m-1,E=p[g].x,B=p[O].x-E;for(_=g;_<g+m;++_){y=p[_],x=(y.x-E)/B*b,v=y.y;const F=0|x;if(F===M)v<P?(P=v,w=_):v>L&&(L=v,k=_),T=(D*T+y.x)/++D;else{const tt=_-1;if(!z(w)&&!z(k)){const at=Math.min(w,k),rt=Math.max(w,k);at!==C&&at!==tt&&A.push({...p[at],x:T}),rt!==C&&rt!==tt&&A.push({...p[rt],x:T})}_>0&&tt!==C&&A.push(p[tt]),A.push(y),M=F,D=0,P=L=v,w=k=C=_}}return A}(h,c,u,s);break;default:throw new Error(`Unsupported decimation algorithm '${e.algorithm}'`)}n._decimated=f})},destroy(i){Yo(i)}};function Ms(i,t,e,s){if(s)return;let n=t[i],o=e[i];return i===\"angle\"&&(n=it(n),o=it(o)),{property:i,start:n,end:o}}function ws(i,t,e){for(;t>i;t--){const s=e[t];if(!isNaN(s.x)&&!isNaN(s.y))break}return t}function Uo(i,t,e,s){return i&&t?s(i[e],t[e]):i?i[e]:t?t[e]:0}function Xo(i,t){let e=[],s=!1;return j(i)?(s=!0,e=i):e=function(n,o){const{x:a=null,y:r=null}=n||{},l=o.points,h=[];return o.segments.forEach(({start:d,end:c})=>{c=ws(d,c,l);const u=l[d],f=l[c];r!==null?(h.push({x:u.x,y:r}),h.push({x:f.x,y:r})):a!==null&&(h.push({x:a,y:u.y}),h.push({x:a,y:f.y}))}),h}(i,t),e.length?new Bt({points:e,options:{tension:0},_loop:s,_fullLoop:s}):null}function qo(i){return i&&i.fill!==!1}function Ar(i,t,e){let s=i[t].fill;const n=[t];let o;if(!e)return s;for(;s!==!1&&n.indexOf(s)===-1;){if(!U(s))return s;if(o=i[s],!o)return!1;if(o.visible)return s;n.push(s),s=o.fill}return!1}function Tr(i,t,e){const s=function(o){const a=o.options,r=a.fill;let l=R(r&&r.target,r);return l===void 0&&(l=!!a.backgroundColor),l===!1||l===null?!1:l===!0?\"origin\":l}(i);if(I(s))return!isNaN(s.value)&&s;let n=parseFloat(s);return U(n)&&Math.floor(n)===n?function(o,a,r,l){return o!==\"-\"&&o!==\"+\"||(r=a+r),r===a||r<0||r>=l?!1:r}(s[0],t,n,e):[\"origin\",\"start\",\"end\",\"stack\",\"shape\"].indexOf(s)>=0&&s}function Lr(i,t,e){const s=[];for(let n=0;n<e.length;n++){const o=e[n],{first:a,last:r,point:l}=Er(o,t,\"x\");if(!(!l||a&&r)){if(a)s.unshift(l);else if(i.push(l),!r)break}}i.push(...s)}function Er(i,t,e){const s=i.interpolate(t,e);if(!s)return{};const n=s[e],o=i.segments,a=i.points;let r=!1,l=!1;for(let h=0;h<o.length;h++){const d=o[h],c=a[d.start][e],u=a[d.end][e];if(bt(n,c,u)){r=n===c,l=n===u;break}}return{first:r,last:l,point:s}}class Ko{constructor(t){this.x=t.x,this.y=t.y,this.radius=t.radius}pathSegment(t,e,s){const{x:n,y:o,radius:a}=this;return e=e||{start:0,end:Y},t.arc(n,o,a,e.end,e.start,!0),!s.bounds}interpolate(t){const{x:e,y:s,radius:n}=this,o=t.angle;return{x:e+Math.cos(o)*n,y:s+Math.sin(o)*n,angle:o}}}function Rr(i){const{chart:t,fill:e,line:s}=i;if(U(e))return function(o,a){const r=o.getDatasetMeta(a);return r&&o.isDatasetVisible(a)?r.dataset:null}(t,e);if(e===\"stack\")return function(o){const{scale:a,index:r,line:l}=o,h=[],d=l.segments,c=l.points,u=function(f,p){const g=[],m=f.getMatchingVisibleMetas(\"line\");for(let b=0;b<m.length;b++){const _=m[b];if(_.index===p)break;_.hidden||g.unshift(_.dataset)}return g}(a,r);u.push(Xo({x:null,y:a.bottom},l));for(let f=0;f<d.length;f++){const p=d[f];for(let g=p.start;g<=p.end;g++)Lr(h,c[g],u)}return new Bt({points:h,options:{}})}(i);if(e===\"shape\")return!0;const n=function(o){return(o.scale||{}).getPointPositionForValue?function(r){const{scale:l,fill:h}=r,d=l.options,c=l.getLabels().length,u=d.reverse?l.max:l.min,f=function(g,m,b){let _;return _=g===\"start\"?b:g===\"end\"?m.options.reverse?m.min:m.max:I(g)?g.value:m.getBaseValue(),_}(h,l,u),p=[];if(d.grid.circular){const g=l.getPointPositionForValue(0,u);return new Ko({x:g.x,y:g.y,radius:l.getDistanceFromCenterForValue(f)})}for(let g=0;g<c;++g)p.push(l.getPointPositionForValue(g,f));return p}(o):function(r){const{scale:l={},fill:h}=r,d=function(c,u){let f=null;return c===\"start\"?f=u.bottom:c===\"end\"?f=u.top:I(c)?f=u.getPixelForValue(c.value):u.getBasePixel&&(f=u.getBasePixel()),f}(h,l);if(U(d)){const c=l.isHorizontal();return{x:c?d:null,y:c?null:d}}return null}(o)}(i);return n instanceof Ko?n:Xo(n,s)}function ks(i,t,e){const s=Rr(t),{line:n,scale:o,axis:a}=t,r=n.options,l=r.fill,h=r.backgroundColor,{above:d=h,below:c=h}=l||{};s&&n.points.length&&(xe(i,e),function(u,f){const{line:p,target:g,above:m,below:b,area:_,scale:y}=f,x=p._loop?\"angle\":f.axis;u.save(),x===\"x\"&&b!==m&&(Go(u,g,_.top),Zo(u,{line:p,target:g,color:m,scale:y,property:x}),u.restore(),u.save(),Go(u,g,_.bottom)),Zo(u,{line:p,target:g,color:b,scale:y,property:x}),u.restore()}(i,{line:n,target:s,above:d,below:c,area:e,scale:o,axis:a}),_e(i))}function Go(i,t,e){const{segments:s,points:n}=t;let o=!0,a=!1;i.beginPath();for(const r of s){const{start:l,end:h}=r,d=n[l],c=n[ws(l,h,n)];o?(i.moveTo(d.x,d.y),o=!1):(i.lineTo(d.x,e),i.lineTo(d.x,d.y)),a=!!t.pathSegment(i,r,{move:a}),a?i.closePath():i.lineTo(c.x,e)}i.lineTo(t.first().x,e),i.closePath(),i.clip()}function Zo(i,t){const{line:e,target:s,property:n,color:o,scale:a}=t,r=function(l,h,d){const c=l.segments,u=l.points,f=h.points,p=[];for(const g of c){let{start:m,end:b}=g;b=ws(m,b,u);const _=Ms(d,u[m],u[b],g.loop);if(!h.segments){p.push({source:g,target:_,start:u[m],end:u[b]});continue}const y=is(h,_);for(const x of y){const v=Ms(d,f[x.start],f[x.end],x.loop),M=es(g,u,v);for(const w of M)p.push({source:w,target:x,start:{[d]:Uo(_,v,\"start\",Math.max)},end:{[d]:Uo(_,v,\"end\",Math.min)}})}}return p}(e,s,n);for(const{source:l,target:h,start:d,end:c}of r){const{style:{backgroundColor:u=o}={}}=l,f=s!==!0;i.save(),i.fillStyle=u,Ir(i,a,f&&Ms(n,d,c)),i.beginPath();const p=!!e.pathSegment(i,l);let g;if(f){p?i.closePath():Qo(i,s,c,n);const m=!!s.pathSegment(i,h,{move:p,reverse:!0});g=p&&m,g||Qo(i,s,d,n)}i.closePath(),i.fill(g?\"evenodd\":\"nonzero\"),i.restore()}}function Ir(i,t,e){const{top:s,bottom:n}=t.chart.chartArea,{property:o,start:a,end:r}=e||{};o===\"x\"&&(i.beginPath(),i.rect(a,s,r-a,n-s),i.clip())}function Qo(i,t,e,s){const n=t.interpolate(e,s);n&&i.lineTo(n.x,n.y)}var zr={id:\"filler\",afterDatasetsUpdate(i,t,e){const s=(i.data.datasets||[]).length,n=[];let o,a,r,l;for(a=0;a<s;++a)o=i.getDatasetMeta(a),r=o.dataset,l=null,r&&r.options&&r instanceof Bt&&(l={visible:i.isDatasetVisible(a),index:a,fill:Tr(r,a,s),chart:i,axis:o.controller.options.indexAxis,scale:o.vScale,line:r}),o.$filler=l,n.push(l);for(a=0;a<s;++a)l=n[a],l&&l.fill!==!1&&(l.fill=Ar(n,a,e.propagate))},beforeDraw(i,t,e){const s=e.drawTime===\"beforeDraw\",n=i.getSortedVisibleDatasetMetas(),o=i.chartArea;for(let a=n.length-1;a>=0;--a){const r=n[a].$filler;r&&(r.line.updateControlPoints(o,r.axis),s&&r.fill&&ks(i.ctx,r,o))}},beforeDatasetsDraw(i,t,e){if(e.drawTime!==\"beforeDatasetsDraw\")return;const s=i.getSortedVisibleDatasetMetas();for(let n=s.length-1;n>=0;--n){const o=s[n].$filler;qo(o)&&ks(i.ctx,o,i.chartArea)}},beforeDatasetDraw(i,t,e){const s=t.meta.$filler;qo(s)&&e.drawTime===\"beforeDatasetDraw\"&&ks(i.ctx,s,i.chartArea)},defaults:{propagate:!0,drawTime:\"beforeDatasetDraw\"}};const Jo=(i,t)=>{let{boxHeight:e=t,boxWidth:s=t}=i;return i.usePointStyle&&(e=Math.min(e,t),s=i.pointStyleWidth||Math.min(s,t)),{boxWidth:s,boxHeight:e,itemHeight:Math.max(t,e)}};class ta extends dt{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,s){this.maxWidth=t,this.maxHeight=e,this._margins=s,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=N(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(s=>t.filter(s,this.chart.data))),t.sort&&(e=e.sort((s,n)=>t.sort(s,n,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const s=t.labels,n=K(s.font),o=n.size,a=this._computeTitleHeight(),{boxWidth:r,itemHeight:l}=Jo(s,o);let h,d;e.font=n.string,this.isHorizontal()?(h=this.maxWidth,d=this._fitRows(a,o,r,l)+10):(d=this.maxHeight,h=this._fitCols(a,n,r,l)+10),this.width=Math.min(h,t.maxWidth||this.maxWidth),this.height=Math.min(d,t.maxHeight||this.maxHeight)}_fitRows(t,e,s,n){const{ctx:o,maxWidth:a,options:{labels:{padding:r}}}=this,l=this.legendHitBoxes=[],h=this.lineWidths=[0],d=n+r;let c=t;o.textAlign=\"left\",o.textBaseline=\"middle\";let u=-1,f=-d;return this.legendItems.forEach((p,g)=>{const m=s+e/2+o.measureText(p.text).width;(g===0||h[h.length-1]+m+2*r>a)&&(c+=d,h[h.length-(g>0?0:1)]=0,f+=d,u++),l[g]={left:0,top:f,row:u,width:m,height:n},h[h.length-1]+=m+r}),c}_fitCols(t,e,s,n){const{ctx:o,maxHeight:a,options:{labels:{padding:r}}}=this,l=this.legendHitBoxes=[],h=this.columnSizes=[],d=a-t;let c=r,u=0,f=0,p=0,g=0;return this.legendItems.forEach((m,b)=>{const{itemWidth:_,itemHeight:y}=function(x,v,M,w,k){const C=function(L,T,D,A){let O=L.text;return O&&typeof O!=\"string\"&&(O=O.reduce((E,B)=>E.length>B.length?E:B)),T+D.size/2+A.measureText(O).width}(w,x,v,M),P=function(L,T,D){let A=L;return typeof T.text!=\"string\"&&(A=ea(T,D)),A}(k,w,v.lineHeight);return{itemWidth:C,itemHeight:P}}(s,e,o,m,n);b>0&&f+y+2*r>d&&(c+=u+r,h.push({width:u,height:f}),p+=u+r,g++,u=f=0),l[b]={left:p,top:f,col:g,width:_,height:y},u=Math.max(u,_),f+=y+r}),c+=u,h.push({width:u,height:f}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:s,labels:{padding:n},rtl:o}}=this,a=Ut(o,this.left,this.width);if(this.isHorizontal()){let r=0,l=Z(s,this.left+n,this.right-this.lineWidths[r]);for(const h of e)r!==h.row&&(r=h.row,l=Z(s,this.left+n,this.right-this.lineWidths[r])),h.top+=this.top+t+n,h.left=a.leftForLtr(a.x(l),h.width),l+=h.width+n}else{let r=0,l=Z(s,this.top+t+n,this.bottom-this.columnSizes[r].height);for(const h of e)h.col!==r&&(r=h.col,l=Z(s,this.top+t+n,this.bottom-this.columnSizes[r].height)),h.top=l,h.left+=this.left+n,h.left=a.leftForLtr(a.x(h.left),h.width),l+=h.height+n}}isHorizontal(){return this.options.position===\"top\"||this.options.position===\"bottom\"}draw(){if(this.options.display){const t=this.ctx;xe(t,this),this._draw(),_e(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:s,ctx:n}=this,{align:o,labels:a}=t,r=q.color,l=Ut(t.rtl,this.left,this.width),h=K(a.font),{padding:d}=a,c=h.size,u=c/2;let f;this.drawTitle(),n.textAlign=l.textAlign(\"left\"),n.textBaseline=\"middle\",n.lineWidth=.5,n.font=h.string;const{boxWidth:p,boxHeight:g,itemHeight:m}=Jo(a,c),b=this.isHorizontal(),_=this._computeTitleHeight();f=b?{x:Z(o,this.left+d,this.right-s[0]),y:this.top+d+_,line:0}:{x:this.left+d,y:Z(o,this.top+_+d,this.bottom-e[0].height),line:0},Ji(this.ctx,t.textDirection);const y=m+d;this.legendItems.forEach((x,v)=>{n.strokeStyle=x.fontColor,n.fillStyle=x.fontColor;const M=n.measureText(x.text).width,w=l.textAlign(x.textAlign||(x.textAlign=a.textAlign)),k=p+u+M;let C=f.x,P=f.y;if(l.setWidth(this.width),b?v>0&&C+k+d>this.right&&(P=f.y+=y,f.line++,C=f.x=Z(o,this.left+d,this.right-s[f.line])):v>0&&P+y>this.bottom&&(C=f.x=C+e[f.line].width+d,f.line++,P=f.y=Z(o,this.top+_+d,this.bottom-e[f.line].height)),function(L,T,D){if(isNaN(p)||p<=0||isNaN(g)||g<0)return;n.save();const A=R(D.lineWidth,1);if(n.fillStyle=R(D.fillStyle,r),n.lineCap=R(D.lineCap,\"butt\"),n.lineDashOffset=R(D.lineDashOffset,0),n.lineJoin=R(D.lineJoin,\"miter\"),n.lineWidth=A,n.strokeStyle=R(D.strokeStyle,r),n.setLineDash(R(D.lineDash,[])),a.usePointStyle){const O={radius:g*Math.SQRT2/2,pointStyle:D.pointStyle,rotation:D.rotation,borderWidth:A},E=l.xPlus(L,p/2);Xi(n,O,E,T+u,a.pointStyleWidth&&p)}else{const O=T+Math.max((c-g)/2,0),E=l.leftForLtr(L,p),B=Ft(D.borderRadius);n.beginPath(),Object.values(B).some(F=>F!==0)?se(n,{x:E,y:O,w:p,h:g,radius:B}):n.rect(E,O,p,g),n.fill(),A!==0&&n.stroke()}n.restore()}(l.x(C),P,x),C=Us(w,C+p+u,b?C+k:this.right,t.rtl),function(L,T,D){It(n,D.text,L,T+m/2,h,{strikethrough:D.hidden,textAlign:l.textAlign(D.textAlign)})}(l.x(C),P,x),b)f.x+=k+d;else if(typeof x.text!=\"string\"){const L=h.lineHeight;f.y+=ea(x,L)+d}else f.y+=y}),ts(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,s=K(e.font),n=Q(e.padding);if(!e.display)return;const o=Ut(t.rtl,this.left,this.width),a=this.ctx,r=e.position,l=s.size/2,h=n.top+l;let d,c=this.left,u=this.width;if(this.isHorizontal())u=Math.max(...this.lineWidths),d=this.top+h,c=Z(t.align,c,this.right-u);else{const p=this.columnSizes.reduce((g,m)=>Math.max(g,m.height),0);d=h+Z(t.align,this.top,this.bottom-p-t.labels.padding-this._computeTitleHeight())}const f=Z(r,c,c+u);a.textAlign=o.textAlign($e(r)),a.textBaseline=\"middle\",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=s.string,It(a,e.text,f,d,s)}_computeTitleHeight(){const t=this.options.title,e=K(t.font),s=Q(t.padding);return t.display?e.lineHeight+s.height:0}_getLegendItemAt(t,e){let s,n,o;if(bt(t,this.left,this.right)&&bt(e,this.top,this.bottom)){for(o=this.legendHitBoxes,s=0;s<o.length;++s)if(n=o[s],bt(t,n.left,n.left+n.width)&&bt(e,n.top,n.top+n.height))return this.legendItems[s]}return null}handleEvent(t){const e=this.options;if(!function(a,r){return!!((a===\"mousemove\"||a===\"mouseout\")&&(r.onHover||r.onLeave)||r.onClick&&(a===\"click\"||a===\"mouseup\"))}(t.type,e))return;const s=this._getLegendItemAt(t.x,t.y);if(t.type===\"mousemove\"||t.type===\"mouseout\"){const a=this._hoveredItem,r=(o=s,(n=a)!==null&&o!==null&&n.datasetIndex===o.datasetIndex&&n.index===o.index);a&&!r&&N(e.onLeave,[t,a,this],this),this._hoveredItem=s,s&&!r&&N(e.onHover,[t,s,this],this)}else s&&N(e.onClick,[t,s,this],this);var n,o}}function ea(i,t){return t*(i.text?i.text.length:0)}var Fr={id:\"legend\",_element:ta,start(i,t,e){const s=i.legend=new ta({ctx:i.ctx,options:e,chart:i});J.configure(i,s,e),J.addBox(i,s)},stop(i){J.removeBox(i,i.legend),delete i.legend},beforeUpdate(i,t,e){const s=i.legend;J.configure(i,s,e),s.options=e},afterUpdate(i){const t=i.legend;t.buildLabels(),t.adjustHitBoxes()},afterEvent(i,t){t.replay||i.legend.handleEvent(t.event)},defaults:{display:!0,position:\"top\",align:\"center\",fullSize:!0,reverse:!1,weight:1e3,onClick(i,t,e){const s=t.datasetIndex,n=e.chart;n.isDatasetVisible(s)?(n.hide(s),t.hidden=!0):(n.show(s),t.hidden=!1)},onHover:null,onLeave:null,labels:{color:i=>i.chart.options.color,boxWidth:40,padding:10,generateLabels(i){const t=i.data.datasets,{labels:{usePointStyle:e,pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=i.legend.options;return i._getSortedDatasetMetas().map(l=>{const h=l.controller.getStyle(e?0:void 0),d=Q(h.borderWidth);return{text:t[l.index].label,fillStyle:h.backgroundColor,fontColor:o,hidden:!l.visible,lineCap:h.borderCapStyle,lineDash:h.borderDash,lineDashOffset:h.borderDashOffset,lineJoin:h.borderJoinStyle,lineWidth:(d.width+d.height)/4,strokeStyle:h.borderColor,pointStyle:s||h.pointStyle,rotation:h.rotation,textAlign:n||h.textAlign,borderRadius:a&&(r||h.borderRadius),datasetIndex:l.index}},this)}},title:{color:i=>i.chart.options.color,display:!1,position:\"center\",text:\"\"}},descriptors:{_scriptable:i=>!i.startsWith(\"on\"),labels:{_scriptable:i=>![\"generateLabels\",\"filter\",\"sort\"].includes(i)}}};class Ss extends dt{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const s=this.options;if(this.left=0,this.top=0,!s.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const n=j(s.text)?s.text.length:1;this._padding=Q(s.padding);const o=n*K(s.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){const t=this.options.position;return t===\"top\"||t===\"bottom\"}_drawArgs(t){const{top:e,left:s,bottom:n,right:o,options:a}=this,r=a.align;let l,h,d,c=0;return this.isHorizontal()?(h=Z(r,s,o),d=e+t,l=o-s):(a.position===\"left\"?(h=s+t,d=Z(r,n,e),c=-.5*$):(h=o-t,d=Z(r,e,n),c=.5*$),l=n-e),{titleX:h,titleY:d,maxWidth:l,rotation:c}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const s=K(e.font),n=s.lineHeight/2+this._padding.top,{titleX:o,titleY:a,maxWidth:r,rotation:l}=this._drawArgs(n);It(t,e.text,0,0,s,{color:e.color,maxWidth:r,rotation:l,textAlign:$e(e.align),textBaseline:\"middle\",translation:[o,a]})}}var Vr={id:\"title\",_element:Ss,start(i,t,e){(function(s,n){const o=new Ss({ctx:s.ctx,options:n,chart:s});J.configure(s,o,n),J.addBox(s,o),s.titleBlock=o})(i,e)},stop(i){const t=i.titleBlock;J.removeBox(i,t),delete i.titleBlock},beforeUpdate(i,t,e){const s=i.titleBlock;J.configure(i,s,e),s.options=e},defaults:{align:\"center\",display:!1,font:{weight:\"bold\"},fullSize:!0,padding:10,position:\"top\",text:\"\",weight:2e3},defaultRoutes:{color:\"color\"},descriptors:{_scriptable:!0,_indexable:!1}};const bi=new WeakMap;var Br={id:\"subtitle\",start(i,t,e){const s=new Ss({ctx:i.ctx,options:e,chart:i});J.configure(i,s,e),J.addBox(i,s),bi.set(i,s)},stop(i){J.removeBox(i,bi.get(i)),bi.delete(i)},beforeUpdate(i,t,e){const s=bi.get(i);J.configure(i,s,e),s.options=e},defaults:{align:\"center\",display:!1,font:{weight:\"normal\"},fullSize:!0,padding:0,position:\"top\",text:\"\",weight:1500},defaultRoutes:{color:\"color\"},descriptors:{_scriptable:!0,_indexable:!1}};const Le={average(i){if(!i.length)return!1;let t,e,s=0,n=0,o=0;for(t=0,e=i.length;t<e;++t){const a=i[t].element;if(a&&a.hasValue()){const r=a.tooltipPosition();s+=r.x,n+=r.y,++o}}return{x:s/o,y:n/o}},nearest(i,t){if(!i.length)return!1;let e,s,n,o=t.x,a=t.y,r=Number.POSITIVE_INFINITY;for(e=0,s=i.length;e<s;++e){const l=i[e].element;if(l&&l.hasValue()){const h=He(t,l.getCenterPoint());h<r&&(r=h,n=l)}}if(n){const l=n.tooltipPosition();o=l.x,a=l.y}return{x:o,y:a}}};function vt(i,t){return t&&(j(t)?Array.prototype.push.apply(i,t):i.push(t)),i}function Dt(i){return(typeof i==\"string\"||i instanceof String)&&i.indexOf(`\n`)>-1?i.split(`\n`):i}function Wr(i,t){const{element:e,datasetIndex:s,index:n}=t,o=i.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:i,label:a,parsed:o.getParsed(n),raw:i.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:e}}function ia(i,t){const e=i.chart.ctx,{body:s,footer:n,title:o}=i,{boxWidth:a,boxHeight:r}=t,l=K(t.bodyFont),h=K(t.titleFont),d=K(t.footerFont),c=o.length,u=n.length,f=s.length,p=Q(t.padding);let g=p.height,m=0,b=s.reduce((x,v)=>x+v.before.length+v.lines.length+v.after.length,0);b+=i.beforeBody.length+i.afterBody.length,c&&(g+=c*h.lineHeight+(c-1)*t.titleSpacing+t.titleMarginBottom),b&&(g+=f*(t.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(b-f)*l.lineHeight+(b-1)*t.bodySpacing),u&&(g+=t.footerMarginTop+u*d.lineHeight+(u-1)*t.footerSpacing);let _=0;const y=function(x){m=Math.max(m,e.measureText(x).width+_)};return e.save(),e.font=h.string,V(i.title,y),e.font=l.string,V(i.beforeBody.concat(i.afterBody),y),_=t.displayColors?a+2+t.boxPadding:0,V(s,x=>{V(x.before,y),V(x.lines,y),V(x.after,y)}),_=0,e.font=d.string,V(i.footer,y),e.restore(),m+=p.width,{width:m,height:g}}function Nr(i,t,e,s){const{x:n,width:o}=e,{width:a,chartArea:{left:r,right:l}}=i;let h=\"center\";return s===\"center\"?h=n<=(r+l)/2?\"left\":\"right\":n<=o/2?h=\"left\":n>=a-o/2&&(h=\"right\"),function(d,c,u,f){const{x:p,width:g}=f,m=u.caretSize+u.caretPadding;return d===\"left\"&&p+g+m>c.width||d===\"right\"&&p-g-m<0||void 0}(h,i,t,e)&&(h=\"center\"),h}function sa(i,t,e){const s=e.yAlign||t.yAlign||function(n,o){const{y:a,height:r}=o;return a<r/2?\"top\":a>n.height-r/2?\"bottom\":\"center\"}(i,e);return{xAlign:e.xAlign||t.xAlign||Nr(i,t,e,s),yAlign:s}}function na(i,t,e,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=i,{xAlign:r,yAlign:l}=e,h=n+o,{topLeft:d,topRight:c,bottomLeft:u,bottomRight:f}=Ft(a);let p=function(m,b){let{x:_,width:y}=m;return b===\"right\"?_-=y:b===\"center\"&&(_-=y/2),_}(t,r);const g=function(m,b,_){let{y,height:x}=m;return b===\"top\"?y+=_:y-=b===\"bottom\"?x+_:x/2,y}(t,l,h);return l===\"center\"?r===\"left\"?p+=h:r===\"right\"&&(p-=h):r===\"left\"?p-=Math.max(d,u)+n:r===\"right\"&&(p+=Math.max(c,f)+n),{x:G(p,0,s.width-t.width),y:G(g,0,s.height-t.height)}}function xi(i,t,e){const s=Q(e.padding);return t===\"center\"?i.x+i.width/2:t===\"right\"?i.x+i.width-s.right:i.x+s.left}function oa(i){return vt([],Dt(i))}function aa(i,t){const e=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return e?i.override(e):i}const ra={beforeTitle:W,title(i){if(i.length>0){const t=i[0],e=t.chart.data.labels,s=e?e.length:0;if(this&&this.options&&this.options.mode===\"dataset\")return t.dataset.label||\"\";if(t.label)return t.label;if(s>0&&t.dataIndex<s)return e[t.dataIndex]}return\"\"},afterTitle:W,beforeBody:W,beforeLabel:W,label(i){if(this&&this.options&&this.options.mode===\"dataset\")return i.label+\": \"+i.formattedValue||i.formattedValue;let t=i.dataset.label||\"\";t&&(t+=\": \");const e=i.formattedValue;return z(e)||(t+=e),t},labelColor(i){const t=i.chart.getDatasetMeta(i.datasetIndex).controller.getStyle(i.dataIndex);return{borderColor:t.borderColor,backgroundColor:t.backgroundColor,borderWidth:t.borderWidth,borderDash:t.borderDash,borderDashOffset:t.borderDashOffset,borderRadius:0}},labelTextColor(){return this.options.bodyColor},labelPointStyle(i){const t=i.chart.getDatasetMeta(i.datasetIndex).controller.getStyle(i.dataIndex);return{pointStyle:t.pointStyle,rotation:t.rotation}},afterLabel:W,afterBody:W,beforeFooter:W,footer:W,afterFooter:W};function nt(i,t,e,s){const n=i[t].call(e,s);return n===void 0?ra[t].call(e,s):n}class Ps extends dt{constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this._cachedAnimations;if(t)return t;const e=this.chart,s=this.options.setContext(this.getContext()),n=s.enabled&&e.options.animation&&s.animations,o=new rs(this.chart,n);return n._cacheable&&(this._cachedAnimations=Object.freeze(o)),o}getContext(){return this.$context||(this.$context=(t=this.chart.getContext(),e=this,s=this._tooltipItems,Pt(t,{tooltip:e,tooltipItems:s,type:\"tooltip\"})));var t,e,s}getTitle(t,e){const{callbacks:s}=e,n=nt(s,\"beforeTitle\",this,t),o=nt(s,\"title\",this,t),a=nt(s,\"afterTitle\",this,t);let r=[];return r=vt(r,Dt(n)),r=vt(r,Dt(o)),r=vt(r,Dt(a)),r}getBeforeBody(t,e){return oa(nt(e.callbacks,\"beforeBody\",this,t))}getBody(t,e){const{callbacks:s}=e,n=[];return V(t,o=>{const a={before:[],lines:[],after:[]},r=aa(s,o);vt(a.before,Dt(nt(r,\"beforeLabel\",this,o))),vt(a.lines,nt(r,\"label\",this,o)),vt(a.after,Dt(nt(r,\"afterLabel\",this,o))),n.push(a)}),n}getAfterBody(t,e){return oa(nt(e.callbacks,\"afterBody\",this,t))}getFooter(t,e){const{callbacks:s}=e,n=nt(s,\"beforeFooter\",this,t),o=nt(s,\"footer\",this,t),a=nt(s,\"afterFooter\",this,t);let r=[];return r=vt(r,Dt(n)),r=vt(r,Dt(o)),r=vt(r,Dt(a)),r}_createItems(t){const e=this._active,s=this.chart.data,n=[],o=[],a=[];let r,l,h=[];for(r=0,l=e.length;r<l;++r)h.push(Wr(this.chart,e[r]));return t.filter&&(h=h.filter((d,c,u)=>t.filter(d,c,u,s))),t.itemSort&&(h=h.sort((d,c)=>t.itemSort(d,c,s))),V(h,d=>{const c=aa(t.callbacks,d);n.push(nt(c,\"labelColor\",this,d)),o.push(nt(c,\"labelPointStyle\",this,d)),a.push(nt(c,\"labelTextColor\",this,d))}),this.labelColors=n,this.labelPointStyles=o,this.labelTextColors=a,this.dataPoints=h,h}update(t,e){const s=this.options.setContext(this.getContext()),n=this._active;let o,a=[];if(n.length){const r=Le[s.position].call(this,n,this._eventPosition);a=this._createItems(s),this.title=this.getTitle(a,s),this.beforeBody=this.getBeforeBody(a,s),this.body=this.getBody(a,s),this.afterBody=this.getAfterBody(a,s),this.footer=this.getFooter(a,s);const l=this._size=ia(this,s),h=Object.assign({},r,l),d=sa(this.chart,s,h),c=na(s,h,d,this.chart);this.xAlign=d.xAlign,this.yAlign=d.yAlign,o={opacity:1,x:c.x,y:c.y,width:l.width,height:l.height,caretX:r.x,caretY:r.y}}else this.opacity!==0&&(o={opacity:0});this._tooltipItems=a,this.$context=void 0,o&&this._resolveAnimations().update(this,o),t&&s.external&&s.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,s,n){const o=this.getCaretPosition(t,s,n);e.lineTo(o.x1,o.y1),e.lineTo(o.x2,o.y2),e.lineTo(o.x3,o.y3)}getCaretPosition(t,e,s){const{xAlign:n,yAlign:o}=this,{caretSize:a,cornerRadius:r}=s,{topLeft:l,topRight:h,bottomLeft:d,bottomRight:c}=Ft(r),{x:u,y:f}=t,{width:p,height:g}=e;let m,b,_,y,x,v;return o===\"center\"?(x=f+g/2,n===\"left\"?(m=u,b=m-a,y=x+a,v=x-a):(m=u+p,b=m+a,y=x-a,v=x+a),_=m):(b=n===\"left\"?u+Math.max(l,d)+a:n===\"right\"?u+p-Math.max(h,c)-a:this.caretX,o===\"top\"?(y=f,x=y-a,m=b-a,_=b+a):(y=f+g,x=y+a,m=b+a,_=b-a),v=y),{x1:m,x2:b,x3:_,y1:y,y2:x,y3:v}}drawTitle(t,e,s){const n=this.title,o=n.length;let a,r,l;if(o){const h=Ut(s.rtl,this.x,this.width);for(t.x=xi(this,s.titleAlign,s),e.textAlign=h.textAlign(s.titleAlign),e.textBaseline=\"middle\",a=K(s.titleFont),r=s.titleSpacing,e.fillStyle=s.titleColor,e.font=a.string,l=0;l<o;++l)e.fillText(n[l],h.x(t.x),t.y+a.lineHeight/2),t.y+=a.lineHeight+r,l+1===o&&(t.y+=s.titleMarginBottom-r)}}_drawColorBox(t,e,s,n,o){const a=this.labelColors[s],r=this.labelPointStyles[s],{boxHeight:l,boxWidth:h}=o,d=K(o.bodyFont),c=xi(this,\"left\",o),u=n.x(c),f=l<d.lineHeight?(d.lineHeight-l)/2:0,p=e.y+f;if(o.usePointStyle){const g={radius:Math.min(h,l)/2,pointStyle:r.pointStyle,rotation:r.rotation,borderWidth:1},m=n.leftForLtr(u,h)+h/2,b=p+l/2;t.strokeStyle=o.multiKeyBackground,t.fillStyle=o.multiKeyBackground,ti(t,g,m,b),t.strokeStyle=a.borderColor,t.fillStyle=a.backgroundColor,ti(t,g,m,b)}else{t.lineWidth=I(a.borderWidth)?Math.max(...Object.values(a.borderWidth)):a.borderWidth||1,t.strokeStyle=a.borderColor,t.setLineDash(a.borderDash||[]),t.lineDashOffset=a.borderDashOffset||0;const g=n.leftForLtr(u,h),m=n.leftForLtr(n.xPlus(u,1),h-2),b=Ft(a.borderRadius);Object.values(b).some(_=>_!==0)?(t.beginPath(),t.fillStyle=o.multiKeyBackground,se(t,{x:g,y:p,w:h,h:l,radius:b}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),se(t,{x:m,y:p+1,w:h-2,h:l-2,radius:b}),t.fill()):(t.fillStyle=o.multiKeyBackground,t.fillRect(g,p,h,l),t.strokeRect(g,p,h,l),t.fillStyle=a.backgroundColor,t.fillRect(m,p+1,h-2,l-2))}t.fillStyle=this.labelTextColors[s]}drawBody(t,e,s){const{body:n}=this,{bodySpacing:o,bodyAlign:a,displayColors:r,boxHeight:l,boxWidth:h,boxPadding:d}=s,c=K(s.bodyFont);let u=c.lineHeight,f=0;const p=Ut(s.rtl,this.x,this.width),g=function(k){e.fillText(k,p.x(t.x+f),t.y+u/2),t.y+=u+o},m=p.textAlign(a);let b,_,y,x,v,M,w;for(e.textAlign=a,e.textBaseline=\"middle\",e.font=c.string,t.x=xi(this,m,s),e.fillStyle=s.bodyColor,V(this.beforeBody,g),f=r&&m!==\"right\"?a===\"center\"?h/2+d:h+2+d:0,x=0,M=n.length;x<M;++x){for(b=n[x],_=this.labelTextColors[x],e.fillStyle=_,V(b.before,g),y=b.lines,r&&y.length&&(this._drawColorBox(e,t,x,p,s),u=Math.max(c.lineHeight,l)),v=0,w=y.length;v<w;++v)g(y[v]),u=c.lineHeight;V(b.after,g)}f=0,u=c.lineHeight,V(this.afterBody,g),t.y-=o}drawFooter(t,e,s){const n=this.footer,o=n.length;let a,r;if(o){const l=Ut(s.rtl,this.x,this.width);for(t.x=xi(this,s.footerAlign,s),t.y+=s.footerMarginTop,e.textAlign=l.textAlign(s.footerAlign),e.textBaseline=\"middle\",a=K(s.footerFont),e.fillStyle=s.footerColor,e.font=a.string,r=0;r<o;++r)e.fillText(n[r],l.x(t.x),t.y+a.lineHeight/2),t.y+=a.lineHeight+s.footerSpacing}}drawBackground(t,e,s,n){const{xAlign:o,yAlign:a}=this,{x:r,y:l}=t,{width:h,height:d}=s,{topLeft:c,topRight:u,bottomLeft:f,bottomRight:p}=Ft(n.cornerRadius);e.fillStyle=n.backgroundColor,e.strokeStyle=n.borderColor,e.lineWidth=n.borderWidth,e.beginPath(),e.moveTo(r+c,l),a===\"top\"&&this.drawCaret(t,e,s,n),e.lineTo(r+h-u,l),e.quadraticCurveTo(r+h,l,r+h,l+u),a===\"center\"&&o===\"right\"&&this.drawCaret(t,e,s,n),e.lineTo(r+h,l+d-p),e.quadraticCurveTo(r+h,l+d,r+h-p,l+d),a===\"bottom\"&&this.drawCaret(t,e,s,n),e.lineTo(r+f,l+d),e.quadraticCurveTo(r,l+d,r,l+d-f),a===\"center\"&&o===\"left\"&&this.drawCaret(t,e,s,n),e.lineTo(r,l+c),e.quadraticCurveTo(r,l,r+c,l),e.closePath(),e.fill(),n.borderWidth>0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,s=this.$animations,n=s&&s.x,o=s&&s.y;if(n||o){const a=Le[t.position].call(this,this._active,this._eventPosition);if(!a)return;const r=this._size=ia(this,t),l=Object.assign({},a,this._size),h=sa(e,t,l),d=na(t,l,h,e);n._to===d.x&&o._to===d.y||(this.xAlign=h.xAlign,this.yAlign=h.yAlign,this.width=r.width,this.height=r.height,this.caretX=a.x,this.caretY=a.y,this._resolveAnimations().update(this,d))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let s=this.opacity;if(!s)return;this._updateAnimationTarget(e);const n={width:this.width,height:this.height},o={x:this.x,y:this.y};s=Math.abs(s)<.001?0:s;const a=Q(e.padding),r=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&r&&(t.save(),t.globalAlpha=s,this.drawBackground(o,t,n,e),Ji(t,e.textDirection),o.y+=a.top,this.drawTitle(o,t,e),this.drawBody(o,t,e),this.drawFooter(o,t,e),ts(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const s=this._active,n=t.map(({datasetIndex:r,index:l})=>{const h=this.chart.getDatasetMeta(r);if(!h)throw new Error(\"Cannot find a dataset at index \"+r);return{datasetIndex:r,element:h.data[l],index:l}}),o=!he(s,n),a=this._positionChanged(n,e);(o||a)&&(this._active=n,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,s=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const n=this.options,o=this._active||[],a=this._getActiveElements(t,o,e,s),r=this._positionChanged(a,t),l=e||!he(a,o)||r;return l&&(this._active=a,(n.enabled||n.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),l}_getActiveElements(t,e,s,n){const o=this.options;if(t.type===\"mouseout\")return[];if(!n)return e;const a=this.chart.getElementsAtEventForMode(t,o.mode,o,s);return o.reverse&&a.reverse(),a}_positionChanged(t,e){const{caretX:s,caretY:n,options:o}=this,a=Le[o.position].call(this,t,e);return a!==!1&&(s!==a.x||n!==a.y)}}S(Ps,\"positioners\",Le);var Hr={id:\"tooltip\",_element:Ps,positioners:Le,afterInit(i,t,e){e&&(i.tooltip=new Ps({chart:i,options:e}))},beforeUpdate(i,t,e){i.tooltip&&i.tooltip.initialize(e)},reset(i,t,e){i.tooltip&&i.tooltip.initialize(e)},afterDraw(i){const t=i.tooltip;if(t&&t._willRender()){const e={tooltip:t};if(i.notifyPlugins(\"beforeTooltipDraw\",{...e,cancelable:!0})===!1)return;t.draw(i.ctx),i.notifyPlugins(\"afterTooltipDraw\",e)}},afterEvent(i,t){if(i.tooltip){const e=t.replay;i.tooltip.handleEvent(t.event,e,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:\"average\",backgroundColor:\"rgba(0,0,0,0.8)\",titleColor:\"#fff\",titleFont:{weight:\"bold\"},titleSpacing:2,titleMarginBottom:6,titleAlign:\"left\",bodyColor:\"#fff\",bodySpacing:2,bodyFont:{},bodyAlign:\"left\",footerColor:\"#fff\",footerSpacing:2,footerMarginTop:6,footerFont:{weight:\"bold\"},footerAlign:\"left\",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(i,t)=>t.bodyFont.size,boxWidth:(i,t)=>t.bodyFont.size,multiKeyBackground:\"#fff\",displayColors:!0,boxPadding:0,borderColor:\"rgba(0,0,0,0)\",borderWidth:0,animation:{duration:400,easing:\"easeOutQuart\"},animations:{numbers:{type:\"number\",properties:[\"x\",\"y\",\"width\",\"height\",\"caretX\",\"caretY\"]},opacity:{easing:\"linear\",duration:200}},callbacks:ra},defaultRoutes:{bodyFont:\"font\",footerFont:\"font\",titleFont:\"font\"},descriptors:{_scriptable:i=>i!==\"filter\"&&i!==\"itemSort\"&&i!==\"external\",_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:\"animation\"}},additionalOptionScopes:[\"interaction\"]};return H.register(wo,Bo,bs,ot),H.helpers={...Ia},H._adapters=xo,H.Animation=Un,H.Animations=rs,H.animator=_t,H.controllers=gt.controllers.items,H.DatasetController=ct,H.Element=dt,H.elements=bs,H.Interaction=Tn,H.layouts=J,H.platforms=$n,H.Scale=Vt,H.Ticks=pe,Object.assign(H,wo,Bo,bs,ot,$n),H.Chart=H,typeof window<\"u\"&&(window.Chart=H),H})});export default Ur();\n"
  },
  {
    "path": "public/admin/build/assets/cs.es-BHhRbaip.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Pondělí\",\"Úterý\",\"Středa\",\"Čtvrtek\",\"Pátek\",\"Sobota\",\"Neděle\"],t=[\"Leden\",\"Únor\",\"Březen\",\"Duben\",\"Květen\",\"Červen\",\"Červenec\",\"Srpen\",\"Září\",\"Říjen\",\"Listopad\",\"Prosinec\"],n=\"Roky\",o=\"Rok\",s=\"Měsíc\",c=\"Týden\",d=\"Den\",a=\"Dnes\",r=\"Bez událostí\",l=\"Celý den\",v=\"Odstranit\",y=\"Vytvořit událost\",k=\"dddd D. MMMM YYYY\",D={weekDays:e,months:t,years:n,year:o,month:s,week:c,day:d,today:a,noEvent:r,allDay:l,deleteEvent:v,createEvent:y,dateFormat:k};export{l as allDay,y as createEvent,k as dateFormat,d as day,D as default,v as deleteEvent,s as month,t as months,r as noEvent,a as today,c as week,e as weekDays,o as year,n as years};\n"
  },
  {
    "path": "public/admin/build/assets/da.es-DglD7fV2.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Mandag\",\"Tirsdag\",\"Onsdag\",\"Torsdag\",\"Fredag\",\"Lørdag\",\"Søndag\"],t=[\"Januar\",\"Februar\",\"Marts\",\"April\",\"Maj\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"December\"],n=\"År (flertal)\",a=\"År\",o=\"Måned\",s=\"Uge\",r=\"Dag\",d=\"I dag\",c=\"Ingen begivenhed\",g=\"Hele dagen\",l=\"Slet\",M=\"Opret et event\",u=\"dddd D MMMM YYYY\",b={weekDays:e,months:t,years:n,year:a,month:o,week:s,day:r,today:d,noEvent:c,allDay:g,deleteEvent:l,createEvent:M,dateFormat:u};export{g as allDay,M as createEvent,u as dateFormat,r as day,b as default,l as deleteEvent,o as month,t as months,c as noEvent,d as today,s as week,e as weekDays,a as year,n as years};\n"
  },
  {
    "path": "public/admin/build/assets/de.es-D_4ZyLTN.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\",\"Sonntag\"],t=[\"Januar\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"Dezember\"],n=\"Jahre\",a=\"Jahr\",o=\"Monat\",s=\"Woche\",r=\"Tag\",c=\"Heute\",d=\"Keine Events\",g=\"Ganztägig\",i=\"Löschen\",M=\"Event erstellen\",l=\"dddd D MMMM YYYY\",u={weekDays:e,months:t,years:n,year:a,month:o,week:s,day:r,today:c,noEvent:d,allDay:g,deleteEvent:i,createEvent:M,dateFormat:l};export{g as allDay,M as createEvent,l as dateFormat,r as day,u as default,i as deleteEvent,o as month,t as months,d as noEvent,c as today,s as week,e as weekDays,a as year,n as years};\n"
  },
  {
    "path": "public/admin/build/assets/drag-and-drop.es-JkAdgoaa.js",
    "content": "var V=Object.defineProperty,S=(t,e,a)=>e in t?V(t,e,{enumerable:!0,configurable:!0,writable:!0,value:a}):t[e]=a,C=(t,e,a)=>S(t,e+\"\",a);/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const m=800;let d=null,c=null,v={id:null,date:null},f=!1,_=!0,u={el:null,cell:null,timeout:null};const r={_eid:null,fromVueCal:null,toVueCal:null},M=class{constructor(t){C(this,\"_vuecal\"),this._vuecal=t}_getEventStart(t){const{timeStep:e,timeCellHeight:a,timeFrom:i,utils:n}=this._vuecal;let{y:l}=n.cell.getPosition(t);return l-=t.dataTransfer.getData(\"cursor-grab-at\")*1,Math.round(l*e/parseInt(a)+i)}_updateEventStartEnd(t,e,a,i){const n=a.duration*1||e.endTimeMinutes-e.startTimeMinutes;let l=Math.max(this._getEventStart(t),0);if(this._vuecal.snapToTime){const o=l+this._vuecal.snapToTime/2;l=o-o%this._vuecal.snapToTime}e.startTimeMinutes=l,e.start=new Date(new Date(i).setMinutes(l)),e.endTimeMinutes=Math.min(l+n,24*60),e.end=new Date(new Date(i).setMinutes(e.endTimeMinutes))}eventDragStart(t,e){if(t.target.nodeType===3)return t.preventDefault();t.dataTransfer.dropEffect=\"move\",t.dataTransfer.setData(\"event\",JSON.stringify(e)),t.dataTransfer.setData(\"cursor-grab-at\",t.offsetY);const{clickHoldAnEvent:a}=this._vuecal.domEvents;setTimeout(()=>{a._eid=null,clearTimeout(a.timeoutId),e.deleting=!1},0),this._vuecal.domEvents.dragAnEvent._eid=e._eid,r._eid=e._eid,r.fromVueCal=this._vuecal._.uid,e.dragging=!0,setTimeout(()=>e.draggingStatic=!0,0),f=!1,v={id:this._vuecal.view.id,date:this._vuecal.view.startDate},_=!0}eventDragEnd(t){this._vuecal.domEvents.dragAnEvent._eid=null,r._eid=null,t.dragging=!1,t.draggingStatic=!1;const{fromVueCal:e,toVueCal:a}=r;a&&e!==a&&this._vuecal.utils.event.deleteAnEvent(t),r.fromVueCal=null,r.toVueCal=null,f&&_&&v.id&&this._vuecal.switchView(v.id,v.date,!0)}cellDragEnter(t,e,a){const i=t.currentTarget;if(!t.currentTarget.contains(t.relatedTarget)){if(i===u.el||!i.className.includes(\"vuecal__cell-content\"))return!1;u.el&&(u.cell.highlighted=!1),u={el:i,cell:e,timeout:clearTimeout(u.timeout)},e.highlighted=!0,[\"years\",\"year\",\"month\"].includes(this._vuecal.view.id)&&(u.timeout=setTimeout(()=>this._vuecal.switchToNarrowerView(a),2e3))}}cellDragOver(t,e,a,i){t.preventDefault(),e.highlighted=!0,(i||i===0)&&(e.highlightedSplit=i)}cellDragLeave(t,e){t.preventDefault(),!t.currentTarget.contains(t.relatedTarget)&&(e.highlightedSplit=!1,u.cell===e&&(clearTimeout(u.timeout),u={el:null,cell:null,timeout:null},e.highlighted=!1))}cellDragDrop(t,e,a,i){t.preventDefault(),clearTimeout(u.timeout),u={el:null,cell:null,timeout:null};const n=JSON.parse(t.dataTransfer.getData(\"event\")||\"{}\");let l,o;if(r.fromVueCal!==this._vuecal._.uid){const{_eid:s,start:D,end:p,duration:h,...E}=n;l=this._vuecal.utils.event.createAnEvent(a,h,{...E,split:i})}else if(l=this._vuecal.view.events.find(s=>s._eid===r._eid),l||(l=this._vuecal.mutableEvents.find(s=>s._eid===r._eid),o=!!l),!l){const s=n.endTimeMinutes-n.startTimeMinutes,{start:D,end:p,...h}=n;l=this._vuecal.utils.event.createAnEvent(a,s,{...h,split:i})}const{start:T,split:w}=l;this._updateEventStartEnd(t,l,n,a),o&&this._vuecal.addEventsToView([l]),l.dragging=!1,(i||i===0)&&(l.split=i),e.highlighted=!1,e.highlightedSplit=null,_=!1,r.toVueCal=this._vuecal._.uid;const g={event:this._vuecal.cleanupEvent(l),oldDate:T,newDate:l.start,...(i||i===0)&&{oldSplit:w,newSplit:i},originalEvent:this._vuecal.cleanupEvent(n),external:!r.fromVueCal};this._vuecal.$emit(\"event-drop\",g),this._vuecal.$emit(\"event-change\",{event:g.event,originalEvent:g.originalEvent}),setTimeout(()=>{r._eid&&this.eventDragEnd(l)},300)}viewSelectorDragEnter(t,e,a){t.currentTarget.contains(t.relatedTarget)||(a.highlightedControl=e,clearTimeout(d),d=setTimeout(()=>{if([\"previous\",\"next\"].includes(e))this._vuecal[e](),clearInterval(c),c=setInterval(this._vuecal[e],m);else if(e===\"today\"){clearInterval(c);let i;this._vuecal.view.id.includes(\"year\")&&(i=this._vuecal.enabledViews.filter(n=>!n.includes(\"year\"))[0]),this._vuecal.switchView(i||this._vuecal.view.id,new Date(new Date().setHours(0,0,0,0)),!0)}else this._vuecal.switchView(e,null,!0);f=!0},m))}viewSelectorDragLeave(t,e,a){t.currentTarget.contains(t.relatedTarget)||a.highlightedControl===e&&(a.highlightedControl=null,d&&(d=clearTimeout(d)),c&&(c=clearInterval(c)))}};export{M as DragAndDrop};\n"
  },
  {
    "path": "public/admin/build/assets/el.es-BC26X5xm.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"Δευτέρα\",\"Τρίτη\",\"Τετάρτη\",\"Πέμπτη\",\"Παρασκευή\",\"Σάββατο\",\"Κυριακή\"],n=[\"Ιανουάριος\",\"Φεβρουάριος\",\"Μάρτιος\",\"Απρίλιος\",\"Μάιος\",\"Ιούνιος\",\"Ιούλιος\",\"Αύγουστος\",\"Σεπτέμβριος\",\"Οκτώβριος\",\"Νοέμβριος\",\"Δεκέμβριος\"],o=[\"Ιανουαρίου\",\"Φεβρουαρίου\",\"Μαρτίου\",\"Απριλίου\",\"Μαΐου\",\"Ιουνίου\",\"Ιουλίου\",\"Αυγούστου\",\"Σεπτεμβρίου\",\"Οκτωβρίου\",\"Νοεμβρίου\",\"Δεκεμβρίου\"],s=\"Έτη\",e=\"Έτος\",c=\"Μήνα\",a=\"Εβδομάδα\",d=\"Ημέρα\",m=\"Σήμερα\",y=\"Κανένα συμβάν\",l=\"Ημερήσιο συμβάν\",r=\"Διαγραφή\",v=\"Δημιουργία συμβάντος\",M=\"dddd D MMMMG YYYY\",Y=\"π.μ.\",h=\"μ.μ.\",D={weekDays:t,months:n,monthsGenitive:o,years:s,year:e,month:c,week:a,day:d,today:m,noEvent:y,allDay:l,deleteEvent:r,createEvent:v,dateFormat:M,am:Y,pm:h};export{l as allDay,Y as am,v as createEvent,M as dateFormat,d as day,D as default,r as deleteEvent,c as month,n as months,o as monthsGenitive,y as noEvent,h as pm,m as today,a as week,t as weekDays,e as year,s as years};\n"
  },
  {
    "path": "public/admin/build/assets/en.es-DDTuV2po.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\",\"Sunday\"],t=[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],a=\"Years\",n=\"Year\",o=\"Month\",s=\"Week\",r=\"Day\",y=\"Today\",d=\"No Event\",c=\"All day\",u=\"Delete\",l=\"Create an event\",M=\"dddd MMMM D{S}, YYYY\",m={weekDays:e,months:t,years:a,year:n,month:o,week:s,day:r,today:y,noEvent:d,allDay:c,deleteEvent:u,createEvent:l,dateFormat:M};export{c as allDay,l as createEvent,M as dateFormat,r as day,m as default,u as deleteEvent,o as month,t as months,d as noEvent,y as today,s as week,e as weekDays,n as year,a as years};\n"
  },
  {
    "path": "public/admin/build/assets/es.es-BvvfjN-O.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Lunes\",\"Martes\",\"Miércoles\",\"Jueves\",\"Viernes\",\"Sábado\",\"Domingo\"],o=[\"Enero\",\"Febrero\",\"Marzo\",\"Abril\",\"Mayo\",\"Junio\",\"Julio\",\"Agosto\",\"Septiembre\",\"Octubre\",\"Noviembre\",\"Diciembre\"],t=\"Años\",n=\"Año\",s=\"Mes\",a=\"Semana\",r=\"Día\",c=\"Hoy\",d=\"No hay evento\",i=\"Todo el día\",y=\"Borrar\",M=\"Crear un evento\",l=\"dddd D MMMM YYYY\",m={weekDays:e,months:o,years:t,year:n,month:s,week:a,day:r,today:c,noEvent:d,allDay:i,deleteEvent:y,createEvent:M,dateFormat:l};export{i as allDay,M as createEvent,l as dateFormat,r as day,m as default,y as deleteEvent,s as month,o as months,d as noEvent,c as today,a as week,e as weekDays,n as year,t as years};\n"
  },
  {
    "path": "public/admin/build/assets/et.es-C0rF9HtR.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Esmaspäev\",\"Teisipäev\",\"Kolmapäev\",\"Neljapäev\",\"Reede\",\"Laupäev\",\"Pühapäev\"],t=[\"Jaanuar\",\"Veebruar\",\"Märts\",\"Aprill\",\"Mai\",\"Juuni\",\"Juuli\",\"August\",\"September\",\"Oktoober\",\"November\",\"Detsember\"],s=\"Aastad\",a=\"Aasta\",o=\"Kuu\",n=\"Nädal\",u=\"Päev\",c=\"Täna\",d=\"Sündmus puudub\",r=\"Terve päev\",v=\"Kustuta\",p=\"Loo sündmus\",l=\"dddd D MMMM YYYY\",m={weekDays:e,months:t,years:s,year:a,month:o,week:n,day:u,today:c,noEvent:d,allDay:r,deleteEvent:v,createEvent:p,dateFormat:l};export{r as allDay,p as createEvent,l as dateFormat,u as day,m as default,v as deleteEvent,o as month,t as months,d as noEvent,c as today,n as week,e as weekDays,a as year,s as years};\n"
  },
  {
    "path": "public/admin/build/assets/fa.es-CibKJjgz.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"دوشنبه\",\"سه شنبه\",\"چهار شنبه\",\"پنج شنبه\",\"جمعه\",\"شنبه\",\"یک شنبه\"],n=[\"ژانویه\",\"فوریه\",\"مارس\",\"آوریل\",\"می\",\"ژوئن\",\"ژوئیه\",\"اوت\",\"سپتامبر\",\"اکتبر\",\"نوامبر\",\"دسامبر\"],o=\"سالها\",s=\"سال\",e=\"ماه\",c=\"هفته\",a=\"روز\",d=\"امروز\",y=\"رویدادی نیست\",r=\"تمام روز\",l=\"حذف\",M=\"ایجاد یک رویداد\",Y=\"dddd D MMMM YYYY\",m={weekDays:t,months:n,years:o,year:s,month:e,week:c,day:a,today:d,noEvent:y,allDay:r,deleteEvent:l,createEvent:M,dateFormat:Y};export{r as allDay,M as createEvent,Y as dateFormat,a as day,m as default,l as deleteEvent,e as month,n as months,y as noEvent,d as today,c as week,t as weekDays,s as year,o as years};\n"
  },
  {
    "path": "public/admin/build/assets/fi.es-B0Iy6aas.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const a=[\"Maanantai\",\"Tiistai\",\"Keskiviikko\",\"Torstai\",\"Perjantai\",\"Lauantai\",\"Sunnuntai\"],t=[\"Tammikuu\",\"Helmikuu\",\"Maaliskuu\",\"Huhtikuu\",\"Toukokuu\",\"Kesäkuu\",\"Heinäkuu\",\"Elokuu\",\"Syyskuu\",\"Lokakuu\",\"Marraskuu\",\"Joulukuu\"],u=\"Vuodet\",o=\"Vuosi\",n=\"Kuukausi\",s=\"Viikko\",i=\"Päivä\",e=\"Tänään\",k=\"Ei tapahtumia\",c=\"Koko päivä\",d=\"Poista tapahtuma\",m=\"Luo tapahtuma\",r=\"dddd, D MMMM YYYY\",l={weekDays:a,months:t,years:u,year:o,month:n,week:s,day:i,today:e,noEvent:k,allDay:c,deleteEvent:d,createEvent:m,dateFormat:r};export{c as allDay,m as createEvent,r as dateFormat,i as day,l as default,d as deleteEvent,n as month,t as months,k as noEvent,e as today,s as week,a as weekDays,o as year,u as years};\n"
  },
  {
    "path": "public/admin/build/assets/fr.es-B7WXlprl.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Lundi\",\"Mardi\",\"Mercredi\",\"Jeudi\",\"Vendredi\",\"Samedi\",\"Dimanche\"],n=[\"Janvier\",\"Février\",\"Mars\",\"Avril\",\"Mai\",\"Juin\",\"Juillet\",\"Août\",\"Septembre\",\"Octobre\",\"Novembre\",\"Décembre\"],t=\"Années\",o=\"Année\",r=\"Mois\",s=\"Semaine\",c=\"Jour\",a=\"Aujourd'hui\",i=\"Aucun événement\",d=\"Jour entier\",u=\"Supprimer\",m=\"Créer un événement\",v=\"dddd D MMMM YYYY\",M={weekDays:e,months:n,years:t,year:o,month:r,week:s,day:c,today:a,noEvent:i,allDay:d,deleteEvent:u,createEvent:m,dateFormat:v};export{d as allDay,m as createEvent,v as dateFormat,c as day,M as default,u as deleteEvent,r as month,n as months,i as noEvent,a as today,s as week,e as weekDays,o as year,t as years};\n"
  },
  {
    "path": "public/admin/build/assets/he.es-K9Fk8xhK.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"שני\",\"שלישי\",\"רביעי\",\"חמישי\",\"שישי\",\"שבת\",\"ראשון\"],n=[\"ינואר\",\"פברואר\",\"מרץ\",\"אפריל\",\"מאי\",\"יוני\",\"יולי\",\"אוגוסט\",\"ספטמבר\",\"אוקטובר\",\"נובמבר\",\"דצמבר\"],o=\"שנים\",e=\"שנה\",s=\"חודש\",c=\"שבוע\",a=\"יום\",d=\"היום\",y=\"אין אירועים\",r=\"כל היום\",l=\"מחיקה\",M=\"צור אירוע\",Y=\"dddd D MMMM YYYY\",h={weekDays:t,months:n,years:o,year:e,month:s,week:c,day:a,today:d,noEvent:y,allDay:r,deleteEvent:l,createEvent:M,dateFormat:Y};export{r as allDay,M as createEvent,Y as dateFormat,a as day,h as default,l as deleteEvent,s as month,n as months,y as noEvent,d as today,c as week,t as weekDays,e as year,o as years};\n"
  },
  {
    "path": "public/admin/build/assets/hr.es-ef5bxYFj.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const a=[\"Ponedjeljak\",\"Utorak\",\"Srijeda\",\"Četvrtak\",\"Petak\",\"Subota\",\"Nedjelja\"],n=[\"Siječanj\",\"Veljača\",\"Ožujak\",\"Travanj\",\"Svibanj\",\"Lipanj\",\"Srpanj\",\"Kolovoz\",\"Rujan\",\"Listopad\",\"Studeni\",\"Prosinac\"],e=\"Godine\",t=\"Godina\",o=\"Mjesec\",d=\"Tjedan\",j=\"Dan\",s=\"Današnji dan\",c=\"Nema događaja\",i=\"Cijeli dan\",r=\"Obriši\",l=\"Kreiraj događaj\",k=\"dddd D MMMM YYYY\",v={weekDays:a,months:n,years:e,year:t,month:o,week:d,day:j,today:s,noEvent:c,allDay:i,deleteEvent:r,createEvent:l,dateFormat:k};export{i as allDay,l as createEvent,k as dateFormat,j as day,v as default,r as deleteEvent,o as month,n as months,c as noEvent,s as today,d as week,a as weekDays,t as year,e as years};\n"
  },
  {
    "path": "public/admin/build/assets/hu.es-nZ65MV0n.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Hétfo\",\"Kedd\",\"Szerda\",\"Csütörtök\",\"Péntek\",\"Szombat\",\"Vasárnap\"],t=[\"Január\",\"Február\",\"Március\",\"Április\",\"Május\",\"Június\",\"Július\",\"Augusztus\",\"Szeptember\",\"Október\",\"November\",\"December\"],s=\"Évek\",n=\"Év\",o=\"Hónap\",a=\"Hét\",r=\"Nap\",c=\"Mai nap\",d=\"Nincs esemény\",u=\"Egész nap\",m=\"Esemény törlese\",y=\"Esemény létrehozása\",l=\"dddd D MMMM YYYY\",p={weekDays:e,months:t,years:s,year:n,month:o,week:a,day:r,today:c,noEvent:d,allDay:u,deleteEvent:m,createEvent:y,dateFormat:l};export{u as allDay,y as createEvent,l as dateFormat,r as day,p as default,m as deleteEvent,o as month,t as months,d as noEvent,c as today,a as week,e as weekDays,n as year,s as years};\n"
  },
  {
    "path": "public/admin/build/assets/id.es-CzHAK-XV.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const a=[\"Senin\",\"Selasa\",\"Rabu\",\"Kamis\",\"Jumat\",\"Sabtu\",\"Minggu\"],n=[\"Januari\",\"Februari\",\"Maret\",\"April\",\"Mei\",\"Juni\",\"Juli\",\"Agustus\",\"September\",\"Oktober\",\"November\",\"Desember\"],e=\"Tahunan\",t=\"Tahun\",s=\"Bulan\",o=\"Minggu\",i=\"Hari\",r=\"Hari Ini\",u=\"Tidak Ada Kegiatan\",c=\"Sepanjang Hari\",d=\"Hapus\",m=\"Tambah Kegiatan\",b=\"dddd, D MMMM YYYY\",g={weekDays:a,months:n,years:e,year:t,month:s,week:o,day:i,today:r,noEvent:u,allDay:c,deleteEvent:d,createEvent:m,dateFormat:b};export{c as allDay,m as createEvent,b as dateFormat,i as day,g as default,d as deleteEvent,s as month,n as months,u as noEvent,r as today,o as week,a as weekDays,t as year,e as years};\n"
  },
  {
    "path": "public/admin/build/assets/is.es-Dz07gBgt.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const a=[\"Mánudagur\",\"Þriðjudagur\",\"Miðvikudagur\",\"Fimmtudagur\",\"Föstudagur\",\"Laugardagur\",\"Sunnudagur\"],t=[\"Janúar\",\"Febrúar\",\"Mars\",\"Apríl\",\"Maí\",\"Júní\",\"Júlí\",\"Ágúst\",\"September\",\"Október\",\"Nóvember\",\"Desember\"],n=\"Ár\",r=\"Ár\",e=\"Mánuður\",s=\"Vika\",u=\"Dagur\",o=\"Í dag\",d=\"Enginn atburður\",c=\"Allan daginn\",g=\"Eyða\",i=\"Búðu til viðburð\",l=\"dddd D MMMM YYYY\",M={weekDays:a,months:t,years:n,year:r,month:e,week:s,day:u,today:o,noEvent:d,allDay:c,deleteEvent:g,createEvent:i,dateFormat:l};export{c as allDay,i as createEvent,l as dateFormat,u as day,M as default,g as deleteEvent,e as month,t as months,d as noEvent,o as today,s as week,a as weekDays,r as year,n as years};\n"
  },
  {
    "path": "public/admin/build/assets/it.es-CquQA5xx.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Lunedì\",\"Martedì\",\"Mercoledì\",\"Giovedì\",\"Venerdì\",\"Sabato\",\"Domenica\"],o=[\"Gennaio\",\"Febbraio\",\"Marzo\",\"Aprile\",\"Maggio\",\"Giugno\",\"Luglio\",\"Agosto\",\"Settembre\",\"Ottobre\",\"Novembre\",\"Dicembre\"],t=\"Anni\",n=\"Anno\",a=\"Mese\",s=\"Settimana\",c=\"Giorno\",r=\"Oggi\",i=\"Nessun evento\",d=\"Tutto il giorno\",l=\"Cancella\",M=\"Crea evento\",g=\"dddd D MMMM YYYY\",m={weekDays:e,months:o,years:t,year:n,month:a,week:s,day:c,today:r,noEvent:i,allDay:d,deleteEvent:l,createEvent:M,dateFormat:g};export{d as allDay,M as createEvent,g as dateFormat,c as day,m as default,l as deleteEvent,a as month,o as months,i as noEvent,r as today,s as week,e as weekDays,n as year,t as years};\n"
  },
  {
    "path": "public/admin/build/assets/ja.es-D6pL26k_.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"月\",\"火\",\"水\",\"木\",\"金\",\"土\",\"日\"],n=[\"1月\",\"2月\",\"3月\",\"4月\",\"5月\",\"6月\",\"7月\",\"8月\",\"9月\",\"10月\",\"11月\",\"12月\"],o=\"年\",s=\"今年\",e=\"月\",c=\"週\",a=\"日\",d=\"今日\",y=\"イベントなし\",r=\"終日\",l=\"削除\",M=\"イベント作成\",Y=\"YYYY年 MMMM D日 (dddd)\",m={weekDays:t,months:n,years:o,year:s,month:e,week:c,day:a,today:d,noEvent:y,allDay:r,deleteEvent:l,createEvent:M,dateFormat:Y};export{r as allDay,M as createEvent,Y as dateFormat,a as day,m as default,l as deleteEvent,e as month,n as months,y as noEvent,d as today,c as week,t as weekDays,s as year,o as years};\n"
  },
  {
    "path": "public/admin/build/assets/ka.es-Cb9X-eNS.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"ორშაბათი\",\"სამშაბათი\",\"ოთხშაბათი\",\"ხუთშაბათი\",\"პარასკევი\",\"შაბათი\",\"კვირა\"],n=[\"იანვარი\",\"თებერვალი\",\"მარტი\",\"აპრილი\",\"მაისი\",\"ივნისი\",\"ივლისი\",\"აგვისტო\",\"სექტემბერი\",\"ოქტომბერი\",\"ნოემბერი\",\"დეკემბერი\"],o=\"წლები\",s=\"წელი\",e=\"თვე\",c=\"კვირა\",a=\"დღე\",d=\"დღეს\",y=\"ღონისძიება არ არის\",r=\"მთელი დღე\",l=\"წაშლა\",M=\"შექმენით ღონისძიება\",Y=\"dddd D MMMM YYYY\",k={weekDays:t,months:n,years:o,year:s,month:e,week:c,day:a,today:d,noEvent:y,allDay:r,deleteEvent:l,createEvent:M,dateFormat:Y};export{r as allDay,M as createEvent,Y as dateFormat,a as day,k as default,l as deleteEvent,e as month,n as months,y as noEvent,d as today,c as week,t as weekDays,s as year,o as years};\n"
  },
  {
    "path": "public/admin/build/assets/ko.es-CTpJlj0A.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"월\",\"화\",\"수\",\"목\",\"금\",\"토\",\"일\"],o=[\"1월\",\"2월\",\"3월\",\"4월\",\"5월\",\"6월\",\"7월\",\"8월\",\"9월\",\"10월\",\"11월\",\"12월\"],n=\"년도\",s=\"연간\",e=\"월간\",c=\"주간\",a=\"일간\",d=\"오늘\",y=\"일정 없음\",r=\"하루 종일\",l=\"삭제\",M=\"일정 추가\",Y=\"YYYY년 MMMM D일 dddd요일\",k={weekDays:t,months:o,years:n,year:s,month:e,week:c,day:a,today:d,noEvent:y,allDay:r,deleteEvent:l,createEvent:M,dateFormat:Y};export{r as allDay,M as createEvent,Y as dateFormat,a as day,k as default,l as deleteEvent,e as month,o as months,y as noEvent,d as today,c as week,t as weekDays,s as year,n as years};\n"
  },
  {
    "path": "public/admin/build/assets/lt.es-vqgjGyMx.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const i=[\"Pirmadienis\",\"Antradienis\",\"Trečiadienis\",\"Ketvirtadienis\",\"Penktadienis\",\"Šeštadienis\",\"Sekmadienis\"],s=[\"Sausis\",\"Vasaris\",\"Kovas\",\"Balandis\",\"Gegužė\",\"Birželis\",\"Liepa\",\"Rugpjūtis\",\"Rugsėjis\",\"Spalis\",\"Lapkritis\",\"Gruodis\"],t=\"Metų pasirinkimas\",e=\"Metai\",a=\"Mėnesis\",n=\"Savaitė\",o=\"Diena\",d=\"Šiandien\",r=\"Jokių įvykių\",c=\"Visa diena\",k=\"Ištrinti\",l=\"Sukurti įvykį\",u=\"dddd, D MMMM YYYY\",v={weekDays:i,months:s,years:t,year:e,month:a,week:n,day:o,today:d,noEvent:r,allDay:c,deleteEvent:k,createEvent:l,dateFormat:u};export{c as allDay,l as createEvent,u as dateFormat,o as day,v as default,k as deleteEvent,a as month,s as months,r as noEvent,d as today,n as week,i as weekDays,e as year,t as years};\n"
  },
  {
    "path": "public/admin/build/assets/mn.es-YZet1as4.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"Даваа\",\"Мягмар\",\"Лхавга\",\"Пүрэв\",\"Баасан\",\"Бямба\",\"Ням\"],n=[\"1-р сар\",\"2-р сар\",\"3-р сар\",\"4-р сар\",\"5-р сар\",\"6-р сар\",\"7-р сар\",\"8-р сар\",\"9-р сар\",\"10-р сар\",\"11-р сар\",\"12-р сар\"],o=\"Жилүүд\",s=\"Жил\",e=\"Сар\",c=\"Долоо хоног\",a=\"Өдөр\",d=\"Өнөөдөр\",y=\"Тэмдэглэлгүй\",r=\"Бүх өдөр\",l=\"Устгах\",m=\"Шинэ тэмдэглэл\",M=\"dddd D MMMM YYYY\",Y={weekDays:t,months:n,years:o,year:s,month:e,week:c,day:a,today:d,noEvent:y,allDay:r,deleteEvent:l,createEvent:m,dateFormat:M};export{r as allDay,m as createEvent,M as dateFormat,a as day,Y as default,l as deleteEvent,e as month,n as months,y as noEvent,d as today,c as week,t as weekDays,s as year,o as years};\n"
  },
  {
    "path": "public/admin/build/assets/nl.es-COp8PWbT.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const a=[\"Maandag\",\"Dinsdag\",\"Woensdag\",\"Donderdag\",\"Vrijdag\",\"Zaterdag\",\"Zondag\"],e=[\"Januari\",\"Februari\",\"Maart\",\"April\",\"Mei\",\"Juni\",\"Juli\",\"Augustus\",\"September\",\"Oktober\",\"November\",\"December\"],n=\"Jaren\",t=\"Jaar\",o=\"Maand\",s=\"Week\",r=\"Dag\",d=\"Vandaag\",c=\"Geen afspraken\",g=\"Hele dag\",i=\"Verwijderen\",u=\"Nieuwe afspraak aanmaken\",l=\"dddd D MMMM YYYY\",M={weekDays:a,months:e,years:n,year:t,month:o,week:s,day:r,today:d,noEvent:c,allDay:g,deleteEvent:i,createEvent:u,dateFormat:l};export{g as allDay,u as createEvent,l as dateFormat,r as day,M as default,i as deleteEvent,o as month,e as months,c as noEvent,d as today,s as week,a as weekDays,t as year,n as years};\n"
  },
  {
    "path": "public/admin/build/assets/no.es-_2m-F2FS.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Mandag\",\"Tirsdag\",\"Onsdag\",\"Torsdag\",\"Fredag\",\"Lørdag\",\"Søndag\"],n=[\"Januar\",\"Februar\",\"Mars\",\"April\",\"Mai\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"Desember\"],t=\"Velg år\",a=\"År\",s=\"Måned\",o=\"Uke\",d=\"Dag\",r=\"Idag\",c=\"Ingen hendelse\",g=\"Hele dagen\",l=\"Ta bort\",M=\"Ny hendelse\",u=\"dddd, D. MMMM YYYY\",y={weekDays:e,months:n,years:t,year:a,month:s,week:o,day:d,today:r,noEvent:c,allDay:g,deleteEvent:l,createEvent:M,dateFormat:u};export{g as allDay,M as createEvent,u as dateFormat,d as day,y as default,l as deleteEvent,s as month,n as months,c as noEvent,r as today,o as week,e as weekDays,a as year,t as years};\n"
  },
  {
    "path": "public/admin/build/assets/pl.es-jjNeJM5X.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Poniedziałek\",\"Wtorek\",\"Środa\",\"Czwartek\",\"Piątek\",\"Sobota\",\"Niedziela\"],t=[\"Styczeń\",\"Luty\",\"Marzec\",\"Kwiecień\",\"Maj\",\"Czerwiec\",\"Lipiec\",\"Sierpień\",\"Wrzesień\",\"Październik\",\"Listopad\",\"Grudzień\"],a=\"Lata\",o=\"Rok\",i=\"Miesiąc\",n=\"Tydzień\",s=\"Dzień\",c=\"Dzisiaj\",d=\"Brak wydarzeń\",r=\"Cały dzień\",z=\"Usuń\",y=\"Utwórz wydarzenie\",k=\"dddd, D MMMM YYYY\",w={weekDays:e,months:t,years:a,year:o,month:i,week:n,day:s,today:c,noEvent:d,allDay:r,deleteEvent:z,createEvent:y,dateFormat:k};export{r as allDay,y as createEvent,k as dateFormat,s as day,w as default,z as deleteEvent,i as month,t as months,d as noEvent,c as today,n as week,e as weekDays,o as year,a as years};\n"
  },
  {
    "path": "public/admin/build/assets/pt-br.es-D8ojES2d.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Segunda-feira\",\"Terça-feira\",\"Quarta-feira\",\"Quinta-feira\",\"Sexta-feira\",\"Sábado\",\"Domingo\"],o=[\"Janeiro\",\"Fevereiro\",\"Março\",\"Abril\",\"Maio\",\"Junho\",\"Julho\",\"Agosto\",\"Setembro\",\"Outubro\",\"Novembro\",\"Dezembro\"],t=\"Anos\",a=\"Ano\",n=\"Mês\",r=\"Semana\",s=\"Dia\",i=\"Hoje\",c=\"Sem eventos\",d=\"Dia inteiro\",m=\"Remover\",u=\"Criar um evento\",v=\"dddd D MMMM YYYY\",D={weekDays:e,months:o,years:t,year:a,month:n,week:r,day:s,today:i,noEvent:c,allDay:d,deleteEvent:m,createEvent:u,dateFormat:v};export{d as allDay,u as createEvent,v as dateFormat,s as day,D as default,m as deleteEvent,n as month,o as months,c as noEvent,i as today,r as week,e as weekDays,a as year,t as years};\n"
  },
  {
    "path": "public/admin/build/assets/pt-pt.es-D8ojES2d.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Segunda-feira\",\"Terça-feira\",\"Quarta-feira\",\"Quinta-feira\",\"Sexta-feira\",\"Sábado\",\"Domingo\"],o=[\"Janeiro\",\"Fevereiro\",\"Março\",\"Abril\",\"Maio\",\"Junho\",\"Julho\",\"Agosto\",\"Setembro\",\"Outubro\",\"Novembro\",\"Dezembro\"],t=\"Anos\",a=\"Ano\",n=\"Mês\",r=\"Semana\",s=\"Dia\",i=\"Hoje\",c=\"Sem eventos\",d=\"Dia inteiro\",m=\"Remover\",u=\"Criar um evento\",v=\"dddd D MMMM YYYY\",D={weekDays:e,months:o,years:t,year:a,month:n,week:r,day:s,today:i,noEvent:c,allDay:d,deleteEvent:m,createEvent:u,dateFormat:v};export{d as allDay,u as createEvent,v as dateFormat,s as day,D as default,m as deleteEvent,n as month,o as months,c as noEvent,i as today,r as week,e as weekDays,a as year,t as years};\n"
  },
  {
    "path": "public/admin/build/assets/ro.es-B6_ATXom.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Luni\",\"Marți\",\"Miercuri\",\"Joi\",\"Vineri\",\"Sâmbăta\",\"Duminică\"],t=[\"Ianuarie\",\"Februarie\",\"Martie\",\"Aprilie\",\"Mai\",\"Iunie\",\"Iulie\",\"August\",\"Septembrie\",\"Octombrie\",\"Noiembrie\",\"Decembrie\"],n=\"Ani\",i=\"An\",o=\"Lună\",a=\"Săptămână\",c=\"Zi\",r=\"Azi\",s=\"Nici o interacțiune\",u=\"Toată ziua\",m=\"Șterge\",d=\"Adaugă un eveniment\",M=\"dddd D MMMM YYYY\",b={weekDays:e,months:t,years:n,year:i,month:o,week:a,day:c,today:r,noEvent:s,allDay:u,deleteEvent:m,createEvent:d,dateFormat:M};export{u as allDay,d as createEvent,M as dateFormat,c as day,b as default,m as deleteEvent,o as month,t as months,s as noEvent,r as today,a as week,e as weekDays,i as year,n as years};\n"
  },
  {
    "path": "public/admin/build/assets/ru.es-BGEpmv_x.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"Понедельник\",\"Вторник\",\"Среда\",\"Четверг\",\"Пятница\",\"Суббота\",\"Воскресенье\"],o=[\"Пн\",\"Вт\",\"Ср\",\"Чт\",\"Пт\",\"Сб\",\"Вс\"],n=[\"Январь\",\"Февраль\",\"Март\",\"Апрель\",\"Май\",\"Июнь\",\"Июль\",\"Август\",\"Сентябрь\",\"Октябрь\",\"Ноябрь\",\"Декабрь\"],s=\"Годы\",e=\"Год\",c=\"Месяц\",a=\"Неделя\",d=\"День\",r=\"Сегодня\",y=\"Нет событий\",l=\"Весь день\",D=\"Удалить\",M=\"Создать событие\",Y=\"dddd D MMMM YYYY\",h={weekDays:t,weekDaysShort:o,months:n,years:s,year:e,month:c,week:a,day:d,today:r,noEvent:y,allDay:l,deleteEvent:D,createEvent:M,dateFormat:Y};export{l as allDay,M as createEvent,Y as dateFormat,d as day,h as default,D as deleteEvent,c as month,n as months,y as noEvent,r as today,a as week,t as weekDays,o as weekDaysShort,e as year,s as years};\n"
  },
  {
    "path": "public/admin/build/assets/sk.es-V3h-1af8.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Pondelok\",\"Utorok\",\"Streda\",\"Štvrtok\",\"Piatok\",\"Sobota\",\"Nedeľa\"],t=[\"Január\",\"Február\",\"Marec\",\"Apríl\",\"Máj\",\"Jún\",\"Júl\",\"August\",\"September\",\"Október\",\"November\",\"December\"],o=\"Roky\",n=\"Rok\",s=\"Mesiac\",a=\"Týždeň\",r=\"Deň\",c=\"Dnes\",d=\"Bez udalosti\",k=\"Celý deň\",l=\"Odstrániť\",y=\"Vytvoriť udalosť\",u=\"dddd D. MMMM YYYY\",M={weekDays:e,months:t,years:o,year:n,month:s,week:a,day:r,today:c,noEvent:d,allDay:k,deleteEvent:l,createEvent:y,dateFormat:u};export{k as allDay,y as createEvent,u as dateFormat,r as day,M as default,l as deleteEvent,s as month,t as months,d as noEvent,c as today,a as week,e as weekDays,n as year,o as years};\n"
  },
  {
    "path": "public/admin/build/assets/sl.es-mZjm0YDT.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Ponedeljek\",\"Torek\",\"Sreda\",\"Četrtek\",\"Petek\",\"Sobota\",\"Nedelja\"],t=[\"Januar\",\"Februar\",\"Marec\",\"April\",\"Maj\",\"Junij\",\"Julij\",\"Avgust\",\"September\",\"Oktober\",\"November\",\"December\"],o=\"Leta\",n=\"Leto\",a=\"Mesec\",s=\"Teden\",d=\"Dan\",r=\"Danes\",c=\"Ni dogodkov\",l=\"Cel dan\",k=\"Odstrani\",v=\"Ustvari dogodek\",M=\"dddd MMMM D, YYYY\",b={weekDays:e,months:t,years:o,year:n,month:a,week:s,day:d,today:r,noEvent:c,allDay:l,deleteEvent:k,createEvent:v,dateFormat:M};export{l as allDay,v as createEvent,M as dateFormat,d as day,b as default,k as deleteEvent,a as month,t as months,c as noEvent,r as today,s as week,e as weekDays,n as year,o as years};\n"
  },
  {
    "path": "public/admin/build/assets/sq.es-_6B4UQXy.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"E Hënë\",\"E Martë\",\"E Mërkurë\",\"E Enjte\",\"E Premte\",\"E Shtunë\",\"E Diel\"],e=[\"Hë\",\"Ma\",\"Mr\",\"Enj\",\"Pr\",\"Sh\",\"D\"],n=[\"Janar\",\"Shkurt\",\"Mars\",\"Prill\",\"Maj\",\"Qershor\",\"Korrik\",\"Gusht\",\"Shtator\",\"Tetor\",\"Nëntor\",\"Dhjetor\"],o=\"Vitet\",r=\"Viti\",a=\"Muaji\",s=\"Java\",c=\"Dita\",E=\"Sot\",h=\"Nuk ka event\",i=\"Tërë ditën\",M=\"Fshijë\",d=\"Krijo një event\",j=\"dddd D MMMM YYYY\",k={weekDays:t,weekDaysShort:e,months:n,years:o,year:r,month:a,week:s,day:c,today:E,noEvent:h,allDay:i,deleteEvent:M,createEvent:d,dateFormat:j};export{i as allDay,d as createEvent,j as dateFormat,c as day,k as default,M as deleteEvent,a as month,n as months,h as noEvent,E as today,s as week,t as weekDays,e as weekDaysShort,r as year,o as years};\n"
  },
  {
    "path": "public/admin/build/assets/sr.es-BmdOpTOG.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const a=[\"Ponedeljak\",\"Utorak\",\"Sreda\",\"Četvrtak\",\"Petak\",\"Subota\",\"Nedelja\"],e=[\"Januar\",\"Februar\",\"Mart\",\"April\",\"Maj\",\"Jun\",\"Jul\",\"Avgust\",\"Septembar\",\"Oktobar\",\"Novembar\",\"Decembar\"],t=\"Godine\",o=\"Godina\",n=\"Mesec\",s=\"Sedmica\",r=\"Dan\",c=\"Danas\",d=\"Nema događaja\",l=\"Celi dan\",i=\"Obriši\",m=\"Kreiraj događaj\",b=\"dddd D MMMM YYYY\",k={weekDays:a,months:e,years:t,year:o,month:n,week:s,day:r,today:c,noEvent:d,allDay:l,deleteEvent:i,createEvent:m,dateFormat:b};export{l as allDay,m as createEvent,b as dateFormat,r as day,k as default,i as deleteEvent,n as month,e as months,d as noEvent,c as today,s as week,a as weekDays,o as year,t as years};\n"
  },
  {
    "path": "public/admin/build/assets/sv.es-LwrPWbzy.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const e=[\"Måndag\",\"Tisdag\",\"Onsdag\",\"Torsdag\",\"Fredag\",\"Lördag\",\"Söndag\"],a=[\"Januari\",\"Februari\",\"Mars\",\"April\",\"Maj\",\"Juni\",\"Juli\",\"Augusti\",\"September\",\"Oktober\",\"November\",\"December\"],n=\"År\",t=\"År\",s=\"Månad\",o=\"Vecka\",d=\"Dag\",r=\"Idag\",c=\"Ingen händelse\",g=\"Heldag\",l=\"Ta bort\",M=\"Skapa händelse\",i=\"dddd den D MMMM YYYY\",u={weekDays:e,months:a,years:n,year:t,month:s,week:o,day:d,today:r,noEvent:c,allDay:g,deleteEvent:l,createEvent:M,dateFormat:i};export{g as allDay,M as createEvent,i as dateFormat,d as day,u as default,l as deleteEvent,s as month,a as months,c as noEvent,r as today,o as week,e as weekDays,t as year,n as years};\n"
  },
  {
    "path": "public/admin/build/assets/tr.es-CS80t-Rq.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"Pazartesi\",\"Salı\",\"Çarşamba\",\"Perşembe\",\"Cuma\",\"Cumartesi\",\"Pazar\"],a=[\"Ocak\",\"Şubat\",\"Mart\",\"Nisan\",\"Mayıs\",\"Haziran\",\"Temmuz\",\"Ağustos\",\"Eylül\",\"Ekim\",\"Kasım\",\"Aralık\"],n=\"Yıllar\",e=\"Yıl\",s=\"Ay\",o=\"Hafta\",c=\"Gün\",l=\"Bugün\",r=\"Etkinlik Yok\",m=\"Tüm gün\",k=\"Sil\",i=\"Etkinlik ekle\",d=\"dddd D MMMM YYYY\",y={weekDays:t,months:a,years:n,year:e,month:s,week:o,day:c,today:l,noEvent:r,allDay:m,deleteEvent:k,createEvent:i,dateFormat:d};export{m as allDay,i as createEvent,d as dateFormat,c as day,y as default,k as deleteEvent,s as month,a as months,r as noEvent,l as today,o as week,t as weekDays,e as year,n as years};\n"
  },
  {
    "path": "public/admin/build/assets/uk.es-BVYlda65.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"Понеділок\",\"Вівторок\",\"Середа\",\"Четвер\",\"П'ятниця\",\"Субота\",\"Неділя\"],o=[\"Січень\",\"Лютий\",\"Березень\",\"Квітень\",\"Травень\",\"Червень\",\"Липень\",\"Серпень\",\"Вересень\",\"Жовтень\",\"Листопад\",\"Грудень\"],n=[\"Пн\",\"Вт\",\"Ср\",\"Чт\",\"Пт\",\"Сб\",\"Нд\"],s=\"Роки\",e=\"Рік\",c=\"Місяць\",a=\"Тиждень\",d=\"День\",y=\"Сьогодні\",r=\"Немає подій\",k=\"Весь день\",l=\"Видалити\",D=\"Створити подію\",M=\"dddd D MMMM YYYY\",Y={weekDays:t,months:o,weekDaysShort:n,years:s,year:e,month:c,week:a,day:d,today:y,noEvent:r,allDay:k,deleteEvent:l,createEvent:D,dateFormat:M};export{k as allDay,D as createEvent,M as dateFormat,d as day,Y as default,l as deleteEvent,c as month,o as months,r as noEvent,y as today,a as week,t as weekDays,n as weekDaysShort,e as year,s as years};\n"
  },
  {
    "path": "public/admin/build/assets/vi.es-B5CIRCK5.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const n=[\"Thứ hai\",\"Thứ ba\",\"Thứ tư\",\"Thứ năm\",\"Thứ sáu\",\"Thứ bảy\",\"Chủ nhật\"],t=[\"T2\",\"T3\",\"T4\",\"T5\",\"T6\",\"T7\",\"CN\"],T=[\"Tháng 1\",\"Tháng 2\",\"Tháng 3\",\"Tháng 4\",\"Tháng 5\",\"Tháng 6\",\"Tháng 7\",\"Tháng 8\",\"Tháng 9\",\"Tháng 10\",\"Tháng 11\",\"Tháng 12\"],h=\"Năm\",o=\"Năm nay\",e=\"Tháng\",s=\"Tuần\",a=\"Ngày\",c=\"Hôm nay\",g=\"NKhông có Event\",y=\"Cả ngày\",d=\"Xóa\",m=\"Tạo event\",r=\"dddd MMMM D YYYY\",v={weekDays:n,weekDaysShort:t,months:T,years:h,year:o,month:e,week:s,day:a,today:c,noEvent:g,allDay:y,deleteEvent:d,createEvent:m,dateFormat:r};export{y as allDay,m as createEvent,r as dateFormat,a as day,v as default,d as deleteEvent,e as month,T as months,g as noEvent,c as today,s as week,n as weekDays,t as weekDaysShort,o as year,h as years};\n"
  },
  {
    "path": "public/admin/build/assets/zh-cn.es-DKz-yscG.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"星期一\",\"星期二\",\"星期三\",\"星期四\",\"星期五\",\"星期六\",\"星期日\"],n=[\"一\",\"二\",\"三\",\"四\",\"五\",\"六\",\"日\"],o=[\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"],s=\"年\",e=\"本年\",c=\"月\",a=\"周\",d=\"日\",y=\"今日\",r=\"暂无活动\",h=\"整天\",l=\"删除\",D=\"新建活动\",M=\"YYYY MMMM D dddd\",Y={weekDays:t,weekDaysShort:n,months:o,years:s,year:e,month:c,week:a,day:d,today:y,noEvent:r,allDay:h,deleteEvent:l,createEvent:D,dateFormat:M};export{h as allDay,D as createEvent,M as dateFormat,d as day,Y as default,l as deleteEvent,c as month,o as months,r as noEvent,y as today,a as week,t as weekDays,n as weekDaysShort,e as year,s as years};\n"
  },
  {
    "path": "public/admin/build/assets/zh-hk.es-CFZP5Cvd.js",
    "content": "/**\n  * vue-cal v4.10.2\n  * (c) 2025 Antoni Andre <antoniandre.web@gmail.com>\n  * @license MIT\n  */const t=[\"星期一\",\"星期二\",\"星期三\",\"星期四\",\"星期五\",\"星期六\",\"星期日\"],o=[\"一\",\"二\",\"三\",\"四\",\"五\",\"六\",\"日\"],n=[\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"],s=\"年\",e=\"本年\",c=\"月\",a=\"周\",d=\"日\",y=\"今日\",r=\"暫無活動\",h=\"整天\",k=\"刪除\",l=\"新建活動\",D=\"YYYY MMMM D dddd\",M={weekDays:t,weekDaysShort:o,months:n,years:s,year:e,month:c,week:a,day:d,today:y,noEvent:r,allDay:h,deleteEvent:k,createEvent:l,dateFormat:D};export{h as allDay,l as createEvent,D as dateFormat,d as day,M as default,k as deleteEvent,c as month,n as months,r as noEvent,y as today,a as week,t as weekDays,o as weekDaysShort,e as year,s as years};\n"
  },
  {
    "path": "public/admin/build/manifest.json",
    "content": "{\n  \"node_modules/vue-cal/dist/drag-and-drop.es.js\": {\n    \"file\": \"assets/drag-and-drop.es-JkAdgoaa.js\",\n    \"name\": \"drag-and-drop.es\",\n    \"src\": \"node_modules/vue-cal/dist/drag-and-drop.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/ar.es.js\": {\n    \"file\": \"assets/ar.es-CfdTYgcp.js\",\n    \"name\": \"ar.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/ar.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/bg.es.js\": {\n    \"file\": \"assets/bg.es-Ce0T19Qg.js\",\n    \"name\": \"bg.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/bg.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/bn.es.js\": {\n    \"file\": \"assets/bn.es-iWyup8_3.js\",\n    \"name\": \"bn.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/bn.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/bs.es.js\": {\n    \"file\": \"assets/bs.es-Cz58hpHx.js\",\n    \"name\": \"bs.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/bs.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/ca.es.js\": {\n    \"file\": \"assets/ca.es-CujU75Im.js\",\n    \"name\": \"ca.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/ca.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/cs.es.js\": {\n    \"file\": \"assets/cs.es-BHhRbaip.js\",\n    \"name\": \"cs.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/cs.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/da.es.js\": {\n    \"file\": \"assets/da.es-DglD7fV2.js\",\n    \"name\": \"da.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/da.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/de.es.js\": {\n    \"file\": \"assets/de.es-D_4ZyLTN.js\",\n    \"name\": \"de.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/de.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/el.es.js\": {\n    \"file\": \"assets/el.es-BC26X5xm.js\",\n    \"name\": \"el.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/el.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/en.es.js\": {\n    \"file\": \"assets/en.es-DDTuV2po.js\",\n    \"name\": \"en.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/en.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/es.es.js\": {\n    \"file\": \"assets/es.es-BvvfjN-O.js\",\n    \"name\": \"es.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/es.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/et.es.js\": {\n    \"file\": \"assets/et.es-C0rF9HtR.js\",\n    \"name\": \"et.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/et.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/fa.es.js\": {\n    \"file\": \"assets/fa.es-CibKJjgz.js\",\n    \"name\": \"fa.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/fa.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/fi.es.js\": {\n    \"file\": \"assets/fi.es-B0Iy6aas.js\",\n    \"name\": \"fi.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/fi.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/fr.es.js\": {\n    \"file\": \"assets/fr.es-B7WXlprl.js\",\n    \"name\": \"fr.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/fr.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/he.es.js\": {\n    \"file\": \"assets/he.es-K9Fk8xhK.js\",\n    \"name\": \"he.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/he.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/hr.es.js\": {\n    \"file\": \"assets/hr.es-ef5bxYFj.js\",\n    \"name\": \"hr.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/hr.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/hu.es.js\": {\n    \"file\": \"assets/hu.es-nZ65MV0n.js\",\n    \"name\": \"hu.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/hu.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/id.es.js\": {\n    \"file\": \"assets/id.es-CzHAK-XV.js\",\n    \"name\": \"id.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/id.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/is.es.js\": {\n    \"file\": \"assets/is.es-Dz07gBgt.js\",\n    \"name\": \"is.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/is.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/it.es.js\": {\n    \"file\": \"assets/it.es-CquQA5xx.js\",\n    \"name\": \"it.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/it.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/ja.es.js\": {\n    \"file\": \"assets/ja.es-D6pL26k_.js\",\n    \"name\": \"ja.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/ja.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/ka.es.js\": {\n    \"file\": \"assets/ka.es-Cb9X-eNS.js\",\n    \"name\": \"ka.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/ka.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/ko.es.js\": {\n    \"file\": \"assets/ko.es-CTpJlj0A.js\",\n    \"name\": \"ko.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/ko.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/lt.es.js\": {\n    \"file\": \"assets/lt.es-vqgjGyMx.js\",\n    \"name\": \"lt.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/lt.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/mn.es.js\": {\n    \"file\": \"assets/mn.es-YZet1as4.js\",\n    \"name\": \"mn.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/mn.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/nl.es.js\": {\n    \"file\": \"assets/nl.es-COp8PWbT.js\",\n    \"name\": \"nl.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/nl.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/no.es.js\": {\n    \"file\": \"assets/no.es-_2m-F2FS.js\",\n    \"name\": \"no.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/no.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/pl.es.js\": {\n    \"file\": \"assets/pl.es-jjNeJM5X.js\",\n    \"name\": \"pl.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/pl.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/pt-br.es.js\": {\n    \"file\": \"assets/pt-br.es-D8ojES2d.js\",\n    \"name\": \"pt-br.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/pt-br.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/pt-pt.es.js\": {\n    \"file\": \"assets/pt-pt.es-D8ojES2d.js\",\n    \"name\": \"pt-pt.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/pt-pt.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/ro.es.js\": {\n    \"file\": \"assets/ro.es-B6_ATXom.js\",\n    \"name\": \"ro.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/ro.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/ru.es.js\": {\n    \"file\": \"assets/ru.es-BGEpmv_x.js\",\n    \"name\": \"ru.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/ru.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/sk.es.js\": {\n    \"file\": \"assets/sk.es-V3h-1af8.js\",\n    \"name\": \"sk.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/sk.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/sl.es.js\": {\n    \"file\": \"assets/sl.es-mZjm0YDT.js\",\n    \"name\": \"sl.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/sl.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/sq.es.js\": {\n    \"file\": \"assets/sq.es-_6B4UQXy.js\",\n    \"name\": \"sq.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/sq.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/sr.es.js\": {\n    \"file\": \"assets/sr.es-BmdOpTOG.js\",\n    \"name\": \"sr.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/sr.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/sv.es.js\": {\n    \"file\": \"assets/sv.es-LwrPWbzy.js\",\n    \"name\": \"sv.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/sv.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/tr.es.js\": {\n    \"file\": \"assets/tr.es-CS80t-Rq.js\",\n    \"name\": \"tr.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/tr.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/uk.es.js\": {\n    \"file\": \"assets/uk.es-BVYlda65.js\",\n    \"name\": \"uk.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/uk.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/vi.es.js\": {\n    \"file\": \"assets/vi.es-B5CIRCK5.js\",\n    \"name\": \"vi.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/vi.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/zh-cn.es.js\": {\n    \"file\": \"assets/zh-cn.es-DKz-yscG.js\",\n    \"name\": \"zh-cn.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/zh-cn.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"node_modules/vue-cal/dist/i18n/zh-hk.es.js\": {\n    \"file\": \"assets/zh-hk.es-CFZP5Cvd.js\",\n    \"name\": \"zh-hk.es\",\n    \"src\": \"node_modules/vue-cal/dist/i18n/zh-hk.es.js\",\n    \"isDynamicEntry\": true\n  },\n  \"src/Resources/assets/css/app.css\": {\n    \"file\": \"assets/app-xcMAMgaV.css\",\n    \"src\": \"src/Resources/assets/css/app.css\",\n    \"isEntry\": true\n  },\n  \"src/Resources/assets/fonts/icomoon.woff\": {\n    \"file\": \"assets/icomoon-BbY1GX-d.woff\",\n    \"src\": \"src/Resources/assets/fonts/icomoon.woff\"\n  },\n  \"src/Resources/assets/images/corner-clip.svg\": {\n    \"file\": \"assets/corner-clip-CRLTKrCT.svg\",\n    \"src\": \"src/Resources/assets/images/corner-clip.svg\"\n  },\n  \"src/Resources/assets/images/dark-corner-clip.svg\": {\n    \"file\": \"assets/dark-corner-clip-Deux0RQO.svg\",\n    \"src\": \"src/Resources/assets/images/dark-corner-clip.svg\"\n  },\n  \"src/Resources/assets/images/dark-logo.svg\": {\n    \"file\": \"assets/dark-logo-Dnw3cpYj.svg\",\n    \"src\": \"src/Resources/assets/images/dark-logo.svg\"\n  },\n  \"src/Resources/assets/images/empty-placeholders/activities.svg\": {\n    \"file\": \"assets/activities-DpB2XKqX.svg\",\n    \"src\": \"src/Resources/assets/images/empty-placeholders/activities.svg\"\n  },\n  \"src/Resources/assets/images/empty-placeholders/calls.svg\": {\n    \"file\": \"assets/calls-BU_UfDax.svg\",\n    \"src\": \"src/Resources/assets/images/empty-placeholders/calls.svg\"\n  },\n  \"src/Resources/assets/images/empty-placeholders/default.svg\": {\n    \"file\": \"assets/default-DBulZ5O_.svg\",\n    \"src\": \"src/Resources/assets/images/empty-placeholders/default.svg\"\n  },\n  \"src/Resources/assets/images/empty-placeholders/description.svg\": {\n    \"file\": \"assets/description-BwifbkWG.svg\",\n    \"src\": \"src/Resources/assets/images/empty-placeholders/description.svg\"\n  },\n  \"src/Resources/assets/images/empty-placeholders/emails.svg\": {\n    \"file\": \"assets/emails-D_qEBj20.svg\",\n    \"src\": \"src/Resources/assets/images/empty-placeholders/emails.svg\"\n  },\n  \"src/Resources/assets/images/empty-placeholders/files.svg\": {\n    \"file\": \"assets/files-Xm-jQ6Fi.svg\",\n    \"src\": \"src/Resources/assets/images/empty-placeholders/files.svg\"\n  },\n  \"src/Resources/assets/images/empty-placeholders/lunches.svg\": {\n    \"file\": \"assets/lunches-BHeSbGQ3.svg\",\n    \"src\": \"src/Resources/assets/images/empty-placeholders/lunches.svg\"\n  },\n  \"src/Resources/assets/images/empty-placeholders/meetings.svg\": {\n    \"file\": \"assets/meetings-Cwj897qL.svg\",\n    \"src\": \"src/Resources/assets/images/empty-placeholders/meetings.svg\"\n  },\n  \"src/Resources/assets/images/empty-placeholders/notes.svg\": {\n    \"file\": \"assets/notes-BdIILF0F.svg\",\n    \"src\": \"src/Resources/assets/images/empty-placeholders/notes.svg\"\n  },\n  \"src/Resources/assets/images/empty-placeholders/organizations.svg\": {\n    \"file\": \"assets/organizations-aUdNng-O.svg\",\n    \"src\": \"src/Resources/assets/images/empty-placeholders/organizations.svg\"\n  },\n  \"src/Resources/assets/images/empty-placeholders/pipedrive.svg\": {\n    \"file\": \"assets/pipedrive-Dk_Mji0J.svg\",\n    \"src\": \"src/Resources/assets/images/empty-placeholders/pipedrive.svg\"\n  },\n  \"src/Resources/assets/images/empty-placeholders/plans.svg\": {\n    \"file\": \"assets/plans-DIcOmGwv.svg\",\n    \"src\": \"src/Resources/assets/images/empty-placeholders/plans.svg\"\n  },\n  \"src/Resources/assets/images/empty-placeholders/products.svg\": {\n    \"file\": \"assets/products-zDh6UFtz.svg\",\n    \"src\": \"src/Resources/assets/images/empty-placeholders/products.svg\"\n  },\n  \"src/Resources/assets/images/empty-placeholders/quotes.svg\": {\n    \"file\": \"assets/quotes-0H7ZCVr6.svg\",\n    \"src\": \"src/Resources/assets/images/empty-placeholders/quotes.svg\"\n  },\n  \"src/Resources/assets/images/empty-placeholders/users.svg\": {\n    \"file\": \"assets/users-6trD5il1.svg\",\n    \"src\": \"src/Resources/assets/images/empty-placeholders/users.svg\"\n  },\n  \"src/Resources/assets/images/error.svg\": {\n    \"file\": \"assets/error-ClRu8L1K.svg\",\n    \"src\": \"src/Resources/assets/images/error.svg\"\n  },\n  \"src/Resources/assets/images/favicon.ico\": {\n    \"file\": \"assets/favicon-BtbgZBji.ico\",\n    \"src\": \"src/Resources/assets/images/favicon.ico\"\n  },\n  \"src/Resources/assets/images/logo.svg\": {\n    \"file\": \"assets/logo-Bjh7YAuF.svg\",\n    \"src\": \"src/Resources/assets/images/logo.svg\"\n  },\n  \"src/Resources/assets/images/mobile-dark-logo.svg\": {\n    \"file\": \"assets/mobile-dark-logo-COPgCide.svg\",\n    \"src\": \"src/Resources/assets/images/mobile-dark-logo.svg\"\n  },\n  \"src/Resources/assets/images/mobile-light-logo.svg\": {\n    \"file\": \"assets/mobile-light-logo-CjoobCkl.svg\",\n    \"src\": \"src/Resources/assets/images/mobile-light-logo.svg\"\n  },\n  \"src/Resources/assets/js/app.js\": {\n    \"file\": \"assets/app-B1rBjssc.js\",\n    \"name\": \"app\",\n    \"src\": \"src/Resources/assets/js/app.js\",\n    \"isEntry\": true,\n    \"dynamicImports\": [\n      \"node_modules/vue-cal/dist/i18n/ar.es.js\",\n      \"node_modules/vue-cal/dist/i18n/bg.es.js\",\n      \"node_modules/vue-cal/dist/i18n/bn.es.js\",\n      \"node_modules/vue-cal/dist/i18n/bs.es.js\",\n      \"node_modules/vue-cal/dist/i18n/ca.es.js\",\n      \"node_modules/vue-cal/dist/i18n/cs.es.js\",\n      \"node_modules/vue-cal/dist/i18n/da.es.js\",\n      \"node_modules/vue-cal/dist/i18n/de.es.js\",\n      \"node_modules/vue-cal/dist/i18n/el.es.js\",\n      \"node_modules/vue-cal/dist/i18n/en.es.js\",\n      \"node_modules/vue-cal/dist/i18n/es.es.js\",\n      \"node_modules/vue-cal/dist/i18n/et.es.js\",\n      \"node_modules/vue-cal/dist/i18n/fa.es.js\",\n      \"node_modules/vue-cal/dist/i18n/fi.es.js\",\n      \"node_modules/vue-cal/dist/i18n/fr.es.js\",\n      \"node_modules/vue-cal/dist/i18n/he.es.js\",\n      \"node_modules/vue-cal/dist/i18n/hr.es.js\",\n      \"node_modules/vue-cal/dist/i18n/hu.es.js\",\n      \"node_modules/vue-cal/dist/i18n/id.es.js\",\n      \"node_modules/vue-cal/dist/i18n/is.es.js\",\n      \"node_modules/vue-cal/dist/i18n/it.es.js\",\n      \"node_modules/vue-cal/dist/i18n/ja.es.js\",\n      \"node_modules/vue-cal/dist/i18n/ka.es.js\",\n      \"node_modules/vue-cal/dist/i18n/ko.es.js\",\n      \"node_modules/vue-cal/dist/i18n/lt.es.js\",\n      \"node_modules/vue-cal/dist/i18n/mn.es.js\",\n      \"node_modules/vue-cal/dist/i18n/nl.es.js\",\n      \"node_modules/vue-cal/dist/i18n/no.es.js\",\n      \"node_modules/vue-cal/dist/i18n/pl.es.js\",\n      \"node_modules/vue-cal/dist/i18n/pt-br.es.js\",\n      \"node_modules/vue-cal/dist/i18n/pt-pt.es.js\",\n      \"node_modules/vue-cal/dist/i18n/ro.es.js\",\n      \"node_modules/vue-cal/dist/i18n/ru.es.js\",\n      \"node_modules/vue-cal/dist/i18n/sk.es.js\",\n      \"node_modules/vue-cal/dist/i18n/sl.es.js\",\n      \"node_modules/vue-cal/dist/i18n/sq.es.js\",\n      \"node_modules/vue-cal/dist/i18n/sr.es.js\",\n      \"node_modules/vue-cal/dist/i18n/sv.es.js\",\n      \"node_modules/vue-cal/dist/i18n/tr.es.js\",\n      \"node_modules/vue-cal/dist/i18n/uk.es.js\",\n      \"node_modules/vue-cal/dist/i18n/vi.es.js\",\n      \"node_modules/vue-cal/dist/i18n/zh-cn.es.js\",\n      \"node_modules/vue-cal/dist/i18n/zh-hk.es.js\",\n      \"node_modules/vue-cal/dist/drag-and-drop.es.js\"\n    ],\n    \"css\": [\n      \"assets/app-C2Wq9G4i.css\"\n    ]\n  },\n  \"src/Resources/assets/js/chart.js\": {\n    \"file\": \"assets/chart-D1u1Dgzh.js\",\n    \"name\": \"chart\",\n    \"src\": \"src/Resources/assets/js/chart.js\",\n    \"isEntry\": true\n  }\n}"
  },
  {
    "path": "public/fonts/.gitignore",
    "content": "*\n!Hind-Bold.ttf\n!Hind-Regular.ttf\n!NotoSansBengali-Bold.ttf\n!NotoSansBengali-Regular.ttf\n!NotoSansJP-Bold.ttf\n!NotoSansJP-Regular.ttf\n!NotoSansSC-Bold.ttf\n!NotoSansSC-Regular.ttf\n!NotoSansSinhala-Bold.ttf\n!NotoSansSinhala-Regular.ttf\n!.gitignore\n"
  },
  {
    "path": "public/index.php",
    "content": "<?php\n\nuse Illuminate\\Http\\Request;\n\ndefine('LARAVEL_START', microtime(true));\n\n// Determine if the application is in maintenance mode...\nif (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {\n    require $maintenance;\n}\n\n// Register the Composer autoloader...\nrequire __DIR__.'/../vendor/autoload.php';\n\n// Bootstrap Laravel and handle the request...\n(require_once __DIR__.'/../bootstrap/app.php')\n    ->handleRequest(Request::capture());\n"
  },
  {
    "path": "public/installer/build/assets/app-aec2df31.js",
    "content": "/**\n* @vue/shared v3.5.13\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**//*! #__NO_SIDE_EFFECTS__ */function Mt(e){const t=Object.create(null);for(const n of e.split(\",\"))t[n]=1;return n=>n in t}const de={},cr=[],Ge=()=>{},Fr=()=>!1,Yn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),_l=e=>e.startsWith(\"onUpdate:\"),he=Object.assign,Sl=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},zh=Object.prototype.hasOwnProperty,be=(e,t)=>zh.call(e,t),z=Array.isArray,ur=e=>Tr(e)===\"[object Map]\",Qn=e=>Tr(e)===\"[object Set]\",Ta=e=>Tr(e)===\"[object Date]\",Gh=e=>Tr(e)===\"[object RegExp]\",ie=e=>typeof e==\"function\",ae=e=>typeof e==\"string\",Nt=e=>typeof e==\"symbol\",Ce=e=>e!==null&&typeof e==\"object\",El=e=>(Ce(e)||ie(e))&&ie(e.then)&&ie(e.catch),ou=Object.prototype.toString,Tr=e=>ou.call(e),Jh=e=>Tr(e).slice(8,-1),Pi=e=>Tr(e)===\"[object Object]\",Al=e=>ae(e)&&e!==\"NaN\"&&e[0]!==\"-\"&&\"\"+parseInt(e,10)===e,An=Mt(\",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"),Xh=Mt(\"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"),ki=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Yh=/-(\\w)/g,Ie=ki(e=>e.replace(Yh,(t,n)=>n?n.toUpperCase():\"\")),Qh=/\\B([A-Z])/g,Ct=ki(e=>e.replace(Qh,\"-$1\").toLowerCase()),er=ki(e=>e.charAt(0).toUpperCase()+e.slice(1)),fr=ki(e=>e?`on${er(e)}`:\"\"),gt=(e,t)=>!Object.is(e,t),dr=(e,...t)=>{for(let n=0;n<e.length;n++)e[n](...t)},lu=(e,t,n,r=!1)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},ti=e=>{const t=parseFloat(e);return isNaN(t)?e:t},ni=e=>{const t=ae(e)?Number(e):NaN;return isNaN(t)?e:t};let Ca;const Vi=()=>Ca||(Ca=typeof globalThis<\"u\"?globalThis:typeof self<\"u\"?self:typeof window<\"u\"?window:typeof global<\"u\"?global:{});function ep(e,t){return e+JSON.stringify(t,(n,r)=>typeof r==\"function\"?r.toString():r)}const tp=\"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\",np=Mt(tp);function ds(e){if(z(e)){const t={};for(let n=0;n<e.length;n++){const r=e[n],s=ae(r)?au(r):ds(r);if(s)for(const i in s)t[i]=s[i]}return t}else if(ae(e)||Ce(e))return e}const rp=/;(?![^(]*\\))/g,sp=/:([^]+)/,ip=/\\/\\*[^]*?\\*\\//g;function au(e){const t={};return e.replace(ip,\"\").split(rp).forEach(n=>{if(n){const r=n.split(sp);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function hs(e){let t=\"\";if(ae(e))t=e;else if(z(e))for(let n=0;n<e.length;n++){const r=hs(e[n]);r&&(t+=r+\" \")}else if(Ce(e))for(const n in e)e[n]&&(t+=n+\" \");return t.trim()}function op(e){if(!e)return null;let{class:t,style:n}=e;return t&&!ae(t)&&(e.class=hs(t)),n&&(e.style=ds(n)),e}const lp=\"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\",ap=\"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,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,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\",cp=\"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\",up=\"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\",fp=Mt(lp),dp=Mt(ap),hp=Mt(cp),pp=Mt(up),mp=\"itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly\",gp=Mt(mp);function cu(e){return!!e||e===\"\"}function yp(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&r<e.length;r++)n=Nn(e[r],t[r]);return n}function Nn(e,t){if(e===t)return!0;let n=Ta(e),r=Ta(t);if(n||r)return n&&r?e.getTime()===t.getTime():!1;if(n=Nt(e),r=Nt(t),n||r)return e===t;if(n=z(e),r=z(t),n||r)return n&&r?yp(e,t):!1;if(n=Ce(e),r=Ce(t),n||r){if(!n||!r)return!1;const s=Object.keys(e).length,i=Object.keys(t).length;if(s!==i)return!1;for(const o in e){const l=e.hasOwnProperty(o),a=t.hasOwnProperty(o);if(l&&!a||!l&&a||!Nn(e[o],t[o]))return!1}}return String(e)===String(t)}function Mi(e,t){return e.findIndex(n=>Nn(n,t))}const uu=e=>!!(e&&e.__v_isRef===!0),fu=e=>ae(e)?e:e==null?\"\":z(e)||Ce(e)&&(e.toString===ou||!ie(e.toString))?uu(e)?fu(e.value):JSON.stringify(e,du,2):String(e),du=(e,t)=>uu(t)?du(e,t.value):ur(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],i)=>(n[go(r,i)+\" =>\"]=s,n),{})}:Qn(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>go(n))}:Nt(t)?go(t):Ce(t)&&!z(t)&&!Pi(t)?String(t):t,go=(e,t=\"\")=>{var n;return Nt(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/**\n* @vue/reactivity v3.5.13\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/let mt;class Tl{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=mt,!t&&mt&&(this.index=(mt.scopes||(mt.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].pause();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].pause()}}resume(){if(this._active&&this._isPaused){this._isPaused=!1;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].resume();for(t=0,n=this.effects.length;t<n;t++)this.effects[t].resume()}}run(t){if(this._active){const n=mt;try{return mt=this,t()}finally{mt=n}}}on(){mt=this}off(){mt=this.parent}stop(t){if(this._active){this._active=!1;let n,r;for(n=0,r=this.effects.length;n<r;n++)this.effects[n].stop();for(this.effects.length=0,n=0,r=this.cleanups.length;n<r;n++)this.cleanups[n]();if(this.cleanups.length=0,this.scopes){for(n=0,r=this.scopes.length;n<r;n++)this.scopes[n].stop(!0);this.scopes.length=0}if(!this.detached&&this.parent&&!t){const s=this.parent.scopes.pop();s&&s!==this&&(this.parent.scopes[this.index]=s,s.index=this.index)}this.parent=void 0}}}function bp(e){return new Tl(e)}function hu(){return mt}function vp(e,t=!1){mt&&mt.cleanups.push(e)}let Ne;const yo=new WeakSet;class Zr{constructor(t){this.fn=t,this.deps=void 0,this.depsTail=void 0,this.flags=5,this.next=void 0,this.cleanup=void 0,this.scheduler=void 0,mt&&mt.active&&mt.effects.push(this)}pause(){this.flags|=64}resume(){this.flags&64&&(this.flags&=-65,yo.has(this)&&(yo.delete(this),this.trigger()))}notify(){this.flags&2&&!(this.flags&32)||this.flags&8||mu(this)}run(){if(!(this.flags&1))return this.fn();this.flags|=2,wa(this),gu(this);const t=Ne,n=Wt;Ne=this,Wt=!0;try{return this.fn()}finally{yu(this),Ne=t,Wt=n,this.flags&=-3}}stop(){if(this.flags&1){for(let t=this.deps;t;t=t.nextDep)Ol(t);this.deps=this.depsTail=void 0,wa(this),this.onStop&&this.onStop(),this.flags&=-2}}trigger(){this.flags&64?yo.add(this):this.scheduler?this.scheduler():this.runIfDirty()}runIfDirty(){Mo(this)&&this.run()}get dirty(){return Mo(this)}}let pu=0,Br,jr;function mu(e,t=!1){if(e.flags|=8,t){e.next=jr,jr=e;return}e.next=Br,Br=e}function Cl(){pu++}function wl(){if(--pu>0)return;if(jr){let t=jr;for(jr=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Br;){let t=Br;for(Br=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function gu(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function yu(e){let t,n=e.depsTail,r=n;for(;r;){const s=r.prevDep;r.version===-1?(r===n&&(n=s),Ol(r),_p(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=s}e.deps=t,e.depsTail=n}function Mo(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(bu(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function bu(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===zr))return;e.globalVersion=zr;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!Mo(e)){e.flags&=-3;return}const n=Ne,r=Wt;Ne=e,Wt=!0;try{gu(e);const s=e.fn(e._value);(t.version===0||gt(s,e._value))&&(e._value=s,t.version++)}catch(s){throw t.version++,s}finally{Ne=n,Wt=r,yu(e),e.flags&=-3}}function Ol(e,t=!1){const{dep:n,prevSub:r,nextSub:s}=e;if(r&&(r.nextSub=s,e.prevSub=void 0),s&&(s.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Ol(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function _p(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}function Sp(e,t){e.effect instanceof Zr&&(e=e.effect.fn);const n=new Zr(e);t&&he(n,t);try{n.run()}catch(s){throw n.stop(),s}const r=n.run.bind(n);return r.effect=n,r}function Ep(e){e.effect.stop()}let Wt=!0;const vu=[];function Pn(){vu.push(Wt),Wt=!1}function kn(){const e=vu.pop();Wt=e===void 0?!0:e}function wa(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=Ne;Ne=void 0;try{t()}finally{Ne=n}}}let zr=0;class Ap{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Fi{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!Ne||!Wt||Ne===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==Ne)n=this.activeLink=new Ap(Ne,this),Ne.deps?(n.prevDep=Ne.depsTail,Ne.depsTail.nextDep=n,Ne.depsTail=n):Ne.deps=Ne.depsTail=n,_u(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=Ne.depsTail,n.nextDep=void 0,Ne.depsTail.nextDep=n,Ne.depsTail=n,Ne.deps===n&&(Ne.deps=r)}return n}trigger(t){this.version++,zr++,this.notify(t)}notify(t){Cl();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{wl()}}}function _u(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)_u(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const ri=new WeakMap,jn=Symbol(\"\"),Fo=Symbol(\"\"),Gr=Symbol(\"\");function ot(e,t,n){if(Wt&&Ne){let r=ri.get(e);r||ri.set(e,r=new Map);let s=r.get(n);s||(r.set(n,s=new Fi),s.map=r,s.key=n),s.track()}}function ln(e,t,n,r,s,i){const o=ri.get(e);if(!o){zr++;return}const l=a=>{a&&a.trigger()};if(Cl(),t===\"clear\")o.forEach(l);else{const a=z(e),c=a&&Al(n);if(a&&n===\"length\"){const u=Number(r);o.forEach((f,d)=>{(d===\"length\"||d===Gr||!Nt(d)&&d>=u)&&l(f)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),c&&l(o.get(Gr)),t){case\"add\":a?c&&l(o.get(\"length\")):(l(o.get(jn)),ur(e)&&l(o.get(Fo)));break;case\"delete\":a||(l(o.get(jn)),ur(e)&&l(o.get(Fo)));break;case\"set\":ur(e)&&l(o.get(jn));break}}wl()}function Tp(e,t){const n=ri.get(e);return n&&n.get(t)}function rr(e){const t=me(e);return t===e?t:(ot(t,\"iterate\",Gr),Pt(e)?t:t.map(lt))}function Li(e){return ot(e=me(e),\"iterate\",Gr),e}const Cp={__proto__:null,[Symbol.iterator](){return bo(this,Symbol.iterator,lt)},concat(...e){return rr(this).concat(...e.map(t=>z(t)?rr(t):t))},entries(){return bo(this,\"entries\",e=>(e[1]=lt(e[1]),e))},every(e,t){return tn(this,\"every\",e,t,void 0,arguments)},filter(e,t){return tn(this,\"filter\",e,t,n=>n.map(lt),arguments)},find(e,t){return tn(this,\"find\",e,t,lt,arguments)},findIndex(e,t){return tn(this,\"findIndex\",e,t,void 0,arguments)},findLast(e,t){return tn(this,\"findLast\",e,t,lt,arguments)},findLastIndex(e,t){return tn(this,\"findLastIndex\",e,t,void 0,arguments)},forEach(e,t){return tn(this,\"forEach\",e,t,void 0,arguments)},includes(...e){return vo(this,\"includes\",e)},indexOf(...e){return vo(this,\"indexOf\",e)},join(e){return rr(this).join(e)},lastIndexOf(...e){return vo(this,\"lastIndexOf\",e)},map(e,t){return tn(this,\"map\",e,t,void 0,arguments)},pop(){return Pr(this,\"pop\")},push(...e){return Pr(this,\"push\",e)},reduce(e,...t){return Oa(this,\"reduce\",e,t)},reduceRight(e,...t){return Oa(this,\"reduceRight\",e,t)},shift(){return Pr(this,\"shift\")},some(e,t){return tn(this,\"some\",e,t,void 0,arguments)},splice(...e){return Pr(this,\"splice\",e)},toReversed(){return rr(this).toReversed()},toSorted(e){return rr(this).toSorted(e)},toSpliced(...e){return rr(this).toSpliced(...e)},unshift(...e){return Pr(this,\"unshift\",e)},values(){return bo(this,\"values\",lt)}};function bo(e,t,n){const r=Li(e),s=r[t]();return r!==e&&!Pt(e)&&(s._next=s.next,s.next=()=>{const i=s._next();return i.value&&(i.value=n(i.value)),i}),s}const wp=Array.prototype;function tn(e,t,n,r,s,i){const o=Li(e),l=o!==e&&!Pt(e),a=o[t];if(a!==wp[t]){const f=a.apply(e,i);return l?lt(f):f}let c=n;o!==e&&(l?c=function(f,d){return n.call(this,lt(f),d,e)}:n.length>2&&(c=function(f,d){return n.call(this,f,d,e)}));const u=a.call(o,c,r);return l&&s?s(u):u}function Oa(e,t,n,r){const s=Li(e);let i=n;return s!==e&&(Pt(e)?n.length>3&&(i=function(o,l,a){return n.call(this,o,l,a,e)}):i=function(o,l,a){return n.call(this,o,lt(l),a,e)}),s[t](i,...r)}function vo(e,t,n){const r=me(e);ot(r,\"iterate\",Gr);const s=r[t](...n);return(s===-1||s===!1)&&ji(n[0])?(n[0]=me(n[0]),r[t](...n)):s}function Pr(e,t,n=[]){Pn(),Cl();const r=me(e)[t].apply(e,n);return wl(),kn(),r}const Op=Mt(\"__proto__,__v_isRef,__isVue\"),Su=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==\"arguments\"&&e!==\"caller\").map(e=>Symbol[e]).filter(Nt));function Np(e){Nt(e)||(e=String(e));const t=me(this);return ot(t,\"has\",e),t.hasOwnProperty(e)}class Eu{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){if(n===\"__v_skip\")return t.__v_skip;const s=this._isReadonly,i=this._isShallow;if(n===\"__v_isReactive\")return!s;if(n===\"__v_isReadonly\")return s;if(n===\"__v_isShallow\")return i;if(n===\"__v_raw\")return r===(s?i?Nu:Ou:i?wu:Cu).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const o=z(t);if(!s){let a;if(o&&(a=Cp[n]))return a;if(n===\"hasOwnProperty\")return Np}const l=Reflect.get(t,n,Ve(t)?t:r);return(Nt(n)?Su.has(n):Op(n))||(s||ot(t,\"get\",n),i)?l:Ve(l)?o&&Al(n)?l:l.value:Ce(l)?s?Di(l):Rn(l):l}}class Au extends Eu{constructor(t=!1){super(!1,t)}set(t,n,r,s){let i=t[n];if(!this._isShallow){const a=xn(i);if(!Pt(r)&&!xn(r)&&(i=me(i),r=me(r)),!z(t)&&Ve(i)&&!Ve(r))return a?!1:(i.value=r,!0)}const o=z(t)&&Al(n)?Number(n)<t.length:be(t,n),l=Reflect.set(t,n,r,Ve(t)?t:s);return t===me(s)&&(o?gt(r,i)&&ln(t,\"set\",n,r):ln(t,\"add\",n,r)),l}deleteProperty(t,n){const r=be(t,n);t[n];const s=Reflect.deleteProperty(t,n);return s&&r&&ln(t,\"delete\",n,void 0),s}has(t,n){const r=Reflect.has(t,n);return(!Nt(n)||!Su.has(n))&&ot(t,\"has\",n),r}ownKeys(t){return ot(t,\"iterate\",z(t)?\"length\":jn),Reflect.ownKeys(t)}}class Tu extends Eu{constructor(t=!1){super(!0,t)}set(t,n){return!0}deleteProperty(t,n){return!0}}const Rp=new Au,xp=new Tu,Ip=new Au(!0),Pp=new Tu(!0),Lo=e=>e,As=e=>Reflect.getPrototypeOf(e);function kp(e,t,n){return function(...r){const s=this.__v_raw,i=me(s),o=ur(i),l=e===\"entries\"||e===Symbol.iterator&&o,a=e===\"keys\"&&o,c=s[e](...r),u=n?Lo:t?$o:lt;return!t&&ot(i,\"iterate\",a?Fo:jn),{next(){const{value:f,done:d}=c.next();return d?{value:f,done:d}:{value:l?[u(f[0]),u(f[1])]:u(f),done:d}},[Symbol.iterator](){return this}}}}function Ts(e){return function(...t){return e===\"delete\"?!1:e===\"clear\"?void 0:this}}function Vp(e,t){const n={get(s){const i=this.__v_raw,o=me(i),l=me(s);e||(gt(s,l)&&ot(o,\"get\",s),ot(o,\"get\",l));const{has:a}=As(o),c=t?Lo:e?$o:lt;if(a.call(o,s))return c(i.get(s));if(a.call(o,l))return c(i.get(l));i!==o&&i.get(s)},get size(){const s=this.__v_raw;return!e&&ot(me(s),\"iterate\",jn),Reflect.get(s,\"size\",s)},has(s){const i=this.__v_raw,o=me(i),l=me(s);return e||(gt(s,l)&&ot(o,\"has\",s),ot(o,\"has\",l)),s===l?i.has(s):i.has(s)||i.has(l)},forEach(s,i){const o=this,l=o.__v_raw,a=me(l),c=t?Lo:e?$o:lt;return!e&&ot(a,\"iterate\",jn),l.forEach((u,f)=>s.call(i,c(u),c(f),o))}};return he(n,e?{add:Ts(\"add\"),set:Ts(\"set\"),delete:Ts(\"delete\"),clear:Ts(\"clear\")}:{add(s){!t&&!Pt(s)&&!xn(s)&&(s=me(s));const i=me(this);return As(i).has.call(i,s)||(i.add(s),ln(i,\"add\",s,s)),this},set(s,i){!t&&!Pt(i)&&!xn(i)&&(i=me(i));const o=me(this),{has:l,get:a}=As(o);let c=l.call(o,s);c||(s=me(s),c=l.call(o,s));const u=a.call(o,s);return o.set(s,i),c?gt(i,u)&&ln(o,\"set\",s,i):ln(o,\"add\",s,i),this},delete(s){const i=me(this),{has:o,get:l}=As(i);let a=o.call(i,s);a||(s=me(s),a=o.call(i,s)),l&&l.call(i,s);const c=i.delete(s);return a&&ln(i,\"delete\",s,void 0),c},clear(){const s=me(this),i=s.size!==0,o=s.clear();return i&&ln(s,\"clear\",void 0,void 0),o}}),[\"keys\",\"values\",\"entries\",Symbol.iterator].forEach(s=>{n[s]=kp(s,e,t)}),n}function $i(e,t){const n=Vp(e,t);return(r,s,i)=>s===\"__v_isReactive\"?!e:s===\"__v_isReadonly\"?e:s===\"__v_raw\"?r:Reflect.get(be(n,s)&&s in r?n:r,s,i)}const Mp={get:$i(!1,!1)},Fp={get:$i(!1,!0)},Lp={get:$i(!0,!1)},$p={get:$i(!0,!0)},Cu=new WeakMap,wu=new WeakMap,Ou=new WeakMap,Nu=new WeakMap;function Dp(e){switch(e){case\"Object\":case\"Array\":return 1;case\"Map\":case\"Set\":case\"WeakMap\":case\"WeakSet\":return 2;default:return 0}}function Bp(e){return e.__v_skip||!Object.isExtensible(e)?0:Dp(Jh(e))}function Rn(e){return xn(e)?e:Bi(e,!1,Rp,Mp,Cu)}function Ru(e){return Bi(e,!1,Ip,Fp,wu)}function Di(e){return Bi(e,!0,xp,Lp,Ou)}function jp(e){return Bi(e,!0,Pp,$p,Nu)}function Bi(e,t,n,r,s){if(!Ce(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=s.get(e);if(i)return i;const o=Bp(e);if(o===0)return e;const l=new Proxy(e,o===2?r:n);return s.set(e,l),l}function Tn(e){return xn(e)?Tn(e.__v_raw):!!(e&&e.__v_isReactive)}function xn(e){return!!(e&&e.__v_isReadonly)}function Pt(e){return!!(e&&e.__v_isShallow)}function ji(e){return e?!!e.__v_raw:!1}function me(e){const t=e&&e.__v_raw;return t?me(t):e}function xu(e){return!be(e,\"__v_skip\")&&Object.isExtensible(e)&&lu(e,\"__v_skip\",!0),e}const lt=e=>Ce(e)?Rn(e):e,$o=e=>Ce(e)?Di(e):e;function Ve(e){return e?e.__v_isRef===!0:!1}function at(e){return Iu(e,!1)}function Nl(e){return Iu(e,!0)}function Iu(e,t){return Ve(e)?e:new Up(e,t)}class Up{constructor(t,n){this.dep=new Fi,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:me(t),this._value=n?t:lt(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||Pt(t)||xn(t);t=r?t:me(t),gt(t,n)&&(this._rawValue=t,this._value=r?t:lt(t),this.dep.trigger())}}function Hp(e){e.dep&&e.dep.trigger()}function Te(e){return Ve(e)?e.value:e}function ne(e){return ie(e)?e():Te(e)}const qp={get:(e,t,n)=>t===\"__v_raw\"?e:Te(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return Ve(s)&&!Ve(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function Rl(e){return Tn(e)?e:new Proxy(e,qp)}class Kp{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Fi,{get:r,set:s}=t(n.track.bind(n),n.trigger.bind(n));this._get=r,this._set=s}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Pu(e){return new Kp(e)}function Wp(e){const t=z(e)?new Array(e.length):{};for(const n in e)t[n]=ku(e,n);return t}class Zp{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Tp(me(this._object),this._key)}}class zp{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function En(e,t,n){return Ve(e)?e:ie(e)?new zp(e):Ce(e)&&arguments.length>1?ku(e,t,n):at(e)}function ku(e,t,n){const r=e[t];return Ve(r)?r:new Zp(e,t,n)}class Gp{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Fi(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=zr-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&Ne!==this)return mu(this,!0),!0}get value(){const t=this.dep.track();return bu(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Jp(e,t,n=!1){let r,s;return ie(e)?r=e:(r=e.get,s=e.set),new Gp(r,s,n)}const Xp={GET:\"get\",HAS:\"has\",ITERATE:\"iterate\"},Yp={SET:\"set\",ADD:\"add\",DELETE:\"delete\",CLEAR:\"clear\"},Cs={},si=new WeakMap;let yn;function Qp(){return yn}function Vu(e,t=!1,n=yn){if(n){let r=si.get(n);r||si.set(n,r=[]),r.push(e)}}function em(e,t,n=de){const{immediate:r,deep:s,once:i,scheduler:o,augmentJob:l,call:a}=n,c=b=>s?b:Pt(b)||s===!1||s===0?an(b,1):an(b);let u,f,d,h,p=!1,g=!1;if(Ve(e)?(f=()=>e.value,p=Pt(e)):Tn(e)?(f=()=>c(e),p=!0):z(e)?(g=!0,p=e.some(b=>Tn(b)||Pt(b)),f=()=>e.map(b=>{if(Ve(b))return b.value;if(Tn(b))return c(b);if(ie(b))return a?a(b,2):b()})):ie(e)?t?f=a?()=>a(e,2):e:f=()=>{if(d){Pn();try{d()}finally{kn()}}const b=yn;yn=u;try{return a?a(e,3,[h]):e(h)}finally{yn=b}}:f=Ge,t&&s){const b=f,A=s===!0?1/0:s;f=()=>an(b(),A)}const _=hu(),w=()=>{u.stop(),_&&_.active&&Sl(_.effects,u)};if(i&&t){const b=t;t=(...A)=>{b(...A),w()}}let C=g?new Array(e.length).fill(Cs):Cs;const y=b=>{if(!(!(u.flags&1)||!u.dirty&&!b))if(t){const A=u.run();if(s||p||(g?A.some((I,V)=>gt(I,C[V])):gt(A,C))){d&&d();const I=yn;yn=u;try{const V=[A,C===Cs?void 0:g&&C[0]===Cs?[]:C,h];a?a(t,3,V):t(...V),C=A}finally{yn=I}}}else u.run()};return l&&l(y),u=new Zr(f),u.scheduler=o?()=>o(y,!1):y,h=b=>Vu(b,!1,u),d=u.onStop=()=>{const b=si.get(u);if(b){if(a)a(b,4);else for(const A of b)A();si.delete(u)}},t?r?y(!0):C=u.run():o?o(y.bind(null,!0),!0):u.run(),w.pause=u.pause.bind(u),w.resume=u.resume.bind(u),w.stop=w,w}function an(e,t=1/0,n){if(t<=0||!Ce(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,Ve(e))an(e.value,t,n);else if(z(e))for(let r=0;r<e.length;r++)an(e[r],t,n);else if(Qn(e)||ur(e))e.forEach(r=>{an(r,t,n)});else if(Pi(e)){for(const r in e)an(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&an(e[r],t,n)}return e}/**\n* @vue/runtime-core v3.5.13\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/const Mu=[];function tm(e){Mu.push(e)}function nm(){Mu.pop()}function rm(e,t){}const sm={SETUP_FUNCTION:0,0:\"SETUP_FUNCTION\",RENDER_FUNCTION:1,1:\"RENDER_FUNCTION\",NATIVE_EVENT_HANDLER:5,5:\"NATIVE_EVENT_HANDLER\",COMPONENT_EVENT_HANDLER:6,6:\"COMPONENT_EVENT_HANDLER\",VNODE_HOOK:7,7:\"VNODE_HOOK\",DIRECTIVE_HOOK:8,8:\"DIRECTIVE_HOOK\",TRANSITION_HOOK:9,9:\"TRANSITION_HOOK\",APP_ERROR_HANDLER:10,10:\"APP_ERROR_HANDLER\",APP_WARN_HANDLER:11,11:\"APP_WARN_HANDLER\",FUNCTION_REF:12,12:\"FUNCTION_REF\",ASYNC_COMPONENT_LOADER:13,13:\"ASYNC_COMPONENT_LOADER\",SCHEDULER:14,14:\"SCHEDULER\",COMPONENT_UPDATE:15,15:\"COMPONENT_UPDATE\",APP_UNMOUNT_CLEANUP:16,16:\"APP_UNMOUNT_CLEANUP\"},im={sp:\"serverPrefetch hook\",bc:\"beforeCreate hook\",c:\"created hook\",bm:\"beforeMount hook\",m:\"mounted hook\",bu:\"beforeUpdate hook\",u:\"updated\",bum:\"beforeUnmount hook\",um:\"unmounted hook\",a:\"activated hook\",da:\"deactivated hook\",ec:\"errorCaptured hook\",rtc:\"renderTracked hook\",rtg:\"renderTriggered hook\",0:\"setup function\",1:\"render function\",2:\"watcher getter\",3:\"watcher callback\",4:\"watcher cleanup function\",5:\"native event handler\",6:\"component event handler\",7:\"vnode hook\",8:\"directive hook\",9:\"transition hook\",10:\"app errorHandler\",11:\"app warnHandler\",12:\"ref function\",13:\"async component loader\",14:\"scheduler flush\",15:\"component update\",16:\"app unmount cleanup function\"};function Cr(e,t,n,r){try{return r?e(...r):e()}catch(s){tr(s,t,n)}}function Ut(e,t,n,r){if(ie(e)){const s=Cr(e,t,n,r);return s&&El(s)&&s.catch(i=>{tr(i,t,n)}),s}if(z(e)){const s=[];for(let i=0;i<e.length;i++)s.push(Ut(e[i],t,n,r));return s}}function tr(e,t,n,r=!0){const s=t?t.vnode:null,{errorHandler:i,throwUnhandledErrorInProduction:o}=t&&t.appContext.config||de;if(t){let l=t.parent;const a=t.proxy,c=`https://vuejs.org/error-reference/#runtime-${n}`;for(;l;){const u=l.ec;if(u){for(let f=0;f<u.length;f++)if(u[f](e,a,c)===!1)return}l=l.parent}if(i){Pn(),Cr(i,null,10,[e,a,c]),kn();return}}om(e,n,s,r,o)}function om(e,t,n,r=!0,s=!1){if(s)throw e;console.error(e)}const yt=[];let Yt=-1;const hr=[];let bn=null,or=0;const Fu=Promise.resolve();let ii=null;function At(e){const t=ii||Fu;return e?t.then(this?e.bind(this):e):t}function lm(e){let t=Yt+1,n=yt.length;for(;t<n;){const r=t+n>>>1,s=yt[r],i=Xr(s);i<e||i===e&&s.flags&2?t=r+1:n=r}return t}function xl(e){if(!(e.flags&1)){const t=Xr(e),n=yt[yt.length-1];!n||!(e.flags&2)&&t>=Xr(n)?yt.push(e):yt.splice(lm(t),0,e),e.flags|=1,Lu()}}function Lu(){ii||(ii=Fu.then($u))}function Jr(e){z(e)?hr.push(...e):bn&&e.id===-1?bn.splice(or+1,0,e):e.flags&1||(hr.push(e),e.flags|=1),Lu()}function Na(e,t,n=Yt+1){for(;n<yt.length;n++){const r=yt[n];if(r&&r.flags&2){if(e&&r.id!==e.uid)continue;yt.splice(n,1),n--,r.flags&4&&(r.flags&=-2),r(),r.flags&4||(r.flags&=-2)}}}function oi(e){if(hr.length){const t=[...new Set(hr)].sort((n,r)=>Xr(n)-Xr(r));if(hr.length=0,bn){bn.push(...t);return}for(bn=t,or=0;or<bn.length;or++){const n=bn[or];n.flags&4&&(n.flags&=-2),n.flags&8||n(),n.flags&=-2}bn=null,or=0}}const Xr=e=>e.id==null?e.flags&2?-1:1/0:e.id;function $u(e){const t=Ge;try{for(Yt=0;Yt<yt.length;Yt++){const n=yt[Yt];n&&!(n.flags&8)&&(n.flags&4&&(n.flags&=-2),Cr(n,n.i,n.i?15:14),n.flags&4||(n.flags&=-2))}}finally{for(;Yt<yt.length;Yt++){const n=yt[Yt];n&&(n.flags&=-2)}Yt=-1,yt.length=0,oi(),ii=null,(yt.length||hr.length)&&$u()}}let lr,ws=[];function Du(e,t){var n,r;lr=e,lr?(lr.enabled=!0,ws.forEach(({event:s,args:i})=>lr.emit(s,...i)),ws=[]):typeof window<\"u\"&&window.HTMLElement&&!((r=(n=window.navigator)==null?void 0:n.userAgent)!=null&&r.includes(\"jsdom\"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(i=>{Du(i,t)}),setTimeout(()=>{lr||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,ws=[])},3e3)):ws=[]}let Ke=null,Ui=null;function Yr(e){const t=Ke;return Ke=e,Ui=e&&e.type.__scopeId||null,t}function am(e){Ui=e}function cm(){Ui=null}const um=e=>Il;function Il(e,t=Ke,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&Wo(-1);const i=Yr(t);let o;try{o=e(...s)}finally{Yr(i),r._d&&Wo(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function fm(e,t){if(Ke===null)return e;const n=ys(Ke),r=e.dirs||(e.dirs=[]);for(let s=0;s<t.length;s++){let[i,o,l,a=de]=t[s];i&&(ie(i)&&(i={mounted:i,updated:i}),i.deep&&an(o),r.push({dir:i,instance:n,value:o,oldValue:void 0,arg:l,modifiers:a}))}return e}function Qt(e,t,n,r){const s=e.dirs,i=t&&t.dirs;for(let o=0;o<s.length;o++){const l=s[o];i&&(l.oldValue=i[o].value);let a=l.dir[r];a&&(Pn(),Ut(a,n,8,[e.el,l,e,t]),kn())}}const Bu=Symbol(\"_vte\"),ju=e=>e.__isTeleport,Ur=e=>e&&(e.disabled||e.disabled===\"\"),Ra=e=>e&&(e.defer||e.defer===\"\"),xa=e=>typeof SVGElement<\"u\"&&e instanceof SVGElement,Ia=e=>typeof MathMLElement==\"function\"&&e instanceof MathMLElement,Do=(e,t)=>{const n=e&&e.to;return ae(n)?t?t(n):null:n},Uu={name:\"Teleport\",__isTeleport:!0,process(e,t,n,r,s,i,o,l,a,c){const{mc:u,pc:f,pbc:d,o:{insert:h,querySelector:p,createText:g,createComment:_}}=c,w=Ur(t.props);let{shapeFlag:C,children:y,dynamicChildren:b}=t;if(e==null){const A=t.el=g(\"\"),I=t.anchor=g(\"\");h(A,n,r),h(I,n,r);const V=(T,O)=>{C&16&&(s&&s.isCE&&(s.ce._teleportTarget=T),u(y,T,O,s,i,o,l,a))},k=()=>{const T=t.target=Do(t.props,p),O=Hu(T,t,g,h);T&&(o!==\"svg\"&&xa(T)?o=\"svg\":o!==\"mathml\"&&Ia(T)&&(o=\"mathml\"),w||(V(T,O),Hs(t,!1)))};w&&(V(n,I),Hs(t,!0)),Ra(t.props)?Ue(()=>{k(),t.el.__isMounted=!0},i):k()}else{if(Ra(t.props)&&!e.el.__isMounted){Ue(()=>{Uu.process(e,t,n,r,s,i,o,l,a,c),delete e.el.__isMounted},i);return}t.el=e.el,t.targetStart=e.targetStart;const A=t.anchor=e.anchor,I=t.target=e.target,V=t.targetAnchor=e.targetAnchor,k=Ur(e.props),T=k?n:I,O=k?A:V;if(o===\"svg\"||xa(I)?o=\"svg\":(o===\"mathml\"||Ia(I))&&(o=\"mathml\"),b?(d(e.dynamicChildren,b,T,s,i,o,l),jl(e,t,!0)):a||f(e,t,T,O,s,i,o,l,!1),w)k?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):Os(t,n,A,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const M=t.target=Do(t.props,p);M&&Os(t,M,null,c,0)}else k&&Os(t,I,V,c,1);Hs(t,w)}},remove(e,t,n,{um:r,o:{remove:s}},i){const{shapeFlag:o,children:l,anchor:a,targetStart:c,targetAnchor:u,target:f,props:d}=e;if(f&&(s(c),s(u)),i&&s(a),o&16){const h=i||!Ur(d);for(let p=0;p<l.length;p++){const g=l[p];r(g,t,n,h,!!g.dynamicChildren)}}},move:Os,hydrate:dm};function Os(e,t,n,{o:{insert:r},m:s},i=2){i===0&&r(e.targetAnchor,t,n);const{el:o,anchor:l,shapeFlag:a,children:c,props:u}=e,f=i===2;if(f&&r(o,t,n),(!f||Ur(u))&&a&16)for(let d=0;d<c.length;d++)s(c[d],t,n,2);f&&r(l,t,n)}function dm(e,t,n,r,s,i,{o:{nextSibling:o,parentNode:l,querySelector:a,insert:c,createText:u}},f){const d=t.target=Do(t.props,a);if(d){const h=Ur(t.props),p=d._lpa||d.firstChild;if(t.shapeFlag&16)if(h)t.anchor=f(o(e),t,l(e),n,r,s,i),t.targetStart=p,t.targetAnchor=p&&o(p);else{t.anchor=o(e);let g=p;for(;g;){if(g&&g.nodeType===8){if(g.data===\"teleport start anchor\")t.targetStart=g;else if(g.data===\"teleport anchor\"){t.targetAnchor=g,d._lpa=t.targetAnchor&&o(t.targetAnchor);break}}g=o(g)}t.targetAnchor||Hu(d,t,u,c),f(p&&o(p),t,d,n,r,s,i)}Hs(t,h)}return t.anchor&&o(t.anchor)}const hm=Uu;function Hs(e,t){const n=e.ctx;if(n&&n.ut){let r,s;for(t?(r=e.el,s=e.anchor):(r=e.targetStart,s=e.targetAnchor);r&&r!==s;)r.nodeType===1&&r.setAttribute(\"data-v-owner\",n.uid),r=r.nextSibling;n.ut()}}function Hu(e,t,n,r){const s=t.targetStart=n(\"\"),i=t.targetAnchor=n(\"\");return s[Bu]=i,e&&(r(s,e),r(i,e)),i}const vn=Symbol(\"_leaveCb\"),Ns=Symbol(\"_enterCb\");function Pl(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return nr(()=>{e.isMounted=!0}),ms(()=>{e.isUnmounting=!0}),e}const $t=[Function,Array],kl={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:$t,onEnter:$t,onAfterEnter:$t,onEnterCancelled:$t,onBeforeLeave:$t,onLeave:$t,onAfterLeave:$t,onLeaveCancelled:$t,onBeforeAppear:$t,onAppear:$t,onAfterAppear:$t,onAppearCancelled:$t},qu=e=>{const t=e.subTree;return t.component?qu(t.component):t},pm={name:\"BaseTransition\",props:kl,setup(e,{slots:t}){const n=dt(),r=Pl();return()=>{const s=t.default&&Hi(t.default(),!0);if(!s||!s.length)return;const i=Ku(s),o=me(e),{mode:l}=o;if(r.isLeaving)return _o(i);const a=Pa(i);if(!a)return _o(i);let c=mr(a,o,r,n,f=>c=f);a.type!==Be&&fn(a,c);let u=n.subTree&&Pa(n.subTree);if(u&&u.type!==Be&&!qt(a,u)&&qu(n).type!==Be){let f=mr(u,o,r,n);if(fn(u,f),l===\"out-in\"&&a.type!==Be)return r.isLeaving=!0,f.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete f.afterLeave,u=void 0},_o(i);l===\"in-out\"&&a.type!==Be?f.delayLeave=(d,h,p)=>{const g=Zu(r,u);g[String(u.key)]=u,d[vn]=()=>{h(),d[vn]=void 0,delete c.delayedLeave,u=void 0},c.delayedLeave=()=>{p(),delete c.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return i}}};function Ku(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==Be){t=n;break}}return t}const Wu=pm;function Zu(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function mr(e,t,n,r,s){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:a,onEnter:c,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:d,onLeave:h,onAfterLeave:p,onLeaveCancelled:g,onBeforeAppear:_,onAppear:w,onAfterAppear:C,onAppearCancelled:y}=t,b=String(e.key),A=Zu(n,e),I=(T,O)=>{T&&Ut(T,r,9,O)},V=(T,O)=>{const M=O[1];I(T,O),z(T)?T.every(N=>N.length<=1)&&M():T.length<=1&&M()},k={mode:o,persisted:l,beforeEnter(T){let O=a;if(!n.isMounted)if(i)O=_||a;else return;T[vn]&&T[vn](!0);const M=A[b];M&&qt(e,M)&&M.el[vn]&&M.el[vn](),I(O,[T])},enter(T){let O=c,M=u,N=f;if(!n.isMounted)if(i)O=w||c,M=C||u,N=y||f;else return;let B=!1;const G=T[Ns]=Y=>{B||(B=!0,Y?I(N,[T]):I(M,[T]),k.delayedLeave&&k.delayedLeave(),T[Ns]=void 0)};O?V(O,[T,G]):G()},leave(T,O){const M=String(e.key);if(T[Ns]&&T[Ns](!0),n.isUnmounting)return O();I(d,[T]);let N=!1;const B=T[vn]=G=>{N||(N=!0,O(),G?I(g,[T]):I(p,[T]),T[vn]=void 0,A[M]===e&&delete A[M])};A[M]=e,h?V(h,[T,B]):B()},clone(T){const O=mr(T,t,n,r,s);return s&&s(O),O}};return k}function _o(e){if(ps(e))return e=en(e),e.children=null,e}function Pa(e){if(!ps(e))return ju(e.type)&&e.children?Ku(e.children):e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&ie(n.default))return n.default()}}function fn(e,t){e.shapeFlag&6&&e.component?(e.transition=t,fn(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Hi(e,t=!1,n){let r=[],s=0;for(let i=0;i<e.length;i++){let o=e[i];const l=n==null?o.key:String(n)+String(o.key!=null?o.key:i);o.type===Ze?(o.patchFlag&128&&s++,r=r.concat(Hi(o.children,t,l))):(t||o.type!==Be)&&r.push(l!=null?en(o,{key:l}):o)}if(s>1)for(let i=0;i<r.length;i++)r[i].patchFlag=-2;return r}/*! #__NO_SIDE_EFFECTS__ */function wr(e,t){return ie(e)?(()=>he({name:e.name},t,{setup:e}))():e}function mm(){const e=dt();return e?(e.appContext.config.idPrefix||\"v\")+\"-\"+e.ids[0]+e.ids[1]++:\"\"}function Vl(e){e.ids=[e.ids[0]+e.ids[2]+++\"-\",0,0]}function gm(e){const t=dt(),n=Nl(null);if(t){const s=t.refs===de?t.refs={}:t.refs;Object.defineProperty(s,e,{enumerable:!0,get:()=>n.value,set:i=>n.value=i})}return n}function Qr(e,t,n,r,s=!1){if(z(e)){e.forEach((p,g)=>Qr(p,t&&(z(t)?t[g]:t),n,r,s));return}if(Cn(r)&&!s){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&Qr(e,t,n,r.component.subTree);return}const i=r.shapeFlag&4?ys(r.component):r.el,o=s?null:i,{i:l,r:a}=e,c=t&&t.r,u=l.refs===de?l.refs={}:l.refs,f=l.setupState,d=me(f),h=f===de?()=>!1:p=>be(d,p);if(c!=null&&c!==a&&(ae(c)?(u[c]=null,h(c)&&(f[c]=null)):Ve(c)&&(c.value=null)),ie(a))Cr(a,l,12,[o,u]);else{const p=ae(a),g=Ve(a);if(p||g){const _=()=>{if(e.f){const w=p?h(a)?f[a]:u[a]:a.value;s?z(w)&&Sl(w,i):z(w)?w.includes(i)||w.push(i):p?(u[a]=[i],h(a)&&(f[a]=u[a])):(a.value=[i],e.k&&(u[e.k]=a.value))}else p?(u[a]=o,h(a)&&(f[a]=o)):g&&(a.value=o,e.k&&(u[e.k]=o))};o?(_.id=-1,Ue(_,n)):_()}}}let ka=!1;const sr=()=>{ka||(console.error(\"Hydration completed but contains mismatches.\"),ka=!0)},ym=e=>e.namespaceURI.includes(\"svg\")&&e.tagName!==\"foreignObject\",bm=e=>e.namespaceURI.includes(\"MathML\"),Rs=e=>{if(e.nodeType===1){if(ym(e))return\"svg\";if(bm(e))return\"mathml\"}},ar=e=>e.nodeType===8;function vm(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:i,parentNode:o,remove:l,insert:a,createComment:c}}=e,u=(y,b)=>{if(!b.hasChildNodes()){n(null,y,b),oi(),b._vnode=y;return}f(b.firstChild,y,null,null,null),oi(),b._vnode=y},f=(y,b,A,I,V,k=!1)=>{k=k||!!b.dynamicChildren;const T=ar(y)&&y.data===\"[\",O=()=>g(y,b,A,I,V,T),{type:M,ref:N,shapeFlag:B,patchFlag:G}=b;let Y=y.nodeType;b.el=y,G===-2&&(k=!1,b.dynamicChildren=null);let j=null;switch(M){case wn:Y!==3?b.children===\"\"?(a(b.el=s(\"\"),o(y),y),j=y):j=O():(y.data!==b.children&&(sr(),y.data=b.children),j=i(y));break;case Be:C(y)?(j=i(y),w(b.el=y.content.firstChild,y,A)):Y!==8||T?j=O():j=i(y);break;case qn:if(T&&(y=i(y),Y=y.nodeType),Y===1||Y===3){j=y;const U=!b.children.length;for(let J=0;J<b.staticCount;J++)U&&(b.children+=j.nodeType===1?j.outerHTML:j.data),J===b.staticCount-1&&(b.anchor=j),j=i(j);return T?i(j):j}else O();break;case Ze:T?j=p(y,b,A,I,V,k):j=O();break;default:if(B&1)(Y!==1||b.type.toLowerCase()!==y.tagName.toLowerCase())&&!C(y)?j=O():j=d(y,b,A,I,V,k);else if(B&6){b.slotScopeIds=V;const U=o(y);if(T?j=_(y):ar(y)&&y.data===\"teleport start\"?j=_(y,y.data,\"teleport end\"):j=i(y),t(b,U,null,A,I,Rs(U),k),Cn(b)&&!b.type.__asyncResolved){let J;T?(J=xe(Ze),J.anchor=j?j.previousSibling:U.lastChild):J=y.nodeType===3?Hl(\"\"):xe(\"div\"),J.el=y,b.component.subTree=J}}else B&64?Y!==8?j=O():j=b.type.hydrate(y,b,A,I,V,k,e,h):B&128&&(j=b.type.hydrate(y,b,A,I,Rs(o(y)),V,k,e,f))}return N!=null&&Qr(N,null,I,b),j},d=(y,b,A,I,V,k)=>{k=k||!!b.dynamicChildren;const{type:T,props:O,patchFlag:M,shapeFlag:N,dirs:B,transition:G}=b,Y=T===\"input\"||T===\"option\";if(Y||M!==-1){B&&Qt(b,null,A,\"created\");let j=!1;if(C(y)){j=vf(null,G)&&A&&A.vnode.props&&A.vnode.props.appear;const J=y.content.firstChild;j&&G.beforeEnter(J),w(J,y,A),b.el=y=J}if(N&16&&!(O&&(O.innerHTML||O.textContent))){let J=h(y.firstChild,b,y,A,I,V,k);for(;J;){xs(y,1)||sr();const Se=J;J=J.nextSibling,l(Se)}}else if(N&8){let J=b.children;J[0]===`\n`&&(y.tagName===\"PRE\"||y.tagName===\"TEXTAREA\")&&(J=J.slice(1)),y.textContent!==J&&(xs(y,0)||sr(),y.textContent=b.children)}if(O){if(Y||!k||M&48){const J=y.tagName.includes(\"-\");for(const Se in O)(Y&&(Se.endsWith(\"value\")||Se===\"indeterminate\")||Yn(Se)&&!An(Se)||Se[0]===\".\"||J)&&r(y,Se,null,O[Se],void 0,A)}else if(O.onClick)r(y,\"onClick\",null,O.onClick,void 0,A);else if(M&4&&Tn(O.style))for(const J in O.style)O.style[J]}let U;(U=O&&O.onVnodeBeforeMount)&&Et(U,A,b),B&&Qt(b,null,A,\"beforeMount\"),((U=O&&O.onVnodeMounted)||B||j)&&Rf(()=>{U&&Et(U,A,b),j&&G.enter(y),B&&Qt(b,null,A,\"mounted\")},I)}return y.nextSibling},h=(y,b,A,I,V,k,T)=>{T=T||!!b.dynamicChildren;const O=b.children,M=O.length;for(let N=0;N<M;N++){const B=T?O[N]:O[N]=Tt(O[N]),G=B.type===wn;y?(G&&!T&&N+1<M&&Tt(O[N+1]).type===wn&&(a(s(y.data.slice(B.children.length)),A,i(y)),y.data=B.children),y=f(y,B,I,V,k,T)):G&&!B.children?a(B.el=s(\"\"),A):(xs(A,1)||sr(),n(null,B,A,null,I,V,Rs(A),k))}return y},p=(y,b,A,I,V,k)=>{const{slotScopeIds:T}=b;T&&(V=V?V.concat(T):T);const O=o(y),M=h(i(y),b,O,A,I,V,k);return M&&ar(M)&&M.data===\"]\"?i(b.anchor=M):(sr(),a(b.anchor=c(\"]\"),O,M),M)},g=(y,b,A,I,V,k)=>{if(xs(y.parentElement,1)||sr(),b.el=null,k){const M=_(y);for(;;){const N=i(y);if(N&&N!==M)l(N);else break}}const T=i(y),O=o(y);return l(y),n(null,b,O,T,A,I,Rs(O),V),A&&(A.vnode.el=b.el,Gi(A,b.el)),T},_=(y,b=\"[\",A=\"]\")=>{let I=0;for(;y;)if(y=i(y),y&&ar(y)&&(y.data===b&&I++,y.data===A)){if(I===0)return i(y);I--}return y},w=(y,b,A)=>{const I=b.parentNode;I&&I.replaceChild(y,b);let V=A;for(;V;)V.vnode.el===b&&(V.vnode.el=V.subTree.el=y),V=V.parent},C=y=>y.nodeType===1&&y.tagName===\"TEMPLATE\";return[u,f]}const Va=\"data-allow-mismatch\",_m={0:\"text\",1:\"children\",2:\"class\",3:\"style\",4:\"attribute\"};function xs(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(Va);)e=e.parentElement;const n=e&&e.getAttribute(Va);if(n==null)return!1;if(n===\"\")return!0;{const r=n.split(\",\");return t===0&&r.includes(\"children\")?!0:n.split(\",\").includes(_m[t])}}const Sm=Vi().requestIdleCallback||(e=>setTimeout(e,1)),Em=Vi().cancelIdleCallback||(e=>clearTimeout(e)),Am=(e=1e4)=>t=>{const n=Sm(t,{timeout:e});return()=>Em(n)};function Tm(e){const{top:t,left:n,bottom:r,right:s}=e.getBoundingClientRect(),{innerHeight:i,innerWidth:o}=window;return(t>0&&t<i||r>0&&r<i)&&(n>0&&n<o||s>0&&s<o)}const Cm=e=>(t,n)=>{const r=new IntersectionObserver(s=>{for(const i of s)if(i.isIntersecting){r.disconnect(),t();break}},e);return n(s=>{if(s instanceof Element){if(Tm(s))return t(),r.disconnect(),!1;r.observe(s)}}),()=>r.disconnect()},wm=e=>t=>{if(e){const n=matchMedia(e);if(n.matches)t();else return n.addEventListener(\"change\",t,{once:!0}),()=>n.removeEventListener(\"change\",t)}},Om=(e=[])=>(t,n)=>{ae(e)&&(e=[e]);let r=!1;const s=o=>{r||(r=!0,i(),t(),o.target.dispatchEvent(new o.constructor(o.type,o)))},i=()=>{n(o=>{for(const l of e)o.removeEventListener(l,s)})};return n(o=>{for(const l of e)o.addEventListener(l,s,{once:!0})}),i};function Nm(e,t){if(ar(e)&&e.data===\"[\"){let n=1,r=e.nextSibling;for(;r;){if(r.nodeType===1){if(t(r)===!1)break}else if(ar(r))if(r.data===\"]\"){if(--n===0)break}else r.data===\"[\"&&n++;r=r.nextSibling}}else t(e)}const Cn=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function Rm(e){ie(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,hydrate:i,timeout:o,suspensible:l=!0,onError:a}=e;let c=null,u,f=0;const d=()=>(f++,c=null,h()),h=()=>{let p;return c||(p=c=t().catch(g=>{if(g=g instanceof Error?g:new Error(String(g)),a)return new Promise((_,w)=>{a(g,()=>_(d()),()=>w(g),f+1)});throw g}).then(g=>p!==c&&c?c:(g&&(g.__esModule||g[Symbol.toStringTag]===\"Module\")&&(g=g.default),u=g,g)))};return wr({name:\"AsyncComponentWrapper\",__asyncLoader:h,__asyncHydrate(p,g,_){const w=i?()=>{const C=i(_,y=>Nm(p,y));C&&(g.bum||(g.bum=[])).push(C)}:_;u?w():h().then(()=>!g.isUnmounted&&w())},get __asyncResolved(){return u},setup(){const p=qe;if(Vl(p),u)return()=>So(u,p);const g=y=>{c=null,tr(y,p,13,!r)};if(l&&p.suspense||gr)return h().then(y=>()=>So(y,p)).catch(y=>(g(y),()=>r?xe(r,{error:y}):null));const _=at(!1),w=at(),C=at(!!s);return s&&setTimeout(()=>{C.value=!1},s),o!=null&&setTimeout(()=>{if(!_.value&&!w.value){const y=new Error(`Async component timed out after ${o}ms.`);g(y),w.value=y}},o),h().then(()=>{_.value=!0,p.parent&&ps(p.parent.vnode)&&p.parent.update()}).catch(y=>{g(y),w.value=y}),()=>{if(_.value&&u)return So(u,p);if(w.value&&r)return xe(r,{error:w.value});if(n&&!C.value)return xe(n)}}})}function So(e,t){const{ref:n,props:r,children:s,ce:i}=t.vnode,o=xe(e,r,s);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const ps=e=>e.type.__isKeepAlive,xm={name:\"KeepAlive\",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=dt(),r=n.ctx;if(!r.renderer)return()=>{const C=t.default&&t.default();return C&&C.length===1?C[0]:C};const s=new Map,i=new Set;let o=null;const l=n.suspense,{renderer:{p:a,m:c,um:u,o:{createElement:f}}}=r,d=f(\"div\");r.activate=(C,y,b,A,I)=>{const V=C.component;c(C,y,b,0,l),a(V.vnode,C,y,b,V,l,A,C.slotScopeIds,I),Ue(()=>{V.isDeactivated=!1,V.a&&dr(V.a);const k=C.props&&C.props.onVnodeMounted;k&&Et(k,V.parent,C)},l)},r.deactivate=C=>{const y=C.component;ai(y.m),ai(y.a),c(C,d,null,1,l),Ue(()=>{y.da&&dr(y.da);const b=C.props&&C.props.onVnodeUnmounted;b&&Et(b,y.parent,C),y.isDeactivated=!0},l)};function h(C){Eo(C),u(C,n,l,!0)}function p(C){s.forEach((y,b)=>{const A=Xo(y.type);A&&!C(A)&&g(b)})}function g(C){const y=s.get(C);y&&(!o||!qt(y,o))?h(y):o&&Eo(o),s.delete(C),i.delete(C)}kt(()=>[e.include,e.exclude],([C,y])=>{C&&p(b=>Lr(C,b)),y&&p(b=>!Lr(y,b))},{flush:\"post\",deep:!0});let _=null;const w=()=>{_!=null&&(ci(n.subTree.type)?Ue(()=>{s.set(_,Is(n.subTree))},n.subTree.suspense):s.set(_,Is(n.subTree)))};return nr(w),Ki(w),ms(()=>{s.forEach(C=>{const{subTree:y,suspense:b}=n,A=Is(y);if(C.type===A.type&&C.key===A.key){Eo(A);const I=A.component.da;I&&Ue(I,b);return}h(C)})}),()=>{if(_=null,!t.default)return o=null;const C=t.default(),y=C[0];if(C.length>1)return o=null,C;if(!dn(y)||!(y.shapeFlag&4)&&!(y.shapeFlag&128))return o=null,y;let b=Is(y);if(b.type===Be)return o=null,b;const A=b.type,I=Xo(Cn(b)?b.type.__asyncResolved||{}:A),{include:V,exclude:k,max:T}=e;if(V&&(!I||!Lr(V,I))||k&&I&&Lr(k,I))return b.shapeFlag&=-257,o=b,y;const O=b.key==null?A:b.key,M=s.get(O);return b.el&&(b=en(b),y.shapeFlag&128&&(y.ssContent=b)),_=O,M?(b.el=M.el,b.component=M.component,b.transition&&fn(b,b.transition),b.shapeFlag|=512,i.delete(O),i.add(O)):(i.add(O),T&&i.size>parseInt(T,10)&&g(i.values().next().value)),b.shapeFlag|=256,o=b,ci(y.type)?y:b}}},Im=xm;function Lr(e,t){return z(e)?e.some(n=>Lr(n,t)):ae(e)?e.split(\",\").includes(t):Gh(e)?(e.lastIndex=0,e.test(t)):!1}function zu(e,t){Ju(e,\"a\",t)}function Gu(e,t){Ju(e,\"da\",t)}function Ju(e,t,n=qe){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(qi(t,r,n),n){let s=n.parent;for(;s&&s.parent;)ps(s.parent.vnode)&&Pm(r,t,n,s),s=s.parent}}function Pm(e,t,n,r){const s=qi(t,e,r,!0);Wi(()=>{Sl(r[t],s)},n)}function Eo(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function Is(e){return e.shapeFlag&128?e.ssContent:e}function qi(e,t,n=qe,r=!1){if(n){const s=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{Pn();const l=zn(n),a=Ut(t,n,e,o);return l(),kn(),a});return r?s.unshift(i):s.push(i),i}}const hn=e=>(t,n=qe)=>{(!gr||e===\"sp\")&&qi(e,(...r)=>t(...r),n)},Xu=hn(\"bm\"),nr=hn(\"m\"),Ml=hn(\"bu\"),Ki=hn(\"u\"),ms=hn(\"bum\"),Wi=hn(\"um\"),Yu=hn(\"sp\"),Qu=hn(\"rtg\"),ef=hn(\"rtc\");function tf(e,t=qe){qi(\"ec\",e,t)}const Fl=\"components\",km=\"directives\";function Vm(e,t){return Ll(Fl,e,!0,t)||e}const nf=Symbol.for(\"v-ndc\");function Zi(e){return ae(e)?Ll(Fl,e,!1)||e:e||nf}function Mm(e){return Ll(km,e)}function Ll(e,t,n=!0,r=!1){const s=Ke||qe;if(s){const i=s.type;if(e===Fl){const l=Xo(i,!1);if(l&&(l===t||l===Ie(t)||l===er(Ie(t))))return i}const o=Ma(s[e]||i[e],t)||Ma(s.appContext[e],t);return!o&&r?i:o}}function Ma(e,t){return e&&(e[t]||e[Ie(t)]||e[er(Ie(t))])}function Fm(e,t,n,r){let s;const i=n&&n[r],o=z(e);if(o||ae(e)){const l=o&&Tn(e);let a=!1;l&&(a=!Pt(e),e=Li(e)),s=new Array(e.length);for(let c=0,u=e.length;c<u;c++)s[c]=t(a?lt(e[c]):e[c],c,void 0,i&&i[c])}else if(typeof e==\"number\"){s=new Array(e);for(let l=0;l<e;l++)s[l]=t(l+1,l,void 0,i&&i[l])}else if(Ce(e))if(e[Symbol.iterator])s=Array.from(e,(l,a)=>t(l,a,void 0,i&&i[a]));else{const l=Object.keys(e);s=new Array(l.length);for(let a=0,c=l.length;a<c;a++){const u=l[a];s[a]=t(e[u],u,a,i&&i[a])}}else s=[];return n&&(n[r]=s),s}function Lm(e,t){for(let n=0;n<t.length;n++){const r=t[n];if(z(r))for(let s=0;s<r.length;s++)e[r[s].name]=r[s].fn;else r&&(e[r.name]=r.key?(...s)=>{const i=r.fn(...s);return i&&(i.key=r.key),i}:r.fn)}return e}function $m(e,t,n={},r,s){if(Ke.ce||Ke.parent&&Cn(Ke.parent)&&Ke.parent.ce)return t!==\"default\"&&(n.name=t),rs(),ui(Ze,null,[xe(\"slot\",n,r&&r())],64);let i=e[t];i&&i._c&&(i._d=!1),rs();const o=i&&$l(i(n)),l=n.key||o&&o.key,a=ui(Ze,{key:(l&&!Nt(l)?l:`_${t}`)+(!o&&r?\"_fb\":\"\")},o||(r?r():[]),o&&e._===1?64:-2);return!s&&a.scopeId&&(a.slotScopeIds=[a.scopeId+\"-s\"]),i&&i._c&&(i._d=!0),a}function $l(e){return e.some(t=>dn(t)?!(t.type===Be||t.type===Ze&&!$l(t.children)):!0)?e:null}function Dm(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:fr(r)]=e[r];return n}const Bo=e=>e?Ff(e)?ys(e):Bo(e.parent):null,Hr=he(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Bo(e.parent),$root:e=>Bo(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Dl(e),$forceUpdate:e=>e.f||(e.f=()=>{xl(e.update)}),$nextTick:e=>e.n||(e.n=At.bind(e.proxy)),$watch:e=>gg.bind(e)}),Ao=(e,t)=>e!==de&&!e.__isScriptSetup&&be(e,t),jo={get({_:e},t){if(t===\"__v_skip\")return!0;const{ctx:n,setupState:r,data:s,props:i,accessCache:o,type:l,appContext:a}=e;let c;if(t[0]!==\"$\"){const h=o[t];if(h!==void 0)switch(h){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return i[t]}else{if(Ao(r,t))return o[t]=1,r[t];if(s!==de&&be(s,t))return o[t]=2,s[t];if((c=e.propsOptions[0])&&be(c,t))return o[t]=3,i[t];if(n!==de&&be(n,t))return o[t]=4,n[t];Uo&&(o[t]=0)}}const u=Hr[t];let f,d;if(u)return t===\"$attrs\"&&ot(e.attrs,\"get\",\"\"),u(e);if((f=l.__cssModules)&&(f=f[t]))return f;if(n!==de&&be(n,t))return o[t]=4,n[t];if(d=a.config.globalProperties,be(d,t))return d[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:i}=e;return Ao(s,t)?(s[t]=n,!0):r!==de&&be(r,t)?(r[t]=n,!0):be(e.props,t)||t[0]===\"$\"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:i}},o){let l;return!!n[o]||e!==de&&be(e,o)||Ao(t,o)||(l=i[0])&&be(l,o)||be(r,o)||be(Hr,o)||be(s.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:be(n,\"value\")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},Bm=he({},jo,{get(e,t){if(t!==Symbol.unscopables)return jo.get(e,t,e)},has(e,t){return t[0]!==\"_\"&&!np(t)}});function jm(){return null}function Um(){return null}function Hm(e){}function qm(e){}function Km(){return null}function Wm(){}function Zm(e,t){return null}function zm(){return rf().slots}function Gm(){return rf().attrs}function rf(){const e=dt();return e.setupContext||(e.setupContext=Bf(e))}function es(e){return z(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function Jm(e,t){const n=es(e);for(const r in t){if(r.startsWith(\"__skip\"))continue;let s=n[r];s?z(s)||ie(s)?s=n[r]={type:s,default:t[r]}:s.default=t[r]:s===null&&(s=n[r]={default:t[r]}),s&&t[`__skip_${r}`]&&(s.skipFactory=!0)}return n}function Xm(e,t){return!e||!t?e||t:z(e)&&z(t)?e.concat(t):he({},es(e),es(t))}function Ym(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function Qm(e){const t=dt();let n=e();return zo(),El(n)&&(n=n.catch(r=>{throw zn(t),r})),[n,()=>zn(t)]}let Uo=!0;function eg(e){const t=Dl(e),n=e.proxy,r=e.ctx;Uo=!1,t.beforeCreate&&Fa(t.beforeCreate,e,\"bc\");const{data:s,computed:i,methods:o,watch:l,provide:a,inject:c,created:u,beforeMount:f,mounted:d,beforeUpdate:h,updated:p,activated:g,deactivated:_,beforeDestroy:w,beforeUnmount:C,destroyed:y,unmounted:b,render:A,renderTracked:I,renderTriggered:V,errorCaptured:k,serverPrefetch:T,expose:O,inheritAttrs:M,components:N,directives:B,filters:G}=t;if(c&&tg(c,r,null),o)for(const U in o){const J=o[U];ie(J)&&(r[U]=J.bind(n))}if(s){const U=s.call(n,n);Ce(U)&&(e.data=Rn(U))}if(Uo=!0,i)for(const U in i){const J=i[U],Se=ie(J)?J.bind(n,n):ie(J.get)?J.get.bind(n,n):Ge,We=!ie(J)&&ie(J.set)?J.set.bind(n):Ge,Je=ge({get:Se,set:We});Object.defineProperty(r,U,{enumerable:!0,configurable:!0,get:()=>Je.value,set:ht=>Je.value=ht})}if(l)for(const U in l)sf(l[U],r,n,U);if(a){const U=ie(a)?a.call(n):a;Reflect.ownKeys(U).forEach(J=>{ts(J,U[J])})}u&&Fa(u,e,\"c\");function j(U,J){z(J)?J.forEach(Se=>U(Se.bind(n))):J&&U(J.bind(n))}if(j(Xu,f),j(nr,d),j(Ml,h),j(Ki,p),j(zu,g),j(Gu,_),j(tf,k),j(ef,I),j(Qu,V),j(ms,C),j(Wi,b),j(Yu,T),z(O))if(O.length){const U=e.exposed||(e.exposed={});O.forEach(J=>{Object.defineProperty(U,J,{get:()=>n[J],set:Se=>n[J]=Se})})}else e.exposed||(e.exposed={});A&&e.render===Ge&&(e.render=A),M!=null&&(e.inheritAttrs=M),N&&(e.components=N),B&&(e.directives=B),T&&Vl(e)}function tg(e,t,n=Ge){z(e)&&(e=Ho(e));for(const r in e){const s=e[r];let i;Ce(s)?\"default\"in s?i=Hn(s.from||r,s.default,!0):i=Hn(s.from||r):i=Hn(s),Ve(i)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[r]=i}}function Fa(e,t,n){Ut(z(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function sf(e,t,n,r){let s=r.includes(\".\")?Cf(n,r):()=>n[r];if(ae(e)){const i=t[e];ie(i)&&kt(s,i)}else if(ie(e))kt(s,e.bind(n));else if(Ce(e))if(z(e))e.forEach(i=>sf(i,t,n,r));else{const i=ie(e.handler)?e.handler.bind(n):t[e.handler];ie(i)&&kt(s,i,e)}}function Dl(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let a;return l?a=l:!s.length&&!n&&!r?a=t:(a={},s.length&&s.forEach(c=>li(a,c,o,!0)),li(a,t,o)),Ce(t)&&i.set(t,a),a}function li(e,t,n,r=!1){const{mixins:s,extends:i}=t;i&&li(e,i,n,!0),s&&s.forEach(o=>li(e,o,n,!0));for(const o in t)if(!(r&&o===\"expose\")){const l=ng[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const ng={data:La,props:$a,emits:$a,methods:$r,computed:$r,beforeCreate:pt,created:pt,beforeMount:pt,mounted:pt,beforeUpdate:pt,updated:pt,beforeDestroy:pt,beforeUnmount:pt,destroyed:pt,unmounted:pt,activated:pt,deactivated:pt,errorCaptured:pt,serverPrefetch:pt,components:$r,directives:$r,watch:sg,provide:La,inject:rg};function La(e,t){return t?e?function(){return he(ie(e)?e.call(this,this):e,ie(t)?t.call(this,this):t)}:t:e}function rg(e,t){return $r(Ho(e),Ho(t))}function Ho(e){if(z(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function pt(e,t){return e?[...new Set([].concat(e,t))]:t}function $r(e,t){return e?he(Object.create(null),e,t):t}function $a(e,t){return e?z(e)&&z(t)?[...new Set([...e,...t])]:he(Object.create(null),es(e),es(t??{})):t}function sg(e,t){if(!e)return t;if(!t)return e;const n=he(Object.create(null),e);for(const r in t)n[r]=pt(e[r],t[r]);return n}function of(){return{app:null,config:{isNativeTag:Fr,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let ig=0;function og(e,t){return function(r,s=null){ie(r)||(r=he({},r)),s!=null&&!Ce(s)&&(s=null);const i=of(),o=new WeakSet,l=[];let a=!1;const c=i.app={_uid:ig++,_component:r,_props:s,_container:null,_context:i,_instance:null,version:Uf,get config(){return i.config},set config(u){},use(u,...f){return o.has(u)||(u&&ie(u.install)?(o.add(u),u.install(c,...f)):ie(u)&&(o.add(u),u(c,...f))),c},mixin(u){return i.mixins.includes(u)||i.mixins.push(u),c},component(u,f){return f?(i.components[u]=f,c):i.components[u]},directive(u,f){return f?(i.directives[u]=f,c):i.directives[u]},mount(u,f,d){if(!a){const h=c._ceVNode||xe(r,s);return h.appContext=i,d===!0?d=\"svg\":d===!1&&(d=void 0),f&&t?t(h,u):e(h,u,d),a=!0,c._container=u,u.__vue_app__=c,ys(h.component)}},onUnmount(u){l.push(u)},unmount(){a&&(Ut(l,c._instance,16),e(null,c._container),delete c._container.__vue_app__)},provide(u,f){return i.provides[u]=f,c},runWithContext(u){const f=Un;Un=c;try{return u()}finally{Un=f}}};return c}}let Un=null;function ts(e,t){if(qe){let n=qe.provides;const r=qe.parent&&qe.parent.provides;r===n&&(n=qe.provides=Object.create(r)),n[e]=t}}function Hn(e,t,n=!1){const r=qe||Ke;if(r||Un){const s=Un?Un._context.provides:r?r.parent==null?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides:void 0;if(s&&e in s)return s[e];if(arguments.length>1)return n&&ie(t)?t.call(r&&r.proxy):t}}function lg(){return!!(qe||Ke||Un)}const lf={},af=()=>Object.create(lf),cf=e=>Object.getPrototypeOf(e)===lf;function ag(e,t,n,r=!1){const s={},i=af();e.propsDefaults=Object.create(null),uf(e,t,s,i);for(const o in e.propsOptions[0])o in s||(s[o]=void 0);n?e.props=r?s:Ru(s):e.type.props?e.props=s:e.props=i,e.attrs=i}function cg(e,t,n,r){const{props:s,attrs:i,vnode:{patchFlag:o}}=e,l=me(s),[a]=e.propsOptions;let c=!1;if((r||o>0)&&!(o&16)){if(o&8){const u=e.vnode.dynamicProps;for(let f=0;f<u.length;f++){let d=u[f];if(zi(e.emitsOptions,d))continue;const h=t[d];if(a)if(be(i,d))h!==i[d]&&(i[d]=h,c=!0);else{const p=Ie(d);s[p]=qo(a,l,p,h,e,!1)}else h!==i[d]&&(i[d]=h,c=!0)}}}else{uf(e,t,s,i)&&(c=!0);let u;for(const f in l)(!t||!be(t,f)&&((u=Ct(f))===f||!be(t,u)))&&(a?n&&(n[f]!==void 0||n[u]!==void 0)&&(s[f]=qo(a,l,f,void 0,e,!0)):delete s[f]);if(i!==l)for(const f in i)(!t||!be(t,f))&&(delete i[f],c=!0)}c&&ln(e.attrs,\"set\",\"\")}function uf(e,t,n,r){const[s,i]=e.propsOptions;let o=!1,l;if(t)for(let a in t){if(An(a))continue;const c=t[a];let u;s&&be(s,u=Ie(a))?!i||!i.includes(u)?n[u]=c:(l||(l={}))[u]=c:zi(e.emitsOptions,a)||(!(a in r)||c!==r[a])&&(r[a]=c,o=!0)}if(i){const a=me(n),c=l||de;for(let u=0;u<i.length;u++){const f=i[u];n[f]=qo(s,a,f,c[f],e,!be(c,f))}}return o}function qo(e,t,n,r,s,i){const o=e[n];if(o!=null){const l=be(o,\"default\");if(l&&r===void 0){const a=o.default;if(o.type!==Function&&!o.skipFactory&&ie(a)){const{propsDefaults:c}=s;if(n in c)r=c[n];else{const u=zn(s);r=c[n]=a.call(null,t),u()}}else r=a;s.ce&&s.ce._setProp(n,r)}o[0]&&(i&&!l?r=!1:o[1]&&(r===\"\"||r===Ct(n))&&(r=!0))}return r}const ug=new WeakMap;function ff(e,t,n=!1){const r=n?ug:t.propsCache,s=r.get(e);if(s)return s;const i=e.props,o={},l=[];let a=!1;if(!ie(e)){const u=f=>{a=!0;const[d,h]=ff(f,t,!0);he(o,d),h&&l.push(...h)};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!i&&!a)return Ce(e)&&r.set(e,cr),cr;if(z(i))for(let u=0;u<i.length;u++){const f=Ie(i[u]);Da(f)&&(o[f]=de)}else if(i)for(const u in i){const f=Ie(u);if(Da(f)){const d=i[u],h=o[f]=z(d)||ie(d)?{type:d}:he({},d),p=h.type;let g=!1,_=!0;if(z(p))for(let w=0;w<p.length;++w){const C=p[w],y=ie(C)&&C.name;if(y===\"Boolean\"){g=!0;break}else y===\"String\"&&(_=!1)}else g=ie(p)&&p.name===\"Boolean\";h[0]=g,h[1]=_,(g||be(h,\"default\"))&&l.push(f)}}const c=[o,l];return Ce(e)&&r.set(e,c),c}function Da(e){return e[0]!==\"$\"&&!An(e)}const df=e=>e[0]===\"_\"||e===\"$stable\",Bl=e=>z(e)?e.map(Tt):[Tt(e)],fg=(e,t,n)=>{if(t._n)return t;const r=Il((...s)=>Bl(t(...s)),n);return r._c=!1,r},hf=(e,t,n)=>{const r=e._ctx;for(const s in e){if(df(s))continue;const i=e[s];if(ie(i))t[s]=fg(s,i,r);else if(i!=null){const o=Bl(i);t[s]=()=>o}}},pf=(e,t)=>{const n=Bl(t);e.slots.default=()=>n},mf=(e,t,n)=>{for(const r in t)(n||r!==\"_\")&&(e[r]=t[r])},dg=(e,t,n)=>{const r=e.slots=af();if(e.vnode.shapeFlag&32){const s=t._;s?(mf(r,t,n),n&&lu(r,\"_\",s,!0)):hf(t,r)}else t&&pf(e,t)},hg=(e,t,n)=>{const{vnode:r,slots:s}=e;let i=!0,o=de;if(r.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:mf(s,t,n):(i=!t.$stable,hf(t,s)),o=t}else t&&(pf(e,t),o={default:1});if(i)for(const l in s)!df(l)&&o[l]==null&&delete s[l]},Ue=Rf;function gf(e){return bf(e)}function yf(e){return bf(e,vm)}function bf(e,t){const n=Vi();n.__VUE__=!0;const{insert:r,remove:s,patchProp:i,createElement:o,createText:l,createComment:a,setText:c,setElementText:u,parentNode:f,nextSibling:d,setScopeId:h=Ge,insertStaticContent:p}=e,g=(m,v,x,$=null,F=null,L=null,K=void 0,H=null,q=!!v.dynamicChildren)=>{if(m===v)return;m&&!qt(m,v)&&($=le(m),ht(m,F,L,!0),m=null),v.patchFlag===-2&&(q=!1,v.dynamicChildren=null);const{type:D,ref:re,shapeFlag:Z}=v;switch(D){case wn:_(m,v,x,$);break;case Be:w(m,v,x,$);break;case qn:m==null&&C(v,x,$,K);break;case Ze:N(m,v,x,$,F,L,K,H,q);break;default:Z&1?A(m,v,x,$,F,L,K,H,q):Z&6?B(m,v,x,$,F,L,K,H,q):(Z&64||Z&128)&&D.process(m,v,x,$,F,L,K,H,q,Qe)}re!=null&&F&&Qr(re,m&&m.ref,L,v||m,!v)},_=(m,v,x,$)=>{if(m==null)r(v.el=l(v.children),x,$);else{const F=v.el=m.el;v.children!==m.children&&c(F,v.children)}},w=(m,v,x,$)=>{m==null?r(v.el=a(v.children||\"\"),x,$):v.el=m.el},C=(m,v,x,$)=>{[m.el,m.anchor]=p(m.children,v,x,$,m.el,m.anchor)},y=({el:m,anchor:v},x,$)=>{let F;for(;m&&m!==v;)F=d(m),r(m,x,$),m=F;r(v,x,$)},b=({el:m,anchor:v})=>{let x;for(;m&&m!==v;)x=d(m),s(m),m=x;s(v)},A=(m,v,x,$,F,L,K,H,q)=>{v.type===\"svg\"?K=\"svg\":v.type===\"math\"&&(K=\"mathml\"),m==null?I(v,x,$,F,L,K,H,q):T(m,v,F,L,K,H,q)},I=(m,v,x,$,F,L,K,H)=>{let q,D;const{props:re,shapeFlag:Z,transition:ee,dirs:oe}=m;if(q=m.el=o(m.type,L,re&&re.is,re),Z&8?u(q,m.children):Z&16&&k(m.children,q,null,$,F,To(m,L),K,H),oe&&Qt(m,null,$,\"created\"),V(q,m,m.scopeId,K,$),re){for(const we in re)we!==\"value\"&&!An(we)&&i(q,we,null,re[we],L,$);\"value\"in re&&i(q,\"value\",null,re.value,L),(D=re.onVnodeBeforeMount)&&Et(D,$,m)}oe&&Qt(m,null,$,\"beforeMount\");const fe=vf(F,ee);fe&&ee.beforeEnter(q),r(q,v,x),((D=re&&re.onVnodeMounted)||fe||oe)&&Ue(()=>{D&&Et(D,$,m),fe&&ee.enter(q),oe&&Qt(m,null,$,\"mounted\")},F)},V=(m,v,x,$,F)=>{if(x&&h(m,x),$)for(let L=0;L<$.length;L++)h(m,$[L]);if(F){let L=F.subTree;if(v===L||ci(L.type)&&(L.ssContent===v||L.ssFallback===v)){const K=F.vnode;V(m,K,K.scopeId,K.slotScopeIds,F.parent)}}},k=(m,v,x,$,F,L,K,H,q=0)=>{for(let D=q;D<m.length;D++){const re=m[D]=H?_n(m[D]):Tt(m[D]);g(null,re,v,x,$,F,L,K,H)}},T=(m,v,x,$,F,L,K)=>{const H=v.el=m.el;let{patchFlag:q,dynamicChildren:D,dirs:re}=v;q|=m.patchFlag&16;const Z=m.props||de,ee=v.props||de;let oe;if(x&&Vn(x,!1),(oe=ee.onVnodeBeforeUpdate)&&Et(oe,x,v,m),re&&Qt(v,m,x,\"beforeUpdate\"),x&&Vn(x,!0),(Z.innerHTML&&ee.innerHTML==null||Z.textContent&&ee.textContent==null)&&u(H,\"\"),D?O(m.dynamicChildren,D,H,x,$,To(v,F),L):K||J(m,v,H,null,x,$,To(v,F),L,!1),q>0){if(q&16)M(H,Z,ee,x,F);else if(q&2&&Z.class!==ee.class&&i(H,\"class\",null,ee.class,F),q&4&&i(H,\"style\",Z.style,ee.style,F),q&8){const fe=v.dynamicProps;for(let we=0;we<fe.length;we++){const ye=fe[we],tt=Z[ye],S=ee[ye];(S!==tt||ye===\"value\")&&i(H,ye,tt,S,F,x)}}q&1&&m.children!==v.children&&u(H,v.children)}else!K&&D==null&&M(H,Z,ee,x,F);((oe=ee.onVnodeUpdated)||re)&&Ue(()=>{oe&&Et(oe,x,v,m),re&&Qt(v,m,x,\"updated\")},$)},O=(m,v,x,$,F,L,K)=>{for(let H=0;H<v.length;H++){const q=m[H],D=v[H],re=q.el&&(q.type===Ze||!qt(q,D)||q.shapeFlag&70)?f(q.el):x;g(q,D,re,null,$,F,L,K,!0)}},M=(m,v,x,$,F)=>{if(v!==x){if(v!==de)for(const L in v)!An(L)&&!(L in x)&&i(m,L,v[L],null,F,$);for(const L in x){if(An(L))continue;const K=x[L],H=v[L];K!==H&&L!==\"value\"&&i(m,L,H,K,F,$)}\"value\"in x&&i(m,\"value\",v.value,x.value,F)}},N=(m,v,x,$,F,L,K,H,q)=>{const D=v.el=m?m.el:l(\"\"),re=v.anchor=m?m.anchor:l(\"\");let{patchFlag:Z,dynamicChildren:ee,slotScopeIds:oe}=v;oe&&(H=H?H.concat(oe):oe),m==null?(r(D,x,$),r(re,x,$),k(v.children||[],x,re,F,L,K,H,q)):Z>0&&Z&64&&ee&&m.dynamicChildren?(O(m.dynamicChildren,ee,x,F,L,K,H),(v.key!=null||F&&v===F.subTree)&&jl(m,v,!0)):J(m,v,x,re,F,L,K,H,q)},B=(m,v,x,$,F,L,K,H,q)=>{v.slotScopeIds=H,m==null?v.shapeFlag&512?F.ctx.activate(v,x,$,K,q):G(v,x,$,F,L,K,q):Y(m,v,q)},G=(m,v,x,$,F,L,K)=>{const H=m.component=Mf(m,$,F);if(ps(m)&&(H.ctx.renderer=Qe),Lf(H,!1,K),H.asyncDep){if(F&&F.registerDep(H,j,K),!m.el){const q=H.subTree=xe(Be);w(null,q,v,x)}}else j(H,m,v,x,F,L,K)},Y=(m,v,x)=>{const $=v.component=m.component;if(Eg(m,v,x))if($.asyncDep&&!$.asyncResolved){U($,v,x);return}else $.next=v,$.update();else v.el=m.el,$.vnode=v},j=(m,v,x,$,F,L,K)=>{const H=()=>{if(m.isMounted){let{next:Z,bu:ee,u:oe,parent:fe,vnode:we}=m;{const P=_f(m);if(P){Z&&(Z.el=we.el,U(m,Z,K)),P.asyncDep.then(()=>{m.isUnmounted||H()});return}}let ye=Z,tt;Vn(m,!1),Z?(Z.el=we.el,U(m,Z,K)):Z=we,ee&&dr(ee),(tt=Z.props&&Z.props.onVnodeBeforeUpdate)&&Et(tt,fe,Z,we),Vn(m,!0);const S=qs(m),E=m.subTree;m.subTree=S,g(E,S,f(E.el),le(E),m,F,L),Z.el=S.el,ye===null&&Gi(m,S.el),oe&&Ue(oe,F),(tt=Z.props&&Z.props.onVnodeUpdated)&&Ue(()=>Et(tt,fe,Z,we),F)}else{let Z;const{el:ee,props:oe}=v,{bm:fe,m:we,parent:ye,root:tt,type:S}=m,E=Cn(v);if(Vn(m,!1),fe&&dr(fe),!E&&(Z=oe&&oe.onVnodeBeforeMount)&&Et(Z,ye,v),Vn(m,!0),ee&&et){const P=()=>{m.subTree=qs(m),et(ee,m.subTree,m,F,null)};E&&S.__asyncHydrate?S.__asyncHydrate(ee,m,P):P()}else{tt.ce&&tt.ce._injectChildStyle(S);const P=m.subTree=qs(m);g(null,P,x,$,m,F,L),v.el=P.el}if(we&&Ue(we,F),!E&&(Z=oe&&oe.onVnodeMounted)){const P=v;Ue(()=>Et(Z,ye,P),F)}(v.shapeFlag&256||ye&&Cn(ye.vnode)&&ye.vnode.shapeFlag&256)&&m.a&&Ue(m.a,F),m.isMounted=!0,v=x=$=null}};m.scope.on();const q=m.effect=new Zr(H);m.scope.off();const D=m.update=q.run.bind(q),re=m.job=q.runIfDirty.bind(q);re.i=m,re.id=m.uid,q.scheduler=()=>xl(re),Vn(m,!0),D()},U=(m,v,x)=>{v.component=m;const $=m.vnode.props;m.vnode=v,m.next=null,cg(m,v.props,$,x),hg(m,v.children,x),Pn(),Na(m),kn()},J=(m,v,x,$,F,L,K,H,q=!1)=>{const D=m&&m.children,re=m?m.shapeFlag:0,Z=v.children,{patchFlag:ee,shapeFlag:oe}=v;if(ee>0){if(ee&128){We(D,Z,x,$,F,L,K,H,q);return}else if(ee&256){Se(D,Z,x,$,F,L,K,H,q);return}}oe&8?(re&16&&X(D,F,L),Z!==D&&u(x,Z)):re&16?oe&16?We(D,Z,x,$,F,L,K,H,q):X(D,F,L,!0):(re&8&&u(x,\"\"),oe&16&&k(Z,x,$,F,L,K,H,q))},Se=(m,v,x,$,F,L,K,H,q)=>{m=m||cr,v=v||cr;const D=m.length,re=v.length,Z=Math.min(D,re);let ee;for(ee=0;ee<Z;ee++){const oe=v[ee]=q?_n(v[ee]):Tt(v[ee]);g(m[ee],oe,x,null,F,L,K,H,q)}D>re?X(m,F,L,!0,!1,Z):k(v,x,$,F,L,K,H,q,Z)},We=(m,v,x,$,F,L,K,H,q)=>{let D=0;const re=v.length;let Z=m.length-1,ee=re-1;for(;D<=Z&&D<=ee;){const oe=m[D],fe=v[D]=q?_n(v[D]):Tt(v[D]);if(qt(oe,fe))g(oe,fe,x,null,F,L,K,H,q);else break;D++}for(;D<=Z&&D<=ee;){const oe=m[Z],fe=v[ee]=q?_n(v[ee]):Tt(v[ee]);if(qt(oe,fe))g(oe,fe,x,null,F,L,K,H,q);else break;Z--,ee--}if(D>Z){if(D<=ee){const oe=ee+1,fe=oe<re?v[oe].el:$;for(;D<=ee;)g(null,v[D]=q?_n(v[D]):Tt(v[D]),x,fe,F,L,K,H,q),D++}}else if(D>ee)for(;D<=Z;)ht(m[D],F,L,!0),D++;else{const oe=D,fe=D,we=new Map;for(D=fe;D<=ee;D++){const te=v[D]=q?_n(v[D]):Tt(v[D]);te.key!=null&&we.set(te.key,D)}let ye,tt=0;const S=ee-fe+1;let E=!1,P=0;const W=new Array(S);for(D=0;D<S;D++)W[D]=0;for(D=oe;D<=Z;D++){const te=m[D];if(tt>=S){ht(te,F,L,!0);continue}let Q;if(te.key!=null)Q=we.get(te.key);else for(ye=fe;ye<=ee;ye++)if(W[ye-fe]===0&&qt(te,v[ye])){Q=ye;break}Q===void 0?ht(te,F,L,!0):(W[Q-fe]=D+1,Q>=P?P=Q:E=!0,g(te,v[Q],x,null,F,L,K,H,q),tt++)}const se=E?pg(W):cr;for(ye=se.length-1,D=S-1;D>=0;D--){const te=fe+D,Q=v[te],Oe=te+1<re?v[te+1].el:$;W[D]===0?g(null,Q,x,Oe,F,L,K,H,q):E&&(ye<0||D!==se[ye]?Je(Q,x,Oe,2):ye--)}}},Je=(m,v,x,$,F=null)=>{const{el:L,type:K,transition:H,children:q,shapeFlag:D}=m;if(D&6){Je(m.component.subTree,v,x,$);return}if(D&128){m.suspense.move(v,x,$);return}if(D&64){K.move(m,v,x,Qe);return}if(K===Ze){r(L,v,x);for(let Z=0;Z<q.length;Z++)Je(q[Z],v,x,$);r(m.anchor,v,x);return}if(K===qn){y(m,v,x);return}if($!==2&&D&1&&H)if($===0)H.beforeEnter(L),r(L,v,x),Ue(()=>H.enter(L),F);else{const{leave:Z,delayLeave:ee,afterLeave:oe}=H,fe=()=>r(L,v,x),we=()=>{Z(L,()=>{fe(),oe&&oe()})};ee?ee(L,fe,we):we()}else r(L,v,x)},ht=(m,v,x,$=!1,F=!1)=>{const{type:L,props:K,ref:H,children:q,dynamicChildren:D,shapeFlag:re,patchFlag:Z,dirs:ee,cacheIndex:oe}=m;if(Z===-2&&(F=!1),H!=null&&Qr(H,null,x,m,!0),oe!=null&&(v.renderCache[oe]=void 0),re&256){v.ctx.deactivate(m);return}const fe=re&1&&ee,we=!Cn(m);let ye;if(we&&(ye=K&&K.onVnodeBeforeUnmount)&&Et(ye,v,m),re&6)xr(m.component,x,$);else{if(re&128){m.suspense.unmount(x,$);return}fe&&Qt(m,null,v,\"beforeUnmount\"),re&64?m.type.remove(m,v,x,Qe,$):D&&!D.hasOnce&&(L!==Ze||Z>0&&Z&64)?X(D,v,x,!1,!0):(L===Ze&&Z&384||!F&&re&16)&&X(q,v,x),$&&Rr(m)}(we&&(ye=K&&K.onVnodeUnmounted)||fe)&&Ue(()=>{ye&&Et(ye,v,m),fe&&Qt(m,null,v,\"unmounted\")},x)},Rr=m=>{const{type:v,el:x,anchor:$,transition:F}=m;if(v===Ze){Xe(x,$);return}if(v===qn){b(m);return}const L=()=>{s(x),F&&!F.persisted&&F.afterLeave&&F.afterLeave()};if(m.shapeFlag&1&&F&&!F.persisted){const{leave:K,delayLeave:H}=F,q=()=>K(x,L);H?H(m.el,L,q):q()}else L()},Xe=(m,v)=>{let x;for(;m!==v;)x=d(m),s(m),m=x;s(v)},xr=(m,v,x)=>{const{bum:$,scope:F,job:L,subTree:K,um:H,m:q,a:D}=m;ai(q),ai(D),$&&dr($),F.stop(),L&&(L.flags|=8,ht(K,m,v,x)),H&&Ue(H,v),Ue(()=>{m.isUnmounted=!0},v),v&&v.pendingBranch&&!v.isUnmounted&&m.asyncDep&&!m.asyncResolved&&m.suspenseId===v.pendingId&&(v.deps--,v.deps===0&&v.resolve())},X=(m,v,x,$=!1,F=!1,L=0)=>{for(let K=L;K<m.length;K++)ht(m[K],v,x,$,F)},le=m=>{if(m.shapeFlag&6)return le(m.component.subTree);if(m.shapeFlag&128)return m.suspense.next();const v=d(m.anchor||m.el),x=v&&v[Bu];return x?d(x):v};let Ee=!1;const Ae=(m,v,x)=>{m==null?v._vnode&&ht(v._vnode,null,null,!0):g(v._vnode||null,m,v,null,null,null,x),v._vnode=m,Ee||(Ee=!0,Na(),oi(),Ee=!1)},Qe={p:g,um:ht,m:Je,r:Rr,mt:G,mc:k,pc:J,pbc:O,n:le,o:e};let vt,et;return t&&([vt,et]=t(Qe)),{render:Ae,hydrate:vt,createApp:og(Ae,vt)}}function To({type:e,props:t},n){return n===\"svg\"&&e===\"foreignObject\"||n===\"mathml\"&&e===\"annotation-xml\"&&t&&t.encoding&&t.encoding.includes(\"html\")?void 0:n}function Vn({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function vf(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function jl(e,t,n=!1){const r=e.children,s=t.children;if(z(r)&&z(s))for(let i=0;i<r.length;i++){const o=r[i];let l=s[i];l.shapeFlag&1&&!l.dynamicChildren&&((l.patchFlag<=0||l.patchFlag===32)&&(l=s[i]=_n(s[i]),l.el=o.el),!n&&l.patchFlag!==-2&&jl(o,l)),l.type===wn&&(l.el=o.el)}}function pg(e){const t=e.slice(),n=[0];let r,s,i,o,l;const a=e.length;for(r=0;r<a;r++){const c=e[r];if(c!==0){if(s=n[n.length-1],e[s]<c){t[r]=s,n.push(r);continue}for(i=0,o=n.length-1;i<o;)l=i+o>>1,e[n[l]]<c?i=l+1:o=l;c<e[n[i]]&&(i>0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function _f(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:_f(t)}function ai(e){if(e)for(let t=0;t<e.length;t++)e[t].flags|=8}const Sf=Symbol.for(\"v-scx\"),Ef=()=>Hn(Sf);function Af(e,t){return gs(e,null,t)}function mg(e,t){return gs(e,null,{flush:\"post\"})}function Tf(e,t){return gs(e,null,{flush:\"sync\"})}function kt(e,t,n){return gs(e,t,n)}function gs(e,t,n=de){const{immediate:r,deep:s,flush:i,once:o}=n,l=he({},n),a=t&&r||!t&&i!==\"post\";let c;if(gr){if(i===\"sync\"){const h=Ef();c=h.__watcherHandles||(h.__watcherHandles=[])}else if(!a){const h=()=>{};return h.stop=Ge,h.resume=Ge,h.pause=Ge,h}}const u=qe;l.call=(h,p,g)=>Ut(h,u,p,g);let f=!1;i===\"post\"?l.scheduler=h=>{Ue(h,u&&u.suspense)}:i!==\"sync\"&&(f=!0,l.scheduler=(h,p)=>{p?h():xl(h)}),l.augmentJob=h=>{t&&(h.flags|=4),f&&(h.flags|=2,u&&(h.id=u.uid,h.i=u))};const d=em(e,t,l);return gr&&(c?c.push(d):a&&d()),d}function gg(e,t,n){const r=this.proxy,s=ae(e)?e.includes(\".\")?Cf(r,e):()=>r[e]:e.bind(r,r);let i;ie(t)?i=t:(i=t.handler,n=t);const o=zn(this),l=gs(s,i.bind(r),n);return o(),l}function Cf(e,t){const n=t.split(\".\");return()=>{let r=e;for(let s=0;s<n.length&&r;s++)r=r[n[s]];return r}}function yg(e,t,n=de){const r=dt(),s=Ie(t),i=Ct(t),o=wf(e,s),l=Pu((a,c)=>{let u,f=de,d;return Tf(()=>{const h=e[s];gt(u,h)&&(u=h,c())}),{get(){return a(),n.get?n.get(u):u},set(h){const p=n.set?n.set(h):h;if(!gt(p,u)&&!(f!==de&&gt(h,f)))return;const g=r.vnode.props;g&&(t in g||s in g||i in g)&&(`onUpdate:${t}`in g||`onUpdate:${s}`in g||`onUpdate:${i}`in g)||(u=h,c()),r.emit(`update:${t}`,p),gt(h,p)&&gt(h,f)&&!gt(p,d)&&c(),f=h,d=p}}});return l[Symbol.iterator]=()=>{let a=0;return{next(){return a<2?{value:a++?o||de:l,done:!1}:{done:!0}}}},l}const wf=(e,t)=>t===\"modelValue\"||t===\"model-value\"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ie(t)}Modifiers`]||e[`${Ct(t)}Modifiers`];function bg(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||de;let s=n;const i=t.startsWith(\"update:\"),o=i&&wf(r,t.slice(7));o&&(o.trim&&(s=n.map(u=>ae(u)?u.trim():u)),o.number&&(s=n.map(ti)));let l,a=r[l=fr(t)]||r[l=fr(Ie(t))];!a&&i&&(a=r[l=fr(Ct(t))]),a&&Ut(a,e,6,s);const c=r[l+\"Once\"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Ut(c,e,6,s)}}function Of(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const i=e.emits;let o={},l=!1;if(!ie(e)){const a=c=>{const u=Of(c,t,!0);u&&(l=!0,he(o,u))};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}return!i&&!l?(Ce(e)&&r.set(e,null),null):(z(i)?i.forEach(a=>o[a]=null):he(o,i),Ce(e)&&r.set(e,o),o)}function zi(e,t){return!e||!Yn(t)?!1:(t=t.slice(2).replace(/Once$/,\"\"),be(e,t[0].toLowerCase()+t.slice(1))||be(e,Ct(t))||be(e,t))}function qs(e){const{type:t,vnode:n,proxy:r,withProxy:s,propsOptions:[i],slots:o,attrs:l,emit:a,render:c,renderCache:u,props:f,data:d,setupState:h,ctx:p,inheritAttrs:g}=e,_=Yr(e);let w,C;try{if(n.shapeFlag&4){const b=s||r,A=b;w=Tt(c.call(A,b,u,f,h,d,p)),C=l}else{const b=t;w=Tt(b.length>1?b(f,{attrs:l,slots:o,emit:a}):b(f,null)),C=t.props?l:_g(l)}}catch(b){qr.length=0,tr(b,e,1),w=xe(Be)}let y=w;if(C&&g!==!1){const b=Object.keys(C),{shapeFlag:A}=y;b.length&&A&7&&(i&&b.some(_l)&&(C=Sg(C,i)),y=en(y,C,!1,!0))}return n.dirs&&(y=en(y,null,!1,!0),y.dirs=y.dirs?y.dirs.concat(n.dirs):n.dirs),n.transition&&fn(y,n.transition),w=y,Yr(_),w}function vg(e,t=!0){let n;for(let r=0;r<e.length;r++){const s=e[r];if(dn(s)){if(s.type!==Be||s.children===\"v-if\"){if(n)return;n=s}}else return}return n}const _g=e=>{let t;for(const n in e)(n===\"class\"||n===\"style\"||Yn(n))&&((t||(t={}))[n]=e[n]);return t},Sg=(e,t)=>{const n={};for(const r in e)(!_l(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Eg(e,t,n){const{props:r,children:s,component:i}=e,{props:o,children:l,patchFlag:a}=t,c=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&a>=0){if(a&1024)return!0;if(a&16)return r?Ba(r,o,c):!!o;if(a&8){const u=t.dynamicProps;for(let f=0;f<u.length;f++){const d=u[f];if(o[d]!==r[d]&&!zi(c,d))return!0}}}else return(s||l)&&(!l||!l.$stable)?!0:r===o?!1:r?o?Ba(r,o,c):!0:!!o;return!1}function Ba(e,t,n){const r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let s=0;s<r.length;s++){const i=r[s];if(t[i]!==e[i]&&!zi(n,i))return!0}return!1}function Gi({vnode:e,parent:t},n){for(;t;){const r=t.subTree;if(r.suspense&&r.suspense.activeBranch===e&&(r.el=e.el),r===e)(e=t.vnode).el=n,t=t.parent;else break}}const ci=e=>e.__isSuspense;let Ko=0;const Ag={name:\"Suspense\",__isSuspense:!0,process(e,t,n,r,s,i,o,l,a,c){if(e==null)Cg(t,n,r,s,i,o,l,a,c);else{if(i&&i.deps>0&&!e.suspense.isInFallback){t.suspense=e.suspense,t.suspense.vnode=t,t.el=e.el;return}wg(e,t,n,r,s,o,l,a,c)}},hydrate:Og,normalize:Ng},Tg=Ag;function ns(e,t){const n=e.props&&e.props[t];ie(n)&&n()}function Cg(e,t,n,r,s,i,o,l,a){const{p:c,o:{createElement:u}}=a,f=u(\"div\"),d=e.suspense=Nf(e,s,r,t,f,n,i,o,l,a);c(null,d.pendingBranch=e.ssContent,f,null,r,d,i,o),d.deps>0?(ns(e,\"onPending\"),ns(e,\"onFallback\"),c(null,e.ssFallback,t,n,r,null,i,o),pr(d,e.ssFallback)):d.resolve(!1,!0)}function wg(e,t,n,r,s,i,o,l,{p:a,um:c,o:{createElement:u}}){const f=t.suspense=e.suspense;f.vnode=t,t.el=e.el;const d=t.ssContent,h=t.ssFallback,{activeBranch:p,pendingBranch:g,isInFallback:_,isHydrating:w}=f;if(g)f.pendingBranch=d,qt(d,g)?(a(g,d,f.hiddenContainer,null,s,f,i,o,l),f.deps<=0?f.resolve():_&&(w||(a(p,h,n,r,s,null,i,o,l),pr(f,h)))):(f.pendingId=Ko++,w?(f.isHydrating=!1,f.activeBranch=g):c(g,s,f),f.deps=0,f.effects.length=0,f.hiddenContainer=u(\"div\"),_?(a(null,d,f.hiddenContainer,null,s,f,i,o,l),f.deps<=0?f.resolve():(a(p,h,n,r,s,null,i,o,l),pr(f,h))):p&&qt(d,p)?(a(p,d,n,r,s,f,i,o,l),f.resolve(!0)):(a(null,d,f.hiddenContainer,null,s,f,i,o,l),f.deps<=0&&f.resolve()));else if(p&&qt(d,p))a(p,d,n,r,s,f,i,o,l),pr(f,d);else if(ns(t,\"onPending\"),f.pendingBranch=d,d.shapeFlag&512?f.pendingId=d.component.suspenseId:f.pendingId=Ko++,a(null,d,f.hiddenContainer,null,s,f,i,o,l),f.deps<=0)f.resolve();else{const{timeout:C,pendingId:y}=f;C>0?setTimeout(()=>{f.pendingId===y&&f.fallback(h)},C):C===0&&f.fallback(h)}}function Nf(e,t,n,r,s,i,o,l,a,c,u=!1){const{p:f,m:d,um:h,n:p,o:{parentNode:g,remove:_}}=c;let w;const C=Rg(e);C&&t&&t.pendingBranch&&(w=t.pendingId,t.deps++);const y=e.props?ni(e.props.timeout):void 0,b=i,A={vnode:e,parent:t,parentComponent:n,namespace:o,container:r,hiddenContainer:s,deps:0,pendingId:Ko++,timeout:typeof y==\"number\"?y:-1,activeBranch:null,pendingBranch:null,isInFallback:!u,isHydrating:u,isUnmounted:!1,effects:[],resolve(I=!1,V=!1){const{vnode:k,activeBranch:T,pendingBranch:O,pendingId:M,effects:N,parentComponent:B,container:G}=A;let Y=!1;A.isHydrating?A.isHydrating=!1:I||(Y=T&&O.transition&&O.transition.mode===\"out-in\",Y&&(T.transition.afterLeave=()=>{M===A.pendingId&&(d(O,G,i===b?p(T):i,0),Jr(N))}),T&&(g(T.el)===G&&(i=p(T)),h(T,B,A,!0)),Y||d(O,G,i,0)),pr(A,O),A.pendingBranch=null,A.isInFallback=!1;let j=A.parent,U=!1;for(;j;){if(j.pendingBranch){j.effects.push(...N),U=!0;break}j=j.parent}!U&&!Y&&Jr(N),A.effects=[],C&&t&&t.pendingBranch&&w===t.pendingId&&(t.deps--,t.deps===0&&!V&&t.resolve()),ns(k,\"onResolve\")},fallback(I){if(!A.pendingBranch)return;const{vnode:V,activeBranch:k,parentComponent:T,container:O,namespace:M}=A;ns(V,\"onFallback\");const N=p(k),B=()=>{A.isInFallback&&(f(null,I,O,N,T,null,M,l,a),pr(A,I))},G=I.transition&&I.transition.mode===\"out-in\";G&&(k.transition.afterLeave=B),A.isInFallback=!0,h(k,T,null,!0),G||B()},move(I,V,k){A.activeBranch&&d(A.activeBranch,I,V,k),A.container=I},next(){return A.activeBranch&&p(A.activeBranch)},registerDep(I,V,k){const T=!!A.pendingBranch;T&&A.deps++;const O=I.vnode.el;I.asyncDep.catch(M=>{tr(M,I,0)}).then(M=>{if(I.isUnmounted||A.isUnmounted||A.pendingId!==I.suspenseId)return;I.asyncResolved=!0;const{vnode:N}=I;Go(I,M,!1),O&&(N.el=O);const B=!O&&I.subTree.el;V(I,N,g(O||I.subTree.el),O?null:p(I.subTree),A,o,k),B&&_(B),Gi(I,N.el),T&&--A.deps===0&&A.resolve()})},unmount(I,V){A.isUnmounted=!0,A.activeBranch&&h(A.activeBranch,n,I,V),A.pendingBranch&&h(A.pendingBranch,n,I,V)}};return A}function Og(e,t,n,r,s,i,o,l,a){const c=t.suspense=Nf(t,r,n,e.parentNode,document.createElement(\"div\"),null,s,i,o,l,!0),u=a(e,c.pendingBranch=t.ssContent,n,c,i,o);return c.deps===0&&c.resolve(!1,!0),u}function Ng(e){const{shapeFlag:t,children:n}=e,r=t&32;e.ssContent=ja(r?n.default:n),e.ssFallback=r?ja(n.fallback):xe(Be)}function ja(e){let t;if(ie(e)){const n=Zn&&e._c;n&&(e._d=!1,rs()),e=e(),n&&(e._d=!0,t=ut,xf())}return z(e)&&(e=vg(e)),e=Tt(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function Rf(e,t){t&&t.pendingBranch?z(e)?t.effects.push(...e):t.effects.push(e):Jr(e)}function pr(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e;let s=t.el;for(;!s&&t.component;)t=t.component.subTree,s=t.el;n.el=s,r&&r.subTree===n&&(r.vnode.el=s,Gi(r,s))}function Rg(e){const t=e.props&&e.props.suspensible;return t!=null&&t!==!1}const Ze=Symbol.for(\"v-fgt\"),wn=Symbol.for(\"v-txt\"),Be=Symbol.for(\"v-cmt\"),qn=Symbol.for(\"v-stc\"),qr=[];let ut=null;function rs(e=!1){qr.push(ut=e?null:[])}function xf(){qr.pop(),ut=qr[qr.length-1]||null}let Zn=1;function Wo(e,t=!1){Zn+=e,e<0&&ut&&t&&(ut.hasOnce=!0)}function If(e){return e.dynamicChildren=Zn>0?ut||cr:null,xf(),Zn>0&&ut&&ut.push(e),e}function xg(e,t,n,r,s,i){return If(Ul(e,t,n,r,s,i,!0))}function ui(e,t,n,r,s){return If(xe(e,t,n,r,s,!0))}function dn(e){return e?e.__v_isVNode===!0:!1}function qt(e,t){return e.type===t.type&&e.key===t.key}function Ig(e){}const Pf=({key:e})=>e??null,Ks=({ref:e,ref_key:t,ref_for:n})=>(typeof e==\"number\"&&(e=\"\"+e),e!=null?ae(e)||Ve(e)||ie(e)?{i:Ke,r:e,k:t,f:!!n}:e:null);function Ul(e,t=null,n=null,r=0,s=null,i=e===Ze?0:1,o=!1,l=!1){const a={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Pf(t),ref:t&&Ks(t),scopeId:Ui,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:Ke};return l?(ql(a,n),i&128&&e.normalize(a)):n&&(a.shapeFlag|=ae(n)?8:16),Zn>0&&!o&&ut&&(a.patchFlag>0||i&6)&&a.patchFlag!==32&&ut.push(a),a}const xe=Pg;function Pg(e,t=null,n=null,r=0,s=null,i=!1){if((!e||e===nf)&&(e=Be),dn(e)){const l=en(e,t,!0);return n&&ql(l,n),Zn>0&&!i&&ut&&(l.shapeFlag&6?ut[ut.indexOf(e)]=l:ut.push(l)),l.patchFlag=-2,l}if(Bg(e)&&(e=e.__vccOpts),t){t=kf(t);let{class:l,style:a}=t;l&&!ae(l)&&(t.class=hs(l)),Ce(a)&&(ji(a)&&!z(a)&&(a=he({},a)),t.style=ds(a))}const o=ae(e)?1:ci(e)?128:ju(e)?64:Ce(e)?4:ie(e)?2:0;return Ul(e,t,n,r,s,o,i,!0)}function kf(e){return e?ji(e)||cf(e)?he({},e):e:null}function en(e,t,n=!1,r=!1){const{props:s,ref:i,patchFlag:o,children:l,transition:a}=e,c=t?Vf(s||{},t):s,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&Pf(c),ref:t&&t.ref?n&&i?z(i)?i.concat(Ks(t)):[i,Ks(t)]:Ks(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ze?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:a,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&en(e.ssContent),ssFallback:e.ssFallback&&en(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return a&&r&&fn(u,a.clone(u)),u}function Hl(e=\" \",t=0){return xe(wn,null,e,t)}function kg(e,t){const n=xe(qn,null,e);return n.staticCount=t,n}function Vg(e=\"\",t=!1){return t?(rs(),ui(Be,null,e)):xe(Be,null,e)}function Tt(e){return e==null||typeof e==\"boolean\"?xe(Be):z(e)?xe(Ze,null,e.slice()):dn(e)?_n(e):xe(wn,null,String(e))}function _n(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:en(e)}function ql(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(z(t))n=16;else if(typeof t==\"object\")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),ql(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!cf(t)?t._ctx=Ke:s===3&&Ke&&(Ke.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ie(t)?(t={default:t,_ctx:Ke},n=32):(t=String(t),r&64?(n=16,t=[Hl(t)]):n=8);e.children=t,e.shapeFlag|=n}function Vf(...e){const t={};for(let n=0;n<e.length;n++){const r=e[n];for(const s in r)if(s===\"class\")t.class!==r.class&&(t.class=hs([t.class,r.class]));else if(s===\"style\")t.style=ds([t.style,r.style]);else if(Yn(s)){const i=t[s],o=r[s];o&&i!==o&&!(z(i)&&i.includes(o))&&(t[s]=i?[].concat(i,o):o)}else s!==\"\"&&(t[s]=r[s])}return t}function Et(e,t,n,r=null){Ut(e,t,7,[n,r])}const Mg=of();let Fg=0;function Mf(e,t,n){const r=e.type,s=(t?t.appContext:e.appContext)||Mg,i={uid:Fg++,vnode:e,type:r,parent:t,appContext:s,root:null,next:null,subTree:null,effect:null,update:null,job:null,scope:new Tl(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(s.provides),ids:t?t.ids:[\"\",0,0],accessCache:null,renderCache:[],components:null,directives:null,propsOptions:ff(r,s),emitsOptions:Of(r,s),emit:null,emitted:null,propsDefaults:de,inheritAttrs:r.inheritAttrs,ctx:de,data:de,props:de,attrs:de,slots:de,refs:de,setupState:de,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return i.ctx={_:i},i.root=t?t.root:i,i.emit=bg.bind(null,i),e.ce&&e.ce(i),i}let qe=null;const dt=()=>qe||Ke;let fi,Zo;{const e=Vi(),t=(n,r)=>{let s;return(s=e[n])||(s=e[n]=[]),s.push(r),i=>{s.length>1?s.forEach(o=>o(i)):s[0](i)}};fi=t(\"__VUE_INSTANCE_SETTERS__\",n=>qe=n),Zo=t(\"__VUE_SSR_SETTERS__\",n=>gr=n)}const zn=e=>{const t=qe;return fi(e),e.scope.on(),()=>{e.scope.off(),fi(t)}},zo=()=>{qe&&qe.scope.off(),fi(null)};function Ff(e){return e.vnode.shapeFlag&4}let gr=!1;function Lf(e,t=!1,n=!1){t&&Zo(t);const{props:r,children:s}=e.vnode,i=Ff(e);ag(e,r,i,t),dg(e,s,n);const o=i?Lg(e,t):void 0;return t&&Zo(!1),o}function Lg(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,jo);const{setup:r}=n;if(r){Pn();const s=e.setupContext=r.length>1?Bf(e):null,i=zn(e),o=Cr(r,e,0,[e.props,s]),l=El(o);if(kn(),i(),(l||e.sp)&&!Cn(e)&&Vl(e),l){if(o.then(zo,zo),t)return o.then(a=>{Go(e,a,t)}).catch(a=>{tr(a,e,0)});e.asyncDep=o}else Go(e,o,t)}else Df(e,t)}function Go(e,t,n){ie(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Ce(t)&&(e.setupState=Rl(t)),Df(e,n)}let di,Jo;function $f(e){di=e,Jo=t=>{t.render._rc&&(t.withProxy=new Proxy(t.ctx,Bm))}}const $g=()=>!di;function Df(e,t,n){const r=e.type;if(!e.render){if(!t&&di&&!r.render){const s=r.template||Dl(e).template;if(s){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:a}=r,c=he(he({isCustomElement:i,delimiters:l},o),a);r.render=di(s,c)}}e.render=r.render||Ge,Jo&&Jo(e)}{const s=zn(e);Pn();try{eg(e)}finally{kn(),s()}}}const Dg={get(e,t){return ot(e,\"get\",\"\"),e[t]}};function Bf(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Dg),slots:e.slots,emit:e.emit,expose:t}}function ys(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Rl(xu(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Hr)return Hr[n](e)},has(t,n){return n in t||n in Hr}})):e.proxy}function Xo(e,t=!0){return ie(e)?e.displayName||e.name:e.name||t&&e.__name}function Bg(e){return ie(e)&&\"__vccOpts\"in e}const ge=(e,t)=>Jp(e,t,gr);function yr(e,t,n){const r=arguments.length;return r===2?Ce(t)&&!z(t)?dn(t)?xe(e,null,[t]):xe(e,t):xe(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&dn(n)&&(n=[n]),xe(e,t,n))}function jg(){}function Ug(e,t,n,r){const s=n[r];if(s&&jf(s,e))return s;const i=t();return i.memo=e.slice(),i.cacheIndex=r,n[r]=i}function jf(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let r=0;r<n.length;r++)if(gt(n[r],t[r]))return!1;return Zn>0&&ut&&ut.push(e),!0}const Uf=\"3.5.13\",Hg=Ge,qg=im,Kg=lr,Wg=Du,Zg={createComponentInstance:Mf,setupComponent:Lf,renderComponentRoot:qs,setCurrentRenderingInstance:Yr,isVNode:dn,normalizeVNode:Tt,getComponentPublicInstance:ys,ensureValidVNode:$l,pushWarningContext:tm,popWarningContext:nm},zg=Zg,Gg=null,Jg=null,Xg=null;/**\n* @vue/runtime-dom v3.5.13\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/let Yo;const Ua=typeof window<\"u\"&&window.trustedTypes;if(Ua)try{Yo=Ua.createPolicy(\"vue\",{createHTML:e=>e})}catch{}const Hf=Yo?e=>Yo.createHTML(e):e=>e,Yg=\"http://www.w3.org/2000/svg\",Qg=\"http://www.w3.org/1998/Math/MathML\",on=typeof document<\"u\"?document:null,Ha=on&&on.createElement(\"template\"),ey={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t===\"svg\"?on.createElementNS(Yg,e):t===\"mathml\"?on.createElementNS(Qg,e):n?on.createElement(e,{is:n}):on.createElement(e);return e===\"select\"&&r&&r.multiple!=null&&s.setAttribute(\"multiple\",r.multiple),s},createText:e=>on.createTextNode(e),createComment:e=>on.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>on.querySelector(e),setScopeId(e,t){e.setAttribute(t,\"\")},insertStaticContent(e,t,n,r,s,i){const o=n?n.previousSibling:t.lastChild;if(s&&(s===i||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===i||!(s=s.nextSibling)););else{Ha.innerHTML=Hf(r===\"svg\"?`<svg>${e}</svg>`:r===\"mathml\"?`<math>${e}</math>`:e);const l=Ha.content;if(r===\"svg\"||r===\"mathml\"){const a=l.firstChild;for(;a.firstChild;)l.appendChild(a.firstChild);l.removeChild(a)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},pn=\"transition\",kr=\"animation\",br=Symbol(\"_vtc\"),qf={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Kf=he({},kl,qf),ty=e=>(e.displayName=\"Transition\",e.props=Kf,e),ny=ty((e,{slots:t})=>yr(Wu,Wf(e),t)),Mn=(e,t=[])=>{z(e)?e.forEach(n=>n(...t)):e&&e(...t)},qa=e=>e?z(e)?e.some(t=>t.length>1):e.length>1:!1;function Wf(e){const t={};for(const N in e)N in qf||(t[N]=e[N]);if(e.css===!1)return t;const{name:n=\"v\",type:r,duration:s,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:a=i,appearActiveClass:c=o,appearToClass:u=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,p=ry(s),g=p&&p[0],_=p&&p[1],{onBeforeEnter:w,onEnter:C,onEnterCancelled:y,onLeave:b,onLeaveCancelled:A,onBeforeAppear:I=w,onAppear:V=C,onAppearCancelled:k=y}=t,T=(N,B,G,Y)=>{N._enterCancelled=Y,gn(N,B?u:l),gn(N,B?c:o),G&&G()},O=(N,B)=>{N._isLeaving=!1,gn(N,f),gn(N,h),gn(N,d),B&&B()},M=N=>(B,G)=>{const Y=N?V:C,j=()=>T(B,N,G);Mn(Y,[B,j]),Ka(()=>{gn(B,N?a:i),Xt(B,N?u:l),qa(Y)||Wa(B,r,g,j)})};return he(t,{onBeforeEnter(N){Mn(w,[N]),Xt(N,i),Xt(N,o)},onBeforeAppear(N){Mn(I,[N]),Xt(N,a),Xt(N,c)},onEnter:M(!1),onAppear:M(!0),onLeave(N,B){N._isLeaving=!0;const G=()=>O(N,B);Xt(N,f),N._enterCancelled?(Xt(N,d),Qo()):(Qo(),Xt(N,d)),Ka(()=>{N._isLeaving&&(gn(N,f),Xt(N,h),qa(b)||Wa(N,r,_,G))}),Mn(b,[N,G])},onEnterCancelled(N){T(N,!1,void 0,!0),Mn(y,[N])},onAppearCancelled(N){T(N,!0,void 0,!0),Mn(k,[N])},onLeaveCancelled(N){O(N),Mn(A,[N])}})}function ry(e){if(e==null)return null;if(Ce(e))return[Co(e.enter),Co(e.leave)];{const t=Co(e);return[t,t]}}function Co(e){return ni(e)}function Xt(e,t){t.split(/\\s+/).forEach(n=>n&&e.classList.add(n)),(e[br]||(e[br]=new Set)).add(t)}function gn(e,t){t.split(/\\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[br];n&&(n.delete(t),n.size||(e[br]=void 0))}function Ka(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let sy=0;function Wa(e,t,n,r){const s=e._endId=++sy,i=()=>{s===e._endId&&r()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:a}=Zf(e,t);if(!o)return r();const c=o+\"end\";let u=0;const f=()=>{e.removeEventListener(c,d),i()},d=h=>{h.target===e&&++u>=a&&f()};setTimeout(()=>{u<a&&f()},l+1),e.addEventListener(c,d)}function Zf(e,t){const n=window.getComputedStyle(e),r=p=>(n[p]||\"\").split(\", \"),s=r(`${pn}Delay`),i=r(`${pn}Duration`),o=Za(s,i),l=r(`${kr}Delay`),a=r(`${kr}Duration`),c=Za(l,a);let u=null,f=0,d=0;t===pn?o>0&&(u=pn,f=o,d=i.length):t===kr?c>0&&(u=kr,f=c,d=a.length):(f=Math.max(o,c),u=f>0?o>c?pn:kr:null,d=u?u===pn?i.length:a.length:0);const h=u===pn&&/\\b(transform|all)(,|$)/.test(r(`${pn}Property`).toString());return{type:u,timeout:f,propCount:d,hasTransform:h}}function Za(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,r)=>za(n)+za(e[r])))}function za(e){return e===\"auto\"?0:Number(e.slice(0,-1).replace(\",\",\".\"))*1e3}function Qo(){return document.body.offsetHeight}function iy(e,t,n){const r=e[br];r&&(t=(t?[t,...r]:[...r]).join(\" \")),t==null?e.removeAttribute(\"class\"):n?e.setAttribute(\"class\",t):e.className=t}const hi=Symbol(\"_vod\"),zf=Symbol(\"_vsh\"),Gf={beforeMount(e,{value:t},{transition:n}){e[hi]=e.style.display===\"none\"?\"\":e.style.display,n&&t?n.beforeEnter(e):Vr(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Vr(e,!0),r.enter(e)):r.leave(e,()=>{Vr(e,!1)}):Vr(e,t))},beforeUnmount(e,{value:t}){Vr(e,t)}};function Vr(e,t){e.style.display=t?e[hi]:\"none\",e[zf]=!t}function oy(){Gf.getSSRProps=({value:e})=>{if(!e)return{style:{display:\"none\"}}}}const Jf=Symbol(\"\");function ly(e){const t=dt();if(!t)return;const n=t.ut=(s=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner=\"${t.uid}\"]`)).forEach(i=>pi(i,s))},r=()=>{const s=e(t.proxy);t.ce?pi(t.ce,s):el(t.subTree,s),n(s)};Ml(()=>{Jr(r)}),nr(()=>{kt(r,Ge,{flush:\"post\"});const s=new MutationObserver(r);s.observe(t.subTree.el.parentNode,{childList:!0}),Wi(()=>s.disconnect())})}function el(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{el(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)pi(e.el,t);else if(e.type===Ze)e.children.forEach(n=>el(n,t));else if(e.type===qn){let{el:n,anchor:r}=e;for(;n&&(pi(n,t),n!==r);)n=n.nextSibling}}function pi(e,t){if(e.nodeType===1){const n=e.style;let r=\"\";for(const s in t)n.setProperty(`--${s}`,t[s]),r+=`--${s}: ${t[s]};`;n[Jf]=r}}const ay=/(^|;)\\s*display\\s*:/;function cy(e,t,n){const r=e.style,s=ae(n);let i=!1;if(n&&!s){if(t)if(ae(t))for(const o of t.split(\";\")){const l=o.slice(0,o.indexOf(\":\")).trim();n[l]==null&&Ws(r,l,\"\")}else for(const o in t)n[o]==null&&Ws(r,o,\"\");for(const o in n)o===\"display\"&&(i=!0),Ws(r,o,n[o])}else if(s){if(t!==n){const o=r[Jf];o&&(n+=\";\"+o),r.cssText=n,i=ay.test(n)}}else t&&e.removeAttribute(\"style\");hi in e&&(e[hi]=i?r.display:\"\",e[zf]&&(r.display=\"none\"))}const Ga=/\\s*!important$/;function Ws(e,t,n){if(z(n))n.forEach(r=>Ws(e,t,r));else if(n==null&&(n=\"\"),t.startsWith(\"--\"))e.setProperty(t,n);else{const r=uy(e,t);Ga.test(n)?e.setProperty(Ct(r),n.replace(Ga,\"\"),\"important\"):e[r]=n}}const Ja=[\"Webkit\",\"Moz\",\"ms\"],wo={};function uy(e,t){const n=wo[t];if(n)return n;let r=Ie(t);if(r!==\"filter\"&&r in e)return wo[t]=r;r=er(r);for(let s=0;s<Ja.length;s++){const i=Ja[s]+r;if(i in e)return wo[t]=i}return t}const Xa=\"http://www.w3.org/1999/xlink\";function Ya(e,t,n,r,s,i=gp(t)){r&&t.startsWith(\"xlink:\")?n==null?e.removeAttributeNS(Xa,t.slice(6,t.length)):e.setAttributeNS(Xa,t,n):n==null||i&&!cu(n)?e.removeAttribute(t):e.setAttribute(t,i?\"\":Nt(n)?String(n):n)}function Qa(e,t,n,r,s){if(t===\"innerHTML\"||t===\"textContent\"){n!=null&&(e[t]=t===\"innerHTML\"?Hf(n):n);return}const i=e.tagName;if(t===\"value\"&&i!==\"PROGRESS\"&&!i.includes(\"-\")){const l=i===\"OPTION\"?e.getAttribute(\"value\")||\"\":e.value,a=n==null?e.type===\"checkbox\"?\"on\":\"\":String(n);(l!==a||!(\"_value\"in e))&&(e.value=a),n==null&&e.removeAttribute(t),e._value=n;return}let o=!1;if(n===\"\"||n==null){const l=typeof e[t];l===\"boolean\"?n=cu(n):n==null&&l===\"string\"?(n=\"\",o=!0):l===\"number\"&&(n=0,o=!0)}try{e[t]=n}catch{}o&&e.removeAttribute(s||t)}function cn(e,t,n,r){e.addEventListener(t,n,r)}function fy(e,t,n,r){e.removeEventListener(t,n,r)}const ec=Symbol(\"_vei\");function dy(e,t,n,r,s=null){const i=e[ec]||(e[ec]={}),o=i[t];if(r&&o)o.value=r;else{const[l,a]=hy(t);if(r){const c=i[t]=gy(r,s);cn(e,l,c,a)}else o&&(fy(e,l,o,a),i[t]=void 0)}}const tc=/(?:Once|Passive|Capture)$/;function hy(e){let t;if(tc.test(e)){t={};let r;for(;r=e.match(tc);)e=e.slice(0,e.length-r[0].length),t[r[0].toLowerCase()]=!0}return[e[2]===\":\"?e.slice(3):Ct(e.slice(2)),t]}let Oo=0;const py=Promise.resolve(),my=()=>Oo||(py.then(()=>Oo=0),Oo=Date.now());function gy(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Ut(yy(r,n.value),t,5,[r])};return n.value=e,n.attached=my(),n}function yy(e,t){if(z(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const nc=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,by=(e,t,n,r,s,i)=>{const o=s===\"svg\";t===\"class\"?iy(e,r,o):t===\"style\"?cy(e,n,r):Yn(t)?_l(t)||dy(e,t,n,r,i):(t[0]===\".\"?(t=t.slice(1),!0):t[0]===\"^\"?(t=t.slice(1),!1):vy(e,t,r,o))?(Qa(e,t,r),!e.tagName.includes(\"-\")&&(t===\"value\"||t===\"checked\"||t===\"selected\")&&Ya(e,t,r,o,i,t!==\"value\")):e._isVueCE&&(/[A-Z]/.test(t)||!ae(r))?Qa(e,Ie(t),r,i,t):(t===\"true-value\"?e._trueValue=r:t===\"false-value\"&&(e._falseValue=r),Ya(e,t,r,o))};function vy(e,t,n,r){if(r)return!!(t===\"innerHTML\"||t===\"textContent\"||t in e&&nc(t)&&ie(n));if(t===\"spellcheck\"||t===\"draggable\"||t===\"translate\"||t===\"form\"||t===\"list\"&&e.tagName===\"INPUT\"||t===\"type\"&&e.tagName===\"TEXTAREA\")return!1;if(t===\"width\"||t===\"height\"){const s=e.tagName;if(s===\"IMG\"||s===\"VIDEO\"||s===\"CANVAS\"||s===\"SOURCE\")return!1}return nc(t)&&ae(n)?!1:t in e}const rc={};/*! #__NO_SIDE_EFFECTS__ */function Xf(e,t,n){const r=wr(e,t);Pi(r)&&he(r,t);class s extends Ji{constructor(o){super(r,o,n)}}return s.def=r,s}/*! #__NO_SIDE_EFFECTS__ */const _y=(e,t)=>Xf(e,t,cd),Sy=typeof HTMLElement<\"u\"?HTMLElement:class{};class Ji extends Sy{constructor(t,n={},r=yi){super(),this._def=t,this._props=n,this._createApp=r,this._isVueCE=!0,this._instance=null,this._app=null,this._nonce=this._def.nonce,this._connected=!1,this._resolved=!1,this._numberProps=null,this._styleChildren=new WeakSet,this._ob=null,this.shadowRoot&&r!==yi?this._root=this.shadowRoot:t.shadowRoot!==!1?(this.attachShadow({mode:\"open\"}),this._root=this.shadowRoot):this._root=this,this._def.__asyncLoader||this._resolveProps(this._def)}connectedCallback(){if(!this.isConnected)return;this.shadowRoot||this._parseSlots(),this._connected=!0;let t=this;for(;t=t&&(t.parentNode||t.host);)if(t instanceof Ji){this._parent=t;break}this._instance||(this._resolved?(this._setParent(),this._update()):t&&t._pendingResolve?this._pendingResolve=t._pendingResolve.then(()=>{this._pendingResolve=void 0,this._resolveDef()}):this._resolveDef())}_setParent(t=this._parent){t&&(this._instance.parent=t._instance,this._instance.provides=t._instance.provides)}disconnectedCallback(){this._connected=!1,At(()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),this._app&&this._app.unmount(),this._instance&&(this._instance.ce=void 0),this._app=this._instance=null)})}_resolveDef(){if(this._pendingResolve)return;for(let r=0;r<this.attributes.length;r++)this._setAttr(this.attributes[r].name);this._ob=new MutationObserver(r=>{for(const s of r)this._setAttr(s.attributeName)}),this._ob.observe(this,{attributes:!0});const t=(r,s=!1)=>{this._resolved=!0,this._pendingResolve=void 0;const{props:i,styles:o}=r;let l;if(i&&!z(i))for(const a in i){const c=i[a];(c===Number||c&&c.type===Number)&&(a in this._props&&(this._props[a]=ni(this._props[a])),(l||(l=Object.create(null)))[Ie(a)]=!0)}this._numberProps=l,s&&this._resolveProps(r),this.shadowRoot&&this._applyStyles(o),this._mount(r)},n=this._def.__asyncLoader;n?this._pendingResolve=n().then(r=>t(this._def=r,!0)):t(this._def)}_mount(t){this._app=this._createApp(t),t.configureApp&&t.configureApp(this._app),this._app._ceVNode=this._createVNode(),this._app.mount(this._root);const n=this._instance&&this._instance.exposed;if(n)for(const r in n)be(this,r)||Object.defineProperty(this,r,{get:()=>Te(n[r])})}_resolveProps(t){const{props:n}=t,r=z(n)?n:Object.keys(n||{});for(const s of Object.keys(this))s[0]!==\"_\"&&r.includes(s)&&this._setProp(s,this[s]);for(const s of r.map(Ie))Object.defineProperty(this,s,{get(){return this._getProp(s)},set(i){this._setProp(s,i,!0,!0)}})}_setAttr(t){if(t.startsWith(\"data-v-\"))return;const n=this.hasAttribute(t);let r=n?this.getAttribute(t):rc;const s=Ie(t);n&&this._numberProps&&this._numberProps[s]&&(r=ni(r)),this._setProp(s,r,!1,!0)}_getProp(t){return this._props[t]}_setProp(t,n,r=!0,s=!1){if(n!==this._props[t]&&(n===rc?delete this._props[t]:(this._props[t]=n,t===\"key\"&&this._app&&(this._app._ceVNode.key=n)),s&&this._instance&&this._update(),r)){const i=this._ob;i&&i.disconnect(),n===!0?this.setAttribute(Ct(t),\"\"):typeof n==\"string\"||typeof n==\"number\"?this.setAttribute(Ct(t),n+\"\"):n||this.removeAttribute(Ct(t)),i&&i.observe(this,{attributes:!0})}}_update(){ad(this._createVNode(),this._root)}_createVNode(){const t={};this.shadowRoot||(t.onVnodeMounted=t.onVnodeUpdated=this._renderSlots.bind(this));const n=xe(this._def,he(t,this._props));return this._instance||(n.ce=r=>{this._instance=r,r.ce=this,r.isCE=!0;const s=(i,o)=>{this.dispatchEvent(new CustomEvent(i,Pi(o[0])?he({detail:o},o[0]):{detail:o}))};r.emit=(i,...o)=>{s(i,o),Ct(i)!==i&&s(Ct(i),o)},this._setParent()}),n}_applyStyles(t,n){if(!t)return;if(n){if(n===this._def||this._styleChildren.has(n))return;this._styleChildren.add(n)}const r=this._nonce;for(let s=t.length-1;s>=0;s--){const i=document.createElement(\"style\");r&&i.setAttribute(\"nonce\",r),i.textContent=t[s],this.shadowRoot.prepend(i)}}_parseSlots(){const t=this._slots={};let n;for(;n=this.firstChild;){const r=n.nodeType===1&&n.getAttribute(\"slot\")||\"default\";(t[r]||(t[r]=[])).push(n),this.removeChild(n)}}_renderSlots(){const t=(this._teleportTarget||this).querySelectorAll(\"slot\"),n=this._instance.type.__scopeId;for(let r=0;r<t.length;r++){const s=t[r],i=s.getAttribute(\"name\")||\"default\",o=this._slots[i],l=s.parentNode;if(o)for(const a of o){if(n&&a.nodeType===1){const c=n+\"-s\",u=document.createTreeWalker(a,1);a.setAttribute(c,\"\");let f;for(;f=u.nextNode();)f.setAttribute(c,\"\")}l.insertBefore(a,s)}else for(;s.firstChild;)l.insertBefore(s.firstChild,s);l.removeChild(s)}}_injectChildStyle(t){this._applyStyles(t.styles,t)}_removeChildStyle(t){}}function Yf(e){const t=dt(),n=t&&t.ce;return n||null}function Ey(){const e=Yf();return e&&e.shadowRoot}function Ay(e=\"$style\"){{const t=dt();if(!t)return de;const n=t.type.__cssModules;if(!n)return de;const r=n[e];return r||de}}const Qf=new WeakMap,ed=new WeakMap,mi=Symbol(\"_moveCb\"),sc=Symbol(\"_enterCb\"),Ty=e=>(delete e.props.mode,e),Cy=Ty({name:\"TransitionGroup\",props:he({},Kf,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=dt(),r=Pl();let s,i;return Ki(()=>{if(!s.length)return;const o=e.moveClass||`${e.name||\"v\"}-move`;if(!xy(s[0].el,n.vnode.el,o))return;s.forEach(Oy),s.forEach(Ny);const l=s.filter(Ry);Qo(),l.forEach(a=>{const c=a.el,u=c.style;Xt(c,o),u.transform=u.webkitTransform=u.transitionDuration=\"\";const f=c[mi]=d=>{d&&d.target!==c||(!d||/transform$/.test(d.propertyName))&&(c.removeEventListener(\"transitionend\",f),c[mi]=null,gn(c,o))};c.addEventListener(\"transitionend\",f)})}),()=>{const o=me(e),l=Wf(o);let a=o.tag||Ze;if(s=[],i)for(let c=0;c<i.length;c++){const u=i[c];u.el&&u.el instanceof Element&&(s.push(u),fn(u,mr(u,l,r,n)),Qf.set(u,u.el.getBoundingClientRect()))}i=t.default?Hi(t.default()):[];for(let c=0;c<i.length;c++){const u=i[c];u.key!=null&&fn(u,mr(u,l,r,n))}return xe(a,null,i)}}}),wy=Cy;function Oy(e){const t=e.el;t[mi]&&t[mi](),t[sc]&&t[sc]()}function Ny(e){ed.set(e,e.el.getBoundingClientRect())}function Ry(e){const t=Qf.get(e),n=ed.get(e),r=t.left-n.left,s=t.top-n.top;if(r||s){const i=e.el.style;return i.transform=i.webkitTransform=`translate(${r}px,${s}px)`,i.transitionDuration=\"0s\",e}}function xy(e,t,n){const r=e.cloneNode(),s=e[br];s&&s.forEach(l=>{l.split(/\\s+/).forEach(a=>a&&r.classList.remove(a))}),n.split(/\\s+/).forEach(l=>l&&r.classList.add(l)),r.style.display=\"none\";const i=t.nodeType===1?t:t.parentNode;i.appendChild(r);const{hasTransform:o}=Zf(r);return i.removeChild(r),o}const In=e=>{const t=e.props[\"onUpdate:modelValue\"]||!1;return z(t)?n=>dr(t,n):t};function Iy(e){e.target.composing=!0}function ic(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event(\"input\")))}const jt=Symbol(\"_assign\"),gi={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[jt]=In(s);const i=r||s.props&&s.props.type===\"number\";cn(e,t?\"change\":\"input\",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=ti(l)),e[jt](l)}),n&&cn(e,\"change\",()=>{e.value=e.value.trim()}),t||(cn(e,\"compositionstart\",Iy),cn(e,\"compositionend\",ic),cn(e,\"change\",ic))},mounted(e,{value:t}){e.value=t??\"\"},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:s,number:i}},o){if(e[jt]=In(o),e.composing)return;const l=(i||e.type===\"number\")&&!/^0\\d/.test(e.value)?ti(e.value):e.value,a=t??\"\";l!==a&&(document.activeElement===e&&e.type!==\"range\"&&(r&&t===n||s&&e.value.trim()===a)||(e.value=a))}},Kl={deep:!0,created(e,t,n){e[jt]=In(n),cn(e,\"change\",()=>{const r=e._modelValue,s=vr(e),i=e.checked,o=e[jt];if(z(r)){const l=Mi(r,s),a=l!==-1;if(i&&!a)o(r.concat(s));else if(!i&&a){const c=[...r];c.splice(l,1),o(c)}}else if(Qn(r)){const l=new Set(r);i?l.add(s):l.delete(s),o(l)}else o(nd(e,i))})},mounted:oc,beforeUpdate(e,t,n){e[jt]=In(n),oc(e,t,n)}};function oc(e,{value:t,oldValue:n},r){e._modelValue=t;let s;if(z(t))s=Mi(t,r.props.value)>-1;else if(Qn(t))s=t.has(r.props.value);else{if(t===n)return;s=Nn(t,nd(e,!0))}e.checked!==s&&(e.checked=s)}const Wl={created(e,{value:t},n){e.checked=Nn(t,n.props.value),e[jt]=In(n),cn(e,\"change\",()=>{e[jt](vr(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[jt]=In(r),t!==n&&(e.checked=Nn(t,r.props.value))}},td={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const s=Qn(t);cn(e,\"change\",()=>{const i=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>n?ti(vr(o)):vr(o));e[jt](e.multiple?s?new Set(i):i:i[0]),e._assigning=!0,At(()=>{e._assigning=!1})}),e[jt]=In(r)},mounted(e,{value:t}){lc(e,t)},beforeUpdate(e,t,n){e[jt]=In(n)},updated(e,{value:t}){e._assigning||lc(e,t)}};function lc(e,t){const n=e.multiple,r=z(t);if(!(n&&!r&&!Qn(t))){for(let s=0,i=e.options.length;s<i;s++){const o=e.options[s],l=vr(o);if(n)if(r){const a=typeof l;a===\"string\"||a===\"number\"?o.selected=t.some(c=>String(c)===String(l)):o.selected=Mi(t,l)>-1}else o.selected=t.has(l);else if(Nn(vr(o),t)){e.selectedIndex!==s&&(e.selectedIndex=s);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function vr(e){return\"_value\"in e?e._value:e.value}function nd(e,t){const n=t?\"_trueValue\":\"_falseValue\";return n in e?e[n]:t}const rd={created(e,t,n){Ps(e,t,n,null,\"created\")},mounted(e,t,n){Ps(e,t,n,null,\"mounted\")},beforeUpdate(e,t,n,r){Ps(e,t,n,r,\"beforeUpdate\")},updated(e,t,n,r){Ps(e,t,n,r,\"updated\")}};function sd(e,t){switch(e){case\"SELECT\":return td;case\"TEXTAREA\":return gi;default:switch(t){case\"checkbox\":return Kl;case\"radio\":return Wl;default:return gi}}}function Ps(e,t,n,r,s){const o=sd(e.tagName,n.props&&n.props.type)[s];o&&o(e,t,n,r)}function Py(){gi.getSSRProps=({value:e})=>({value:e}),Wl.getSSRProps=({value:e},t)=>{if(t.props&&Nn(t.props.value,e))return{checked:!0}},Kl.getSSRProps=({value:e},t)=>{if(z(e)){if(t.props&&Mi(e,t.props.value)>-1)return{checked:!0}}else if(Qn(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},rd.getSSRProps=(e,t)=>{if(typeof t.type!=\"string\")return;const n=sd(t.type.toUpperCase(),t.props&&t.props.type);if(n.getSSRProps)return n.getSSRProps(e,t)}}const ky=[\"ctrl\",\"shift\",\"alt\",\"meta\"],Vy={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>\"button\"in e&&e.button!==0,middle:e=>\"button\"in e&&e.button!==1,right:e=>\"button\"in e&&e.button!==2,exact:(e,t)=>ky.some(n=>e[`${n}Key`]&&!t.includes(n))},My=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(\".\");return n[r]||(n[r]=(s,...i)=>{for(let o=0;o<t.length;o++){const l=Vy[t[o]];if(l&&l(s,t))return}return e(s,...i)})},Fy={esc:\"escape\",space:\" \",up:\"arrow-up\",left:\"arrow-left\",right:\"arrow-right\",down:\"arrow-down\",delete:\"backspace\"},Ly=(e,t)=>{const n=e._withKeys||(e._withKeys={}),r=t.join(\".\");return n[r]||(n[r]=s=>{if(!(\"key\"in s))return;const i=Ct(s.key);if(t.some(o=>o===i||Fy[o]===i))return e(s)})},id=he({patchProp:by},ey);let Kr,ac=!1;function od(){return Kr||(Kr=gf(id))}function ld(){return Kr=ac?Kr:yf(id),ac=!0,Kr}const ad=(...e)=>{od().render(...e)},$y=(...e)=>{ld().hydrate(...e)},yi=(...e)=>{const t=od().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=fd(r);if(!s)return;const i=t._component;!ie(i)&&!i.render&&!i.template&&(i.template=s.innerHTML),s.nodeType===1&&(s.textContent=\"\");const o=n(s,!1,ud(s));return s instanceof Element&&(s.removeAttribute(\"v-cloak\"),s.setAttribute(\"data-v-app\",\"\")),o},t},cd=(...e)=>{const t=ld().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=fd(r);if(s)return n(s,!0,ud(s))},t};function ud(e){if(e instanceof SVGElement)return\"svg\";if(typeof MathMLElement==\"function\"&&e instanceof MathMLElement)return\"mathml\"}function fd(e){return ae(e)?document.querySelector(e):e}let cc=!1;const Dy=()=>{cc||(cc=!0,Py(),oy())},By=Object.freeze(Object.defineProperty({__proto__:null,BaseTransition:Wu,BaseTransitionPropsValidators:kl,Comment:Be,DeprecationTypes:Xg,EffectScope:Tl,ErrorCodes:sm,ErrorTypeStrings:qg,Fragment:Ze,KeepAlive:Im,ReactiveEffect:Zr,Static:qn,Suspense:Tg,Teleport:hm,Text:wn,TrackOpTypes:Xp,Transition:ny,TransitionGroup:wy,TriggerOpTypes:Yp,VueElement:Ji,assertNumber:rm,callWithAsyncErrorHandling:Ut,callWithErrorHandling:Cr,camelize:Ie,capitalize:er,cloneVNode:en,compatUtils:Jg,computed:ge,createApp:yi,createBlock:ui,createCommentVNode:Vg,createElementBlock:xg,createElementVNode:Ul,createHydrationRenderer:yf,createPropsRestProxy:Ym,createRenderer:gf,createSSRApp:cd,createSlots:Lm,createStaticVNode:kg,createTextVNode:Hl,createVNode:xe,customRef:Pu,defineAsyncComponent:Rm,defineComponent:wr,defineCustomElement:Xf,defineEmits:Um,defineExpose:Hm,defineModel:Wm,defineOptions:qm,defineProps:jm,defineSSRCustomElement:_y,defineSlots:Km,devtools:Kg,effect:Sp,effectScope:bp,getCurrentInstance:dt,getCurrentScope:hu,getCurrentWatcher:Qp,getTransitionRawChildren:Hi,guardReactiveProps:kf,h:yr,handleError:tr,hasInjectionContext:lg,hydrate:$y,hydrateOnIdle:Am,hydrateOnInteraction:Om,hydrateOnMediaQuery:wm,hydrateOnVisible:Cm,initCustomFormatter:jg,initDirectivesForSSR:Dy,inject:Hn,isMemoSame:jf,isProxy:ji,isReactive:Tn,isReadonly:xn,isRef:Ve,isRuntimeOnly:$g,isShallow:Pt,isVNode:dn,markRaw:xu,mergeDefaults:Jm,mergeModels:Xm,mergeProps:Vf,nextTick:At,normalizeClass:hs,normalizeProps:op,normalizeStyle:ds,onActivated:zu,onBeforeMount:Xu,onBeforeUnmount:ms,onBeforeUpdate:Ml,onDeactivated:Gu,onErrorCaptured:tf,onMounted:nr,onRenderTracked:ef,onRenderTriggered:Qu,onScopeDispose:vp,onServerPrefetch:Yu,onUnmounted:Wi,onUpdated:Ki,onWatcherCleanup:Vu,openBlock:rs,popScopeId:cm,provide:ts,proxyRefs:Rl,pushScopeId:am,queuePostFlushCb:Jr,reactive:Rn,readonly:Di,ref:at,registerRuntimeCompiler:$f,render:ad,renderList:Fm,renderSlot:$m,resolveComponent:Vm,resolveDirective:Mm,resolveDynamicComponent:Zi,resolveFilter:Gg,resolveTransitionHooks:mr,setBlockTracking:Wo,setDevtoolsHook:Wg,setTransitionHooks:fn,shallowReactive:Ru,shallowReadonly:jp,shallowRef:Nl,ssrContextKey:Sf,ssrUtils:zg,stop:Ep,toDisplayString:fu,toHandlerKey:fr,toHandlers:Dm,toRaw:me,toRef:En,toRefs:Wp,toValue:ne,transformVNodeArgs:Ig,triggerRef:Hp,unref:Te,useAttrs:Gm,useCssModule:Ay,useCssVars:ly,useHost:Yf,useId:mm,useModel:yg,useSSRContext:Ef,useShadowRoot:Ey,useSlots:zm,useTemplateRef:gm,useTransitionState:Pl,vModelCheckbox:Kl,vModelDynamic:rd,vModelRadio:Wl,vModelSelect:td,vModelText:gi,vShow:Gf,version:Uf,warn:Hg,watch:kt,watchEffect:Af,watchPostEffect:mg,watchSyncEffect:Tf,withAsyncContext:Qm,withCtx:Il,withDefaults:Zm,withDirectives:fm,withKeys:Ly,withMemo:Ug,withModifiers:My,withScopeId:um},Symbol.toStringTag,{value:\"Module\"}));/**\n* @vue/compiler-core v3.5.13\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/const ss=Symbol(\"\"),Wr=Symbol(\"\"),Zl=Symbol(\"\"),bi=Symbol(\"\"),dd=Symbol(\"\"),Gn=Symbol(\"\"),hd=Symbol(\"\"),pd=Symbol(\"\"),zl=Symbol(\"\"),Gl=Symbol(\"\"),bs=Symbol(\"\"),Jl=Symbol(\"\"),md=Symbol(\"\"),Xl=Symbol(\"\"),Yl=Symbol(\"\"),Ql=Symbol(\"\"),ea=Symbol(\"\"),ta=Symbol(\"\"),na=Symbol(\"\"),gd=Symbol(\"\"),yd=Symbol(\"\"),Xi=Symbol(\"\"),vi=Symbol(\"\"),ra=Symbol(\"\"),sa=Symbol(\"\"),is=Symbol(\"\"),vs=Symbol(\"\"),ia=Symbol(\"\"),tl=Symbol(\"\"),jy=Symbol(\"\"),nl=Symbol(\"\"),_i=Symbol(\"\"),Uy=Symbol(\"\"),Hy=Symbol(\"\"),oa=Symbol(\"\"),qy=Symbol(\"\"),Ky=Symbol(\"\"),la=Symbol(\"\"),bd=Symbol(\"\"),_r={[ss]:\"Fragment\",[Wr]:\"Teleport\",[Zl]:\"Suspense\",[bi]:\"KeepAlive\",[dd]:\"BaseTransition\",[Gn]:\"openBlock\",[hd]:\"createBlock\",[pd]:\"createElementBlock\",[zl]:\"createVNode\",[Gl]:\"createElementVNode\",[bs]:\"createCommentVNode\",[Jl]:\"createTextVNode\",[md]:\"createStaticVNode\",[Xl]:\"resolveComponent\",[Yl]:\"resolveDynamicComponent\",[Ql]:\"resolveDirective\",[ea]:\"resolveFilter\",[ta]:\"withDirectives\",[na]:\"renderList\",[gd]:\"renderSlot\",[yd]:\"createSlots\",[Xi]:\"toDisplayString\",[vi]:\"mergeProps\",[ra]:\"normalizeClass\",[sa]:\"normalizeStyle\",[is]:\"normalizeProps\",[vs]:\"guardReactiveProps\",[ia]:\"toHandlers\",[tl]:\"camelize\",[jy]:\"capitalize\",[nl]:\"toHandlerKey\",[_i]:\"setBlockTracking\",[Uy]:\"pushScopeId\",[Hy]:\"popScopeId\",[oa]:\"withCtx\",[qy]:\"unref\",[Ky]:\"isRef\",[la]:\"withMemo\",[bd]:\"isMemoSame\"};function Wy(e){Object.getOwnPropertySymbols(e).forEach(t=>{_r[t]=e[t]})}const Ft={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0},source:\"\"};function Zy(e,t=\"\"){return{type:0,source:t,children:e,helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:[],temps:0,codegenNode:void 0,loc:Ft}}function os(e,t,n,r,s,i,o,l=!1,a=!1,c=!1,u=Ft){return e&&(l?(e.helper(Gn),e.helper(Ar(e.inSSR,c))):e.helper(Er(e.inSSR,c)),o&&e.helper(ta)),{type:13,tag:t,props:n,children:r,patchFlag:s,dynamicProps:i,directives:o,isBlock:l,disableTracking:a,isComponent:c,loc:u}}function Kn(e,t=Ft){return{type:17,loc:t,elements:e}}function Bt(e,t=Ft){return{type:15,loc:t,properties:e}}function $e(e,t){return{type:16,loc:Ft,key:ae(e)?ue(e,!0):e,value:t}}function ue(e,t=!1,n=Ft,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function Zt(e,t=Ft){return{type:8,loc:t,children:e}}function He(e,t=[],n=Ft){return{type:14,loc:n,callee:e,arguments:t}}function Sr(e,t=void 0,n=!1,r=!1,s=Ft){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:s}}function rl(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:Ft}}function zy(e,t,n=!1,r=!1){return{type:20,index:e,value:t,needPauseTracking:n,inVOnce:r,needArraySpread:!1,loc:Ft}}function Gy(e){return{type:21,body:e,loc:Ft}}function Er(e,t){return e||t?zl:Gl}function Ar(e,t){return e||t?hd:pd}function aa(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(Er(r,e.isComponent)),t(Gn),t(Ar(r,e.isComponent)))}const uc=new Uint8Array([123,123]),fc=new Uint8Array([125,125]);function dc(e){return e>=97&&e<=122||e>=65&&e<=90}function xt(e){return e===32||e===10||e===9||e===12||e===13}function mn(e){return e===47||e===62||xt(e)}function Si(e){const t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t}const st={Cdata:new Uint8Array([67,68,65,84,65,91]),CdataEnd:new Uint8Array([93,93,62]),CommentEnd:new Uint8Array([45,45,62]),ScriptEnd:new Uint8Array([60,47,115,99,114,105,112,116]),StyleEnd:new Uint8Array([60,47,115,116,121,108,101]),TitleEnd:new Uint8Array([60,47,116,105,116,108,101]),TextareaEnd:new Uint8Array([60,47,116,101,120,116,97,114,101,97])};class Jy{constructor(t,n){this.stack=t,this.cbs=n,this.state=1,this.buffer=\"\",this.sectionStart=0,this.index=0,this.entityStart=0,this.baseState=1,this.inRCDATA=!1,this.inXML=!1,this.inVPre=!1,this.newlines=[],this.mode=0,this.delimiterOpen=uc,this.delimiterClose=fc,this.delimiterIndex=-1,this.currentSequence=void 0,this.sequenceIndex=0}get inSFCRoot(){return this.mode===2&&this.stack.length===0}reset(){this.state=1,this.mode=0,this.buffer=\"\",this.sectionStart=0,this.index=0,this.baseState=1,this.inRCDATA=!1,this.currentSequence=void 0,this.newlines.length=0,this.delimiterOpen=uc,this.delimiterClose=fc}getPos(t){let n=1,r=t+1;for(let s=this.newlines.length-1;s>=0;s--){const i=this.newlines[s];if(t>i){n=s+2,r=t-i;break}}return{column:r,line:n,offset:t}}peek(){return this.buffer.charCodeAt(this.index+1)}stateText(t){t===60?(this.index>this.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=5,this.sectionStart=this.index):!this.inVPre&&t===this.delimiterOpen[0]&&(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(t))}stateInterpolationOpen(t){if(t===this.delimiterOpen[this.delimiterIndex])if(this.delimiterIndex===this.delimiterOpen.length-1){const n=this.index+1-this.delimiterOpen.length;n>this.sectionStart&&this.cbs.ontext(this.sectionStart,n),this.state=3,this.sectionStart=n}else this.delimiterIndex++;else this.inRCDATA?(this.state=32,this.stateInRCDATA(t)):(this.state=1,this.stateText(t))}stateInterpolation(t){t===this.delimiterClose[0]&&(this.state=4,this.delimiterIndex=0,this.stateInterpolationClose(t))}stateInterpolationClose(t){t===this.delimiterClose[this.delimiterIndex]?this.delimiterIndex===this.delimiterClose.length-1?(this.cbs.oninterpolation(this.sectionStart,this.index+1),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):this.delimiterIndex++:(this.state=3,this.stateInterpolation(t))}stateSpecialStartSequence(t){const n=this.sequenceIndex===this.currentSequence.length;if(!(n?mn(t):(t|32)===this.currentSequence[this.sequenceIndex]))this.inRCDATA=!1;else if(!n){this.sequenceIndex++;return}this.sequenceIndex=0,this.state=6,this.stateInTagName(t)}stateInRCDATA(t){if(this.sequenceIndex===this.currentSequence.length){if(t===62||xt(t)){const n=this.index-this.currentSequence.length;if(this.sectionStart<n){const r=this.index;this.index=n,this.cbs.ontext(this.sectionStart,n),this.index=r}this.sectionStart=n+2,this.stateInClosingTagName(t),this.inRCDATA=!1;return}this.sequenceIndex=0}(t|32)===this.currentSequence[this.sequenceIndex]?this.sequenceIndex+=1:this.sequenceIndex===0?this.currentSequence===st.TitleEnd||this.currentSequence===st.TextareaEnd&&!this.inSFCRoot?!this.inVPre&&t===this.delimiterOpen[0]&&(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(t)):this.fastForwardTo(60)&&(this.sequenceIndex=1):this.sequenceIndex=+(t===60)}stateCDATASequence(t){t===st.Cdata[this.sequenceIndex]?++this.sequenceIndex===st.Cdata.length&&(this.state=28,this.currentSequence=st.CdataEnd,this.sequenceIndex=0,this.sectionStart=this.index+1):(this.sequenceIndex=0,this.state=23,this.stateInDeclaration(t))}fastForwardTo(t){for(;++this.index<this.buffer.length;){const n=this.buffer.charCodeAt(this.index);if(n===10&&this.newlines.push(this.index),n===t)return!0}return this.index=this.buffer.length-1,!1}stateInCommentLike(t){t===this.currentSequence[this.sequenceIndex]?++this.sequenceIndex===this.currentSequence.length&&(this.currentSequence===st.CdataEnd?this.cbs.oncdata(this.sectionStart,this.index-2):this.cbs.oncomment(this.sectionStart,this.index-2),this.sequenceIndex=0,this.sectionStart=this.index+1,this.state=1):this.sequenceIndex===0?this.fastForwardTo(this.currentSequence[0])&&(this.sequenceIndex=1):t!==this.currentSequence[this.sequenceIndex-1]&&(this.sequenceIndex=0)}startSpecial(t,n){this.enterRCDATA(t,n),this.state=31}enterRCDATA(t,n){this.inRCDATA=!0,this.currentSequence=t,this.sequenceIndex=n}stateBeforeTagName(t){t===33?(this.state=22,this.sectionStart=this.index+1):t===63?(this.state=24,this.sectionStart=this.index+1):dc(t)?(this.sectionStart=this.index,this.mode===0?this.state=6:this.inSFCRoot?this.state=34:this.inXML?this.state=6:t===116?this.state=30:this.state=t===115?29:6):t===47?this.state=8:(this.state=1,this.stateText(t))}stateInTagName(t){mn(t)&&this.handleTagName(t)}stateInSFCRootTagName(t){if(mn(t)){const n=this.buffer.slice(this.sectionStart,this.index);n!==\"template\"&&this.enterRCDATA(Si(\"</\"+n),0),this.handleTagName(t)}}handleTagName(t){this.cbs.onopentagname(this.sectionStart,this.index),this.sectionStart=-1,this.state=11,this.stateBeforeAttrName(t)}stateBeforeClosingTagName(t){xt(t)||(t===62?(this.state=1,this.sectionStart=this.index+1):(this.state=dc(t)?9:27,this.sectionStart=this.index))}stateInClosingTagName(t){(t===62||xt(t))&&(this.cbs.onclosetag(this.sectionStart,this.index),this.sectionStart=-1,this.state=10,this.stateAfterClosingTagName(t))}stateAfterClosingTagName(t){t===62&&(this.state=1,this.sectionStart=this.index+1)}stateBeforeAttrName(t){t===62?(this.cbs.onopentagend(this.index),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):t===47?this.state=7:t===60&&this.peek()===47?(this.cbs.onopentagend(this.index),this.state=5,this.sectionStart=this.index):xt(t)||this.handleAttrStart(t)}handleAttrStart(t){t===118&&this.peek()===45?(this.state=13,this.sectionStart=this.index):t===46||t===58||t===64||t===35?(this.cbs.ondirname(this.index,this.index+1),this.state=14,this.sectionStart=this.index+1):(this.state=12,this.sectionStart=this.index)}stateInSelfClosingTag(t){t===62?(this.cbs.onselfclosingtag(this.index),this.state=1,this.sectionStart=this.index+1,this.inRCDATA=!1):xt(t)||(this.state=11,this.stateBeforeAttrName(t))}stateInAttrName(t){(t===61||mn(t))&&(this.cbs.onattribname(this.sectionStart,this.index),this.handleAttrNameEnd(t))}stateInDirName(t){t===61||mn(t)?(this.cbs.ondirname(this.sectionStart,this.index),this.handleAttrNameEnd(t)):t===58?(this.cbs.ondirname(this.sectionStart,this.index),this.state=14,this.sectionStart=this.index+1):t===46&&(this.cbs.ondirname(this.sectionStart,this.index),this.state=16,this.sectionStart=this.index+1)}stateInDirArg(t){t===61||mn(t)?(this.cbs.ondirarg(this.sectionStart,this.index),this.handleAttrNameEnd(t)):t===91?this.state=15:t===46&&(this.cbs.ondirarg(this.sectionStart,this.index),this.state=16,this.sectionStart=this.index+1)}stateInDynamicDirArg(t){t===93?this.state=14:(t===61||mn(t))&&(this.cbs.ondirarg(this.sectionStart,this.index+1),this.handleAttrNameEnd(t))}stateInDirModifier(t){t===61||mn(t)?(this.cbs.ondirmodifier(this.sectionStart,this.index),this.handleAttrNameEnd(t)):t===46&&(this.cbs.ondirmodifier(this.sectionStart,this.index),this.sectionStart=this.index+1)}handleAttrNameEnd(t){this.sectionStart=this.index,this.state=17,this.cbs.onattribnameend(this.index),this.stateAfterAttrName(t)}stateAfterAttrName(t){t===61?this.state=18:t===47||t===62?(this.cbs.onattribend(0,this.sectionStart),this.sectionStart=-1,this.state=11,this.stateBeforeAttrName(t)):xt(t)||(this.cbs.onattribend(0,this.sectionStart),this.handleAttrStart(t))}stateBeforeAttrValue(t){t===34?(this.state=19,this.sectionStart=this.index+1):t===39?(this.state=20,this.sectionStart=this.index+1):xt(t)||(this.sectionStart=this.index,this.state=21,this.stateInAttrValueNoQuotes(t))}handleInAttrValue(t,n){(t===n||this.fastForwardTo(n))&&(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=-1,this.cbs.onattribend(n===34?3:2,this.index+1),this.state=11)}stateInAttrValueDoubleQuotes(t){this.handleInAttrValue(t,34)}stateInAttrValueSingleQuotes(t){this.handleInAttrValue(t,39)}stateInAttrValueNoQuotes(t){xt(t)||t===62?(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=-1,this.cbs.onattribend(1,this.index),this.state=11,this.stateBeforeAttrName(t)):(t===39||t===60||t===61||t===96)&&this.cbs.onerr(18,this.index)}stateBeforeDeclaration(t){t===91?(this.state=26,this.sequenceIndex=0):this.state=t===45?25:23}stateInDeclaration(t){(t===62||this.fastForwardTo(62))&&(this.state=1,this.sectionStart=this.index+1)}stateInProcessingInstruction(t){(t===62||this.fastForwardTo(62))&&(this.cbs.onprocessinginstruction(this.sectionStart,this.index),this.state=1,this.sectionStart=this.index+1)}stateBeforeComment(t){t===45?(this.state=28,this.currentSequence=st.CommentEnd,this.sequenceIndex=2,this.sectionStart=this.index+1):this.state=23}stateInSpecialComment(t){(t===62||this.fastForwardTo(62))&&(this.cbs.oncomment(this.sectionStart,this.index),this.state=1,this.sectionStart=this.index+1)}stateBeforeSpecialS(t){t===st.ScriptEnd[3]?this.startSpecial(st.ScriptEnd,4):t===st.StyleEnd[3]?this.startSpecial(st.StyleEnd,4):(this.state=6,this.stateInTagName(t))}stateBeforeSpecialT(t){t===st.TitleEnd[3]?this.startSpecial(st.TitleEnd,4):t===st.TextareaEnd[3]?this.startSpecial(st.TextareaEnd,4):(this.state=6,this.stateInTagName(t))}startEntity(){}stateInEntity(){}parse(t){for(this.buffer=t;this.index<this.buffer.length;){const n=this.buffer.charCodeAt(this.index);switch(n===10&&this.newlines.push(this.index),this.state){case 1:{this.stateText(n);break}case 2:{this.stateInterpolationOpen(n);break}case 3:{this.stateInterpolation(n);break}case 4:{this.stateInterpolationClose(n);break}case 31:{this.stateSpecialStartSequence(n);break}case 32:{this.stateInRCDATA(n);break}case 26:{this.stateCDATASequence(n);break}case 19:{this.stateInAttrValueDoubleQuotes(n);break}case 12:{this.stateInAttrName(n);break}case 13:{this.stateInDirName(n);break}case 14:{this.stateInDirArg(n);break}case 15:{this.stateInDynamicDirArg(n);break}case 16:{this.stateInDirModifier(n);break}case 28:{this.stateInCommentLike(n);break}case 27:{this.stateInSpecialComment(n);break}case 11:{this.stateBeforeAttrName(n);break}case 6:{this.stateInTagName(n);break}case 34:{this.stateInSFCRootTagName(n);break}case 9:{this.stateInClosingTagName(n);break}case 5:{this.stateBeforeTagName(n);break}case 17:{this.stateAfterAttrName(n);break}case 20:{this.stateInAttrValueSingleQuotes(n);break}case 18:{this.stateBeforeAttrValue(n);break}case 8:{this.stateBeforeClosingTagName(n);break}case 10:{this.stateAfterClosingTagName(n);break}case 29:{this.stateBeforeSpecialS(n);break}case 30:{this.stateBeforeSpecialT(n);break}case 21:{this.stateInAttrValueNoQuotes(n);break}case 7:{this.stateInSelfClosingTag(n);break}case 23:{this.stateInDeclaration(n);break}case 22:{this.stateBeforeDeclaration(n);break}case 25:{this.stateBeforeComment(n);break}case 24:{this.stateInProcessingInstruction(n);break}case 33:{this.stateInEntity();break}}this.index++}this.cleanup(),this.finish()}cleanup(){this.sectionStart!==this.index&&(this.state===1||this.state===32&&this.sequenceIndex===0?(this.cbs.ontext(this.sectionStart,this.index),this.sectionStart=this.index):(this.state===19||this.state===20||this.state===21)&&(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=this.index))}finish(){this.handleTrailingData(),this.cbs.onend()}handleTrailingData(){const t=this.buffer.length;this.sectionStart>=t||(this.state===28?this.currentSequence===st.CdataEnd?this.cbs.oncdata(this.sectionStart,t):this.cbs.oncomment(this.sectionStart,t):this.state===6||this.state===11||this.state===18||this.state===17||this.state===12||this.state===13||this.state===14||this.state===15||this.state===16||this.state===20||this.state===19||this.state===21||this.state===9||this.cbs.ontext(this.sectionStart,t))}emitCodePoint(t,n){}}function hc(e,{compatConfig:t}){const n=t&&t[e];return e===\"MODE\"?n||3:n}function Wn(e,t){const n=hc(\"MODE\",t),r=hc(e,t);return n===3?r===!0:r!==!1}function ls(e,t,n,...r){return Wn(e,t)}function ca(e){throw e}function vd(e){}function ke(e,t,n,r){const s=`https://vuejs.org/error-reference/#compiler-${e}`,i=new SyntaxError(String(s));return i.code=e,i.loc=t,i}const Ot=e=>e.type===4&&e.isStatic;function _d(e){switch(e){case\"Teleport\":case\"teleport\":return Wr;case\"Suspense\":case\"suspense\":return Zl;case\"KeepAlive\":case\"keep-alive\":return bi;case\"BaseTransition\":case\"base-transition\":return dd}}const Xy=/^\\d|[^\\$\\w\\xA0-\\uFFFF]/,ua=e=>!Xy.test(e),Yy=/[A-Za-z_$\\xA0-\\uFFFF]/,Qy=/[\\.\\?\\w$\\xA0-\\uFFFF]/,eb=/\\s+[.[]\\s*|\\s*[.[]\\s+/g,Sd=e=>e.type===4?e.content:e.loc.source,tb=e=>{const t=Sd(e).trim().replace(eb,l=>l.trim());let n=0,r=[],s=0,i=0,o=null;for(let l=0;l<t.length;l++){const a=t.charAt(l);switch(n){case 0:if(a===\"[\")r.push(n),n=1,s++;else if(a===\"(\")r.push(n),n=2,i++;else if(!(l===0?Yy:Qy).test(a))return!1;break;case 1:a===\"'\"||a==='\"'||a===\"`\"?(r.push(n),n=3,o=a):a===\"[\"?s++:a===\"]\"&&(--s||(n=r.pop()));break;case 2:if(a===\"'\"||a==='\"'||a===\"`\")r.push(n),n=3,o=a;else if(a===\"(\")i++;else if(a===\")\"){if(l===t.length-1)return!1;--i||(n=r.pop())}break;case 3:a===o&&(n=r.pop(),o=null);break}}return!s&&!i},Ed=tb,nb=/^\\s*(async\\s*)?(\\([^)]*?\\)|[\\w$_]+)\\s*(:[^=]+)?=>|^\\s*(async\\s+)?function(?:\\s+[\\w$]+)?\\s*\\(/,rb=e=>nb.test(Sd(e)),sb=rb;function Dt(e,t,n=!1){for(let r=0;r<e.props.length;r++){const s=e.props[r];if(s.type===7&&(n||s.exp)&&(ae(t)?s.name===t:t.test(s.name)))return s}}function Yi(e,t,n=!1,r=!1){for(let s=0;s<e.props.length;s++){const i=e.props[s];if(i.type===6){if(n)continue;if(i.name===t&&(i.value||r))return i}else if(i.name===\"bind\"&&(i.exp||r)&&Ln(i.arg,t))return i}}function Ln(e,t){return!!(e&&Ot(e)&&e.content===t)}function ib(e){return e.props.some(t=>t.type===7&&t.name===\"bind\"&&(!t.arg||t.arg.type!==4||!t.arg.isStatic))}function No(e){return e.type===5||e.type===2}function ob(e){return e.type===7&&e.name===\"slot\"}function Ei(e){return e.type===1&&e.tagType===3}function Ai(e){return e.type===1&&e.tagType===2}const lb=new Set([is,vs]);function Ad(e,t=[]){if(e&&!ae(e)&&e.type===14){const n=e.callee;if(!ae(n)&&lb.has(n))return Ad(e.arguments[0],t.concat(e))}return[e,t]}function Ti(e,t,n){let r,s=e.type===13?e.props:e.arguments[2],i=[],o;if(s&&!ae(s)&&s.type===14){const l=Ad(s);s=l[0],i=l[1],o=i[i.length-1]}if(s==null||ae(s))r=Bt([t]);else if(s.type===14){const l=s.arguments[0];!ae(l)&&l.type===15?pc(t,l)||l.properties.unshift(t):s.callee===ia?r=He(n.helper(vi),[Bt([t]),s]):s.arguments.unshift(Bt([t])),!r&&(r=s)}else s.type===15?(pc(t,s)||s.properties.unshift(t),r=s):(r=He(n.helper(vi),[Bt([t]),s]),o&&o.callee===vs&&(o=i[i.length-2]));e.type===13?o?o.arguments[0]=r:e.props=r:o?o.arguments[0]=r:e.arguments[2]=r}function pc(e,t){let n=!1;if(e.key.type===4){const r=e.key.content;n=t.properties.some(s=>s.key.type===4&&s.key.content===r)}return n}function as(e,t){return`_${t}_${e.replace(/[^\\w]/g,(n,r)=>n===\"-\"?\"_\":e.charCodeAt(r).toString())}`}function ab(e){return e.type===14&&e.callee===la?e.arguments[1].returns:e}const cb=/([\\s\\S]*?)\\s+(?:in|of)\\s+(\\S[\\s\\S]*)/,Td={parseMode:\"base\",ns:0,delimiters:[\"{{\",\"}}\"],getNamespace:()=>0,isVoidTag:Fr,isPreTag:Fr,isIgnoreNewlineTag:Fr,isCustomElement:Fr,onError:ca,onWarn:vd,comments:!1,prefixIdentifiers:!1};let _e=Td,cs=null,un=\"\",it=null,pe=null,St=\"\",rn=-1,Fn=-1,fa=0,Sn=!1,sl=null;const Pe=[],Fe=new Jy(Pe,{onerr:nn,ontext(e,t){ks(Ye(e,t),e,t)},ontextentity(e,t,n){ks(e,t,n)},oninterpolation(e,t){if(Sn)return ks(Ye(e,t),e,t);let n=e+Fe.delimiterOpen.length,r=t-Fe.delimiterClose.length;for(;xt(un.charCodeAt(n));)n++;for(;xt(un.charCodeAt(r-1));)r--;let s=Ye(n,r);s.includes(\"&\")&&(s=_e.decodeEntities(s,!1)),il({type:5,content:zs(s,!1,Le(n,r)),loc:Le(e,t)})},onopentagname(e,t){const n=Ye(e,t);it={type:1,tag:n,ns:_e.getNamespace(n,Pe[0],_e.ns),tagType:0,props:[],children:[],loc:Le(e-1,t),codegenNode:void 0}},onopentagend(e){gc(e)},onclosetag(e,t){const n=Ye(e,t);if(!_e.isVoidTag(n)){let r=!1;for(let s=0;s<Pe.length;s++)if(Pe[s].tag.toLowerCase()===n.toLowerCase()){r=!0,s>0&&nn(24,Pe[0].loc.start.offset);for(let o=0;o<=s;o++){const l=Pe.shift();Zs(l,t,o<s)}break}r||nn(23,Cd(e,60))}},onselfclosingtag(e){const t=it.tag;it.isSelfClosing=!0,gc(e),Pe[0]&&Pe[0].tag===t&&Zs(Pe.shift(),e)},onattribname(e,t){pe={type:6,name:Ye(e,t),nameLoc:Le(e,t),value:void 0,loc:Le(e)}},ondirname(e,t){const n=Ye(e,t),r=n===\".\"||n===\":\"?\"bind\":n===\"@\"?\"on\":n===\"#\"?\"slot\":n.slice(2);if(!Sn&&r===\"\"&&nn(26,e),Sn||r===\"\")pe={type:6,name:n,nameLoc:Le(e,t),value:void 0,loc:Le(e)};else if(pe={type:7,name:r,rawName:n,exp:void 0,arg:void 0,modifiers:n===\".\"?[ue(\"prop\")]:[],loc:Le(e)},r===\"pre\"){Sn=Fe.inVPre=!0,sl=it;const s=it.props;for(let i=0;i<s.length;i++)s[i].type===7&&(s[i]=_b(s[i]))}},ondirarg(e,t){if(e===t)return;const n=Ye(e,t);if(Sn)pe.name+=n,$n(pe.nameLoc,t);else{const r=n[0]!==\"[\";pe.arg=zs(r?n:n.slice(1,-1),r,Le(e,t),r?3:0)}},ondirmodifier(e,t){const n=Ye(e,t);if(Sn)pe.name+=\".\"+n,$n(pe.nameLoc,t);else if(pe.name===\"slot\"){const r=pe.arg;r&&(r.content+=\".\"+n,$n(r.loc,t))}else{const r=ue(n,!0,Le(e,t));pe.modifiers.push(r)}},onattribdata(e,t){St+=Ye(e,t),rn<0&&(rn=e),Fn=t},onattribentity(e,t,n){St+=e,rn<0&&(rn=t),Fn=n},onattribnameend(e){const t=pe.loc.start.offset,n=Ye(t,e);pe.type===7&&(pe.rawName=n),it.props.some(r=>(r.type===7?r.rawName:r.name)===n)&&nn(2,t)},onattribend(e,t){if(it&&pe){if($n(pe.loc,t),e!==0)if(St.includes(\"&\")&&(St=_e.decodeEntities(St,!0)),pe.type===6)pe.name===\"class\"&&(St=Od(St).trim()),e===1&&!St&&nn(13,t),pe.value={type:2,content:St,loc:e===1?Le(rn,Fn):Le(rn-1,Fn+1)},Fe.inSFCRoot&&it.tag===\"template\"&&pe.name===\"lang\"&&St&&St!==\"html\"&&Fe.enterRCDATA(Si(\"</template\"),0);else{let n=0;pe.exp=zs(St,!1,Le(rn,Fn),0,n),pe.name===\"for\"&&(pe.forParseResult=fb(pe.exp));let r=-1;pe.name===\"bind\"&&(r=pe.modifiers.findIndex(s=>s.content===\"sync\"))>-1&&ls(\"COMPILER_V_BIND_SYNC\",_e,pe.loc,pe.rawName)&&(pe.name=\"model\",pe.modifiers.splice(r,1))}(pe.type!==7||pe.name!==\"pre\")&&it.props.push(pe)}St=\"\",rn=Fn=-1},oncomment(e,t){_e.comments&&il({type:3,content:Ye(e,t),loc:Le(e-4,t+3)})},onend(){const e=un.length;for(let t=0;t<Pe.length;t++)Zs(Pe[t],e-1),nn(24,Pe[t].loc.start.offset)},oncdata(e,t){Pe[0].ns!==0?ks(Ye(e,t),e,t):nn(1,e-9)},onprocessinginstruction(e){(Pe[0]?Pe[0].ns:_e.ns)===0&&nn(21,e-1)}}),mc=/,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/,ub=/^\\(|\\)$/g;function fb(e){const t=e.loc,n=e.content,r=n.match(cb);if(!r)return;const[,s,i]=r,o=(f,d,h=!1)=>{const p=t.start.offset+d,g=p+f.length;return zs(f,!1,Le(p,g),0,h?1:0)},l={source:o(i.trim(),n.indexOf(i,s.length)),value:void 0,key:void 0,index:void 0,finalized:!1};let a=s.trim().replace(ub,\"\").trim();const c=s.indexOf(a),u=a.match(mc);if(u){a=a.replace(mc,\"\").trim();const f=u[1].trim();let d;if(f&&(d=n.indexOf(f,c+a.length),l.key=o(f,d,!0)),u[2]){const h=u[2].trim();h&&(l.index=o(h,n.indexOf(h,l.key?d+f.length:c+a.length),!0))}}return a&&(l.value=o(a,c,!0)),l}function Ye(e,t){return un.slice(e,t)}function gc(e){Fe.inSFCRoot&&(it.innerLoc=Le(e+1,e+1)),il(it);const{tag:t,ns:n}=it;n===0&&_e.isPreTag(t)&&fa++,_e.isVoidTag(t)?Zs(it,e):(Pe.unshift(it),(n===1||n===2)&&(Fe.inXML=!0)),it=null}function ks(e,t,n){{const i=Pe[0]&&Pe[0].tag;i!==\"script\"&&i!==\"style\"&&e.includes(\"&\")&&(e=_e.decodeEntities(e,!1))}const r=Pe[0]||cs,s=r.children[r.children.length-1];s&&s.type===2?(s.content+=e,$n(s.loc,n)):r.children.push({type:2,content:e,loc:Le(t,n)})}function Zs(e,t,n=!1){n?$n(e.loc,Cd(t,60)):$n(e.loc,db(t,62)+1),Fe.inSFCRoot&&(e.children.length?e.innerLoc.end=he({},e.children[e.children.length-1].loc.end):e.innerLoc.end=he({},e.innerLoc.start),e.innerLoc.source=Ye(e.innerLoc.start.offset,e.innerLoc.end.offset));const{tag:r,ns:s,children:i}=e;if(Sn||(r===\"slot\"?e.tagType=2:yc(e)?e.tagType=3:pb(e)&&(e.tagType=1)),Fe.inRCDATA||(e.children=wd(i)),s===0&&_e.isIgnoreNewlineTag(r)){const o=i[0];o&&o.type===2&&(o.content=o.content.replace(/^\\r?\\n/,\"\"))}s===0&&_e.isPreTag(r)&&fa--,sl===e&&(Sn=Fe.inVPre=!1,sl=null),Fe.inXML&&(Pe[0]?Pe[0].ns:_e.ns)===0&&(Fe.inXML=!1);{const o=e.props;if(!Fe.inSFCRoot&&Wn(\"COMPILER_NATIVE_TEMPLATE\",_e)&&e.tag===\"template\"&&!yc(e)){const a=Pe[0]||cs,c=a.children.indexOf(e);a.children.splice(c,1,...e.children)}const l=o.find(a=>a.type===6&&a.name===\"inline-template\");l&&ls(\"COMPILER_INLINE_TEMPLATE\",_e,l.loc)&&e.children.length&&(l.value={type:2,content:Ye(e.children[0].loc.start.offset,e.children[e.children.length-1].loc.end.offset),loc:l.loc})}}function db(e,t){let n=e;for(;un.charCodeAt(n)!==t&&n<un.length-1;)n++;return n}function Cd(e,t){let n=e;for(;un.charCodeAt(n)!==t&&n>=0;)n--;return n}const hb=new Set([\"if\",\"else\",\"else-if\",\"for\",\"slot\"]);function yc({tag:e,props:t}){if(e===\"template\"){for(let n=0;n<t.length;n++)if(t[n].type===7&&hb.has(t[n].name))return!0}return!1}function pb({tag:e,props:t}){if(_e.isCustomElement(e))return!1;if(e===\"component\"||mb(e.charCodeAt(0))||_d(e)||_e.isBuiltInComponent&&_e.isBuiltInComponent(e)||_e.isNativeTag&&!_e.isNativeTag(e))return!0;for(let n=0;n<t.length;n++){const r=t[n];if(r.type===6){if(r.name===\"is\"&&r.value){if(r.value.content.startsWith(\"vue:\"))return!0;if(ls(\"COMPILER_IS_ON_ELEMENT\",_e,r.loc))return!0}}else if(r.name===\"bind\"&&Ln(r.arg,\"is\")&&ls(\"COMPILER_IS_ON_ELEMENT\",_e,r.loc))return!0}return!1}function mb(e){return e>64&&e<91}const gb=/\\r\\n/g;function wd(e,t){const n=_e.whitespace!==\"preserve\";let r=!1;for(let s=0;s<e.length;s++){const i=e[s];if(i.type===2)if(fa)i.content=i.content.replace(gb,`\n`);else if(yb(i.content)){const o=e[s-1]&&e[s-1].type,l=e[s+1]&&e[s+1].type;!o||!l||n&&(o===3&&(l===3||l===1)||o===1&&(l===3||l===1&&bb(i.content)))?(r=!0,e[s]=null):i.content=\" \"}else n&&(i.content=Od(i.content))}return r?e.filter(Boolean):e}function yb(e){for(let t=0;t<e.length;t++)if(!xt(e.charCodeAt(t)))return!1;return!0}function bb(e){for(let t=0;t<e.length;t++){const n=e.charCodeAt(t);if(n===10||n===13)return!0}return!1}function Od(e){let t=\"\",n=!1;for(let r=0;r<e.length;r++)xt(e.charCodeAt(r))?n||(t+=\" \",n=!0):(t+=e[r],n=!1);return t}function il(e){(Pe[0]||cs).children.push(e)}function Le(e,t){return{start:Fe.getPos(e),end:t==null?t:Fe.getPos(t),source:t==null?t:Ye(e,t)}}function vb(e){return Le(e.start.offset,e.end.offset)}function $n(e,t){e.end=Fe.getPos(t),e.source=Ye(e.start.offset,t)}function _b(e){const t={type:6,name:e.rawName,nameLoc:Le(e.loc.start.offset,e.loc.start.offset+e.rawName.length),value:void 0,loc:e.loc};if(e.exp){const n=e.exp.loc;n.end.offset<e.loc.end.offset&&(n.start.offset--,n.start.column--,n.end.offset++,n.end.column++),t.value={type:2,content:e.exp.content,loc:n}}return t}function zs(e,t=!1,n,r=0,s=0){return ue(e,t,n,r)}function nn(e,t,n){_e.onError(ke(e,Le(t,t)))}function Sb(){Fe.reset(),it=null,pe=null,St=\"\",rn=-1,Fn=-1,Pe.length=0}function Eb(e,t){if(Sb(),un=e,_e=he({},Td),t){let s;for(s in t)t[s]!=null&&(_e[s]=t[s])}Fe.mode=_e.parseMode===\"html\"?1:_e.parseMode===\"sfc\"?2:0,Fe.inXML=_e.ns===1||_e.ns===2;const n=t&&t.delimiters;n&&(Fe.delimiterOpen=Si(n[0]),Fe.delimiterClose=Si(n[1]));const r=cs=Zy([],e);return Fe.parse(un),r.loc=Le(0,e.length),r.children=wd(r.children),cs=null,r}function Ab(e,t){Gs(e,void 0,t,Nd(e,e.children[0]))}function Nd(e,t){const{children:n}=e;return n.length===1&&t.type===1&&!Ai(t)}function Gs(e,t,n,r=!1,s=!1){const{children:i}=e,o=[];for(let u=0;u<i.length;u++){const f=i[u];if(f.type===1&&f.tagType===0){const d=r?0:It(f,n);if(d>0){if(d>=2){f.codegenNode.patchFlag=-1,o.push(f);continue}}else{const h=f.codegenNode;if(h.type===13){const p=h.patchFlag;if((p===void 0||p===512||p===1)&&xd(f,n)>=2){const g=Id(f);g&&(h.props=n.hoist(g))}h.dynamicProps&&(h.dynamicProps=n.hoist(h.dynamicProps))}}}else if(f.type===12&&(r?0:It(f,n))>=2){o.push(f);continue}if(f.type===1){const d=f.tagType===1;d&&n.scopes.vSlot++,Gs(f,e,n,!1,s),d&&n.scopes.vSlot--}else if(f.type===11)Gs(f,e,n,f.children.length===1,!0);else if(f.type===9)for(let d=0;d<f.branches.length;d++)Gs(f.branches[d],e,n,f.branches[d].children.length===1,s)}let l=!1;if(o.length===i.length&&e.type===1){if(e.tagType===0&&e.codegenNode&&e.codegenNode.type===13&&z(e.codegenNode.children))e.codegenNode.children=a(Kn(e.codegenNode.children)),l=!0;else if(e.tagType===1&&e.codegenNode&&e.codegenNode.type===13&&e.codegenNode.children&&!z(e.codegenNode.children)&&e.codegenNode.children.type===15){const u=c(e.codegenNode,\"default\");u&&(u.returns=a(Kn(u.returns)),l=!0)}else if(e.tagType===3&&t&&t.type===1&&t.tagType===1&&t.codegenNode&&t.codegenNode.type===13&&t.codegenNode.children&&!z(t.codegenNode.children)&&t.codegenNode.children.type===15){const u=Dt(e,\"slot\",!0),f=u&&u.arg&&c(t.codegenNode,u.arg);f&&(f.returns=a(Kn(f.returns)),l=!0)}}if(!l)for(const u of o)u.codegenNode=n.cache(u.codegenNode);function a(u){const f=n.cache(u);return s&&n.hmr&&(f.needArraySpread=!0),f}function c(u,f){if(u.children&&!z(u.children)&&u.children.type===15){const d=u.children.properties.find(h=>h.key===f||h.key.content===f);return d&&d.value}}o.length&&n.transformHoist&&n.transformHoist(i,n,e)}function It(e,t){const{constantCache:n}=t;switch(e.type){case 1:if(e.tagType!==0)return 0;const r=n.get(e);if(r!==void 0)return r;const s=e.codegenNode;if(s.type!==13||s.isBlock&&e.tag!==\"svg\"&&e.tag!==\"foreignObject\"&&e.tag!==\"math\")return 0;if(s.patchFlag===void 0){let o=3;const l=xd(e,t);if(l===0)return n.set(e,0),0;l<o&&(o=l);for(let a=0;a<e.children.length;a++){const c=It(e.children[a],t);if(c===0)return n.set(e,0),0;c<o&&(o=c)}if(o>1)for(let a=0;a<e.props.length;a++){const c=e.props[a];if(c.type===7&&c.name===\"bind\"&&c.exp){const u=It(c.exp,t);if(u===0)return n.set(e,0),0;u<o&&(o=u)}}if(s.isBlock){for(let a=0;a<e.props.length;a++)if(e.props[a].type===7)return n.set(e,0),0;t.removeHelper(Gn),t.removeHelper(Ar(t.inSSR,s.isComponent)),s.isBlock=!1,t.helper(Er(t.inSSR,s.isComponent))}return n.set(e,o),o}else return n.set(e,0),0;case 2:case 3:return 3;case 9:case 11:case 10:return 0;case 5:case 12:return It(e.content,t);case 4:return e.constType;case 8:let i=3;for(let o=0;o<e.children.length;o++){const l=e.children[o];if(ae(l)||Nt(l))continue;const a=It(l,t);if(a===0)return 0;a<i&&(i=a)}return i;case 20:return 2;default:return 0}}const Tb=new Set([ra,sa,is,vs]);function Rd(e,t){if(e.type===14&&!ae(e.callee)&&Tb.has(e.callee)){const n=e.arguments[0];if(n.type===4)return It(n,t);if(n.type===14)return Rd(n,t)}return 0}function xd(e,t){let n=3;const r=Id(e);if(r&&r.type===15){const{properties:s}=r;for(let i=0;i<s.length;i++){const{key:o,value:l}=s[i],a=It(o,t);if(a===0)return a;a<n&&(n=a);let c;if(l.type===4?c=It(l,t):l.type===14?c=Rd(l,t):c=0,c===0)return c;c<n&&(n=c)}}return n}function Id(e){const t=e.codegenNode;if(t.type===13)return t.props}function Cb(e,{filename:t=\"\",prefixIdentifiers:n=!1,hoistStatic:r=!1,hmr:s=!1,cacheHandlers:i=!1,nodeTransforms:o=[],directiveTransforms:l={},transformHoist:a=null,isBuiltInComponent:c=Ge,isCustomElement:u=Ge,expressionPlugins:f=[],scopeId:d=null,slotted:h=!0,ssr:p=!1,inSSR:g=!1,ssrCssVars:_=\"\",bindingMetadata:w=de,inline:C=!1,isTS:y=!1,onError:b=ca,onWarn:A=vd,compatConfig:I}){const V=t.replace(/\\?.*$/,\"\").match(/([^/\\\\]+)\\.\\w+$/),k={filename:t,selfName:V&&er(Ie(V[1])),prefixIdentifiers:n,hoistStatic:r,hmr:s,cacheHandlers:i,nodeTransforms:o,directiveTransforms:l,transformHoist:a,isBuiltInComponent:c,isCustomElement:u,expressionPlugins:f,scopeId:d,slotted:h,ssr:p,inSSR:g,ssrCssVars:_,bindingMetadata:w,inline:C,isTS:y,onError:b,onWarn:A,compatConfig:I,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],cached:[],constantCache:new WeakMap,temps:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,grandParent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(T){const O=k.helpers.get(T)||0;return k.helpers.set(T,O+1),T},removeHelper(T){const O=k.helpers.get(T);if(O){const M=O-1;M?k.helpers.set(T,M):k.helpers.delete(T)}},helperString(T){return`_${_r[k.helper(T)]}`},replaceNode(T){k.parent.children[k.childIndex]=k.currentNode=T},removeNode(T){const O=k.parent.children,M=T?O.indexOf(T):k.currentNode?k.childIndex:-1;!T||T===k.currentNode?(k.currentNode=null,k.onNodeRemoved()):k.childIndex>M&&(k.childIndex--,k.onNodeRemoved()),k.parent.children.splice(M,1)},onNodeRemoved:Ge,addIdentifiers(T){},removeIdentifiers(T){},hoist(T){ae(T)&&(T=ue(T)),k.hoists.push(T);const O=ue(`_hoisted_${k.hoists.length}`,!1,T.loc,2);return O.hoisted=T,O},cache(T,O=!1,M=!1){const N=zy(k.cached.length,T,O,M);return k.cached.push(N),N}};return k.filters=new Set,k}function wb(e,t){const n=Cb(e,t);Qi(e,n),t.hoistStatic&&Ab(e,n),t.ssr||Ob(e,n),e.helpers=new Set([...n.helpers.keys()]),e.components=[...n.components],e.directives=[...n.directives],e.imports=n.imports,e.hoists=n.hoists,e.temps=n.temps,e.cached=n.cached,e.transformed=!0,e.filters=[...n.filters]}function Ob(e,t){const{helper:n}=t,{children:r}=e;if(r.length===1){const s=r[0];if(Nd(e,s)&&s.codegenNode){const i=s.codegenNode;i.type===13&&aa(i,t),e.codegenNode=i}else e.codegenNode=s}else if(r.length>1){let s=64;e.codegenNode=os(t,n(ss),void 0,e.children,s,void 0,void 0,!0,void 0,!1)}}function Nb(e,t){let n=0;const r=()=>{n--};for(;n<e.children.length;n++){const s=e.children[n];ae(s)||(t.grandParent=t.parent,t.parent=e,t.childIndex=n,t.onNodeRemoved=r,Qi(s,t))}}function Qi(e,t){t.currentNode=e;const{nodeTransforms:n}=t,r=[];for(let i=0;i<n.length;i++){const o=n[i](e,t);if(o&&(z(o)?r.push(...o):r.push(o)),t.currentNode)e=t.currentNode;else return}switch(e.type){case 3:t.ssr||t.helper(bs);break;case 5:t.ssr||t.helper(Xi);break;case 9:for(let i=0;i<e.branches.length;i++)Qi(e.branches[i],t);break;case 10:case 11:case 1:case 0:Nb(e,t);break}t.currentNode=e;let s=r.length;for(;s--;)r[s]()}function Pd(e,t){const n=ae(e)?r=>r===e:r=>e.test(r);return(r,s)=>{if(r.type===1){const{props:i}=r;if(r.tagType===3&&i.some(ob))return;const o=[];for(let l=0;l<i.length;l++){const a=i[l];if(a.type===7&&n(a.name)){i.splice(l,1),l--;const c=t(r,a,s);c&&o.push(c)}}return o}}}const eo=\"/*@__PURE__*/\",kd=e=>`${_r[e]}: _${_r[e]}`;function Rb(e,{mode:t=\"function\",prefixIdentifiers:n=t===\"module\",sourceMap:r=!1,filename:s=\"template.vue.html\",scopeId:i=null,optimizeImports:o=!1,runtimeGlobalName:l=\"Vue\",runtimeModuleName:a=\"vue\",ssrRuntimeModuleName:c=\"vue/server-renderer\",ssr:u=!1,isTS:f=!1,inSSR:d=!1}){const h={mode:t,prefixIdentifiers:n,sourceMap:r,filename:s,scopeId:i,optimizeImports:o,runtimeGlobalName:l,runtimeModuleName:a,ssrRuntimeModuleName:c,ssr:u,isTS:f,inSSR:d,source:e.source,code:\"\",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper(g){return`_${_r[g]}`},push(g,_=-2,w){h.code+=g},indent(){p(++h.indentLevel)},deindent(g=!1){g?--h.indentLevel:p(--h.indentLevel)},newline(){p(h.indentLevel)}};function p(g){h.push(`\n`+\"  \".repeat(g),0)}return h}function xb(e,t={}){const n=Rb(e,t);t.onContextCreated&&t.onContextCreated(n);const{mode:r,push:s,prefixIdentifiers:i,indent:o,deindent:l,newline:a,scopeId:c,ssr:u}=n,f=Array.from(e.helpers),d=f.length>0,h=!i&&r!==\"module\";Ib(e,n);const g=u?\"ssrRender\":\"render\",w=(u?[\"_ctx\",\"_push\",\"_parent\",\"_attrs\"]:[\"_ctx\",\"_cache\"]).join(\", \");if(s(`function ${g}(${w}) {`),o(),h&&(s(\"with (_ctx) {\"),o(),d&&(s(`const { ${f.map(kd).join(\", \")} } = _Vue\n`,-1),a())),e.components.length&&(Ro(e.components,\"component\",n),(e.directives.length||e.temps>0)&&a()),e.directives.length&&(Ro(e.directives,\"directive\",n),e.temps>0&&a()),e.filters&&e.filters.length&&(a(),Ro(e.filters,\"filter\",n),a()),e.temps>0){s(\"let \");for(let C=0;C<e.temps;C++)s(`${C>0?\", \":\"\"}_temp${C}`)}return(e.components.length||e.directives.length||e.temps)&&(s(`\n`,0),a()),u||s(\"return \"),e.codegenNode?ft(e.codegenNode,n):s(\"null\"),h&&(l(),s(\"}\")),l(),s(\"}\"),{ast:e,code:n.code,preamble:\"\",map:n.map?n.map.toJSON():void 0}}function Ib(e,t){const{ssr:n,prefixIdentifiers:r,push:s,newline:i,runtimeModuleName:o,runtimeGlobalName:l,ssrRuntimeModuleName:a}=t,c=l,u=Array.from(e.helpers);if(u.length>0&&(s(`const _Vue = ${c}\n`,-1),e.hoists.length)){const f=[zl,Gl,bs,Jl,md].filter(d=>u.includes(d)).map(kd).join(\", \");s(`const { ${f} } = _Vue\n`,-1)}Pb(e.hoists,t),i(),s(\"return \")}function Ro(e,t,{helper:n,push:r,newline:s,isTS:i}){const o=n(t===\"filter\"?ea:t===\"component\"?Xl:Ql);for(let l=0;l<e.length;l++){let a=e[l];const c=a.endsWith(\"__self\");c&&(a=a.slice(0,-6)),r(`const ${as(a,t)} = ${o}(${JSON.stringify(a)}${c?\", true\":\"\"})${i?\"!\":\"\"}`),l<e.length-1&&s()}}function Pb(e,t){if(!e.length)return;t.pure=!0;const{push:n,newline:r}=t;r();for(let s=0;s<e.length;s++){const i=e[s];i&&(n(`const _hoisted_${s+1} = `),ft(i,t),r())}t.pure=!1}function da(e,t){const n=e.length>3||!1;t.push(\"[\"),n&&t.indent(),_s(e,t,n),n&&t.deindent(),t.push(\"]\")}function _s(e,t,n=!1,r=!0){const{push:s,newline:i}=t;for(let o=0;o<e.length;o++){const l=e[o];ae(l)?s(l,-3):z(l)?da(l,t):ft(l,t),o<e.length-1&&(n?(r&&s(\",\"),i()):r&&s(\", \"))}}function ft(e,t){if(ae(e)){t.push(e,-3);return}if(Nt(e)){t.push(t.helper(e));return}switch(e.type){case 1:case 9:case 11:ft(e.codegenNode,t);break;case 2:kb(e,t);break;case 4:Vd(e,t);break;case 5:Vb(e,t);break;case 12:ft(e.codegenNode,t);break;case 8:Md(e,t);break;case 3:Fb(e,t);break;case 13:Lb(e,t);break;case 14:Db(e,t);break;case 15:Bb(e,t);break;case 17:jb(e,t);break;case 18:Ub(e,t);break;case 19:Hb(e,t);break;case 20:qb(e,t);break;case 21:_s(e.body,t,!0,!1);break}}function kb(e,t){t.push(JSON.stringify(e.content),-3,e)}function Vd(e,t){const{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,-3,e)}function Vb(e,t){const{push:n,helper:r,pure:s}=t;s&&n(eo),n(`${r(Xi)}(`),ft(e.content,t),n(\")\")}function Md(e,t){for(let n=0;n<e.children.length;n++){const r=e.children[n];ae(r)?t.push(r,-3):ft(r,t)}}function Mb(e,t){const{push:n}=t;if(e.type===8)n(\"[\"),Md(e,t),n(\"]\");else if(e.isStatic){const r=ua(e.content)?e.content:JSON.stringify(e.content);n(r,-2,e)}else n(`[${e.content}]`,-3,e)}function Fb(e,t){const{push:n,helper:r,pure:s}=t;s&&n(eo),n(`${r(bs)}(${JSON.stringify(e.content)})`,-3,e)}function Lb(e,t){const{push:n,helper:r,pure:s}=t,{tag:i,props:o,children:l,patchFlag:a,dynamicProps:c,directives:u,isBlock:f,disableTracking:d,isComponent:h}=e;let p;a&&(p=String(a)),u&&n(r(ta)+\"(\"),f&&n(`(${r(Gn)}(${d?\"true\":\"\"}), `),s&&n(eo);const g=f?Ar(t.inSSR,h):Er(t.inSSR,h);n(r(g)+\"(\",-2,e),_s($b([i,o,l,p,c]),t),n(\")\"),f&&n(\")\"),u&&(n(\", \"),ft(u,t),n(\")\"))}function $b(e){let t=e.length;for(;t--&&e[t]==null;);return e.slice(0,t+1).map(n=>n||\"null\")}function Db(e,t){const{push:n,helper:r,pure:s}=t,i=ae(e.callee)?e.callee:r(e.callee);s&&n(eo),n(i+\"(\",-2,e),_s(e.arguments,t),n(\")\")}function Bb(e,t){const{push:n,indent:r,deindent:s,newline:i}=t,{properties:o}=e;if(!o.length){n(\"{}\",-2,e);return}const l=o.length>1||!1;n(l?\"{\":\"{ \"),l&&r();for(let a=0;a<o.length;a++){const{key:c,value:u}=o[a];Mb(c,t),n(\": \"),ft(u,t),a<o.length-1&&(n(\",\"),i())}l&&s(),n(l?\"}\":\" }\")}function jb(e,t){da(e.elements,t)}function Ub(e,t){const{push:n,indent:r,deindent:s}=t,{params:i,returns:o,body:l,newline:a,isSlot:c}=e;c&&n(`_${_r[oa]}(`),n(\"(\",-2,e),z(i)?_s(i,t):i&&ft(i,t),n(\") => \"),(a||l)&&(n(\"{\"),r()),o?(a&&n(\"return \"),z(o)?da(o,t):ft(o,t)):l&&ft(l,t),(a||l)&&(s(),n(\"}\")),c&&(e.isNonScopedSlot&&n(\", undefined, true\"),n(\")\"))}function Hb(e,t){const{test:n,consequent:r,alternate:s,newline:i}=e,{push:o,indent:l,deindent:a,newline:c}=t;if(n.type===4){const f=!ua(n.content);f&&o(\"(\"),Vd(n,t),f&&o(\")\")}else o(\"(\"),ft(n,t),o(\")\");i&&l(),t.indentLevel++,i||o(\" \"),o(\"? \"),ft(r,t),t.indentLevel--,i&&c(),i||o(\" \"),o(\": \");const u=s.type===19;u||t.indentLevel++,ft(s,t),u||t.indentLevel--,i&&a(!0)}function qb(e,t){const{push:n,helper:r,indent:s,deindent:i,newline:o}=t,{needPauseTracking:l,needArraySpread:a}=e;a&&n(\"[...(\"),n(`_cache[${e.index}] || (`),l&&(s(),n(`${r(_i)}(-1`),e.inVOnce&&n(\", true\"),n(\"),\"),o(),n(\"(\")),n(`_cache[${e.index}] = `),ft(e.value,t),l&&(n(`).cacheIndex = ${e.index},`),o(),n(`${r(_i)}(1),`),o(),n(`_cache[${e.index}]`),i()),n(\")\"),a&&n(\")]\")}new RegExp(\"\\\\b\"+\"arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield\".split(\",\").join(\"\\\\b|\\\\b\")+\"\\\\b\");const Kb=Pd(/^(if|else|else-if)$/,(e,t,n)=>Wb(e,t,n,(r,s,i)=>{const o=n.parent.children;let l=o.indexOf(r),a=0;for(;l-->=0;){const c=o[l];c&&c.type===9&&(a+=c.branches.length)}return()=>{if(i)r.codegenNode=vc(s,a,n);else{const c=Zb(r.codegenNode);c.alternate=vc(s,a+r.branches.length-1,n)}}}));function Wb(e,t,n,r){if(t.name!==\"else\"&&(!t.exp||!t.exp.content.trim())){const s=t.exp?t.exp.loc:e.loc;n.onError(ke(28,t.loc)),t.exp=ue(\"true\",!1,s)}if(t.name===\"if\"){const s=bc(e,t),i={type:9,loc:vb(e.loc),branches:[s]};if(n.replaceNode(i),r)return r(i,s,!0)}else{const s=n.parent.children;let i=s.indexOf(e);for(;i-->=-1;){const o=s[i];if(o&&o.type===3){n.removeNode(o);continue}if(o&&o.type===2&&!o.content.trim().length){n.removeNode(o);continue}if(o&&o.type===9){t.name===\"else-if\"&&o.branches[o.branches.length-1].condition===void 0&&n.onError(ke(30,e.loc)),n.removeNode();const l=bc(e,t);o.branches.push(l);const a=r&&r(o,l,!1);Qi(l,n),a&&a(),n.currentNode=null}else n.onError(ke(30,e.loc));break}}}function bc(e,t){const n=e.tagType===3;return{type:10,loc:e.loc,condition:t.name===\"else\"?void 0:t.exp,children:n&&!Dt(e,\"for\")?e.children:[e],userKey:Yi(e,\"key\"),isTemplateIf:n}}function vc(e,t,n){return e.condition?rl(e.condition,_c(e,t,n),He(n.helper(bs),['\"\"',\"true\"])):_c(e,t,n)}function _c(e,t,n){const{helper:r}=n,s=$e(\"key\",ue(`${t}`,!1,Ft,2)),{children:i}=e,o=i[0];if(i.length!==1||o.type!==1)if(i.length===1&&o.type===11){const a=o.codegenNode;return Ti(a,s,n),a}else{let a=64;return os(n,r(ss),Bt([s]),i,a,void 0,void 0,!0,!1,!1,e.loc)}else{const a=o.codegenNode,c=ab(a);return c.type===13&&aa(c,n),Ti(c,s,n),a}}function Zb(e){for(;;)if(e.type===19)if(e.alternate.type===19)e=e.alternate;else return e;else e.type===20&&(e=e.value)}const zb=(e,t,n)=>{const{modifiers:r,loc:s}=e,i=e.arg;let{exp:o}=e;if(o&&o.type===4&&!o.content.trim()&&(o=void 0),!o){if(i.type!==4||!i.isStatic)return n.onError(ke(52,i.loc)),{props:[$e(i,ue(\"\",!0,s))]};Fd(e),o=e.exp}return i.type!==4?(i.children.unshift(\"(\"),i.children.push(') || \"\"')):i.isStatic||(i.content=`${i.content} || \"\"`),r.some(l=>l.content===\"camel\")&&(i.type===4?i.isStatic?i.content=Ie(i.content):i.content=`${n.helperString(tl)}(${i.content})`:(i.children.unshift(`${n.helperString(tl)}(`),i.children.push(\")\"))),n.inSSR||(r.some(l=>l.content===\"prop\")&&Sc(i,\".\"),r.some(l=>l.content===\"attr\")&&Sc(i,\"^\")),{props:[$e(i,o)]}},Fd=(e,t)=>{const n=e.arg,r=Ie(n.content);e.exp=ue(r,!1,n.loc)},Sc=(e,t)=>{e.type===4?e.isStatic?e.content=t+e.content:e.content=`\\`${t}\\${${e.content}}\\``:(e.children.unshift(`'${t}' + (`),e.children.push(\")\"))},Gb=Pd(\"for\",(e,t,n)=>{const{helper:r,removeHelper:s}=n;return Jb(e,t,n,i=>{const o=He(r(na),[i.source]),l=Ei(e),a=Dt(e,\"memo\"),c=Yi(e,\"key\",!1,!0);c&&c.type===7&&!c.exp&&Fd(c);let f=c&&(c.type===6?c.value?ue(c.value.content,!0):void 0:c.exp);const d=c&&f?$e(\"key\",f):null,h=i.source.type===4&&i.source.constType>0,p=h?64:c?128:256;return i.codegenNode=os(n,r(ss),void 0,o,p,void 0,void 0,!0,!h,!1,e.loc),()=>{let g;const{children:_}=i,w=_.length!==1||_[0].type!==1,C=Ai(e)?e:l&&e.children.length===1&&Ai(e.children[0])?e.children[0]:null;if(C?(g=C.codegenNode,l&&d&&Ti(g,d,n)):w?g=os(n,r(ss),d?Bt([d]):void 0,e.children,64,void 0,void 0,!0,void 0,!1):(g=_[0].codegenNode,l&&d&&Ti(g,d,n),g.isBlock!==!h&&(g.isBlock?(s(Gn),s(Ar(n.inSSR,g.isComponent))):s(Er(n.inSSR,g.isComponent))),g.isBlock=!h,g.isBlock?(r(Gn),r(Ar(n.inSSR,g.isComponent))):r(Er(n.inSSR,g.isComponent))),a){const y=Sr(ol(i.parseResult,[ue(\"_cached\")]));y.body=Gy([Zt([\"const _memo = (\",a.exp,\")\"]),Zt([\"if (_cached\",...f?[\" && _cached.key === \",f]:[],` && ${n.helperString(bd)}(_cached, _memo)) return _cached`]),Zt([\"const _item = \",g]),ue(\"_item.memo = _memo\"),ue(\"return _item\")]),o.arguments.push(y,ue(\"_cache\"),ue(String(n.cached.length))),n.cached.push(null)}else o.arguments.push(Sr(ol(i.parseResult),g,!0))}})});function Jb(e,t,n,r){if(!t.exp){n.onError(ke(31,t.loc));return}const s=t.forParseResult;if(!s){n.onError(ke(32,t.loc));return}Ld(s);const{addIdentifiers:i,removeIdentifiers:o,scopes:l}=n,{source:a,value:c,key:u,index:f}=s,d={type:11,loc:t.loc,source:a,valueAlias:c,keyAlias:u,objectIndexAlias:f,parseResult:s,children:Ei(e)?e.children:[e]};n.replaceNode(d),l.vFor++;const h=r&&r(d);return()=>{l.vFor--,h&&h()}}function Ld(e,t){e.finalized||(e.finalized=!0)}function ol({value:e,key:t,index:n},r=[]){return Xb([e,t,n,...r])}function Xb(e){let t=e.length;for(;t--&&!e[t];);return e.slice(0,t+1).map((n,r)=>n||ue(\"_\".repeat(r+1),!1))}const Ec=ue(\"undefined\",!1),Yb=(e,t)=>{if(e.type===1&&(e.tagType===1||e.tagType===3)){const n=Dt(e,\"slot\");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},Qb=(e,t,n,r)=>Sr(e,n,!1,!0,n.length?n[0].loc:r);function ev(e,t,n=Qb){t.helper(oa);const{children:r,loc:s}=e,i=[],o=[];let l=t.scopes.vSlot>0||t.scopes.vFor>0;const a=Dt(e,\"slot\",!0);if(a){const{arg:_,exp:w}=a;_&&!Ot(_)&&(l=!0),i.push($e(_||ue(\"default\",!0),n(w,void 0,r,s)))}let c=!1,u=!1;const f=[],d=new Set;let h=0;for(let _=0;_<r.length;_++){const w=r[_];let C;if(!Ei(w)||!(C=Dt(w,\"slot\",!0))){w.type!==3&&f.push(w);continue}if(a){t.onError(ke(37,C.loc));break}c=!0;const{children:y,loc:b}=w,{arg:A=ue(\"default\",!0),exp:I,loc:V}=C;let k;Ot(A)?k=A?A.content:\"default\":l=!0;const T=Dt(w,\"for\"),O=n(I,T,y,b);let M,N;if(M=Dt(w,\"if\"))l=!0,o.push(rl(M.exp,Vs(A,O,h++),Ec));else if(N=Dt(w,/^else(-if)?$/,!0)){let B=_,G;for(;B--&&(G=r[B],G.type===3););if(G&&Ei(G)&&Dt(G,/^(else-)?if$/)){let Y=o[o.length-1];for(;Y.alternate.type===19;)Y=Y.alternate;Y.alternate=N.exp?rl(N.exp,Vs(A,O,h++),Ec):Vs(A,O,h++)}else t.onError(ke(30,N.loc))}else if(T){l=!0;const B=T.forParseResult;B?(Ld(B),o.push(He(t.helper(na),[B.source,Sr(ol(B),Vs(A,O),!0)]))):t.onError(ke(32,T.loc))}else{if(k){if(d.has(k)){t.onError(ke(38,V));continue}d.add(k),k===\"default\"&&(u=!0)}i.push($e(A,O))}}if(!a){const _=(w,C)=>{const y=n(w,void 0,C,s);return t.compatConfig&&(y.isNonScopedSlot=!0),$e(\"default\",y)};c?f.length&&f.some(w=>$d(w))&&(u?t.onError(ke(39,f[0].loc)):i.push(_(void 0,f))):i.push(_(void 0,r))}const p=l?2:Js(e.children)?3:1;let g=Bt(i.concat($e(\"_\",ue(p+\"\",!1))),s);return o.length&&(g=He(t.helper(yd),[g,Kn(o)])),{slots:g,hasDynamicSlots:l}}function Vs(e,t,n){const r=[$e(\"name\",e),$e(\"fn\",t)];return n!=null&&r.push($e(\"key\",ue(String(n),!0))),Bt(r)}function Js(e){for(let t=0;t<e.length;t++){const n=e[t];switch(n.type){case 1:if(n.tagType===2||Js(n.children))return!0;break;case 9:if(Js(n.branches))return!0;break;case 10:case 11:if(Js(n.children))return!0;break}}return!1}function $d(e){return e.type!==2&&e.type!==12?!0:e.type===2?!!e.content.trim():$d(e.content)}const Dd=new WeakMap,tv=(e,t)=>function(){if(e=t.currentNode,!(e.type===1&&(e.tagType===0||e.tagType===1)))return;const{tag:r,props:s}=e,i=e.tagType===1;let o=i?nv(e,t):`\"${r}\"`;const l=Ce(o)&&o.callee===Yl;let a,c,u=0,f,d,h,p=l||o===Wr||o===Zl||!i&&(r===\"svg\"||r===\"foreignObject\"||r===\"math\");if(s.length>0){const g=Bd(e,t,void 0,i,l);a=g.props,u=g.patchFlag,d=g.dynamicPropNames;const _=g.directives;h=_&&_.length?Kn(_.map(w=>sv(w,t))):void 0,g.shouldUseBlock&&(p=!0)}if(e.children.length>0)if(o===bi&&(p=!0,u|=1024),i&&o!==Wr&&o!==bi){const{slots:_,hasDynamicSlots:w}=ev(e,t);c=_,w&&(u|=1024)}else if(e.children.length===1&&o!==Wr){const _=e.children[0],w=_.type,C=w===5||w===8;C&&It(_,t)===0&&(u|=1),C||w===2?c=_:c=e.children}else c=e.children;d&&d.length&&(f=iv(d)),e.codegenNode=os(t,o,a,c,u===0?void 0:u,f,h,!!p,!1,i,e.loc)};function nv(e,t,n=!1){let{tag:r}=e;const s=ll(r),i=Yi(e,\"is\",!1,!0);if(i)if(s||Wn(\"COMPILER_IS_ON_ELEMENT\",t)){let l;if(i.type===6?l=i.value&&ue(i.value.content,!0):(l=i.exp,l||(l=ue(\"is\",!1,i.arg.loc))),l)return He(t.helper(Yl),[l])}else i.type===6&&i.value.content.startsWith(\"vue:\")&&(r=i.value.content.slice(4));const o=_d(r)||t.isBuiltInComponent(r);return o?(n||t.helper(o),o):(t.helper(Xl),t.components.add(r),as(r,\"component\"))}function Bd(e,t,n=e.props,r,s,i=!1){const{tag:o,loc:l,children:a}=e;let c=[];const u=[],f=[],d=a.length>0;let h=!1,p=0,g=!1,_=!1,w=!1,C=!1,y=!1,b=!1;const A=[],I=O=>{c.length&&(u.push(Bt(Ac(c),l)),c=[]),O&&u.push(O)},V=()=>{t.scopes.vFor>0&&c.push($e(ue(\"ref_for\",!0),ue(\"true\")))},k=({key:O,value:M})=>{if(Ot(O)){const N=O.content,B=Yn(N);if(B&&(!r||s)&&N.toLowerCase()!==\"onclick\"&&N!==\"onUpdate:modelValue\"&&!An(N)&&(C=!0),B&&An(N)&&(b=!0),B&&M.type===14&&(M=M.arguments[0]),M.type===20||(M.type===4||M.type===8)&&It(M,t)>0)return;N===\"ref\"?g=!0:N===\"class\"?_=!0:N===\"style\"?w=!0:N!==\"key\"&&!A.includes(N)&&A.push(N),r&&(N===\"class\"||N===\"style\")&&!A.includes(N)&&A.push(N)}else y=!0};for(let O=0;O<n.length;O++){const M=n[O];if(M.type===6){const{loc:N,name:B,nameLoc:G,value:Y}=M;let j=!0;if(B===\"ref\"&&(g=!0,V()),B===\"is\"&&(ll(o)||Y&&Y.content.startsWith(\"vue:\")||Wn(\"COMPILER_IS_ON_ELEMENT\",t)))continue;c.push($e(ue(B,!0,G),ue(Y?Y.content:\"\",j,Y?Y.loc:N)))}else{const{name:N,arg:B,exp:G,loc:Y,modifiers:j}=M,U=N===\"bind\",J=N===\"on\";if(N===\"slot\"){r||t.onError(ke(40,Y));continue}if(N===\"once\"||N===\"memo\"||N===\"is\"||U&&Ln(B,\"is\")&&(ll(o)||Wn(\"COMPILER_IS_ON_ELEMENT\",t))||J&&i)continue;if((U&&Ln(B,\"key\")||J&&d&&Ln(B,\"vue:before-update\"))&&(h=!0),U&&Ln(B,\"ref\")&&V(),!B&&(U||J)){if(y=!0,G)if(U){if(V(),I(),Wn(\"COMPILER_V_BIND_OBJECT_ORDER\",t)){u.unshift(G);continue}u.push(G)}else I({type:14,loc:Y,callee:t.helper(ia),arguments:r?[G]:[G,\"true\"]});else t.onError(ke(U?34:35,Y));continue}U&&j.some(We=>We.content===\"prop\")&&(p|=32);const Se=t.directiveTransforms[N];if(Se){const{props:We,needRuntime:Je}=Se(M,e,t);!i&&We.forEach(k),J&&B&&!Ot(B)?I(Bt(We,l)):c.push(...We),Je&&(f.push(M),Nt(Je)&&Dd.set(M,Je))}else Xh(N)||(f.push(M),d&&(h=!0))}}let T;if(u.length?(I(),u.length>1?T=He(t.helper(vi),u,l):T=u[0]):c.length&&(T=Bt(Ac(c),l)),y?p|=16:(_&&!r&&(p|=2),w&&!r&&(p|=4),A.length&&(p|=8),C&&(p|=32)),!h&&(p===0||p===32)&&(g||b||f.length>0)&&(p|=512),!t.inSSR&&T)switch(T.type){case 15:let O=-1,M=-1,N=!1;for(let Y=0;Y<T.properties.length;Y++){const j=T.properties[Y].key;Ot(j)?j.content===\"class\"?O=Y:j.content===\"style\"&&(M=Y):j.isHandlerKey||(N=!0)}const B=T.properties[O],G=T.properties[M];N?T=He(t.helper(is),[T]):(B&&!Ot(B.value)&&(B.value=He(t.helper(ra),[B.value])),G&&(w||G.value.type===4&&G.value.content.trim()[0]===\"[\"||G.value.type===17)&&(G.value=He(t.helper(sa),[G.value])));break;case 14:break;default:T=He(t.helper(is),[He(t.helper(vs),[T])]);break}return{props:T,directives:f,patchFlag:p,dynamicPropNames:A,shouldUseBlock:h}}function Ac(e){const t=new Map,n=[];for(let r=0;r<e.length;r++){const s=e[r];if(s.key.type===8||!s.key.isStatic){n.push(s);continue}const i=s.key.content,o=t.get(i);o?(i===\"style\"||i===\"class\"||Yn(i))&&rv(o,s):(t.set(i,s),n.push(s))}return n}function rv(e,t){e.value.type===17?e.value.elements.push(t.value):e.value=Kn([e.value,t.value],e.loc)}function sv(e,t){const n=[],r=Dd.get(e);r?n.push(t.helperString(r)):(t.helper(Ql),t.directives.add(e.name),n.push(as(e.name,\"directive\")));const{loc:s}=e;if(e.exp&&n.push(e.exp),e.arg&&(e.exp||n.push(\"void 0\"),n.push(e.arg)),Object.keys(e.modifiers).length){e.arg||(e.exp||n.push(\"void 0\"),n.push(\"void 0\"));const i=ue(\"true\",!1,s);n.push(Bt(e.modifiers.map(o=>$e(o,i)),s))}return Kn(n,e.loc)}function iv(e){let t=\"[\";for(let n=0,r=e.length;n<r;n++)t+=JSON.stringify(e[n]),n<r-1&&(t+=\", \");return t+\"]\"}function ll(e){return e===\"component\"||e===\"Component\"}const ov=(e,t)=>{if(Ai(e)){const{children:n,loc:r}=e,{slotName:s,slotProps:i}=lv(e,t),o=[t.prefixIdentifiers?\"_ctx.$slots\":\"$slots\",s,\"{}\",\"undefined\",\"true\"];let l=2;i&&(o[2]=i,l=3),n.length&&(o[3]=Sr([],n,!1,!1,r),l=4),t.scopeId&&!t.slotted&&(l=5),o.splice(l),e.codegenNode=He(t.helper(gd),o,r)}};function lv(e,t){let n='\"default\"',r;const s=[];for(let i=0;i<e.props.length;i++){const o=e.props[i];if(o.type===6)o.value&&(o.name===\"name\"?n=JSON.stringify(o.value.content):(o.name=Ie(o.name),s.push(o)));else if(o.name===\"bind\"&&Ln(o.arg,\"name\")){if(o.exp)n=o.exp;else if(o.arg&&o.arg.type===4){const l=Ie(o.arg.content);n=o.exp=ue(l,!1,o.arg.loc)}}else o.name===\"bind\"&&o.arg&&Ot(o.arg)&&(o.arg.content=Ie(o.arg.content)),s.push(o)}if(s.length>0){const{props:i,directives:o}=Bd(e,t,s,!1,!1);r=i,o.length&&t.onError(ke(36,o[0].loc))}return{slotName:n,slotProps:r}}const jd=(e,t,n,r)=>{const{loc:s,modifiers:i,arg:o}=e;!e.exp&&!i.length&&n.onError(ke(35,s));let l;if(o.type===4)if(o.isStatic){let f=o.content;f.startsWith(\"vue:\")&&(f=`vnode-${f.slice(4)}`);const d=t.tagType!==0||f.startsWith(\"vnode\")||!/[A-Z]/.test(f)?fr(Ie(f)):`on:${f}`;l=ue(d,!0,o.loc)}else l=Zt([`${n.helperString(nl)}(`,o,\")\"]);else l=o,l.children.unshift(`${n.helperString(nl)}(`),l.children.push(\")\");let a=e.exp;a&&!a.content.trim()&&(a=void 0);let c=n.cacheHandlers&&!a&&!n.inVOnce;if(a){const f=Ed(a),d=!(f||sb(a)),h=a.content.includes(\";\");(d||c&&f)&&(a=Zt([`${d?\"$event\":\"(...args)\"} => ${h?\"{\":\"(\"}`,a,h?\"}\":\")\"]))}let u={props:[$e(l,a||ue(\"() => {}\",!1,s))]};return r&&(u=r(u)),c&&(u.props[0].value=n.cache(u.props[0].value)),u.props.forEach(f=>f.key.isHandlerKey=!0),u},av=(e,t)=>{if(e.type===0||e.type===1||e.type===11||e.type===10)return()=>{const n=e.children;let r,s=!1;for(let i=0;i<n.length;i++){const o=n[i];if(No(o)){s=!0;for(let l=i+1;l<n.length;l++){const a=n[l];if(No(a))r||(r=n[i]=Zt([o],o.loc)),r.children.push(\" + \",a),n.splice(l,1),l--;else{r=void 0;break}}}}if(!(!s||n.length===1&&(e.type===0||e.type===1&&e.tagType===0&&!e.props.find(i=>i.type===7&&!t.directiveTransforms[i.name])&&e.tag!==\"template\")))for(let i=0;i<n.length;i++){const o=n[i];if(No(o)||o.type===8){const l=[];(o.type!==2||o.content!==\" \")&&l.push(o),!t.ssr&&It(o,t)===0&&l.push(\"1\"),n[i]={type:12,content:o,loc:o.loc,codegenNode:He(t.helper(Jl),l)}}}}},Tc=new WeakSet,cv=(e,t)=>{if(e.type===1&&Dt(e,\"once\",!0))return Tc.has(e)||t.inVOnce||t.inSSR?void 0:(Tc.add(e),t.inVOnce=!0,t.helper(_i),()=>{t.inVOnce=!1;const n=t.currentNode;n.codegenNode&&(n.codegenNode=t.cache(n.codegenNode,!0,!0))})},Ud=(e,t,n)=>{const{exp:r,arg:s}=e;if(!r)return n.onError(ke(41,e.loc)),Ms();const i=r.loc.source.trim(),o=r.type===4?r.content:i,l=n.bindingMetadata[i];if(l===\"props\"||l===\"props-aliased\")return n.onError(ke(44,r.loc)),Ms();const a=!1;if(!o.trim()||!Ed(r)&&!a)return n.onError(ke(42,r.loc)),Ms();const c=s||ue(\"modelValue\",!0),u=s?Ot(s)?`onUpdate:${Ie(s.content)}`:Zt(['\"onUpdate:\" + ',s]):\"onUpdate:modelValue\";let f;const d=n.isTS?\"($event: any)\":\"$event\";f=Zt([`${d} => ((`,r,\") = $event)\"]);const h=[$e(c,e.exp),$e(u,f)];if(e.modifiers.length&&t.tagType===1){const p=e.modifiers.map(_=>_.content).map(_=>(ua(_)?_:JSON.stringify(_))+\": true\").join(\", \"),g=s?Ot(s)?`${s.content}Modifiers`:Zt([s,' + \"Modifiers\"']):\"modelModifiers\";h.push($e(g,ue(`{ ${p} }`,!1,e.loc,2)))}return Ms(h)};function Ms(e=[]){return{props:e}}const uv=/[\\w).+\\-_$\\]]/,fv=(e,t)=>{Wn(\"COMPILER_FILTERS\",t)&&(e.type===5?Ci(e.content,t):e.type===1&&e.props.forEach(n=>{n.type===7&&n.name!==\"for\"&&n.exp&&Ci(n.exp,t)}))};function Ci(e,t){if(e.type===4)Cc(e,t);else for(let n=0;n<e.children.length;n++){const r=e.children[n];typeof r==\"object\"&&(r.type===4?Cc(r,t):r.type===8?Ci(e,t):r.type===5&&Ci(r.content,t))}}function Cc(e,t){const n=e.content;let r=!1,s=!1,i=!1,o=!1,l=0,a=0,c=0,u=0,f,d,h,p,g=[];for(h=0;h<n.length;h++)if(d=f,f=n.charCodeAt(h),r)f===39&&d!==92&&(r=!1);else if(s)f===34&&d!==92&&(s=!1);else if(i)f===96&&d!==92&&(i=!1);else if(o)f===47&&d!==92&&(o=!1);else if(f===124&&n.charCodeAt(h+1)!==124&&n.charCodeAt(h-1)!==124&&!l&&!a&&!c)p===void 0?(u=h+1,p=n.slice(0,h).trim()):_();else{switch(f){case 34:s=!0;break;case 39:r=!0;break;case 96:i=!0;break;case 40:c++;break;case 41:c--;break;case 91:a++;break;case 93:a--;break;case 123:l++;break;case 125:l--;break}if(f===47){let w=h-1,C;for(;w>=0&&(C=n.charAt(w),C===\" \");w--);(!C||!uv.test(C))&&(o=!0)}}p===void 0?p=n.slice(0,h).trim():u!==0&&_();function _(){g.push(n.slice(u,h).trim()),u=h+1}if(g.length){for(h=0;h<g.length;h++)p=dv(p,g[h],t);e.content=p,e.ast=void 0}}function dv(e,t,n){n.helper(ea);const r=t.indexOf(\"(\");if(r<0)return n.filters.add(t),`${as(t,\"filter\")}(${e})`;{const s=t.slice(0,r),i=t.slice(r+1);return n.filters.add(s),`${as(s,\"filter\")}(${e}${i!==\")\"?\",\"+i:i}`}}const wc=new WeakSet,hv=(e,t)=>{if(e.type===1){const n=Dt(e,\"memo\");return!n||wc.has(e)?void 0:(wc.add(e),()=>{const r=e.codegenNode||t.currentNode.codegenNode;r&&r.type===13&&(e.tagType!==1&&aa(r,t),e.codegenNode=He(t.helper(la),[n.exp,Sr(void 0,r),\"_cache\",String(t.cached.length)]),t.cached.push(null))})}};function pv(e){return[[cv,Kb,hv,Gb,fv,ov,tv,Yb,av],{on:jd,bind:zb,model:Ud}]}function mv(e,t={}){const n=t.onError||ca,r=t.mode===\"module\";t.prefixIdentifiers===!0?n(ke(47)):r&&n(ke(48));const s=!1;t.cacheHandlers&&n(ke(49)),t.scopeId&&!r&&n(ke(50));const i=he({},t,{prefixIdentifiers:s}),o=ae(e)?Eb(e,i):e,[l,a]=pv();return wb(o,he({},i,{nodeTransforms:[...l,...t.nodeTransforms||[]],directiveTransforms:he({},a,t.directiveTransforms||{})})),xb(o,i)}const gv=()=>({props:[]});/**\n* @vue/compiler-dom v3.5.13\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/const Hd=Symbol(\"\"),qd=Symbol(\"\"),Kd=Symbol(\"\"),Wd=Symbol(\"\"),al=Symbol(\"\"),Zd=Symbol(\"\"),zd=Symbol(\"\"),Gd=Symbol(\"\"),Jd=Symbol(\"\"),Xd=Symbol(\"\");Wy({[Hd]:\"vModelRadio\",[qd]:\"vModelCheckbox\",[Kd]:\"vModelText\",[Wd]:\"vModelSelect\",[al]:\"vModelDynamic\",[Zd]:\"withModifiers\",[zd]:\"withKeys\",[Gd]:\"vShow\",[Jd]:\"Transition\",[Xd]:\"TransitionGroup\"});let ir;function yv(e,t=!1){return ir||(ir=document.createElement(\"div\")),t?(ir.innerHTML=`<div foo=\"${e.replace(/\"/g,\"&quot;\")}\">`,ir.children[0].getAttribute(\"foo\")):(ir.innerHTML=e,ir.textContent)}const bv={parseMode:\"html\",isVoidTag:pp,isNativeTag:e=>fp(e)||dp(e)||hp(e),isPreTag:e=>e===\"pre\",isIgnoreNewlineTag:e=>e===\"pre\"||e===\"textarea\",decodeEntities:yv,isBuiltInComponent:e=>{if(e===\"Transition\"||e===\"transition\")return Jd;if(e===\"TransitionGroup\"||e===\"transition-group\")return Xd},getNamespace(e,t,n){let r=t?t.ns:n;if(t&&r===2)if(t.tag===\"annotation-xml\"){if(e===\"svg\")return 1;t.props.some(s=>s.type===6&&s.name===\"encoding\"&&s.value!=null&&(s.value.content===\"text/html\"||s.value.content===\"application/xhtml+xml\"))&&(r=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&e!==\"mglyph\"&&e!==\"malignmark\"&&(r=0);else t&&r===1&&(t.tag===\"foreignObject\"||t.tag===\"desc\"||t.tag===\"title\")&&(r=0);if(r===0){if(e===\"svg\")return 1;if(e===\"math\")return 2}return r}},vv=e=>{e.type===1&&e.props.forEach((t,n)=>{t.type===6&&t.name===\"style\"&&t.value&&(e.props[n]={type:7,name:\"bind\",arg:ue(\"style\",!0,t.loc),exp:_v(t.value.content,t.loc),modifiers:[],loc:t.loc})})},_v=(e,t)=>{const n=au(e);return ue(JSON.stringify(n),!1,t,3)};function On(e,t){return ke(e,t)}const Sv=(e,t,n)=>{const{exp:r,loc:s}=e;return r||n.onError(On(53,s)),t.children.length&&(n.onError(On(54,s)),t.children.length=0),{props:[$e(ue(\"innerHTML\",!0,s),r||ue(\"\",!0))]}},Ev=(e,t,n)=>{const{exp:r,loc:s}=e;return r||n.onError(On(55,s)),t.children.length&&(n.onError(On(56,s)),t.children.length=0),{props:[$e(ue(\"textContent\",!0),r?It(r,n)>0?r:He(n.helperString(Xi),[r],s):ue(\"\",!0))]}},Av=(e,t,n)=>{const r=Ud(e,t,n);if(!r.props.length||t.tagType===1)return r;e.arg&&n.onError(On(58,e.arg.loc));const{tag:s}=t,i=n.isCustomElement(s);if(s===\"input\"||s===\"textarea\"||s===\"select\"||i){let o=Kd,l=!1;if(s===\"input\"||i){const a=Yi(t,\"type\");if(a){if(a.type===7)o=al;else if(a.value)switch(a.value.content){case\"radio\":o=Hd;break;case\"checkbox\":o=qd;break;case\"file\":l=!0,n.onError(On(59,e.loc));break}}else ib(t)&&(o=al)}else s===\"select\"&&(o=Wd);l||(r.needRuntime=n.helper(o))}else n.onError(On(57,e.loc));return r.props=r.props.filter(o=>!(o.key.type===4&&o.key.content===\"modelValue\")),r},Tv=Mt(\"passive,once,capture\"),Cv=Mt(\"stop,prevent,self,ctrl,shift,alt,meta,exact,middle\"),wv=Mt(\"left,right\"),Yd=Mt(\"onkeyup,onkeydown,onkeypress\"),Ov=(e,t,n,r)=>{const s=[],i=[],o=[];for(let l=0;l<t.length;l++){const a=t[l].content;a===\"native\"&&ls(\"COMPILER_V_ON_NATIVE\",n)||Tv(a)?o.push(a):wv(a)?Ot(e)?Yd(e.content.toLowerCase())?s.push(a):i.push(a):(s.push(a),i.push(a)):Cv(a)?i.push(a):s.push(a)}return{keyModifiers:s,nonKeyModifiers:i,eventOptionModifiers:o}},Oc=(e,t)=>Ot(e)&&e.content.toLowerCase()===\"onclick\"?ue(t,!0):e.type!==4?Zt([\"(\",e,`) === \"onClick\" ? \"${t}\" : (`,e,\")\"]):e,Nv=(e,t,n)=>jd(e,t,n,r=>{const{modifiers:s}=e;if(!s.length)return r;let{key:i,value:o}=r.props[0];const{keyModifiers:l,nonKeyModifiers:a,eventOptionModifiers:c}=Ov(i,s,n,e.loc);if(a.includes(\"right\")&&(i=Oc(i,\"onContextmenu\")),a.includes(\"middle\")&&(i=Oc(i,\"onMouseup\")),a.length&&(o=He(n.helper(Zd),[o,JSON.stringify(a)])),l.length&&(!Ot(i)||Yd(i.content.toLowerCase()))&&(o=He(n.helper(zd),[o,JSON.stringify(l)])),c.length){const u=c.map(er).join(\"\");i=Ot(i)?ue(`${i.content}${u}`,!0):Zt([\"(\",i,`) + \"${u}\"`])}return{props:[$e(i,o)]}}),Rv=(e,t,n)=>{const{exp:r,loc:s}=e;return r||n.onError(On(61,s)),{props:[],needRuntime:n.helper(Gd)}},xv=(e,t)=>{e.type===1&&e.tagType===0&&(e.tag===\"script\"||e.tag===\"style\")&&t.removeNode()},Iv=[vv],Pv={cloak:gv,html:Sv,text:Ev,model:Av,on:Nv,show:Rv};function kv(e,t={}){return mv(e,he({},bv,t,{nodeTransforms:[xv,...Iv,...t.nodeTransforms||[]],directiveTransforms:he({},Pv,t.directiveTransforms||{}),transformHoist:null}))}/**\n* vue v3.5.13\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/const Nc=Object.create(null);function Vv(e,t){if(!ae(e))if(e.nodeType)e=e.innerHTML;else return Ge;const n=ep(e,t),r=Nc[n];if(r)return r;if(e[0]===\"#\"){const l=document.querySelector(e);e=l?l.innerHTML:\"\"}const s=he({hoistStatic:!0,onError:void 0,onWarn:Ge},t);!s.isCustomElement&&typeof customElements<\"u\"&&(s.isCustomElement=l=>!!customElements.get(l));const{code:i}=kv(e,s),o=new Function(\"Vue\",i)(By);return o._rc=!0,Nc[n]=o}$f(Vv);function ze(e){return typeof e==\"function\"}function Qd(e){return e==null}const Jn=e=>e!==null&&!!e&&typeof e==\"object\"&&!Array.isArray(e);function ha(e){return Number(e)>=0}function Mv(e){const t=parseFloat(e);return isNaN(t)?e:t}function Fv(e){return typeof e==\"object\"&&e!==null}function Lv(e){return e==null?e===void 0?\"[object Undefined]\":\"[object Null]\":Object.prototype.toString.call(e)}function Rc(e){if(!Fv(e)||Lv(e)!==\"[object Object]\")return!1;if(Object.getPrototypeOf(e)===null)return!0;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}function us(e,t){return Object.keys(t).forEach(n=>{if(Rc(t[n])&&Rc(e[n])){e[n]||(e[n]={}),us(e[n],t[n]);return}e[n]=t[n]}),e}function Dr(e){const t=e.split(\".\");if(!t.length)return\"\";let n=String(t[0]);for(let r=1;r<t.length;r++){if(ha(t[r])){n+=`[${t[r]}]`;continue}n+=`.${t[r]}`}return n}const eh={};function th(e,t){Dv(e,t),eh[e]=t}function $v(e){return eh[e]}function Dv(e,t){if(!ze(t))throw new Error(`Extension Error: The validator '${e}' must be a function.`)}function xc(e,t,n){typeof n.value==\"object\"&&(n.value=ve(n.value)),!n.enumerable||n.get||n.set||!n.configurable||!n.writable||t===\"__proto__\"?Object.defineProperty(e,t,n):e[t]=n.value}function ve(e){if(typeof e!=\"object\")return e;var t=0,n,r,s,i=Object.prototype.toString.call(e);if(i===\"[object Object]\"?s=Object.create(e.__proto__||null):i===\"[object Array]\"?s=Array(e.length):i===\"[object Set]\"?(s=new Set,e.forEach(function(o){s.add(ve(o))})):i===\"[object Map]\"?(s=new Map,e.forEach(function(o,l){s.set(ve(l),ve(o))})):i===\"[object Date]\"?s=new Date(+e):i===\"[object RegExp]\"?s=new RegExp(e.source,e.flags):i===\"[object DataView]\"?s=new e.constructor(ve(e.buffer)):i===\"[object ArrayBuffer]\"?s=e.slice(0):i.slice(-6)===\"Array]\"&&(s=new e.constructor(e)),s){for(r=Object.getOwnPropertySymbols(e);t<r.length;t++)xc(s,r[t],Object.getOwnPropertyDescriptor(e,r[t]));for(t=0,r=Object.getOwnPropertyNames(e);t<r.length;t++)Object.hasOwnProperty.call(s,n=r[t])&&s[n]===e[n]||xc(s,n,Object.getOwnPropertyDescriptor(e,n))}return s||e}const to=Symbol(\"vee-validate-form\"),Bv=Symbol(\"vee-validate-form-context\"),jv=Symbol(\"vee-validate-field-instance\"),wi=Symbol(\"Default empty value\"),Uv=typeof window<\"u\";function cl(e){return ze(e)&&!!e.__locatorRef}function Kt(e){return!!e&&ze(e.parse)&&e.__type===\"VVTypedSchema\"}function Oi(e){return!!e&&ze(e.validate)}function Ss(e){return e===\"checkbox\"||e===\"radio\"}function Hv(e){return Jn(e)||Array.isArray(e)}function qv(e){return Array.isArray(e)?e.length===0:Jn(e)&&Object.keys(e).length===0}function no(e){return/^\\[.+\\]$/i.test(e)}function Kv(e){return nh(e)&&e.multiple}function nh(e){return e.tagName===\"SELECT\"}function Wv(e,t){const n=![!1,null,void 0,0].includes(t.multiple)&&!Number.isNaN(t.multiple);return e===\"select\"&&\"multiple\"in t&&n}function Zv(e,t){return!Wv(e,t)&&t.type!==\"file\"&&!Ss(t.type)}function rh(e){return pa(e)&&e.target&&\"submit\"in e.target}function pa(e){return e?!!(typeof Event<\"u\"&&ze(Event)&&e instanceof Event||e&&e.srcElement):!1}function Ic(e,t){return t in e&&e[t]!==wi}function bt(e,t){if(e===t)return!0;if(e&&t&&typeof e==\"object\"&&typeof t==\"object\"){if(e.constructor!==t.constructor)return!1;var n,r,s;if(Array.isArray(e)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(!bt(e[r],t[r]))return!1;return!0}if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(r of e.entries())if(!t.has(r[0]))return!1;for(r of e.entries())if(!bt(r[1],t.get(r[0])))return!1;return!0}if(kc(e)&&kc(t))return!(e.size!==t.size||e.name!==t.name||e.lastModified!==t.lastModified||e.type!==t.type);if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(r of e.entries())if(!t.has(r[0]))return!1;return!0}if(ArrayBuffer.isView(e)&&ArrayBuffer.isView(t)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(e[r]!==t[r])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();if(s=Object.keys(e),n=s.length-Pc(e,s),n!==Object.keys(t).length-Pc(t,Object.keys(t)))return!1;for(r=n;r--!==0;)if(!Object.prototype.hasOwnProperty.call(t,s[r]))return!1;for(r=n;r--!==0;){var i=s[r];if(!bt(e[i],t[i]))return!1}return!0}return e!==e&&t!==t}function Pc(e,t){let n=0;for(let s=t.length;s--!==0;){var r=t[s];e[r]===void 0&&n++}return n}function kc(e){return Uv?e instanceof File:!1}function ma(e){return no(e)?e.replace(/\\[|\\]/gi,\"\"):e}function wt(e,t,n){return e?no(t)?e[ma(t)]:(t||\"\").split(/\\.|\\[(\\d+)\\]/).filter(Boolean).reduce((s,i)=>Hv(s)&&i in s?s[i]:n,e):n}function sn(e,t,n){if(no(t)){e[ma(t)]=n;return}const r=t.split(/\\.|\\[(\\d+)\\]/).filter(Boolean);let s=e;for(let i=0;i<r.length;i++){if(i===r.length-1){s[r[i]]=n;return}(!(r[i]in s)||Qd(s[r[i]]))&&(s[r[i]]=ha(r[i+1])?[]:{}),s=s[r[i]]}}function xo(e,t){if(Array.isArray(e)&&ha(t)){e.splice(Number(t),1);return}Jn(e)&&delete e[t]}function Vc(e,t){if(no(t)){delete e[ma(t)];return}const n=t.split(/\\.|\\[(\\d+)\\]/).filter(Boolean);let r=e;for(let i=0;i<n.length;i++){if(i===n.length-1){xo(r,n[i]);break}if(!(n[i]in r)||Qd(r[n[i]]))break;r=r[n[i]]}const s=n.map((i,o)=>wt(e,n.slice(0,o).join(\".\")));for(let i=s.length-1;i>=0;i--)if(qv(s[i])){if(i===0){xo(e,n[0]);continue}xo(s[i-1],n[i-1])}}function Rt(e){return Object.keys(e)}function sh(e,t=void 0){const n=dt();return(n==null?void 0:n.provides[e])||Hn(e,t)}function Mc(e,t,n){if(Array.isArray(e)){const r=[...e],s=r.findIndex(i=>bt(i,t));return s>=0?r.splice(s,1):r.push(t),r}return bt(e,t)?n:t}function Fc(e,t=0){let n=null,r=[];return function(...s){return n&&clearTimeout(n),n=setTimeout(()=>{const i=e(...s);r.forEach(o=>o(i)),r=[]},t),new Promise(i=>r.push(i))}}function zv(e,t){return Jn(t)&&t.number?Mv(e):e}function ul(e,t){let n;return async function(...s){const i=e(...s);n=i;const o=await i;return i!==n?o:(n=void 0,t(o,s))}}function fl(e){return Array.isArray(e)?e:e?[e]:[]}function Fs(e,t){const n={};for(const r in e)t.includes(r)||(n[r]=e[r]);return n}function Gv(e){let t=null,n=[];return function(...r){const s=At(()=>{if(t!==s)return;const i=e(...r);n.forEach(o=>o(i)),n=[],t=null});return t=s,new Promise(i=>n.push(i))}}function ga(e,t,n){return t.slots.default?typeof e==\"string\"||!e?t.slots.default(n()):{default:()=>{var r,s;return(s=(r=t.slots).default)===null||s===void 0?void 0:s.call(r,n())}}:t.slots.default}function Io(e){if(ih(e))return e._value}function ih(e){return\"_value\"in e}function Jv(e){return e.type===\"number\"||e.type===\"range\"?Number.isNaN(e.valueAsNumber)?e.value:e.valueAsNumber:e.value}function Ni(e){if(!pa(e))return e;const t=e.target;if(Ss(t.type)&&ih(t))return Io(t);if(t.type===\"file\"&&t.files){const n=Array.from(t.files);return t.multiple?n:n[0]}if(Kv(t))return Array.from(t.options).filter(n=>n.selected&&!n.disabled).map(Io);if(nh(t)){const n=Array.from(t.options).find(r=>r.selected);return n?Io(n):t.value}return Jv(t)}function oh(e){const t={};return Object.defineProperty(t,\"_$$isNormalized\",{value:!0,writable:!1,enumerable:!1,configurable:!1}),e?Jn(e)&&e._$$isNormalized?e:Jn(e)?Object.keys(e).reduce((n,r)=>{const s=Xv(e[r]);return e[r]!==!1&&(n[r]=Lc(s)),n},t):typeof e!=\"string\"?t:e.split(\"|\").reduce((n,r)=>{const s=Yv(r);return s.name&&(n[s.name]=Lc(s.params)),n},t):t}function Xv(e){return e===!0?[]:Array.isArray(e)||Jn(e)?e:[e]}function Lc(e){const t=n=>typeof n==\"string\"&&n[0]===\"@\"?Qv(n.slice(1)):n;return Array.isArray(e)?e.map(t):e instanceof RegExp?[e]:Object.keys(e).reduce((n,r)=>(n[r]=t(e[r]),n),{})}const Yv=e=>{let t=[];const n=e.split(\":\")[0];return e.includes(\":\")&&(t=e.split(\":\").slice(1).join(\":\").split(\",\")),{name:n,params:t}};function Qv(e){const t=n=>{var r;return(r=wt(n,e))!==null&&r!==void 0?r:n[e]};return t.__locatorRef=e,t}function e0(e){return Array.isArray(e)?e.filter(cl):Rt(e).filter(t=>cl(e[t])).map(t=>e[t])}const t0={generateMessage:({field:e})=>`${e} is not valid.`,bails:!0,validateOnBlur:!0,validateOnChange:!0,validateOnInput:!1,validateOnModelUpdate:!0};let dl=Object.assign({},t0);const Dn=()=>dl,n0=e=>{dl=Object.assign(Object.assign({},dl),e)},r0=n0;async function lh(e,t,n={}){const r=n==null?void 0:n.bails,s={name:(n==null?void 0:n.name)||\"{field}\",rules:t,label:n==null?void 0:n.label,bails:r??!0,formData:(n==null?void 0:n.values)||{}},i=await s0(s,e);return Object.assign(Object.assign({},i),{valid:!i.errors.length})}async function s0(e,t){const n=e.rules;if(Kt(n)||Oi(n))return o0(t,Object.assign(Object.assign({},e),{rules:n}));if(ze(n)||Array.isArray(n)){const l={field:e.label||e.name,name:e.name,label:e.label,form:e.formData,value:t},a=Array.isArray(n)?n:[n],c=a.length,u=[];for(let f=0;f<c;f++){const d=a[f],h=await d(t,l);if(!(typeof h!=\"string\"&&!Array.isArray(h)&&h)){if(Array.isArray(h))u.push(...h);else{const g=typeof h==\"string\"?h:ch(l);u.push(g)}if(e.bails)return{errors:u}}}return{errors:u}}const r=Object.assign(Object.assign({},e),{rules:oh(n)}),s=[],i=Object.keys(r.rules),o=i.length;for(let l=0;l<o;l++){const a=i[l],c=await l0(r,t,{name:a,params:r.rules[a]});if(c.error&&(s.push(c.error),e.bails))return{errors:s}}return{errors:s}}function i0(e){return!!e&&e.name===\"ValidationError\"}function ah(e){return{__type:\"VVTypedSchema\",async parse(n,r){var s;try{return{output:await e.validate(n,{abortEarly:!1,context:(r==null?void 0:r.formData)||{}}),errors:[]}}catch(i){if(!i0(i))throw i;if(!(!((s=i.inner)===null||s===void 0)&&s.length)&&i.errors.length)return{errors:[{path:i.path,errors:i.errors}]};const o=i.inner.reduce((l,a)=>{const c=a.path||\"\";return l[c]||(l[c]={errors:[],path:c}),l[c].errors.push(...a.errors),l},{});return{errors:Object.values(o)}}}}}async function o0(e,t){const r=await(Kt(t.rules)?t.rules:ah(t.rules)).parse(e,{formData:t.formData}),s=[];for(const i of r.errors)i.errors.length&&s.push(...i.errors);return{value:r.value,errors:s}}async function l0(e,t,n){const r=$v(n.name);if(!r)throw new Error(`No such validator '${n.name}' exists.`);const s=a0(n.params,e.formData),i={field:e.label||e.name,name:e.name,label:e.label,value:t,form:e.formData,rule:Object.assign(Object.assign({},n),{params:s})},o=await r(t,s,i);return typeof o==\"string\"?{error:o}:{error:o?void 0:ch(i)}}function ch(e){const t=Dn().generateMessage;return t?t(e):\"Field is invalid\"}function a0(e,t){const n=r=>cl(r)?r(t):r;return Array.isArray(e)?e.map(n):Object.keys(e).reduce((r,s)=>(r[s]=n(e[s]),r),{})}async function c0(e,t){const r=await(Kt(e)?e:ah(e)).parse(ve(t),{formData:ve(t)}),s={},i={};for(const o of r.errors){const l=o.errors,a=(o.path||\"\").replace(/\\[\"(\\d+)\"\\]/g,(c,u)=>`[${u}]`);s[a]={valid:!l.length,errors:l},l.length&&(i[a]=l[0])}return{valid:!r.errors.length,results:s,errors:i,values:r.value,source:\"schema\"}}async function u0(e,t,n){const s=Rt(e).map(async c=>{var u,f,d;const h=(u=n==null?void 0:n.names)===null||u===void 0?void 0:u[c],p=await lh(wt(t,c),e[c],{name:(h==null?void 0:h.name)||c,label:h==null?void 0:h.label,values:t,bails:(d=(f=n==null?void 0:n.bailsMap)===null||f===void 0?void 0:f[c])!==null&&d!==void 0?d:!0});return Object.assign(Object.assign({},p),{path:c})});let i=!0;const o=await Promise.all(s),l={},a={};for(const c of o)l[c.path]={valid:c.valid,errors:c.errors},c.valid||(i=!1,a[c.path]=c.errors[0]);return{valid:i,results:l,errors:a,source:\"schema\"}}let $c=0;function f0(e,t){const{value:n,initialValue:r,setInitialValue:s}=d0(e,t.modelValue,t.form);if(!t.form){let d=function(p){var g;\"value\"in p&&(n.value=p.value),\"errors\"in p&&c(p.errors),\"touched\"in p&&(f.touched=(g=p.touched)!==null&&g!==void 0?g:f.touched),\"initialValue\"in p&&s(p.initialValue)};var l=d;const{errors:a,setErrors:c}=m0(),u=$c>=Number.MAX_SAFE_INTEGER?0:++$c,f=p0(n,r,a,t.schema);return{id:u,path:e,value:n,initialValue:r,meta:f,flags:{pendingUnmount:{[u]:!1},pendingReset:!1},errors:a,setState:d}}const i=t.form.createPathState(e,{bails:t.bails,label:t.label,type:t.type,validate:t.validate,schema:t.schema}),o=ge(()=>i.errors);function l(a){var c,u,f;\"value\"in a&&(n.value=a.value),\"errors\"in a&&((c=t.form)===null||c===void 0||c.setFieldError(Te(e),a.errors)),\"touched\"in a&&((u=t.form)===null||u===void 0||u.setFieldTouched(Te(e),(f=a.touched)!==null&&f!==void 0?f:!1)),\"initialValue\"in a&&s(a.initialValue)}return{id:Array.isArray(i.id)?i.id[i.id.length-1]:i.id,path:e,value:n,errors:o,meta:i,initialValue:r,flags:i.__flags,setState:l}}function d0(e,t,n){const r=at(Te(t));function s(){return n?wt(n.initialValues.value,Te(e),Te(r)):Te(r)}function i(c){if(!n){r.value=c;return}n.setFieldInitialValue(Te(e),c,!0)}const o=ge(s);if(!n)return{value:at(s()),initialValue:o,setInitialValue:i};const l=h0(t,n,o,e);return n.stageInitialValue(Te(e),l,!0),{value:ge({get(){return wt(n.values,Te(e))},set(c){n.setFieldValue(Te(e),c,!1)}}),initialValue:o,setInitialValue:i}}function h0(e,t,n,r){return Ve(e)?Te(e):e!==void 0?e:wt(t.values,Te(r),Te(n))}function p0(e,t,n,r){const s=ge(()=>{var o,l,a;return(a=(l=(o=ne(r))===null||o===void 0?void 0:o.describe)===null||l===void 0?void 0:l.call(o).required)!==null&&a!==void 0?a:!1}),i=Rn({touched:!1,pending:!1,valid:!0,required:s,validated:!!Te(n).length,initialValue:ge(()=>Te(t)),dirty:ge(()=>!bt(Te(e),Te(t)))});return kt(n,o=>{i.valid=!o.length},{immediate:!0,flush:\"sync\"}),i}function m0(){const e=at([]);return{errors:e,setErrors:t=>{e.value=fl(t)}}}function g0(e,t,n){return Ss(n==null?void 0:n.type)?b0(e,t,n):uh(e,t,n)}function uh(e,t,n){const{initialValue:r,validateOnMount:s,bails:i,type:o,checkedValue:l,label:a,validateOnValueUpdate:c,uncheckedValue:u,controlled:f,keepValueOnUnmount:d,syncVModel:h,form:p}=y0(n),g=f?sh(to):void 0,_=p||g,w=ge(()=>Dr(ne(e))),C=ge(()=>{if(ne(_==null?void 0:_.schema))return;const le=Te(t);return Oi(le)||Kt(le)||ze(le)||Array.isArray(le)?le:oh(le)}),y=!ze(C.value)&&Kt(ne(t)),{id:b,value:A,initialValue:I,meta:V,setState:k,errors:T,flags:O}=f0(w,{modelValue:r,form:_,bails:i,label:a,type:o,validate:C.value?j:void 0,schema:y?t:void 0}),M=ge(()=>T.value[0]);h&&v0({value:A,prop:h,handleChange:U,shouldValidate:()=>c&&!O.pendingReset});const N=(X,le=!1)=>{V.touched=!0,le&&G()};async function B(X){var le,Ee;if(_!=null&&_.validateSchema){const{results:Ae}=await _.validateSchema(X);return(le=Ae[ne(w)])!==null&&le!==void 0?le:{valid:!0,errors:[]}}return C.value?lh(A.value,C.value,{name:ne(w),label:ne(a),values:(Ee=_==null?void 0:_.values)!==null&&Ee!==void 0?Ee:{},bails:i}):{valid:!0,errors:[]}}const G=ul(async()=>(V.pending=!0,V.validated=!0,B(\"validated-only\")),X=>(O.pendingUnmount[Xe.id]||(k({errors:X.errors}),V.pending=!1,V.valid=X.valid),X)),Y=ul(async()=>B(\"silent\"),X=>(V.valid=X.valid,X));function j(X){return(X==null?void 0:X.mode)===\"silent\"?Y():G()}function U(X,le=!0){const Ee=Ni(X);Je(Ee,le)}nr(()=>{if(s)return G();(!_||!_.validateSchema)&&Y()});function J(X){V.touched=X}function Se(X){var le;const Ee=X&&\"value\"in X?X.value:I.value;k({value:ve(Ee),initialValue:ve(Ee),touched:(le=X==null?void 0:X.touched)!==null&&le!==void 0?le:!1,errors:(X==null?void 0:X.errors)||[]}),V.pending=!1,V.validated=!1,Y()}const We=dt();function Je(X,le=!0){A.value=We&&h?zv(X,We.props.modelModifiers):X,(le?G:Y)()}function ht(X){k({errors:Array.isArray(X)?X:[X]})}const Rr=ge({get(){return A.value},set(X){Je(X,c)}}),Xe={id:b,name:w,label:a,value:Rr,meta:V,errors:T,errorMessage:M,type:o,checkedValue:l,uncheckedValue:u,bails:i,keepValueOnUnmount:d,resetField:Se,handleReset:()=>Se(),validate:j,handleChange:U,handleBlur:N,setState:k,setTouched:J,setErrors:ht,setValue:Je};if(ts(jv,Xe),Ve(t)&&typeof Te(t)!=\"function\"&&kt(t,(X,le)=>{bt(X,le)||(V.validated?G():Y())},{deep:!0}),!_)return Xe;const xr=ge(()=>{const X=C.value;return!X||ze(X)||Oi(X)||Kt(X)||Array.isArray(X)?{}:Object.keys(X).reduce((le,Ee)=>{const Ae=e0(X[Ee]).map(Qe=>Qe.__locatorRef).reduce((Qe,vt)=>{const et=wt(_.values,vt)||_.values[vt];return et!==void 0&&(Qe[vt]=et),Qe},{});return Object.assign(le,Ae),le},{})});return kt(xr,(X,le)=>{if(!Object.keys(X).length)return;!bt(X,le)&&(V.validated?G():Y())}),ms(()=>{var X;const le=(X=ne(Xe.keepValueOnUnmount))!==null&&X!==void 0?X:ne(_.keepValuesOnUnmount),Ee=ne(w);if(le||!_||O.pendingUnmount[Xe.id]){_==null||_.removePathState(Ee,b);return}O.pendingUnmount[Xe.id]=!0;const Ae=_.getPathState(Ee);if(Array.isArray(Ae==null?void 0:Ae.id)&&(Ae!=null&&Ae.multiple)?Ae!=null&&Ae.id.includes(Xe.id):(Ae==null?void 0:Ae.id)===Xe.id){if(Ae!=null&&Ae.multiple&&Array.isArray(Ae.value)){const vt=Ae.value.findIndex(et=>bt(et,ne(Xe.checkedValue)));if(vt>-1){const et=[...Ae.value];et.splice(vt,1),_.setFieldValue(Ee,et)}Array.isArray(Ae.id)&&Ae.id.splice(Ae.id.indexOf(Xe.id),1)}else _.unsetPathValue(ne(w));_.removePathState(Ee,b)}}),Xe}function y0(e){const t=()=>({initialValue:void 0,validateOnMount:!1,bails:!0,label:void 0,validateOnValueUpdate:!0,keepValueOnUnmount:void 0,syncVModel:!1,controlled:!0}),n=!!(e!=null&&e.syncVModel),r=typeof(e==null?void 0:e.syncVModel)==\"string\"?e.syncVModel:(e==null?void 0:e.modelPropName)||\"modelValue\",s=n&&!(\"initialValue\"in(e||{}))?hl(dt(),r):e==null?void 0:e.initialValue;if(!e)return Object.assign(Object.assign({},t()),{initialValue:s});const i=\"valueProp\"in e?e.valueProp:e.checkedValue,o=\"standalone\"in e?!e.standalone:e.controlled,l=(e==null?void 0:e.modelPropName)||(e==null?void 0:e.syncVModel)||!1;return Object.assign(Object.assign(Object.assign({},t()),e||{}),{initialValue:s,controlled:o??!0,checkedValue:i,syncVModel:l})}function b0(e,t,n){const r=n!=null&&n.standalone?void 0:sh(to),s=n==null?void 0:n.checkedValue,i=n==null?void 0:n.uncheckedValue;function o(l){const a=l.handleChange,c=ge(()=>{const f=ne(l.value),d=ne(s);return Array.isArray(f)?f.findIndex(h=>bt(h,d))>=0:bt(d,f)});function u(f,d=!0){var h,p;if(c.value===((h=f==null?void 0:f.target)===null||h===void 0?void 0:h.checked)){d&&l.validate();return}const g=ne(e),_=r==null?void 0:r.getPathState(g),w=Ni(f);let C=(p=ne(s))!==null&&p!==void 0?p:w;r&&(_!=null&&_.multiple)&&_.type===\"checkbox\"?C=Mc(wt(r.values,g)||[],C,void 0):(n==null?void 0:n.type)===\"checkbox\"&&(C=Mc(ne(l.value),C,ne(i))),a(C,d)}return Object.assign(Object.assign({},l),{checked:c,checkedValue:s,uncheckedValue:i,handleChange:u})}return o(uh(e,t,n))}function v0({prop:e,value:t,handleChange:n,shouldValidate:r}){const s=dt();if(!s||!e)return;const i=typeof e==\"string\"?e:\"modelValue\",o=`update:${i}`;i in s.props&&(kt(t,l=>{bt(l,hl(s,i))||s.emit(o,l)}),kt(()=>hl(s,i),l=>{if(l===wi&&t.value===void 0)return;const a=l===wi?void 0:l;bt(a,t.value)||n(a,r())}))}function hl(e,t){if(e)return e.props[t]}const _0=wr({name:\"Field\",inheritAttrs:!1,props:{as:{type:[String,Object],default:void 0},name:{type:String,required:!0},rules:{type:[Object,String,Function],default:void 0},validateOnMount:{type:Boolean,default:!1},validateOnBlur:{type:Boolean,default:void 0},validateOnChange:{type:Boolean,default:void 0},validateOnInput:{type:Boolean,default:void 0},validateOnModelUpdate:{type:Boolean,default:void 0},bails:{type:Boolean,default:()=>Dn().bails},label:{type:String,default:void 0},uncheckedValue:{type:null,default:void 0},modelValue:{type:null,default:wi},modelModifiers:{type:null,default:()=>({})},\"onUpdate:modelValue\":{type:null,default:void 0},standalone:{type:Boolean,default:!1},keepValue:{type:Boolean,default:void 0}},setup(e,t){const n=En(e,\"rules\"),r=En(e,\"name\"),s=En(e,\"label\"),i=En(e,\"uncheckedValue\"),o=En(e,\"keepValue\"),{errors:l,value:a,errorMessage:c,validate:u,handleChange:f,handleBlur:d,setTouched:h,resetField:p,handleReset:g,meta:_,checked:w,setErrors:C,setValue:y}=g0(r,n,{validateOnMount:e.validateOnMount,bails:e.bails,standalone:e.standalone,type:t.attrs.type,initialValue:E0(e,t),checkedValue:t.attrs.value,uncheckedValue:i,label:s,validateOnValueUpdate:e.validateOnModelUpdate,keepValueOnUnmount:o,syncVModel:!0}),b=function(O,M=!0){f(O,M)},A=ge(()=>{const{validateOnInput:T,validateOnChange:O,validateOnBlur:M,validateOnModelUpdate:N}=S0(e);function B(U){d(U,M),ze(t.attrs.onBlur)&&t.attrs.onBlur(U)}function G(U){b(U,T),ze(t.attrs.onInput)&&t.attrs.onInput(U)}function Y(U){b(U,O),ze(t.attrs.onChange)&&t.attrs.onChange(U)}const j={name:e.name,onBlur:B,onInput:G,onChange:Y};return j[\"onUpdate:modelValue\"]=U=>b(U,N),j}),I=ge(()=>{const T=Object.assign({},A.value);Ss(t.attrs.type)&&w&&(T.checked=w.value);const O=Dc(e,t);return Zv(O,t.attrs)&&(T.value=a.value),T}),V=ge(()=>Object.assign(Object.assign({},A.value),{modelValue:a.value}));function k(){return{field:I.value,componentField:V.value,value:a.value,meta:_,errors:l.value,errorMessage:c.value,validate:u,resetField:p,handleChange:b,handleInput:T=>b(T,!1),handleReset:g,handleBlur:A.value.onBlur,setTouched:h,setErrors:C,setValue:y}}return t.expose({value:a,meta:_,errors:l,errorMessage:c,setErrors:C,setTouched:h,setValue:y,reset:p,validate:u,handleChange:f}),()=>{const T=Zi(Dc(e,t)),O=ga(T,t,k);return T?yr(T,Object.assign(Object.assign({},t.attrs),I.value),O):O}}});function Dc(e,t){let n=e.as||\"\";return!e.as&&!t.slots.default&&(n=\"input\"),n}function S0(e){var t,n,r,s;const{validateOnInput:i,validateOnChange:o,validateOnBlur:l,validateOnModelUpdate:a}=Dn();return{validateOnInput:(t=e.validateOnInput)!==null&&t!==void 0?t:i,validateOnChange:(n=e.validateOnChange)!==null&&n!==void 0?n:o,validateOnBlur:(r=e.validateOnBlur)!==null&&r!==void 0?r:l,validateOnModelUpdate:(s=e.validateOnModelUpdate)!==null&&s!==void 0?s:a}}function E0(e,t){return Ss(t.attrs.type)?Ic(e,\"modelValue\")?e.modelValue:void 0:Ic(e,\"modelValue\")?e.modelValue:t.attrs.value}const A0=_0;let T0=0;const Ls=[\"bails\",\"fieldsCount\",\"id\",\"multiple\",\"type\",\"validate\"];function fh(e){const t=(e==null?void 0:e.initialValues)||{},n=Object.assign({},ne(t)),r=Te(e==null?void 0:e.validationSchema);return r&&Kt(r)&&ze(r.cast)?ve(r.cast(n)||{}):ve(n)}function C0(e){var t;const n=T0++,r=(e==null?void 0:e.name)||\"Form\";let s=0;const i=at(!1),o=at(!1),l=at(0),a=[],c=Rn(fh(e)),u=at([]),f=at({}),d=at({}),h=Gv(()=>{d.value=u.value.reduce((S,E)=>(S[Dr(ne(E.path))]=E,S),{})});function p(S,E){const P=U(S);if(!P){typeof S==\"string\"&&(f.value[Dr(S)]=fl(E));return}if(typeof S==\"string\"){const W=Dr(S);f.value[W]&&delete f.value[W]}P.errors=fl(E),P.valid=!P.errors.length}function g(S){Rt(S).forEach(E=>{p(E,S[E])})}e!=null&&e.initialErrors&&g(e.initialErrors);const _=ge(()=>{const S=u.value.reduce((E,P)=>(P.errors.length&&(E[ne(P.path)]=P.errors),E),{});return Object.assign(Object.assign({},f.value),S)}),w=ge(()=>Rt(_.value).reduce((S,E)=>{const P=_.value[E];return P!=null&&P.length&&(S[E]=P[0]),S},{})),C=ge(()=>u.value.reduce((S,E)=>(S[ne(E.path)]={name:ne(E.path)||\"\",label:E.label||\"\"},S),{})),y=ge(()=>u.value.reduce((S,E)=>{var P;return S[ne(E.path)]=(P=E.bails)!==null&&P!==void 0?P:!0,S},{})),b=Object.assign({},(e==null?void 0:e.initialErrors)||{}),A=(t=e==null?void 0:e.keepValuesOnUnmount)!==null&&t!==void 0?t:!1,{initialValues:I,originalInitialValues:V,setInitialValues:k}=O0(u,c,e),T=w0(u,c,V,w),O=ge(()=>u.value.reduce((S,E)=>{const P=wt(c,ne(E.path));return sn(S,ne(E.path),P),S},{})),M=e==null?void 0:e.validationSchema;function N(S,E){var P,W;const se=ge(()=>wt(I.value,ne(S))),te=d.value[ne(S)],Q=(E==null?void 0:E.type)===\"checkbox\"||(E==null?void 0:E.type)===\"radio\";if(te&&Q){te.multiple=!0;const Lt=s++;return Array.isArray(te.id)?te.id.push(Lt):te.id=[te.id,Lt],te.fieldsCount++,te.__flags.pendingUnmount[Lt]=!1,te}const Oe=ge(()=>wt(c,ne(S))),De=ne(S),nt=Se.findIndex(Lt=>Lt===De);nt!==-1&&Se.splice(nt,1);const Re=ge(()=>{var Lt,Ir,fo,ho;const po=ne(M);if(Kt(po))return(Ir=(Lt=po.describe)===null||Lt===void 0?void 0:Lt.call(po,ne(S)).required)!==null&&Ir!==void 0?Ir:!1;const mo=ne(E==null?void 0:E.schema);return Kt(mo)&&(ho=(fo=mo.describe)===null||fo===void 0?void 0:fo.call(mo).required)!==null&&ho!==void 0?ho:!1}),rt=s++,_t=Rn({id:rt,path:S,touched:!1,pending:!1,valid:!0,validated:!!(!((P=b[De])===null||P===void 0)&&P.length),required:Re,initialValue:se,errors:Nl([]),bails:(W=E==null?void 0:E.bails)!==null&&W!==void 0?W:!1,label:E==null?void 0:E.label,type:(E==null?void 0:E.type)||\"default\",value:Oe,multiple:!1,__flags:{pendingUnmount:{[rt]:!1},pendingReset:!1},fieldsCount:1,validate:E==null?void 0:E.validate,dirty:ge(()=>!bt(Te(Oe),Te(se)))});return u.value.push(_t),d.value[De]=_t,h(),w.value[De]&&!b[De]&&At(()=>{H(De,{mode:\"silent\"})}),Ve(S)&&kt(S,Lt=>{h();const Ir=ve(Oe.value);d.value[Lt]=_t,At(()=>{sn(c,Lt,Ir)})}),_t}const B=Fc(Z,5),G=Fc(Z,5),Y=ul(async S=>await(S===\"silent\"?B():G()),(S,[E])=>{const P=Rt(le.errorBag.value),se=[...new Set([...Rt(S.results),...u.value.map(te=>te.path),...P])].sort().reduce((te,Q)=>{var Oe;const De=Q,nt=U(De)||J(De),Re=((Oe=S.results[De])===null||Oe===void 0?void 0:Oe.errors)||[],rt=ne(nt==null?void 0:nt.path)||De,_t=N0({errors:Re,valid:!Re.length},te.results[rt]);return te.results[rt]=_t,_t.valid||(te.errors[rt]=_t.errors[0]),nt&&f.value[rt]&&delete f.value[rt],nt?(nt.valid=_t.valid,E===\"silent\"||E===\"validated-only\"&&!nt.validated||p(nt,_t.errors),te):(p(rt,Re),te)},{valid:S.valid,results:{},errors:{},source:S.source});return S.values&&(se.values=S.values,se.source=S.source),Rt(se.results).forEach(te=>{var Q;const Oe=U(te);Oe&&E!==\"silent\"&&(E===\"validated-only\"&&!Oe.validated||p(Oe,(Q=se.results[te])===null||Q===void 0?void 0:Q.errors))}),se});function j(S){u.value.forEach(S)}function U(S){const E=typeof S==\"string\"?Dr(S):S;return typeof E==\"string\"?d.value[E]:E}function J(S){return u.value.filter(P=>S.startsWith(ne(P.path))).reduce((P,W)=>P?W.path.length>P.path.length?W:P:W,void 0)}let Se=[],We;function Je(S){return Se.push(S),We||(We=At(()=>{[...Se].sort().reverse().forEach(P=>{Vc(c,P)}),Se=[],We=null})),We}function ht(S){return function(P,W){return function(te){return te instanceof Event&&(te.preventDefault(),te.stopPropagation()),j(Q=>Q.touched=!0),i.value=!0,l.value++,K().then(Q=>{const Oe=ve(c);if(Q.valid&&typeof P==\"function\"){const De=ve(O.value);let nt=S?De:Oe;return Q.values&&(nt=Q.source===\"schema\"?Q.values:Object.assign({},nt,Q.values)),P(nt,{evt:te,controlledValues:De,setErrors:g,setFieldError:p,setTouched:$,setFieldTouched:et,setValues:Qe,setFieldValue:Ee,resetForm:L,resetField:F})}!Q.valid&&typeof W==\"function\"&&W({values:Oe,evt:te,errors:Q.errors,results:Q.results})}).then(Q=>(i.value=!1,Q),Q=>{throw i.value=!1,Q})}}}const Xe=ht(!1);Xe.withControlled=ht(!0);function xr(S,E){const P=u.value.findIndex(se=>se.path===S&&(Array.isArray(se.id)?se.id.includes(E):se.id===E)),W=u.value[P];if(!(P===-1||!W)){if(At(()=>{H(S,{mode:\"silent\",warn:!1})}),W.multiple&&W.fieldsCount&&W.fieldsCount--,Array.isArray(W.id)){const se=W.id.indexOf(E);se>=0&&W.id.splice(se,1),delete W.__flags.pendingUnmount[E]}(!W.multiple||W.fieldsCount<=0)&&(u.value.splice(P,1),q(S),h(),delete d.value[S])}}function X(S){Rt(d.value).forEach(E=>{E.startsWith(S)&&delete d.value[E]}),u.value=u.value.filter(E=>!E.path.startsWith(S)),At(()=>{h()})}const le={name:r,formId:n,values:c,controlledValues:O,errorBag:_,errors:w,schema:M,submitCount:l,meta:T,isSubmitting:i,isValidating:o,fieldArrays:a,keepValuesOnUnmount:A,validateSchema:Te(M)?Y:void 0,validate:K,setFieldError:p,validateField:H,setFieldValue:Ee,setValues:Qe,setErrors:g,setFieldTouched:et,setTouched:$,resetForm:L,resetField:F,handleSubmit:Xe,useFieldModel:fe,defineInputBinds:we,defineComponentBinds:ye,defineField:oe,stageInitialValue:D,unsetInitialValue:q,setFieldInitialValue:re,createPathState:N,getPathState:U,unsetPathValue:Je,removePathState:xr,initialValues:I,getAllPathStates:()=>u.value,destroyPath:X,isFieldTouched:m,isFieldDirty:v,isFieldValid:x};function Ee(S,E,P=!0){const W=ve(E),se=typeof S==\"string\"?S:S.path;U(se)||N(se),sn(c,se,W),P&&H(se)}function Ae(S,E=!0){Rt(c).forEach(P=>{delete c[P]}),Rt(S).forEach(P=>{Ee(P,S[P],!1)}),E&&K()}function Qe(S,E=!0){us(c,S),a.forEach(P=>P&&P.reset()),E&&K()}function vt(S,E){const P=U(ne(S))||N(S);return ge({get(){return P.value},set(W){var se;const te=ne(S);Ee(te,W,(se=ne(E))!==null&&se!==void 0?se:!1)}})}function et(S,E){const P=U(S);P&&(P.touched=E)}function m(S){const E=U(S);return E?E.touched:u.value.filter(P=>P.path.startsWith(S)).some(P=>P.touched)}function v(S){const E=U(S);return E?E.dirty:u.value.filter(P=>P.path.startsWith(S)).some(P=>P.dirty)}function x(S){const E=U(S);return E?E.valid:u.value.filter(P=>P.path.startsWith(S)).every(P=>P.valid)}function $(S){if(typeof S==\"boolean\"){j(E=>{E.touched=S});return}Rt(S).forEach(E=>{et(E,!!S[E])})}function F(S,E){var P;const W=E&&\"value\"in E?E.value:wt(I.value,S),se=U(S);se&&(se.__flags.pendingReset=!0),re(S,ve(W),!0),Ee(S,W,!1),et(S,(P=E==null?void 0:E.touched)!==null&&P!==void 0?P:!1),p(S,(E==null?void 0:E.errors)||[]),At(()=>{se&&(se.__flags.pendingReset=!1)})}function L(S,E){let P=ve(S!=null&&S.values?S.values:V.value);P=E!=null&&E.force?P:us(V.value,P),P=Kt(M)&&ze(M.cast)?M.cast(P):P,k(P,{force:E==null?void 0:E.force}),j(W=>{var se;W.__flags.pendingReset=!0,W.validated=!1,W.touched=((se=S==null?void 0:S.touched)===null||se===void 0?void 0:se[ne(W.path)])||!1,Ee(ne(W.path),wt(P,ne(W.path)),!1),p(ne(W.path),void 0)}),E!=null&&E.force?Ae(P,!1):Qe(P,!1),g((S==null?void 0:S.errors)||{}),l.value=(S==null?void 0:S.submitCount)||0,At(()=>{K({mode:\"silent\"}),j(W=>{W.__flags.pendingReset=!1})})}async function K(S){const E=(S==null?void 0:S.mode)||\"force\";if(E===\"force\"&&j(Q=>Q.validated=!0),le.validateSchema)return le.validateSchema(E);o.value=!0;const P=await Promise.all(u.value.map(Q=>Q.validate?Q.validate(S).then(Oe=>({key:ne(Q.path),valid:Oe.valid,errors:Oe.errors,value:Oe.value})):Promise.resolve({key:ne(Q.path),valid:!0,errors:[],value:void 0})));o.value=!1;const W={},se={},te={};for(const Q of P)W[Q.key]={valid:Q.valid,errors:Q.errors},Q.value&&sn(te,Q.key,Q.value),Q.errors.length&&(se[Q.key]=Q.errors[0]);return{valid:P.every(Q=>Q.valid),results:W,errors:se,values:te,source:\"fields\"}}async function H(S,E){var P;const W=U(S);if(W&&(E==null?void 0:E.mode)!==\"silent\"&&(W.validated=!0),M){const{results:se}=await Y((E==null?void 0:E.mode)||\"validated-only\");return se[S]||{errors:[],valid:!0}}return W!=null&&W.validate?W.validate(E):(!W&&(P=E==null?void 0:E.warn),Promise.resolve({errors:[],valid:!0}))}function q(S){Vc(I.value,S)}function D(S,E,P=!1){re(S,E),sn(c,S,E),P&&!(e!=null&&e.initialValues)&&sn(V.value,S,ve(E))}function re(S,E,P=!1){sn(I.value,S,ve(E)),P&&sn(V.value,S,ve(E))}async function Z(){const S=Te(M);if(!S)return{valid:!0,results:{},errors:{},source:\"none\"};o.value=!0;const E=Oi(S)||Kt(S)?await c0(S,c):await u0(S,c,{names:C.value,bailsMap:y.value});return o.value=!1,E}const ee=Xe((S,{evt:E})=>{rh(E)&&E.target.submit()});nr(()=>{if(e!=null&&e.initialErrors&&g(e.initialErrors),e!=null&&e.initialTouched&&$(e.initialTouched),e!=null&&e.validateOnMount){K();return}le.validateSchema&&le.validateSchema(\"silent\")}),Ve(M)&&kt(M,()=>{var S;(S=le.validateSchema)===null||S===void 0||S.call(le,\"validated-only\")}),ts(to,le);function oe(S,E){const P=ze(E)||E==null?void 0:E.label,W=U(ne(S))||N(S,{label:P}),se=()=>ze(E)?E(Fs(W,Ls)):E||{};function te(){var Re;W.touched=!0,((Re=se().validateOnBlur)!==null&&Re!==void 0?Re:Dn().validateOnBlur)&&H(ne(W.path))}function Q(){var Re;((Re=se().validateOnInput)!==null&&Re!==void 0?Re:Dn().validateOnInput)&&At(()=>{H(ne(W.path))})}function Oe(){var Re;((Re=se().validateOnChange)!==null&&Re!==void 0?Re:Dn().validateOnChange)&&At(()=>{H(ne(W.path))})}const De=ge(()=>{const Re={onChange:Oe,onInput:Q,onBlur:te};return ze(E)?Object.assign(Object.assign({},Re),E(Fs(W,Ls)).props||{}):E!=null&&E.props?Object.assign(Object.assign({},Re),E.props(Fs(W,Ls))):Re});return[vt(S,()=>{var Re,rt,_t;return(_t=(Re=se().validateOnModelUpdate)!==null&&Re!==void 0?Re:(rt=Dn())===null||rt===void 0?void 0:rt.validateOnModelUpdate)!==null&&_t!==void 0?_t:!0}),De]}function fe(S){return Array.isArray(S)?S.map(E=>vt(E,!0)):vt(S)}function we(S,E){const[P,W]=oe(S,E);function se(){W.value.onBlur()}function te(Oe){const De=Ni(Oe);Ee(ne(S),De,!1),W.value.onInput()}function Q(Oe){const De=Ni(Oe);Ee(ne(S),De,!1),W.value.onChange()}return ge(()=>Object.assign(Object.assign({},W.value),{onBlur:se,onInput:te,onChange:Q,value:P.value}))}function ye(S,E){const[P,W]=oe(S,E),se=U(ne(S));function te(Q){P.value=Q}return ge(()=>{const Q=ze(E)?E(Fs(se,Ls)):E||{};return Object.assign({[Q.model||\"modelValue\"]:P.value,[`onUpdate:${Q.model||\"modelValue\"}`]:te},W.value)})}const tt=Object.assign(Object.assign({},le),{values:Di(c),handleReset:()=>L(),submitForm:ee});return ts(Bv,tt),tt}function w0(e,t,n,r){const s={touched:\"some\",pending:\"some\",valid:\"every\"},i=ge(()=>!bt(t,Te(n)));function o(){const a=e.value;return Rt(s).reduce((c,u)=>{const f=s[u];return c[u]=a[f](d=>d[u]),c},{})}const l=Rn(o());return Af(()=>{const a=o();l.touched=a.touched,l.valid=a.valid,l.pending=a.pending}),ge(()=>Object.assign(Object.assign({initialValues:Te(n)},l),{valid:l.valid&&!Rt(r.value).length,dirty:i.value}))}function O0(e,t,n){const r=fh(n),s=at(r),i=at(ve(r));function o(l,a){a!=null&&a.force?(s.value=ve(l),i.value=ve(l)):(s.value=us(ve(s.value)||{},ve(l)),i.value=us(ve(i.value)||{},ve(l))),a!=null&&a.updateFields&&e.value.forEach(c=>{if(c.touched)return;const f=wt(s.value,ne(c.path));sn(t,ne(c.path),ve(f))})}return{initialValues:s,originalInitialValues:i,setInitialValues:o}}function N0(e,t){return t?{valid:e.valid&&t.valid,errors:[...e.errors,...t.errors]}:e}const R0=wr({name:\"Form\",inheritAttrs:!1,props:{as:{type:null,default:\"form\"},validationSchema:{type:Object,default:void 0},initialValues:{type:Object,default:void 0},initialErrors:{type:Object,default:void 0},initialTouched:{type:Object,default:void 0},validateOnMount:{type:Boolean,default:!1},onSubmit:{type:Function,default:void 0},onInvalidSubmit:{type:Function,default:void 0},keepValues:{type:Boolean,default:!1},name:{type:String,default:\"Form\"}},setup(e,t){const n=En(e,\"validationSchema\"),r=En(e,\"keepValues\"),{errors:s,errorBag:i,values:o,meta:l,isSubmitting:a,isValidating:c,submitCount:u,controlledValues:f,validate:d,validateField:h,handleReset:p,resetForm:g,handleSubmit:_,setErrors:w,setFieldError:C,setFieldValue:y,setValues:b,setFieldTouched:A,setTouched:I,resetField:V}=C0({validationSchema:n.value?n:void 0,initialValues:e.initialValues,initialErrors:e.initialErrors,initialTouched:e.initialTouched,validateOnMount:e.validateOnMount,keepValuesOnUnmount:r,name:e.name}),k=_((j,{evt:U})=>{rh(U)&&U.target.submit()},e.onInvalidSubmit),T=e.onSubmit?_(e.onSubmit,e.onInvalidSubmit):k;function O(j){pa(j)&&j.preventDefault(),p(),typeof t.attrs.onReset==\"function\"&&t.attrs.onReset()}function M(j,U){return _(typeof j==\"function\"&&!U?j:U,e.onInvalidSubmit)(j)}function N(){return ve(o)}function B(){return ve(l.value)}function G(){return ve(s.value)}function Y(){return{meta:l.value,errors:s.value,errorBag:i.value,values:o,isSubmitting:a.value,isValidating:c.value,submitCount:u.value,controlledValues:f.value,validate:d,validateField:h,handleSubmit:M,handleReset:p,submitForm:k,setErrors:w,setFieldError:C,setFieldValue:y,setValues:b,setFieldTouched:A,setTouched:I,resetForm:g,resetField:V,getValues:N,getMeta:B,getErrors:G}}return t.expose({setFieldError:C,setErrors:w,setFieldValue:y,setValues:b,setFieldTouched:A,setTouched:I,resetForm:g,validate:d,validateField:h,resetField:V,getValues:N,getMeta:B,getErrors:G,values:o,meta:l,errors:s}),function(){const U=e.as===\"form\"?e.as:e.as?Zi(e.as):null,J=ga(U,t,Y);return U?yr(U,Object.assign(Object.assign(Object.assign({},U===\"form\"?{novalidate:!0}:{}),t.attrs),{onSubmit:T,onReset:O}),J):J}}}),x0=R0,I0=wr({name:\"ErrorMessage\",props:{as:{type:String,default:void 0},name:{type:String,required:!0}},setup(e,t){const n=Hn(to,void 0),r=ge(()=>n==null?void 0:n.errors.value[e.name]);function s(){return{message:r.value}}return()=>{if(!r.value)return;const i=e.as?Zi(e.as):e.as,o=ga(i,t,s),l=Object.assign({role:\"alert\"},t.attrs);return!i&&(Array.isArray(o)||!o)&&(o!=null&&o.length)?o:(Array.isArray(o)||!o)&&!(o!=null&&o.length)?yr(i||\"span\",l,r.value):yr(i,l,o)}}}),P0=I0;/**\n  * vee-validate v4.15.0\n  * (c) 2024 Abdelrahman Awad\n  * @license MIT\n  */function Bc(e){return typeof e==\"function\"}function k0(e){return typeof e==\"object\"&&e!==null}function V0(e){return e==null?e===void 0?\"[object Undefined]\":\"[object Null]\":Object.prototype.toString.call(e)}function jc(e){if(!k0(e)||V0(e)!==\"[object Object]\")return!1;if(Object.getPrototypeOf(e)===null)return!0;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}function dh(e,t){return Object.keys(t).forEach(n=>{if(jc(t[n])&&jc(e[n])){e[n]||(e[n]={}),dh(e[n],t[n]);return}e[n]=t[n]}),e}function Uc(e,t,n){const{prefix:r,suffix:s}=n,i=M0(r,s);return e.replace(i,function(o,l,a){if(!l||!t.params)return a in t?t[a]:t.params&&a in t.params?t.params[a]:`${r}${a}${s}`;if(!Array.isArray(t.params))return a in t.params?t.params[a]:`${r}${a}${s}`;const c=Number(l.replace(\":\",\"\"));return c in t.params?t.params[c]:`${l}${r}${a}${s}`})}function Hc(e){return e.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}function M0(e,t){const n=Hc(e),r=Hc(t);return new RegExp(`([0-9]:)?${n}((?:(?!${r}).)+)${r}`,\"g\")}class F0{constructor(t,n,r={prefix:\"{\",suffix:\"}\"}){this.container={},this.locale=t,this.interpolateOptions=r,this.merge(n)}resolve(t,n){let r=this.format(this.locale,t,n);return!r&&this.fallbackLocale&&this.fallbackLocale!==this.locale&&(r=this.format(this.fallbackLocale,t,n)),r||this.getDefaultMessage(this.locale,t)}getDefaultMessage(t,n){const{label:r,name:s}=n;return`${this.resolveLabel(t,s,r)} is not valid`}getLocaleDefault(t,n){var r,s,i,o,l;return((i=(s=(r=this.container[t])===null||r===void 0?void 0:r.fields)===null||s===void 0?void 0:s[n])===null||i===void 0?void 0:i._default)||((l=(o=this.container[t])===null||o===void 0?void 0:o.messages)===null||l===void 0?void 0:l._default)}resolveLabel(t,n,r){var s,i,o,l;return r?((i=(s=this.container[t])===null||s===void 0?void 0:s.names)===null||i===void 0?void 0:i[r])||r:((l=(o=this.container[t])===null||o===void 0?void 0:o.names)===null||l===void 0?void 0:l[n])||n}format(t,n,r){var s,i,o,l,a;let c;const{rule:u,form:f,label:d,name:h}=n,p=this.resolveLabel(t,h,d);return u?(c=((o=(i=(s=this.container[t])===null||s===void 0?void 0:s.fields)===null||i===void 0?void 0:i[h])===null||o===void 0?void 0:o[u.name])||((a=(l=this.container[t])===null||l===void 0?void 0:l.messages)===null||a===void 0?void 0:a[u.name]),c||(c=this.getLocaleDefault(t,h)||\"\"),Bc(c)?c(n):Uc(c,Object.assign(Object.assign({},f),{field:p,params:u.params}),r??this.interpolateOptions)):(c=this.getLocaleDefault(t,h)||\"\",Bc(c)?c(n):Uc(c,Object.assign(Object.assign({},f),{field:p}),r??this.interpolateOptions))}merge(t){dh(this.container,t)}}const $s=new F0(\"en\",{});function L0(e,t,n){const r=s=>$s.resolve(s,n);return typeof e==\"string\"?($s.locale=e,t&&$s.merge({[e]:t}),r):($s.merge(e),r)}const $0=\"en\",D0={_default:\"The {field} is not valid\",alpha:\"The {field} field may only contain alphabetic characters\",alpha_num:\"The {field} field may only contain alpha-numeric characters\",alpha_dash:\"The {field} field may contain alpha-numeric characters as well as dashes and underscores\",alpha_spaces:\"The {field} field may only contain alphabetic characters as well as spaces\",between:\"The {field} field must be between 0:{min} and 1:{max}\",confirmed:\"The {field} field confirmation does not match\",digits:\"The {field} field must be numeric and exactly contain 0:{length} digits\",dimensions:\"The {field} field must be 0:{width} pixels by 1:{height} pixels\",email:\"The {field} field must be a valid email\",not_one_of:\"The {field} field is not a valid value\",ext:\"The {field} field is not a valid file\",image:\"The {field} field must be an image\",integer:\"The {field} field must be an integer\",length:\"The {field} field must be 0:{length} long\",max_value:\"The {field} field must be 0:{max} or less\",max:\"The {field} field may not be greater than 0:{length} characters\",mimes:\"The {field} field must have a valid file type\",min_value:\"The {field} field must be 0:{min} or more\",min:\"The {field} field must be at least 0:{length} characters\",numeric:\"The {field} field may only contain numeric characters\",one_of:\"The {field} field is not a valid value\",regex:\"The {field} field format is invalid\",required_if:\"The {field} field is required\",required:\"The {field} field is required\",size:\"The {field} field size must be less than 0:{size}KB\",url:\"The {field} field is not a valid URL\"},qc={code:$0,messages:D0};/**\n  * vee-validate v4.15.0\n  * (c) 2024 Abdelrahman Awad\n  * @license MIT\n  */const Ds={en:/^[A-Z]*$/i,cs:/^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]*$/i,da:/^[A-ZÆØÅ]*$/i,de:/^[A-ZÄÖÜß]*$/i,es:/^[A-ZÁÉÍÑÓÚÜ]*$/i,fr:/^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]*$/i,it:/^[A-Z\\xC0-\\xFF]*$/i,lt:/^[A-ZĄČĘĖĮŠŲŪŽ]*$/i,nl:/^[A-ZÉËÏÓÖÜ]*$/i,hu:/^[A-ZÁÉÍÓÖŐÚÜŰ]*$/i,pl:/^[A-ZĄĆĘŚŁŃÓŻŹ]*$/i,pt:/^[A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]*$/i,ru:/^[А-ЯЁ]*$/i,kz:/^[А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA]*$/i,sk:/^[A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ]*$/i,sr:/^[A-ZČĆŽŠĐ]*$/i,sv:/^[A-ZÅÄÖ]*$/i,tr:/^[A-ZÇĞİıÖŞÜ]*$/i,uk:/^[А-ЩЬЮЯЄІЇҐ]*$/i,ar:/^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]*$/,az:/^[A-ZÇƏĞİıÖŞÜ]*$/i,ug:/^[A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ]*$/i},Bs={en:/^[A-Z\\s]*$/i,cs:/^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ\\s]*$/i,da:/^[A-ZÆØÅ\\s]*$/i,de:/^[A-ZÄÖÜß\\s]*$/i,es:/^[A-ZÁÉÍÑÓÚÜ\\s]*$/i,fr:/^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ\\s]*$/i,it:/^[A-Z\\xC0-\\xFF\\s]*$/i,lt:/^[A-ZĄČĘĖĮŠŲŪŽ\\s]*$/i,nl:/^[A-ZÉËÏÓÖÜ\\s]*$/i,hu:/^[A-ZÁÉÍÓÖŐÚÜŰ\\s]*$/i,pl:/^[A-ZĄĆĘŚŁŃÓŻŹ\\s]*$/i,pt:/^[A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ\\s]*$/i,ru:/^[А-ЯЁ\\s]*$/i,kz:/^[А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA\\s]*$/i,sk:/^[A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ\\s]*$/i,sr:/^[A-ZČĆŽŠĐ\\s]*$/i,sv:/^[A-ZÅÄÖ\\s]*$/i,tr:/^[A-ZÇĞİıÖŞÜ\\s]*$/i,uk:/^[А-ЩЬЮЯЄІЇҐ\\s]*$/i,ar:/^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ\\s]*$/,az:/^[A-ZÇƏĞİıÖŞÜ\\s]*$/i,ug:/^[A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ\\s]*$/i},js={en:/^[0-9A-Z]*$/i,cs:/^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]*$/i,da:/^[0-9A-ZÆØÅ]$/i,de:/^[0-9A-ZÄÖÜß]*$/i,es:/^[0-9A-ZÁÉÍÑÓÚÜ]*$/i,fr:/^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]*$/i,it:/^[0-9A-Z\\xC0-\\xFF]*$/i,lt:/^[0-9A-ZĄČĘĖĮŠŲŪŽ]*$/i,hu:/^[0-9A-ZÁÉÍÓÖŐÚÜŰ]*$/i,nl:/^[0-9A-ZÉËÏÓÖÜ]*$/i,pl:/^[0-9A-ZĄĆĘŚŁŃÓŻŹ]*$/i,pt:/^[0-9A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]*$/i,ru:/^[0-9А-ЯЁ]*$/i,kz:/^[0-9А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA]*$/i,sk:/^[0-9A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ]*$/i,sr:/^[0-9A-ZČĆŽŠĐ]*$/i,sv:/^[0-9A-ZÅÄÖ]*$/i,tr:/^[0-9A-ZÇĞİıÖŞÜ]*$/i,uk:/^[0-9А-ЩЬЮЯЄІЇҐ]*$/i,ar:/^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]*$/,az:/^[0-9A-ZÇƏĞİıÖŞÜ]*$/i,ug:/^[0-9A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ]*$/i},Us={en:/^[0-9A-Z_-]*$/i,cs:/^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ_-]*$/i,da:/^[0-9A-ZÆØÅ_-]*$/i,de:/^[0-9A-ZÄÖÜß_-]*$/i,es:/^[0-9A-ZÁÉÍÑÓÚÜ_-]*$/i,fr:/^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ_-]*$/i,it:/^[0-9A-Z\\xC0-\\xFF_-]*$/i,lt:/^[0-9A-ZĄČĘĖĮŠŲŪŽ_-]*$/i,nl:/^[0-9A-ZÉËÏÓÖÜ_-]*$/i,hu:/^[0-9A-ZÁÉÍÓÖŐÚÜŰ_-]*$/i,pl:/^[0-9A-ZĄĆĘŚŁŃÓŻŹ_-]*$/i,pt:/^[0-9A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ_-]*$/i,ru:/^[0-9А-ЯЁ_-]*$/i,kz:/^[0-9А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA_-]*$/i,sk:/^[0-9A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ_-]*$/i,sr:/^[0-9A-ZČĆŽŠĐ_-]*$/i,sv:/^[0-9A-ZÅÄÖ_-]*$/i,tr:/^[0-9A-ZÇĞİıÖŞÜ_-]*$/i,uk:/^[0-9А-ЩЬЮЯЄІЇҐ_-]*$/i,ar:/^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ_-]*$/,az:/^[0-9A-ZÇƏĞİıÖŞÜ_-]*$/i,ug:/^[0-9A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ_-]*$/i},ro=e=>{if(e)return Array.isArray(e)?e[0]:e.locale};function Ht(e,t){return Array.isArray(e)?e[0]:e[t]}function Me(e){return!!(e==null||e===\"\"||Array.isArray(e)&&e.length===0)}const hh=(e,t)=>{if(Me(e))return!0;const n=ro(t);if(Array.isArray(e))return e.every(s=>hh(s,{locale:n}));const r=String(e);return n?(Ds[n]||Ds.en).test(r):Object.keys(Ds).some(s=>Ds[s].test(r))},ph=(e,t)=>{if(Me(e))return!0;const n=ro(t);if(Array.isArray(e))return e.every(s=>ph(s,{locale:n}));const r=String(e);return n?(Us[n]||Us.en).test(r):Object.keys(Us).some(s=>Us[s].test(r))},mh=(e,t)=>{if(Me(e))return!0;const n=ro(t);if(Array.isArray(e))return e.every(s=>mh(s,{locale:n}));const r=String(e);return n?(js[n]||js.en).test(r):Object.keys(js).some(s=>js[s].test(r))},gh=(e,t)=>{if(Me(e))return!0;const n=ro(t);if(Array.isArray(e))return e.every(s=>gh(s,{locale:n}));const r=String(e);return n?(Bs[n]||Bs.en).test(r):Object.keys(Bs).some(s=>Bs[s].test(r))};function B0(e){return Array.isArray(e)?{min:e[0],max:e[1]}:e}const yh=(e,t)=>{if(Me(e))return!0;const{min:n,max:r}=B0(t);if(Array.isArray(e))return e.every(i=>yh(i,{min:n,max:r}));const s=Number(e);return Number(n)<=s&&Number(r)>=s},j0=(e,t)=>{const n=Ht(t,\"target\");return String(e)===String(n)},bh=(e,t)=>{if(Me(e))return!0;const n=Ht(t,\"length\");if(Array.isArray(e))return e.every(s=>bh(s,{length:n}));const r=String(e);return/^[0-9]*$/.test(r)&&r.length===Number(n)},U0=(e,t,n)=>{const r=window.URL||window.webkitURL;return new Promise(s=>{const i=new Image;i.onerror=()=>s(!1),i.onload=()=>s(i.width===t&&i.height===n),i.src=r.createObjectURL(e)})};function H0(e){return e?Array.isArray(e)?{width:Number(e[0]),height:Number(e[1])}:{width:Number(e.width),height:Number(e.height)}:{width:0,height:0}}const q0=(e,t)=>{if(Me(e))return!0;const{width:n,height:r}=H0(t),s=[],i=Array.isArray(e)?e:[e];for(let o=0;o<i.length;o++){if(!/\\.(jpg|svg|jpeg|png|bmp|gif)$/i.test(i[o].name))return Promise.resolve(!1);s.push(i[o])}return Promise.all(s.map(o=>U0(o,n,r))).then(o=>o.every(l=>l))},Kc=/^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i,K0=e=>Me(e)?!0:Array.isArray(e)?e.every(t=>Kc.test(String(t))):Kc.test(String(e)),W0=(e,t)=>{if(Me(e))return!0;const n=new RegExp(`\\\\.(${t.join(\"|\")})$`,\"i\");return Array.isArray(e)?e.every(r=>n.test(r.name)):n.test(e.name)},Z0=e=>{if(Me(e))return!0;const t=/\\.(jpg|svg|jpeg|png|bmp|gif|webp)$/i;return Array.isArray(e)?e.every(n=>t.test(n.name)):t.test(e.name)},z0=e=>Me(e)?!0:Array.isArray(e)?e.every(t=>/^-?[0-9]+$/.test(String(t))):/^-?[0-9]+$/.test(String(e)),G0=(e,t)=>{const n=Ht(t,\"other\");return e===n},J0=(e,t)=>{const n=Ht(t,\"other\");return e!==n},X0=(e,t)=>{if(Me(e))return!0;const n=Ht(t,\"length\");return typeof e==\"number\"&&(e=String(e)),e.length||(e=Array.from(e)),e.length===Number(n)},vh=(e,t)=>{if(Me(e))return!0;const n=Ht(t,\"length\");return Array.isArray(e)?e.every(r=>vh(r,{length:n})):[...String(e)].length<=Number(n)},_h=(e,t)=>{if(Me(e))return!0;const n=Ht(t,\"max\");return Array.isArray(e)?e.length>0&&e.every(r=>_h(r,{max:n})):Number(e)<=Number(n)},Wc=/\\+(.+)?/;function Y0(e){let t=e;return Wc.test(e)&&(t=e.replace(Wc,\"(\\\\+$1)?\")),new RegExp(t.replace(\"*\",\".+\"),\"i\")}const Q0=(e,t)=>{if(Me(e))return!0;t||(t=[]);const n=t.map(Y0);return Array.isArray(e)?e.every(r=>n.some(s=>s.test(r.type))):n.some(r=>r.test(e.type))},Sh=(e,t)=>{if(Me(e))return!0;const n=Ht(t,\"length\");return Array.isArray(e)?e.every(r=>Sh(r,{length:n})):[...String(e)].length>=Number(n)},Eh=(e,t)=>{if(Me(e))return!0;const n=Ht(t,\"min\");return Array.isArray(e)?e.length>0&&e.every(r=>Eh(r,{min:n})):Number(e)>=Number(n)},ya=(e,t)=>Me(e)?!0:Array.isArray(e)?e.every(n=>ya(n,t)):Array.from(t).some(n=>n==e),e_=(e,t)=>Me(e)?!0:!ya(e,t),t_=/^[٠١٢٣٤٥٦٧٨٩]+$/,n_=/^[0-9]+$/,r_=e=>{if(Me(e))return!0;const t=n=>{const r=String(n);return n_.test(r)||t_.test(r)};return Array.isArray(e)?e.every(t):t(e)},Ah=(e,t)=>{if(Me(e))return!0;let n=Ht(t,\"regex\");return typeof n==\"string\"&&(n=new RegExp(n)),Array.isArray(e)?e.every(r=>Ah(r,{regex:n})):n.test(String(e))};function s_(e){return e==null}function i_(e){return Array.isArray(e)&&e.length===0}const o_=e=>s_(e)||i_(e)||e===!1?!1:!!String(e).trim().length,l_=(e,t)=>{if(Me(e))return!0;let n=Ht(t,\"size\");if(n=Number(n),isNaN(n))return!1;const r=n*1024;if(!Array.isArray(e))return e.size<=r;for(let s=0;s<e.length;s++)if(e[s].size>r)return!1;return!0},a_=(e,t)=>{var n;if(Me(e))return!0;let r=Ht(t,\"pattern\");typeof r==\"string\"&&(r=new RegExp(r));try{new URL(e)}catch{return!1}return(n=r==null?void 0:r.test(e))!==null&&n!==void 0?n:!0},c_={alpha_dash:ph,alpha_num:mh,alpha_spaces:gh,alpha:hh,between:yh,confirmed:j0,digits:bh,dimensions:q0,email:K0,ext:W0,image:Z0,integer:z0,is_not:J0,is:G0,length:X0,max_value:_h,max:vh,mimes:Q0,min_value:Eh,min:Sh,not_one_of:e_,numeric:r_,one_of:ya,regex:Ah,required:o_,size:l_,url:a_};function Th(e,t){return function(){return e.apply(t,arguments)}}const{toString:u_}=Object.prototype,{getPrototypeOf:ba}=Object,so=(e=>t=>{const n=u_.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),Gt=e=>(e=e.toLowerCase(),t=>so(t)===e),io=e=>t=>typeof t===e,{isArray:Or}=Array,fs=io(\"undefined\");function f_(e){return e!==null&&!fs(e)&&e.constructor!==null&&!fs(e.constructor)&&Vt(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Ch=Gt(\"ArrayBuffer\");function d_(e){let t;return typeof ArrayBuffer<\"u\"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Ch(e.buffer),t}const h_=io(\"string\"),Vt=io(\"function\"),wh=io(\"number\"),oo=e=>e!==null&&typeof e==\"object\",p_=e=>e===!0||e===!1,Xs=e=>{if(so(e)!==\"object\")return!1;const t=ba(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},m_=Gt(\"Date\"),g_=Gt(\"File\"),y_=Gt(\"Blob\"),b_=Gt(\"FileList\"),v_=e=>oo(e)&&Vt(e.pipe),__=e=>{let t;return e&&(typeof FormData==\"function\"&&e instanceof FormData||Vt(e.append)&&((t=so(e))===\"formdata\"||t===\"object\"&&Vt(e.toString)&&e.toString()===\"[object FormData]\"))},S_=Gt(\"URLSearchParams\"),[E_,A_,T_,C_]=[\"ReadableStream\",\"Request\",\"Response\",\"Headers\"].map(Gt),w_=e=>e.trim?e.trim():e.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\"\");function Es(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>\"u\")return;let r,s;if(typeof e!=\"object\"&&(e=[e]),Or(e))for(r=0,s=e.length;r<s;r++)t.call(null,e[r],r,e);else{const i=n?Object.getOwnPropertyNames(e):Object.keys(e),o=i.length;let l;for(r=0;r<o;r++)l=i[r],t.call(null,e[l],l,e)}}function Oh(e,t){t=t.toLowerCase();const n=Object.keys(e);let r=n.length,s;for(;r-- >0;)if(s=n[r],t===s.toLowerCase())return s;return null}const Bn=(()=>typeof globalThis<\"u\"?globalThis:typeof self<\"u\"?self:typeof window<\"u\"?window:global)(),Nh=e=>!fs(e)&&e!==Bn;function pl(){const{caseless:e}=Nh(this)&&this||{},t={},n=(r,s)=>{const i=e&&Oh(t,s)||s;Xs(t[i])&&Xs(r)?t[i]=pl(t[i],r):Xs(r)?t[i]=pl({},r):Or(r)?t[i]=r.slice():t[i]=r};for(let r=0,s=arguments.length;r<s;r++)arguments[r]&&Es(arguments[r],n);return t}const O_=(e,t,n,{allOwnKeys:r}={})=>(Es(t,(s,i)=>{n&&Vt(s)?e[i]=Th(s,n):e[i]=s},{allOwnKeys:r}),e),N_=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),R_=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,\"super\",{value:t.prototype}),n&&Object.assign(e.prototype,n)},x_=(e,t,n,r)=>{let s,i,o;const l={};if(t=t||{},e==null)return t;do{for(s=Object.getOwnPropertyNames(e),i=s.length;i-- >0;)o=s[i],(!r||r(o,e,t))&&!l[o]&&(t[o]=e[o],l[o]=!0);e=n!==!1&&ba(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},I_=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},P_=e=>{if(!e)return null;if(Or(e))return e;let t=e.length;if(!wh(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},k_=(e=>t=>e&&t instanceof e)(typeof Uint8Array<\"u\"&&ba(Uint8Array)),V_=(e,t)=>{const r=(e&&e[Symbol.iterator]).call(e);let s;for(;(s=r.next())&&!s.done;){const i=s.value;t.call(e,i[0],i[1])}},M_=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},F_=Gt(\"HTMLFormElement\"),L_=e=>e.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,function(n,r,s){return r.toUpperCase()+s}),Zc=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),$_=Gt(\"RegExp\"),Rh=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Es(n,(s,i)=>{let o;(o=t(s,i,e))!==!1&&(r[i]=o||s)}),Object.defineProperties(e,r)},D_=e=>{Rh(e,(t,n)=>{if(Vt(e)&&[\"arguments\",\"caller\",\"callee\"].indexOf(n)!==-1)return!1;const r=e[n];if(Vt(r)){if(t.enumerable=!1,\"writable\"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error(\"Can not rewrite read-only method '\"+n+\"'\")})}})},B_=(e,t)=>{const n={},r=s=>{s.forEach(i=>{n[i]=!0})};return Or(e)?r(e):r(String(e).split(t)),n},j_=()=>{},U_=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t;function H_(e){return!!(e&&Vt(e.append)&&e[Symbol.toStringTag]===\"FormData\"&&e[Symbol.iterator])}const q_=e=>{const t=new Array(10),n=(r,s)=>{if(oo(r)){if(t.indexOf(r)>=0)return;if(!(\"toJSON\"in r)){t[s]=r;const i=Or(r)?[]:{};return Es(r,(o,l)=>{const a=n(o,s+1);!fs(a)&&(i[l]=a)}),t[s]=void 0,i}}return r};return n(e,0)},K_=Gt(\"AsyncFunction\"),W_=e=>e&&(oo(e)||Vt(e))&&Vt(e.then)&&Vt(e.catch),xh=((e,t)=>e?setImmediate:t?((n,r)=>(Bn.addEventListener(\"message\",({source:s,data:i})=>{s===Bn&&i===n&&r.length&&r.shift()()},!1),s=>{r.push(s),Bn.postMessage(n,\"*\")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate==\"function\",Vt(Bn.postMessage)),Z_=typeof queueMicrotask<\"u\"?queueMicrotask.bind(Bn):typeof process<\"u\"&&process.nextTick||xh,R={isArray:Or,isArrayBuffer:Ch,isBuffer:f_,isFormData:__,isArrayBufferView:d_,isString:h_,isNumber:wh,isBoolean:p_,isObject:oo,isPlainObject:Xs,isReadableStream:E_,isRequest:A_,isResponse:T_,isHeaders:C_,isUndefined:fs,isDate:m_,isFile:g_,isBlob:y_,isRegExp:$_,isFunction:Vt,isStream:v_,isURLSearchParams:S_,isTypedArray:k_,isFileList:b_,forEach:Es,merge:pl,extend:O_,trim:w_,stripBOM:N_,inherits:R_,toFlatObject:x_,kindOf:so,kindOfTest:Gt,endsWith:I_,toArray:P_,forEachEntry:V_,matchAll:M_,isHTMLForm:F_,hasOwnProperty:Zc,hasOwnProp:Zc,reduceDescriptors:Rh,freezeMethods:D_,toObjectSet:B_,toCamelCase:L_,noop:j_,toFiniteNumber:U_,findKey:Oh,global:Bn,isContextDefined:Nh,isSpecCompliantForm:H_,toJSONObject:q_,isAsyncFn:K_,isThenable:W_,setImmediate:xh,asap:Z_};function ce(e,t,n,r,s){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name=\"AxiosError\",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),s&&(this.response=s,this.status=s.status?s.status:null)}R.inherits(ce,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:R.toJSONObject(this.config),code:this.code,status:this.status}}});const Ih=ce.prototype,Ph={};[\"ERR_BAD_OPTION_VALUE\",\"ERR_BAD_OPTION\",\"ECONNABORTED\",\"ETIMEDOUT\",\"ERR_NETWORK\",\"ERR_FR_TOO_MANY_REDIRECTS\",\"ERR_DEPRECATED\",\"ERR_BAD_RESPONSE\",\"ERR_BAD_REQUEST\",\"ERR_CANCELED\",\"ERR_NOT_SUPPORT\",\"ERR_INVALID_URL\"].forEach(e=>{Ph[e]={value:e}});Object.defineProperties(ce,Ph);Object.defineProperty(Ih,\"isAxiosError\",{value:!0});ce.from=(e,t,n,r,s,i)=>{const o=Object.create(Ih);return R.toFlatObject(e,o,function(a){return a!==Error.prototype},l=>l!==\"isAxiosError\"),ce.call(o,e.message,t,n,r,s),o.cause=e,o.name=e.name,i&&Object.assign(o,i),o};const z_=null;function ml(e){return R.isPlainObject(e)||R.isArray(e)}function kh(e){return R.endsWith(e,\"[]\")?e.slice(0,-2):e}function zc(e,t,n){return e?e.concat(t).map(function(s,i){return s=kh(s),!n&&i?\"[\"+s+\"]\":s}).join(n?\".\":\"\"):t}function G_(e){return R.isArray(e)&&!e.some(ml)}const J_=R.toFlatObject(R,{},null,function(t){return/^is[A-Z]/.test(t)});function lo(e,t,n){if(!R.isObject(e))throw new TypeError(\"target must be an object\");t=t||new FormData,n=R.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(g,_){return!R.isUndefined(_[g])});const r=n.metaTokens,s=n.visitor||u,i=n.dots,o=n.indexes,a=(n.Blob||typeof Blob<\"u\"&&Blob)&&R.isSpecCompliantForm(t);if(!R.isFunction(s))throw new TypeError(\"visitor must be a function\");function c(p){if(p===null)return\"\";if(R.isDate(p))return p.toISOString();if(!a&&R.isBlob(p))throw new ce(\"Blob is not supported. Use a Buffer instead.\");return R.isArrayBuffer(p)||R.isTypedArray(p)?a&&typeof Blob==\"function\"?new Blob([p]):Buffer.from(p):p}function u(p,g,_){let w=p;if(p&&!_&&typeof p==\"object\"){if(R.endsWith(g,\"{}\"))g=r?g:g.slice(0,-2),p=JSON.stringify(p);else if(R.isArray(p)&&G_(p)||(R.isFileList(p)||R.endsWith(g,\"[]\"))&&(w=R.toArray(p)))return g=kh(g),w.forEach(function(y,b){!(R.isUndefined(y)||y===null)&&t.append(o===!0?zc([g],b,i):o===null?g:g+\"[]\",c(y))}),!1}return ml(p)?!0:(t.append(zc(_,g,i),c(p)),!1)}const f=[],d=Object.assign(J_,{defaultVisitor:u,convertValue:c,isVisitable:ml});function h(p,g){if(!R.isUndefined(p)){if(f.indexOf(p)!==-1)throw Error(\"Circular reference detected in \"+g.join(\".\"));f.push(p),R.forEach(p,function(w,C){(!(R.isUndefined(w)||w===null)&&s.call(t,w,R.isString(C)?C.trim():C,g,d))===!0&&h(w,g?g.concat(C):[C])}),f.pop()}}if(!R.isObject(e))throw new TypeError(\"data must be an object\");return h(e),t}function Gc(e){const t={\"!\":\"%21\",\"'\":\"%27\",\"(\":\"%28\",\")\":\"%29\",\"~\":\"%7E\",\"%20\":\"+\",\"%00\":\"\\0\"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function va(e,t){this._pairs=[],e&&lo(e,this,t)}const Vh=va.prototype;Vh.append=function(t,n){this._pairs.push([t,n])};Vh.toString=function(t){const n=t?function(r){return t.call(this,r,Gc)}:Gc;return this._pairs.map(function(s){return n(s[0])+\"=\"+n(s[1])},\"\").join(\"&\")};function X_(e){return encodeURIComponent(e).replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%20/g,\"+\").replace(/%5B/gi,\"[\").replace(/%5D/gi,\"]\")}function Mh(e,t,n){if(!t)return e;const r=n&&n.encode||X_;R.isFunction(n)&&(n={serialize:n});const s=n&&n.serialize;let i;if(s?i=s(t,n):i=R.isURLSearchParams(t)?t.toString():new va(t,n).toString(r),i){const o=e.indexOf(\"#\");o!==-1&&(e=e.slice(0,o)),e+=(e.indexOf(\"?\")===-1?\"?\":\"&\")+i}return e}class Y_{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){R.forEach(this.handlers,function(r){r!==null&&t(r)})}}const Jc=Y_,Fh={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Q_=typeof URLSearchParams<\"u\"?URLSearchParams:va,eS=typeof FormData<\"u\"?FormData:null,tS=typeof Blob<\"u\"?Blob:null,nS={isBrowser:!0,classes:{URLSearchParams:Q_,FormData:eS,Blob:tS},protocols:[\"http\",\"https\",\"file\",\"blob\",\"url\",\"data\"]},_a=typeof window<\"u\"&&typeof document<\"u\",gl=typeof navigator==\"object\"&&navigator||void 0,rS=_a&&(!gl||[\"ReactNative\",\"NativeScript\",\"NS\"].indexOf(gl.product)<0),sS=(()=>typeof WorkerGlobalScope<\"u\"&&self instanceof WorkerGlobalScope&&typeof self.importScripts==\"function\")(),iS=_a&&window.location.href||\"http://localhost\",oS=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:_a,hasStandardBrowserEnv:rS,hasStandardBrowserWebWorkerEnv:sS,navigator:gl,origin:iS},Symbol.toStringTag,{value:\"Module\"})),ct={...oS,...nS};function lS(e,t){return lo(e,new ct.classes.URLSearchParams,Object.assign({visitor:function(n,r,s,i){return ct.isNode&&R.isBuffer(n)?(this.append(r,n.toString(\"base64\")),!1):i.defaultVisitor.apply(this,arguments)}},t))}function aS(e){return R.matchAll(/\\w+|\\[(\\w*)]/g,e).map(t=>t[0]===\"[]\"?\"\":t[1]||t[0])}function cS(e){const t={},n=Object.keys(e);let r;const s=n.length;let i;for(r=0;r<s;r++)i=n[r],t[i]=e[i];return t}function Lh(e){function t(n,r,s,i){let o=n[i++];if(o===\"__proto__\")return!0;const l=Number.isFinite(+o),a=i>=n.length;return o=!o&&R.isArray(s)?s.length:o,a?(R.hasOwnProp(s,o)?s[o]=[s[o],r]:s[o]=r,!l):((!s[o]||!R.isObject(s[o]))&&(s[o]=[]),t(n,r,s[o],i)&&R.isArray(s[o])&&(s[o]=cS(s[o])),!l)}if(R.isFormData(e)&&R.isFunction(e.entries)){const n={};return R.forEachEntry(e,(r,s)=>{t(aS(r),s,n,0)}),n}return null}function uS(e,t,n){if(R.isString(e))try{return(t||JSON.parse)(e),R.trim(e)}catch(r){if(r.name!==\"SyntaxError\")throw r}return(n||JSON.stringify)(e)}const Sa={transitional:Fh,adapter:[\"xhr\",\"http\",\"fetch\"],transformRequest:[function(t,n){const r=n.getContentType()||\"\",s=r.indexOf(\"application/json\")>-1,i=R.isObject(t);if(i&&R.isHTMLForm(t)&&(t=new FormData(t)),R.isFormData(t))return s?JSON.stringify(Lh(t)):t;if(R.isArrayBuffer(t)||R.isBuffer(t)||R.isStream(t)||R.isFile(t)||R.isBlob(t)||R.isReadableStream(t))return t;if(R.isArrayBufferView(t))return t.buffer;if(R.isURLSearchParams(t))return n.setContentType(\"application/x-www-form-urlencoded;charset=utf-8\",!1),t.toString();let l;if(i){if(r.indexOf(\"application/x-www-form-urlencoded\")>-1)return lS(t,this.formSerializer).toString();if((l=R.isFileList(t))||r.indexOf(\"multipart/form-data\")>-1){const a=this.env&&this.env.FormData;return lo(l?{\"files[]\":t}:t,a&&new a,this.formSerializer)}}return i||s?(n.setContentType(\"application/json\",!1),uS(t)):t}],transformResponse:[function(t){const n=this.transitional||Sa.transitional,r=n&&n.forcedJSONParsing,s=this.responseType===\"json\";if(R.isResponse(t)||R.isReadableStream(t))return t;if(t&&R.isString(t)&&(r&&!this.responseType||s)){const o=!(n&&n.silentJSONParsing)&&s;try{return JSON.parse(t)}catch(l){if(o)throw l.name===\"SyntaxError\"?ce.from(l,ce.ERR_BAD_RESPONSE,this,null,this.response):l}}return t}],timeout:0,xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",maxContentLength:-1,maxBodyLength:-1,env:{FormData:ct.classes.FormData,Blob:ct.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:\"application/json, text/plain, */*\",\"Content-Type\":void 0}}};R.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\"],e=>{Sa.headers[e]={}});const Ea=Sa,fS=R.toObjectSet([\"age\",\"authorization\",\"content-length\",\"content-type\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modified\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agent\"]),dS=e=>{const t={};let n,r,s;return e&&e.split(`\n`).forEach(function(o){s=o.indexOf(\":\"),n=o.substring(0,s).trim().toLowerCase(),r=o.substring(s+1).trim(),!(!n||t[n]&&fS[n])&&(n===\"set-cookie\"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+\", \"+r:r)}),t},Xc=Symbol(\"internals\");function Mr(e){return e&&String(e).trim().toLowerCase()}function Ys(e){return e===!1||e==null?e:R.isArray(e)?e.map(Ys):String(e)}function hS(e){const t=Object.create(null),n=/([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const pS=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function Po(e,t,n,r,s){if(R.isFunction(r))return r.call(this,t,n);if(s&&(t=n),!!R.isString(t)){if(R.isString(r))return t.indexOf(r)!==-1;if(R.isRegExp(r))return r.test(t)}}function mS(e){return e.trim().toLowerCase().replace(/([a-z\\d])(\\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function gS(e,t){const n=R.toCamelCase(\" \"+t);[\"get\",\"set\",\"has\"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(s,i,o){return this[r].call(this,t,s,i,o)},configurable:!0})})}class ao{constructor(t){t&&this.set(t)}set(t,n,r){const s=this;function i(l,a,c){const u=Mr(a);if(!u)throw new Error(\"header name must be a non-empty string\");const f=R.findKey(s,u);(!f||s[f]===void 0||c===!0||c===void 0&&s[f]!==!1)&&(s[f||a]=Ys(l))}const o=(l,a)=>R.forEach(l,(c,u)=>i(c,u,a));if(R.isPlainObject(t)||t instanceof this.constructor)o(t,n);else if(R.isString(t)&&(t=t.trim())&&!pS(t))o(dS(t),n);else if(R.isHeaders(t))for(const[l,a]of t.entries())i(a,l,r);else t!=null&&i(n,t,r);return this}get(t,n){if(t=Mr(t),t){const r=R.findKey(this,t);if(r){const s=this[r];if(!n)return s;if(n===!0)return hS(s);if(R.isFunction(n))return n.call(this,s,r);if(R.isRegExp(n))return n.exec(s);throw new TypeError(\"parser must be boolean|regexp|function\")}}}has(t,n){if(t=Mr(t),t){const r=R.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||Po(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let s=!1;function i(o){if(o=Mr(o),o){const l=R.findKey(r,o);l&&(!n||Po(r,r[l],l,n))&&(delete r[l],s=!0)}}return R.isArray(t)?t.forEach(i):i(t),s}clear(t){const n=Object.keys(this);let r=n.length,s=!1;for(;r--;){const i=n[r];(!t||Po(this,this[i],i,t,!0))&&(delete this[i],s=!0)}return s}normalize(t){const n=this,r={};return R.forEach(this,(s,i)=>{const o=R.findKey(r,i);if(o){n[o]=Ys(s),delete n[i];return}const l=t?mS(i):String(i).trim();l!==i&&delete n[i],n[l]=Ys(s),r[l]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return R.forEach(this,(r,s)=>{r!=null&&r!==!1&&(n[s]=t&&R.isArray(r)?r.join(\", \"):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+\": \"+n).join(`\n`)}get[Symbol.toStringTag](){return\"AxiosHeaders\"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(s=>r.set(s)),r}static accessor(t){const r=(this[Xc]=this[Xc]={accessors:{}}).accessors,s=this.prototype;function i(o){const l=Mr(o);r[l]||(gS(s,o),r[l]=!0)}return R.isArray(t)?t.forEach(i):i(t),this}}ao.accessor([\"Content-Type\",\"Content-Length\",\"Accept\",\"Accept-Encoding\",\"User-Agent\",\"Authorization\"]);R.reduceDescriptors(ao.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});R.freezeMethods(ao);const zt=ao;function ko(e,t){const n=this||Ea,r=t||n,s=zt.from(r.headers);let i=r.data;return R.forEach(e,function(l){i=l.call(n,i,s.normalize(),t?t.status:void 0)}),s.normalize(),i}function $h(e){return!!(e&&e.__CANCEL__)}function Nr(e,t,n){ce.call(this,e??\"canceled\",ce.ERR_CANCELED,t,n),this.name=\"CanceledError\"}R.inherits(Nr,ce,{__CANCEL__:!0});function Dh(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new ce(\"Request failed with status code \"+n.status,[ce.ERR_BAD_REQUEST,ce.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function yS(e){const t=/^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(e);return t&&t[1]||\"\"}function bS(e,t){e=e||10;const n=new Array(e),r=new Array(e);let s=0,i=0,o;return t=t!==void 0?t:1e3,function(a){const c=Date.now(),u=r[i];o||(o=c),n[s]=a,r[s]=c;let f=i,d=0;for(;f!==s;)d+=n[f++],f=f%e;if(s=(s+1)%e,s===i&&(i=(i+1)%e),c-o<t)return;const h=u&&c-u;return h?Math.round(d*1e3/h):void 0}}function vS(e,t){let n=0,r=1e3/t,s,i;const o=(c,u=Date.now())=>{n=u,s=null,i&&(clearTimeout(i),i=null),e.apply(null,c)};return[(...c)=>{const u=Date.now(),f=u-n;f>=r?o(c,u):(s=c,i||(i=setTimeout(()=>{i=null,o(s)},r-f)))},()=>s&&o(s)]}const Ri=(e,t,n=3)=>{let r=0;const s=bS(50,250);return vS(i=>{const o=i.loaded,l=i.lengthComputable?i.total:void 0,a=o-r,c=s(a),u=o<=l;r=o;const f={loaded:o,total:l,progress:l?o/l:void 0,bytes:a,rate:c||void 0,estimated:c&&l&&u?(l-o)/c:void 0,event:i,lengthComputable:l!=null,[t?\"download\":\"upload\"]:!0};e(f)},n)},Yc=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},Qc=e=>(...t)=>R.asap(()=>e(...t)),_S=ct.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,ct.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(ct.origin),ct.navigator&&/(msie|trident)/i.test(ct.navigator.userAgent)):()=>!0,SS=ct.hasStandardBrowserEnv?{write(e,t,n,r,s,i){const o=[e+\"=\"+encodeURIComponent(t)];R.isNumber(n)&&o.push(\"expires=\"+new Date(n).toGMTString()),R.isString(r)&&o.push(\"path=\"+r),R.isString(s)&&o.push(\"domain=\"+s),i===!0&&o.push(\"secure\"),document.cookie=o.join(\"; \")},read(e){const t=document.cookie.match(new RegExp(\"(^|;\\\\s*)(\"+e+\")=([^;]*)\"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,\"\",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function ES(e){return/^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(e)}function AS(e,t){return t?e.replace(/\\/?\\/$/,\"\")+\"/\"+t.replace(/^\\/+/,\"\"):e}function Bh(e,t,n){let r=!ES(t);return e&&(r||n==!1)?AS(e,t):t}const eu=e=>e instanceof zt?{...e}:e;function Xn(e,t){t=t||{};const n={};function r(c,u,f,d){return R.isPlainObject(c)&&R.isPlainObject(u)?R.merge.call({caseless:d},c,u):R.isPlainObject(u)?R.merge({},u):R.isArray(u)?u.slice():u}function s(c,u,f,d){if(R.isUndefined(u)){if(!R.isUndefined(c))return r(void 0,c,f,d)}else return r(c,u,f,d)}function i(c,u){if(!R.isUndefined(u))return r(void 0,u)}function o(c,u){if(R.isUndefined(u)){if(!R.isUndefined(c))return r(void 0,c)}else return r(void 0,u)}function l(c,u,f){if(f in t)return r(c,u);if(f in e)return r(void 0,c)}const a={url:i,method:i,data:i,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,withXSRFToken:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,beforeRedirect:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:l,headers:(c,u,f)=>s(eu(c),eu(u),f,!0)};return R.forEach(Object.keys(Object.assign({},e,t)),function(u){const f=a[u]||s,d=f(e[u],t[u],u);R.isUndefined(d)&&f!==l||(n[u]=d)}),n}const jh=e=>{const t=Xn({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:s,xsrfCookieName:i,headers:o,auth:l}=t;t.headers=o=zt.from(o),t.url=Mh(Bh(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),l&&o.set(\"Authorization\",\"Basic \"+btoa((l.username||\"\")+\":\"+(l.password?unescape(encodeURIComponent(l.password)):\"\")));let a;if(R.isFormData(n)){if(ct.hasStandardBrowserEnv||ct.hasStandardBrowserWebWorkerEnv)o.setContentType(void 0);else if((a=o.getContentType())!==!1){const[c,...u]=a?a.split(\";\").map(f=>f.trim()).filter(Boolean):[];o.setContentType([c||\"multipart/form-data\",...u].join(\"; \"))}}if(ct.hasStandardBrowserEnv&&(r&&R.isFunction(r)&&(r=r(t)),r||r!==!1&&_S(t.url))){const c=s&&i&&SS.read(i);c&&o.set(s,c)}return t},TS=typeof XMLHttpRequest<\"u\",CS=TS&&function(e){return new Promise(function(n,r){const s=jh(e);let i=s.data;const o=zt.from(s.headers).normalize();let{responseType:l,onUploadProgress:a,onDownloadProgress:c}=s,u,f,d,h,p;function g(){h&&h(),p&&p(),s.cancelToken&&s.cancelToken.unsubscribe(u),s.signal&&s.signal.removeEventListener(\"abort\",u)}let _=new XMLHttpRequest;_.open(s.method.toUpperCase(),s.url,!0),_.timeout=s.timeout;function w(){if(!_)return;const y=zt.from(\"getAllResponseHeaders\"in _&&_.getAllResponseHeaders()),A={data:!l||l===\"text\"||l===\"json\"?_.responseText:_.response,status:_.status,statusText:_.statusText,headers:y,config:e,request:_};Dh(function(V){n(V),g()},function(V){r(V),g()},A),_=null}\"onloadend\"in _?_.onloadend=w:_.onreadystatechange=function(){!_||_.readyState!==4||_.status===0&&!(_.responseURL&&_.responseURL.indexOf(\"file:\")===0)||setTimeout(w)},_.onabort=function(){_&&(r(new ce(\"Request aborted\",ce.ECONNABORTED,e,_)),_=null)},_.onerror=function(){r(new ce(\"Network Error\",ce.ERR_NETWORK,e,_)),_=null},_.ontimeout=function(){let b=s.timeout?\"timeout of \"+s.timeout+\"ms exceeded\":\"timeout exceeded\";const A=s.transitional||Fh;s.timeoutErrorMessage&&(b=s.timeoutErrorMessage),r(new ce(b,A.clarifyTimeoutError?ce.ETIMEDOUT:ce.ECONNABORTED,e,_)),_=null},i===void 0&&o.setContentType(null),\"setRequestHeader\"in _&&R.forEach(o.toJSON(),function(b,A){_.setRequestHeader(A,b)}),R.isUndefined(s.withCredentials)||(_.withCredentials=!!s.withCredentials),l&&l!==\"json\"&&(_.responseType=s.responseType),c&&([d,p]=Ri(c,!0),_.addEventListener(\"progress\",d)),a&&_.upload&&([f,h]=Ri(a),_.upload.addEventListener(\"progress\",f),_.upload.addEventListener(\"loadend\",h)),(s.cancelToken||s.signal)&&(u=y=>{_&&(r(!y||y.type?new Nr(null,e,_):y),_.abort(),_=null)},s.cancelToken&&s.cancelToken.subscribe(u),s.signal&&(s.signal.aborted?u():s.signal.addEventListener(\"abort\",u)));const C=yS(s.url);if(C&&ct.protocols.indexOf(C)===-1){r(new ce(\"Unsupported protocol \"+C+\":\",ce.ERR_BAD_REQUEST,e));return}_.send(i||null)})},wS=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let r=new AbortController,s;const i=function(c){if(!s){s=!0,l();const u=c instanceof Error?c:this.reason;r.abort(u instanceof ce?u:new Nr(u instanceof Error?u.message:u))}};let o=t&&setTimeout(()=>{o=null,i(new ce(`timeout ${t} of ms exceeded`,ce.ETIMEDOUT))},t);const l=()=>{e&&(o&&clearTimeout(o),o=null,e.forEach(c=>{c.unsubscribe?c.unsubscribe(i):c.removeEventListener(\"abort\",i)}),e=null)};e.forEach(c=>c.addEventListener(\"abort\",i));const{signal:a}=r;return a.unsubscribe=()=>R.asap(l),a}},OS=wS,NS=function*(e,t){let n=e.byteLength;if(!t||n<t){yield e;return}let r=0,s;for(;r<n;)s=r+t,yield e.slice(r,s),r=s},RS=async function*(e,t){for await(const n of xS(e))yield*NS(n,t)},xS=async function*(e){if(e[Symbol.asyncIterator]){yield*e;return}const t=e.getReader();try{for(;;){const{done:n,value:r}=await t.read();if(n)break;yield r}}finally{await t.cancel()}},tu=(e,t,n,r)=>{const s=RS(e,t);let i=0,o,l=a=>{o||(o=!0,r&&r(a))};return new ReadableStream({async pull(a){try{const{done:c,value:u}=await s.next();if(c){l(),a.close();return}let f=u.byteLength;if(n){let d=i+=f;n(d)}a.enqueue(new Uint8Array(u))}catch(c){throw l(c),c}},cancel(a){return l(a),s.return()}},{highWaterMark:2})},co=typeof fetch==\"function\"&&typeof Request==\"function\"&&typeof Response==\"function\",Uh=co&&typeof ReadableStream==\"function\",IS=co&&(typeof TextEncoder==\"function\"?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),Hh=(e,...t)=>{try{return!!e(...t)}catch{return!1}},PS=Uh&&Hh(()=>{let e=!1;const t=new Request(ct.origin,{body:new ReadableStream,method:\"POST\",get duplex(){return e=!0,\"half\"}}).headers.has(\"Content-Type\");return e&&!t}),nu=64*1024,yl=Uh&&Hh(()=>R.isReadableStream(new Response(\"\").body)),xi={stream:yl&&(e=>e.body)};co&&(e=>{[\"text\",\"arrayBuffer\",\"blob\",\"formData\",\"stream\"].forEach(t=>{!xi[t]&&(xi[t]=R.isFunction(e[t])?n=>n[t]():(n,r)=>{throw new ce(`Response type '${t}' is not supported`,ce.ERR_NOT_SUPPORT,r)})})})(new Response);const kS=async e=>{if(e==null)return 0;if(R.isBlob(e))return e.size;if(R.isSpecCompliantForm(e))return(await new Request(ct.origin,{method:\"POST\",body:e}).arrayBuffer()).byteLength;if(R.isArrayBufferView(e)||R.isArrayBuffer(e))return e.byteLength;if(R.isURLSearchParams(e)&&(e=e+\"\"),R.isString(e))return(await IS(e)).byteLength},VS=async(e,t)=>{const n=R.toFiniteNumber(e.getContentLength());return n??kS(t)},MS=co&&(async e=>{let{url:t,method:n,data:r,signal:s,cancelToken:i,timeout:o,onDownloadProgress:l,onUploadProgress:a,responseType:c,headers:u,withCredentials:f=\"same-origin\",fetchOptions:d}=jh(e);c=c?(c+\"\").toLowerCase():\"text\";let h=OS([s,i&&i.toAbortSignal()],o),p;const g=h&&h.unsubscribe&&(()=>{h.unsubscribe()});let _;try{if(a&&PS&&n!==\"get\"&&n!==\"head\"&&(_=await VS(u,r))!==0){let A=new Request(t,{method:\"POST\",body:r,duplex:\"half\"}),I;if(R.isFormData(r)&&(I=A.headers.get(\"content-type\"))&&u.setContentType(I),A.body){const[V,k]=Yc(_,Ri(Qc(a)));r=tu(A.body,nu,V,k)}}R.isString(f)||(f=f?\"include\":\"omit\");const w=\"credentials\"in Request.prototype;p=new Request(t,{...d,signal:h,method:n.toUpperCase(),headers:u.normalize().toJSON(),body:r,duplex:\"half\",credentials:w?f:void 0});let C=await fetch(p);const y=yl&&(c===\"stream\"||c===\"response\");if(yl&&(l||y&&g)){const A={};[\"status\",\"statusText\",\"headers\"].forEach(T=>{A[T]=C[T]});const I=R.toFiniteNumber(C.headers.get(\"content-length\")),[V,k]=l&&Yc(I,Ri(Qc(l),!0))||[];C=new Response(tu(C.body,nu,V,()=>{k&&k(),g&&g()}),A)}c=c||\"text\";let b=await xi[R.findKey(xi,c)||\"text\"](C,e);return!y&&g&&g(),await new Promise((A,I)=>{Dh(A,I,{data:b,headers:zt.from(C.headers),status:C.status,statusText:C.statusText,config:e,request:p})})}catch(w){throw g&&g(),w&&w.name===\"TypeError\"&&/fetch/i.test(w.message)?Object.assign(new ce(\"Network Error\",ce.ERR_NETWORK,e,p),{cause:w.cause||w}):ce.from(w,w&&w.code,e,p)}}),bl={http:z_,xhr:CS,fetch:MS};R.forEach(bl,(e,t)=>{if(e){try{Object.defineProperty(e,\"name\",{value:t})}catch{}Object.defineProperty(e,\"adapterName\",{value:t})}});const ru=e=>`- ${e}`,FS=e=>R.isFunction(e)||e===null||e===!1,qh={getAdapter:e=>{e=R.isArray(e)?e:[e];const{length:t}=e;let n,r;const s={};for(let i=0;i<t;i++){n=e[i];let o;if(r=n,!FS(n)&&(r=bl[(o=String(n)).toLowerCase()],r===void 0))throw new ce(`Unknown adapter '${o}'`);if(r)break;s[o||\"#\"+i]=r}if(!r){const i=Object.entries(s).map(([l,a])=>`adapter ${l} `+(a===!1?\"is not supported by the environment\":\"is not available in the build\"));let o=t?i.length>1?`since :\n`+i.map(ru).join(`\n`):\" \"+ru(i[0]):\"as no adapter specified\";throw new ce(\"There is no suitable adapter to dispatch the request \"+o,\"ERR_NOT_SUPPORT\")}return r},adapters:bl};function Vo(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Nr(null,e)}function su(e){return Vo(e),e.headers=zt.from(e.headers),e.data=ko.call(e,e.transformRequest),[\"post\",\"put\",\"patch\"].indexOf(e.method)!==-1&&e.headers.setContentType(\"application/x-www-form-urlencoded\",!1),qh.getAdapter(e.adapter||Ea.adapter)(e).then(function(r){return Vo(e),r.data=ko.call(e,e.transformResponse,r),r.headers=zt.from(r.headers),r},function(r){return $h(r)||(Vo(e),r&&r.response&&(r.response.data=ko.call(e,e.transformResponse,r.response),r.response.headers=zt.from(r.response.headers))),Promise.reject(r)})}const Kh=\"1.8.4\",uo={};[\"object\",\"boolean\",\"number\",\"function\",\"string\",\"symbol\"].forEach((e,t)=>{uo[e]=function(r){return typeof r===e||\"a\"+(t<1?\"n \":\" \")+e}});const iu={};uo.transitional=function(t,n,r){function s(i,o){return\"[Axios v\"+Kh+\"] Transitional option '\"+i+\"'\"+o+(r?\". \"+r:\"\")}return(i,o,l)=>{if(t===!1)throw new ce(s(o,\" has been removed\"+(n?\" in \"+n:\"\")),ce.ERR_DEPRECATED);return n&&!iu[o]&&(iu[o]=!0,console.warn(s(o,\" has been deprecated since v\"+n+\" and will be removed in the near future\"))),t?t(i,o,l):!0}};uo.spelling=function(t){return(n,r)=>(console.warn(`${r} is likely a misspelling of ${t}`),!0)};function LS(e,t,n){if(typeof e!=\"object\")throw new ce(\"options must be an object\",ce.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let s=r.length;for(;s-- >0;){const i=r[s],o=t[i];if(o){const l=e[i],a=l===void 0||o(l,i,e);if(a!==!0)throw new ce(\"option \"+i+\" must be \"+a,ce.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new ce(\"Unknown option \"+i,ce.ERR_BAD_OPTION)}}const Qs={assertOptions:LS,validators:uo},Jt=Qs.validators;let Ii=class{constructor(t){this.defaults=t,this.interceptors={request:new Jc,response:new Jc}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let s={};Error.captureStackTrace?Error.captureStackTrace(s):s=new Error;const i=s.stack?s.stack.replace(/^.+\\n/,\"\"):\"\";try{r.stack?i&&!String(r.stack).endsWith(i.replace(/^.+\\n.+\\n/,\"\"))&&(r.stack+=`\n`+i):r.stack=i}catch{}}throw r}}_request(t,n){typeof t==\"string\"?(n=n||{},n.url=t):n=t||{},n=Xn(this.defaults,n);const{transitional:r,paramsSerializer:s,headers:i}=n;r!==void 0&&Qs.assertOptions(r,{silentJSONParsing:Jt.transitional(Jt.boolean),forcedJSONParsing:Jt.transitional(Jt.boolean),clarifyTimeoutError:Jt.transitional(Jt.boolean)},!1),s!=null&&(R.isFunction(s)?n.paramsSerializer={serialize:s}:Qs.assertOptions(s,{encode:Jt.function,serialize:Jt.function},!0)),n.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?n.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:n.allowAbsoluteUrls=!0),Qs.assertOptions(n,{baseUrl:Jt.spelling(\"baseURL\"),withXsrfToken:Jt.spelling(\"withXSRFToken\")},!0),n.method=(n.method||this.defaults.method||\"get\").toLowerCase();let o=i&&R.merge(i.common,i[n.method]);i&&R.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\",\"common\"],p=>{delete i[p]}),n.headers=zt.concat(o,i);const l=[];let a=!0;this.interceptors.request.forEach(function(g){typeof g.runWhen==\"function\"&&g.runWhen(n)===!1||(a=a&&g.synchronous,l.unshift(g.fulfilled,g.rejected))});const c=[];this.interceptors.response.forEach(function(g){c.push(g.fulfilled,g.rejected)});let u,f=0,d;if(!a){const p=[su.bind(this),void 0];for(p.unshift.apply(p,l),p.push.apply(p,c),d=p.length,u=Promise.resolve(n);f<d;)u=u.then(p[f++],p[f++]);return u}d=l.length;let h=n;for(f=0;f<d;){const p=l[f++],g=l[f++];try{h=p(h)}catch(_){g.call(this,_);break}}try{u=su.call(this,h)}catch(p){return Promise.reject(p)}for(f=0,d=c.length;f<d;)u=u.then(c[f++],c[f++]);return u}getUri(t){t=Xn(this.defaults,t);const n=Bh(t.baseURL,t.url,t.allowAbsoluteUrls);return Mh(n,t.params,t.paramsSerializer)}};R.forEach([\"delete\",\"get\",\"head\",\"options\"],function(t){Ii.prototype[t]=function(n,r){return this.request(Xn(r||{},{method:t,url:n,data:(r||{}).data}))}});R.forEach([\"post\",\"put\",\"patch\"],function(t){function n(r){return function(i,o,l){return this.request(Xn(l||{},{method:t,headers:r?{\"Content-Type\":\"multipart/form-data\"}:{},url:i,data:o}))}}Ii.prototype[t]=n(),Ii.prototype[t+\"Form\"]=n(!0)});const ei=Ii;class Aa{constructor(t){if(typeof t!=\"function\")throw new TypeError(\"executor must be a function.\");let n;this.promise=new Promise(function(i){n=i});const r=this;this.promise.then(s=>{if(!r._listeners)return;let i=r._listeners.length;for(;i-- >0;)r._listeners[i](s);r._listeners=null}),this.promise.then=s=>{let i;const o=new Promise(l=>{r.subscribe(l),i=l}).then(s);return o.cancel=function(){r.unsubscribe(i)},o},t(function(i,o,l){r.reason||(r.reason=new Nr(i,o,l),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new Aa(function(s){t=s}),cancel:t}}}const $S=Aa;function DS(e){return function(n){return e.apply(null,n)}}function BS(e){return R.isObject(e)&&e.isAxiosError===!0}const vl={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(vl).forEach(([e,t])=>{vl[t]=e});const jS=vl;function Wh(e){const t=new ei(e),n=Th(ei.prototype.request,t);return R.extend(n,ei.prototype,t,{allOwnKeys:!0}),R.extend(n,t,null,{allOwnKeys:!0}),n.create=function(s){return Wh(Xn(e,s))},n}const je=Wh(Ea);je.Axios=ei;je.CanceledError=Nr;je.CancelToken=$S;je.isCancel=$h;je.VERSION=Kh;je.toFormData=lo;je.AxiosError=ce;je.Cancel=je.CanceledError;je.all=function(t){return Promise.all(t)};je.spread=DS;je.isAxiosError=BS;je.mergeConfig=Xn;je.AxiosHeaders=zt;je.formToJSON=e=>Lh(R.isHTMLForm(e)?new FormData(e):e);je.getAdapter=qh.getAdapter;je.HttpStatusCode=jS;je.default=je;const Zh=je;window.axios=Zh;window.axios.defaults.headers.common[\"X-Requested-With\"]=\"XMLHttpRequest\";const US={install(e){e.config.globalProperties.$axios=Zh}};Object.entries(c_).forEach(([e,t])=>th(e,t));th(\"\",()=>!0);r0({generateMessage:L0({en:{...qc,messages:{...qc.messages,phone:\"This {field} must be a valid phone number\"}}}),validateOnBlur:!0,validateOnInput:!0,validateOnChange:!0});window.app=yi({data(){return{}},methods:{onSubmit(){},onInvalidSubmit(){}}});[US].forEach(e=>app.use(e));app.component(\"VForm\",x0);app.component(\"VField\",A0);app.component(\"VErrorMessage\",P0);window.addEventListener(\"load\",function(e){app.mount(\"#app\")});\n"
  },
  {
    "path": "public/installer/build/assets/app-e0866a20.css",
    "content": "*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: \"\"}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%;margin-right:auto;margin-left:auto;padding-right:16px;padding-left:16px}@media (min-width: 1920px){.container{max-width:1920px}}::-webkit-scrollbar{width:12px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb{background:#888;border-radius:6px}::-webkit-scrollbar-thumb:hover{background:#555}*{scrollbar-width:thin;scrollbar-color:#888 #f1f1f1}::-moz-selection{background-color:#0044f233}::selection{background-color:#0044f233}body{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}button:disabled{cursor:not-allowed;opacity:.5}button:disabled:hover{cursor:not-allowed;opacity:.5}.icon-tick:before{content:\"\"}.icon-cross-large:before{content:\"\"}.icon-left-arrow:before{content:\"\"}.icon-right-arrow:before{content:\"\"}.icon-up-arrow:before{content:\"\"}.icon-down-arrow:before{content:\"\"}p{font-size:14px;line-height:17px!important}input,textarea,select{outline:2px solid transparent;outline-offset:2px}.primary-button{display:flex;cursor:pointer;place-content:center;align-items:center;-moz-column-gap:.25rem;column-gap:.25rem;border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(14 144 217 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(14 144 217 / var(--tw-bg-opacity, 1));padding:.375rem .75rem;font-weight:600;--tw-text-opacity: 1;color:rgb(249 250 251 / var(--tw-text-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.primary-button:hover{opacity:.9}.primary-button:focus{opacity:.9}.custom-select{-webkit-appearance:none;-moz-appearance:none;background:transparent;background-image:url(\"data:image/svg+xml;utf8,<svg fill='black' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/><path d='M0 0h24v24H0z' fill='none'/></svg>\");background-repeat:no-repeat;background-position-x:calc(100% - 10px);background-position-y:50%}.dark .custom-select{background-image:url(\"data:image/svg+xml;utf8,<svg fill='white' height='24' viewBox='0 0 24 24' width='24' xmlns='http://www.w3.org/2000/svg'><path d='M7 10l5 5 5-5z'/><path d='M0 0h24v24H0z' fill='none'/></svg>\")}[dir=rtl] .custom-select{background-position-x:calc(100% - (100% - 10px))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.m-auto{margin:auto}.mb-2\\.5{margin-bottom:.625rem}.mb-6{margin-bottom:1.5rem}.mt-1{margin-top:.25rem}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-5{height:1.25rem}.h-72{height:18rem}.h-8{height:2rem}.h-\\[100px\\]{height:100px}.h-\\[100vh\\]{height:100vh}.h-\\[388px\\]{height:388px}.h-\\[484px\\]{height:484px}.h-\\[486px\\]{height:486px}.h-full{height:100%}.w-5{width:1.25rem}.w-8{width:2rem}.w-full{width:100%}.max-w-\\[362px\\]{max-width:362px}.max-w-\\[568px\\]{max-width:568px}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\\.5{gap:.375rem}.gap-12{gap:3rem}.gap-2\\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.place-self-end{place-self:end}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border,.border-\\[1px\\]{border-width:1px}.border-b{border-bottom-width:1px}.border-brandColor{--tw-border-opacity: 1;border-color:rgb(14 144 217 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-green-500{--tw-border-opacity: 1;border-color:rgb(34 197 94 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-red-600{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.bg-brandColor{--tw-bg-opacity: 1;background-color:rgb(14 144 217 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.p-1\\.5{padding:.375rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.py-1\\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.text-left{text-align:left}.text-center{text-align:center}.font-inter{font-family:Inter}.text-2xl{font-size:1.5rem;line-height:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.italic{font-style:italic}.leading-6{line-height:1.5rem}.\\!text-black{--tw-text-opacity: 1 !important;color:rgb(0 0 0 / var(--tw-text-opacity, 1))!important}.text-brandColor{--tw-text-opacity: 1;color:rgb(14 144 217 / var(--tw-text-opacity, 1))}.text-gray-50{--tw-text-opacity: 1;color:rgb(249 250 251 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}@font-face{font-family:icomoon;src:url(icomoon-1bcfcf1d.eot?w2trdd);src:url(icomoon-1bcfcf1d.eot?w2trdd#iefix) format(\"embedded-opentype\"),url(icomoon-c6be70b2.ttf?w2trdd) format(\"truetype\"),url(icomoon-81aea726.woff?w2trdd) format(\"woff\"),url(icomoon-c96ab384.svg?w2trdd#icomoon) format(\"svg\");font-weight:400;font-style:normal;font-display:block}[class^=icon-],[class*=\" icon-\"]{font-family:icomoon!important;speak:never;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.hover\\:border-gray-400:hover{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity, 1))}.hover\\:border-red-600:hover{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity, 1))}.hover\\:opacity-90:hover{opacity:.9}.peer:checked~.peer-checked\\:text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.dark\\:bg-gray-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity, 1))}.\\[\\&\\>\\*\\]\\:flex>*{display:flex}.\\[\\&\\>\\*\\]\\:items-center>*{align-items:center}.\\[\\&\\>\\*\\]\\:gap-1>*{gap:.25rem}\n"
  },
  {
    "path": "public/installer/build/manifest.json",
    "content": "{\n  \"src/Resources/assets/css/app.css\": {\n    \"file\": \"assets/app-e0866a20.css\",\n    \"isEntry\": true,\n    \"src\": \"src/Resources/assets/css/app.css\"\n  },\n  \"src/Resources/assets/fonts/icomoon.eot\": {\n    \"file\": \"assets/icomoon-1bcfcf1d.eot\",\n    \"src\": \"src/Resources/assets/fonts/icomoon.eot\"\n  },\n  \"src/Resources/assets/fonts/icomoon.svg\": {\n    \"file\": \"assets/icomoon-c96ab384.svg\",\n    \"src\": \"src/Resources/assets/fonts/icomoon.svg\"\n  },\n  \"src/Resources/assets/fonts/icomoon.ttf\": {\n    \"file\": \"assets/icomoon-c6be70b2.ttf\",\n    \"src\": \"src/Resources/assets/fonts/icomoon.ttf\"\n  },\n  \"src/Resources/assets/fonts/icomoon.woff\": {\n    \"file\": \"assets/icomoon-81aea726.woff\",\n    \"src\": \"src/Resources/assets/fonts/icomoon.woff\"\n  },\n  \"src/Resources/assets/images/favicon.ico\": {\n    \"file\": \"assets/favicon-a99d4e55.ico\",\n    \"src\": \"src/Resources/assets/images/favicon.ico\"\n  },\n  \"src/Resources/assets/images/krayin-logo.svg\": {\n    \"file\": \"assets/krayin-logo-4636add7.svg\",\n    \"src\": \"src/Resources/assets/images/krayin-logo.svg\"\n  },\n  \"src/Resources/assets/images/spinner.svg\": {\n    \"file\": \"assets/spinner-51c5cf50.svg\",\n    \"src\": \"src/Resources/assets/images/spinner.svg\"\n  },\n  \"src/Resources/assets/js/app.js\": {\n    \"file\": \"assets/app-aec2df31.js\",\n    \"isEntry\": true,\n    \"src\": \"src/Resources/assets/js/app.js\"\n  }\n}"
  },
  {
    "path": "public/robots.txt",
    "content": "User-agent: *\nDisallow:\n"
  },
  {
    "path": "public/web.config",
    "content": "<!--\n    Rewrites requires Microsoft URL Rewrite Module for IIS\n    Download: https://www.iis.net/downloads/microsoft/url-rewrite\n    Debug Help: https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/using-failed-request-tracing-to-trace-rewrite-rules\n-->\n<configuration>\n  <system.webServer>\n    <rewrite>\n      <rules>\n        <rule name=\"Imported Rule 1\" stopProcessing=\"true\">\n          <match url=\"^(.*)/$\" ignoreCase=\"false\" />\n          <conditions>\n            <add input=\"{REQUEST_FILENAME}\" matchType=\"IsDirectory\" ignoreCase=\"false\" negate=\"true\" />\n          </conditions>\n          <action type=\"Redirect\" redirectType=\"Permanent\" url=\"/{R:1}\" />\n        </rule>\n        <rule name=\"Imported Rule 2\" stopProcessing=\"true\">\n          <match url=\"^\" ignoreCase=\"false\" />\n          <conditions>\n            <add input=\"{REQUEST_FILENAME}\" matchType=\"IsDirectory\" ignoreCase=\"false\" negate=\"true\" />\n            <add input=\"{REQUEST_FILENAME}\" matchType=\"IsFile\" ignoreCase=\"false\" negate=\"true\" />\n          </conditions>\n          <action type=\"Rewrite\" url=\"index.php\" />\n        </rule>\n      </rules>\n    </rewrite>\n  </system.webServer>\n</configuration>\n"
  },
  {
    "path": "public/webform/build/assets/app-499ae59b.css",
    "content": "*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: \"\"}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.container{width:100%;margin-right:auto;margin-left:auto;padding-right:16px;padding-left:16px}@media (min-width: 1920px){.container{max-width:1920px}}.icon-cross-large:before{content:\"\"}.primary-button{display:flex;cursor:pointer;place-content:center;align-items:center;-moz-column-gap:.25rem;column-gap:.25rem;border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(14 144 217 / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(14 144 217 / var(--tw-bg-opacity));padding:.375rem .75rem;font-weight:600;--tw-text-opacity: 1;color:rgb(249 250 251 / var(--tw-text-opacity));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.primary-button:hover{opacity:.9}.primary-button:focus{opacity:.9}::-webkit-scrollbar{width:12px}::-webkit-scrollbar-track{background:#f1f1f1}::-webkit-scrollbar-thumb{background:#888;border-radius:6px}::-webkit-scrollbar-thumb:hover{background:#555}*{scrollbar-width:thin;scrollbar-color:#888 #f1f1f1}::-moz-selection{background-color:#0044f233}::selection{background-color:#0044f233}body{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity));font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))}button:disabled{cursor:not-allowed;opacity:.5}button:disabled:hover{cursor:not-allowed;opacity:.5}html.dark [class^=icon-],html.dark [class*=\" icon-\"]{color:#d1d5db}p{font-size:14px;line-height:17px!important}input,textarea,select{outline:2px solid transparent;outline-offset:2px}.required:after{--tw-content: \"*\";content:var(--tw-content)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-5{bottom:1.25rem}.left-1\\/2{left:50%}.z-\\[10003\\]{z-index:10003}.\\!mb-2{margin-bottom:.5rem!important}.mb-1\\.5{margin-bottom:.375rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-1{margin-top:.25rem}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-5{height:1.25rem}.h-\\[100vh\\]{height:100vh}.h-full{height:100%}.w-5{width:1.25rem}.w-9{width:2.25rem}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.min-w-\\[300px\\]{min-width:300px}.-translate-x-1\\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.flex-col{flex-direction:column}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-items-end{justify-items:end}.gap-1{gap:.25rem}.gap-1\\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\\.5{gap:.625rem}.gap-5{gap:1.25rem}.overflow-hidden{overflow:hidden}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.\\!border-red-600{--tw-border-opacity: 1 !important;border-color:rgb(220 38 38 / var(--tw-border-opacity))!important}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.p-1\\.5{padding:.375rem}.p-2\\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.px-2\\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\\.5{padding-top:.625rem;padding-bottom:.625rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.italic{font-style:italic}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity))}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity))}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.shadow-\\[0px_10px_20px_0px_rgba\\(0\\,0\\,0\\,0\\.12\\)\\]{--tw-shadow: 0px 10px 20px 0px rgba(0,0,0,.12);--tw-shadow-colored: 0px 10px 20px 0px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-300{transition-duration:.3s}.ease-\\[cubic-bezier\\(\\.4\\,0\\,\\.2\\,1\\)\\]{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@font-face{font-family:icomoon;src:url(icomoon-8bbcff3c.woff?w2trdd) format(\"woff\");font-weight:400;font-style:normal;font-display:block}[class^=icon-],[class*=\" icon-\"]{font-family:icomoon!important;speak:never;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.after\\:absolute:after{content:var(--tw-content);position:absolute}.after\\:top-0\\.5:after{content:var(--tw-content);top:.125rem}.after\\:h-4:after{content:var(--tw-content);height:1rem}.after\\:w-4:after{content:var(--tw-content);width:1rem}.after\\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\\:border:after{content:var(--tw-content);border-width:1px}.after\\:border-gray-300:after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity))}.after\\:bg-white:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.after\\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.after\\:content-\\[\\'\\'\\]:after{--tw-content: \"\";content:var(--tw-content)}.focus-within\\:border-gray-400:focus-within{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity))}.hover\\:border-gray-400:hover{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity))}.hover\\:border-red-600:hover{--tw-border-opacity: 1;border-color:rgb(220 38 38 / var(--tw-border-opacity))}.focus\\:border-gray-400:focus{--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity))}.peer:checked~.peer-checked\\:bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity))}.peer:checked~.peer-checked\\:text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity))}.peer:checked~.peer-checked\\:after\\:border-white:after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity))}.peer:focus~.peer-focus\\:outline-none{outline:2px solid transparent;outline-offset:2px}.peer:focus~.peer-focus\\:ring-blue-300{--tw-ring-opacity: 1;--tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity))}.dark\\:border-gray-800:is(.dark *){--tw-border-opacity: 1;border-color:rgb(31 41 55 / var(--tw-border-opacity))}.dark\\:bg-gray-800:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity))}.dark\\:bg-gray-900:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity))}.dark\\:bg-gray-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity))}.dark\\:text-gray-300:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity))}.dark\\:text-white:is(.dark *){--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.dark\\:file\\:bg-gray-800:is(.dark *)::file-selector-button{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity))}.dark\\:file\\:dark\\:text-white:is(.dark *):is(.dark *)::file-selector-button{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.dark\\:after\\:border-white:is(.dark *):after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity))}.dark\\:after\\:bg-white:is(.dark *):after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.dark\\:hover\\:border-gray-400:hover:is(.dark *){--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity))}.dark\\:focus\\:border-gray-400:focus:is(.dark *){--tw-border-opacity: 1;border-color:rgb(156 163 175 / var(--tw-border-opacity))}.peer:checked~.dark\\:peer-checked\\:bg-gray-950:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(3 7 18 / var(--tw-bg-opacity))}.ltr\\:translate-y-0:where([dir=ltr],[dir=ltr] *){--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ltr\\:translate-y-full:where([dir=ltr],[dir=ltr] *){--tw-translate-y: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.ltr\\:pl-4:where([dir=ltr],[dir=ltr] *){padding-left:1rem}.after\\:ltr\\:left-0\\.5:where([dir=ltr],[dir=ltr] *):after{content:var(--tw-content);left:.125rem}.peer:checked~.peer-checked\\:after\\:ltr\\:translate-x-full:where([dir=ltr],[dir=ltr] *):after{content:var(--tw-content);--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\\:-translate-y-0:where([dir=rtl],[dir=rtl] *){--tw-translate-y: -0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\\:-translate-y-full:where([dir=rtl],[dir=rtl] *){--tw-translate-y: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rtl\\:pr-4:where([dir=rtl],[dir=rtl] *){padding-right:1rem}.after\\:rtl\\:right-0\\.5:where([dir=rtl],[dir=rtl] *):after{content:var(--tw-content);right:.125rem}.peer:checked~.peer-checked\\:after\\:rtl\\:-translate-x-full:where([dir=rtl],[dir=rtl] *):after{content:var(--tw-content);--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}\n"
  },
  {
    "path": "public/webform/build/assets/app-8787c790.js",
    "content": "/**\n* @vue/shared v3.4.34\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**//*! #__NO_SIDE_EFFECTS__ */function Wt(e,n){const t=new Set(e.split(\",\"));return n?i=>t.has(i.toLowerCase()):i=>t.has(i)}const Oe={},Di=[],tt=()=>{},us=()=>!1,_i=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Va=e=>e.startsWith(\"onUpdate:\"),Ne=Object.assign,$a=(e,n)=>{const t=e.indexOf(n);t>-1&&e.splice(t,1)},zp=Object.prototype.hasOwnProperty,De=(e,n)=>zp.call(e,n),se=Array.isArray,Mi=e=>Yi(e)===\"[object Map]\",Ei=e=>Yi(e)===\"[object Set]\",ql=e=>Yi(e)===\"[object Date]\",Kp=e=>Yi(e)===\"[object RegExp]\",fe=e=>typeof e==\"function\",be=e=>typeof e==\"string\",Kt=e=>typeof e==\"symbol\",$e=e=>e!==null&&typeof e==\"object\",ja=e=>($e(e)||fe(e))&&fe(e.then)&&fe(e.catch),Wu=Object.prototype.toString,Yi=e=>Wu.call(e),Wp=e=>Yi(e).slice(8,-1),Yu=e=>Yi(e)===\"[object Object]\",Ba=e=>be(e)&&e!==\"NaN\"&&e[0]!==\"-\"&&\"\"+parseInt(e,10)===e,jn=Wt(\",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"),Yp=Wt(\"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"),Gs=e=>{const n=Object.create(null);return t=>n[t]||(n[t]=e(t))},Zp=/-(\\w)/g,Ke=Gs(e=>e.replace(Zp,(n,t)=>t?t.toUpperCase():\"\")),Gp=/\\B([A-Z])/g,Pt=Gs(e=>e.replace(Gp,\"-$1\").toLowerCase()),Si=Gs(e=>e.charAt(0).toUpperCase()+e.slice(1)),Ni=Gs(e=>e?`on${Si(e)}`:\"\"),Ot=(e,n)=>!Object.is(e,n),Ii=(e,...n)=>{for(let t=0;t<e.length;t++)e[t](...n)},Zu=(e,n,t,i=!1)=>{Object.defineProperty(e,n,{configurable:!0,enumerable:!1,writable:i,value:t})},Es=e=>{const n=parseFloat(e);return isNaN(n)?e:n},Ss=e=>{const n=be(e)?Number(e):NaN;return isNaN(n)?e:n};let zl;const Gu=()=>zl||(zl=typeof globalThis<\"u\"?globalThis:typeof self<\"u\"?self:typeof window<\"u\"?window:typeof global<\"u\"?global:{}),Jp=\"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error\",Xp=Wt(Jp);function Or(e){if(se(e)){const n={};for(let t=0;t<e.length;t++){const i=e[t],r=be(i)?Ju(i):Or(i);if(r)for(const s in r)n[s]=r[s]}return n}else if(be(e)||$e(e))return e}const Qp=/;(?![^(]*\\))/g,em=/:([^]+)/,tm=/\\/\\*[^]*?\\*\\//g;function Ju(e){const n={};return e.replace(tm,\"\").split(Qp).forEach(t=>{if(t){const i=t.split(em);i.length>1&&(n[i[0].trim()]=i[1].trim())}}),n}function xr(e){let n=\"\";if(be(e))n=e;else if(se(e))for(let t=0;t<e.length;t++){const i=xr(e[t]);i&&(n+=i+\" \")}else if($e(e))for(const t in e)e[t]&&(n+=t+\" \");return n.trim()}function nm(e){if(!e)return null;let{class:n,style:t}=e;return n&&!be(n)&&(e.class=xr(n)),t&&(e.style=Or(t)),e}const im=\"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\",rm=\"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,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,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\",sm=\"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\",om=\"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\",am=Wt(im),lm=Wt(rm),cm=Wt(sm),um=Wt(om),fm=\"itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly\",dm=Wt(fm);function Xu(e){return!!e||e===\"\"}function hm(e,n){if(e.length!==n.length)return!1;let t=!0;for(let i=0;t&&i<e.length;i++)t=qn(e[i],n[i]);return t}function qn(e,n){if(e===n)return!0;let t=ql(e),i=ql(n);if(t||i)return t&&i?e.getTime()===n.getTime():!1;if(t=Kt(e),i=Kt(n),t||i)return e===n;if(t=se(e),i=se(n),t||i)return t&&i?hm(e,n):!1;if(t=$e(e),i=$e(n),t||i){if(!t||!i)return!1;const r=Object.keys(e).length,s=Object.keys(n).length;if(r!==s)return!1;for(const o in e){const a=e.hasOwnProperty(o),l=n.hasOwnProperty(o);if(a&&!l||!a&&l||!qn(e[o],n[o]))return!1}}return String(e)===String(n)}function Js(e,n){return e.findIndex(t=>qn(t,n))}const Qu=e=>!!(e&&e.__v_isRef===!0),ef=e=>be(e)?e:e==null?\"\":se(e)||$e(e)&&(e.toString===Wu||!fe(e.toString))?Qu(e)?ef(e.value):JSON.stringify(e,tf,2):String(e),tf=(e,n)=>Qu(n)?tf(e,n.value):Mi(n)?{[`Map(${n.size})`]:[...n.entries()].reduce((t,[i,r],s)=>(t[xo(i,s)+\" =>\"]=r,t),{})}:Ei(n)?{[`Set(${n.size})`]:[...n.values()].map(t=>xo(t))}:Kt(n)?xo(n):$e(n)&&!se(n)&&!Yu(n)?String(n):n,xo=(e,n=\"\")=>{var t;return Kt(e)?`Symbol(${(t=e.description)!=null?t:n})`:e};/**\n* @vue/reactivity v3.4.34\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/let Ht;class Ha{constructor(n=!1){this.detached=n,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Ht,!n&&Ht&&(this.index=(Ht.scopes||(Ht.scopes=[])).push(this)-1)}get active(){return this._active}run(n){if(this._active){const t=Ht;try{return Ht=this,n()}finally{Ht=t}}}on(){Ht=this}off(){Ht=this.parent}stop(n){if(this._active){let t,i;for(t=0,i=this.effects.length;t<i;t++)this.effects[t].stop();for(t=0,i=this.cleanups.length;t<i;t++)this.cleanups[t]();if(this.scopes)for(t=0,i=this.scopes.length;t<i;t++)this.scopes[t].stop(!0);if(!this.detached&&this.parent&&!n){const r=this.parent.scopes.pop();r&&r!==this&&(this.parent.scopes[this.index]=r,r.index=this.index)}this.parent=void 0,this._active=!1}}}function pm(e){return new Ha(e)}function nf(e,n=Ht){n&&n.active&&n.effects.push(e)}function rf(){return Ht}function mm(e){Ht&&Ht.cleanups.push(e)}let ai;class $i{constructor(n,t,i,r){this.fn=n,this.trigger=t,this.scheduler=i,this.active=!0,this.deps=[],this._dirtyLevel=4,this._trackId=0,this._runnings=0,this._shouldSchedule=!1,this._depsLength=0,nf(this,r)}get dirty(){if(this._dirtyLevel===2||this._dirtyLevel===3){this._dirtyLevel=1,Gn();for(let n=0;n<this._depsLength;n++){const t=this.deps[n];if(t.computed&&(gm(t.computed),this._dirtyLevel>=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),Jn()}return this._dirtyLevel>=4}set dirty(n){this._dirtyLevel=n?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let n=Bn,t=ai;try{return Bn=!0,ai=this,this._runnings++,Kl(this),this.fn()}finally{Wl(this),this._runnings--,ai=t,Bn=n}}stop(){this.active&&(Kl(this),Wl(this),this.onStop&&this.onStop(),this.active=!1)}}function gm(e){return e.value}function Kl(e){e._trackId++,e._depsLength=0}function Wl(e){if(e.deps.length>e._depsLength){for(let n=e._depsLength;n<e.deps.length;n++)sf(e.deps[n],e);e.deps.length=e._depsLength}}function sf(e,n){const t=e.get(n);t!==void 0&&n._trackId!==t&&(e.delete(n),e.size===0&&e.cleanup())}function ym(e,n){e.effect instanceof $i&&(e=e.effect.fn);const t=new $i(e,tt,()=>{t.dirty&&t.run()});n&&(Ne(t,n),n.scope&&nf(t,n.scope)),(!n||!n.lazy)&&t.run();const i=t.run.bind(t);return i.effect=t,i}function vm(e){e.effect.stop()}let Bn=!0,Go=0;const of=[];function Gn(){of.push(Bn),Bn=!1}function Jn(){const e=of.pop();Bn=e===void 0?!0:e}function Ua(){Go++}function qa(){for(Go--;!Go&&Jo.length;)Jo.shift()()}function af(e,n,t){if(n.get(e)!==e._trackId){n.set(e,e._trackId);const i=e.deps[e._depsLength];i!==n?(i&&sf(i,e),e.deps[e._depsLength++]=n):e._depsLength++}}const Jo=[];function lf(e,n,t){Ua();for(const i of e.keys()){let r;i._dirtyLevel<n&&(r??(r=e.get(i)===i._trackId))&&(i._shouldSchedule||(i._shouldSchedule=i._dirtyLevel===0),i._dirtyLevel=n),i._shouldSchedule&&(r??(r=e.get(i)===i._trackId))&&(i.trigger(),(!i._runnings||i.allowRecurse)&&i._dirtyLevel!==2&&(i._shouldSchedule=!1,i.scheduler&&Jo.push(i.scheduler)))}qa()}const cf=(e,n)=>{const t=new Map;return t.cleanup=e,t.computed=n,t},ws=new WeakMap,li=Symbol(\"\"),Xo=Symbol(\"\");function Vt(e,n,t){if(Bn&&ai){let i=ws.get(e);i||ws.set(e,i=new Map);let r=i.get(t);r||i.set(t,r=cf(()=>i.delete(t))),af(ai,r)}}function Tn(e,n,t,i,r,s){const o=ws.get(e);if(!o)return;let a=[];if(n===\"clear\")a=[...o.values()];else if(t===\"length\"&&se(e)){const l=Number(i);o.forEach((c,u)=>{(u===\"length\"||!Kt(u)&&u>=l)&&a.push(c)})}else switch(t!==void 0&&a.push(o.get(t)),n){case\"add\":se(e)?Ba(t)&&a.push(o.get(\"length\")):(a.push(o.get(li)),Mi(e)&&a.push(o.get(Xo)));break;case\"delete\":se(e)||(a.push(o.get(li)),Mi(e)&&a.push(o.get(Xo)));break;case\"set\":Mi(e)&&a.push(o.get(li));break}Ua();for(const l of a)l&&lf(l,4);qa()}function bm(e,n){const t=ws.get(e);return t&&t.get(n)}const _m=Wt(\"__proto__,__v_isRef,__isVue\"),uf=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==\"arguments\"&&e!==\"caller\").map(e=>Symbol[e]).filter(Kt)),Yl=Em();function Em(){const e={};return[\"includes\",\"indexOf\",\"lastIndexOf\"].forEach(n=>{e[n]=function(...t){const i=xe(this);for(let s=0,o=this.length;s<o;s++)Vt(i,\"get\",s+\"\");const r=i[n](...t);return r===-1||r===!1?i[n](...t.map(xe)):r}}),[\"push\",\"pop\",\"shift\",\"unshift\",\"splice\"].forEach(n=>{e[n]=function(...t){Gn(),Ua();const i=xe(this)[n].apply(this,t);return qa(),Jn(),i}}),e}function Sm(e){Kt(e)||(e=String(e));const n=xe(this);return Vt(n,\"has\",e),n.hasOwnProperty(e)}class ff{constructor(n=!1,t=!1){this._isReadonly=n,this._isShallow=t}get(n,t,i){const r=this._isReadonly,s=this._isShallow;if(t===\"__v_isReactive\")return!r;if(t===\"__v_isReadonly\")return r;if(t===\"__v_isShallow\")return s;if(t===\"__v_raw\")return i===(r?s?yf:gf:s?mf:pf).get(n)||Object.getPrototypeOf(n)===Object.getPrototypeOf(i)?n:void 0;const o=se(n);if(!r){if(o&&De(Yl,t))return Reflect.get(Yl,t,i);if(t===\"hasOwnProperty\")return Sm}const a=Reflect.get(n,t,i);return(Kt(t)?uf.has(t):_m(t))||(r||Vt(n,\"get\",t),s)?a:Xe(a)?o&&Ba(t)?a:a.value:$e(a)?r?eo(a):zn(a):a}}class df extends ff{constructor(n=!1){super(!1,n)}set(n,t,i,r){let s=n[t];if(!this._isShallow){const l=Kn(s);if(!pi(i)&&!Kn(i)&&(s=xe(s),i=xe(i)),!se(n)&&Xe(s)&&!Xe(i))return l?!1:(s.value=i,!0)}const o=se(n)&&Ba(t)?Number(t)<n.length:De(n,t),a=Reflect.set(n,t,i,r);return n===xe(r)&&(o?Ot(i,s)&&Tn(n,\"set\",t,i):Tn(n,\"add\",t,i)),a}deleteProperty(n,t){const i=De(n,t);n[t];const r=Reflect.deleteProperty(n,t);return r&&i&&Tn(n,\"delete\",t,void 0),r}has(n,t){const i=Reflect.has(n,t);return(!Kt(t)||!uf.has(t))&&Vt(n,\"has\",t),i}ownKeys(n){return Vt(n,\"iterate\",se(n)?\"length\":li),Reflect.ownKeys(n)}}class hf extends ff{constructor(n=!1){super(!0,n)}set(n,t){return!0}deleteProperty(n,t){return!0}}const wm=new df,Cm=new hf,Tm=new df(!0),Am=new hf(!0),za=e=>e,Xs=e=>Reflect.getPrototypeOf(e);function jr(e,n,t=!1,i=!1){e=e.__v_raw;const r=xe(e),s=xe(n);t||(Ot(n,s)&&Vt(r,\"get\",n),Vt(r,\"get\",s));const{has:o}=Xs(r),a=i?za:t?Wa:dr;if(o.call(r,n))return a(e.get(n));if(o.call(r,s))return a(e.get(s));e!==r&&e.get(n)}function Br(e,n=!1){const t=this.__v_raw,i=xe(t),r=xe(e);return n||(Ot(e,r)&&Vt(i,\"has\",e),Vt(i,\"has\",r)),e===r?t.has(e):t.has(e)||t.has(r)}function Hr(e,n=!1){return e=e.__v_raw,!n&&Vt(xe(e),\"iterate\",li),Reflect.get(e,\"size\",e)}function Zl(e,n=!1){!n&&!pi(e)&&!Kn(e)&&(e=xe(e));const t=xe(this);return Xs(t).has.call(t,e)||(t.add(e),Tn(t,\"add\",e,e)),this}function Gl(e,n,t=!1){!t&&!pi(n)&&!Kn(n)&&(n=xe(n));const i=xe(this),{has:r,get:s}=Xs(i);let o=r.call(i,e);o||(e=xe(e),o=r.call(i,e));const a=s.call(i,e);return i.set(e,n),o?Ot(n,a)&&Tn(i,\"set\",e,n):Tn(i,\"add\",e,n),this}function Jl(e){const n=xe(this),{has:t,get:i}=Xs(n);let r=t.call(n,e);r||(e=xe(e),r=t.call(n,e)),i&&i.call(n,e);const s=n.delete(e);return r&&Tn(n,\"delete\",e,void 0),s}function Xl(){const e=xe(this),n=e.size!==0,t=e.clear();return n&&Tn(e,\"clear\",void 0,void 0),t}function Ur(e,n){return function(i,r){const s=this,o=s.__v_raw,a=xe(o),l=n?za:e?Wa:dr;return!e&&Vt(a,\"iterate\",li),o.forEach((c,u)=>i.call(r,l(c),l(u),s))}}function qr(e,n,t){return function(...i){const r=this.__v_raw,s=xe(r),o=Mi(s),a=e===\"entries\"||e===Symbol.iterator&&o,l=e===\"keys\"&&o,c=r[e](...i),u=t?za:n?Wa:dr;return!n&&Vt(s,\"iterate\",l?Xo:li),{next(){const{value:f,done:p}=c.next();return p?{value:f,done:p}:{value:a?[u(f[0]),u(f[1])]:u(f),done:p}},[Symbol.iterator](){return this}}}}function Dn(e){return function(...n){return e===\"delete\"?!1:e===\"clear\"?void 0:this}}function Om(){const e={get(s){return jr(this,s)},get size(){return Hr(this)},has:Br,add:Zl,set:Gl,delete:Jl,clear:Xl,forEach:Ur(!1,!1)},n={get(s){return jr(this,s,!1,!0)},get size(){return Hr(this)},has:Br,add(s){return Zl.call(this,s,!0)},set(s,o){return Gl.call(this,s,o,!0)},delete:Jl,clear:Xl,forEach:Ur(!1,!0)},t={get(s){return jr(this,s,!0)},get size(){return Hr(this,!0)},has(s){return Br.call(this,s,!0)},add:Dn(\"add\"),set:Dn(\"set\"),delete:Dn(\"delete\"),clear:Dn(\"clear\"),forEach:Ur(!0,!1)},i={get(s){return jr(this,s,!0,!0)},get size(){return Hr(this,!0)},has(s){return Br.call(this,s,!0)},add:Dn(\"add\"),set:Dn(\"set\"),delete:Dn(\"delete\"),clear:Dn(\"clear\"),forEach:Ur(!0,!0)};return[\"keys\",\"values\",\"entries\",Symbol.iterator].forEach(s=>{e[s]=qr(s,!1,!1),t[s]=qr(s,!0,!1),n[s]=qr(s,!1,!0),i[s]=qr(s,!0,!0)}),[e,t,n,i]}const[xm,Dm,Mm,Nm]=Om();function Qs(e,n){const t=n?e?Nm:Mm:e?Dm:xm;return(i,r,s)=>r===\"__v_isReactive\"?!e:r===\"__v_isReadonly\"?e:r===\"__v_raw\"?i:Reflect.get(De(t,r)&&r in i?t:i,r,s)}const Im={get:Qs(!1,!1)},km={get:Qs(!1,!0)},Rm={get:Qs(!0,!1)},Pm={get:Qs(!0,!0)},pf=new WeakMap,mf=new WeakMap,gf=new WeakMap,yf=new WeakMap;function Fm(e){switch(e){case\"Object\":case\"Array\":return 1;case\"Map\":case\"Set\":case\"WeakMap\":case\"WeakSet\":return 2;default:return 0}}function Lm(e){return e.__v_skip||!Object.isExtensible(e)?0:Fm(Wp(e))}function zn(e){return Kn(e)?e:to(e,!1,wm,Im,pf)}function vf(e){return to(e,!1,Tm,km,mf)}function eo(e){return to(e,!0,Cm,Rm,gf)}function Vm(e){return to(e,!0,Am,Pm,yf)}function to(e,n,t,i,r){if(!$e(e)||e.__v_raw&&!(n&&e.__v_isReactive))return e;const s=r.get(e);if(s)return s;const o=Lm(e);if(o===0)return e;const a=new Proxy(e,o===2?i:t);return r.set(e,a),a}function ci(e){return Kn(e)?ci(e.__v_raw):!!(e&&e.__v_isReactive)}function Kn(e){return!!(e&&e.__v_isReadonly)}function pi(e){return!!(e&&e.__v_isShallow)}function Ka(e){return e?!!e.__v_raw:!1}function xe(e){const n=e&&e.__v_raw;return n?xe(n):e}function bf(e){return Object.isExtensible(e)&&Zu(e,\"__v_skip\",!0),e}const dr=e=>$e(e)?zn(e):e,Wa=e=>$e(e)?eo(e):e;class _f{constructor(n,t,i,r){this.getter=n,this._setter=t,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new $i(()=>n(this._value),()=>ki(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=i}get value(){const n=xe(this);return(!n._cacheable||n.effect.dirty)&&Ot(n._value,n._value=n.effect.run())&&ki(n,4),Ya(n),n.effect._dirtyLevel>=2&&ki(n,2),n._value}set value(n){this._setter(n)}get _dirty(){return this.effect.dirty}set _dirty(n){this.effect.dirty=n}}function $m(e,n,t=!1){let i,r;const s=fe(e);return s?(i=e,r=tt):(i=e.get,r=e.set),new _f(i,r,s||!r,t)}function Ya(e){var n;Bn&&ai&&(e=xe(e),af(ai,(n=e.dep)!=null?n:e.dep=cf(()=>e.dep=void 0,e instanceof _f?e:void 0)))}function ki(e,n=4,t,i){e=xe(e);const r=e.dep;r&&lf(r,n)}function Xe(e){return!!(e&&e.__v_isRef===!0)}function bt(e){return Sf(e,!1)}function Ef(e){return Sf(e,!0)}function Sf(e,n){return Xe(e)?e:new jm(e,n)}class jm{constructor(n,t){this.__v_isShallow=t,this.dep=void 0,this.__v_isRef=!0,this._rawValue=t?n:xe(n),this._value=t?n:dr(n)}get value(){return Ya(this),this._value}set value(n){const t=this.__v_isShallow||pi(n)||Kn(n);n=t?n:xe(n),Ot(n,this._rawValue)&&(this._rawValue,this._rawValue=n,this._value=t?n:dr(n),ki(this,4))}}function Bm(e){ki(e,4)}function Ve(e){return Xe(e)?e.value:e}function Ce(e){return fe(e)?e():Ve(e)}const Hm={get:(e,n,t)=>Ve(Reflect.get(e,n,t)),set:(e,n,t,i)=>{const r=e[n];return Xe(r)&&!Xe(t)?(r.value=t,!0):Reflect.set(e,n,t,i)}};function Za(e){return ci(e)?e:new Proxy(e,Hm)}class Um{constructor(n){this.dep=void 0,this.__v_isRef=!0;const{get:t,set:i}=n(()=>Ya(this),()=>ki(this));this._get=t,this._set=i}get value(){return this._get()}set value(n){this._set(n)}}function wf(e){return new Um(e)}function qm(e){const n=se(e)?new Array(e.length):{};for(const t in e)n[t]=Cf(e,t);return n}class zm{constructor(n,t,i){this._object=n,this._key=t,this._defaultValue=i,this.__v_isRef=!0}get value(){const n=this._object[this._key];return n===void 0?this._defaultValue:n}set value(n){this._object[this._key]=n}get dep(){return bm(xe(this._object),this._key)}}class Km{constructor(n){this._getter=n,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Vn(e,n,t){return Xe(e)?e:fe(e)?new Km(e):$e(e)&&arguments.length>1?Cf(e,n,t):bt(e)}function Cf(e,n,t){const i=e[n];return Xe(i)?i:new zm(e,n,t)}const Wm={GET:\"get\",HAS:\"has\",ITERATE:\"iterate\"},Ym={SET:\"set\",ADD:\"add\",DELETE:\"delete\",CLEAR:\"clear\"};/**\n* @vue/runtime-core v3.4.34\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/function Zm(e,n){}const Gm={SETUP_FUNCTION:0,0:\"SETUP_FUNCTION\",RENDER_FUNCTION:1,1:\"RENDER_FUNCTION\",WATCH_GETTER:2,2:\"WATCH_GETTER\",WATCH_CALLBACK:3,3:\"WATCH_CALLBACK\",WATCH_CLEANUP:4,4:\"WATCH_CLEANUP\",NATIVE_EVENT_HANDLER:5,5:\"NATIVE_EVENT_HANDLER\",COMPONENT_EVENT_HANDLER:6,6:\"COMPONENT_EVENT_HANDLER\",VNODE_HOOK:7,7:\"VNODE_HOOK\",DIRECTIVE_HOOK:8,8:\"DIRECTIVE_HOOK\",TRANSITION_HOOK:9,9:\"TRANSITION_HOOK\",APP_ERROR_HANDLER:10,10:\"APP_ERROR_HANDLER\",APP_WARN_HANDLER:11,11:\"APP_WARN_HANDLER\",FUNCTION_REF:12,12:\"FUNCTION_REF\",ASYNC_COMPONENT_LOADER:13,13:\"ASYNC_COMPONENT_LOADER\",SCHEDULER:14,14:\"SCHEDULER\",COMPONENT_UPDATE:15,15:\"COMPONENT_UPDATE\"},Jm={sp:\"serverPrefetch hook\",bc:\"beforeCreate hook\",c:\"created hook\",bm:\"beforeMount hook\",m:\"mounted hook\",bu:\"beforeUpdate hook\",u:\"updated\",bum:\"beforeUnmount hook\",um:\"unmounted hook\",a:\"activated hook\",da:\"deactivated hook\",ec:\"errorCaptured hook\",rtc:\"renderTracked hook\",rtg:\"renderTriggered hook\",0:\"setup function\",1:\"render function\",2:\"watcher getter\",3:\"watcher callback\",4:\"watcher cleanup function\",5:\"native event handler\",6:\"component event handler\",7:\"vnode hook\",8:\"directive hook\",9:\"transition hook\",10:\"app errorHandler\",11:\"app warnHandler\",12:\"ref function\",13:\"async component loader\",14:\"scheduler flush\",15:\"component update\"};function An(e,n,t,i){try{return i?e(...i):e()}catch(r){wi(r,n,t)}}function zt(e,n,t,i){if(fe(e)){const r=An(e,n,t,i);return r&&ja(r)&&r.catch(s=>{wi(s,n,t)}),r}if(se(e)){const r=[];for(let s=0;s<e.length;s++)r.push(zt(e[s],n,t,i));return r}}function wi(e,n,t,i=!0){const r=n?n.vnode:null;if(n){let s=n.parent;const o=n.proxy,a=`https://vuejs.org/error-reference/#runtime-${t}`;for(;s;){const c=s.ec;if(c){for(let u=0;u<c.length;u++)if(c[u](e,o,a)===!1)return}s=s.parent}const l=n.appContext.config.errorHandler;if(l){Gn(),An(l,null,10,[e,o,a]),Jn();return}}Xm(e,t,r,i)}function Xm(e,n,t,i=!0){console.error(e)}let hr=!1,Qo=!1;const _t=[];let gn=0;const Ri=[];let Rn=null,ni=0;const Tf=Promise.resolve();let Ga=null;function It(e){const n=Ga||Tf;return e?n.then(this?e.bind(this):e):n}function Qm(e){let n=gn+1,t=_t.length;for(;n<t;){const i=n+t>>>1,r=_t[i],s=pr(r);s<e||s===e&&r.pre?n=i+1:t=i}return n}function no(e){(!_t.length||!_t.includes(e,hr&&e.allowRecurse?gn+1:gn))&&(e.id==null?_t.push(e):_t.splice(Qm(e.id),0,e),Af())}function Af(){!hr&&!Qo&&(Qo=!0,Ga=Tf.then(Of))}function eg(e){const n=_t.indexOf(e);n>gn&&_t.splice(n,1)}function Cs(e){se(e)?Ri.push(...e):(!Rn||!Rn.includes(e,e.allowRecurse?ni+1:ni))&&Ri.push(e),Af()}function Ql(e,n,t=hr?gn+1:0){for(;t<_t.length;t++){const i=_t[t];if(i&&i.pre){if(e&&i.id!==e.uid)continue;_t.splice(t,1),t--,i()}}}function Ts(e){if(Ri.length){const n=[...new Set(Ri)].sort((t,i)=>pr(t)-pr(i));if(Ri.length=0,Rn){Rn.push(...n);return}for(Rn=n,ni=0;ni<Rn.length;ni++){const t=Rn[ni];t.active!==!1&&t()}Rn=null,ni=0}}const pr=e=>e.id==null?1/0:e.id,tg=(e,n)=>{const t=pr(e)-pr(n);if(t===0){if(e.pre&&!n.pre)return-1;if(n.pre&&!e.pre)return 1}return t};function Of(e){Qo=!1,hr=!0,_t.sort(tg);const n=tt;try{for(gn=0;gn<_t.length;gn++){const t=_t[gn];t&&t.active!==!1&&An(t,t.i,t.i?15:14)}}finally{gn=0,_t.length=0,Ts(),hr=!1,Ga=null,(_t.length||Ri.length)&&Of()}}let xi,zr=[];function xf(e,n){var t,i;xi=e,xi?(xi.enabled=!0,zr.forEach(({event:r,args:s})=>xi.emit(r,...s)),zr=[]):typeof window<\"u\"&&window.HTMLElement&&!((i=(t=window.navigator)==null?void 0:t.userAgent)!=null&&i.includes(\"jsdom\"))?((n.__VUE_DEVTOOLS_HOOK_REPLAY__=n.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(s=>{xf(s,n)}),setTimeout(()=>{xi||(n.__VUE_DEVTOOLS_HOOK_REPLAY__=null,zr=[])},3e3)):zr=[]}let ot=null,io=null;function mr(e){const n=ot;return ot=e,io=e&&e.type.__scopeId||null,n}function ng(e){io=e}function ig(){io=null}const rg=e=>Ja;function Ja(e,n=ot,t){if(!n||e._n)return e;const i=(...r)=>{i._d&&la(-1);const s=mr(n);let o;try{o=e(...r)}finally{mr(s),i._d&&la(1)}return o};return i._n=!0,i._c=!0,i._d=!0,i}function sg(e,n){if(ot===null)return e;const t=kr(ot),i=e.dirs||(e.dirs=[]);for(let r=0;r<n.length;r++){let[s,o,a,l=Oe]=n[r];s&&(fe(s)&&(s={mounted:s,updated:s}),s.deep&&$n(o),i.push({dir:s,instance:t,value:o,oldValue:void 0,arg:a,modifiers:l}))}return e}function mn(e,n,t,i){const r=e.dirs,s=n&&n.dirs;for(let o=0;o<r.length;o++){const a=r[o];s&&(a.oldValue=s[o].value);let l=a.dir[i];l&&(Gn(),zt(l,t,8,[e.el,a,e,n]),Jn())}}const Pn=Symbol(\"_leaveCb\"),Kr=Symbol(\"_enterCb\");function Xa(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Ci(()=>{e.isMounted=!0}),Mr(()=>{e.isUnmounting=!0}),e}const Gt=[Function,Array],Qa={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Gt,onEnter:Gt,onAfterEnter:Gt,onEnterCancelled:Gt,onBeforeLeave:Gt,onLeave:Gt,onAfterLeave:Gt,onLeaveCancelled:Gt,onBeforeAppear:Gt,onAppear:Gt,onAfterAppear:Gt,onAppearCancelled:Gt},Df=e=>{const n=e.subTree;return n.component?Df(n.component):n},og={name:\"BaseTransition\",props:Qa,setup(e,{slots:n}){const t=Yt(),i=Xa();return()=>{const r=n.default&&ro(n.default(),!0);if(!r||!r.length)return;let s=r[0];if(r.length>1){for(const p of r)if(p.type!==ft){s=p;break}}const o=xe(e),{mode:a}=o;if(i.isLeaving)return Do(s);const l=ec(s);if(!l)return Do(s);let c=ji(l,o,i,t,p=>c=p);Wn(l,c);const u=t.subTree,f=u&&ec(u);if(f&&f.type!==ft&&!an(l,f)&&Df(t).type!==ft){const p=ji(f,o,i,t);if(Wn(f,p),a===\"out-in\"&&l.type!==ft)return i.isLeaving=!0,p.afterLeave=()=>{i.isLeaving=!1,t.update.active!==!1&&(t.effect.dirty=!0,t.update())},Do(s);a===\"in-out\"&&l.type!==ft&&(p.delayLeave=(m,g,b)=>{const M=Nf(i,f);M[String(f.key)]=f,m[Pn]=()=>{g(),m[Pn]=void 0,delete c.delayedLeave},c.delayedLeave=b})}return s}}},Mf=og;function Nf(e,n){const{leavingVNodes:t}=e;let i=t.get(n.type);return i||(i=Object.create(null),t.set(n.type,i)),i}function ji(e,n,t,i,r){const{appear:s,mode:o,persisted:a=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:p,onLeave:m,onAfterLeave:g,onLeaveCancelled:b,onBeforeAppear:M,onAppear:P,onAfterAppear:A,onAppearCancelled:v}=n,C=String(e.key),D=Nf(t,e),O=(T,x)=>{T&&zt(T,i,9,x)},L=(T,x)=>{const H=x[1];O(T,x),se(T)?T.every(N=>N.length<=1)&&H():T.length<=1&&H()},F={mode:o,persisted:a,beforeEnter(T){let x=l;if(!t.isMounted)if(s)x=M||l;else return;T[Pn]&&T[Pn](!0);const H=D[C];H&&an(e,H)&&H.el[Pn]&&H.el[Pn](),O(x,[T])},enter(T){let x=c,H=u,N=f;if(!t.isMounted)if(s)x=P||c,H=A||u,N=v||f;else return;let z=!1;const re=T[Kr]=ne=>{z||(z=!0,ne?O(N,[T]):O(H,[T]),F.delayedLeave&&F.delayedLeave(),T[Kr]=void 0)};x?L(x,[T,re]):re()},leave(T,x){const H=String(e.key);if(T[Kr]&&T[Kr](!0),t.isUnmounting)return x();O(p,[T]);let N=!1;const z=T[Pn]=re=>{N||(N=!0,x(),re?O(b,[T]):O(g,[T]),T[Pn]=void 0,D[H]===e&&delete D[H])};D[H]=e,m?L(m,[T,z]):z()},clone(T){const x=ji(T,n,t,i,r);return r&&r(x),x}};return F}function Do(e){if(Dr(e))return e=yn(e),e.children=null,e}function ec(e){if(!Dr(e))return e;const{shapeFlag:n,children:t}=e;if(t){if(n&16)return t[0];if(n&32&&fe(t.default))return t.default()}}function Wn(e,n){e.shapeFlag&6&&e.component?Wn(e.component.subTree,n):e.shapeFlag&128?(e.ssContent.transition=n.clone(e.ssContent),e.ssFallback.transition=n.clone(e.ssFallback)):e.transition=n}function ro(e,n=!1,t){let i=[],r=0;for(let s=0;s<e.length;s++){let o=e[s];const a=t==null?o.key:String(t)+String(o.key!=null?o.key:s);o.type===mt?(o.patchFlag&128&&r++,i=i.concat(ro(o.children,n,a))):(n||o.type!==ft)&&i.push(a!=null?yn(o,{key:a}):o)}if(r>1)for(let s=0;s<i.length;s++)i[s].patchFlag=-2;return i}/*! #__NO_SIDE_EFFECTS__ */function Zi(e,n){return fe(e)?(()=>Ne({name:e.name},n,{setup:e}))():e}const ui=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function ag(e){fe(e)&&(e={loader:e});const{loader:n,loadingComponent:t,errorComponent:i,delay:r=200,timeout:s,suspensible:o=!0,onError:a}=e;let l=null,c,u=0;const f=()=>(u++,l=null,p()),p=()=>{let m;return l||(m=l=n().catch(g=>{if(g=g instanceof Error?g:new Error(String(g)),a)return new Promise((b,M)=>{a(g,()=>b(f()),()=>M(g),u+1)});throw g}).then(g=>m!==l&&l?l:(g&&(g.__esModule||g[Symbol.toStringTag]===\"Module\")&&(g=g.default),c=g,g)))};return Zi({name:\"AsyncComponentWrapper\",__asyncLoader:p,get __asyncResolved(){return c},setup(){const m=st;if(c)return()=>Mo(c,m);const g=A=>{l=null,wi(A,m,13,!i)};if(o&&m.suspense||Ir)return p().then(A=>()=>Mo(A,m)).catch(A=>(g(A),()=>i?Be(i,{error:A}):null));const b=bt(!1),M=bt(),P=bt(!!r);return r&&setTimeout(()=>{P.value=!1},r),s!=null&&setTimeout(()=>{if(!b.value&&!M.value){const A=new Error(`Async component timed out after ${s}ms.`);g(A),M.value=A}},s),p().then(()=>{b.value=!0,m.parent&&Dr(m.parent.vnode)&&(m.parent.effect.dirty=!0,no(m.parent.update))}).catch(A=>{g(A),M.value=A}),()=>{if(b.value&&c)return Mo(c,m);if(M.value&&i)return Be(i,{error:M.value});if(t&&!P.value)return Be(t)}}})}function Mo(e,n){const{ref:t,props:i,children:r,ce:s}=n.vnode,o=Be(e,i,r);return o.ref=t,o.ce=s,delete n.vnode.ce,o}const Dr=e=>e.type.__isKeepAlive,lg={name:\"KeepAlive\",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:n}){const t=Yt(),i=t.ctx;if(!i.renderer)return()=>{const A=n.default&&n.default();return A&&A.length===1?A[0]:A};const r=new Map,s=new Set;let o=null;const a=t.suspense,{renderer:{p:l,m:c,um:u,o:{createElement:f}}}=i,p=f(\"div\");i.activate=(A,v,C,D,O)=>{const L=A.component;c(A,v,C,0,a),l(L.vnode,A,v,C,L,a,D,A.slotScopeIds,O),ut(()=>{L.isDeactivated=!1,L.a&&Ii(L.a);const F=A.props&&A.props.onVnodeMounted;F&&Nt(F,L.parent,A)},a)},i.deactivate=A=>{const v=A.component;xs(v.m),xs(v.a),c(A,p,null,1,a),ut(()=>{v.da&&Ii(v.da);const C=A.props&&A.props.onVnodeUnmounted;C&&Nt(C,v.parent,A),v.isDeactivated=!0},a)};function m(A){No(A),u(A,t,a,!0)}function g(A){r.forEach((v,C)=>{const D=ha(v.type);D&&(!A||!A(D))&&b(C)})}function b(A){const v=r.get(A);!o||!an(v,o)?m(v):o&&No(o),r.delete(A),s.delete(A)}en(()=>[e.include,e.exclude],([A,v])=>{A&&g(C=>nr(A,C)),v&&g(C=>!nr(v,C))},{flush:\"post\",deep:!0});let M=null;const P=()=>{M!=null&&(oa(t.subTree.type)?ut(()=>{r.set(M,Wr(t.subTree))},t.subTree.suspense):r.set(M,Wr(t.subTree)))};return Ci(P),oo(P),Mr(()=>{r.forEach(A=>{const{subTree:v,suspense:C}=t,D=Wr(v);if(A.type===D.type&&A.key===D.key){No(D);const O=D.component.da;O&&ut(O,C);return}m(A)})}),()=>{if(M=null,!n.default)return null;const A=n.default(),v=A[0];if(A.length>1)return o=null,A;if(!Yn(v)||!(v.shapeFlag&4)&&!(v.shapeFlag&128))return o=null,v;let C=Wr(v);const D=C.type,O=ha(ui(C)?C.type.__asyncResolved||{}:D),{include:L,exclude:F,max:T}=e;if(L&&(!O||!nr(L,O))||F&&O&&nr(F,O))return o=C,v;const x=C.key==null?D:C.key,H=r.get(x);return C.el&&(C=yn(C),v.shapeFlag&128&&(v.ssContent=C)),M=x,H?(C.el=H.el,C.component=H.component,C.transition&&Wn(C,C.transition),C.shapeFlag|=512,s.delete(x),s.add(x)):(s.add(x),T&&s.size>parseInt(T,10)&&b(s.values().next().value)),C.shapeFlag|=256,o=C,oa(v.type)?v:C}}},cg=lg;function nr(e,n){return se(e)?e.some(t=>nr(t,n)):be(e)?e.split(\",\").includes(n):Kp(e)?e.test(n):!1}function If(e,n){Rf(e,\"a\",n)}function kf(e,n){Rf(e,\"da\",n)}function Rf(e,n,t=st){const i=e.__wdc||(e.__wdc=()=>{let r=t;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(so(n,i,t),t){let r=t.parent;for(;r&&r.parent;)Dr(r.parent.vnode)&&ug(i,n,t,r),r=r.parent}}function ug(e,n,t,i){const r=so(n,e,i,!0);ao(()=>{$a(i[n],r)},t)}function No(e){e.shapeFlag&=-257,e.shapeFlag&=-513}function Wr(e){return e.shapeFlag&128?e.ssContent:e}function so(e,n,t=st,i=!1){if(t){const r=t[e]||(t[e]=[]),s=n.__weh||(n.__weh=(...o)=>{Gn();const a=gi(t),l=zt(n,t,e,o);return a(),Jn(),l});return i?r.unshift(s):r.push(s),s}}const xn=e=>(n,t=st)=>{(!Ir||e===\"sp\")&&so(e,(...i)=>n(...i),t)},Pf=xn(\"bm\"),Ci=xn(\"m\"),Ff=xn(\"bu\"),oo=xn(\"u\"),Mr=xn(\"bum\"),ao=xn(\"um\"),Lf=xn(\"sp\"),Vf=xn(\"rtg\"),$f=xn(\"rtc\");function jf(e,n=st){so(\"ec\",e,n)}const el=\"components\",fg=\"directives\";function dg(e,n){return tl(el,e,!0,n)||e}const Bf=Symbol.for(\"v-ndc\");function lo(e){return be(e)?tl(el,e,!1)||e:e||Bf}function hg(e){return tl(fg,e)}function tl(e,n,t=!0,i=!1){const r=ot||st;if(r){const s=r.type;if(e===el){const a=ha(s,!1);if(a&&(a===n||a===Ke(n)||a===Si(Ke(n))))return s}const o=tc(r[e]||s[e],n)||tc(r.appContext[e],n);return!o&&i?s:o}}function tc(e,n){return e&&(e[n]||e[Ke(n)]||e[Si(Ke(n))])}function pg(e,n,t,i){let r;const s=t&&t[i];if(se(e)||be(e)){r=new Array(e.length);for(let o=0,a=e.length;o<a;o++)r[o]=n(e[o],o,void 0,s&&s[o])}else if(typeof e==\"number\"){r=new Array(e);for(let o=0;o<e;o++)r[o]=n(o+1,o,void 0,s&&s[o])}else if($e(e))if(e[Symbol.iterator])r=Array.from(e,(o,a)=>n(o,a,void 0,s&&s[a]));else{const o=Object.keys(e);r=new Array(o.length);for(let a=0,l=o.length;a<l;a++){const c=o[a];r[a]=n(e[c],c,a,s&&s[a])}}else r=[];return t&&(t[i]=r),r}function mg(e,n){for(let t=0;t<n.length;t++){const i=n[t];if(se(i))for(let r=0;r<i.length;r++)e[i[r].name]=i[r].fn;else i&&(e[i.name]=i.key?(...r)=>{const s=i.fn(...r);return s&&(s.key=i.key),s}:i.fn)}return e}function gg(e,n,t={},i,r){if(ot.isCE||ot.parent&&ui(ot.parent)&&ot.parent.isCE)return n!==\"default\"&&(t.name=n),Be(\"slot\",t,i&&i());let s=e[n];s&&s._c&&(s._d=!1),fo();const o=s&&Hf(s(t)),a=ol(mt,{key:(t.key||o&&o.key||`_${n}`)+(!o&&i?\"_fb\":\"\")},o||(i?i():[]),o&&e._===1?64:-2);return!r&&a.scopeId&&(a.slotScopeIds=[a.scopeId+\"-s\"]),s&&s._c&&(s._d=!0),a}function Hf(e){return e.some(n=>Yn(n)?!(n.type===ft||n.type===mt&&!Hf(n.children)):!0)?e:null}function yg(e,n){const t={};for(const i in e)t[n&&/[A-Z]/.test(i)?`on:${i}`:Ni(i)]=e[i];return t}const ea=e=>e?Cd(e)?kr(e):ea(e.parent):null,or=Ne(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>ea(e.parent),$root:e=>ea(e.root),$emit:e=>e.emit,$options:e=>nl(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,no(e.update)}),$nextTick:e=>e.n||(e.n=It.bind(e.proxy)),$watch:e=>ey.bind(e)}),Io=(e,n)=>e!==Oe&&!e.__isScriptSetup&&De(e,n),ta={get({_:e},n){if(n===\"__v_skip\")return!0;const{ctx:t,setupState:i,data:r,props:s,accessCache:o,type:a,appContext:l}=e;let c;if(n[0]!==\"$\"){const m=o[n];if(m!==void 0)switch(m){case 1:return i[n];case 2:return r[n];case 4:return t[n];case 3:return s[n]}else{if(Io(i,n))return o[n]=1,i[n];if(r!==Oe&&De(r,n))return o[n]=2,r[n];if((c=e.propsOptions[0])&&De(c,n))return o[n]=3,s[n];if(t!==Oe&&De(t,n))return o[n]=4,t[n];na&&(o[n]=0)}}const u=or[n];let f,p;if(u)return n===\"$attrs\"&&Vt(e.attrs,\"get\",\"\"),u(e);if((f=a.__cssModules)&&(f=f[n]))return f;if(t!==Oe&&De(t,n))return o[n]=4,t[n];if(p=l.config.globalProperties,De(p,n))return p[n]},set({_:e},n,t){const{data:i,setupState:r,ctx:s}=e;return Io(r,n)?(r[n]=t,!0):i!==Oe&&De(i,n)?(i[n]=t,!0):De(e.props,n)||n[0]===\"$\"&&n.slice(1)in e?!1:(s[n]=t,!0)},has({_:{data:e,setupState:n,accessCache:t,ctx:i,appContext:r,propsOptions:s}},o){let a;return!!t[o]||e!==Oe&&De(e,o)||Io(n,o)||(a=s[0])&&De(a,o)||De(i,o)||De(or,o)||De(r.config.globalProperties,o)},defineProperty(e,n,t){return t.get!=null?e._.accessCache[n]=0:De(t,\"value\")&&this.set(e,n,t.value,null),Reflect.defineProperty(e,n,t)}},vg=Ne({},ta,{get(e,n){if(n!==Symbol.unscopables)return ta.get(e,n,e)},has(e,n){return n[0]!==\"_\"&&!Xp(n)}});function bg(){return null}function _g(){return null}function Eg(e){}function Sg(e){}function wg(){return null}function Cg(){}function Tg(e,n){return null}function Ag(){return Uf().slots}function Og(){return Uf().attrs}function Uf(){const e=Yt();return e.setupContext||(e.setupContext=xd(e))}function gr(e){return se(e)?e.reduce((n,t)=>(n[t]=null,n),{}):e}function xg(e,n){const t=gr(e);for(const i in n){if(i.startsWith(\"__skip\"))continue;let r=t[i];r?se(r)||fe(r)?r=t[i]={type:r,default:n[i]}:r.default=n[i]:r===null&&(r=t[i]={default:n[i]}),r&&n[`__skip_${i}`]&&(r.skipFactory=!0)}return t}function Dg(e,n){return!e||!n?e||n:se(e)&&se(n)?e.concat(n):Ne({},gr(e),gr(n))}function Mg(e,n){const t={};for(const i in e)n.includes(i)||Object.defineProperty(t,i,{enumerable:!0,get:()=>e[i]});return t}function Ng(e){const n=Yt();let t=e();return ua(),ja(t)&&(t=t.catch(i=>{throw gi(n),i})),[t,()=>gi(n)]}let na=!0;function Ig(e){const n=nl(e),t=e.proxy,i=e.ctx;na=!1,n.beforeCreate&&nc(n.beforeCreate,e,\"bc\");const{data:r,computed:s,methods:o,watch:a,provide:l,inject:c,created:u,beforeMount:f,mounted:p,beforeUpdate:m,updated:g,activated:b,deactivated:M,beforeDestroy:P,beforeUnmount:A,destroyed:v,unmounted:C,render:D,renderTracked:O,renderTriggered:L,errorCaptured:F,serverPrefetch:T,expose:x,inheritAttrs:H,components:N,directives:z,filters:re}=n;if(c&&kg(c,i,null),o)for(const X in o){const Q=o[X];fe(Q)&&(i[X]=Q.bind(t))}if(r){const X=r.call(t,t);$e(X)&&(e.data=zn(X))}if(na=!0,s)for(const X in s){const Q=s[X],He=fe(Q)?Q.bind(t,t):fe(Q.get)?Q.get.bind(t,t):tt,wt=!fe(Q)&&fe(Q.set)?Q.set.bind(t):tt,Ye=Me({get:He,set:wt});Object.defineProperty(i,X,{enumerable:!0,configurable:!0,get:()=>Ye.value,set:Ct=>Ye.value=Ct})}if(a)for(const X in a)qf(a[X],i,t,X);if(l){const X=fe(l)?l.call(t):l;Reflect.ownKeys(X).forEach(Q=>{co(Q,X[Q])})}u&&nc(u,e,\"c\");function U(X,Q){se(Q)?Q.forEach(He=>X(He.bind(t))):Q&&X(Q.bind(t))}if(U(Pf,f),U(Ci,p),U(Ff,m),U(oo,g),U(If,b),U(kf,M),U(jf,F),U($f,O),U(Vf,L),U(Mr,A),U(ao,C),U(Lf,T),se(x))if(x.length){const X=e.exposed||(e.exposed={});x.forEach(Q=>{Object.defineProperty(X,Q,{get:()=>t[Q],set:He=>t[Q]=He})})}else e.exposed||(e.exposed={});D&&e.render===tt&&(e.render=D),H!=null&&(e.inheritAttrs=H),N&&(e.components=N),z&&(e.directives=z)}function kg(e,n,t=tt){se(e)&&(e=ia(e));for(const i in e){const r=e[i];let s;$e(r)?\"default\"in r?s=fi(r.from||i,r.default,!0):s=fi(r.from||i):s=fi(r),Xe(s)?Object.defineProperty(n,i,{enumerable:!0,configurable:!0,get:()=>s.value,set:o=>s.value=o}):n[i]=s}}function nc(e,n,t){zt(se(e)?e.map(i=>i.bind(n.proxy)):e.bind(n.proxy),n,t)}function qf(e,n,t,i){const r=i.includes(\".\")?hd(t,i):()=>t[i];if(be(e)){const s=n[e];fe(s)&&en(r,s)}else if(fe(e))en(r,e.bind(t));else if($e(e))if(se(e))e.forEach(s=>qf(s,n,t,i));else{const s=fe(e.handler)?e.handler.bind(t):n[e.handler];fe(s)&&en(r,s,e)}}function nl(e){const n=e.type,{mixins:t,extends:i}=n,{mixins:r,optionsCache:s,config:{optionMergeStrategies:o}}=e.appContext,a=s.get(n);let l;return a?l=a:!r.length&&!t&&!i?l=n:(l={},r.length&&r.forEach(c=>As(l,c,o,!0)),As(l,n,o)),$e(n)&&s.set(n,l),l}function As(e,n,t,i=!1){const{mixins:r,extends:s}=n;s&&As(e,s,t,!0),r&&r.forEach(o=>As(e,o,t,!0));for(const o in n)if(!(i&&o===\"expose\")){const a=Rg[o]||t&&t[o];e[o]=a?a(e[o],n[o]):n[o]}return e}const Rg={data:ic,props:rc,emits:rc,methods:ir,computed:ir,beforeCreate:At,created:At,beforeMount:At,mounted:At,beforeUpdate:At,updated:At,beforeDestroy:At,beforeUnmount:At,destroyed:At,unmounted:At,activated:At,deactivated:At,errorCaptured:At,serverPrefetch:At,components:ir,directives:ir,watch:Fg,provide:ic,inject:Pg};function ic(e,n){return n?e?function(){return Ne(fe(e)?e.call(this,this):e,fe(n)?n.call(this,this):n)}:n:e}function Pg(e,n){return ir(ia(e),ia(n))}function ia(e){if(se(e)){const n={};for(let t=0;t<e.length;t++)n[e[t]]=e[t];return n}return e}function At(e,n){return e?[...new Set([].concat(e,n))]:n}function ir(e,n){return e?Ne(Object.create(null),e,n):n}function rc(e,n){return e?se(e)&&se(n)?[...new Set([...e,...n])]:Ne(Object.create(null),gr(e),gr(n??{})):n}function Fg(e,n){if(!e)return n;if(!n)return e;const t=Ne(Object.create(null),e);for(const i in n)t[i]=At(e[i],n[i]);return t}function zf(){return{app:null,config:{isNativeTag:us,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Lg=0;function Vg(e,n){return function(i,r=null){fe(i)||(i=Ne({},i)),r!=null&&!$e(r)&&(r=null);const s=zf(),o=new WeakSet;let a=!1;const l=s.app={_uid:Lg++,_component:i,_props:r,_container:null,_context:s,_instance:null,version:Md,get config(){return s.config},set config(c){},use(c,...u){return o.has(c)||(c&&fe(c.install)?(o.add(c),c.install(l,...u)):fe(c)&&(o.add(c),c(l,...u))),l},mixin(c){return s.mixins.includes(c)||s.mixins.push(c),l},component(c,u){return u?(s.components[c]=u,l):s.components[c]},directive(c,u){return u?(s.directives[c]=u,l):s.directives[c]},mount(c,u,f){if(!a){const p=Be(i,r);return p.appContext=s,f===!0?f=\"svg\":f===!1&&(f=void 0),u&&n?n(p,c):e(p,c,f),a=!0,l._container=c,c.__vue_app__=l,kr(p.component)}},unmount(){a&&(e(null,l._container),delete l._container.__vue_app__)},provide(c,u){return s.provides[c]=u,l},runWithContext(c){const u=Pi;Pi=l;try{return c()}finally{Pi=u}}};return l}}let Pi=null;function co(e,n){if(st){let t=st.provides;const i=st.parent&&st.parent.provides;i===t&&(t=st.provides=Object.create(i)),t[e]=n}}function fi(e,n,t=!1){const i=st||ot;if(i||Pi){const r=i?i.parent==null?i.vnode.appContext&&i.vnode.appContext.provides:i.parent.provides:Pi._context.provides;if(r&&e in r)return r[e];if(arguments.length>1)return t&&fe(n)?n.call(i&&i.proxy):n}}function $g(){return!!(st||ot||Pi)}const Kf={},Wf=()=>Object.create(Kf),Yf=e=>Object.getPrototypeOf(e)===Kf;function jg(e,n,t,i=!1){const r={},s=Wf();e.propsDefaults=Object.create(null),Zf(e,n,r,s);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);t?e.props=i?r:vf(r):e.type.props?e.props=r:e.props=s,e.attrs=s}function Bg(e,n,t,i){const{props:r,attrs:s,vnode:{patchFlag:o}}=e,a=xe(r),[l]=e.propsOptions;let c=!1;if((i||o>0)&&!(o&16)){if(o&8){const u=e.vnode.dynamicProps;for(let f=0;f<u.length;f++){let p=u[f];if(uo(e.emitsOptions,p))continue;const m=n[p];if(l)if(De(s,p))m!==s[p]&&(s[p]=m,c=!0);else{const g=Ke(p);r[g]=ra(l,a,g,m,e,!1)}else m!==s[p]&&(s[p]=m,c=!0)}}}else{Zf(e,n,r,s)&&(c=!0);let u;for(const f in a)(!n||!De(n,f)&&((u=Pt(f))===f||!De(n,u)))&&(l?t&&(t[f]!==void 0||t[u]!==void 0)&&(r[f]=ra(l,a,f,void 0,e,!0)):delete r[f]);if(s!==a)for(const f in s)(!n||!De(n,f))&&(delete s[f],c=!0)}c&&Tn(e.attrs,\"set\",\"\")}function Zf(e,n,t,i){const[r,s]=e.propsOptions;let o=!1,a;if(n)for(let l in n){if(jn(l))continue;const c=n[l];let u;r&&De(r,u=Ke(l))?!s||!s.includes(u)?t[u]=c:(a||(a={}))[u]=c:uo(e.emitsOptions,l)||(!(l in i)||c!==i[l])&&(i[l]=c,o=!0)}if(s){const l=xe(t),c=a||Oe;for(let u=0;u<s.length;u++){const f=s[u];t[f]=ra(r,l,f,c[f],e,!De(c,f))}}return o}function ra(e,n,t,i,r,s){const o=e[t];if(o!=null){const a=De(o,\"default\");if(a&&i===void 0){const l=o.default;if(o.type!==Function&&!o.skipFactory&&fe(l)){const{propsDefaults:c}=r;if(t in c)i=c[t];else{const u=gi(r);i=c[t]=l.call(null,n),u()}}else i=l}o[0]&&(s&&!a?i=!1:o[1]&&(i===\"\"||i===Pt(t))&&(i=!0))}return i}const Hg=new WeakMap;function Gf(e,n,t=!1){const i=t?Hg:n.propsCache,r=i.get(e);if(r)return r;const s=e.props,o={},a=[];let l=!1;if(!fe(e)){const u=f=>{l=!0;const[p,m]=Gf(f,n,!0);Ne(o,p),m&&a.push(...m)};!t&&n.mixins.length&&n.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!s&&!l)return $e(e)&&i.set(e,Di),Di;if(se(s))for(let u=0;u<s.length;u++){const f=Ke(s[u]);sc(f)&&(o[f]=Oe)}else if(s)for(const u in s){const f=Ke(u);if(sc(f)){const p=s[u],m=o[f]=se(p)||fe(p)?{type:p}:Ne({},p);if(m){const g=lc(Boolean,m.type),b=lc(String,m.type);m[0]=g>-1,m[1]=b<0||g<b,(g>-1||De(m,\"default\"))&&a.push(f)}}}const c=[o,a];return $e(e)&&i.set(e,c),c}function sc(e){return e[0]!==\"$\"&&!jn(e)}function oc(e){return e===null?\"null\":typeof e==\"function\"?e.name||\"\":typeof e==\"object\"&&e.constructor&&e.constructor.name||\"\"}function ac(e,n){return oc(e)===oc(n)}function lc(e,n){return se(n)?n.findIndex(t=>ac(t,e)):fe(n)&&ac(n,e)?0:-1}const Jf=e=>e[0]===\"_\"||e===\"$stable\",il=e=>se(e)?e.map(Rt):[Rt(e)],Ug=(e,n,t)=>{if(n._n)return n;const i=Ja((...r)=>il(n(...r)),t);return i._c=!1,i},Xf=(e,n,t)=>{const i=e._ctx;for(const r in e){if(Jf(r))continue;const s=e[r];if(fe(s))n[r]=Ug(r,s,i);else if(s!=null){const o=il(s);n[r]=()=>o}}},Qf=(e,n)=>{const t=il(n);e.slots.default=()=>t},ed=(e,n,t)=>{for(const i in n)(t||i!==\"_\")&&(e[i]=n[i])},qg=(e,n,t)=>{const i=e.slots=Wf();if(e.vnode.shapeFlag&32){const r=n._;r?(ed(i,n,t),t&&Zu(i,\"_\",r,!0)):Xf(n,i)}else n&&Qf(e,n)},zg=(e,n,t)=>{const{vnode:i,slots:r}=e;let s=!0,o=Oe;if(i.shapeFlag&32){const a=n._;a?t&&a===1?s=!1:ed(r,n,t):(s=!n.$stable,Xf(n,r)),o=n}else n&&(Qf(e,n),o={default:1});if(s)for(const a in r)!Jf(a)&&o[a]==null&&delete r[a]};function Os(e,n,t,i,r=!1){if(se(e)){e.forEach((p,m)=>Os(p,n&&(se(n)?n[m]:n),t,i,r));return}if(ui(i)&&!r)return;const s=i.shapeFlag&4?kr(i.component):i.el,o=r?null:s,{i:a,r:l}=e,c=n&&n.r,u=a.refs===Oe?a.refs={}:a.refs,f=a.setupState;if(c!=null&&c!==l&&(be(c)?(u[c]=null,De(f,c)&&(f[c]=null)):Xe(c)&&(c.value=null)),fe(l))An(l,a,12,[o,u]);else{const p=be(l),m=Xe(l);if(p||m){const g=()=>{if(e.f){const b=p?De(f,l)?f[l]:u[l]:l.value;r?se(b)&&$a(b,s):se(b)?b.includes(s)||b.push(s):p?(u[l]=[s],De(f,l)&&(f[l]=u[l])):(l.value=[s],e.k&&(u[e.k]=l.value))}else p?(u[l]=o,De(f,l)&&(f[l]=o)):m&&(l.value=o,e.k&&(u[e.k]=o))};o?(g.id=-1,ut(g,t)):g()}}}const td=Symbol(\"_vte\"),Kg=e=>e.__isTeleport,ar=e=>e&&(e.disabled||e.disabled===\"\"),cc=e=>typeof SVGElement<\"u\"&&e instanceof SVGElement,uc=e=>typeof MathMLElement==\"function\"&&e instanceof MathMLElement,sa=(e,n)=>{const t=e&&e.to;return be(t)?n?n(t):null:t},Wg={name:\"Teleport\",__isTeleport:!0,process(e,n,t,i,r,s,o,a,l,c){const{mc:u,pc:f,pbc:p,o:{insert:m,querySelector:g,createText:b,createComment:M}}=c,P=ar(n.props);let{shapeFlag:A,children:v,dynamicChildren:C}=n;if(e==null){const D=n.el=b(\"\"),O=n.anchor=b(\"\"),L=n.target=sa(n.props,g),F=n.targetStart=b(\"\"),T=n.targetAnchor=b(\"\");m(D,t,i),m(O,t,i),F[td]=T,L&&(m(F,L),m(T,L),o===\"svg\"||cc(L)?o=\"svg\":(o===\"mathml\"||uc(L))&&(o=\"mathml\"));const x=(H,N)=>{A&16&&u(v,H,N,r,s,o,a,l)};P?x(t,O):L&&x(L,T)}else{n.el=e.el,n.targetStart=e.targetStart;const D=n.anchor=e.anchor,O=n.target=e.target,L=n.targetAnchor=e.targetAnchor,F=ar(e.props),T=F?t:O,x=F?D:L;if(o===\"svg\"||cc(O)?o=\"svg\":(o===\"mathml\"||uc(O))&&(o=\"mathml\"),C?(p(e.dynamicChildren,C,T,r,s,o,a),rl(e,n,!0)):l||f(e,n,T,x,r,s,o,a,!1),P)F?n.props&&e.props&&n.props.to!==e.props.to&&(n.props.to=e.props.to):Yr(n,t,D,c,1);else if((n.props&&n.props.to)!==(e.props&&e.props.to)){const H=n.target=sa(n.props,g);H&&Yr(n,H,null,c,0)}else F&&Yr(n,O,L,c,1)}nd(n)},remove(e,n,t,{um:i,o:{remove:r}},s){const{shapeFlag:o,children:a,anchor:l,targetStart:c,targetAnchor:u,target:f,props:p}=e;if(f&&(r(c),r(u)),s&&r(l),o&16){const m=s||!ar(p);for(let g=0;g<a.length;g++){const b=a[g];i(b,n,t,m,!!b.dynamicChildren)}}},move:Yr,hydrate:Yg};function Yr(e,n,t,{o:{insert:i},m:r},s=2){s===0&&i(e.targetAnchor,n,t);const{el:o,anchor:a,shapeFlag:l,children:c,props:u}=e,f=s===2;if(f&&i(o,n,t),(!f||ar(u))&&l&16)for(let p=0;p<c.length;p++)r(c[p],n,t,2);f&&i(a,n,t)}function Yg(e,n,t,i,r,s,{o:{nextSibling:o,parentNode:a,querySelector:l}},c){const u=n.target=sa(n.props,l);if(u){const f=u._lpa||u.firstChild;if(n.shapeFlag&16)if(ar(n.props))n.anchor=c(o(e),n,a(e),t,i,r,s),n.targetAnchor=f;else{n.anchor=o(e);let p=f;for(;p;)if(p=o(p),p&&p.nodeType===8&&p.data===\"teleport anchor\"){n.targetAnchor=p,u._lpa=n.targetAnchor&&o(n.targetAnchor);break}c(f,n,u,t,i,r,s)}nd(n)}return n.anchor&&o(n.anchor)}const Zg=Wg;function nd(e){const n=e.ctx;if(n&&n.ut){let t=e.children[0].el;for(;t&&t!==e.targetAnchor;)t.nodeType===1&&t.setAttribute(\"data-v-owner\",n.uid),t=t.nextSibling;n.ut()}}let fc=!1;const Ai=()=>{fc||(console.error(\"Hydration completed but contains mismatches.\"),fc=!0)},Gg=e=>e.namespaceURI.includes(\"svg\")&&e.tagName!==\"foreignObject\",Jg=e=>e.namespaceURI.includes(\"MathML\"),Zr=e=>{if(Gg(e))return\"svg\";if(Jg(e))return\"mathml\"},Gr=e=>e.nodeType===8;function Xg(e){const{mt:n,p:t,o:{patchProp:i,createText:r,nextSibling:s,parentNode:o,remove:a,insert:l,createComment:c}}=e,u=(v,C)=>{if(!C.hasChildNodes()){t(null,v,C),Ts(),C._vnode=v;return}f(C.firstChild,v,null,null,null),Ts(),C._vnode=v},f=(v,C,D,O,L,F=!1)=>{F=F||!!C.dynamicChildren;const T=Gr(v)&&v.data===\"[\",x=()=>b(v,C,D,O,L,T),{type:H,ref:N,shapeFlag:z,patchFlag:re}=C;let ne=v.nodeType;C.el=v,re===-2&&(F=!1,C.dynamicChildren=null);let U=null;switch(H){case Hn:ne!==3?C.children===\"\"?(l(C.el=r(\"\"),o(v),v),U=v):U=x():(v.data!==C.children&&(Ai(),v.data=C.children),U=s(v));break;case ft:A(v)?(U=s(v),P(C.el=v.content.firstChild,v,D)):ne!==8||T?U=x():U=s(v);break;case di:if(T&&(v=s(v),ne=v.nodeType),ne===1||ne===3){U=v;const X=!C.children.length;for(let Q=0;Q<C.staticCount;Q++)X&&(C.children+=U.nodeType===1?U.outerHTML:U.data),Q===C.staticCount-1&&(C.anchor=U),U=s(U);return T?s(U):U}else x();break;case mt:T?U=g(v,C,D,O,L,F):U=x();break;default:if(z&1)(ne!==1||C.type.toLowerCase()!==v.tagName.toLowerCase())&&!A(v)?U=x():U=p(v,C,D,O,L,F);else if(z&6){C.slotScopeIds=L;const X=o(v);if(T?U=M(v):Gr(v)&&v.data===\"teleport start\"?U=M(v,v.data,\"teleport end\"):U=s(v),n(C,X,null,D,O,Zr(X),F),ui(C)){let Q;T?(Q=Be(mt),Q.anchor=U?U.previousSibling:X.lastChild):Q=v.nodeType===3?ll(\"\"):Be(\"div\"),Q.el=v,C.component.subTree=Q}}else z&64?ne!==8?U=x():U=C.type.hydrate(v,C,D,O,L,F,e,m):z&128&&(U=C.type.hydrate(v,C,D,O,Zr(o(v)),L,F,e,f))}return N!=null&&Os(N,null,O,C),U},p=(v,C,D,O,L,F)=>{F=F||!!C.dynamicChildren;const{type:T,props:x,patchFlag:H,shapeFlag:N,dirs:z,transition:re}=C,ne=T===\"input\"||T===\"option\";if(ne||H!==-1){z&&mn(C,null,D,\"created\");let U=!1;if(A(v)){U=od(O,re)&&D&&D.vnode.props&&D.vnode.props.appear;const Q=v.content.firstChild;U&&re.beforeEnter(Q),P(Q,v,D),C.el=v=Q}if(N&16&&!(x&&(x.innerHTML||x.textContent))){let Q=m(v.firstChild,C,v,D,O,L,F);for(;Q;){Ai();const He=Q;Q=Q.nextSibling,a(He)}}else N&8&&v.textContent!==C.children&&(Ai(),v.textContent=C.children);if(x){if(ne||!F||H&48)for(const Q in x)(ne&&(Q.endsWith(\"value\")||Q===\"indeterminate\")||_i(Q)&&!jn(Q)||Q[0]===\".\")&&i(v,Q,null,x[Q],void 0,D);else if(x.onClick)i(v,\"onClick\",null,x.onClick,void 0,D);else if(H&4&&ci(x.style))for(const Q in x.style)x.style[Q]}let X;(X=x&&x.onVnodeBeforeMount)&&Nt(X,D,C),z&&mn(C,null,D,\"beforeMount\"),((X=x&&x.onVnodeMounted)||z||U)&&yd(()=>{X&&Nt(X,D,C),U&&re.enter(v),z&&mn(C,null,D,\"mounted\")},O)}return v.nextSibling},m=(v,C,D,O,L,F,T)=>{T=T||!!C.dynamicChildren;const x=C.children,H=x.length;for(let N=0;N<H;N++){const z=T?x[N]:x[N]=Rt(x[N]),re=z.type===Hn;if(v){if(re&&!T){let ne=x[N+1];ne&&(ne=Rt(ne)).type===Hn&&(l(r(v.data.slice(z.children.length)),D,s(v)),v.data=z.children)}v=f(v,z,O,L,F,T)}else re&&!z.children?l(z.el=r(\"\"),D):(Ai(),t(null,z,D,null,O,L,Zr(D),F))}return v},g=(v,C,D,O,L,F)=>{const{slotScopeIds:T}=C;T&&(L=L?L.concat(T):T);const x=o(v),H=m(s(v),C,x,D,O,L,F);return H&&Gr(H)&&H.data===\"]\"?s(C.anchor=H):(Ai(),l(C.anchor=c(\"]\"),x,H),H)},b=(v,C,D,O,L,F)=>{if(Ai(),C.el=null,F){const H=M(v);for(;;){const N=s(v);if(N&&N!==H)a(N);else break}}const T=s(v),x=o(v);return a(v),t(null,C,x,T,D,O,Zr(x),L),T},M=(v,C=\"[\",D=\"]\")=>{let O=0;for(;v;)if(v=s(v),v&&Gr(v)&&(v.data===C&&O++,v.data===D)){if(O===0)return s(v);O--}return v},P=(v,C,D)=>{const O=C.parentNode;O&&O.replaceChild(v,C);let L=D;for(;L;)L.vnode.el===C&&(L.vnode.el=L.subTree.el=v),L=L.parent},A=v=>v.nodeType===1&&v.tagName.toLowerCase()===\"template\";return[u,f]}const ut=yd;function id(e){return sd(e)}function rd(e){return sd(e,Xg)}function sd(e,n){const t=Gu();t.__VUE__=!0;const{insert:i,remove:r,patchProp:s,createElement:o,createText:a,createComment:l,setText:c,setElementText:u,parentNode:f,nextSibling:p,setScopeId:m=tt,insertStaticContent:g}=e,b=(y,_,k,q=null,$=null,B=null,K=void 0,W=null,Z=!!_.dynamicChildren)=>{if(y===_)return;y&&!an(y,_)&&(q=de(y),Ct(y,$,B,!0),y=null),_.patchFlag===-2&&(Z=!1,_.dynamicChildren=null);const{type:j,ref:te,shapeFlag:ce}=_;switch(j){case Hn:M(y,_,k,q);break;case ft:P(y,_,k,q);break;case di:y==null&&A(_,k,q,K);break;case mt:N(y,_,k,q,$,B,K,W,Z);break;default:ce&1?D(y,_,k,q,$,B,K,W,Z):ce&6?z(y,_,k,q,$,B,K,W,Z):(ce&64||ce&128)&&j.process(y,_,k,q,$,B,K,W,Z,at)}te!=null&&$&&Os(te,y&&y.ref,B,_||y,!_)},M=(y,_,k,q)=>{if(y==null)i(_.el=a(_.children),k,q);else{const $=_.el=y.el;_.children!==y.children&&c($,_.children)}},P=(y,_,k,q)=>{y==null?i(_.el=l(_.children||\"\"),k,q):_.el=y.el},A=(y,_,k,q)=>{[y.el,y.anchor]=g(y.children,_,k,q,y.el,y.anchor)},v=({el:y,anchor:_},k,q)=>{let $;for(;y&&y!==_;)$=p(y),i(y,k,q),y=$;i(_,k,q)},C=({el:y,anchor:_})=>{let k;for(;y&&y!==_;)k=p(y),r(y),y=k;r(_)},D=(y,_,k,q,$,B,K,W,Z)=>{_.type===\"svg\"?K=\"svg\":_.type===\"math\"&&(K=\"mathml\"),y==null?O(_,k,q,$,B,K,W,Z):T(y,_,$,B,K,W,Z)},O=(y,_,k,q,$,B,K,W)=>{let Z,j;const{props:te,shapeFlag:ce,transition:oe,dirs:pe}=y;if(Z=y.el=o(y.type,B,te&&te.is,te),ce&8?u(Z,y.children):ce&16&&F(y.children,Z,null,q,$,ko(y,B),K,W),pe&&mn(y,null,q,\"created\"),L(Z,y,y.scopeId,K,q),te){for(const Le in te)Le!==\"value\"&&!jn(Le)&&s(Z,Le,null,te[Le],B,q);\"value\"in te&&s(Z,\"value\",null,te.value,B),(j=te.onVnodeBeforeMount)&&Nt(j,q,y)}pe&&mn(y,null,q,\"beforeMount\");const ge=od($,oe);ge&&oe.beforeEnter(Z),i(Z,_,k),((j=te&&te.onVnodeMounted)||ge||pe)&&ut(()=>{j&&Nt(j,q,y),ge&&oe.enter(Z),pe&&mn(y,null,q,\"mounted\")},$)},L=(y,_,k,q,$)=>{if(k&&m(y,k),q)for(let B=0;B<q.length;B++)m(y,q[B]);if($){let B=$.subTree;if(_===B){const K=$.vnode;L(y,K,K.scopeId,K.slotScopeIds,$.parent)}}},F=(y,_,k,q,$,B,K,W,Z=0)=>{for(let j=Z;j<y.length;j++){const te=y[j]=W?Fn(y[j]):Rt(y[j]);b(null,te,_,k,q,$,B,K,W)}},T=(y,_,k,q,$,B,K)=>{const W=_.el=y.el;let{patchFlag:Z,dynamicChildren:j,dirs:te}=_;Z|=y.patchFlag&16;const ce=y.props||Oe,oe=_.props||Oe;let pe;if(k&&Qn(k,!1),(pe=oe.onVnodeBeforeUpdate)&&Nt(pe,k,_,y),te&&mn(_,y,k,\"beforeUpdate\"),k&&Qn(k,!0),(ce.innerHTML&&oe.innerHTML==null||ce.textContent&&oe.textContent==null)&&u(W,\"\"),j?x(y.dynamicChildren,j,W,k,q,ko(_,$),B):K||Q(y,_,W,null,k,q,ko(_,$),B,!1),Z>0){if(Z&16)H(W,ce,oe,k,$);else if(Z&2&&ce.class!==oe.class&&s(W,\"class\",null,oe.class,$),Z&4&&s(W,\"style\",ce.style,oe.style,$),Z&8){const ge=_.dynamicProps;for(let Le=0;Le<ge.length;Le++){const E=ge[Le],S=ce[E],V=oe[E];(V!==S||E===\"value\")&&s(W,E,S,V,$,k)}}Z&1&&y.children!==_.children&&u(W,_.children)}else!K&&j==null&&H(W,ce,oe,k,$);((pe=oe.onVnodeUpdated)||te)&&ut(()=>{pe&&Nt(pe,k,_,y),te&&mn(_,y,k,\"updated\")},q)},x=(y,_,k,q,$,B,K)=>{for(let W=0;W<_.length;W++){const Z=y[W],j=_[W],te=Z.el&&(Z.type===mt||!an(Z,j)||Z.shapeFlag&70)?f(Z.el):k;b(Z,j,te,null,q,$,B,K,!0)}},H=(y,_,k,q,$)=>{if(_!==k){if(_!==Oe)for(const B in _)!jn(B)&&!(B in k)&&s(y,B,_[B],null,$,q);for(const B in k){if(jn(B))continue;const K=k[B],W=_[B];K!==W&&B!==\"value\"&&s(y,B,W,K,$,q)}\"value\"in k&&s(y,\"value\",_.value,k.value,$)}},N=(y,_,k,q,$,B,K,W,Z)=>{const j=_.el=y?y.el:a(\"\"),te=_.anchor=y?y.anchor:a(\"\");let{patchFlag:ce,dynamicChildren:oe,slotScopeIds:pe}=_;pe&&(W=W?W.concat(pe):pe),y==null?(i(j,k,q),i(te,k,q),F(_.children||[],k,te,$,B,K,W,Z)):ce>0&&ce&64&&oe&&y.dynamicChildren?(x(y.dynamicChildren,oe,k,$,B,K,W),(_.key!=null||$&&_===$.subTree)&&rl(y,_,!0)):Q(y,_,k,te,$,B,K,W,Z)},z=(y,_,k,q,$,B,K,W,Z)=>{_.slotScopeIds=W,y==null?_.shapeFlag&512?$.ctx.activate(_,k,q,K,Z):re(_,k,q,$,B,K,Z):ne(y,_,Z)},re=(y,_,k,q,$,B,K)=>{const W=y.component=wd(y,q,$);if(Dr(y)&&(W.ctx.renderer=at),Td(W,!1,K),W.asyncDep){if($&&$.registerDep(W,U,K),!y.el){const Z=W.subTree=Be(ft);P(null,Z,_,k)}}else U(W,y,_,k,$,B,K)},ne=(y,_,k)=>{const q=_.component=y.component;if(oy(y,_,k))if(q.asyncDep&&!q.asyncResolved){X(q,_,k);return}else q.next=_,eg(q.update),q.effect.dirty=!0,q.update();else _.el=y.el,q.vnode=_},U=(y,_,k,q,$,B,K)=>{const W=()=>{if(y.isMounted){let{next:te,bu:ce,u:oe,parent:pe,vnode:ge}=y;{const G=ad(y);if(G){te&&(te.el=ge.el,X(y,te,K)),G.asyncDep.then(()=>{y.isUnmounted||W()});return}}let Le=te,E;Qn(y,!1),te?(te.el=ge.el,X(y,te,K)):te=ge,ce&&Ii(ce),(E=te.props&&te.props.onVnodeBeforeUpdate)&&Nt(E,pe,te,ge),Qn(y,!0);const S=fs(y),V=y.subTree;y.subTree=S,b(V,S,f(V.el),de(V),y,$,B),te.el=S.el,Le===null&&sl(y,S.el),oe&&ut(oe,$),(E=te.props&&te.props.onVnodeUpdated)&&ut(()=>Nt(E,pe,te,ge),$)}else{let te;const{el:ce,props:oe}=_,{bm:pe,m:ge,parent:Le}=y,E=ui(_);if(Qn(y,!1),pe&&Ii(pe),!E&&(te=oe&&oe.onVnodeBeforeMount)&&Nt(te,Le,_),Qn(y,!0),ce&&ct){const S=()=>{y.subTree=fs(y),ct(ce,y.subTree,y,$,null)};E?_.type.__asyncLoader().then(()=>!y.isUnmounted&&S()):S()}else{const S=y.subTree=fs(y);b(null,S,k,q,y,$,B),_.el=S.el}if(ge&&ut(ge,$),!E&&(te=oe&&oe.onVnodeMounted)){const S=_;ut(()=>Nt(te,Le,S),$)}(_.shapeFlag&256||Le&&ui(Le.vnode)&&Le.vnode.shapeFlag&256)&&y.a&&ut(y.a,$),y.isMounted=!0,_=k=q=null}},Z=y.effect=new $i(W,tt,()=>no(j),y.scope),j=y.update=()=>{Z.dirty&&Z.run()};j.i=y,j.id=y.uid,Qn(y,!0),j()},X=(y,_,k)=>{_.component=y;const q=y.vnode.props;y.vnode=_,y.next=null,Bg(y,_.props,q,k),zg(y,_.children,k),Gn(),Ql(y),Jn()},Q=(y,_,k,q,$,B,K,W,Z=!1)=>{const j=y&&y.children,te=y?y.shapeFlag:0,ce=_.children,{patchFlag:oe,shapeFlag:pe}=_;if(oe>0){if(oe&128){wt(j,ce,k,q,$,B,K,W,Z);return}else if(oe&256){He(j,ce,k,q,$,B,K,W,Z);return}}pe&8?(te&16&&ee(j,$,B),ce!==j&&u(k,ce)):te&16?pe&16?wt(j,ce,k,q,$,B,K,W,Z):ee(j,$,B,!0):(te&8&&u(k,\"\"),pe&16&&F(ce,k,q,$,B,K,W,Z))},He=(y,_,k,q,$,B,K,W,Z)=>{y=y||Di,_=_||Di;const j=y.length,te=_.length,ce=Math.min(j,te);let oe;for(oe=0;oe<ce;oe++){const pe=_[oe]=Z?Fn(_[oe]):Rt(_[oe]);b(y[oe],pe,k,null,$,B,K,W,Z)}j>te?ee(y,$,B,!0,!1,ce):F(_,k,q,$,B,K,W,Z,ce)},wt=(y,_,k,q,$,B,K,W,Z)=>{let j=0;const te=_.length;let ce=y.length-1,oe=te-1;for(;j<=ce&&j<=oe;){const pe=y[j],ge=_[j]=Z?Fn(_[j]):Rt(_[j]);if(an(pe,ge))b(pe,ge,k,null,$,B,K,W,Z);else break;j++}for(;j<=ce&&j<=oe;){const pe=y[ce],ge=_[oe]=Z?Fn(_[oe]):Rt(_[oe]);if(an(pe,ge))b(pe,ge,k,null,$,B,K,W,Z);else break;ce--,oe--}if(j>ce){if(j<=oe){const pe=oe+1,ge=pe<te?_[pe].el:q;for(;j<=oe;)b(null,_[j]=Z?Fn(_[j]):Rt(_[j]),k,ge,$,B,K,W,Z),j++}}else if(j>oe)for(;j<=ce;)Ct(y[j],$,B,!0),j++;else{const pe=j,ge=j,Le=new Map;for(j=ge;j<=oe;j++){const ye=_[j]=Z?Fn(_[j]):Rt(_[j]);ye.key!=null&&Le.set(ye.key,j)}let E,S=0;const V=oe-ge+1;let G=!1,ue=0;const he=new Array(V);for(j=0;j<V;j++)he[j]=0;for(j=pe;j<=ce;j++){const ye=y[j];if(S>=V){Ct(ye,$,B,!0);continue}let Te;if(ye.key!=null)Te=Le.get(ye.key);else for(E=ge;E<=oe;E++)if(he[E-ge]===0&&an(ye,_[E])){Te=E;break}Te===void 0?Ct(ye,$,B,!0):(he[Te-ge]=j+1,Te>=ue?ue=Te:G=!0,b(ye,_[Te],k,null,$,B,K,W,Z),S++)}const J=G?Qg(he):Di;for(E=J.length-1,j=V-1;j>=0;j--){const ye=ge+j,Te=_[ye],Ge=ye+1<te?_[ye+1].el:q;he[j]===0?b(null,Te,k,Ge,$,B,K,W,Z):G&&(E<0||j!==J[E]?Ye(Te,k,Ge,2):E--)}}},Ye=(y,_,k,q,$=null)=>{const{el:B,type:K,transition:W,children:Z,shapeFlag:j}=y;if(j&6){Ye(y.component.subTree,_,k,q);return}if(j&128){y.suspense.move(_,k,q);return}if(j&64){K.move(y,_,k,at);return}if(K===mt){i(B,_,k);for(let ce=0;ce<Z.length;ce++)Ye(Z[ce],_,k,q);i(y.anchor,_,k);return}if(K===di){v(y,_,k);return}if(q!==2&&j&1&&W)if(q===0)W.beforeEnter(B),i(B,_,k),ut(()=>W.enter(B),$);else{const{leave:ce,delayLeave:oe,afterLeave:pe}=W,ge=()=>i(B,_,k),Le=()=>{ce(B,()=>{ge(),pe&&pe()})};oe?oe(B,ge,Le):Le()}else i(B,_,k)},Ct=(y,_,k,q=!1,$=!1)=>{const{type:B,props:K,ref:W,children:Z,dynamicChildren:j,shapeFlag:te,patchFlag:ce,dirs:oe,cacheIndex:pe}=y;if(ce===-2&&($=!1),W!=null&&Os(W,null,k,y,!0),pe!=null&&(_.renderCache[pe]=void 0),te&256){_.ctx.deactivate(y);return}const ge=te&1&&oe,Le=!ui(y);let E;if(Le&&(E=K&&K.onVnodeBeforeUnmount)&&Nt(E,_,y),te&6)sn(y.component,k,q);else{if(te&128){y.suspense.unmount(k,q);return}ge&&mn(y,null,_,\"beforeUnmount\"),te&64?y.type.remove(y,_,k,at,q):j&&!j.hasOnce&&(B!==mt||ce>0&&ce&64)?ee(j,_,k,!1,!0):(B===mt&&ce&384||!$&&te&16)&&ee(Z,_,k),q&&hn(y)}(Le&&(E=K&&K.onVnodeUnmounted)||ge)&&ut(()=>{E&&Nt(E,_,y),ge&&mn(y,null,_,\"unmounted\")},k)},hn=y=>{const{type:_,el:k,anchor:q,transition:$}=y;if(_===mt){ht(k,q);return}if(_===di){C(y);return}const B=()=>{r(k),$&&!$.persisted&&$.afterLeave&&$.afterLeave()};if(y.shapeFlag&1&&$&&!$.persisted){const{leave:K,delayLeave:W}=$,Z=()=>K(k,B);W?W(y.el,B,Z):Z()}else B()},ht=(y,_)=>{let k;for(;y!==_;)k=p(y),r(y),y=k;r(_)},sn=(y,_,k)=>{const{bum:q,scope:$,update:B,subTree:K,um:W,m:Z,a:j}=y;xs(Z),xs(j),q&&Ii(q),$.stop(),B&&(B.active=!1,Ct(K,y,_,k)),W&&ut(W,_),ut(()=>{y.isUnmounted=!0},_),_&&_.pendingBranch&&!_.isUnmounted&&y.asyncDep&&!y.asyncResolved&&y.suspenseId===_.pendingId&&(_.deps--,_.deps===0&&_.resolve())},ee=(y,_,k,q=!1,$=!1,B=0)=>{for(let K=B;K<y.length;K++)Ct(y[K],_,k,q,$)},de=y=>{if(y.shapeFlag&6)return de(y.component.subTree);if(y.shapeFlag&128)return y.suspense.next();const _=p(y.anchor||y.el),k=_&&_[td];return k?p(k):_};let Ie=!1;const we=(y,_,k)=>{y==null?_._vnode&&Ct(_._vnode,null,null,!0):b(_._vnode||null,y,_,null,null,null,k),Ie||(Ie=!0,Ql(),Ts(),Ie=!1),_._vnode=y},at={p:b,um:Ct,m:Ye,r:hn,mt:re,mc:F,pc:Q,pbc:x,n:de,o:e};let lt,ct;return n&&([lt,ct]=n(at)),{render:we,hydrate:lt,createApp:Vg(we,lt)}}function ko({type:e,props:n},t){return t===\"svg\"&&e===\"foreignObject\"||t===\"mathml\"&&e===\"annotation-xml\"&&n&&n.encoding&&n.encoding.includes(\"html\")?void 0:t}function Qn({effect:e,update:n},t){e.allowRecurse=n.allowRecurse=t}function od(e,n){return(!e||e&&!e.pendingBranch)&&n&&!n.persisted}function rl(e,n,t=!1){const i=e.children,r=n.children;if(se(i)&&se(r))for(let s=0;s<i.length;s++){const o=i[s];let a=r[s];a.shapeFlag&1&&!a.dynamicChildren&&((a.patchFlag<=0||a.patchFlag===32)&&(a=r[s]=Fn(r[s]),a.el=o.el),!t&&a.patchFlag!==-2&&rl(o,a)),a.type===Hn&&(a.el=o.el)}}function Qg(e){const n=e.slice(),t=[0];let i,r,s,o,a;const l=e.length;for(i=0;i<l;i++){const c=e[i];if(c!==0){if(r=t[t.length-1],e[r]<c){n[i]=r,t.push(i);continue}for(s=0,o=t.length-1;s<o;)a=s+o>>1,e[t[a]]<c?s=a+1:o=a;c<e[t[s]]&&(s>0&&(n[i]=t[s-1]),t[s]=i)}}for(s=t.length,o=t[s-1];s-- >0;)t[s]=o,o=n[o];return t}function ad(e){const n=e.subTree.component;if(n)return n.asyncDep&&!n.asyncResolved?n:ad(n)}function xs(e){if(e)for(let n=0;n<e.length;n++)e[n].active=!1}const ld=Symbol.for(\"v-scx\"),cd=()=>fi(ld);function ud(e,n){return Nr(e,null,n)}function fd(e,n){return Nr(e,null,{flush:\"post\"})}function dd(e,n){return Nr(e,null,{flush:\"sync\"})}const Jr={};function en(e,n,t){return Nr(e,n,t)}function Nr(e,n,{immediate:t,deep:i,flush:r,once:s,onTrack:o,onTrigger:a}=Oe){if(n&&s){const O=n;n=(...L)=>{O(...L),D()}}const l=st,c=O=>i===!0?O:$n(O,i===!1?1:void 0);let u,f=!1,p=!1;if(Xe(e)?(u=()=>e.value,f=pi(e)):ci(e)?(u=()=>c(e),f=!0):se(e)?(p=!0,f=e.some(O=>ci(O)||pi(O)),u=()=>e.map(O=>{if(Xe(O))return O.value;if(ci(O))return c(O);if(fe(O))return An(O,l,2)})):fe(e)?n?u=()=>An(e,l,2):u=()=>(m&&m(),zt(e,l,3,[g])):u=tt,n&&i){const O=u;u=()=>$n(O())}let m,g=O=>{m=v.onStop=()=>{An(O,l,4),m=v.onStop=void 0}},b;if(Ir)if(g=tt,n?t&&zt(n,l,3,[u(),p?[]:void 0,g]):u(),r===\"sync\"){const O=cd();b=O.__watcherHandles||(O.__watcherHandles=[])}else return tt;let M=p?new Array(e.length).fill(Jr):Jr;const P=()=>{if(!(!v.active||!v.dirty))if(n){const O=v.run();(i||f||(p?O.some((L,F)=>Ot(L,M[F])):Ot(O,M)))&&(m&&m(),zt(n,l,3,[O,M===Jr?void 0:p&&M[0]===Jr?[]:M,g]),M=O)}else v.run()};P.allowRecurse=!!n;let A;r===\"sync\"?A=P:r===\"post\"?A=()=>ut(P,l&&l.suspense):(P.pre=!0,l&&(P.id=l.uid),A=()=>no(P));const v=new $i(u,tt,A),C=rf(),D=()=>{v.stop(),C&&$a(C.effects,v)};return n?t?P():M=v.run():r===\"post\"?ut(v.run.bind(v),l&&l.suspense):v.run(),b&&b.push(D),D}function ey(e,n,t){const i=this.proxy,r=be(e)?e.includes(\".\")?hd(i,e):()=>i[e]:e.bind(i,i);let s;fe(n)?s=n:(s=n.handler,t=n);const o=gi(this),a=Nr(r,s.bind(i),t);return o(),a}function hd(e,n){const t=n.split(\".\");return()=>{let i=e;for(let r=0;r<t.length&&i;r++)i=i[t[r]];return i}}function $n(e,n=1/0,t){if(n<=0||!$e(e)||e.__v_skip||(t=t||new Set,t.has(e)))return e;if(t.add(e),n--,Xe(e))$n(e.value,n,t);else if(se(e))for(let i=0;i<e.length;i++)$n(e[i],n,t);else if(Ei(e)||Mi(e))e.forEach(i=>{$n(i,n,t)});else if(Yu(e)){for(const i in e)$n(e[i],n,t);for(const i of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,i)&&$n(e[i],n,t)}return e}function ty(e,n,t=Oe){const i=Yt(),r=Ke(n),s=Pt(n),o=pd(e,n),a=wf((l,c)=>{let u,f=Oe,p;return dd(()=>{const m=e[n];Ot(u,m)&&(u=m,c())}),{get(){return l(),t.get?t.get(u):u},set(m){if(!Ot(m,u)&&!(f!==Oe&&Ot(m,f)))return;const g=i.vnode.props;g&&(n in g||r in g||s in g)&&(`onUpdate:${n}`in g||`onUpdate:${r}`in g||`onUpdate:${s}`in g)||(u=m,c());const b=t.set?t.set(m):m;i.emit(`update:${n}`,b),Ot(m,b)&&Ot(m,f)&&!Ot(b,p)&&c(),f=m,p=b}}});return a[Symbol.iterator]=()=>{let l=0;return{next(){return l<2?{value:l++?o||Oe:a,done:!1}:{done:!0}}}},a}const pd=(e,n)=>n===\"modelValue\"||n===\"model-value\"?e.modelModifiers:e[`${n}Modifiers`]||e[`${Ke(n)}Modifiers`]||e[`${Pt(n)}Modifiers`];function ny(e,n,...t){if(e.isUnmounted)return;const i=e.vnode.props||Oe;let r=t;const s=n.startsWith(\"update:\"),o=s&&pd(i,n.slice(7));o&&(o.trim&&(r=t.map(u=>be(u)?u.trim():u)),o.number&&(r=t.map(Es)));let a,l=i[a=Ni(n)]||i[a=Ni(Ke(n))];!l&&s&&(l=i[a=Ni(Pt(n))]),l&&zt(l,e,6,r);const c=i[a+\"Once\"];if(c){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,zt(c,e,6,r)}}function md(e,n,t=!1){const i=n.emitsCache,r=i.get(e);if(r!==void 0)return r;const s=e.emits;let o={},a=!1;if(!fe(e)){const l=c=>{const u=md(c,n,!0);u&&(a=!0,Ne(o,u))};!t&&n.mixins.length&&n.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!s&&!a?($e(e)&&i.set(e,null),null):(se(s)?s.forEach(l=>o[l]=null):Ne(o,s),$e(e)&&i.set(e,o),o)}function uo(e,n){return!e||!_i(n)?!1:(n=n.slice(2).replace(/Once$/,\"\"),De(e,n[0].toLowerCase()+n.slice(1))||De(e,Pt(n))||De(e,n))}function fs(e){const{type:n,vnode:t,proxy:i,withProxy:r,propsOptions:[s],slots:o,attrs:a,emit:l,render:c,renderCache:u,props:f,data:p,setupState:m,ctx:g,inheritAttrs:b}=e,M=mr(e);let P,A;try{if(t.shapeFlag&4){const C=r||i,D=C;P=Rt(c.call(D,C,u,f,m,p,g)),A=a}else{const C=n;P=Rt(C.length>1?C(f,{attrs:a,slots:o,emit:l}):C(f,null)),A=n.props?a:ry(a)}}catch(C){lr.length=0,wi(C,e,1),P=Be(ft)}let v=P;if(A&&b!==!1){const C=Object.keys(A),{shapeFlag:D}=v;C.length&&D&7&&(s&&C.some(Va)&&(A=sy(A,s)),v=yn(v,A,!1,!0))}return t.dirs&&(v=yn(v,null,!1,!0),v.dirs=v.dirs?v.dirs.concat(t.dirs):t.dirs),t.transition&&(v.transition=t.transition),P=v,mr(M),P}function iy(e,n=!0){let t;for(let i=0;i<e.length;i++){const r=e[i];if(Yn(r)){if(r.type!==ft||r.children===\"v-if\"){if(t)return;t=r}}else return}return t}const ry=e=>{let n;for(const t in e)(t===\"class\"||t===\"style\"||_i(t))&&((n||(n={}))[t]=e[t]);return n},sy=(e,n)=>{const t={};for(const i in e)(!Va(i)||!(i.slice(9)in n))&&(t[i]=e[i]);return t};function oy(e,n,t){const{props:i,children:r,component:s}=e,{props:o,children:a,patchFlag:l}=n,c=s.emitsOptions;if(n.dirs||n.transition)return!0;if(t&&l>=0){if(l&1024)return!0;if(l&16)return i?dc(i,o,c):!!o;if(l&8){const u=n.dynamicProps;for(let f=0;f<u.length;f++){const p=u[f];if(o[p]!==i[p]&&!uo(c,p))return!0}}}else return(r||a)&&(!a||!a.$stable)?!0:i===o?!1:i?o?dc(i,o,c):!0:!!o;return!1}function dc(e,n,t){const i=Object.keys(n);if(i.length!==Object.keys(e).length)return!0;for(let r=0;r<i.length;r++){const s=i[r];if(n[s]!==e[s]&&!uo(t,s))return!0}return!1}function sl({vnode:e,parent:n},t){for(;n;){const i=n.subTree;if(i.suspense&&i.suspense.activeBranch===e&&(i.el=e.el),i===e)(e=n.vnode).el=t,n=n.parent;else break}}const oa=e=>e.__isSuspense;let aa=0;const ay={name:\"Suspense\",__isSuspense:!0,process(e,n,t,i,r,s,o,a,l,c){if(e==null)cy(n,t,i,r,s,o,a,l,c);else{if(s&&s.deps>0&&!e.suspense.isInFallback){n.suspense=e.suspense,n.suspense.vnode=n,n.el=e.el;return}uy(e,n,t,i,r,o,a,l,c)}},hydrate:fy,normalize:dy},ly=ay;function yr(e,n){const t=e.props&&e.props[n];fe(t)&&t()}function cy(e,n,t,i,r,s,o,a,l){const{p:c,o:{createElement:u}}=l,f=u(\"div\"),p=e.suspense=gd(e,r,i,n,f,t,s,o,a,l);c(null,p.pendingBranch=e.ssContent,f,null,i,p,s,o),p.deps>0?(yr(e,\"onPending\"),yr(e,\"onFallback\"),c(null,e.ssFallback,n,t,i,null,s,o),Fi(p,e.ssFallback)):p.resolve(!1,!0)}function uy(e,n,t,i,r,s,o,a,{p:l,um:c,o:{createElement:u}}){const f=n.suspense=e.suspense;f.vnode=n,n.el=e.el;const p=n.ssContent,m=n.ssFallback,{activeBranch:g,pendingBranch:b,isInFallback:M,isHydrating:P}=f;if(b)f.pendingBranch=p,an(p,b)?(l(b,p,f.hiddenContainer,null,r,f,s,o,a),f.deps<=0?f.resolve():M&&(P||(l(g,m,t,i,r,null,s,o,a),Fi(f,m)))):(f.pendingId=aa++,P?(f.isHydrating=!1,f.activeBranch=b):c(b,r,f),f.deps=0,f.effects.length=0,f.hiddenContainer=u(\"div\"),M?(l(null,p,f.hiddenContainer,null,r,f,s,o,a),f.deps<=0?f.resolve():(l(g,m,t,i,r,null,s,o,a),Fi(f,m))):g&&an(p,g)?(l(g,p,t,i,r,f,s,o,a),f.resolve(!0)):(l(null,p,f.hiddenContainer,null,r,f,s,o,a),f.deps<=0&&f.resolve()));else if(g&&an(p,g))l(g,p,t,i,r,f,s,o,a),Fi(f,p);else if(yr(n,\"onPending\"),f.pendingBranch=p,p.shapeFlag&512?f.pendingId=p.component.suspenseId:f.pendingId=aa++,l(null,p,f.hiddenContainer,null,r,f,s,o,a),f.deps<=0)f.resolve();else{const{timeout:A,pendingId:v}=f;A>0?setTimeout(()=>{f.pendingId===v&&f.fallback(m)},A):A===0&&f.fallback(m)}}function gd(e,n,t,i,r,s,o,a,l,c,u=!1){const{p:f,m:p,um:m,n:g,o:{parentNode:b,remove:M}}=c;let P;const A=hy(e);A&&n&&n.pendingBranch&&(P=n.pendingId,n.deps++);const v=e.props?Ss(e.props.timeout):void 0,C=s,D={vnode:e,parent:n,parentComponent:t,namespace:o,container:i,hiddenContainer:r,deps:0,pendingId:aa++,timeout:typeof v==\"number\"?v:-1,activeBranch:null,pendingBranch:null,isInFallback:!u,isHydrating:u,isUnmounted:!1,effects:[],resolve(O=!1,L=!1){const{vnode:F,activeBranch:T,pendingBranch:x,pendingId:H,effects:N,parentComponent:z,container:re}=D;let ne=!1;D.isHydrating?D.isHydrating=!1:O||(ne=T&&x.transition&&x.transition.mode===\"out-in\",ne&&(T.transition.afterLeave=()=>{H===D.pendingId&&(p(x,re,s===C?g(T):s,0),Cs(N))}),T&&(b(T.el)!==D.hiddenContainer&&(s=g(T)),m(T,z,D,!0)),ne||p(x,re,s,0)),Fi(D,x),D.pendingBranch=null,D.isInFallback=!1;let U=D.parent,X=!1;for(;U;){if(U.pendingBranch){U.effects.push(...N),X=!0;break}U=U.parent}!X&&!ne&&Cs(N),D.effects=[],A&&n&&n.pendingBranch&&P===n.pendingId&&(n.deps--,n.deps===0&&!L&&n.resolve()),yr(F,\"onResolve\")},fallback(O){if(!D.pendingBranch)return;const{vnode:L,activeBranch:F,parentComponent:T,container:x,namespace:H}=D;yr(L,\"onFallback\");const N=g(F),z=()=>{D.isInFallback&&(f(null,O,x,N,T,null,H,a,l),Fi(D,O))},re=O.transition&&O.transition.mode===\"out-in\";re&&(F.transition.afterLeave=z),D.isInFallback=!0,m(F,T,null,!0),re||z()},move(O,L,F){D.activeBranch&&p(D.activeBranch,O,L,F),D.container=O},next(){return D.activeBranch&&g(D.activeBranch)},registerDep(O,L,F){const T=!!D.pendingBranch;T&&D.deps++;const x=O.vnode.el;O.asyncDep.catch(H=>{wi(H,O,0)}).then(H=>{if(O.isUnmounted||D.isUnmounted||D.pendingId!==O.suspenseId)return;O.asyncResolved=!0;const{vnode:N}=O;fa(O,H,!1),x&&(N.el=x);const z=!x&&O.subTree.el;L(O,N,b(x||O.subTree.el),x?null:g(O.subTree),D,o,F),z&&M(z),sl(O,N.el),T&&--D.deps===0&&D.resolve()})},unmount(O,L){D.isUnmounted=!0,D.activeBranch&&m(D.activeBranch,t,O,L),D.pendingBranch&&m(D.pendingBranch,t,O,L)}};return D}function fy(e,n,t,i,r,s,o,a,l){const c=n.suspense=gd(n,i,t,e.parentNode,document.createElement(\"div\"),null,r,s,o,a,!0),u=l(e,c.pendingBranch=n.ssContent,t,c,s,o);return c.deps===0&&c.resolve(!1,!0),u}function dy(e){const{shapeFlag:n,children:t}=e,i=n&32;e.ssContent=hc(i?t.default:t),e.ssFallback=i?hc(t.fallback):Be(ft)}function hc(e){let n;if(fe(e)){const t=mi&&e._c;t&&(e._d=!1,fo()),e=e(),t&&(e._d=!0,n=Et,vd())}return se(e)&&(e=iy(e)),e=Rt(e),n&&!e.dynamicChildren&&(e.dynamicChildren=n.filter(t=>t!==e)),e}function yd(e,n){n&&n.pendingBranch?se(e)?n.effects.push(...e):n.effects.push(e):Cs(e)}function Fi(e,n){e.activeBranch=n;const{vnode:t,parentComponent:i}=e;let r=n.el;for(;!r&&n.component;)n=n.component.subTree,r=n.el;t.el=r,i&&i.subTree===t&&(i.vnode.el=r,sl(i,r))}function hy(e){const n=e.props&&e.props.suspensible;return n!=null&&n!==!1}const mt=Symbol.for(\"v-fgt\"),Hn=Symbol.for(\"v-txt\"),ft=Symbol.for(\"v-cmt\"),di=Symbol.for(\"v-stc\"),lr=[];let Et=null;function fo(e=!1){lr.push(Et=e?null:[])}function vd(){lr.pop(),Et=lr[lr.length-1]||null}let mi=1;function la(e){mi+=e,e<0&&Et&&(Et.hasOnce=!0)}function bd(e){return e.dynamicChildren=mi>0?Et||Di:null,vd(),mi>0&&Et&&Et.push(e),e}function py(e,n,t,i,r,s){return bd(al(e,n,t,i,r,s,!0))}function ol(e,n,t,i,r){return bd(Be(e,n,t,i,r,!0))}function Yn(e){return e?e.__v_isVNode===!0:!1}function an(e,n){return e.type===n.type&&e.key===n.key}function my(e){}const _d=({key:e})=>e??null,ds=({ref:e,ref_key:n,ref_for:t})=>(typeof e==\"number\"&&(e=\"\"+e),e!=null?be(e)||Xe(e)||fe(e)?{i:ot,r:e,k:n,f:!!t}:e:null);function al(e,n=null,t=null,i=0,r=null,s=e===mt?0:1,o=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:n,key:n&&_d(n),ref:n&&ds(n),scopeId:io,slotScopeIds:null,children:t,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:i,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:ot};return a?(cl(l,t),s&128&&e.normalize(l)):t&&(l.shapeFlag|=be(t)?8:16),mi>0&&!o&&Et&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&Et.push(l),l}const Be=gy;function gy(e,n=null,t=null,i=0,r=null,s=!1){if((!e||e===Bf)&&(e=ft),Yn(e)){const a=yn(e,n,!0);return t&&cl(a,t),mi>0&&!s&&Et&&(a.shapeFlag&6?Et[Et.indexOf(e)]=a:Et.push(a)),a.patchFlag=-2,a}if(Cy(e)&&(e=e.__vccOpts),n){n=Ed(n);let{class:a,style:l}=n;a&&!be(a)&&(n.class=xr(a)),$e(l)&&(Ka(l)&&!se(l)&&(l=Ne({},l)),n.style=Or(l))}const o=be(e)?1:oa(e)?128:Kg(e)?64:$e(e)?4:fe(e)?2:0;return al(e,n,t,i,r,o,s,!0)}function Ed(e){return e?Ka(e)||Yf(e)?Ne({},e):e:null}function yn(e,n,t=!1,i=!1){const{props:r,ref:s,patchFlag:o,children:a,transition:l}=e,c=n?Sd(r||{},n):r,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&_d(c),ref:n&&n.ref?t&&s?se(s)?s.concat(ds(n)):[s,ds(n)]:ds(n):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:n&&e.type!==mt?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&yn(e.ssContent),ssFallback:e.ssFallback&&yn(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&i&&Wn(u,l.clone(u)),u}function ll(e=\" \",n=0){return Be(Hn,null,e,n)}function yy(e,n){const t=Be(di,null,e);return t.staticCount=n,t}function vy(e=\"\",n=!1){return n?(fo(),ol(ft,null,e)):Be(ft,null,e)}function Rt(e){return e==null||typeof e==\"boolean\"?Be(ft):se(e)?Be(mt,null,e.slice()):typeof e==\"object\"?Fn(e):Be(Hn,null,String(e))}function Fn(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:yn(e)}function cl(e,n){let t=0;const{shapeFlag:i}=e;if(n==null)n=null;else if(se(n))t=16;else if(typeof n==\"object\")if(i&65){const r=n.default;r&&(r._c&&(r._d=!1),cl(e,r()),r._c&&(r._d=!0));return}else{t=32;const r=n._;!r&&!Yf(n)?n._ctx=ot:r===3&&ot&&(ot.slots._===1?n._=1:(n._=2,e.patchFlag|=1024))}else fe(n)?(n={default:n,_ctx:ot},t=32):(n=String(n),i&64?(t=16,n=[ll(n)]):t=8);e.children=n,e.shapeFlag|=t}function Sd(...e){const n={};for(let t=0;t<e.length;t++){const i=e[t];for(const r in i)if(r===\"class\")n.class!==i.class&&(n.class=xr([n.class,i.class]));else if(r===\"style\")n.style=Or([n.style,i.style]);else if(_i(r)){const s=n[r],o=i[r];o&&s!==o&&!(se(s)&&s.includes(o))&&(n[r]=s?[].concat(s,o):o)}else r!==\"\"&&(n[r]=i[r])}return n}function Nt(e,n,t,i=null){zt(e,n,7,[t,i])}const by=zf();let _y=0;function wd(e,n,t){const i=e.type,r=(n?n.appContext:e.appContext)||by,s={uid:_y++,vnode:e,type:i,parent:n,appContext:r,root:null,next:null,subTree:null,effect:null,update:null,scope:new Ha(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:n?n.provides:Object.create(r.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:Gf(i,r),emitsOptions:md(i,r),emit:null,emitted:null,propsDefaults:Oe,inheritAttrs:i.inheritAttrs,ctx:Oe,data:Oe,props:Oe,attrs:Oe,slots:Oe,refs:Oe,setupState:Oe,setupContext:null,suspense:t,suspenseId:t?t.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return s.ctx={_:s},s.root=n?n.root:s,s.emit=ny.bind(null,s),e.ce&&e.ce(s),s}let st=null;const Yt=()=>st||ot;let Ds,ca;{const e=Gu(),n=(t,i)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(i),s=>{r.length>1?r.forEach(o=>o(s)):r[0](s)}};Ds=n(\"__VUE_INSTANCE_SETTERS__\",t=>st=t),ca=n(\"__VUE_SSR_SETTERS__\",t=>Ir=t)}const gi=e=>{const n=st;return Ds(e),e.scope.on(),()=>{e.scope.off(),Ds(n)}},ua=()=>{st&&st.scope.off(),Ds(null)};function Cd(e){return e.vnode.shapeFlag&4}let Ir=!1;function Td(e,n=!1,t=!1){n&&ca(n);const{props:i,children:r}=e.vnode,s=Cd(e);jg(e,i,s,n),qg(e,r,t);const o=s?Ey(e,n):void 0;return n&&ca(!1),o}function Ey(e,n){const t=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,ta);const{setup:i}=t;if(i){const r=e.setupContext=i.length>1?xd(e):null,s=gi(e);Gn();const o=An(i,e,0,[e.props,r]);if(Jn(),s(),ja(o)){if(o.then(ua,ua),n)return o.then(a=>{fa(e,a,n)}).catch(a=>{wi(a,e,0)});e.asyncDep=o}else fa(e,o,n)}else Od(e,n)}function fa(e,n,t){fe(n)?e.type.__ssrInlineRender?e.ssrRender=n:e.render=n:$e(n)&&(e.setupState=Za(n)),Od(e,t)}let Ms,da;function Ad(e){Ms=e,da=n=>{n.render._rc&&(n.withProxy=new Proxy(n.ctx,vg))}}const Sy=()=>!Ms;function Od(e,n,t){const i=e.type;if(!e.render){if(!n&&Ms&&!i.render){const r=i.template||nl(e).template;if(r){const{isCustomElement:s,compilerOptions:o}=e.appContext.config,{delimiters:a,compilerOptions:l}=i,c=Ne(Ne({isCustomElement:s,delimiters:a},o),l);i.render=Ms(r,c)}}e.render=i.render||tt,da&&da(e)}{const r=gi(e);Gn();try{Ig(e)}finally{Jn(),r()}}}const wy={get(e,n){return Vt(e,\"get\",\"\"),e[n]}};function xd(e){const n=t=>{e.exposed=t||{}};return{attrs:new Proxy(e.attrs,wy),slots:e.slots,emit:e.emit,expose:n}}function kr(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Za(bf(e.exposed)),{get(n,t){if(t in n)return n[t];if(t in or)return or[t](e)},has(n,t){return t in n||t in or}})):e.proxy}function ha(e,n=!0){return fe(e)?e.displayName||e.name:e.name||n&&e.__name}function Cy(e){return fe(e)&&\"__vccOpts\"in e}const Me=(e,n)=>$m(e,n,Ir);function Bi(e,n,t){const i=arguments.length;return i===2?$e(n)&&!se(n)?Yn(n)?Be(e,null,[n]):Be(e,n):Be(e,null,n):(i>3?t=Array.prototype.slice.call(arguments,2):i===3&&Yn(t)&&(t=[t]),Be(e,n,t))}function Ty(){}function Ay(e,n,t,i){const r=t[i];if(r&&Dd(r,e))return r;const s=n();return s.memo=e.slice(),s.cacheIndex=i,t[i]=s}function Dd(e,n){const t=e.memo;if(t.length!=n.length)return!1;for(let i=0;i<t.length;i++)if(Ot(t[i],n[i]))return!1;return mi>0&&Et&&Et.push(e),!0}const Md=\"3.4.34\",Oy=tt,xy=Jm,Dy=xi,My=xf,Ny={createComponentInstance:wd,setupComponent:Td,renderComponentRoot:fs,setCurrentRenderingInstance:mr,isVNode:Yn,normalizeVNode:Rt,getComponentPublicInstance:kr},Iy=Ny,ky=null,Ry=null,Py=null;/**\n* @vue/runtime-dom v3.4.34\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/const Fy=\"http://www.w3.org/2000/svg\",Ly=\"http://www.w3.org/1998/Math/MathML\",wn=typeof document<\"u\"?document:null,pc=wn&&wn.createElement(\"template\"),Vy={insert:(e,n,t)=>{n.insertBefore(e,t||null)},remove:e=>{const n=e.parentNode;n&&n.removeChild(e)},createElement:(e,n,t,i)=>{const r=n===\"svg\"?wn.createElementNS(Fy,e):n===\"mathml\"?wn.createElementNS(Ly,e):t?wn.createElement(e,{is:t}):wn.createElement(e);return e===\"select\"&&i&&i.multiple!=null&&r.setAttribute(\"multiple\",i.multiple),r},createText:e=>wn.createTextNode(e),createComment:e=>wn.createComment(e),setText:(e,n)=>{e.nodeValue=n},setElementText:(e,n)=>{e.textContent=n},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>wn.querySelector(e),setScopeId(e,n){e.setAttribute(n,\"\")},insertStaticContent(e,n,t,i,r,s){const o=t?t.previousSibling:n.lastChild;if(r&&(r===s||r.nextSibling))for(;n.insertBefore(r.cloneNode(!0),t),!(r===s||!(r=r.nextSibling)););else{pc.innerHTML=i===\"svg\"?`<svg>${e}</svg>`:i===\"mathml\"?`<math>${e}</math>`:e;const a=pc.content;if(i===\"svg\"||i===\"mathml\"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}n.insertBefore(a,t)}return[o?o.nextSibling:n.firstChild,t?t.previousSibling:n.lastChild]}},Mn=\"transition\",Qi=\"animation\",Hi=Symbol(\"_vtc\"),ul=(e,{slots:n})=>Bi(Mf,Id(e),n);ul.displayName=\"Transition\";const Nd={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},$y=ul.props=Ne({},Qa,Nd),ei=(e,n=[])=>{se(e)?e.forEach(t=>t(...n)):e&&e(...n)},mc=e=>e?se(e)?e.some(n=>n.length>1):e.length>1:!1;function Id(e){const n={};for(const N in e)N in Nd||(n[N]=e[N]);if(e.css===!1)return n;const{name:t=\"v\",type:i,duration:r,enterFromClass:s=`${t}-enter-from`,enterActiveClass:o=`${t}-enter-active`,enterToClass:a=`${t}-enter-to`,appearFromClass:l=s,appearActiveClass:c=o,appearToClass:u=a,leaveFromClass:f=`${t}-leave-from`,leaveActiveClass:p=`${t}-leave-active`,leaveToClass:m=`${t}-leave-to`}=e,g=jy(r),b=g&&g[0],M=g&&g[1],{onBeforeEnter:P,onEnter:A,onEnterCancelled:v,onLeave:C,onLeaveCancelled:D,onBeforeAppear:O=P,onAppear:L=A,onAppearCancelled:F=v}=n,T=(N,z,re)=>{kn(N,z?u:a),kn(N,z?c:o),re&&re()},x=(N,z)=>{N._isLeaving=!1,kn(N,f),kn(N,m),kn(N,p),z&&z()},H=N=>(z,re)=>{const ne=N?L:A,U=()=>T(z,N,re);ei(ne,[z,U]),gc(()=>{kn(z,N?l:s),bn(z,N?u:a),mc(ne)||yc(z,i,b,U)})};return Ne(n,{onBeforeEnter(N){ei(P,[N]),bn(N,s),bn(N,o)},onBeforeAppear(N){ei(O,[N]),bn(N,l),bn(N,c)},onEnter:H(!1),onAppear:H(!0),onLeave(N,z){N._isLeaving=!0;const re=()=>x(N,z);bn(N,f),bn(N,p),Rd(),gc(()=>{N._isLeaving&&(kn(N,f),bn(N,m),mc(C)||yc(N,i,M,re))}),ei(C,[N,re])},onEnterCancelled(N){T(N,!1),ei(v,[N])},onAppearCancelled(N){T(N,!0),ei(F,[N])},onLeaveCancelled(N){x(N),ei(D,[N])}})}function jy(e){if(e==null)return null;if($e(e))return[Ro(e.enter),Ro(e.leave)];{const n=Ro(e);return[n,n]}}function Ro(e){return Ss(e)}function bn(e,n){n.split(/\\s+/).forEach(t=>t&&e.classList.add(t)),(e[Hi]||(e[Hi]=new Set)).add(n)}function kn(e,n){n.split(/\\s+/).forEach(i=>i&&e.classList.remove(i));const t=e[Hi];t&&(t.delete(n),t.size||(e[Hi]=void 0))}function gc(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let By=0;function yc(e,n,t,i){const r=e._endId=++By,s=()=>{r===e._endId&&i()};if(t)return setTimeout(s,t);const{type:o,timeout:a,propCount:l}=kd(e,n);if(!o)return i();const c=o+\"end\";let u=0;const f=()=>{e.removeEventListener(c,p),s()},p=m=>{m.target===e&&++u>=l&&f()};setTimeout(()=>{u<l&&f()},a+1),e.addEventListener(c,p)}function kd(e,n){const t=window.getComputedStyle(e),i=g=>(t[g]||\"\").split(\", \"),r=i(`${Mn}Delay`),s=i(`${Mn}Duration`),o=vc(r,s),a=i(`${Qi}Delay`),l=i(`${Qi}Duration`),c=vc(a,l);let u=null,f=0,p=0;n===Mn?o>0&&(u=Mn,f=o,p=s.length):n===Qi?c>0&&(u=Qi,f=c,p=l.length):(f=Math.max(o,c),u=f>0?o>c?Mn:Qi:null,p=u?u===Mn?s.length:l.length:0);const m=u===Mn&&/\\b(transform|all)(,|$)/.test(i(`${Mn}Property`).toString());return{type:u,timeout:f,propCount:p,hasTransform:m}}function vc(e,n){for(;e.length<n.length;)e=e.concat(e);return Math.max(...n.map((t,i)=>bc(t)+bc(e[i])))}function bc(e){return e===\"auto\"?0:Number(e.slice(0,-1).replace(\",\",\".\"))*1e3}function Rd(){return document.body.offsetHeight}function Hy(e,n,t){const i=e[Hi];i&&(n=(n?[n,...i]:[...i]).join(\" \")),n==null?e.removeAttribute(\"class\"):t?e.setAttribute(\"class\",n):e.className=n}const Ns=Symbol(\"_vod\"),Pd=Symbol(\"_vsh\"),Fd={beforeMount(e,{value:n},{transition:t}){e[Ns]=e.style.display===\"none\"?\"\":e.style.display,t&&n?t.beforeEnter(e):er(e,n)},mounted(e,{value:n},{transition:t}){t&&n&&t.enter(e)},updated(e,{value:n,oldValue:t},{transition:i}){!n!=!t&&(i?n?(i.beforeEnter(e),er(e,!0),i.enter(e)):i.leave(e,()=>{er(e,!1)}):er(e,n))},beforeUnmount(e,{value:n}){er(e,n)}};function er(e,n){e.style.display=n?e[Ns]:\"none\",e[Pd]=!n}function Uy(){Fd.getSSRProps=({value:e})=>{if(!e)return{style:{display:\"none\"}}}}const Ld=Symbol(\"\");function qy(e){const n=Yt();if(!n)return;const t=n.ut=(r=e(n.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner=\"${n.uid}\"]`)).forEach(s=>ma(s,r))},i=()=>{const r=e(n.proxy);pa(n.subTree,r),t(r)};Ci(()=>{fd(i);const r=new MutationObserver(i);r.observe(n.subTree.el.parentNode,{childList:!0}),ao(()=>r.disconnect())})}function pa(e,n){if(e.shapeFlag&128){const t=e.suspense;e=t.activeBranch,t.pendingBranch&&!t.isHydrating&&t.effects.push(()=>{pa(t.activeBranch,n)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)ma(e.el,n);else if(e.type===mt)e.children.forEach(t=>pa(t,n));else if(e.type===di){let{el:t,anchor:i}=e;for(;t&&(ma(t,n),t!==i);)t=t.nextSibling}}function ma(e,n){if(e.nodeType===1){const t=e.style;let i=\"\";for(const r in n)t.setProperty(`--${r}`,n[r]),i+=`--${r}: ${n[r]};`;t[Ld]=i}}const zy=/(^|;)\\s*display\\s*:/;function Ky(e,n,t){const i=e.style,r=be(t);let s=!1;if(t&&!r){if(n)if(be(n))for(const o of n.split(\";\")){const a=o.slice(0,o.indexOf(\":\")).trim();t[a]==null&&hs(i,a,\"\")}else for(const o in n)t[o]==null&&hs(i,o,\"\");for(const o in t)o===\"display\"&&(s=!0),hs(i,o,t[o])}else if(r){if(n!==t){const o=i[Ld];o&&(t+=\";\"+o),i.cssText=t,s=zy.test(t)}}else n&&e.removeAttribute(\"style\");Ns in e&&(e[Ns]=s?i.display:\"\",e[Pd]&&(i.display=\"none\"))}const _c=/\\s*!important$/;function hs(e,n,t){if(se(t))t.forEach(i=>hs(e,n,i));else if(t==null&&(t=\"\"),n.startsWith(\"--\"))e.setProperty(n,t);else{const i=Wy(e,n);_c.test(t)?e.setProperty(Pt(i),t.replace(_c,\"\"),\"important\"):e[i]=t}}const Ec=[\"Webkit\",\"Moz\",\"ms\"],Po={};function Wy(e,n){const t=Po[n];if(t)return t;let i=Ke(n);if(i!==\"filter\"&&i in e)return Po[n]=i;i=Si(i);for(let r=0;r<Ec.length;r++){const s=Ec[r]+i;if(s in e)return Po[n]=s}return n}const Sc=\"http://www.w3.org/1999/xlink\";function wc(e,n,t,i,r,s=dm(n)){i&&n.startsWith(\"xlink:\")?t==null?e.removeAttributeNS(Sc,n.slice(6,n.length)):e.setAttributeNS(Sc,n,t):t==null||s&&!Xu(t)?e.removeAttribute(n):e.setAttribute(n,s?\"\":Kt(t)?String(t):t)}function Yy(e,n,t,i){if(n===\"innerHTML\"||n===\"textContent\"){if(t==null)return;e[n]=t;return}const r=e.tagName;if(n===\"value\"&&r!==\"PROGRESS\"&&!r.includes(\"-\")){const o=r===\"OPTION\"?e.getAttribute(\"value\")||\"\":e.value,a=t==null?\"\":String(t);(o!==a||!(\"_value\"in e))&&(e.value=a),t==null&&e.removeAttribute(n),e._value=t;return}let s=!1;if(t===\"\"||t==null){const o=typeof e[n];o===\"boolean\"?t=Xu(t):t==null&&o===\"string\"?(t=\"\",s=!0):o===\"number\"&&(t=0,s=!0)}try{e[n]=t}catch{}s&&e.removeAttribute(n)}function Cn(e,n,t,i){e.addEventListener(n,t,i)}function Zy(e,n,t,i){e.removeEventListener(n,t,i)}const Cc=Symbol(\"_vei\");function Gy(e,n,t,i,r=null){const s=e[Cc]||(e[Cc]={}),o=s[n];if(i&&o)o.value=i;else{const[a,l]=Jy(n);if(i){const c=s[n]=ev(i,r);Cn(e,a,c,l)}else o&&(Zy(e,a,o,l),s[n]=void 0)}}const Tc=/(?:Once|Passive|Capture)$/;function Jy(e){let n;if(Tc.test(e)){n={};let i;for(;i=e.match(Tc);)e=e.slice(0,e.length-i[0].length),n[i[0].toLowerCase()]=!0}return[e[2]===\":\"?e.slice(3):Pt(e.slice(2)),n]}let Fo=0;const Xy=Promise.resolve(),Qy=()=>Fo||(Xy.then(()=>Fo=0),Fo=Date.now());function ev(e,n){const t=i=>{if(!i._vts)i._vts=Date.now();else if(i._vts<=t.attached)return;zt(tv(i,t.value),n,5,[i])};return t.value=e,t.attached=Qy(),t}function tv(e,n){if(se(n)){const t=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{t.call(e),e._stopped=!0},n.map(i=>r=>!r._stopped&&i&&i(r))}else return n}const Ac=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,nv=(e,n,t,i,r,s)=>{const o=r===\"svg\";n===\"class\"?Hy(e,i,o):n===\"style\"?Ky(e,t,i):_i(n)?Va(n)||Gy(e,n,t,i,s):(n[0]===\".\"?(n=n.slice(1),!0):n[0]===\"^\"?(n=n.slice(1),!1):iv(e,n,i,o))?(Yy(e,n,i),!e.tagName.includes(\"-\")&&(n===\"value\"||n===\"checked\"||n===\"selected\")&&wc(e,n,i,o,s,n!==\"value\")):(n===\"true-value\"?e._trueValue=i:n===\"false-value\"&&(e._falseValue=i),wc(e,n,i,o))};function iv(e,n,t,i){if(i)return!!(n===\"innerHTML\"||n===\"textContent\"||n in e&&Ac(n)&&fe(t));if(n===\"spellcheck\"||n===\"draggable\"||n===\"translate\"||n===\"form\"||n===\"list\"&&e.tagName===\"INPUT\"||n===\"type\"&&e.tagName===\"TEXTAREA\")return!1;if(n===\"width\"||n===\"height\"){const r=e.tagName;if(r===\"IMG\"||r===\"VIDEO\"||r===\"CANVAS\"||r===\"SOURCE\")return!1}return Ac(n)&&be(t)?!1:n in e}/*! #__NO_SIDE_EFFECTS__ */function Vd(e,n,t){const i=Zi(e,n);class r extends ho{constructor(o){super(i,o,t)}}return r.def=i,r}/*! #__NO_SIDE_EFFECTS__ */const rv=(e,n)=>Vd(e,n,Zd),sv=typeof HTMLElement<\"u\"?HTMLElement:class{};class ho extends sv{constructor(n,t={},i){super(),this._def=n,this._props=t,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this._ob=null,this.shadowRoot&&i?i(this._createVNode(),this.shadowRoot):(this.attachShadow({mode:\"open\"}),this._def.__asyncLoader||this._resolveProps(this._def))}connectedCallback(){this._connected=!0,this._instance||(this._resolved?this._update():this._resolveDef())}disconnectedCallback(){this._connected=!1,It(()=>{this._connected||(this._ob&&(this._ob.disconnect(),this._ob=null),ga(null,this.shadowRoot),this._instance=null)})}_resolveDef(){this._resolved=!0;for(let i=0;i<this.attributes.length;i++)this._setAttr(this.attributes[i].name);this._ob=new MutationObserver(i=>{for(const r of i)this._setAttr(r.attributeName)}),this._ob.observe(this,{attributes:!0});const n=(i,r=!1)=>{const{props:s,styles:o}=i;let a;if(s&&!se(s))for(const l in s){const c=s[l];(c===Number||c&&c.type===Number)&&(l in this._props&&(this._props[l]=Ss(this._props[l])),(a||(a=Object.create(null)))[Ke(l)]=!0)}this._numberProps=a,r&&this._resolveProps(i),this._applyStyles(o),this._update()},t=this._def.__asyncLoader;t?t().then(i=>n(i,!0)):n(this._def)}_resolveProps(n){const{props:t}=n,i=se(t)?t:Object.keys(t||{});for(const r of Object.keys(this))r[0]!==\"_\"&&i.includes(r)&&this._setProp(r,this[r],!0,!1);for(const r of i.map(Ke))Object.defineProperty(this,r,{get(){return this._getProp(r)},set(s){this._setProp(r,s)}})}_setAttr(n){let t=this.hasAttribute(n)?this.getAttribute(n):void 0;const i=Ke(n);this._numberProps&&this._numberProps[i]&&(t=Ss(t)),this._setProp(i,t,!1)}_getProp(n){return this._props[n]}_setProp(n,t,i=!0,r=!0){t!==this._props[n]&&(this._props[n]=t,r&&this._instance&&this._update(),i&&(t===!0?this.setAttribute(Pt(n),\"\"):typeof t==\"string\"||typeof t==\"number\"?this.setAttribute(Pt(n),t+\"\"):t||this.removeAttribute(Pt(n))))}_update(){ga(this._createVNode(),this.shadowRoot)}_createVNode(){const n=Be(this._def,Ne({},this._props));return this._instance||(n.ce=t=>{this._instance=t,t.isCE=!0;const i=(s,o)=>{this.dispatchEvent(new CustomEvent(s,{detail:o}))};t.emit=(s,...o)=>{i(s,o),Pt(s)!==s&&i(Pt(s),o)};let r=this;for(;r=r&&(r.parentNode||r.host);)if(r instanceof ho){t.parent=r._instance,t.provides=r._instance.provides;break}}),n}_applyStyles(n){n&&n.forEach(t=>{const i=document.createElement(\"style\");i.textContent=t,this.shadowRoot.appendChild(i)})}}function ov(e=\"$style\"){{const n=Yt();if(!n)return Oe;const t=n.type.__cssModules;if(!t)return Oe;const i=t[e];return i||Oe}}const $d=new WeakMap,jd=new WeakMap,Is=Symbol(\"_moveCb\"),Oc=Symbol(\"_enterCb\"),Bd={name:\"TransitionGroup\",props:Ne({},$y,{tag:String,moveClass:String}),setup(e,{slots:n}){const t=Yt(),i=Xa();let r,s;return oo(()=>{if(!r.length)return;const o=e.moveClass||`${e.name||\"v\"}-move`;if(!dv(r[0].el,t.vnode.el,o))return;r.forEach(cv),r.forEach(uv);const a=r.filter(fv);Rd(),a.forEach(l=>{const c=l.el,u=c.style;bn(c,o),u.transform=u.webkitTransform=u.transitionDuration=\"\";const f=c[Is]=p=>{p&&p.target!==c||(!p||/transform$/.test(p.propertyName))&&(c.removeEventListener(\"transitionend\",f),c[Is]=null,kn(c,o))};c.addEventListener(\"transitionend\",f)})}),()=>{const o=xe(e),a=Id(o);let l=o.tag||mt;if(r=[],s)for(let c=0;c<s.length;c++){const u=s[c];u.el&&u.el instanceof Element&&(r.push(u),Wn(u,ji(u,a,i,t)),$d.set(u,u.el.getBoundingClientRect()))}s=n.default?ro(n.default()):[];for(let c=0;c<s.length;c++){const u=s[c];u.key!=null&&Wn(u,ji(u,a,i,t))}return Be(l,null,s)}}},av=e=>delete e.mode;Bd.props;const lv=Bd;function cv(e){const n=e.el;n[Is]&&n[Is](),n[Oc]&&n[Oc]()}function uv(e){jd.set(e,e.el.getBoundingClientRect())}function fv(e){const n=$d.get(e),t=jd.get(e),i=n.left-t.left,r=n.top-t.top;if(i||r){const s=e.el.style;return s.transform=s.webkitTransform=`translate(${i}px,${r}px)`,s.transitionDuration=\"0s\",e}}function dv(e,n,t){const i=e.cloneNode(),r=e[Hi];r&&r.forEach(a=>{a.split(/\\s+/).forEach(l=>l&&i.classList.remove(l))}),t.split(/\\s+/).forEach(a=>a&&i.classList.add(a)),i.style.display=\"none\";const s=n.nodeType===1?n:n.parentNode;s.appendChild(i);const{hasTransform:o}=kd(i);return s.removeChild(i),o}const Zn=e=>{const n=e.props[\"onUpdate:modelValue\"]||!1;return se(n)?t=>Ii(n,t):n};function hv(e){e.target.composing=!0}function xc(e){const n=e.target;n.composing&&(n.composing=!1,n.dispatchEvent(new Event(\"input\")))}const tn=Symbol(\"_assign\"),ks={created(e,{modifiers:{lazy:n,trim:t,number:i}},r){e[tn]=Zn(r);const s=i||r.props&&r.props.type===\"number\";Cn(e,n?\"change\":\"input\",o=>{if(o.target.composing)return;let a=e.value;t&&(a=a.trim()),s&&(a=Es(a)),e[tn](a)}),t&&Cn(e,\"change\",()=>{e.value=e.value.trim()}),n||(Cn(e,\"compositionstart\",hv),Cn(e,\"compositionend\",xc),Cn(e,\"change\",xc))},mounted(e,{value:n}){e.value=n??\"\"},beforeUpdate(e,{value:n,oldValue:t,modifiers:{lazy:i,trim:r,number:s}},o){if(e[tn]=Zn(o),e.composing)return;const a=(s||e.type===\"number\")&&!/^0\\d/.test(e.value)?Es(e.value):e.value,l=n??\"\";a!==l&&(document.activeElement===e&&e.type!==\"range\"&&(i&&n===t||r&&e.value.trim()===l)||(e.value=l))}},fl={deep:!0,created(e,n,t){e[tn]=Zn(t),Cn(e,\"change\",()=>{const i=e._modelValue,r=Ui(e),s=e.checked,o=e[tn];if(se(i)){const a=Js(i,r),l=a!==-1;if(s&&!l)o(i.concat(r));else if(!s&&l){const c=[...i];c.splice(a,1),o(c)}}else if(Ei(i)){const a=new Set(i);s?a.add(r):a.delete(r),o(a)}else o(Ud(e,s))})},mounted:Dc,beforeUpdate(e,n,t){e[tn]=Zn(t),Dc(e,n,t)}};function Dc(e,{value:n,oldValue:t},i){e._modelValue=n,se(n)?e.checked=Js(n,i.props.value)>-1:Ei(n)?e.checked=n.has(i.props.value):n!==t&&(e.checked=qn(n,Ud(e,!0)))}const dl={created(e,{value:n},t){e.checked=qn(n,t.props.value),e[tn]=Zn(t),Cn(e,\"change\",()=>{e[tn](Ui(e))})},beforeUpdate(e,{value:n,oldValue:t},i){e[tn]=Zn(i),n!==t&&(e.checked=qn(n,i.props.value))}},Hd={deep:!0,created(e,{value:n,modifiers:{number:t}},i){const r=Ei(n);Cn(e,\"change\",()=>{const s=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>t?Es(Ui(o)):Ui(o));e[tn](e.multiple?r?new Set(s):s:s[0]),e._assigning=!0,It(()=>{e._assigning=!1})}),e[tn]=Zn(i)},mounted(e,{value:n,modifiers:{number:t}}){Mc(e,n)},beforeUpdate(e,n,t){e[tn]=Zn(t)},updated(e,{value:n,modifiers:{number:t}}){e._assigning||Mc(e,n)}};function Mc(e,n,t){const i=e.multiple,r=se(n);if(!(i&&!r&&!Ei(n))){for(let s=0,o=e.options.length;s<o;s++){const a=e.options[s],l=Ui(a);if(i)if(r){const c=typeof l;c===\"string\"||c===\"number\"?a.selected=n.some(u=>String(u)===String(l)):a.selected=Js(n,l)>-1}else a.selected=n.has(l);else if(qn(Ui(a),n)){e.selectedIndex!==s&&(e.selectedIndex=s);return}}!i&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Ui(e){return\"_value\"in e?e._value:e.value}function Ud(e,n){const t=n?\"_trueValue\":\"_falseValue\";return t in e?e[t]:n}const qd={created(e,n,t){Xr(e,n,t,null,\"created\")},mounted(e,n,t){Xr(e,n,t,null,\"mounted\")},beforeUpdate(e,n,t,i){Xr(e,n,t,i,\"beforeUpdate\")},updated(e,n,t,i){Xr(e,n,t,i,\"updated\")}};function zd(e,n){switch(e){case\"SELECT\":return Hd;case\"TEXTAREA\":return ks;default:switch(n){case\"checkbox\":return fl;case\"radio\":return dl;default:return ks}}}function Xr(e,n,t,i,r){const o=zd(e.tagName,t.props&&t.props.type)[r];o&&o(e,n,t,i)}function pv(){ks.getSSRProps=({value:e})=>({value:e}),dl.getSSRProps=({value:e},n)=>{if(n.props&&qn(n.props.value,e))return{checked:!0}},fl.getSSRProps=({value:e},n)=>{if(se(e)){if(n.props&&Js(e,n.props.value)>-1)return{checked:!0}}else if(Ei(e)){if(n.props&&e.has(n.props.value))return{checked:!0}}else if(e)return{checked:!0}},qd.getSSRProps=(e,n)=>{if(typeof n.type!=\"string\")return;const t=zd(n.type.toUpperCase(),n.props&&n.props.type);if(t.getSSRProps)return t.getSSRProps(e,n)}}const mv=[\"ctrl\",\"shift\",\"alt\",\"meta\"],gv={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>\"button\"in e&&e.button!==0,middle:e=>\"button\"in e&&e.button!==1,right:e=>\"button\"in e&&e.button!==2,exact:(e,n)=>mv.some(t=>e[`${t}Key`]&&!n.includes(t))},yv=(e,n)=>{const t=e._withMods||(e._withMods={}),i=n.join(\".\");return t[i]||(t[i]=(r,...s)=>{for(let o=0;o<n.length;o++){const a=gv[n[o]];if(a&&a(r,n))return}return e(r,...s)})},vv={esc:\"escape\",space:\" \",up:\"arrow-up\",left:\"arrow-left\",right:\"arrow-right\",down:\"arrow-down\",delete:\"backspace\"},bv=(e,n)=>{const t=e._withKeys||(e._withKeys={}),i=n.join(\".\");return t[i]||(t[i]=r=>{if(!(\"key\"in r))return;const s=Pt(r.key);if(n.some(o=>o===s||vv[o]===s))return e(r)})},Kd=Ne({patchProp:nv},Vy);let cr,Nc=!1;function Wd(){return cr||(cr=id(Kd))}function Yd(){return cr=Nc?cr:rd(Kd),Nc=!0,cr}const ga=(...e)=>{Wd().render(...e)},Zd=(...e)=>{Yd().hydrate(...e)},Gd=(...e)=>{const n=Wd().createApp(...e),{mount:t}=n;return n.mount=i=>{const r=Xd(i);if(!r)return;const s=n._component;!fe(s)&&!s.render&&!s.template&&(s.template=r.innerHTML),r.innerHTML=\"\";const o=t(r,!1,Jd(r));return r instanceof Element&&(r.removeAttribute(\"v-cloak\"),r.setAttribute(\"data-v-app\",\"\")),o},n},_v=(...e)=>{const n=Yd().createApp(...e),{mount:t}=n;return n.mount=i=>{const r=Xd(i);if(r)return t(r,!0,Jd(r))},n};function Jd(e){if(e instanceof SVGElement)return\"svg\";if(typeof MathMLElement==\"function\"&&e instanceof MathMLElement)return\"mathml\"}function Xd(e){return be(e)?document.querySelector(e):e}let Ic=!1;const Ev=()=>{Ic||(Ic=!0,pv(),Uy())},Sv=Object.freeze(Object.defineProperty({__proto__:null,BaseTransition:Mf,BaseTransitionPropsValidators:Qa,Comment:ft,DeprecationTypes:Py,EffectScope:Ha,ErrorCodes:Gm,ErrorTypeStrings:xy,Fragment:mt,KeepAlive:cg,ReactiveEffect:$i,Static:di,Suspense:ly,Teleport:Zg,Text:Hn,TrackOpTypes:Wm,Transition:ul,TransitionGroup:lv,TriggerOpTypes:Ym,VueElement:ho,assertNumber:Zm,callWithAsyncErrorHandling:zt,callWithErrorHandling:An,camelize:Ke,capitalize:Si,cloneVNode:yn,compatUtils:Ry,computed:Me,createApp:Gd,createBlock:ol,createCommentVNode:vy,createElementBlock:py,createElementVNode:al,createHydrationRenderer:rd,createPropsRestProxy:Mg,createRenderer:id,createSSRApp:_v,createSlots:mg,createStaticVNode:yy,createTextVNode:ll,createVNode:Be,customRef:wf,defineAsyncComponent:ag,defineComponent:Zi,defineCustomElement:Vd,defineEmits:_g,defineExpose:Eg,defineModel:Cg,defineOptions:Sg,defineProps:bg,defineSSRCustomElement:rv,defineSlots:wg,devtools:Dy,effect:ym,effectScope:pm,getCurrentInstance:Yt,getCurrentScope:rf,getTransitionRawChildren:ro,guardReactiveProps:Ed,h:Bi,handleError:wi,hasInjectionContext:$g,hydrate:Zd,initCustomFormatter:Ty,initDirectivesForSSR:Ev,inject:fi,isMemoSame:Dd,isProxy:Ka,isReactive:ci,isReadonly:Kn,isRef:Xe,isRuntimeOnly:Sy,isShallow:pi,isVNode:Yn,markRaw:bf,mergeDefaults:xg,mergeModels:Dg,mergeProps:Sd,nextTick:It,normalizeClass:xr,normalizeProps:nm,normalizeStyle:Or,onActivated:If,onBeforeMount:Pf,onBeforeUnmount:Mr,onBeforeUpdate:Ff,onDeactivated:kf,onErrorCaptured:jf,onMounted:Ci,onRenderTracked:$f,onRenderTriggered:Vf,onScopeDispose:mm,onServerPrefetch:Lf,onUnmounted:ao,onUpdated:oo,openBlock:fo,popScopeId:ig,provide:co,proxyRefs:Za,pushScopeId:ng,queuePostFlushCb:Cs,reactive:zn,readonly:eo,ref:bt,registerRuntimeCompiler:Ad,render:ga,renderList:pg,renderSlot:gg,resolveComponent:dg,resolveDirective:hg,resolveDynamicComponent:lo,resolveFilter:ky,resolveTransitionHooks:ji,setBlockTracking:la,setDevtoolsHook:My,setTransitionHooks:Wn,shallowReactive:vf,shallowReadonly:Vm,shallowRef:Ef,ssrContextKey:ld,ssrUtils:Iy,stop:vm,toDisplayString:ef,toHandlerKey:Ni,toHandlers:yg,toRaw:xe,toRef:Vn,toRefs:qm,toValue:Ce,transformVNodeArgs:my,triggerRef:Bm,unref:Ve,useAttrs:Og,useCssModule:ov,useCssVars:qy,useModel:ty,useSSRContext:cd,useSlots:Ag,useTransitionState:Xa,vModelCheckbox:fl,vModelDynamic:qd,vModelRadio:dl,vModelSelect:Hd,vModelText:ks,vShow:Fd,version:Md,warn:Oy,watch:en,watchEffect:ud,watchPostEffect:fd,watchSyncEffect:dd,withAsyncContext:Ng,withCtx:Ja,withDefaults:Tg,withDirectives:sg,withKeys:bv,withMemo:Ay,withModifiers:yv,withScopeId:rg},Symbol.toStringTag,{value:\"Module\"}));/**\n* @vue/compiler-core v3.4.34\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/const vr=Symbol(\"\"),ur=Symbol(\"\"),hl=Symbol(\"\"),Rs=Symbol(\"\"),Qd=Symbol(\"\"),yi=Symbol(\"\"),eh=Symbol(\"\"),th=Symbol(\"\"),pl=Symbol(\"\"),ml=Symbol(\"\"),Rr=Symbol(\"\"),gl=Symbol(\"\"),nh=Symbol(\"\"),yl=Symbol(\"\"),vl=Symbol(\"\"),bl=Symbol(\"\"),_l=Symbol(\"\"),El=Symbol(\"\"),Sl=Symbol(\"\"),ih=Symbol(\"\"),rh=Symbol(\"\"),po=Symbol(\"\"),Ps=Symbol(\"\"),wl=Symbol(\"\"),Cl=Symbol(\"\"),br=Symbol(\"\"),Pr=Symbol(\"\"),Tl=Symbol(\"\"),ya=Symbol(\"\"),wv=Symbol(\"\"),va=Symbol(\"\"),Fs=Symbol(\"\"),Cv=Symbol(\"\"),Tv=Symbol(\"\"),Al=Symbol(\"\"),Av=Symbol(\"\"),Ov=Symbol(\"\"),Ol=Symbol(\"\"),sh=Symbol(\"\"),qi={[vr]:\"Fragment\",[ur]:\"Teleport\",[hl]:\"Suspense\",[Rs]:\"KeepAlive\",[Qd]:\"BaseTransition\",[yi]:\"openBlock\",[eh]:\"createBlock\",[th]:\"createElementBlock\",[pl]:\"createVNode\",[ml]:\"createElementVNode\",[Rr]:\"createCommentVNode\",[gl]:\"createTextVNode\",[nh]:\"createStaticVNode\",[yl]:\"resolveComponent\",[vl]:\"resolveDynamicComponent\",[bl]:\"resolveDirective\",[_l]:\"resolveFilter\",[El]:\"withDirectives\",[Sl]:\"renderList\",[ih]:\"renderSlot\",[rh]:\"createSlots\",[po]:\"toDisplayString\",[Ps]:\"mergeProps\",[wl]:\"normalizeClass\",[Cl]:\"normalizeStyle\",[br]:\"normalizeProps\",[Pr]:\"guardReactiveProps\",[Tl]:\"toHandlers\",[ya]:\"camelize\",[wv]:\"capitalize\",[va]:\"toHandlerKey\",[Fs]:\"setBlockTracking\",[Cv]:\"pushScopeId\",[Tv]:\"popScopeId\",[Al]:\"withCtx\",[Av]:\"unref\",[Ov]:\"isRef\",[Ol]:\"withMemo\",[sh]:\"isMemoSame\"};function xv(e){Object.getOwnPropertySymbols(e).forEach(n=>{qi[n]=e[n]})}const Zt={start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0},source:\"\"};function Dv(e,n=\"\"){return{type:0,source:n,children:e,helpers:new Set,components:[],directives:[],hoists:[],imports:[],cached:0,temps:0,codegenNode:void 0,loc:Zt}}function _r(e,n,t,i,r,s,o,a=!1,l=!1,c=!1,u=Zt){return e&&(a?(e.helper(yi),e.helper(Wi(e.inSSR,c))):e.helper(Ki(e.inSSR,c)),o&&e.helper(El)),{type:13,tag:n,props:t,children:i,patchFlag:r,dynamicProps:s,directives:o,isBlock:a,disableTracking:l,isComponent:c,loc:u}}function Fr(e,n=Zt){return{type:17,loc:n,elements:e}}function Xt(e,n=Zt){return{type:15,loc:n,properties:e}}function Je(e,n){return{type:16,loc:Zt,key:be(e)?Ee(e,!0):e,value:n}}function Ee(e,n=!1,t=Zt,i=0){return{type:4,loc:t,content:e,isStatic:n,constType:n?3:i}}function cn(e,n=Zt){return{type:8,loc:n,children:e}}function rt(e,n=[],t=Zt){return{type:14,loc:t,callee:e,arguments:n}}function zi(e,n=void 0,t=!1,i=!1,r=Zt){return{type:18,params:e,returns:n,newline:t,isSlot:i,loc:r}}function ba(e,n,t,i=!0){return{type:19,test:e,consequent:n,alternate:t,newline:i,loc:Zt}}function Mv(e,n,t=!1){return{type:20,index:e,value:n,isVOnce:t,loc:Zt}}function Nv(e){return{type:21,body:e,loc:Zt}}function Ki(e,n){return e||n?pl:ml}function Wi(e,n){return e||n?eh:th}function xl(e,{helper:n,removeHelper:t,inSSR:i}){e.isBlock||(e.isBlock=!0,t(Ki(i,e.isComponent)),n(yi),n(Wi(i,e.isComponent)))}const kc=new Uint8Array([123,123]),Rc=new Uint8Array([125,125]);function Pc(e){return e>=97&&e<=122||e>=65&&e<=90}function qt(e){return e===32||e===10||e===9||e===12||e===13}function Nn(e){return e===47||e===62||qt(e)}function Ls(e){const n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t);return n}const gt={Cdata:new Uint8Array([67,68,65,84,65,91]),CdataEnd:new Uint8Array([93,93,62]),CommentEnd:new Uint8Array([45,45,62]),ScriptEnd:new Uint8Array([60,47,115,99,114,105,112,116]),StyleEnd:new Uint8Array([60,47,115,116,121,108,101]),TitleEnd:new Uint8Array([60,47,116,105,116,108,101]),TextareaEnd:new Uint8Array([60,47,116,101,120,116,97,114,101,97])};class Iv{constructor(n,t){this.stack=n,this.cbs=t,this.state=1,this.buffer=\"\",this.sectionStart=0,this.index=0,this.entityStart=0,this.baseState=1,this.inRCDATA=!1,this.inXML=!1,this.inVPre=!1,this.newlines=[],this.mode=0,this.delimiterOpen=kc,this.delimiterClose=Rc,this.delimiterIndex=-1,this.currentSequence=void 0,this.sequenceIndex=0}get inSFCRoot(){return this.mode===2&&this.stack.length===0}reset(){this.state=1,this.mode=0,this.buffer=\"\",this.sectionStart=0,this.index=0,this.baseState=1,this.inRCDATA=!1,this.currentSequence=void 0,this.newlines.length=0,this.delimiterOpen=kc,this.delimiterClose=Rc}getPos(n){let t=1,i=n+1;for(let r=this.newlines.length-1;r>=0;r--){const s=this.newlines[r];if(n>s){t=r+2,i=n-s;break}}return{column:i,line:t,offset:n}}peek(){return this.buffer.charCodeAt(this.index+1)}stateText(n){n===60?(this.index>this.sectionStart&&this.cbs.ontext(this.sectionStart,this.index),this.state=5,this.sectionStart=this.index):!this.inVPre&&n===this.delimiterOpen[0]&&(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(n))}stateInterpolationOpen(n){if(n===this.delimiterOpen[this.delimiterIndex])if(this.delimiterIndex===this.delimiterOpen.length-1){const t=this.index+1-this.delimiterOpen.length;t>this.sectionStart&&this.cbs.ontext(this.sectionStart,t),this.state=3,this.sectionStart=t}else this.delimiterIndex++;else this.inRCDATA?(this.state=32,this.stateInRCDATA(n)):(this.state=1,this.stateText(n))}stateInterpolation(n){n===this.delimiterClose[0]&&(this.state=4,this.delimiterIndex=0,this.stateInterpolationClose(n))}stateInterpolationClose(n){n===this.delimiterClose[this.delimiterIndex]?this.delimiterIndex===this.delimiterClose.length-1?(this.cbs.oninterpolation(this.sectionStart,this.index+1),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):this.delimiterIndex++:(this.state=3,this.stateInterpolation(n))}stateSpecialStartSequence(n){const t=this.sequenceIndex===this.currentSequence.length;if(!(t?Nn(n):(n|32)===this.currentSequence[this.sequenceIndex]))this.inRCDATA=!1;else if(!t){this.sequenceIndex++;return}this.sequenceIndex=0,this.state=6,this.stateInTagName(n)}stateInRCDATA(n){if(this.sequenceIndex===this.currentSequence.length){if(n===62||qt(n)){const t=this.index-this.currentSequence.length;if(this.sectionStart<t){const i=this.index;this.index=t,this.cbs.ontext(this.sectionStart,t),this.index=i}this.sectionStart=t+2,this.stateInClosingTagName(n),this.inRCDATA=!1;return}this.sequenceIndex=0}(n|32)===this.currentSequence[this.sequenceIndex]?this.sequenceIndex+=1:this.sequenceIndex===0?this.currentSequence===gt.TitleEnd||this.currentSequence===gt.TextareaEnd&&!this.inSFCRoot?n===this.delimiterOpen[0]&&(this.state=2,this.delimiterIndex=0,this.stateInterpolationOpen(n)):this.fastForwardTo(60)&&(this.sequenceIndex=1):this.sequenceIndex=+(n===60)}stateCDATASequence(n){n===gt.Cdata[this.sequenceIndex]?++this.sequenceIndex===gt.Cdata.length&&(this.state=28,this.currentSequence=gt.CdataEnd,this.sequenceIndex=0,this.sectionStart=this.index+1):(this.sequenceIndex=0,this.state=23,this.stateInDeclaration(n))}fastForwardTo(n){for(;++this.index<this.buffer.length;){const t=this.buffer.charCodeAt(this.index);if(t===10&&this.newlines.push(this.index),t===n)return!0}return this.index=this.buffer.length-1,!1}stateInCommentLike(n){n===this.currentSequence[this.sequenceIndex]?++this.sequenceIndex===this.currentSequence.length&&(this.currentSequence===gt.CdataEnd?this.cbs.oncdata(this.sectionStart,this.index-2):this.cbs.oncomment(this.sectionStart,this.index-2),this.sequenceIndex=0,this.sectionStart=this.index+1,this.state=1):this.sequenceIndex===0?this.fastForwardTo(this.currentSequence[0])&&(this.sequenceIndex=1):n!==this.currentSequence[this.sequenceIndex-1]&&(this.sequenceIndex=0)}startSpecial(n,t){this.enterRCDATA(n,t),this.state=31}enterRCDATA(n,t){this.inRCDATA=!0,this.currentSequence=n,this.sequenceIndex=t}stateBeforeTagName(n){n===33?(this.state=22,this.sectionStart=this.index+1):n===63?(this.state=24,this.sectionStart=this.index+1):Pc(n)?(this.sectionStart=this.index,this.mode===0?this.state=6:this.inSFCRoot?this.state=34:this.inXML?this.state=6:n===116?this.state=30:this.state=n===115?29:6):n===47?this.state=8:(this.state=1,this.stateText(n))}stateInTagName(n){Nn(n)&&this.handleTagName(n)}stateInSFCRootTagName(n){if(Nn(n)){const t=this.buffer.slice(this.sectionStart,this.index);t!==\"template\"&&this.enterRCDATA(Ls(\"</\"+t),0),this.handleTagName(n)}}handleTagName(n){this.cbs.onopentagname(this.sectionStart,this.index),this.sectionStart=-1,this.state=11,this.stateBeforeAttrName(n)}stateBeforeClosingTagName(n){qt(n)||(n===62?(this.state=1,this.sectionStart=this.index+1):(this.state=Pc(n)?9:27,this.sectionStart=this.index))}stateInClosingTagName(n){(n===62||qt(n))&&(this.cbs.onclosetag(this.sectionStart,this.index),this.sectionStart=-1,this.state=10,this.stateAfterClosingTagName(n))}stateAfterClosingTagName(n){n===62&&(this.state=1,this.sectionStart=this.index+1)}stateBeforeAttrName(n){n===62?(this.cbs.onopentagend(this.index),this.inRCDATA?this.state=32:this.state=1,this.sectionStart=this.index+1):n===47?this.state=7:n===60&&this.peek()===47?(this.cbs.onopentagend(this.index),this.state=5,this.sectionStart=this.index):qt(n)||this.handleAttrStart(n)}handleAttrStart(n){n===118&&this.peek()===45?(this.state=13,this.sectionStart=this.index):n===46||n===58||n===64||n===35?(this.cbs.ondirname(this.index,this.index+1),this.state=14,this.sectionStart=this.index+1):(this.state=12,this.sectionStart=this.index)}stateInSelfClosingTag(n){n===62?(this.cbs.onselfclosingtag(this.index),this.state=1,this.sectionStart=this.index+1,this.inRCDATA=!1):qt(n)||(this.state=11,this.stateBeforeAttrName(n))}stateInAttrName(n){(n===61||Nn(n))&&(this.cbs.onattribname(this.sectionStart,this.index),this.handleAttrNameEnd(n))}stateInDirName(n){n===61||Nn(n)?(this.cbs.ondirname(this.sectionStart,this.index),this.handleAttrNameEnd(n)):n===58?(this.cbs.ondirname(this.sectionStart,this.index),this.state=14,this.sectionStart=this.index+1):n===46&&(this.cbs.ondirname(this.sectionStart,this.index),this.state=16,this.sectionStart=this.index+1)}stateInDirArg(n){n===61||Nn(n)?(this.cbs.ondirarg(this.sectionStart,this.index),this.handleAttrNameEnd(n)):n===91?this.state=15:n===46&&(this.cbs.ondirarg(this.sectionStart,this.index),this.state=16,this.sectionStart=this.index+1)}stateInDynamicDirArg(n){n===93?this.state=14:(n===61||Nn(n))&&(this.cbs.ondirarg(this.sectionStart,this.index+1),this.handleAttrNameEnd(n))}stateInDirModifier(n){n===61||Nn(n)?(this.cbs.ondirmodifier(this.sectionStart,this.index),this.handleAttrNameEnd(n)):n===46&&(this.cbs.ondirmodifier(this.sectionStart,this.index),this.sectionStart=this.index+1)}handleAttrNameEnd(n){this.sectionStart=this.index,this.state=17,this.cbs.onattribnameend(this.index),this.stateAfterAttrName(n)}stateAfterAttrName(n){n===61?this.state=18:n===47||n===62?(this.cbs.onattribend(0,this.sectionStart),this.sectionStart=-1,this.state=11,this.stateBeforeAttrName(n)):qt(n)||(this.cbs.onattribend(0,this.sectionStart),this.handleAttrStart(n))}stateBeforeAttrValue(n){n===34?(this.state=19,this.sectionStart=this.index+1):n===39?(this.state=20,this.sectionStart=this.index+1):qt(n)||(this.sectionStart=this.index,this.state=21,this.stateInAttrValueNoQuotes(n))}handleInAttrValue(n,t){(n===t||this.fastForwardTo(t))&&(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=-1,this.cbs.onattribend(t===34?3:2,this.index+1),this.state=11)}stateInAttrValueDoubleQuotes(n){this.handleInAttrValue(n,34)}stateInAttrValueSingleQuotes(n){this.handleInAttrValue(n,39)}stateInAttrValueNoQuotes(n){qt(n)||n===62?(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=-1,this.cbs.onattribend(1,this.index),this.state=11,this.stateBeforeAttrName(n)):(n===39||n===60||n===61||n===96)&&this.cbs.onerr(18,this.index)}stateBeforeDeclaration(n){n===91?(this.state=26,this.sequenceIndex=0):this.state=n===45?25:23}stateInDeclaration(n){(n===62||this.fastForwardTo(62))&&(this.state=1,this.sectionStart=this.index+1)}stateInProcessingInstruction(n){(n===62||this.fastForwardTo(62))&&(this.cbs.onprocessinginstruction(this.sectionStart,this.index),this.state=1,this.sectionStart=this.index+1)}stateBeforeComment(n){n===45?(this.state=28,this.currentSequence=gt.CommentEnd,this.sequenceIndex=2,this.sectionStart=this.index+1):this.state=23}stateInSpecialComment(n){(n===62||this.fastForwardTo(62))&&(this.cbs.oncomment(this.sectionStart,this.index),this.state=1,this.sectionStart=this.index+1)}stateBeforeSpecialS(n){n===gt.ScriptEnd[3]?this.startSpecial(gt.ScriptEnd,4):n===gt.StyleEnd[3]?this.startSpecial(gt.StyleEnd,4):(this.state=6,this.stateInTagName(n))}stateBeforeSpecialT(n){n===gt.TitleEnd[3]?this.startSpecial(gt.TitleEnd,4):n===gt.TextareaEnd[3]?this.startSpecial(gt.TextareaEnd,4):(this.state=6,this.stateInTagName(n))}startEntity(){}stateInEntity(){}parse(n){for(this.buffer=n;this.index<this.buffer.length;){const t=this.buffer.charCodeAt(this.index);switch(t===10&&this.newlines.push(this.index),this.state){case 1:{this.stateText(t);break}case 2:{this.stateInterpolationOpen(t);break}case 3:{this.stateInterpolation(t);break}case 4:{this.stateInterpolationClose(t);break}case 31:{this.stateSpecialStartSequence(t);break}case 32:{this.stateInRCDATA(t);break}case 26:{this.stateCDATASequence(t);break}case 19:{this.stateInAttrValueDoubleQuotes(t);break}case 12:{this.stateInAttrName(t);break}case 13:{this.stateInDirName(t);break}case 14:{this.stateInDirArg(t);break}case 15:{this.stateInDynamicDirArg(t);break}case 16:{this.stateInDirModifier(t);break}case 28:{this.stateInCommentLike(t);break}case 27:{this.stateInSpecialComment(t);break}case 11:{this.stateBeforeAttrName(t);break}case 6:{this.stateInTagName(t);break}case 34:{this.stateInSFCRootTagName(t);break}case 9:{this.stateInClosingTagName(t);break}case 5:{this.stateBeforeTagName(t);break}case 17:{this.stateAfterAttrName(t);break}case 20:{this.stateInAttrValueSingleQuotes(t);break}case 18:{this.stateBeforeAttrValue(t);break}case 8:{this.stateBeforeClosingTagName(t);break}case 10:{this.stateAfterClosingTagName(t);break}case 29:{this.stateBeforeSpecialS(t);break}case 30:{this.stateBeforeSpecialT(t);break}case 21:{this.stateInAttrValueNoQuotes(t);break}case 7:{this.stateInSelfClosingTag(t);break}case 23:{this.stateInDeclaration(t);break}case 22:{this.stateBeforeDeclaration(t);break}case 25:{this.stateBeforeComment(t);break}case 24:{this.stateInProcessingInstruction(t);break}case 33:{this.stateInEntity();break}}this.index++}this.cleanup(),this.finish()}cleanup(){this.sectionStart!==this.index&&(this.state===1||this.state===32&&this.sequenceIndex===0?(this.cbs.ontext(this.sectionStart,this.index),this.sectionStart=this.index):(this.state===19||this.state===20||this.state===21)&&(this.cbs.onattribdata(this.sectionStart,this.index),this.sectionStart=this.index))}finish(){this.handleTrailingData(),this.cbs.onend()}handleTrailingData(){const n=this.buffer.length;this.sectionStart>=n||(this.state===28?this.currentSequence===gt.CdataEnd?this.cbs.oncdata(this.sectionStart,n):this.cbs.oncomment(this.sectionStart,n):this.state===6||this.state===11||this.state===18||this.state===17||this.state===12||this.state===13||this.state===14||this.state===15||this.state===16||this.state===20||this.state===19||this.state===21||this.state===9||this.cbs.ontext(this.sectionStart,n))}emitCodePoint(n,t){}}function Fc(e,{compatConfig:n}){const t=n&&n[e];return e===\"MODE\"?t||3:t}function hi(e,n){const t=Fc(\"MODE\",n),i=Fc(e,n);return t===3?i===!0:i!==!1}function Er(e,n,t,...i){return hi(e,n)}function Dl(e){throw e}function oh(e){}function ze(e,n,t,i){const r=`https://vuejs.org/error-reference/#compiler-${e}`,s=new SyntaxError(String(r));return s.code=e,s.loc=n,s}const Lt=e=>e.type===4&&e.isStatic;function ah(e){switch(e){case\"Teleport\":case\"teleport\":return ur;case\"Suspense\":case\"suspense\":return hl;case\"KeepAlive\":case\"keep-alive\":return Rs;case\"BaseTransition\":case\"base-transition\":return Qd}}const kv=/^\\d|[^\\$\\w\\xA0-\\uFFFF]/,Ml=e=>!kv.test(e),Rv=/[A-Za-z_$\\xA0-\\uFFFF]/,Pv=/[\\.\\?\\w$\\xA0-\\uFFFF]/,Fv=/\\s+[.[]\\s*|\\s*[.[]\\s+/g,Lv=e=>{e=e.trim().replace(Fv,o=>o.trim());let n=0,t=[],i=0,r=0,s=null;for(let o=0;o<e.length;o++){const a=e.charAt(o);switch(n){case 0:if(a===\"[\")t.push(n),n=1,i++;else if(a===\"(\")t.push(n),n=2,r++;else if(!(o===0?Rv:Pv).test(a))return!1;break;case 1:a===\"'\"||a==='\"'||a===\"`\"?(t.push(n),n=3,s=a):a===\"[\"?i++:a===\"]\"&&(--i||(n=t.pop()));break;case 2:if(a===\"'\"||a==='\"'||a===\"`\")t.push(n),n=3,s=a;else if(a===\"(\")r++;else if(a===\")\"){if(o===e.length-1)return!1;--r||(n=t.pop())}break;case 3:a===s&&(n=t.pop(),s=null);break}}return!i&&!r},lh=Lv;function on(e,n,t=!1){for(let i=0;i<e.props.length;i++){const r=e.props[i];if(r.type===7&&(t||r.exp)&&(be(n)?r.name===n:n.test(r.name)))return r}}function mo(e,n,t=!1,i=!1){for(let r=0;r<e.props.length;r++){const s=e.props[r];if(s.type===6){if(t)continue;if(s.name===n&&(s.value||i))return s}else if(s.name===\"bind\"&&(s.exp||i)&&ri(s.arg,n))return s}}function ri(e,n){return!!(e&&Lt(e)&&e.content===n)}function Vv(e){return e.props.some(n=>n.type===7&&n.name===\"bind\"&&(!n.arg||n.arg.type!==4||!n.arg.isStatic))}function Lo(e){return e.type===5||e.type===2}function $v(e){return e.type===7&&e.name===\"slot\"}function Vs(e){return e.type===1&&e.tagType===3}function $s(e){return e.type===1&&e.tagType===2}const jv=new Set([br,Pr]);function ch(e,n=[]){if(e&&!be(e)&&e.type===14){const t=e.callee;if(!be(t)&&jv.has(t))return ch(e.arguments[0],n.concat(e))}return[e,n]}function js(e,n,t){let i,r=e.type===13?e.props:e.arguments[2],s=[],o;if(r&&!be(r)&&r.type===14){const a=ch(r);r=a[0],s=a[1],o=s[s.length-1]}if(r==null||be(r))i=Xt([n]);else if(r.type===14){const a=r.arguments[0];!be(a)&&a.type===15?Lc(n,a)||a.properties.unshift(n):r.callee===Tl?i=rt(t.helper(Ps),[Xt([n]),r]):r.arguments.unshift(Xt([n])),!i&&(i=r)}else r.type===15?(Lc(n,r)||r.properties.unshift(n),i=r):(i=rt(t.helper(Ps),[Xt([n]),r]),o&&o.callee===Pr&&(o=s[s.length-2]));e.type===13?o?o.arguments[0]=i:e.props=i:o?o.arguments[0]=i:e.arguments[2]=i}function Lc(e,n){let t=!1;if(e.key.type===4){const i=e.key.content;t=n.properties.some(r=>r.key.type===4&&r.key.content===i)}return t}function Sr(e,n){return`_${n}_${e.replace(/[^\\w]/g,(t,i)=>t===\"-\"?\"_\":e.charCodeAt(i).toString())}`}function Bv(e){return e.type===14&&e.callee===Ol?e.arguments[1].returns:e}const Hv=/([\\s\\S]*?)\\s+(?:in|of)\\s+(\\S[\\s\\S]*)/,uh={parseMode:\"base\",ns:0,delimiters:[\"{{\",\"}}\"],getNamespace:()=>0,isVoidTag:us,isPreTag:us,isCustomElement:us,onError:Dl,onWarn:oh,comments:!1,prefixIdentifiers:!1};let Re=uh,wr=null,On=\"\",yt=null,Ae=null,Mt=\"\",_n=-1,ti=-1,Bs=0,Ln=!1,_a=null;const qe=[],Ze=new Iv(qe,{onerr:vn,ontext(e,n){Qr(pt(e,n),e,n)},ontextentity(e,n,t){Qr(e,n,t)},oninterpolation(e,n){if(Ln)return Qr(pt(e,n),e,n);let t=e+Ze.delimiterOpen.length,i=n-Ze.delimiterClose.length;for(;qt(On.charCodeAt(t));)t++;for(;qt(On.charCodeAt(i-1));)i--;let r=pt(t,i);r.includes(\"&\")&&(r=Re.decodeEntities(r,!1)),Ea({type:5,content:ms(r,!1,it(t,i)),loc:it(e,n)})},onopentagname(e,n){const t=pt(e,n);yt={type:1,tag:t,ns:Re.getNamespace(t,qe[0],Re.ns),tagType:0,props:[],children:[],loc:it(e-1,n),codegenNode:void 0}},onopentagend(e){$c(e)},onclosetag(e,n){const t=pt(e,n);if(!Re.isVoidTag(t)){let i=!1;for(let r=0;r<qe.length;r++)if(qe[r].tag.toLowerCase()===t.toLowerCase()){i=!0,r>0&&vn(24,qe[0].loc.start.offset);for(let o=0;o<=r;o++){const a=qe.shift();ps(a,n,o<r)}break}i||vn(23,fh(e,60))}},onselfclosingtag(e){const n=yt.tag;yt.isSelfClosing=!0,$c(e),qe[0]&&qe[0].tag===n&&ps(qe.shift(),e)},onattribname(e,n){Ae={type:6,name:pt(e,n),nameLoc:it(e,n),value:void 0,loc:it(e)}},ondirname(e,n){const t=pt(e,n),i=t===\".\"||t===\":\"?\"bind\":t===\"@\"?\"on\":t===\"#\"?\"slot\":t.slice(2);if(!Ln&&i===\"\"&&vn(26,e),Ln||i===\"\")Ae={type:6,name:t,nameLoc:it(e,n),value:void 0,loc:it(e)};else if(Ae={type:7,name:i,rawName:t,exp:void 0,arg:void 0,modifiers:t===\".\"?[\"prop\"]:[],loc:it(e)},i===\"pre\"){Ln=Ze.inVPre=!0,_a=yt;const r=yt.props;for(let s=0;s<r.length;s++)r[s].type===7&&(r[s]=Xv(r[s]))}},ondirarg(e,n){if(e===n)return;const t=pt(e,n);if(Ln)Ae.name+=t,si(Ae.nameLoc,n);else{const i=t[0]!==\"[\";Ae.arg=ms(i?t:t.slice(1,-1),i,it(e,n),i?3:0)}},ondirmodifier(e,n){const t=pt(e,n);if(Ln)Ae.name+=\".\"+t,si(Ae.nameLoc,n);else if(Ae.name===\"slot\"){const i=Ae.arg;i&&(i.content+=\".\"+t,si(i.loc,n))}else Ae.modifiers.push(t)},onattribdata(e,n){Mt+=pt(e,n),_n<0&&(_n=e),ti=n},onattribentity(e,n,t){Mt+=e,_n<0&&(_n=n),ti=t},onattribnameend(e){const n=Ae.loc.start.offset,t=pt(n,e);Ae.type===7&&(Ae.rawName=t),yt.props.some(i=>(i.type===7?i.rawName:i.name)===t)&&vn(2,n)},onattribend(e,n){if(yt&&Ae){if(si(Ae.loc,n),e!==0)if(Mt.includes(\"&\")&&(Mt=Re.decodeEntities(Mt,!0)),Ae.type===6)Ae.name===\"class\"&&(Mt=hh(Mt).trim()),e===1&&!Mt&&vn(13,n),Ae.value={type:2,content:Mt,loc:e===1?it(_n,ti):it(_n-1,ti+1)},Ze.inSFCRoot&&yt.tag===\"template\"&&Ae.name===\"lang\"&&Mt&&Mt!==\"html\"&&Ze.enterRCDATA(Ls(\"</template\"),0);else{let t=0;Ae.exp=ms(Mt,!1,it(_n,ti),0,t),Ae.name===\"for\"&&(Ae.forParseResult=qv(Ae.exp));let i=-1;Ae.name===\"bind\"&&(i=Ae.modifiers.indexOf(\"sync\"))>-1&&Er(\"COMPILER_V_BIND_SYNC\",Re,Ae.loc,Ae.rawName)&&(Ae.name=\"model\",Ae.modifiers.splice(i,1))}(Ae.type!==7||Ae.name!==\"pre\")&&yt.props.push(Ae)}Mt=\"\",_n=ti=-1},oncomment(e,n){Re.comments&&Ea({type:3,content:pt(e,n),loc:it(e-4,n+3)})},onend(){const e=On.length;for(let n=0;n<qe.length;n++)ps(qe[n],e-1),vn(24,qe[n].loc.start.offset)},oncdata(e,n){qe[0].ns!==0?Qr(pt(e,n),e,n):vn(1,e-9)},onprocessinginstruction(e){(qe[0]?qe[0].ns:Re.ns)===0&&vn(21,e-1)}}),Vc=/,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/,Uv=/^\\(|\\)$/g;function qv(e){const n=e.loc,t=e.content,i=t.match(Hv);if(!i)return;const[,r,s]=i,o=(f,p,m=!1)=>{const g=n.start.offset+p,b=g+f.length;return ms(f,!1,it(g,b),0,m?1:0)},a={source:o(s.trim(),t.indexOf(s,r.length)),value:void 0,key:void 0,index:void 0,finalized:!1};let l=r.trim().replace(Uv,\"\").trim();const c=r.indexOf(l),u=l.match(Vc);if(u){l=l.replace(Vc,\"\").trim();const f=u[1].trim();let p;if(f&&(p=t.indexOf(f,c+l.length),a.key=o(f,p,!0)),u[2]){const m=u[2].trim();m&&(a.index=o(m,t.indexOf(m,a.key?p+f.length:c+l.length),!0))}}return l&&(a.value=o(l,c,!0)),a}function pt(e,n){return On.slice(e,n)}function $c(e){Ze.inSFCRoot&&(yt.innerLoc=it(e+1,e+1)),Ea(yt);const{tag:n,ns:t}=yt;t===0&&Re.isPreTag(n)&&Bs++,Re.isVoidTag(n)?ps(yt,e):(qe.unshift(yt),(t===1||t===2)&&(Ze.inXML=!0)),yt=null}function Qr(e,n,t){{const s=qe[0]&&qe[0].tag;s!==\"script\"&&s!==\"style\"&&e.includes(\"&\")&&(e=Re.decodeEntities(e,!1))}const i=qe[0]||wr,r=i.children[i.children.length-1];r&&r.type===2?(r.content+=e,si(r.loc,t)):i.children.push({type:2,content:e,loc:it(n,t)})}function ps(e,n,t=!1){t?si(e.loc,fh(n,60)):si(e.loc,zv(n,62)+1),Ze.inSFCRoot&&(e.children.length?e.innerLoc.end=Ne({},e.children[e.children.length-1].loc.end):e.innerLoc.end=Ne({},e.innerLoc.start),e.innerLoc.source=pt(e.innerLoc.start.offset,e.innerLoc.end.offset));const{tag:i,ns:r}=e;Ln||(i===\"slot\"?e.tagType=2:jc(e)?e.tagType=3:Wv(e)&&(e.tagType=1)),Ze.inRCDATA||(e.children=dh(e.children,e.tag)),r===0&&Re.isPreTag(i)&&Bs--,_a===e&&(Ln=Ze.inVPre=!1,_a=null),Ze.inXML&&(qe[0]?qe[0].ns:Re.ns)===0&&(Ze.inXML=!1);{const s=e.props;if(!Ze.inSFCRoot&&hi(\"COMPILER_NATIVE_TEMPLATE\",Re)&&e.tag===\"template\"&&!jc(e)){const a=qe[0]||wr,l=a.children.indexOf(e);a.children.splice(l,1,...e.children)}const o=s.find(a=>a.type===6&&a.name===\"inline-template\");o&&Er(\"COMPILER_INLINE_TEMPLATE\",Re,o.loc)&&e.children.length&&(o.value={type:2,content:pt(e.children[0].loc.start.offset,e.children[e.children.length-1].loc.end.offset),loc:o.loc})}}function zv(e,n){let t=e;for(;On.charCodeAt(t)!==n&&t<On.length-1;)t++;return t}function fh(e,n){let t=e;for(;On.charCodeAt(t)!==n&&t>=0;)t--;return t}const Kv=new Set([\"if\",\"else\",\"else-if\",\"for\",\"slot\"]);function jc({tag:e,props:n}){if(e===\"template\"){for(let t=0;t<n.length;t++)if(n[t].type===7&&Kv.has(n[t].name))return!0}return!1}function Wv({tag:e,props:n}){if(Re.isCustomElement(e))return!1;if(e===\"component\"||Yv(e.charCodeAt(0))||ah(e)||Re.isBuiltInComponent&&Re.isBuiltInComponent(e)||Re.isNativeTag&&!Re.isNativeTag(e))return!0;for(let t=0;t<n.length;t++){const i=n[t];if(i.type===6){if(i.name===\"is\"&&i.value){if(i.value.content.startsWith(\"vue:\"))return!0;if(Er(\"COMPILER_IS_ON_ELEMENT\",Re,i.loc))return!0}}else if(i.name===\"bind\"&&ri(i.arg,\"is\")&&Er(\"COMPILER_IS_ON_ELEMENT\",Re,i.loc))return!0}return!1}function Yv(e){return e>64&&e<91}const Zv=/\\r\\n/g;function dh(e,n){const t=Re.whitespace!==\"preserve\";let i=!1;for(let r=0;r<e.length;r++){const s=e[r];if(s.type===2)if(Bs)s.content=s.content.replace(Zv,`\n`);else if(Gv(s.content)){const o=e[r-1]&&e[r-1].type,a=e[r+1]&&e[r+1].type;!o||!a||t&&(o===3&&(a===3||a===1)||o===1&&(a===3||a===1&&Jv(s.content)))?(i=!0,e[r]=null):s.content=\" \"}else t&&(s.content=hh(s.content))}if(Bs&&n&&Re.isPreTag(n)){const r=e[0];r&&r.type===2&&(r.content=r.content.replace(/^\\r?\\n/,\"\"))}return i?e.filter(Boolean):e}function Gv(e){for(let n=0;n<e.length;n++)if(!qt(e.charCodeAt(n)))return!1;return!0}function Jv(e){for(let n=0;n<e.length;n++){const t=e.charCodeAt(n);if(t===10||t===13)return!0}return!1}function hh(e){let n=\"\",t=!1;for(let i=0;i<e.length;i++)qt(e.charCodeAt(i))?t||(n+=\" \",t=!0):(n+=e[i],t=!1);return n}function Ea(e){(qe[0]||wr).children.push(e)}function it(e,n){return{start:Ze.getPos(e),end:n==null?n:Ze.getPos(n),source:n==null?n:pt(e,n)}}function si(e,n){e.end=Ze.getPos(n),e.source=pt(e.start.offset,n)}function Xv(e){const n={type:6,name:e.rawName,nameLoc:it(e.loc.start.offset,e.loc.start.offset+e.rawName.length),value:void 0,loc:e.loc};if(e.exp){const t=e.exp.loc;t.end.offset<e.loc.end.offset&&(t.start.offset--,t.start.column--,t.end.offset++,t.end.column++),n.value={type:2,content:e.exp.content,loc:t}}return n}function ms(e,n=!1,t,i=0,r=0){return Ee(e,n,t,i)}function vn(e,n,t){Re.onError(ze(e,it(n,n)))}function Qv(){Ze.reset(),yt=null,Ae=null,Mt=\"\",_n=-1,ti=-1,qe.length=0}function e0(e,n){if(Qv(),On=e,Re=Ne({},uh),n){let r;for(r in n)n[r]!=null&&(Re[r]=n[r])}Ze.mode=Re.parseMode===\"html\"?1:Re.parseMode===\"sfc\"?2:0,Ze.inXML=Re.ns===1||Re.ns===2;const t=n&&n.delimiters;t&&(Ze.delimiterOpen=Ls(t[0]),Ze.delimiterClose=Ls(t[1]));const i=wr=Dv([],e);return Ze.parse(On),i.loc=it(0,e.length),i.children=dh(i.children),wr=null,i}function t0(e,n){gs(e,n,ph(e,e.children[0]))}function ph(e,n){const{children:t}=e;return t.length===1&&n.type===1&&!$s(n)}function gs(e,n,t=!1){const{children:i}=e,r=i.length;let s=0;for(let o=0;o<i.length;o++){const a=i[o];if(a.type===1&&a.tagType===0){const l=t?0:Qt(a,n);if(l>0){if(l>=2){a.codegenNode.patchFlag=-1,a.codegenNode=n.hoist(a.codegenNode),s++;continue}}else{const c=a.codegenNode;if(c.type===13){const u=c.patchFlag;if((u===void 0||u===512||u===1)&&gh(a,n)>=2){const f=yh(a);f&&(c.props=n.hoist(f))}c.dynamicProps&&(c.dynamicProps=n.hoist(c.dynamicProps))}}}if(a.type===1){const l=a.tagType===1;l&&n.scopes.vSlot++,gs(a,n),l&&n.scopes.vSlot--}else if(a.type===11)gs(a,n,a.children.length===1);else if(a.type===9)for(let l=0;l<a.branches.length;l++)gs(a.branches[l],n,a.branches[l].children.length===1)}if(s&&n.transformHoist&&n.transformHoist(i,n,e),s&&s===r&&e.type===1&&e.tagType===0&&e.codegenNode&&e.codegenNode.type===13&&se(e.codegenNode.children)){const o=n.hoist(Fr(e.codegenNode.children));n.hmr&&(o.content=`[...${o.content}]`),e.codegenNode.children=o}}function Qt(e,n){const{constantCache:t}=n;switch(e.type){case 1:if(e.tagType!==0)return 0;const i=t.get(e);if(i!==void 0)return i;const r=e.codegenNode;if(r.type!==13||r.isBlock&&e.tag!==\"svg\"&&e.tag!==\"foreignObject\"&&e.tag!==\"math\")return 0;if(r.patchFlag===void 0){let o=3;const a=gh(e,n);if(a===0)return t.set(e,0),0;a<o&&(o=a);for(let l=0;l<e.children.length;l++){const c=Qt(e.children[l],n);if(c===0)return t.set(e,0),0;c<o&&(o=c)}if(o>1)for(let l=0;l<e.props.length;l++){const c=e.props[l];if(c.type===7&&c.name===\"bind\"&&c.exp){const u=Qt(c.exp,n);if(u===0)return t.set(e,0),0;u<o&&(o=u)}}if(r.isBlock){for(let l=0;l<e.props.length;l++)if(e.props[l].type===7)return t.set(e,0),0;n.removeHelper(yi),n.removeHelper(Wi(n.inSSR,r.isComponent)),r.isBlock=!1,n.helper(Ki(n.inSSR,r.isComponent))}return t.set(e,o),o}else return t.set(e,0),0;case 2:case 3:return 3;case 9:case 11:case 10:return 0;case 5:case 12:return Qt(e.content,n);case 4:return e.constType;case 8:let s=3;for(let o=0;o<e.children.length;o++){const a=e.children[o];if(be(a)||Kt(a))continue;const l=Qt(a,n);if(l===0)return 0;l<s&&(s=l)}return s;default:return 0}}const n0=new Set([wl,Cl,br,Pr]);function mh(e,n){if(e.type===14&&!be(e.callee)&&n0.has(e.callee)){const t=e.arguments[0];if(t.type===4)return Qt(t,n);if(t.type===14)return mh(t,n)}return 0}function gh(e,n){let t=3;const i=yh(e);if(i&&i.type===15){const{properties:r}=i;for(let s=0;s<r.length;s++){const{key:o,value:a}=r[s],l=Qt(o,n);if(l===0)return l;l<t&&(t=l);let c;if(a.type===4?c=Qt(a,n):a.type===14?c=mh(a,n):c=0,c===0)return c;c<t&&(t=c)}}return t}function yh(e){const n=e.codegenNode;if(n.type===13)return n.props}function i0(e,{filename:n=\"\",prefixIdentifiers:t=!1,hoistStatic:i=!1,hmr:r=!1,cacheHandlers:s=!1,nodeTransforms:o=[],directiveTransforms:a={},transformHoist:l=null,isBuiltInComponent:c=tt,isCustomElement:u=tt,expressionPlugins:f=[],scopeId:p=null,slotted:m=!0,ssr:g=!1,inSSR:b=!1,ssrCssVars:M=\"\",bindingMetadata:P=Oe,inline:A=!1,isTS:v=!1,onError:C=Dl,onWarn:D=oh,compatConfig:O}){const L=n.replace(/\\?.*$/,\"\").match(/([^/\\\\]+)\\.\\w+$/),F={filename:n,selfName:L&&Si(Ke(L[1])),prefixIdentifiers:t,hoistStatic:i,hmr:r,cacheHandlers:s,nodeTransforms:o,directiveTransforms:a,transformHoist:l,isBuiltInComponent:c,isCustomElement:u,expressionPlugins:f,scopeId:p,slotted:m,ssr:g,inSSR:b,ssrCssVars:M,bindingMetadata:P,inline:A,isTS:v,onError:C,onWarn:D,compatConfig:O,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],constantCache:new WeakMap,temps:0,cached:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,grandParent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(T){const x=F.helpers.get(T)||0;return F.helpers.set(T,x+1),T},removeHelper(T){const x=F.helpers.get(T);if(x){const H=x-1;H?F.helpers.set(T,H):F.helpers.delete(T)}},helperString(T){return`_${qi[F.helper(T)]}`},replaceNode(T){F.parent.children[F.childIndex]=F.currentNode=T},removeNode(T){const x=F.parent.children,H=T?x.indexOf(T):F.currentNode?F.childIndex:-1;!T||T===F.currentNode?(F.currentNode=null,F.onNodeRemoved()):F.childIndex>H&&(F.childIndex--,F.onNodeRemoved()),F.parent.children.splice(H,1)},onNodeRemoved:tt,addIdentifiers(T){},removeIdentifiers(T){},hoist(T){be(T)&&(T=Ee(T)),F.hoists.push(T);const x=Ee(`_hoisted_${F.hoists.length}`,!1,T.loc,2);return x.hoisted=T,x},cache(T,x=!1){return Mv(F.cached++,T,x)}};return F.filters=new Set,F}function r0(e,n){const t=i0(e,n);go(e,t),n.hoistStatic&&t0(e,t),n.ssr||s0(e,t),e.helpers=new Set([...t.helpers.keys()]),e.components=[...t.components],e.directives=[...t.directives],e.imports=t.imports,e.hoists=t.hoists,e.temps=t.temps,e.cached=t.cached,e.transformed=!0,e.filters=[...t.filters]}function s0(e,n){const{helper:t}=n,{children:i}=e;if(i.length===1){const r=i[0];if(ph(e,r)&&r.codegenNode){const s=r.codegenNode;s.type===13&&xl(s,n),e.codegenNode=s}else e.codegenNode=r}else if(i.length>1){let r=64;e.codegenNode=_r(n,t(vr),void 0,e.children,r,void 0,void 0,!0,void 0,!1)}}function o0(e,n){let t=0;const i=()=>{t--};for(;t<e.children.length;t++){const r=e.children[t];be(r)||(n.grandParent=n.parent,n.parent=e,n.childIndex=t,n.onNodeRemoved=i,go(r,n))}}function go(e,n){n.currentNode=e;const{nodeTransforms:t}=n,i=[];for(let s=0;s<t.length;s++){const o=t[s](e,n);if(o&&(se(o)?i.push(...o):i.push(o)),n.currentNode)e=n.currentNode;else return}switch(e.type){case 3:n.ssr||n.helper(Rr);break;case 5:n.ssr||n.helper(po);break;case 9:for(let s=0;s<e.branches.length;s++)go(e.branches[s],n);break;case 10:case 11:case 1:case 0:o0(e,n);break}n.currentNode=e;let r=i.length;for(;r--;)i[r]()}function vh(e,n){const t=be(e)?i=>i===e:i=>e.test(i);return(i,r)=>{if(i.type===1){const{props:s}=i;if(i.tagType===3&&s.some($v))return;const o=[];for(let a=0;a<s.length;a++){const l=s[a];if(l.type===7&&t(l.name)){s.splice(a,1),a--;const c=n(i,l,r);c&&o.push(c)}}return o}}}const yo=\"/*#__PURE__*/\",bh=e=>`${qi[e]}: _${qi[e]}`;function a0(e,{mode:n=\"function\",prefixIdentifiers:t=n===\"module\",sourceMap:i=!1,filename:r=\"template.vue.html\",scopeId:s=null,optimizeImports:o=!1,runtimeGlobalName:a=\"Vue\",runtimeModuleName:l=\"vue\",ssrRuntimeModuleName:c=\"vue/server-renderer\",ssr:u=!1,isTS:f=!1,inSSR:p=!1}){const m={mode:n,prefixIdentifiers:t,sourceMap:i,filename:r,scopeId:s,optimizeImports:o,runtimeGlobalName:a,runtimeModuleName:l,ssrRuntimeModuleName:c,ssr:u,isTS:f,inSSR:p,source:e.source,code:\"\",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper(b){return`_${qi[b]}`},push(b,M=-2,P){m.code+=b},indent(){g(++m.indentLevel)},deindent(b=!1){b?--m.indentLevel:g(--m.indentLevel)},newline(){g(m.indentLevel)}};function g(b){m.push(`\n`+\"  \".repeat(b),0)}return m}function l0(e,n={}){const t=a0(e,n);n.onContextCreated&&n.onContextCreated(t);const{mode:i,push:r,prefixIdentifiers:s,indent:o,deindent:a,newline:l,scopeId:c,ssr:u}=t,f=Array.from(e.helpers),p=f.length>0,m=!s&&i!==\"module\";c0(e,t);const b=u?\"ssrRender\":\"render\",P=(u?[\"_ctx\",\"_push\",\"_parent\",\"_attrs\"]:[\"_ctx\",\"_cache\"]).join(\", \");if(r(`function ${b}(${P}) {`),o(),m&&(r(\"with (_ctx) {\"),o(),p&&(r(`const { ${f.map(bh).join(\", \")} } = _Vue\n`,-1),l())),e.components.length&&(Vo(e.components,\"component\",t),(e.directives.length||e.temps>0)&&l()),e.directives.length&&(Vo(e.directives,\"directive\",t),e.temps>0&&l()),e.filters&&e.filters.length&&(l(),Vo(e.filters,\"filter\",t),l()),e.temps>0){r(\"let \");for(let A=0;A<e.temps;A++)r(`${A>0?\", \":\"\"}_temp${A}`)}return(e.components.length||e.directives.length||e.temps)&&(r(`\n`,0),l()),u||r(\"return \"),e.codegenNode?St(e.codegenNode,t):r(\"null\"),m&&(a(),r(\"}\")),a(),r(\"}\"),{ast:e,code:t.code,preamble:\"\",map:t.map?t.map.toJSON():void 0}}function c0(e,n){const{ssr:t,prefixIdentifiers:i,push:r,newline:s,runtimeModuleName:o,runtimeGlobalName:a,ssrRuntimeModuleName:l}=n,c=a,u=Array.from(e.helpers);if(u.length>0&&(r(`const _Vue = ${c}\n`,-1),e.hoists.length)){const f=[pl,ml,Rr,gl,nh].filter(p=>u.includes(p)).map(bh).join(\", \");r(`const { ${f} } = _Vue\n`,-1)}u0(e.hoists,n),s(),r(\"return \")}function Vo(e,n,{helper:t,push:i,newline:r,isTS:s}){const o=t(n===\"filter\"?_l:n===\"component\"?yl:bl);for(let a=0;a<e.length;a++){let l=e[a];const c=l.endsWith(\"__self\");c&&(l=l.slice(0,-6)),i(`const ${Sr(l,n)} = ${o}(${JSON.stringify(l)}${c?\", true\":\"\"})${s?\"!\":\"\"}`),a<e.length-1&&r()}}function u0(e,n){if(!e.length)return;n.pure=!0;const{push:t,newline:i,helper:r,scopeId:s,mode:o}=n;i();for(let a=0;a<e.length;a++){const l=e[a];l&&(t(`const _hoisted_${a+1} = `),St(l,n),i())}n.pure=!1}function Nl(e,n){const t=e.length>3||!1;n.push(\"[\"),t&&n.indent(),Lr(e,n,t),t&&n.deindent(),n.push(\"]\")}function Lr(e,n,t=!1,i=!0){const{push:r,newline:s}=n;for(let o=0;o<e.length;o++){const a=e[o];be(a)?r(a,-3):se(a)?Nl(a,n):St(a,n),o<e.length-1&&(t?(i&&r(\",\"),s()):i&&r(\", \"))}}function St(e,n){if(be(e)){n.push(e,-3);return}if(Kt(e)){n.push(n.helper(e));return}switch(e.type){case 1:case 9:case 11:St(e.codegenNode,n);break;case 2:f0(e,n);break;case 4:_h(e,n);break;case 5:d0(e,n);break;case 12:St(e.codegenNode,n);break;case 8:Eh(e,n);break;case 3:p0(e,n);break;case 13:m0(e,n);break;case 14:y0(e,n);break;case 15:v0(e,n);break;case 17:b0(e,n);break;case 18:_0(e,n);break;case 19:E0(e,n);break;case 20:S0(e,n);break;case 21:Lr(e.body,n,!0,!1);break}}function f0(e,n){n.push(JSON.stringify(e.content),-3,e)}function _h(e,n){const{content:t,isStatic:i}=e;n.push(i?JSON.stringify(t):t,-3,e)}function d0(e,n){const{push:t,helper:i,pure:r}=n;r&&t(yo),t(`${i(po)}(`),St(e.content,n),t(\")\")}function Eh(e,n){for(let t=0;t<e.children.length;t++){const i=e.children[t];be(i)?n.push(i,-3):St(i,n)}}function h0(e,n){const{push:t}=n;if(e.type===8)t(\"[\"),Eh(e,n),t(\"]\");else if(e.isStatic){const i=Ml(e.content)?e.content:JSON.stringify(e.content);t(i,-2,e)}else t(`[${e.content}]`,-3,e)}function p0(e,n){const{push:t,helper:i,pure:r}=n;r&&t(yo),t(`${i(Rr)}(${JSON.stringify(e.content)})`,-3,e)}function m0(e,n){const{push:t,helper:i,pure:r}=n,{tag:s,props:o,children:a,patchFlag:l,dynamicProps:c,directives:u,isBlock:f,disableTracking:p,isComponent:m}=e;let g;l&&(g=String(l)),u&&t(i(El)+\"(\"),f&&t(`(${i(yi)}(${p?\"true\":\"\"}), `),r&&t(yo);const b=f?Wi(n.inSSR,m):Ki(n.inSSR,m);t(i(b)+\"(\",-2,e),Lr(g0([s,o,a,g,c]),n),t(\")\"),f&&t(\")\"),u&&(t(\", \"),St(u,n),t(\")\"))}function g0(e){let n=e.length;for(;n--&&e[n]==null;);return e.slice(0,n+1).map(t=>t||\"null\")}function y0(e,n){const{push:t,helper:i,pure:r}=n,s=be(e.callee)?e.callee:i(e.callee);r&&t(yo),t(s+\"(\",-2,e),Lr(e.arguments,n),t(\")\")}function v0(e,n){const{push:t,indent:i,deindent:r,newline:s}=n,{properties:o}=e;if(!o.length){t(\"{}\",-2,e);return}const a=o.length>1||!1;t(a?\"{\":\"{ \"),a&&i();for(let l=0;l<o.length;l++){const{key:c,value:u}=o[l];h0(c,n),t(\": \"),St(u,n),l<o.length-1&&(t(\",\"),s())}a&&r(),t(a?\"}\":\" }\")}function b0(e,n){Nl(e.elements,n)}function _0(e,n){const{push:t,indent:i,deindent:r}=n,{params:s,returns:o,body:a,newline:l,isSlot:c}=e;c&&t(`_${qi[Al]}(`),t(\"(\",-2,e),se(s)?Lr(s,n):s&&St(s,n),t(\") => \"),(l||a)&&(t(\"{\"),i()),o?(l&&t(\"return \"),se(o)?Nl(o,n):St(o,n)):a&&St(a,n),(l||a)&&(r(),t(\"}\")),c&&(e.isNonScopedSlot&&t(\", undefined, true\"),t(\")\"))}function E0(e,n){const{test:t,consequent:i,alternate:r,newline:s}=e,{push:o,indent:a,deindent:l,newline:c}=n;if(t.type===4){const f=!Ml(t.content);f&&o(\"(\"),_h(t,n),f&&o(\")\")}else o(\"(\"),St(t,n),o(\")\");s&&a(),n.indentLevel++,s||o(\" \"),o(\"? \"),St(i,n),n.indentLevel--,s&&c(),s||o(\" \"),o(\": \");const u=r.type===19;u||n.indentLevel++,St(r,n),u||n.indentLevel--,s&&l(!0)}function S0(e,n){const{push:t,helper:i,indent:r,deindent:s,newline:o}=n;t(`_cache[${e.index}] || (`),e.isVOnce&&(r(),t(`${i(Fs)}(-1),`),o(),t(\"(\")),t(`_cache[${e.index}] = `),St(e.value,n),e.isVOnce&&(t(`).cacheIndex = ${e.index},`),o(),t(`${i(Fs)}(1),`),o(),t(`_cache[${e.index}]`),s()),t(\")\")}new RegExp(\"\\\\b\"+\"arguments,await,break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,let,new,return,super,switch,throw,try,var,void,while,with,yield\".split(\",\").join(\"\\\\b|\\\\b\")+\"\\\\b\");const w0=vh(/^(if|else|else-if)$/,(e,n,t)=>C0(e,n,t,(i,r,s)=>{const o=t.parent.children;let a=o.indexOf(i),l=0;for(;a-->=0;){const c=o[a];c&&c.type===9&&(l+=c.branches.length)}return()=>{if(s)i.codegenNode=Hc(r,l,t);else{const c=T0(i.codegenNode);c.alternate=Hc(r,l+i.branches.length-1,t)}}}));function C0(e,n,t,i){if(n.name!==\"else\"&&(!n.exp||!n.exp.content.trim())){const r=n.exp?n.exp.loc:e.loc;t.onError(ze(28,n.loc)),n.exp=Ee(\"true\",!1,r)}if(n.name===\"if\"){const r=Bc(e,n),s={type:9,loc:e.loc,branches:[r]};if(t.replaceNode(s),i)return i(s,r,!0)}else{const r=t.parent.children;let s=r.indexOf(e);for(;s-->=-1;){const o=r[s];if(o&&o.type===3){t.removeNode(o);continue}if(o&&o.type===2&&!o.content.trim().length){t.removeNode(o);continue}if(o&&o.type===9){n.name===\"else-if\"&&o.branches[o.branches.length-1].condition===void 0&&t.onError(ze(30,e.loc)),t.removeNode();const a=Bc(e,n);o.branches.push(a);const l=i&&i(o,a,!1);go(a,t),l&&l(),t.currentNode=null}else t.onError(ze(30,e.loc));break}}}function Bc(e,n){const t=e.tagType===3;return{type:10,loc:e.loc,condition:n.name===\"else\"?void 0:n.exp,children:t&&!on(e,\"for\")?e.children:[e],userKey:mo(e,\"key\"),isTemplateIf:t}}function Hc(e,n,t){return e.condition?ba(e.condition,Uc(e,n,t),rt(t.helper(Rr),['\"\"',\"true\"])):Uc(e,n,t)}function Uc(e,n,t){const{helper:i}=t,r=Je(\"key\",Ee(`${n}`,!1,Zt,2)),{children:s}=e,o=s[0];if(s.length!==1||o.type!==1)if(s.length===1&&o.type===11){const l=o.codegenNode;return js(l,r,t),l}else{let l=64;return _r(t,i(vr),Xt([r]),s,l,void 0,void 0,!0,!1,!1,e.loc)}else{const l=o.codegenNode,c=Bv(l);return c.type===13&&xl(c,t),js(c,r,t),l}}function T0(e){for(;;)if(e.type===19)if(e.alternate.type===19)e=e.alternate;else return e;else e.type===20&&(e=e.value)}const A0=(e,n,t)=>{const{modifiers:i,loc:r}=e,s=e.arg;let{exp:o}=e;if(o&&o.type===4&&!o.content.trim()&&(o=void 0),!o){if(s.type!==4||!s.isStatic)return t.onError(ze(52,s.loc)),{props:[Je(s,Ee(\"\",!0,r))]};Sh(e),o=e.exp}return s.type!==4?(s.children.unshift(\"(\"),s.children.push(') || \"\"')):s.isStatic||(s.content=`${s.content} || \"\"`),i.includes(\"camel\")&&(s.type===4?s.isStatic?s.content=Ke(s.content):s.content=`${t.helperString(ya)}(${s.content})`:(s.children.unshift(`${t.helperString(ya)}(`),s.children.push(\")\"))),t.inSSR||(i.includes(\"prop\")&&qc(s,\".\"),i.includes(\"attr\")&&qc(s,\"^\")),{props:[Je(s,o)]}},Sh=(e,n)=>{const t=e.arg,i=Ke(t.content);e.exp=Ee(i,!1,t.loc)},qc=(e,n)=>{e.type===4?e.isStatic?e.content=n+e.content:e.content=`\\`${n}\\${${e.content}}\\``:(e.children.unshift(`'${n}' + (`),e.children.push(\")\"))},O0=vh(\"for\",(e,n,t)=>{const{helper:i,removeHelper:r}=t;return x0(e,n,t,s=>{const o=rt(i(Sl),[s.source]),a=Vs(e),l=on(e,\"memo\"),c=mo(e,\"key\",!1,!0);c&&c.type===7&&!c.exp&&Sh(c);const u=c&&(c.type===6?c.value?Ee(c.value.content,!0):void 0:c.exp),f=c&&u?Je(\"key\",u):null,p=s.source.type===4&&s.source.constType>0,m=p?64:c?128:256;return s.codegenNode=_r(t,i(vr),void 0,o,m,void 0,void 0,!0,!p,!1,e.loc),()=>{let g;const{children:b}=s,M=b.length!==1||b[0].type!==1,P=$s(e)?e:a&&e.children.length===1&&$s(e.children[0])?e.children[0]:null;if(P?(g=P.codegenNode,a&&f&&js(g,f,t)):M?g=_r(t,i(vr),f?Xt([f]):void 0,e.children,64,void 0,void 0,!0,void 0,!1):(g=b[0].codegenNode,a&&f&&js(g,f,t),g.isBlock!==!p&&(g.isBlock?(r(yi),r(Wi(t.inSSR,g.isComponent))):r(Ki(t.inSSR,g.isComponent))),g.isBlock=!p,g.isBlock?(i(yi),i(Wi(t.inSSR,g.isComponent))):i(Ki(t.inSSR,g.isComponent))),l){const A=zi(Sa(s.parseResult,[Ee(\"_cached\")]));A.body=Nv([cn([\"const _memo = (\",l.exp,\")\"]),cn([\"if (_cached\",...u?[\" && _cached.key === \",u]:[],` && ${t.helperString(sh)}(_cached, _memo)) return _cached`]),cn([\"const _item = \",g]),Ee(\"_item.memo = _memo\"),Ee(\"return _item\")]),o.arguments.push(A,Ee(\"_cache\"),Ee(String(t.cached++)))}else o.arguments.push(zi(Sa(s.parseResult),g,!0))}})});function x0(e,n,t,i){if(!n.exp){t.onError(ze(31,n.loc));return}const r=n.forParseResult;if(!r){t.onError(ze(32,n.loc));return}wh(r);const{addIdentifiers:s,removeIdentifiers:o,scopes:a}=t,{source:l,value:c,key:u,index:f}=r,p={type:11,loc:n.loc,source:l,valueAlias:c,keyAlias:u,objectIndexAlias:f,parseResult:r,children:Vs(e)?e.children:[e]};t.replaceNode(p),a.vFor++;const m=i&&i(p);return()=>{a.vFor--,m&&m()}}function wh(e,n){e.finalized||(e.finalized=!0)}function Sa({value:e,key:n,index:t},i=[]){return D0([e,n,t,...i])}function D0(e){let n=e.length;for(;n--&&!e[n];);return e.slice(0,n+1).map((t,i)=>t||Ee(\"_\".repeat(i+1),!1))}const zc=Ee(\"undefined\",!1),M0=(e,n)=>{if(e.type===1&&(e.tagType===1||e.tagType===3)){const t=on(e,\"slot\");if(t)return t.exp,n.scopes.vSlot++,()=>{n.scopes.vSlot--}}},N0=(e,n,t,i)=>zi(e,t,!1,!0,t.length?t[0].loc:i);function I0(e,n,t=N0){n.helper(Al);const{children:i,loc:r}=e,s=[],o=[];let a=n.scopes.vSlot>0||n.scopes.vFor>0;const l=on(e,\"slot\",!0);if(l){const{arg:M,exp:P}=l;M&&!Lt(M)&&(a=!0),s.push(Je(M||Ee(\"default\",!0),t(P,void 0,i,r)))}let c=!1,u=!1;const f=[],p=new Set;let m=0;for(let M=0;M<i.length;M++){const P=i[M];let A;if(!Vs(P)||!(A=on(P,\"slot\",!0))){P.type!==3&&f.push(P);continue}if(l){n.onError(ze(37,A.loc));break}c=!0;const{children:v,loc:C}=P,{arg:D=Ee(\"default\",!0),exp:O,loc:L}=A;let F;Lt(D)?F=D?D.content:\"default\":a=!0;const T=on(P,\"for\"),x=t(O,T,v,C);let H,N;if(H=on(P,\"if\"))a=!0,o.push(ba(H.exp,es(D,x,m++),zc));else if(N=on(P,/^else(-if)?$/,!0)){let z=M,re;for(;z--&&(re=i[z],re.type===3););if(re&&Vs(re)&&on(re,/^(else-)?if$/)){let ne=o[o.length-1];for(;ne.alternate.type===19;)ne=ne.alternate;ne.alternate=N.exp?ba(N.exp,es(D,x,m++),zc):es(D,x,m++)}else n.onError(ze(30,N.loc))}else if(T){a=!0;const z=T.forParseResult;z?(wh(z),o.push(rt(n.helper(Sl),[z.source,zi(Sa(z),es(D,x),!0)]))):n.onError(ze(32,T.loc))}else{if(F){if(p.has(F)){n.onError(ze(38,L));continue}p.add(F),F===\"default\"&&(u=!0)}s.push(Je(D,x))}}if(!l){const M=(P,A)=>{const v=t(P,void 0,A,r);return n.compatConfig&&(v.isNonScopedSlot=!0),Je(\"default\",v)};c?f.length&&f.some(P=>Ch(P))&&(u?n.onError(ze(39,f[0].loc)):s.push(M(void 0,f))):s.push(M(void 0,i))}const g=a?2:ys(e.children)?3:1;let b=Xt(s.concat(Je(\"_\",Ee(g+\"\",!1))),r);return o.length&&(b=rt(n.helper(rh),[b,Fr(o)])),{slots:b,hasDynamicSlots:a}}function es(e,n,t){const i=[Je(\"name\",e),Je(\"fn\",n)];return t!=null&&i.push(Je(\"key\",Ee(String(t),!0))),Xt(i)}function ys(e){for(let n=0;n<e.length;n++){const t=e[n];switch(t.type){case 1:if(t.tagType===2||ys(t.children))return!0;break;case 9:if(ys(t.branches))return!0;break;case 10:case 11:if(ys(t.children))return!0;break}}return!1}function Ch(e){return e.type!==2&&e.type!==12?!0:e.type===2?!!e.content.trim():Ch(e.content)}const Th=new WeakMap,k0=(e,n)=>function(){if(e=n.currentNode,!(e.type===1&&(e.tagType===0||e.tagType===1)))return;const{tag:i,props:r}=e,s=e.tagType===1;let o=s?R0(e,n):`\"${i}\"`;const a=$e(o)&&o.callee===vl;let l,c,u=0,f,p,m,g=a||o===ur||o===hl||!s&&(i===\"svg\"||i===\"foreignObject\"||i===\"math\");if(r.length>0){const b=Ah(e,n,void 0,s,a);l=b.props,u=b.patchFlag,p=b.dynamicPropNames;const M=b.directives;m=M&&M.length?Fr(M.map(P=>F0(P,n))):void 0,b.shouldUseBlock&&(g=!0)}if(e.children.length>0)if(o===Rs&&(g=!0,u|=1024),s&&o!==ur&&o!==Rs){const{slots:M,hasDynamicSlots:P}=I0(e,n);c=M,P&&(u|=1024)}else if(e.children.length===1&&o!==ur){const M=e.children[0],P=M.type,A=P===5||P===8;A&&Qt(M,n)===0&&(u|=1),A||P===2?c=M:c=e.children}else c=e.children;p&&p.length&&(f=L0(p)),e.codegenNode=_r(n,o,l,c,u===0?void 0:u,f,m,!!g,!1,s,e.loc)};function R0(e,n,t=!1){let{tag:i}=e;const r=wa(i),s=mo(e,\"is\",!1,!0);if(s)if(r||hi(\"COMPILER_IS_ON_ELEMENT\",n)){let a;if(s.type===6?a=s.value&&Ee(s.value.content,!0):(a=s.exp,a||(a=Ee(\"is\",!1,s.loc))),a)return rt(n.helper(vl),[a])}else s.type===6&&s.value.content.startsWith(\"vue:\")&&(i=s.value.content.slice(4));const o=ah(i)||n.isBuiltInComponent(i);return o?(t||n.helper(o),o):(n.helper(yl),n.components.add(i),Sr(i,\"component\"))}function Ah(e,n,t=e.props,i,r,s=!1){const{tag:o,loc:a,children:l}=e;let c=[];const u=[],f=[],p=l.length>0;let m=!1,g=0,b=!1,M=!1,P=!1,A=!1,v=!1,C=!1;const D=[],O=x=>{c.length&&(u.push(Xt(Kc(c),a)),c=[]),x&&u.push(x)},L=()=>{n.scopes.vFor>0&&c.push(Je(Ee(\"ref_for\",!0),Ee(\"true\")))},F=({key:x,value:H})=>{if(Lt(x)){const N=x.content,z=_i(N);if(z&&(!i||r)&&N.toLowerCase()!==\"onclick\"&&N!==\"onUpdate:modelValue\"&&!jn(N)&&(A=!0),z&&jn(N)&&(C=!0),z&&H.type===14&&(H=H.arguments[0]),H.type===20||(H.type===4||H.type===8)&&Qt(H,n)>0)return;N===\"ref\"?b=!0:N===\"class\"?M=!0:N===\"style\"?P=!0:N!==\"key\"&&!D.includes(N)&&D.push(N),i&&(N===\"class\"||N===\"style\")&&!D.includes(N)&&D.push(N)}else v=!0};for(let x=0;x<t.length;x++){const H=t[x];if(H.type===6){const{loc:N,name:z,nameLoc:re,value:ne}=H;let U=!0;if(z===\"ref\"&&(b=!0,L()),z===\"is\"&&(wa(o)||ne&&ne.content.startsWith(\"vue:\")||hi(\"COMPILER_IS_ON_ELEMENT\",n)))continue;c.push(Je(Ee(z,!0,re),Ee(ne?ne.content:\"\",U,ne?ne.loc:N)))}else{const{name:N,arg:z,exp:re,loc:ne,modifiers:U}=H,X=N===\"bind\",Q=N===\"on\";if(N===\"slot\"){i||n.onError(ze(40,ne));continue}if(N===\"once\"||N===\"memo\"||N===\"is\"||X&&ri(z,\"is\")&&(wa(o)||hi(\"COMPILER_IS_ON_ELEMENT\",n))||Q&&s)continue;if((X&&ri(z,\"key\")||Q&&p&&ri(z,\"vue:before-update\"))&&(m=!0),X&&ri(z,\"ref\")&&L(),!z&&(X||Q)){if(v=!0,re)if(X){if(L(),O(),hi(\"COMPILER_V_BIND_OBJECT_ORDER\",n)){u.unshift(re);continue}u.push(re)}else O({type:14,loc:ne,callee:n.helper(Tl),arguments:i?[re]:[re,\"true\"]});else n.onError(ze(X?34:35,ne));continue}X&&U.includes(\"prop\")&&(g|=32);const He=n.directiveTransforms[N];if(He){const{props:wt,needRuntime:Ye}=He(H,e,n);!s&&wt.forEach(F),Q&&z&&!Lt(z)?O(Xt(wt,a)):c.push(...wt),Ye&&(f.push(H),Kt(Ye)&&Th.set(H,Ye))}else Yp(N)||(f.push(H),p&&(m=!0))}}let T;if(u.length?(O(),u.length>1?T=rt(n.helper(Ps),u,a):T=u[0]):c.length&&(T=Xt(Kc(c),a)),v?g|=16:(M&&!i&&(g|=2),P&&!i&&(g|=4),D.length&&(g|=8),A&&(g|=32)),!m&&(g===0||g===32)&&(b||C||f.length>0)&&(g|=512),!n.inSSR&&T)switch(T.type){case 15:let x=-1,H=-1,N=!1;for(let ne=0;ne<T.properties.length;ne++){const U=T.properties[ne].key;Lt(U)?U.content===\"class\"?x=ne:U.content===\"style\"&&(H=ne):U.isHandlerKey||(N=!0)}const z=T.properties[x],re=T.properties[H];N?T=rt(n.helper(br),[T]):(z&&!Lt(z.value)&&(z.value=rt(n.helper(wl),[z.value])),re&&(P||re.value.type===4&&re.value.content.trim()[0]===\"[\"||re.value.type===17)&&(re.value=rt(n.helper(Cl),[re.value])));break;case 14:break;default:T=rt(n.helper(br),[rt(n.helper(Pr),[T])]);break}return{props:T,directives:f,patchFlag:g,dynamicPropNames:D,shouldUseBlock:m}}function Kc(e){const n=new Map,t=[];for(let i=0;i<e.length;i++){const r=e[i];if(r.key.type===8||!r.key.isStatic){t.push(r);continue}const s=r.key.content,o=n.get(s);o?(s===\"style\"||s===\"class\"||_i(s))&&P0(o,r):(n.set(s,r),t.push(r))}return t}function P0(e,n){e.value.type===17?e.value.elements.push(n.value):e.value=Fr([e.value,n.value],e.loc)}function F0(e,n){const t=[],i=Th.get(e);i?t.push(n.helperString(i)):(n.helper(bl),n.directives.add(e.name),t.push(Sr(e.name,\"directive\")));const{loc:r}=e;if(e.exp&&t.push(e.exp),e.arg&&(e.exp||t.push(\"void 0\"),t.push(e.arg)),Object.keys(e.modifiers).length){e.arg||(e.exp||t.push(\"void 0\"),t.push(\"void 0\"));const s=Ee(\"true\",!1,r);t.push(Xt(e.modifiers.map(o=>Je(o,s)),r))}return Fr(t,e.loc)}function L0(e){let n=\"[\";for(let t=0,i=e.length;t<i;t++)n+=JSON.stringify(e[t]),t<i-1&&(n+=\", \");return n+\"]\"}function wa(e){return e===\"component\"||e===\"Component\"}const V0=(e,n)=>{if($s(e)){const{children:t,loc:i}=e,{slotName:r,slotProps:s}=$0(e,n),o=[n.prefixIdentifiers?\"_ctx.$slots\":\"$slots\",r,\"{}\",\"undefined\",\"true\"];let a=2;s&&(o[2]=s,a=3),t.length&&(o[3]=zi([],t,!1,!1,i),a=4),n.scopeId&&!n.slotted&&(a=5),o.splice(a),e.codegenNode=rt(n.helper(ih),o,i)}};function $0(e,n){let t='\"default\"',i;const r=[];for(let s=0;s<e.props.length;s++){const o=e.props[s];if(o.type===6)o.value&&(o.name===\"name\"?t=JSON.stringify(o.value.content):(o.name=Ke(o.name),r.push(o)));else if(o.name===\"bind\"&&ri(o.arg,\"name\")){if(o.exp)t=o.exp;else if(o.arg&&o.arg.type===4){const a=Ke(o.arg.content);t=o.exp=Ee(a,!1,o.arg.loc)}}else o.name===\"bind\"&&o.arg&&Lt(o.arg)&&(o.arg.content=Ke(o.arg.content)),r.push(o)}if(r.length>0){const{props:s,directives:o}=Ah(e,n,r,!1,!1);i=s,o.length&&n.onError(ze(36,o[0].loc))}return{slotName:t,slotProps:i}}const j0=/^\\s*(async\\s*)?(\\([^)]*?\\)|[\\w$_]+)\\s*(:[^=]+)?=>|^\\s*(async\\s+)?function(?:\\s+[\\w$]+)?\\s*\\(/,Oh=(e,n,t,i)=>{const{loc:r,modifiers:s,arg:o}=e;!e.exp&&!s.length&&t.onError(ze(35,r));let a;if(o.type===4)if(o.isStatic){let f=o.content;f.startsWith(\"vue:\")&&(f=`vnode-${f.slice(4)}`);const p=n.tagType!==0||f.startsWith(\"vnode\")||!/[A-Z]/.test(f)?Ni(Ke(f)):`on:${f}`;a=Ee(p,!0,o.loc)}else a=cn([`${t.helperString(va)}(`,o,\")\"]);else a=o,a.children.unshift(`${t.helperString(va)}(`),a.children.push(\")\");let l=e.exp;l&&!l.content.trim()&&(l=void 0);let c=t.cacheHandlers&&!l&&!t.inVOnce;if(l){const f=lh(l.content),p=!(f||j0.test(l.content)),m=l.content.includes(\";\");(p||c&&f)&&(l=cn([`${p?\"$event\":\"(...args)\"} => ${m?\"{\":\"(\"}`,l,m?\"}\":\")\"]))}let u={props:[Je(a,l||Ee(\"() => {}\",!1,r))]};return i&&(u=i(u)),c&&(u.props[0].value=t.cache(u.props[0].value)),u.props.forEach(f=>f.key.isHandlerKey=!0),u},B0=(e,n)=>{if(e.type===0||e.type===1||e.type===11||e.type===10)return()=>{const t=e.children;let i,r=!1;for(let s=0;s<t.length;s++){const o=t[s];if(Lo(o)){r=!0;for(let a=s+1;a<t.length;a++){const l=t[a];if(Lo(l))i||(i=t[s]=cn([o],o.loc)),i.children.push(\" + \",l),t.splice(a,1),a--;else{i=void 0;break}}}}if(!(!r||t.length===1&&(e.type===0||e.type===1&&e.tagType===0&&!e.props.find(s=>s.type===7&&!n.directiveTransforms[s.name])&&e.tag!==\"template\")))for(let s=0;s<t.length;s++){const o=t[s];if(Lo(o)||o.type===8){const a=[];(o.type!==2||o.content!==\" \")&&a.push(o),!n.ssr&&Qt(o,n)===0&&a.push(\"1\"),t[s]={type:12,content:o,loc:o.loc,codegenNode:rt(n.helper(gl),a)}}}}},Wc=new WeakSet,H0=(e,n)=>{if(e.type===1&&on(e,\"once\",!0))return Wc.has(e)||n.inVOnce||n.inSSR?void 0:(Wc.add(e),n.inVOnce=!0,n.helper(Fs),()=>{n.inVOnce=!1;const t=n.currentNode;t.codegenNode&&(t.codegenNode=n.cache(t.codegenNode,!0))})},xh=(e,n,t)=>{const{exp:i,arg:r}=e;if(!i)return t.onError(ze(41,e.loc)),ts();const s=i.loc.source,o=i.type===4?i.content:s,a=t.bindingMetadata[s];if(a===\"props\"||a===\"props-aliased\")return t.onError(ze(44,i.loc)),ts();const l=!1;if(!o.trim()||!lh(o)&&!l)return t.onError(ze(42,i.loc)),ts();const c=r||Ee(\"modelValue\",!0),u=r?Lt(r)?`onUpdate:${Ke(r.content)}`:cn(['\"onUpdate:\" + ',r]):\"onUpdate:modelValue\";let f;const p=t.isTS?\"($event: any)\":\"$event\";f=cn([`${p} => ((`,i,\") = $event)\"]);const m=[Je(c,e.exp),Je(u,f)];if(e.modifiers.length&&n.tagType===1){const g=e.modifiers.map(M=>(Ml(M)?M:JSON.stringify(M))+\": true\").join(\", \"),b=r?Lt(r)?`${r.content}Modifiers`:cn([r,' + \"Modifiers\"']):\"modelModifiers\";m.push(Je(b,Ee(`{ ${g} }`,!1,e.loc,2)))}return ts(m)};function ts(e=[]){return{props:e}}const U0=/[\\w).+\\-_$\\]]/,q0=(e,n)=>{hi(\"COMPILER_FILTERS\",n)&&(e.type===5?Hs(e.content,n):e.type===1&&e.props.forEach(t=>{t.type===7&&t.name!==\"for\"&&t.exp&&Hs(t.exp,n)}))};function Hs(e,n){if(e.type===4)Yc(e,n);else for(let t=0;t<e.children.length;t++){const i=e.children[t];typeof i==\"object\"&&(i.type===4?Yc(i,n):i.type===8?Hs(e,n):i.type===5&&Hs(i.content,n))}}function Yc(e,n){const t=e.content;let i=!1,r=!1,s=!1,o=!1,a=0,l=0,c=0,u=0,f,p,m,g,b=[];for(m=0;m<t.length;m++)if(p=f,f=t.charCodeAt(m),i)f===39&&p!==92&&(i=!1);else if(r)f===34&&p!==92&&(r=!1);else if(s)f===96&&p!==92&&(s=!1);else if(o)f===47&&p!==92&&(o=!1);else if(f===124&&t.charCodeAt(m+1)!==124&&t.charCodeAt(m-1)!==124&&!a&&!l&&!c)g===void 0?(u=m+1,g=t.slice(0,m).trim()):M();else{switch(f){case 34:r=!0;break;case 39:i=!0;break;case 96:s=!0;break;case 40:c++;break;case 41:c--;break;case 91:l++;break;case 93:l--;break;case 123:a++;break;case 125:a--;break}if(f===47){let P=m-1,A;for(;P>=0&&(A=t.charAt(P),A===\" \");P--);(!A||!U0.test(A))&&(o=!0)}}g===void 0?g=t.slice(0,m).trim():u!==0&&M();function M(){b.push(t.slice(u,m).trim()),u=m+1}if(b.length){for(m=0;m<b.length;m++)g=z0(g,b[m],n);e.content=g,e.ast=void 0}}function z0(e,n,t){t.helper(_l);const i=n.indexOf(\"(\");if(i<0)return t.filters.add(n),`${Sr(n,\"filter\")}(${e})`;{const r=n.slice(0,i),s=n.slice(i+1);return t.filters.add(r),`${Sr(r,\"filter\")}(${e}${s!==\")\"?\",\"+s:s}`}}const Zc=new WeakSet,K0=(e,n)=>{if(e.type===1){const t=on(e,\"memo\");return!t||Zc.has(e)?void 0:(Zc.add(e),()=>{const i=e.codegenNode||n.currentNode.codegenNode;i&&i.type===13&&(e.tagType!==1&&xl(i,n),e.codegenNode=rt(n.helper(Ol),[t.exp,zi(void 0,i),\"_cache\",String(n.cached++)]))})}};function W0(e){return[[H0,w0,K0,O0,q0,V0,k0,M0,B0],{on:Oh,bind:A0,model:xh}]}function Y0(e,n={}){const t=n.onError||Dl,i=n.mode===\"module\";n.prefixIdentifiers===!0?t(ze(47)):i&&t(ze(48));const r=!1;n.cacheHandlers&&t(ze(49)),n.scopeId&&!i&&t(ze(50));const s=Ne({},n,{prefixIdentifiers:r}),o=be(e)?e0(e,s):e,[a,l]=W0();return r0(o,Ne({},s,{nodeTransforms:[...a,...n.nodeTransforms||[]],directiveTransforms:Ne({},l,n.directiveTransforms||{})})),l0(o,s)}const Z0=()=>({props:[]});/**\n* @vue/compiler-dom v3.4.34\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/const Dh=Symbol(\"\"),Mh=Symbol(\"\"),Nh=Symbol(\"\"),Ih=Symbol(\"\"),Ca=Symbol(\"\"),kh=Symbol(\"\"),Rh=Symbol(\"\"),Ph=Symbol(\"\"),Fh=Symbol(\"\"),Lh=Symbol(\"\");xv({[Dh]:\"vModelRadio\",[Mh]:\"vModelCheckbox\",[Nh]:\"vModelText\",[Ih]:\"vModelSelect\",[Ca]:\"vModelDynamic\",[kh]:\"withModifiers\",[Rh]:\"withKeys\",[Ph]:\"vShow\",[Fh]:\"Transition\",[Lh]:\"TransitionGroup\"});let Oi;function G0(e,n=!1){return Oi||(Oi=document.createElement(\"div\")),n?(Oi.innerHTML=`<div foo=\"${e.replace(/\"/g,\"&quot;\")}\">`,Oi.children[0].getAttribute(\"foo\")):(Oi.innerHTML=e,Oi.textContent)}const J0={parseMode:\"html\",isVoidTag:um,isNativeTag:e=>am(e)||lm(e)||cm(e),isPreTag:e=>e===\"pre\",decodeEntities:G0,isBuiltInComponent:e=>{if(e===\"Transition\"||e===\"transition\")return Fh;if(e===\"TransitionGroup\"||e===\"transition-group\")return Lh},getNamespace(e,n,t){let i=n?n.ns:t;if(n&&i===2)if(n.tag===\"annotation-xml\"){if(e===\"svg\")return 1;n.props.some(r=>r.type===6&&r.name===\"encoding\"&&r.value!=null&&(r.value.content===\"text/html\"||r.value.content===\"application/xhtml+xml\"))&&(i=0)}else/^m(?:[ions]|text)$/.test(n.tag)&&e!==\"mglyph\"&&e!==\"malignmark\"&&(i=0);else n&&i===1&&(n.tag===\"foreignObject\"||n.tag===\"desc\"||n.tag===\"title\")&&(i=0);if(i===0){if(e===\"svg\")return 1;if(e===\"math\")return 2}return i}},X0=e=>{e.type===1&&e.props.forEach((n,t)=>{n.type===6&&n.name===\"style\"&&n.value&&(e.props[t]={type:7,name:\"bind\",arg:Ee(\"style\",!0,n.loc),exp:Q0(n.value.content,n.loc),modifiers:[],loc:n.loc})})},Q0=(e,n)=>{const t=Ju(e);return Ee(JSON.stringify(t),!1,n,3)};function Un(e,n){return ze(e,n)}const eb=(e,n,t)=>{const{exp:i,loc:r}=e;return i||t.onError(Un(53,r)),n.children.length&&(t.onError(Un(54,r)),n.children.length=0),{props:[Je(Ee(\"innerHTML\",!0,r),i||Ee(\"\",!0))]}},tb=(e,n,t)=>{const{exp:i,loc:r}=e;return i||t.onError(Un(55,r)),n.children.length&&(t.onError(Un(56,r)),n.children.length=0),{props:[Je(Ee(\"textContent\",!0),i?Qt(i,t)>0?i:rt(t.helperString(po),[i],r):Ee(\"\",!0))]}},nb=(e,n,t)=>{const i=xh(e,n,t);if(!i.props.length||n.tagType===1)return i;e.arg&&t.onError(Un(58,e.arg.loc));const{tag:r}=n,s=t.isCustomElement(r);if(r===\"input\"||r===\"textarea\"||r===\"select\"||s){let o=Nh,a=!1;if(r===\"input\"||s){const l=mo(n,\"type\");if(l){if(l.type===7)o=Ca;else if(l.value)switch(l.value.content){case\"radio\":o=Dh;break;case\"checkbox\":o=Mh;break;case\"file\":a=!0,t.onError(Un(59,e.loc));break}}else Vv(n)&&(o=Ca)}else r===\"select\"&&(o=Ih);a||(i.needRuntime=t.helper(o))}else t.onError(Un(57,e.loc));return i.props=i.props.filter(o=>!(o.key.type===4&&o.key.content===\"modelValue\")),i},ib=Wt(\"passive,once,capture\"),rb=Wt(\"stop,prevent,self,ctrl,shift,alt,meta,exact,middle\"),sb=Wt(\"left,right\"),Vh=Wt(\"onkeyup,onkeydown,onkeypress\",!0),ob=(e,n,t,i)=>{const r=[],s=[],o=[];for(let a=0;a<n.length;a++){const l=n[a];l===\"native\"&&Er(\"COMPILER_V_ON_NATIVE\",t)||ib(l)?o.push(l):sb(l)?Lt(e)?Vh(e.content)?r.push(l):s.push(l):(r.push(l),s.push(l)):rb(l)?s.push(l):r.push(l)}return{keyModifiers:r,nonKeyModifiers:s,eventOptionModifiers:o}},Gc=(e,n)=>Lt(e)&&e.content.toLowerCase()===\"onclick\"?Ee(n,!0):e.type!==4?cn([\"(\",e,`) === \"onClick\" ? \"${n}\" : (`,e,\")\"]):e,ab=(e,n,t)=>Oh(e,n,t,i=>{const{modifiers:r}=e;if(!r.length)return i;let{key:s,value:o}=i.props[0];const{keyModifiers:a,nonKeyModifiers:l,eventOptionModifiers:c}=ob(s,r,t,e.loc);if(l.includes(\"right\")&&(s=Gc(s,\"onContextmenu\")),l.includes(\"middle\")&&(s=Gc(s,\"onMouseup\")),l.length&&(o=rt(t.helper(kh),[o,JSON.stringify(l)])),a.length&&(!Lt(s)||Vh(s.content))&&(o=rt(t.helper(Rh),[o,JSON.stringify(a)])),c.length){const u=c.map(Si).join(\"\");s=Lt(s)?Ee(`${s.content}${u}`,!0):cn([\"(\",s,`) + \"${u}\"`])}return{props:[Je(s,o)]}}),lb=(e,n,t)=>{const{exp:i,loc:r}=e;return i||t.onError(Un(61,r)),{props:[],needRuntime:t.helper(Ph)}},cb=(e,n)=>{e.type===1&&e.tagType===0&&(e.tag===\"script\"||e.tag===\"style\")&&n.removeNode()},ub=[X0],fb={cloak:Z0,html:eb,text:tb,model:nb,on:ab,show:lb};function db(e,n={}){return Y0(e,Ne({},J0,n,{nodeTransforms:[cb,...ub,...n.nodeTransforms||[]],directiveTransforms:Ne({},fb,n.directiveTransforms||{}),transformHoist:null}))}/**\n* vue v3.4.34\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/const Jc=new WeakMap;function hb(e){let n=Jc.get(e??Oe);return n||(n=Object.create(null),Jc.set(e??Oe,n)),n}function pb(e,n){if(!be(e))if(e.nodeType)e=e.innerHTML;else return tt;const t=e,i=hb(n),r=i[t];if(r)return r;if(e[0]===\"#\"){const l=document.querySelector(e);e=l?l.innerHTML:\"\"}const s=Ne({hoistStatic:!0,onError:void 0,onWarn:tt},n);!s.isCustomElement&&typeof customElements<\"u\"&&(s.isCustomElement=l=>!!customElements.get(l));const{code:o}=db(e,s),a=new Function(\"Vue\",o)(Sv);return a._rc=!0,i[t]=a}Ad(pb);function $h(e,n){return function(){return e.apply(n,arguments)}}const{toString:mb}=Object.prototype,{getPrototypeOf:Il}=Object,vo=(e=>n=>{const t=mb.call(n);return e[t]||(e[t]=t.slice(8,-1).toLowerCase())})(Object.create(null)),dn=e=>(e=e.toLowerCase(),n=>vo(n)===e),bo=e=>n=>typeof n===e,{isArray:Gi}=Array,Cr=bo(\"undefined\");function gb(e){return e!==null&&!Cr(e)&&e.constructor!==null&&!Cr(e.constructor)&&nn(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const jh=dn(\"ArrayBuffer\");function yb(e){let n;return typeof ArrayBuffer<\"u\"&&ArrayBuffer.isView?n=ArrayBuffer.isView(e):n=e&&e.buffer&&jh(e.buffer),n}const vb=bo(\"string\"),nn=bo(\"function\"),Bh=bo(\"number\"),_o=e=>e!==null&&typeof e==\"object\",bb=e=>e===!0||e===!1,vs=e=>{if(vo(e)!==\"object\")return!1;const n=Il(e);return(n===null||n===Object.prototype||Object.getPrototypeOf(n)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},_b=dn(\"Date\"),Eb=dn(\"File\"),Sb=dn(\"Blob\"),wb=dn(\"FileList\"),Cb=e=>_o(e)&&nn(e.pipe),Tb=e=>{let n;return e&&(typeof FormData==\"function\"&&e instanceof FormData||nn(e.append)&&((n=vo(e))===\"formdata\"||n===\"object\"&&nn(e.toString)&&e.toString()===\"[object FormData]\"))},Ab=dn(\"URLSearchParams\"),[Ob,xb,Db,Mb]=[\"ReadableStream\",\"Request\",\"Response\",\"Headers\"].map(dn),Nb=e=>e.trim?e.trim():e.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\"\");function Vr(e,n,{allOwnKeys:t=!1}={}){if(e===null||typeof e>\"u\")return;let i,r;if(typeof e!=\"object\"&&(e=[e]),Gi(e))for(i=0,r=e.length;i<r;i++)n.call(null,e[i],i,e);else{const s=t?Object.getOwnPropertyNames(e):Object.keys(e),o=s.length;let a;for(i=0;i<o;i++)a=s[i],n.call(null,e[a],a,e)}}function Hh(e,n){n=n.toLowerCase();const t=Object.keys(e);let i=t.length,r;for(;i-- >0;)if(r=t[i],n===r.toLowerCase())return r;return null}const Uh=(()=>typeof globalThis<\"u\"?globalThis:typeof self<\"u\"?self:typeof window<\"u\"?window:global)(),qh=e=>!Cr(e)&&e!==Uh;function Ta(){const{caseless:e}=qh(this)&&this||{},n={},t=(i,r)=>{const s=e&&Hh(n,r)||r;vs(n[s])&&vs(i)?n[s]=Ta(n[s],i):vs(i)?n[s]=Ta({},i):Gi(i)?n[s]=i.slice():n[s]=i};for(let i=0,r=arguments.length;i<r;i++)arguments[i]&&Vr(arguments[i],t);return n}const Ib=(e,n,t,{allOwnKeys:i}={})=>(Vr(n,(r,s)=>{t&&nn(r)?e[s]=$h(r,t):e[s]=r},{allOwnKeys:i}),e),kb=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),Rb=(e,n,t,i)=>{e.prototype=Object.create(n.prototype,i),e.prototype.constructor=e,Object.defineProperty(e,\"super\",{value:n.prototype}),t&&Object.assign(e.prototype,t)},Pb=(e,n,t,i)=>{let r,s,o;const a={};if(n=n||{},e==null)return n;do{for(r=Object.getOwnPropertyNames(e),s=r.length;s-- >0;)o=r[s],(!i||i(o,e,n))&&!a[o]&&(n[o]=e[o],a[o]=!0);e=t!==!1&&Il(e)}while(e&&(!t||t(e,n))&&e!==Object.prototype);return n},Fb=(e,n,t)=>{e=String(e),(t===void 0||t>e.length)&&(t=e.length),t-=n.length;const i=e.indexOf(n,t);return i!==-1&&i===t},Lb=e=>{if(!e)return null;if(Gi(e))return e;let n=e.length;if(!Bh(n))return null;const t=new Array(n);for(;n-- >0;)t[n]=e[n];return t},Vb=(e=>n=>e&&n instanceof e)(typeof Uint8Array<\"u\"&&Il(Uint8Array)),$b=(e,n)=>{const i=(e&&e[Symbol.iterator]).call(e);let r;for(;(r=i.next())&&!r.done;){const s=r.value;n.call(e,s[0],s[1])}},jb=(e,n)=>{let t;const i=[];for(;(t=e.exec(n))!==null;)i.push(t);return i},Bb=dn(\"HTMLFormElement\"),Hb=e=>e.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,function(t,i,r){return i.toUpperCase()+r}),Xc=(({hasOwnProperty:e})=>(n,t)=>e.call(n,t))(Object.prototype),Ub=dn(\"RegExp\"),zh=(e,n)=>{const t=Object.getOwnPropertyDescriptors(e),i={};Vr(t,(r,s)=>{let o;(o=n(r,s,e))!==!1&&(i[s]=o||r)}),Object.defineProperties(e,i)},qb=e=>{zh(e,(n,t)=>{if(nn(e)&&[\"arguments\",\"caller\",\"callee\"].indexOf(t)!==-1)return!1;const i=e[t];if(nn(i)){if(n.enumerable=!1,\"writable\"in n){n.writable=!1;return}n.set||(n.set=()=>{throw Error(\"Can not rewrite read-only method '\"+t+\"'\")})}})},zb=(e,n)=>{const t={},i=r=>{r.forEach(s=>{t[s]=!0})};return Gi(e)?i(e):i(String(e).split(n)),t},Kb=()=>{},Wb=(e,n)=>e!=null&&Number.isFinite(e=+e)?e:n,$o=\"abcdefghijklmnopqrstuvwxyz\",Qc=\"0123456789\",Kh={DIGIT:Qc,ALPHA:$o,ALPHA_DIGIT:$o+$o.toUpperCase()+Qc},Yb=(e=16,n=Kh.ALPHA_DIGIT)=>{let t=\"\";const{length:i}=n;for(;e--;)t+=n[Math.random()*i|0];return t};function Zb(e){return!!(e&&nn(e.append)&&e[Symbol.toStringTag]===\"FormData\"&&e[Symbol.iterator])}const Gb=e=>{const n=new Array(10),t=(i,r)=>{if(_o(i)){if(n.indexOf(i)>=0)return;if(!(\"toJSON\"in i)){n[r]=i;const s=Gi(i)?[]:{};return Vr(i,(o,a)=>{const l=t(o,r+1);!Cr(l)&&(s[a]=l)}),n[r]=void 0,s}}return i};return t(e,0)},Jb=dn(\"AsyncFunction\"),Xb=e=>e&&(_o(e)||nn(e))&&nn(e.then)&&nn(e.catch),R={isArray:Gi,isArrayBuffer:jh,isBuffer:gb,isFormData:Tb,isArrayBufferView:yb,isString:vb,isNumber:Bh,isBoolean:bb,isObject:_o,isPlainObject:vs,isReadableStream:Ob,isRequest:xb,isResponse:Db,isHeaders:Mb,isUndefined:Cr,isDate:_b,isFile:Eb,isBlob:Sb,isRegExp:Ub,isFunction:nn,isStream:Cb,isURLSearchParams:Ab,isTypedArray:Vb,isFileList:wb,forEach:Vr,merge:Ta,extend:Ib,trim:Nb,stripBOM:kb,inherits:Rb,toFlatObject:Pb,kindOf:vo,kindOfTest:dn,endsWith:Fb,toArray:Lb,forEachEntry:$b,matchAll:jb,isHTMLForm:Bb,hasOwnProperty:Xc,hasOwnProp:Xc,reduceDescriptors:zh,freezeMethods:qb,toObjectSet:zb,toCamelCase:Hb,noop:Kb,toFiniteNumber:Wb,findKey:Hh,global:Uh,isContextDefined:qh,ALPHABET:Kh,generateString:Yb,isSpecCompliantForm:Zb,toJSONObject:Gb,isAsyncFn:Jb,isThenable:Xb};function ve(e,n,t,i,r){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name=\"AxiosError\",n&&(this.code=n),t&&(this.config=t),i&&(this.request=i),r&&(this.response=r)}R.inherits(ve,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:R.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const Wh=ve.prototype,Yh={};[\"ERR_BAD_OPTION_VALUE\",\"ERR_BAD_OPTION\",\"ECONNABORTED\",\"ETIMEDOUT\",\"ERR_NETWORK\",\"ERR_FR_TOO_MANY_REDIRECTS\",\"ERR_DEPRECATED\",\"ERR_BAD_RESPONSE\",\"ERR_BAD_REQUEST\",\"ERR_CANCELED\",\"ERR_NOT_SUPPORT\",\"ERR_INVALID_URL\"].forEach(e=>{Yh[e]={value:e}});Object.defineProperties(ve,Yh);Object.defineProperty(Wh,\"isAxiosError\",{value:!0});ve.from=(e,n,t,i,r,s)=>{const o=Object.create(Wh);return R.toFlatObject(e,o,function(l){return l!==Error.prototype},a=>a!==\"isAxiosError\"),ve.call(o,e.message,n,t,i,r),o.cause=e,o.name=e.name,s&&Object.assign(o,s),o};const Qb=null;function Aa(e){return R.isPlainObject(e)||R.isArray(e)}function Zh(e){return R.endsWith(e,\"[]\")?e.slice(0,-2):e}function eu(e,n,t){return e?e.concat(n).map(function(r,s){return r=Zh(r),!t&&s?\"[\"+r+\"]\":r}).join(t?\".\":\"\"):n}function e_(e){return R.isArray(e)&&!e.some(Aa)}const t_=R.toFlatObject(R,{},null,function(n){return/^is[A-Z]/.test(n)});function Eo(e,n,t){if(!R.isObject(e))throw new TypeError(\"target must be an object\");n=n||new FormData,t=R.toFlatObject(t,{metaTokens:!0,dots:!1,indexes:!1},!1,function(b,M){return!R.isUndefined(M[b])});const i=t.metaTokens,r=t.visitor||u,s=t.dots,o=t.indexes,l=(t.Blob||typeof Blob<\"u\"&&Blob)&&R.isSpecCompliantForm(n);if(!R.isFunction(r))throw new TypeError(\"visitor must be a function\");function c(g){if(g===null)return\"\";if(R.isDate(g))return g.toISOString();if(!l&&R.isBlob(g))throw new ve(\"Blob is not supported. Use a Buffer instead.\");return R.isArrayBuffer(g)||R.isTypedArray(g)?l&&typeof Blob==\"function\"?new Blob([g]):Buffer.from(g):g}function u(g,b,M){let P=g;if(g&&!M&&typeof g==\"object\"){if(R.endsWith(b,\"{}\"))b=i?b:b.slice(0,-2),g=JSON.stringify(g);else if(R.isArray(g)&&e_(g)||(R.isFileList(g)||R.endsWith(b,\"[]\"))&&(P=R.toArray(g)))return b=Zh(b),P.forEach(function(v,C){!(R.isUndefined(v)||v===null)&&n.append(o===!0?eu([b],C,s):o===null?b:b+\"[]\",c(v))}),!1}return Aa(g)?!0:(n.append(eu(M,b,s),c(g)),!1)}const f=[],p=Object.assign(t_,{defaultVisitor:u,convertValue:c,isVisitable:Aa});function m(g,b){if(!R.isUndefined(g)){if(f.indexOf(g)!==-1)throw Error(\"Circular reference detected in \"+b.join(\".\"));f.push(g),R.forEach(g,function(P,A){(!(R.isUndefined(P)||P===null)&&r.call(n,P,R.isString(A)?A.trim():A,b,p))===!0&&m(P,b?b.concat(A):[A])}),f.pop()}}if(!R.isObject(e))throw new TypeError(\"data must be an object\");return m(e),n}function tu(e){const n={\"!\":\"%21\",\"'\":\"%27\",\"(\":\"%28\",\")\":\"%29\",\"~\":\"%7E\",\"%20\":\"+\",\"%00\":\"\\0\"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(i){return n[i]})}function kl(e,n){this._pairs=[],e&&Eo(e,this,n)}const Gh=kl.prototype;Gh.append=function(n,t){this._pairs.push([n,t])};Gh.toString=function(n){const t=n?function(i){return n.call(this,i,tu)}:tu;return this._pairs.map(function(r){return t(r[0])+\"=\"+t(r[1])},\"\").join(\"&\")};function n_(e){return encodeURIComponent(e).replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%20/g,\"+\").replace(/%5B/gi,\"[\").replace(/%5D/gi,\"]\")}function Jh(e,n,t){if(!n)return e;const i=t&&t.encode||n_,r=t&&t.serialize;let s;if(r?s=r(n,t):s=R.isURLSearchParams(n)?n.toString():new kl(n,t).toString(i),s){const o=e.indexOf(\"#\");o!==-1&&(e=e.slice(0,o)),e+=(e.indexOf(\"?\")===-1?\"?\":\"&\")+s}return e}class i_{constructor(){this.handlers=[]}use(n,t,i){return this.handlers.push({fulfilled:n,rejected:t,synchronous:i?i.synchronous:!1,runWhen:i?i.runWhen:null}),this.handlers.length-1}eject(n){this.handlers[n]&&(this.handlers[n]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(n){R.forEach(this.handlers,function(i){i!==null&&n(i)})}}const nu=i_,Xh={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},r_=typeof URLSearchParams<\"u\"?URLSearchParams:kl,s_=typeof FormData<\"u\"?FormData:null,o_=typeof Blob<\"u\"?Blob:null,a_={isBrowser:!0,classes:{URLSearchParams:r_,FormData:s_,Blob:o_},protocols:[\"http\",\"https\",\"file\",\"blob\",\"url\",\"data\"]},Rl=typeof window<\"u\"&&typeof document<\"u\",l_=(e=>Rl&&[\"ReactNative\",\"NativeScript\",\"NS\"].indexOf(e)<0)(typeof navigator<\"u\"&&navigator.product),c_=(()=>typeof WorkerGlobalScope<\"u\"&&self instanceof WorkerGlobalScope&&typeof self.importScripts==\"function\")(),u_=Rl&&window.location.href||\"http://localhost\",f_=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Rl,hasStandardBrowserEnv:l_,hasStandardBrowserWebWorkerEnv:c_,origin:u_},Symbol.toStringTag,{value:\"Module\"})),un={...f_,...a_};function d_(e,n){return Eo(e,new un.classes.URLSearchParams,Object.assign({visitor:function(t,i,r,s){return un.isNode&&R.isBuffer(t)?(this.append(i,t.toString(\"base64\")),!1):s.defaultVisitor.apply(this,arguments)}},n))}function h_(e){return R.matchAll(/\\w+|\\[(\\w*)]/g,e).map(n=>n[0]===\"[]\"?\"\":n[1]||n[0])}function p_(e){const n={},t=Object.keys(e);let i;const r=t.length;let s;for(i=0;i<r;i++)s=t[i],n[s]=e[s];return n}function Qh(e){function n(t,i,r,s){let o=t[s++];if(o===\"__proto__\")return!0;const a=Number.isFinite(+o),l=s>=t.length;return o=!o&&R.isArray(r)?r.length:o,l?(R.hasOwnProp(r,o)?r[o]=[r[o],i]:r[o]=i,!a):((!r[o]||!R.isObject(r[o]))&&(r[o]=[]),n(t,i,r[o],s)&&R.isArray(r[o])&&(r[o]=p_(r[o])),!a)}if(R.isFormData(e)&&R.isFunction(e.entries)){const t={};return R.forEachEntry(e,(i,r)=>{n(h_(i),r,t,0)}),t}return null}function m_(e,n,t){if(R.isString(e))try{return(n||JSON.parse)(e),R.trim(e)}catch(i){if(i.name!==\"SyntaxError\")throw i}return(t||JSON.stringify)(e)}const Pl={transitional:Xh,adapter:[\"xhr\",\"http\",\"fetch\"],transformRequest:[function(n,t){const i=t.getContentType()||\"\",r=i.indexOf(\"application/json\")>-1,s=R.isObject(n);if(s&&R.isHTMLForm(n)&&(n=new FormData(n)),R.isFormData(n))return r?JSON.stringify(Qh(n)):n;if(R.isArrayBuffer(n)||R.isBuffer(n)||R.isStream(n)||R.isFile(n)||R.isBlob(n)||R.isReadableStream(n))return n;if(R.isArrayBufferView(n))return n.buffer;if(R.isURLSearchParams(n))return t.setContentType(\"application/x-www-form-urlencoded;charset=utf-8\",!1),n.toString();let a;if(s){if(i.indexOf(\"application/x-www-form-urlencoded\")>-1)return d_(n,this.formSerializer).toString();if((a=R.isFileList(n))||i.indexOf(\"multipart/form-data\")>-1){const l=this.env&&this.env.FormData;return Eo(a?{\"files[]\":n}:n,l&&new l,this.formSerializer)}}return s||r?(t.setContentType(\"application/json\",!1),m_(n)):n}],transformResponse:[function(n){const t=this.transitional||Pl.transitional,i=t&&t.forcedJSONParsing,r=this.responseType===\"json\";if(R.isResponse(n)||R.isReadableStream(n))return n;if(n&&R.isString(n)&&(i&&!this.responseType||r)){const o=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(n)}catch(a){if(o)throw a.name===\"SyntaxError\"?ve.from(a,ve.ERR_BAD_RESPONSE,this,null,this.response):a}}return n}],timeout:0,xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",maxContentLength:-1,maxBodyLength:-1,env:{FormData:un.classes.FormData,Blob:un.classes.Blob},validateStatus:function(n){return n>=200&&n<300},headers:{common:{Accept:\"application/json, text/plain, */*\",\"Content-Type\":void 0}}};R.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\"],e=>{Pl.headers[e]={}});const Fl=Pl,g_=R.toObjectSet([\"age\",\"authorization\",\"content-length\",\"content-type\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modified\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agent\"]),y_=e=>{const n={};let t,i,r;return e&&e.split(`\n`).forEach(function(o){r=o.indexOf(\":\"),t=o.substring(0,r).trim().toLowerCase(),i=o.substring(r+1).trim(),!(!t||n[t]&&g_[t])&&(t===\"set-cookie\"?n[t]?n[t].push(i):n[t]=[i]:n[t]=n[t]?n[t]+\", \"+i:i)}),n},iu=Symbol(\"internals\");function tr(e){return e&&String(e).trim().toLowerCase()}function bs(e){return e===!1||e==null?e:R.isArray(e)?e.map(bs):String(e)}function v_(e){const n=Object.create(null),t=/([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;let i;for(;i=t.exec(e);)n[i[1]]=i[2];return n}const b_=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function jo(e,n,t,i,r){if(R.isFunction(i))return i.call(this,n,t);if(r&&(n=t),!!R.isString(n)){if(R.isString(i))return n.indexOf(i)!==-1;if(R.isRegExp(i))return i.test(n)}}function __(e){return e.trim().toLowerCase().replace(/([a-z\\d])(\\w*)/g,(n,t,i)=>t.toUpperCase()+i)}function E_(e,n){const t=R.toCamelCase(\" \"+n);[\"get\",\"set\",\"has\"].forEach(i=>{Object.defineProperty(e,i+t,{value:function(r,s,o){return this[i].call(this,n,r,s,o)},configurable:!0})})}class So{constructor(n){n&&this.set(n)}set(n,t,i){const r=this;function s(a,l,c){const u=tr(l);if(!u)throw new Error(\"header name must be a non-empty string\");const f=R.findKey(r,u);(!f||r[f]===void 0||c===!0||c===void 0&&r[f]!==!1)&&(r[f||l]=bs(a))}const o=(a,l)=>R.forEach(a,(c,u)=>s(c,u,l));if(R.isPlainObject(n)||n instanceof this.constructor)o(n,t);else if(R.isString(n)&&(n=n.trim())&&!b_(n))o(y_(n),t);else if(R.isHeaders(n))for(const[a,l]of n.entries())s(l,a,i);else n!=null&&s(t,n,i);return this}get(n,t){if(n=tr(n),n){const i=R.findKey(this,n);if(i){const r=this[i];if(!t)return r;if(t===!0)return v_(r);if(R.isFunction(t))return t.call(this,r,i);if(R.isRegExp(t))return t.exec(r);throw new TypeError(\"parser must be boolean|regexp|function\")}}}has(n,t){if(n=tr(n),n){const i=R.findKey(this,n);return!!(i&&this[i]!==void 0&&(!t||jo(this,this[i],i,t)))}return!1}delete(n,t){const i=this;let r=!1;function s(o){if(o=tr(o),o){const a=R.findKey(i,o);a&&(!t||jo(i,i[a],a,t))&&(delete i[a],r=!0)}}return R.isArray(n)?n.forEach(s):s(n),r}clear(n){const t=Object.keys(this);let i=t.length,r=!1;for(;i--;){const s=t[i];(!n||jo(this,this[s],s,n,!0))&&(delete this[s],r=!0)}return r}normalize(n){const t=this,i={};return R.forEach(this,(r,s)=>{const o=R.findKey(i,s);if(o){t[o]=bs(r),delete t[s];return}const a=n?__(s):String(s).trim();a!==s&&delete t[s],t[a]=bs(r),i[a]=!0}),this}concat(...n){return this.constructor.concat(this,...n)}toJSON(n){const t=Object.create(null);return R.forEach(this,(i,r)=>{i!=null&&i!==!1&&(t[r]=n&&R.isArray(i)?i.join(\", \"):i)}),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([n,t])=>n+\": \"+t).join(`\n`)}get[Symbol.toStringTag](){return\"AxiosHeaders\"}static from(n){return n instanceof this?n:new this(n)}static concat(n,...t){const i=new this(n);return t.forEach(r=>i.set(r)),i}static accessor(n){const i=(this[iu]=this[iu]={accessors:{}}).accessors,r=this.prototype;function s(o){const a=tr(o);i[a]||(E_(r,o),i[a]=!0)}return R.isArray(n)?n.forEach(s):s(n),this}}So.accessor([\"Content-Type\",\"Content-Length\",\"Accept\",\"Accept-Encoding\",\"User-Agent\",\"Authorization\"]);R.reduceDescriptors(So.prototype,({value:e},n)=>{let t=n[0].toUpperCase()+n.slice(1);return{get:()=>e,set(i){this[t]=i}}});R.freezeMethods(So);const fn=So;function Bo(e,n){const t=this||Fl,i=n||t,r=fn.from(i.headers);let s=i.data;return R.forEach(e,function(a){s=a.call(t,s,r.normalize(),n?n.status:void 0)}),r.normalize(),s}function ep(e){return!!(e&&e.__CANCEL__)}function Ji(e,n,t){ve.call(this,e??\"canceled\",ve.ERR_CANCELED,n,t),this.name=\"CanceledError\"}R.inherits(Ji,ve,{__CANCEL__:!0});function tp(e,n,t){const i=t.config.validateStatus;!t.status||!i||i(t.status)?e(t):n(new ve(\"Request failed with status code \"+t.status,[ve.ERR_BAD_REQUEST,ve.ERR_BAD_RESPONSE][Math.floor(t.status/100)-4],t.config,t.request,t))}function S_(e){const n=/^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(e);return n&&n[1]||\"\"}function w_(e,n){e=e||10;const t=new Array(e),i=new Array(e);let r=0,s=0,o;return n=n!==void 0?n:1e3,function(l){const c=Date.now(),u=i[s];o||(o=c),t[r]=l,i[r]=c;let f=s,p=0;for(;f!==r;)p+=t[f++],f=f%e;if(r=(r+1)%e,r===s&&(s=(s+1)%e),c-o<n)return;const m=u&&c-u;return m?Math.round(p*1e3/m):void 0}}function C_(e,n){let t=0;const i=1e3/n;let r=null;return function(){const o=this===!0,a=Date.now();if(o||a-t>i)return r&&(clearTimeout(r),r=null),t=a,e.apply(null,arguments);r||(r=setTimeout(()=>(r=null,t=Date.now(),e.apply(null,arguments)),i-(a-t)))}}const Us=(e,n,t=3)=>{let i=0;const r=w_(50,250);return C_(s=>{const o=s.loaded,a=s.lengthComputable?s.total:void 0,l=o-i,c=r(l),u=o<=a;i=o;const f={loaded:o,total:a,progress:a?o/a:void 0,bytes:l,rate:c||void 0,estimated:c&&a&&u?(a-o)/c:void 0,event:s,lengthComputable:a!=null};f[n?\"download\":\"upload\"]=!0,e(f)},t)},T_=un.hasStandardBrowserEnv?function(){const n=/(msie|trident)/i.test(navigator.userAgent),t=document.createElement(\"a\");let i;function r(s){let o=s;return n&&(t.setAttribute(\"href\",o),o=t.href),t.setAttribute(\"href\",o),{href:t.href,protocol:t.protocol?t.protocol.replace(/:$/,\"\"):\"\",host:t.host,search:t.search?t.search.replace(/^\\?/,\"\"):\"\",hash:t.hash?t.hash.replace(/^#/,\"\"):\"\",hostname:t.hostname,port:t.port,pathname:t.pathname.charAt(0)===\"/\"?t.pathname:\"/\"+t.pathname}}return i=r(window.location.href),function(o){const a=R.isString(o)?r(o):o;return a.protocol===i.protocol&&a.host===i.host}}():function(){return function(){return!0}}(),A_=un.hasStandardBrowserEnv?{write(e,n,t,i,r,s){const o=[e+\"=\"+encodeURIComponent(n)];R.isNumber(t)&&o.push(\"expires=\"+new Date(t).toGMTString()),R.isString(i)&&o.push(\"path=\"+i),R.isString(r)&&o.push(\"domain=\"+r),s===!0&&o.push(\"secure\"),document.cookie=o.join(\"; \")},read(e){const n=document.cookie.match(new RegExp(\"(^|;\\\\s*)(\"+e+\")=([^;]*)\"));return n?decodeURIComponent(n[3]):null},remove(e){this.write(e,\"\",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function O_(e){return/^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(e)}function x_(e,n){return n?e.replace(/\\/?\\/$/,\"\")+\"/\"+n.replace(/^\\/+/,\"\"):e}function np(e,n){return e&&!O_(n)?x_(e,n):n}const ru=e=>e instanceof fn?{...e}:e;function vi(e,n){n=n||{};const t={};function i(c,u,f){return R.isPlainObject(c)&&R.isPlainObject(u)?R.merge.call({caseless:f},c,u):R.isPlainObject(u)?R.merge({},u):R.isArray(u)?u.slice():u}function r(c,u,f){if(R.isUndefined(u)){if(!R.isUndefined(c))return i(void 0,c,f)}else return i(c,u,f)}function s(c,u){if(!R.isUndefined(u))return i(void 0,u)}function o(c,u){if(R.isUndefined(u)){if(!R.isUndefined(c))return i(void 0,c)}else return i(void 0,u)}function a(c,u,f){if(f in n)return i(c,u);if(f in e)return i(void 0,c)}const l={url:s,method:s,data:s,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,withXSRFToken:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,beforeRedirect:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:a,headers:(c,u)=>r(ru(c),ru(u),!0)};return R.forEach(Object.keys(Object.assign({},e,n)),function(u){const f=l[u]||r,p=f(e[u],n[u],u);R.isUndefined(p)&&f!==a||(t[u]=p)}),t}const ip=e=>{const n=vi({},e);let{data:t,withXSRFToken:i,xsrfHeaderName:r,xsrfCookieName:s,headers:o,auth:a}=n;n.headers=o=fn.from(o),n.url=Jh(np(n.baseURL,n.url),e.params,e.paramsSerializer),a&&o.set(\"Authorization\",\"Basic \"+btoa((a.username||\"\")+\":\"+(a.password?unescape(encodeURIComponent(a.password)):\"\")));let l;if(R.isFormData(t)){if(un.hasStandardBrowserEnv||un.hasStandardBrowserWebWorkerEnv)o.setContentType(void 0);else if((l=o.getContentType())!==!1){const[c,...u]=l?l.split(\";\").map(f=>f.trim()).filter(Boolean):[];o.setContentType([c||\"multipart/form-data\",...u].join(\"; \"))}}if(un.hasStandardBrowserEnv&&(i&&R.isFunction(i)&&(i=i(n)),i||i!==!1&&T_(n.url))){const c=r&&s&&A_.read(s);c&&o.set(r,c)}return n},D_=typeof XMLHttpRequest<\"u\",M_=D_&&function(e){return new Promise(function(t,i){const r=ip(e);let s=r.data;const o=fn.from(r.headers).normalize();let{responseType:a}=r,l;function c(){r.cancelToken&&r.cancelToken.unsubscribe(l),r.signal&&r.signal.removeEventListener(\"abort\",l)}let u=new XMLHttpRequest;u.open(r.method.toUpperCase(),r.url,!0),u.timeout=r.timeout;function f(){if(!u)return;const m=fn.from(\"getAllResponseHeaders\"in u&&u.getAllResponseHeaders()),b={data:!a||a===\"text\"||a===\"json\"?u.responseText:u.response,status:u.status,statusText:u.statusText,headers:m,config:e,request:u};tp(function(P){t(P),c()},function(P){i(P),c()},b),u=null}\"onloadend\"in u?u.onloadend=f:u.onreadystatechange=function(){!u||u.readyState!==4||u.status===0&&!(u.responseURL&&u.responseURL.indexOf(\"file:\")===0)||setTimeout(f)},u.onabort=function(){u&&(i(new ve(\"Request aborted\",ve.ECONNABORTED,r,u)),u=null)},u.onerror=function(){i(new ve(\"Network Error\",ve.ERR_NETWORK,r,u)),u=null},u.ontimeout=function(){let g=r.timeout?\"timeout of \"+r.timeout+\"ms exceeded\":\"timeout exceeded\";const b=r.transitional||Xh;r.timeoutErrorMessage&&(g=r.timeoutErrorMessage),i(new ve(g,b.clarifyTimeoutError?ve.ETIMEDOUT:ve.ECONNABORTED,r,u)),u=null},s===void 0&&o.setContentType(null),\"setRequestHeader\"in u&&R.forEach(o.toJSON(),function(g,b){u.setRequestHeader(b,g)}),R.isUndefined(r.withCredentials)||(u.withCredentials=!!r.withCredentials),a&&a!==\"json\"&&(u.responseType=r.responseType),typeof r.onDownloadProgress==\"function\"&&u.addEventListener(\"progress\",Us(r.onDownloadProgress,!0)),typeof r.onUploadProgress==\"function\"&&u.upload&&u.upload.addEventListener(\"progress\",Us(r.onUploadProgress)),(r.cancelToken||r.signal)&&(l=m=>{u&&(i(!m||m.type?new Ji(null,e,u):m),u.abort(),u=null)},r.cancelToken&&r.cancelToken.subscribe(l),r.signal&&(r.signal.aborted?l():r.signal.addEventListener(\"abort\",l)));const p=S_(r.url);if(p&&un.protocols.indexOf(p)===-1){i(new ve(\"Unsupported protocol \"+p+\":\",ve.ERR_BAD_REQUEST,e));return}u.send(s||null)})},N_=(e,n)=>{let t=new AbortController,i;const r=function(l){if(!i){i=!0,o();const c=l instanceof Error?l:this.reason;t.abort(c instanceof ve?c:new Ji(c instanceof Error?c.message:c))}};let s=n&&setTimeout(()=>{r(new ve(`timeout ${n} of ms exceeded`,ve.ETIMEDOUT))},n);const o=()=>{e&&(s&&clearTimeout(s),s=null,e.forEach(l=>{l&&(l.removeEventListener?l.removeEventListener(\"abort\",r):l.unsubscribe(r))}),e=null)};e.forEach(l=>l&&l.addEventListener&&l.addEventListener(\"abort\",r));const{signal:a}=t;return a.unsubscribe=o,[a,()=>{s&&clearTimeout(s),s=null}]},I_=N_,k_=function*(e,n){let t=e.byteLength;if(!n||t<n){yield e;return}let i=0,r;for(;i<t;)r=i+n,yield e.slice(i,r),i=r},R_=async function*(e,n,t){for await(const i of e)yield*k_(ArrayBuffer.isView(i)?i:await t(String(i)),n)},su=(e,n,t,i,r)=>{const s=R_(e,n,r);let o=0;return new ReadableStream({type:\"bytes\",async pull(a){const{done:l,value:c}=await s.next();if(l){a.close(),i();return}let u=c.byteLength;t&&t(o+=u),a.enqueue(new Uint8Array(c))},cancel(a){return i(a),s.return()}},{highWaterMark:2})},ou=(e,n)=>{const t=e!=null;return i=>setTimeout(()=>n({lengthComputable:t,total:e,loaded:i}))},wo=typeof fetch==\"function\"&&typeof Request==\"function\"&&typeof Response==\"function\",rp=wo&&typeof ReadableStream==\"function\",Oa=wo&&(typeof TextEncoder==\"function\"?(e=>n=>e.encode(n))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),P_=rp&&(()=>{let e=!1;const n=new Request(un.origin,{body:new ReadableStream,method:\"POST\",get duplex(){return e=!0,\"half\"}}).headers.has(\"Content-Type\");return e&&!n})(),au=64*1024,xa=rp&&!!(()=>{try{return R.isReadableStream(new Response(\"\").body)}catch{}})(),qs={stream:xa&&(e=>e.body)};wo&&(e=>{[\"text\",\"arrayBuffer\",\"blob\",\"formData\",\"stream\"].forEach(n=>{!qs[n]&&(qs[n]=R.isFunction(e[n])?t=>t[n]():(t,i)=>{throw new ve(`Response type '${n}' is not supported`,ve.ERR_NOT_SUPPORT,i)})})})(new Response);const F_=async e=>{if(e==null)return 0;if(R.isBlob(e))return e.size;if(R.isSpecCompliantForm(e))return(await new Request(e).arrayBuffer()).byteLength;if(R.isArrayBufferView(e))return e.byteLength;if(R.isURLSearchParams(e)&&(e=e+\"\"),R.isString(e))return(await Oa(e)).byteLength},L_=async(e,n)=>{const t=R.toFiniteNumber(e.getContentLength());return t??F_(n)},V_=wo&&(async e=>{let{url:n,method:t,data:i,signal:r,cancelToken:s,timeout:o,onDownloadProgress:a,onUploadProgress:l,responseType:c,headers:u,withCredentials:f=\"same-origin\",fetchOptions:p}=ip(e);c=c?(c+\"\").toLowerCase():\"text\";let[m,g]=r||s||o?I_([r,s],o):[],b,M;const P=()=>{!b&&setTimeout(()=>{m&&m.unsubscribe()}),b=!0};let A;try{if(l&&P_&&t!==\"get\"&&t!==\"head\"&&(A=await L_(u,i))!==0){let O=new Request(n,{method:\"POST\",body:i,duplex:\"half\"}),L;R.isFormData(i)&&(L=O.headers.get(\"content-type\"))&&u.setContentType(L),O.body&&(i=su(O.body,au,ou(A,Us(l)),null,Oa))}R.isString(f)||(f=f?\"cors\":\"omit\"),M=new Request(n,{...p,signal:m,method:t.toUpperCase(),headers:u.normalize().toJSON(),body:i,duplex:\"half\",withCredentials:f});let v=await fetch(M);const C=xa&&(c===\"stream\"||c===\"response\");if(xa&&(a||C)){const O={};[\"status\",\"statusText\",\"headers\"].forEach(F=>{O[F]=v[F]});const L=R.toFiniteNumber(v.headers.get(\"content-length\"));v=new Response(su(v.body,au,a&&ou(L,Us(a,!0)),C&&P,Oa),O)}c=c||\"text\";let D=await qs[R.findKey(qs,c)||\"text\"](v,e);return!C&&P(),g&&g(),await new Promise((O,L)=>{tp(O,L,{data:D,headers:fn.from(v.headers),status:v.status,statusText:v.statusText,config:e,request:M})})}catch(v){throw P(),v&&v.name===\"TypeError\"&&/fetch/i.test(v.message)?Object.assign(new ve(\"Network Error\",ve.ERR_NETWORK,e,M),{cause:v.cause||v}):ve.from(v,v&&v.code,e,M)}}),Da={http:Qb,xhr:M_,fetch:V_};R.forEach(Da,(e,n)=>{if(e){try{Object.defineProperty(e,\"name\",{value:n})}catch{}Object.defineProperty(e,\"adapterName\",{value:n})}});const lu=e=>`- ${e}`,$_=e=>R.isFunction(e)||e===null||e===!1,sp={getAdapter:e=>{e=R.isArray(e)?e:[e];const{length:n}=e;let t,i;const r={};for(let s=0;s<n;s++){t=e[s];let o;if(i=t,!$_(t)&&(i=Da[(o=String(t)).toLowerCase()],i===void 0))throw new ve(`Unknown adapter '${o}'`);if(i)break;r[o||\"#\"+s]=i}if(!i){const s=Object.entries(r).map(([a,l])=>`adapter ${a} `+(l===!1?\"is not supported by the environment\":\"is not available in the build\"));let o=n?s.length>1?`since :\n`+s.map(lu).join(`\n`):\" \"+lu(s[0]):\"as no adapter specified\";throw new ve(\"There is no suitable adapter to dispatch the request \"+o,\"ERR_NOT_SUPPORT\")}return i},adapters:Da};function Ho(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ji(null,e)}function cu(e){return Ho(e),e.headers=fn.from(e.headers),e.data=Bo.call(e,e.transformRequest),[\"post\",\"put\",\"patch\"].indexOf(e.method)!==-1&&e.headers.setContentType(\"application/x-www-form-urlencoded\",!1),sp.getAdapter(e.adapter||Fl.adapter)(e).then(function(i){return Ho(e),i.data=Bo.call(e,e.transformResponse,i),i.headers=fn.from(i.headers),i},function(i){return ep(i)||(Ho(e),i&&i.response&&(i.response.data=Bo.call(e,e.transformResponse,i.response),i.response.headers=fn.from(i.response.headers))),Promise.reject(i)})}const op=\"1.7.2\",Ll={};[\"object\",\"boolean\",\"number\",\"function\",\"string\",\"symbol\"].forEach((e,n)=>{Ll[e]=function(i){return typeof i===e||\"a\"+(n<1?\"n \":\" \")+e}});const uu={};Ll.transitional=function(n,t,i){function r(s,o){return\"[Axios v\"+op+\"] Transitional option '\"+s+\"'\"+o+(i?\". \"+i:\"\")}return(s,o,a)=>{if(n===!1)throw new ve(r(o,\" has been removed\"+(t?\" in \"+t:\"\")),ve.ERR_DEPRECATED);return t&&!uu[o]&&(uu[o]=!0,console.warn(r(o,\" has been deprecated since v\"+t+\" and will be removed in the near future\"))),n?n(s,o,a):!0}};function j_(e,n,t){if(typeof e!=\"object\")throw new ve(\"options must be an object\",ve.ERR_BAD_OPTION_VALUE);const i=Object.keys(e);let r=i.length;for(;r-- >0;){const s=i[r],o=n[s];if(o){const a=e[s],l=a===void 0||o(a,s,e);if(l!==!0)throw new ve(\"option \"+s+\" must be \"+l,ve.ERR_BAD_OPTION_VALUE);continue}if(t!==!0)throw new ve(\"Unknown option \"+s,ve.ERR_BAD_OPTION)}}const Ma={assertOptions:j_,validators:Ll},In=Ma.validators;let zs=class{constructor(n){this.defaults=n,this.interceptors={request:new nu,response:new nu}}async request(n,t){try{return await this._request(n,t)}catch(i){if(i instanceof Error){let r;Error.captureStackTrace?Error.captureStackTrace(r={}):r=new Error;const s=r.stack?r.stack.replace(/^.+\\n/,\"\"):\"\";try{i.stack?s&&!String(i.stack).endsWith(s.replace(/^.+\\n.+\\n/,\"\"))&&(i.stack+=`\n`+s):i.stack=s}catch{}}throw i}}_request(n,t){typeof n==\"string\"?(t=t||{},t.url=n):t=n||{},t=vi(this.defaults,t);const{transitional:i,paramsSerializer:r,headers:s}=t;i!==void 0&&Ma.assertOptions(i,{silentJSONParsing:In.transitional(In.boolean),forcedJSONParsing:In.transitional(In.boolean),clarifyTimeoutError:In.transitional(In.boolean)},!1),r!=null&&(R.isFunction(r)?t.paramsSerializer={serialize:r}:Ma.assertOptions(r,{encode:In.function,serialize:In.function},!0)),t.method=(t.method||this.defaults.method||\"get\").toLowerCase();let o=s&&R.merge(s.common,s[t.method]);s&&R.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\",\"common\"],g=>{delete s[g]}),t.headers=fn.concat(o,s);const a=[];let l=!0;this.interceptors.request.forEach(function(b){typeof b.runWhen==\"function\"&&b.runWhen(t)===!1||(l=l&&b.synchronous,a.unshift(b.fulfilled,b.rejected))});const c=[];this.interceptors.response.forEach(function(b){c.push(b.fulfilled,b.rejected)});let u,f=0,p;if(!l){const g=[cu.bind(this),void 0];for(g.unshift.apply(g,a),g.push.apply(g,c),p=g.length,u=Promise.resolve(t);f<p;)u=u.then(g[f++],g[f++]);return u}p=a.length;let m=t;for(f=0;f<p;){const g=a[f++],b=a[f++];try{m=g(m)}catch(M){b.call(this,M);break}}try{u=cu.call(this,m)}catch(g){return Promise.reject(g)}for(f=0,p=c.length;f<p;)u=u.then(c[f++],c[f++]);return u}getUri(n){n=vi(this.defaults,n);const t=np(n.baseURL,n.url);return Jh(t,n.params,n.paramsSerializer)}};R.forEach([\"delete\",\"get\",\"head\",\"options\"],function(n){zs.prototype[n]=function(t,i){return this.request(vi(i||{},{method:n,url:t,data:(i||{}).data}))}});R.forEach([\"post\",\"put\",\"patch\"],function(n){function t(i){return function(s,o,a){return this.request(vi(a||{},{method:n,headers:i?{\"Content-Type\":\"multipart/form-data\"}:{},url:s,data:o}))}}zs.prototype[n]=t(),zs.prototype[n+\"Form\"]=t(!0)});const _s=zs;class Vl{constructor(n){if(typeof n!=\"function\")throw new TypeError(\"executor must be a function.\");let t;this.promise=new Promise(function(s){t=s});const i=this;this.promise.then(r=>{if(!i._listeners)return;let s=i._listeners.length;for(;s-- >0;)i._listeners[s](r);i._listeners=null}),this.promise.then=r=>{let s;const o=new Promise(a=>{i.subscribe(a),s=a}).then(r);return o.cancel=function(){i.unsubscribe(s)},o},n(function(s,o,a){i.reason||(i.reason=new Ji(s,o,a),t(i.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(n){if(this.reason){n(this.reason);return}this._listeners?this._listeners.push(n):this._listeners=[n]}unsubscribe(n){if(!this._listeners)return;const t=this._listeners.indexOf(n);t!==-1&&this._listeners.splice(t,1)}static source(){let n;return{token:new Vl(function(r){n=r}),cancel:n}}}const B_=Vl;function H_(e){return function(t){return e.apply(null,t)}}function U_(e){return R.isObject(e)&&e.isAxiosError===!0}const Na={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Na).forEach(([e,n])=>{Na[n]=e});const q_=Na;function ap(e){const n=new _s(e),t=$h(_s.prototype.request,n);return R.extend(t,_s.prototype,n,{allOwnKeys:!0}),R.extend(t,n,null,{allOwnKeys:!0}),t.create=function(r){return ap(vi(e,r))},t}const nt=ap(Fl);nt.Axios=_s;nt.CanceledError=Ji;nt.CancelToken=B_;nt.isCancel=ep;nt.VERSION=op;nt.toFormData=Eo;nt.AxiosError=ve;nt.Cancel=nt.CanceledError;nt.all=function(n){return Promise.all(n)};nt.spread=H_;nt.isAxiosError=U_;nt.mergeConfig=vi;nt.AxiosHeaders=fn;nt.formToJSON=e=>Qh(R.isHTMLForm(e)?new FormData(e):e);nt.getAdapter=sp.getAdapter;nt.HttpStatusCode=q_;nt.default=nt;const lp=nt;window.axios=lp;window.axios.defaults.headers.common[\"X-Requested-With\"]=\"XMLHttpRequest\";const z_={install(e){e.config.globalProperties.$axios=lp}};function K_(e){return{all:e=e||new Map,on:function(n,t){var i=e.get(n);i?i.push(t):e.set(n,[t])},off:function(n,t){var i=e.get(n);i&&(t?i.splice(i.indexOf(t)>>>0,1):e.set(n,[]))},emit:function(n,t){var i=e.get(n);i&&i.slice().map(function(r){r(t)}),(i=e.get(\"*\"))&&i.slice().map(function(r){r(n,t)})}}}const cp=K_();window.emitter=cp;const W_={install:(e,n)=>{e.config.globalProperties.$emitter=cp}};var Uo=[\"onChange\",\"onClose\",\"onDayCreate\",\"onDestroy\",\"onKeyDown\",\"onMonthChange\",\"onOpen\",\"onParseConfig\",\"onReady\",\"onValueUpdate\",\"onYearChange\",\"onPreCalendarPosition\"],Li={_disable:[],allowInput:!1,allowInvalidPreload:!1,altFormat:\"F j, Y\",altInput:!1,altInputClass:\"form-control input\",animate:typeof window==\"object\"&&window.navigator.userAgent.indexOf(\"MSIE\")===-1,ariaDateFormat:\"F j, Y\",autoFillDefaultTime:!0,clickOpens:!0,closeOnSelect:!0,conjunction:\", \",dateFormat:\"Y-m-d\",defaultHour:12,defaultMinute:0,defaultSeconds:0,disable:[],disableMobile:!1,enableSeconds:!1,enableTime:!1,errorHandler:function(e){return typeof console<\"u\"&&console.warn(e)},getWeek:function(e){var n=new Date(e.getTime());n.setHours(0,0,0,0),n.setDate(n.getDate()+3-(n.getDay()+6)%7);var t=new Date(n.getFullYear(),0,4);return 1+Math.round(((n.getTime()-t.getTime())/864e5-3+(t.getDay()+6)%7)/7)},hourIncrement:1,ignoredFocusElements:[],inline:!1,locale:\"default\",minuteIncrement:5,mode:\"single\",monthSelectorType:\"dropdown\",nextArrow:\"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>\",noCalendar:!1,now:new Date,onChange:[],onClose:[],onDayCreate:[],onDestroy:[],onKeyDown:[],onMonthChange:[],onOpen:[],onParseConfig:[],onReady:[],onValueUpdate:[],onYearChange:[],onPreCalendarPosition:[],plugins:[],position:\"auto\",positionElement:void 0,prevArrow:\"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>\",shorthandCurrentMonth:!1,showMonths:1,static:!1,time_24hr:!1,weekNumbers:!1,wrap:!1},Tr={weekdays:{shorthand:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],longhand:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]},months:{shorthand:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],longhand:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"]},daysInMonth:[31,28,31,30,31,30,31,31,30,31,30,31],firstDayOfWeek:0,ordinal:function(e){var n=e%100;if(n>3&&n<21)return\"th\";switch(n%10){case 1:return\"st\";case 2:return\"nd\";case 3:return\"rd\";default:return\"th\"}},rangeSeparator:\" to \",weekAbbreviation:\"Wk\",scrollTitle:\"Scroll to increment\",toggleTitle:\"Click to toggle\",amPM:[\"AM\",\"PM\"],yearAriaLabel:\"Year\",monthAriaLabel:\"Month\",hourAriaLabel:\"Hour\",minuteAriaLabel:\"Minute\",time_24hr:!1},kt=function(e,n){return n===void 0&&(n=2),(\"000\"+e).slice(n*-1)},Jt=function(e){return e===!0?1:0};function fu(e,n){var t;return function(){var i=this,r=arguments;clearTimeout(t),t=setTimeout(function(){return e.apply(i,r)},n)}}var qo=function(e){return e instanceof Array?e:[e]};function Tt(e,n,t){if(t===!0)return e.classList.add(n);e.classList.remove(n)}function ke(e,n,t){var i=window.document.createElement(e);return n=n||\"\",t=t||\"\",i.className=n,t!==void 0&&(i.textContent=t),i}function ns(e){for(;e.firstChild;)e.removeChild(e.firstChild)}function up(e,n){if(n(e))return e;if(e.parentNode)return up(e.parentNode,n)}function is(e,n){var t=ke(\"div\",\"numInputWrapper\"),i=ke(\"input\",\"numInput \"+e),r=ke(\"span\",\"arrowUp\"),s=ke(\"span\",\"arrowDown\");if(navigator.userAgent.indexOf(\"MSIE 9.0\")===-1?i.type=\"number\":(i.type=\"text\",i.pattern=\"\\\\d*\"),n!==void 0)for(var o in n)i.setAttribute(o,n[o]);return t.appendChild(i),t.appendChild(r),t.appendChild(s),t}function jt(e){try{if(typeof e.composedPath==\"function\"){var n=e.composedPath();return n[0]}return e.target}catch{return e.target}}var zo=function(){},Ks=function(e,n,t){return t.months[n?\"shorthand\":\"longhand\"][e]},Y_={D:zo,F:function(e,n,t){e.setMonth(t.months.longhand.indexOf(n))},G:function(e,n){e.setHours((e.getHours()>=12?12:0)+parseFloat(n))},H:function(e,n){e.setHours(parseFloat(n))},J:function(e,n){e.setDate(parseFloat(n))},K:function(e,n,t){e.setHours(e.getHours()%12+12*Jt(new RegExp(t.amPM[1],\"i\").test(n)))},M:function(e,n,t){e.setMonth(t.months.shorthand.indexOf(n))},S:function(e,n){e.setSeconds(parseFloat(n))},U:function(e,n){return new Date(parseFloat(n)*1e3)},W:function(e,n,t){var i=parseInt(n),r=new Date(e.getFullYear(),0,2+(i-1)*7,0,0,0,0);return r.setDate(r.getDate()-r.getDay()+t.firstDayOfWeek),r},Y:function(e,n){e.setFullYear(parseFloat(n))},Z:function(e,n){return new Date(n)},d:function(e,n){e.setDate(parseFloat(n))},h:function(e,n){e.setHours((e.getHours()>=12?12:0)+parseFloat(n))},i:function(e,n){e.setMinutes(parseFloat(n))},j:function(e,n){e.setDate(parseFloat(n))},l:zo,m:function(e,n){e.setMonth(parseFloat(n)-1)},n:function(e,n){e.setMonth(parseFloat(n)-1)},s:function(e,n){e.setSeconds(parseFloat(n))},u:function(e,n){return new Date(parseFloat(n))},w:zo,y:function(e,n){e.setFullYear(2e3+parseFloat(n))}},ii={D:\"\",F:\"\",G:\"(\\\\d\\\\d|\\\\d)\",H:\"(\\\\d\\\\d|\\\\d)\",J:\"(\\\\d\\\\d|\\\\d)\\\\w+\",K:\"\",M:\"\",S:\"(\\\\d\\\\d|\\\\d)\",U:\"(.+)\",W:\"(\\\\d\\\\d|\\\\d)\",Y:\"(\\\\d{4})\",Z:\"(.+)\",d:\"(\\\\d\\\\d|\\\\d)\",h:\"(\\\\d\\\\d|\\\\d)\",i:\"(\\\\d\\\\d|\\\\d)\",j:\"(\\\\d\\\\d|\\\\d)\",l:\"\",m:\"(\\\\d\\\\d|\\\\d)\",n:\"(\\\\d\\\\d|\\\\d)\",s:\"(\\\\d\\\\d|\\\\d)\",u:\"(.+)\",w:\"(\\\\d\\\\d|\\\\d)\",y:\"(\\\\d{2})\"},fr={Z:function(e){return e.toISOString()},D:function(e,n,t){return n.weekdays.shorthand[fr.w(e,n,t)]},F:function(e,n,t){return Ks(fr.n(e,n,t)-1,!1,n)},G:function(e,n,t){return kt(fr.h(e,n,t))},H:function(e){return kt(e.getHours())},J:function(e,n){return n.ordinal!==void 0?e.getDate()+n.ordinal(e.getDate()):e.getDate()},K:function(e,n){return n.amPM[Jt(e.getHours()>11)]},M:function(e,n){return Ks(e.getMonth(),!0,n)},S:function(e){return kt(e.getSeconds())},U:function(e){return e.getTime()/1e3},W:function(e,n,t){return t.getWeek(e)},Y:function(e){return kt(e.getFullYear(),4)},d:function(e){return kt(e.getDate())},h:function(e){return e.getHours()%12?e.getHours()%12:12},i:function(e){return kt(e.getMinutes())},j:function(e){return e.getDate()},l:function(e,n){return n.weekdays.longhand[e.getDay()]},m:function(e){return kt(e.getMonth()+1)},n:function(e){return e.getMonth()+1},s:function(e){return e.getSeconds()},u:function(e){return e.getTime()},w:function(e){return e.getDay()},y:function(e){return String(e.getFullYear()).substring(2)}},fp=function(e){var n=e.config,t=n===void 0?Li:n,i=e.l10n,r=i===void 0?Tr:i,s=e.isMobile,o=s===void 0?!1:s;return function(a,l,c){var u=c||r;return t.formatDate!==void 0&&!o?t.formatDate(a,l,u):l.split(\"\").map(function(f,p,m){return fr[f]&&m[p-1]!==\"\\\\\"?fr[f](a,u,t):f!==\"\\\\\"?f:\"\"}).join(\"\")}},Ia=function(e){var n=e.config,t=n===void 0?Li:n,i=e.l10n,r=i===void 0?Tr:i;return function(s,o,a,l){if(!(s!==0&&!s)){var c=l||r,u,f=s;if(s instanceof Date)u=new Date(s.getTime());else if(typeof s!=\"string\"&&s.toFixed!==void 0)u=new Date(s);else if(typeof s==\"string\"){var p=o||(t||Li).dateFormat,m=String(s).trim();if(m===\"today\")u=new Date,a=!0;else if(t&&t.parseDate)u=t.parseDate(s,p);else if(/Z$/.test(m)||/GMT$/.test(m))u=new Date(s);else{for(var g=void 0,b=[],M=0,P=0,A=\"\";M<p.length;M++){var v=p[M],C=v===\"\\\\\",D=p[M-1]===\"\\\\\"||C;if(ii[v]&&!D){A+=ii[v];var O=new RegExp(A).exec(s);O&&(g=!0)&&b[v!==\"Y\"?\"push\":\"unshift\"]({fn:Y_[v],val:O[++P]})}else C||(A+=\".\")}u=!t||!t.noCalendar?new Date(new Date().getFullYear(),0,1,0,0,0,0):new Date(new Date().setHours(0,0,0,0)),b.forEach(function(L){var F=L.fn,T=L.val;return u=F(u,T,c)||u}),u=g?u:void 0}}if(!(u instanceof Date&&!isNaN(u.getTime()))){t.errorHandler(new Error(\"Invalid date provided: \"+f));return}return a===!0&&u.setHours(0,0,0,0),u}}};function Bt(e,n,t){return t===void 0&&(t=!0),t!==!1?new Date(e.getTime()).setHours(0,0,0,0)-new Date(n.getTime()).setHours(0,0,0,0):e.getTime()-n.getTime()}var Z_=function(e,n,t){return e>Math.min(n,t)&&e<Math.max(n,t)},Ko=function(e,n,t){return e*3600+n*60+t},G_=function(e){var n=Math.floor(e/3600),t=(e-n*3600)/60;return[n,t,e-n*3600-t*60]},J_={DAY:864e5};function Wo(e){var n=e.defaultHour,t=e.defaultMinute,i=e.defaultSeconds;if(e.minDate!==void 0){var r=e.minDate.getHours(),s=e.minDate.getMinutes(),o=e.minDate.getSeconds();n<r&&(n=r),n===r&&t<s&&(t=s),n===r&&t===s&&i<o&&(i=e.minDate.getSeconds())}if(e.maxDate!==void 0){var a=e.maxDate.getHours(),l=e.maxDate.getMinutes();n=Math.min(n,a),n===a&&(t=Math.min(l,t)),n===a&&t===l&&(i=e.maxDate.getSeconds())}return{hours:n,minutes:t,seconds:i}}typeof Object.assign!=\"function\"&&(Object.assign=function(e){for(var n=[],t=1;t<arguments.length;t++)n[t-1]=arguments[t];if(!e)throw TypeError(\"Cannot convert undefined or null to object\");for(var i=function(a){a&&Object.keys(a).forEach(function(l){return e[l]=a[l]})},r=0,s=n;r<s.length;r++){var o=s[r];i(o)}return e});var vt=globalThis&&globalThis.__assign||function(){return vt=Object.assign||function(e){for(var n,t=1,i=arguments.length;t<i;t++){n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},vt.apply(this,arguments)},du=globalThis&&globalThis.__spreadArrays||function(){for(var e=0,n=0,t=arguments.length;n<t;n++)e+=arguments[n].length;for(var i=Array(e),r=0,n=0;n<t;n++)for(var s=arguments[n],o=0,a=s.length;o<a;o++,r++)i[r]=s[o];return i},X_=300;function Q_(e,n){var t={config:vt(vt({},Li),et.defaultConfig),l10n:Tr};t.parseDate=Ia({config:t.config,l10n:t.l10n}),t._handlers=[],t.pluginElements=[],t.loadedPlugins=[],t._bind=b,t._setHoursFromDate=p,t._positionCalendar=K,t.changeMonth=Ye,t.changeYear=de,t.clear=Ct,t.close=hn,t.onMouseOver=ct,t._createElement=ke,t.createDay=O,t.destroy=ht,t.isEnabled=Ie,t.jumpToDate=A,t.updateValue=Ue,t.open=_,t.redraw=j,t.set=pe,t.setDate=Le,t.toggle=he;function i(){t.utils={getDaysInMonth:function(d,h){return d===void 0&&(d=t.currentMonth),h===void 0&&(h=t.currentYear),d===1&&(h%4===0&&h%100!==0||h%400===0)?29:t.l10n.daysInMonth[d]}}}function r(){t.element=t.input=e,t.isOpen=!1,q(),B(),V(),S(),i(),t.isMobile||D(),P(),(t.selectedDates.length||t.config.noCalendar)&&(t.config.enableTime&&p(t.config.noCalendar?t.latestSelectedDateObj:void 0),Ue(!1)),a();var d=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);!t.isMobile&&d&&K(),J(\"onReady\")}function s(){var d;return((d=t.calendarContainer)===null||d===void 0?void 0:d.getRootNode()).activeElement||document.activeElement}function o(d){return d.bind(t)}function a(){var d=t.config;d.weekNumbers===!1&&d.showMonths===1||d.noCalendar!==!0&&window.requestAnimationFrame(function(){if(t.calendarContainer!==void 0&&(t.calendarContainer.style.visibility=\"hidden\",t.calendarContainer.style.display=\"block\"),t.daysContainer!==void 0){var h=(t.days.offsetWidth+1)*d.showMonths;t.daysContainer.style.width=h+\"px\",t.calendarContainer.style.width=h+(t.weekWrapper!==void 0?t.weekWrapper.offsetWidth:0)+\"px\",t.calendarContainer.style.removeProperty(\"visibility\"),t.calendarContainer.style.removeProperty(\"display\")}})}function l(d){if(t.selectedDates.length===0){var h=t.config.minDate===void 0||Bt(new Date,t.config.minDate)>=0?new Date:new Date(t.config.minDate.getTime()),w=Wo(t.config);h.setHours(w.hours,w.minutes,w.seconds,h.getMilliseconds()),t.selectedDates=[h],t.latestSelectedDateObj=h}d!==void 0&&d.type!==\"blur\"&&Xn(d);var I=t._input.value;f(),Ue(),t._input.value!==I&&t._debouncedChange()}function c(d,h){return d%12+12*Jt(h===t.l10n.amPM[1])}function u(d){switch(d%24){case 0:case 12:return 12;default:return d%12}}function f(){if(!(t.hourElement===void 0||t.minuteElement===void 0)){var d=(parseInt(t.hourElement.value.slice(-2),10)||0)%24,h=(parseInt(t.minuteElement.value,10)||0)%60,w=t.secondElement!==void 0?(parseInt(t.secondElement.value,10)||0)%60:0;t.amPM!==void 0&&(d=c(d,t.amPM.textContent));var I=t.config.minTime!==void 0||t.config.minDate&&t.minDateHasTime&&t.latestSelectedDateObj&&Bt(t.latestSelectedDateObj,t.config.minDate,!0)===0,Y=t.config.maxTime!==void 0||t.config.maxDate&&t.maxDateHasTime&&t.latestSelectedDateObj&&Bt(t.latestSelectedDateObj,t.config.maxDate,!0)===0;if(t.config.maxTime!==void 0&&t.config.minTime!==void 0&&t.config.minTime>t.config.maxTime){var ie=Ko(t.config.minTime.getHours(),t.config.minTime.getMinutes(),t.config.minTime.getSeconds()),_e=Ko(t.config.maxTime.getHours(),t.config.maxTime.getMinutes(),t.config.maxTime.getSeconds()),le=Ko(d,h,w);if(le>_e&&le<ie){var Se=G_(ie);d=Se[0],h=Se[1],w=Se[2]}}else{if(Y){var ae=t.config.maxTime!==void 0?t.config.maxTime:t.config.maxDate;d=Math.min(d,ae.getHours()),d===ae.getHours()&&(h=Math.min(h,ae.getMinutes())),h===ae.getMinutes()&&(w=Math.min(w,ae.getSeconds()))}if(I){var me=t.config.minTime!==void 0?t.config.minTime:t.config.minDate;d=Math.max(d,me.getHours()),d===me.getHours()&&h<me.getMinutes()&&(h=me.getMinutes()),h===me.getMinutes()&&(w=Math.max(w,me.getSeconds()))}}m(d,h,w)}}function p(d){var h=d||t.latestSelectedDateObj;h&&h instanceof Date&&m(h.getHours(),h.getMinutes(),h.getSeconds())}function m(d,h,w){t.latestSelectedDateObj!==void 0&&t.latestSelectedDateObj.setHours(d%24,h,w||0,0),!(!t.hourElement||!t.minuteElement||t.isMobile)&&(t.hourElement.value=kt(t.config.time_24hr?d:(12+d)%12+12*Jt(d%12===0)),t.minuteElement.value=kt(h),t.amPM!==void 0&&(t.amPM.textContent=t.l10n.amPM[Jt(d>=12)]),t.secondElement!==void 0&&(t.secondElement.value=kt(w)))}function g(d){var h=jt(d),w=parseInt(h.value)+(d.delta||0);(w/1e3>1||d.key===\"Enter\"&&!/[^\\d]/.test(w.toString()))&&de(w)}function b(d,h,w,I){if(h instanceof Array)return h.forEach(function(Y){return b(d,Y,w,I)});if(d instanceof Array)return d.forEach(function(Y){return b(Y,h,w,I)});d.addEventListener(h,w,I),t._handlers.push({remove:function(){return d.removeEventListener(h,w,I)}})}function M(){J(\"onChange\")}function P(){if(t.config.wrap&&[\"open\",\"close\",\"toggle\",\"clear\"].forEach(function(w){Array.prototype.forEach.call(t.element.querySelectorAll(\"[data-\"+w+\"]\"),function(I){return b(I,\"click\",t[w])})}),t.isMobile){ue();return}var d=fu(y,50);if(t._debouncedChange=fu(M,X_),t.daysContainer&&!/iPhone|iPad|iPod/i.test(navigator.userAgent)&&b(t.daysContainer,\"mouseover\",function(w){t.config.mode===\"range\"&&ct(jt(w))}),b(t._input,\"keydown\",lt),t.calendarContainer!==void 0&&b(t.calendarContainer,\"keydown\",lt),!t.config.inline&&!t.config.static&&b(window,\"resize\",d),window.ontouchstart!==void 0?b(window.document,\"touchstart\",ee):b(window.document,\"mousedown\",ee),b(window.document,\"focus\",ee,{capture:!0}),t.config.clickOpens===!0&&(b(t._input,\"focus\",t.open),b(t._input,\"click\",t.open)),t.daysContainer!==void 0&&(b(t.monthNav,\"click\",Dt),b(t.monthNav,[\"keyup\",\"increment\"],g),b(t.daysContainer,\"click\",ce)),t.timeContainer!==void 0&&t.minuteElement!==void 0&&t.hourElement!==void 0){var h=function(w){return jt(w).select()};b(t.timeContainer,[\"increment\"],l),b(t.timeContainer,\"blur\",l,{capture:!0}),b(t.timeContainer,\"click\",v),b([t.hourElement,t.minuteElement],[\"focus\",\"click\"],h),t.secondElement!==void 0&&b(t.secondElement,\"focus\",function(){return t.secondElement&&t.secondElement.select()}),t.amPM!==void 0&&b(t.amPM,\"click\",function(w){l(w)})}t.config.allowInput&&b(t._input,\"blur\",at)}function A(d,h){var w=d!==void 0?t.parseDate(d):t.latestSelectedDateObj||(t.config.minDate&&t.config.minDate>t.now?t.config.minDate:t.config.maxDate&&t.config.maxDate<t.now?t.config.maxDate:t.now),I=t.currentYear,Y=t.currentMonth;try{w!==void 0&&(t.currentYear=w.getFullYear(),t.currentMonth=w.getMonth())}catch(ie){ie.message=\"Invalid date supplied: \"+w,t.config.errorHandler(ie)}h&&t.currentYear!==I&&(J(\"onYearChange\"),z()),h&&(t.currentYear!==I||t.currentMonth!==Y)&&J(\"onMonthChange\"),t.redraw()}function v(d){var h=jt(d);~h.className.indexOf(\"arrow\")&&C(d,h.classList.contains(\"arrowUp\")?1:-1)}function C(d,h,w){var I=d&&jt(d),Y=w||I&&I.parentNode&&I.parentNode.firstChild,ie=ye(\"increment\");ie.delta=h,Y&&Y.dispatchEvent(ie)}function D(){var d=window.document.createDocumentFragment();if(t.calendarContainer=ke(\"div\",\"flatpickr-calendar\"),t.calendarContainer.tabIndex=-1,!t.config.noCalendar){if(d.appendChild(U()),t.innerContainer=ke(\"div\",\"flatpickr-innerContainer\"),t.config.weekNumbers){var h=wt(),w=h.weekWrapper,I=h.weekNumbers;t.innerContainer.appendChild(w),t.weekNumbers=I,t.weekWrapper=w}t.rContainer=ke(\"div\",\"flatpickr-rContainer\"),t.rContainer.appendChild(Q()),t.daysContainer||(t.daysContainer=ke(\"div\",\"flatpickr-days\"),t.daysContainer.tabIndex=-1),N(),t.rContainer.appendChild(t.daysContainer),t.innerContainer.appendChild(t.rContainer),d.appendChild(t.innerContainer)}t.config.enableTime&&d.appendChild(X()),Tt(t.calendarContainer,\"rangeMode\",t.config.mode===\"range\"),Tt(t.calendarContainer,\"animate\",t.config.animate===!0),Tt(t.calendarContainer,\"multiMonth\",t.config.showMonths>1),t.calendarContainer.appendChild(d);var Y=t.config.appendTo!==void 0&&t.config.appendTo.nodeType!==void 0;if((t.config.inline||t.config.static)&&(t.calendarContainer.classList.add(t.config.inline?\"inline\":\"static\"),t.config.inline&&(!Y&&t.element.parentNode?t.element.parentNode.insertBefore(t.calendarContainer,t._input.nextSibling):t.config.appendTo!==void 0&&t.config.appendTo.appendChild(t.calendarContainer)),t.config.static)){var ie=ke(\"div\",\"flatpickr-wrapper\");t.element.parentNode&&t.element.parentNode.insertBefore(ie,t.element),ie.appendChild(t.element),t.altInput&&ie.appendChild(t.altInput),ie.appendChild(t.calendarContainer)}!t.config.static&&!t.config.inline&&(t.config.appendTo!==void 0?t.config.appendTo:window.document.body).appendChild(t.calendarContainer)}function O(d,h,w,I){var Y=Ie(h,!0),ie=ke(\"span\",d,h.getDate().toString());return ie.dateObj=h,ie.$i=I,ie.setAttribute(\"aria-label\",t.formatDate(h,t.config.ariaDateFormat)),d.indexOf(\"hidden\")===-1&&Bt(h,t.now)===0&&(t.todayDateElem=ie,ie.classList.add(\"today\"),ie.setAttribute(\"aria-current\",\"date\")),Y?(ie.tabIndex=-1,Te(h)&&(ie.classList.add(\"selected\"),t.selectedDateElem=ie,t.config.mode===\"range\"&&(Tt(ie,\"startRange\",t.selectedDates[0]&&Bt(h,t.selectedDates[0],!0)===0),Tt(ie,\"endRange\",t.selectedDates[1]&&Bt(h,t.selectedDates[1],!0)===0),d===\"nextMonthDay\"&&ie.classList.add(\"inRange\")))):ie.classList.add(\"flatpickr-disabled\"),t.config.mode===\"range\"&&Ge(h)&&!Te(h)&&ie.classList.add(\"inRange\"),t.weekNumbers&&t.config.showMonths===1&&d!==\"prevMonthDay\"&&I%7===6&&t.weekNumbers.insertAdjacentHTML(\"beforeend\",\"<span class='flatpickr-day'>\"+t.config.getWeek(h)+\"</span>\"),J(\"onDayCreate\",ie),ie}function L(d){d.focus(),t.config.mode===\"range\"&&ct(d)}function F(d){for(var h=d>0?0:t.config.showMonths-1,w=d>0?t.config.showMonths:-1,I=h;I!=w;I+=d)for(var Y=t.daysContainer.children[I],ie=d>0?0:Y.children.length-1,_e=d>0?Y.children.length:-1,le=ie;le!=_e;le+=d){var Se=Y.children[le];if(Se.className.indexOf(\"hidden\")===-1&&Ie(Se.dateObj))return Se}}function T(d,h){for(var w=d.className.indexOf(\"Month\")===-1?d.dateObj.getMonth():t.currentMonth,I=h>0?t.config.showMonths:-1,Y=h>0?1:-1,ie=w-t.currentMonth;ie!=I;ie+=Y)for(var _e=t.daysContainer.children[ie],le=w-t.currentMonth===ie?d.$i+h:h<0?_e.children.length-1:0,Se=_e.children.length,ae=le;ae>=0&&ae<Se&&ae!=(h>0?Se:-1);ae+=Y){var me=_e.children[ae];if(me.className.indexOf(\"hidden\")===-1&&Ie(me.dateObj)&&Math.abs(d.$i-ae)>=Math.abs(h))return L(me)}t.changeMonth(Y),x(F(Y),0)}function x(d,h){var w=s(),I=we(w||document.body),Y=d!==void 0?d:I?w:t.selectedDateElem!==void 0&&we(t.selectedDateElem)?t.selectedDateElem:t.todayDateElem!==void 0&&we(t.todayDateElem)?t.todayDateElem:F(h>0?1:-1);Y===void 0?t._input.focus():I?T(Y,h):L(Y)}function H(d,h){for(var w=(new Date(d,h,1).getDay()-t.l10n.firstDayOfWeek+7)%7,I=t.utils.getDaysInMonth((h-1+12)%12,d),Y=t.utils.getDaysInMonth(h,d),ie=window.document.createDocumentFragment(),_e=t.config.showMonths>1,le=_e?\"prevMonthDay hidden\":\"prevMonthDay\",Se=_e?\"nextMonthDay hidden\":\"nextMonthDay\",ae=I+1-w,me=0;ae<=I;ae++,me++)ie.appendChild(O(\"flatpickr-day \"+le,new Date(d,h-1,ae),ae,me));for(ae=1;ae<=Y;ae++,me++)ie.appendChild(O(\"flatpickr-day\",new Date(d,h,ae),ae,me));for(var je=Y+1;je<=42-w&&(t.config.showMonths===1||me%7!==0);je++,me++)ie.appendChild(O(\"flatpickr-day \"+Se,new Date(d,h+1,je%Y),je,me));var pn=ke(\"div\",\"dayContainer\");return pn.appendChild(ie),pn}function N(){if(t.daysContainer!==void 0){ns(t.daysContainer),t.weekNumbers&&ns(t.weekNumbers);for(var d=document.createDocumentFragment(),h=0;h<t.config.showMonths;h++){var w=new Date(t.currentYear,t.currentMonth,1);w.setMonth(t.currentMonth+h),d.appendChild(H(w.getFullYear(),w.getMonth()))}t.daysContainer.appendChild(d),t.days=t.daysContainer.firstChild,t.config.mode===\"range\"&&t.selectedDates.length===1&&ct()}}function z(){if(!(t.config.showMonths>1||t.config.monthSelectorType!==\"dropdown\")){var d=function(I){return t.config.minDate!==void 0&&t.currentYear===t.config.minDate.getFullYear()&&I<t.config.minDate.getMonth()?!1:!(t.config.maxDate!==void 0&&t.currentYear===t.config.maxDate.getFullYear()&&I>t.config.maxDate.getMonth())};t.monthsDropdownContainer.tabIndex=-1,t.monthsDropdownContainer.innerHTML=\"\";for(var h=0;h<12;h++)if(d(h)){var w=ke(\"option\",\"flatpickr-monthDropdown-month\");w.value=new Date(t.currentYear,h).getMonth().toString(),w.textContent=Ks(h,t.config.shorthandCurrentMonth,t.l10n),w.tabIndex=-1,t.currentMonth===h&&(w.selected=!0),t.monthsDropdownContainer.appendChild(w)}}}function re(){var d=ke(\"div\",\"flatpickr-month\"),h=window.document.createDocumentFragment(),w;t.config.showMonths>1||t.config.monthSelectorType===\"static\"?w=ke(\"span\",\"cur-month\"):(t.monthsDropdownContainer=ke(\"select\",\"flatpickr-monthDropdown-months\"),t.monthsDropdownContainer.setAttribute(\"aria-label\",t.l10n.monthAriaLabel),b(t.monthsDropdownContainer,\"change\",function(_e){var le=jt(_e),Se=parseInt(le.value,10);t.changeMonth(Se-t.currentMonth),J(\"onMonthChange\")}),z(),w=t.monthsDropdownContainer);var I=is(\"cur-year\",{tabindex:\"-1\"}),Y=I.getElementsByTagName(\"input\")[0];Y.setAttribute(\"aria-label\",t.l10n.yearAriaLabel),t.config.minDate&&Y.setAttribute(\"min\",t.config.minDate.getFullYear().toString()),t.config.maxDate&&(Y.setAttribute(\"max\",t.config.maxDate.getFullYear().toString()),Y.disabled=!!t.config.minDate&&t.config.minDate.getFullYear()===t.config.maxDate.getFullYear());var ie=ke(\"div\",\"flatpickr-current-month\");return ie.appendChild(w),ie.appendChild(I),h.appendChild(ie),d.appendChild(h),{container:d,yearElement:Y,monthElement:w}}function ne(){ns(t.monthNav),t.monthNav.appendChild(t.prevMonthNav),t.config.showMonths&&(t.yearElements=[],t.monthElements=[]);for(var d=t.config.showMonths;d--;){var h=re();t.yearElements.push(h.yearElement),t.monthElements.push(h.monthElement),t.monthNav.appendChild(h.container)}t.monthNav.appendChild(t.nextMonthNav)}function U(){return t.monthNav=ke(\"div\",\"flatpickr-months\"),t.yearElements=[],t.monthElements=[],t.prevMonthNav=ke(\"span\",\"flatpickr-prev-month\"),t.prevMonthNav.innerHTML=t.config.prevArrow,t.nextMonthNav=ke(\"span\",\"flatpickr-next-month\"),t.nextMonthNav.innerHTML=t.config.nextArrow,ne(),Object.defineProperty(t,\"_hidePrevMonthArrow\",{get:function(){return t.__hidePrevMonthArrow},set:function(d){t.__hidePrevMonthArrow!==d&&(Tt(t.prevMonthNav,\"flatpickr-disabled\",d),t.__hidePrevMonthArrow=d)}}),Object.defineProperty(t,\"_hideNextMonthArrow\",{get:function(){return t.__hideNextMonthArrow},set:function(d){t.__hideNextMonthArrow!==d&&(Tt(t.nextMonthNav,\"flatpickr-disabled\",d),t.__hideNextMonthArrow=d)}}),t.currentYearElement=t.yearElements[0],Pe(),t.monthNav}function X(){t.calendarContainer.classList.add(\"hasTime\"),t.config.noCalendar&&t.calendarContainer.classList.add(\"noCalendar\");var d=Wo(t.config);t.timeContainer=ke(\"div\",\"flatpickr-time\"),t.timeContainer.tabIndex=-1;var h=ke(\"span\",\"flatpickr-time-separator\",\":\"),w=is(\"flatpickr-hour\",{\"aria-label\":t.l10n.hourAriaLabel});t.hourElement=w.getElementsByTagName(\"input\")[0];var I=is(\"flatpickr-minute\",{\"aria-label\":t.l10n.minuteAriaLabel});if(t.minuteElement=I.getElementsByTagName(\"input\")[0],t.hourElement.tabIndex=t.minuteElement.tabIndex=-1,t.hourElement.value=kt(t.latestSelectedDateObj?t.latestSelectedDateObj.getHours():t.config.time_24hr?d.hours:u(d.hours)),t.minuteElement.value=kt(t.latestSelectedDateObj?t.latestSelectedDateObj.getMinutes():d.minutes),t.hourElement.setAttribute(\"step\",t.config.hourIncrement.toString()),t.minuteElement.setAttribute(\"step\",t.config.minuteIncrement.toString()),t.hourElement.setAttribute(\"min\",t.config.time_24hr?\"0\":\"1\"),t.hourElement.setAttribute(\"max\",t.config.time_24hr?\"23\":\"12\"),t.hourElement.setAttribute(\"maxlength\",\"2\"),t.minuteElement.setAttribute(\"min\",\"0\"),t.minuteElement.setAttribute(\"max\",\"59\"),t.minuteElement.setAttribute(\"maxlength\",\"2\"),t.timeContainer.appendChild(w),t.timeContainer.appendChild(h),t.timeContainer.appendChild(I),t.config.time_24hr&&t.timeContainer.classList.add(\"time24hr\"),t.config.enableSeconds){t.timeContainer.classList.add(\"hasSeconds\");var Y=is(\"flatpickr-second\");t.secondElement=Y.getElementsByTagName(\"input\")[0],t.secondElement.value=kt(t.latestSelectedDateObj?t.latestSelectedDateObj.getSeconds():d.seconds),t.secondElement.setAttribute(\"step\",t.minuteElement.getAttribute(\"step\")),t.secondElement.setAttribute(\"min\",\"0\"),t.secondElement.setAttribute(\"max\",\"59\"),t.secondElement.setAttribute(\"maxlength\",\"2\"),t.timeContainer.appendChild(ke(\"span\",\"flatpickr-time-separator\",\":\")),t.timeContainer.appendChild(Y)}return t.config.time_24hr||(t.amPM=ke(\"span\",\"flatpickr-am-pm\",t.l10n.amPM[Jt((t.latestSelectedDateObj?t.hourElement.value:t.config.defaultHour)>11)]),t.amPM.title=t.l10n.toggleTitle,t.amPM.tabIndex=-1,t.timeContainer.appendChild(t.amPM)),t.timeContainer}function Q(){t.weekdayContainer?ns(t.weekdayContainer):t.weekdayContainer=ke(\"div\",\"flatpickr-weekdays\");for(var d=t.config.showMonths;d--;){var h=ke(\"div\",\"flatpickr-weekdaycontainer\");t.weekdayContainer.appendChild(h)}return He(),t.weekdayContainer}function He(){if(t.weekdayContainer){var d=t.l10n.firstDayOfWeek,h=du(t.l10n.weekdays.shorthand);d>0&&d<h.length&&(h=du(h.splice(d,h.length),h.splice(0,d)));for(var w=t.config.showMonths;w--;)t.weekdayContainer.children[w].innerHTML=`\n      <span class='flatpickr-weekday'>\n        `+h.join(\"</span><span class='flatpickr-weekday'>\")+`\n      </span>\n      `}}function wt(){t.calendarContainer.classList.add(\"hasWeeks\");var d=ke(\"div\",\"flatpickr-weekwrapper\");d.appendChild(ke(\"span\",\"flatpickr-weekday\",t.l10n.weekAbbreviation));var h=ke(\"div\",\"flatpickr-weeks\");return d.appendChild(h),{weekWrapper:d,weekNumbers:h}}function Ye(d,h){h===void 0&&(h=!0);var w=h?d:d-t.currentMonth;w<0&&t._hidePrevMonthArrow===!0||w>0&&t._hideNextMonthArrow===!0||(t.currentMonth+=w,(t.currentMonth<0||t.currentMonth>11)&&(t.currentYear+=t.currentMonth>11?1:-1,t.currentMonth=(t.currentMonth+12)%12,J(\"onYearChange\"),z()),N(),J(\"onMonthChange\"),Pe())}function Ct(d,h){if(d===void 0&&(d=!0),h===void 0&&(h=!0),t.input.value=\"\",t.altInput!==void 0&&(t.altInput.value=\"\"),t.mobileInput!==void 0&&(t.mobileInput.value=\"\"),t.selectedDates=[],t.latestSelectedDateObj=void 0,h===!0&&(t.currentYear=t._initialDate.getFullYear(),t.currentMonth=t._initialDate.getMonth()),t.config.enableTime===!0){var w=Wo(t.config),I=w.hours,Y=w.minutes,ie=w.seconds;m(I,Y,ie)}t.redraw(),d&&J(\"onChange\")}function hn(){t.isOpen=!1,t.isMobile||(t.calendarContainer!==void 0&&t.calendarContainer.classList.remove(\"open\"),t._input!==void 0&&t._input.classList.remove(\"active\")),J(\"onClose\")}function ht(){t.config!==void 0&&J(\"onDestroy\");for(var d=t._handlers.length;d--;)t._handlers[d].remove();if(t._handlers=[],t.mobileInput)t.mobileInput.parentNode&&t.mobileInput.parentNode.removeChild(t.mobileInput),t.mobileInput=void 0;else if(t.calendarContainer&&t.calendarContainer.parentNode)if(t.config.static&&t.calendarContainer.parentNode){var h=t.calendarContainer.parentNode;if(h.lastChild&&h.removeChild(h.lastChild),h.parentNode){for(;h.firstChild;)h.parentNode.insertBefore(h.firstChild,h);h.parentNode.removeChild(h)}}else t.calendarContainer.parentNode.removeChild(t.calendarContainer);t.altInput&&(t.input.type=\"text\",t.altInput.parentNode&&t.altInput.parentNode.removeChild(t.altInput),delete t.altInput),t.input&&(t.input.type=t.input._type,t.input.classList.remove(\"flatpickr-input\"),t.input.removeAttribute(\"readonly\")),[\"_showTimeInput\",\"latestSelectedDateObj\",\"_hideNextMonthArrow\",\"_hidePrevMonthArrow\",\"__hideNextMonthArrow\",\"__hidePrevMonthArrow\",\"isMobile\",\"isOpen\",\"selectedDateElem\",\"minDateHasTime\",\"maxDateHasTime\",\"days\",\"daysContainer\",\"_input\",\"_positionElement\",\"innerContainer\",\"rContainer\",\"monthNav\",\"todayDateElem\",\"calendarContainer\",\"weekdayContainer\",\"prevMonthNav\",\"nextMonthNav\",\"monthsDropdownContainer\",\"currentMonthElement\",\"currentYearElement\",\"navigationCurrentMonth\",\"selectedDateElem\",\"config\"].forEach(function(w){try{delete t[w]}catch{}})}function sn(d){return t.calendarContainer.contains(d)}function ee(d){if(t.isOpen&&!t.config.inline){var h=jt(d),w=sn(h),I=h===t.input||h===t.altInput||t.element.contains(h)||d.path&&d.path.indexOf&&(~d.path.indexOf(t.input)||~d.path.indexOf(t.altInput)),Y=!I&&!w&&!sn(d.relatedTarget),ie=!t.config.ignoredFocusElements.some(function(_e){return _e.contains(h)});Y&&ie&&(t.config.allowInput&&t.setDate(t._input.value,!1,t.config.altInput?t.config.altFormat:t.config.dateFormat),t.timeContainer!==void 0&&t.minuteElement!==void 0&&t.hourElement!==void 0&&t.input.value!==\"\"&&t.input.value!==void 0&&l(),t.close(),t.config&&t.config.mode===\"range\"&&t.selectedDates.length===1&&t.clear(!1))}}function de(d){if(!(!d||t.config.minDate&&d<t.config.minDate.getFullYear()||t.config.maxDate&&d>t.config.maxDate.getFullYear())){var h=d,w=t.currentYear!==h;t.currentYear=h||t.currentYear,t.config.maxDate&&t.currentYear===t.config.maxDate.getFullYear()?t.currentMonth=Math.min(t.config.maxDate.getMonth(),t.currentMonth):t.config.minDate&&t.currentYear===t.config.minDate.getFullYear()&&(t.currentMonth=Math.max(t.config.minDate.getMonth(),t.currentMonth)),w&&(t.redraw(),J(\"onYearChange\"),z())}}function Ie(d,h){var w;h===void 0&&(h=!0);var I=t.parseDate(d,void 0,h);if(t.config.minDate&&I&&Bt(I,t.config.minDate,h!==void 0?h:!t.minDateHasTime)<0||t.config.maxDate&&I&&Bt(I,t.config.maxDate,h!==void 0?h:!t.maxDateHasTime)>0)return!1;if(!t.config.enable&&t.config.disable.length===0)return!0;if(I===void 0)return!1;for(var Y=!!t.config.enable,ie=(w=t.config.enable)!==null&&w!==void 0?w:t.config.disable,_e=0,le=void 0;_e<ie.length;_e++){if(le=ie[_e],typeof le==\"function\"&&le(I))return Y;if(le instanceof Date&&I!==void 0&&le.getTime()===I.getTime())return Y;if(typeof le==\"string\"){var Se=t.parseDate(le,void 0,!0);return Se&&Se.getTime()===I.getTime()?Y:!Y}else if(typeof le==\"object\"&&I!==void 0&&le.from&&le.to&&I.getTime()>=le.from.getTime()&&I.getTime()<=le.to.getTime())return Y}return!Y}function we(d){return t.daysContainer!==void 0?d.className.indexOf(\"hidden\")===-1&&d.className.indexOf(\"flatpickr-disabled\")===-1&&t.daysContainer.contains(d):!1}function at(d){var h=d.target===t._input,w=t._input.value.trimEnd()!==Qe();h&&w&&!(d.relatedTarget&&sn(d.relatedTarget))&&t.setDate(t._input.value,!0,d.target===t.altInput?t.config.altFormat:t.config.dateFormat)}function lt(d){var h=jt(d),w=t.config.wrap?e.contains(h):h===t._input,I=t.config.allowInput,Y=t.isOpen&&(!I||!w),ie=t.config.inline&&w&&!I;if(d.keyCode===13&&w){if(I)return t.setDate(t._input.value,!0,h===t.altInput?t.config.altFormat:t.config.dateFormat),t.close(),h.blur();t.open()}else if(sn(h)||Y||ie){var _e=!!t.timeContainer&&t.timeContainer.contains(h);switch(d.keyCode){case 13:_e?(d.preventDefault(),l(),te()):ce(d);break;case 27:d.preventDefault(),te();break;case 8:case 46:w&&!t.config.allowInput&&(d.preventDefault(),t.clear());break;case 37:case 39:if(!_e&&!w){d.preventDefault();var le=s();if(t.daysContainer!==void 0&&(I===!1||le&&we(le))){var Se=d.keyCode===39?1:-1;d.ctrlKey?(d.stopPropagation(),Ye(Se),x(F(1),0)):x(void 0,Se)}}else t.hourElement&&t.hourElement.focus();break;case 38:case 40:d.preventDefault();var ae=d.keyCode===40?1:-1;t.daysContainer&&h.$i!==void 0||h===t.input||h===t.altInput?d.ctrlKey?(d.stopPropagation(),de(t.currentYear-ae),x(F(1),0)):_e||x(void 0,ae*7):h===t.currentYearElement?de(t.currentYear-ae):t.config.enableTime&&(!_e&&t.hourElement&&t.hourElement.focus(),l(d),t._debouncedChange());break;case 9:if(_e){var me=[t.hourElement,t.minuteElement,t.secondElement,t.amPM].concat(t.pluginElements).filter(function($t){return $t}),je=me.indexOf(h);if(je!==-1){var pn=me[je+(d.shiftKey?-1:1)];d.preventDefault(),(pn||t._input).focus()}}else!t.config.noCalendar&&t.daysContainer&&t.daysContainer.contains(h)&&d.shiftKey&&(d.preventDefault(),t._input.focus());break}}if(t.amPM!==void 0&&h===t.amPM)switch(d.key){case t.l10n.amPM[0].charAt(0):case t.l10n.amPM[0].charAt(0).toLowerCase():t.amPM.textContent=t.l10n.amPM[0],f(),Ue();break;case t.l10n.amPM[1].charAt(0):case t.l10n.amPM[1].charAt(0).toLowerCase():t.amPM.textContent=t.l10n.amPM[1],f(),Ue();break}(w||sn(h))&&J(\"onKeyDown\",d)}function ct(d,h){if(h===void 0&&(h=\"flatpickr-day\"),!(t.selectedDates.length!==1||d&&(!d.classList.contains(h)||d.classList.contains(\"flatpickr-disabled\")))){for(var w=d?d.dateObj.getTime():t.days.firstElementChild.dateObj.getTime(),I=t.parseDate(t.selectedDates[0],void 0,!0).getTime(),Y=Math.min(w,t.selectedDates[0].getTime()),ie=Math.max(w,t.selectedDates[0].getTime()),_e=!1,le=0,Se=0,ae=Y;ae<ie;ae+=J_.DAY)Ie(new Date(ae),!0)||(_e=_e||ae>Y&&ae<ie,ae<I&&(!le||ae>le)?le=ae:ae>I&&(!Se||ae<Se)&&(Se=ae));var me=Array.from(t.rContainer.querySelectorAll(\"*:nth-child(-n+\"+t.config.showMonths+\") > .\"+h));me.forEach(function(je){var pn=je.dateObj,$t=pn.getTime(),Xi=le>0&&$t<le||Se>0&&$t>Se;if(Xi){je.classList.add(\"notAllowed\"),[\"inRange\",\"startRange\",\"endRange\"].forEach(function(Ti){je.classList.remove(Ti)});return}else if(_e&&!Xi)return;[\"startRange\",\"inRange\",\"endRange\",\"notAllowed\"].forEach(function(Ti){je.classList.remove(Ti)}),d!==void 0&&(d.classList.add(w<=t.selectedDates[0].getTime()?\"startRange\":\"endRange\"),I<w&&$t===I?je.classList.add(\"startRange\"):I>w&&$t===I&&je.classList.add(\"endRange\"),$t>=le&&(Se===0||$t<=Se)&&Z_($t,I,w)&&je.classList.add(\"inRange\"))})}}function y(){t.isOpen&&!t.config.static&&!t.config.inline&&K()}function _(d,h){if(h===void 0&&(h=t._positionElement),t.isMobile===!0){if(d){d.preventDefault();var w=jt(d);w&&w.blur()}t.mobileInput!==void 0&&(t.mobileInput.focus(),t.mobileInput.click()),J(\"onOpen\");return}else if(t._input.disabled||t.config.inline)return;var I=t.isOpen;t.isOpen=!0,I||(t.calendarContainer.classList.add(\"open\"),t._input.classList.add(\"active\"),J(\"onOpen\"),K(h)),t.config.enableTime===!0&&t.config.noCalendar===!0&&t.config.allowInput===!1&&(d===void 0||!t.timeContainer.contains(d.relatedTarget))&&setTimeout(function(){return t.hourElement.select()},50)}function k(d){return function(h){var w=t.config[\"_\"+d+\"Date\"]=t.parseDate(h,t.config.dateFormat),I=t.config[\"_\"+(d===\"min\"?\"max\":\"min\")+\"Date\"];w!==void 0&&(t[d===\"min\"?\"minDateHasTime\":\"maxDateHasTime\"]=w.getHours()>0||w.getMinutes()>0||w.getSeconds()>0),t.selectedDates&&(t.selectedDates=t.selectedDates.filter(function(Y){return Ie(Y)}),!t.selectedDates.length&&d===\"min\"&&p(w),Ue()),t.daysContainer&&(j(),w!==void 0?t.currentYearElement[d]=w.getFullYear().toString():t.currentYearElement.removeAttribute(d),t.currentYearElement.disabled=!!I&&w!==void 0&&I.getFullYear()===w.getFullYear())}}function q(){var d=[\"wrap\",\"weekNumbers\",\"allowInput\",\"allowInvalidPreload\",\"clickOpens\",\"time_24hr\",\"enableTime\",\"noCalendar\",\"altInput\",\"shorthandCurrentMonth\",\"inline\",\"static\",\"enableSeconds\",\"disableMobile\"],h=vt(vt({},JSON.parse(JSON.stringify(e.dataset||{}))),n),w={};t.config.parseDate=h.parseDate,t.config.formatDate=h.formatDate,Object.defineProperty(t.config,\"enable\",{get:function(){return t.config._enable},set:function(me){t.config._enable=E(me)}}),Object.defineProperty(t.config,\"disable\",{get:function(){return t.config._disable},set:function(me){t.config._disable=E(me)}});var I=h.mode===\"time\";if(!h.dateFormat&&(h.enableTime||I)){var Y=et.defaultConfig.dateFormat||Li.dateFormat;w.dateFormat=h.noCalendar||I?\"H:i\"+(h.enableSeconds?\":S\":\"\"):Y+\" H:i\"+(h.enableSeconds?\":S\":\"\")}if(h.altInput&&(h.enableTime||I)&&!h.altFormat){var ie=et.defaultConfig.altFormat||Li.altFormat;w.altFormat=h.noCalendar||I?\"h:i\"+(h.enableSeconds?\":S K\":\" K\"):ie+(\" h:i\"+(h.enableSeconds?\":S\":\"\")+\" K\")}Object.defineProperty(t.config,\"minDate\",{get:function(){return t.config._minDate},set:k(\"min\")}),Object.defineProperty(t.config,\"maxDate\",{get:function(){return t.config._maxDate},set:k(\"max\")});var _e=function(me){return function(je){t.config[me===\"min\"?\"_minTime\":\"_maxTime\"]=t.parseDate(je,\"H:i:S\")}};Object.defineProperty(t.config,\"minTime\",{get:function(){return t.config._minTime},set:_e(\"min\")}),Object.defineProperty(t.config,\"maxTime\",{get:function(){return t.config._maxTime},set:_e(\"max\")}),h.mode===\"time\"&&(t.config.noCalendar=!0,t.config.enableTime=!0),Object.assign(t.config,w,h);for(var le=0;le<d.length;le++)t.config[d[le]]=t.config[d[le]]===!0||t.config[d[le]]===\"true\";Uo.filter(function(me){return t.config[me]!==void 0}).forEach(function(me){t.config[me]=qo(t.config[me]||[]).map(o)}),t.isMobile=!t.config.disableMobile&&!t.config.inline&&t.config.mode===\"single\"&&!t.config.disable.length&&!t.config.enable&&!t.config.weekNumbers&&/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);for(var le=0;le<t.config.plugins.length;le++){var Se=t.config.plugins[le](t)||{};for(var ae in Se)Uo.indexOf(ae)>-1?t.config[ae]=qo(Se[ae]).map(o).concat(t.config[ae]):typeof h[ae]>\"u\"&&(t.config[ae]=Se[ae])}h.altInputClass||(t.config.altInputClass=$().className+\" \"+t.config.altInputClass),J(\"onParseConfig\")}function $(){return t.config.wrap?e.querySelector(\"[data-input]\"):e}function B(){typeof t.config.locale!=\"object\"&&typeof et.l10ns[t.config.locale]>\"u\"&&t.config.errorHandler(new Error(\"flatpickr: invalid locale \"+t.config.locale)),t.l10n=vt(vt({},et.l10ns.default),typeof t.config.locale==\"object\"?t.config.locale:t.config.locale!==\"default\"?et.l10ns[t.config.locale]:void 0),ii.D=\"(\"+t.l10n.weekdays.shorthand.join(\"|\")+\")\",ii.l=\"(\"+t.l10n.weekdays.longhand.join(\"|\")+\")\",ii.M=\"(\"+t.l10n.months.shorthand.join(\"|\")+\")\",ii.F=\"(\"+t.l10n.months.longhand.join(\"|\")+\")\",ii.K=\"(\"+t.l10n.amPM[0]+\"|\"+t.l10n.amPM[1]+\"|\"+t.l10n.amPM[0].toLowerCase()+\"|\"+t.l10n.amPM[1].toLowerCase()+\")\";var d=vt(vt({},n),JSON.parse(JSON.stringify(e.dataset||{})));d.time_24hr===void 0&&et.defaultConfig.time_24hr===void 0&&(t.config.time_24hr=t.l10n.time_24hr),t.formatDate=fp(t),t.parseDate=Ia({config:t.config,l10n:t.l10n})}function K(d){if(typeof t.config.position==\"function\")return void t.config.position(t,d);if(t.calendarContainer!==void 0){J(\"onPreCalendarPosition\");var h=d||t._positionElement,w=Array.prototype.reduce.call(t.calendarContainer.children,function(Up,qp){return Up+qp.offsetHeight},0),I=t.calendarContainer.offsetWidth,Y=t.config.position.split(\" \"),ie=Y[0],_e=Y.length>1?Y[1]:null,le=h.getBoundingClientRect(),Se=window.innerHeight-le.bottom,ae=ie===\"above\"||ie!==\"below\"&&Se<w&&le.top>w,me=window.pageYOffset+le.top+(ae?-w-2:h.offsetHeight+2);if(Tt(t.calendarContainer,\"arrowTop\",!ae),Tt(t.calendarContainer,\"arrowBottom\",ae),!t.config.inline){var je=window.pageXOffset+le.left,pn=!1,$t=!1;_e===\"center\"?(je-=(I-le.width)/2,pn=!0):_e===\"right\"&&(je-=I-le.width,$t=!0),Tt(t.calendarContainer,\"arrowLeft\",!pn&&!$t),Tt(t.calendarContainer,\"arrowCenter\",pn),Tt(t.calendarContainer,\"arrowRight\",$t);var Xi=window.document.body.offsetWidth-(window.pageXOffset+le.right),Ti=je+I>window.document.body.offsetWidth,Fp=Xi+I>window.document.body.offsetWidth;if(Tt(t.calendarContainer,\"rightMost\",Ti),!t.config.static)if(t.calendarContainer.style.top=me+\"px\",!Ti)t.calendarContainer.style.left=je+\"px\",t.calendarContainer.style.right=\"auto\";else if(!Fp)t.calendarContainer.style.left=\"auto\",t.calendarContainer.style.right=Xi+\"px\";else{var Oo=W();if(Oo===void 0)return;var Lp=window.document.body.offsetWidth,Vp=Math.max(0,Lp/2-I/2),$p=\".flatpickr-calendar.centerMost:before\",jp=\".flatpickr-calendar.centerMost:after\",Bp=Oo.cssRules.length,Hp=\"{left:\"+le.left+\"px;right:auto;}\";Tt(t.calendarContainer,\"rightMost\",!1),Tt(t.calendarContainer,\"centerMost\",!0),Oo.insertRule($p+\",\"+jp+Hp,Bp),t.calendarContainer.style.left=Vp+\"px\",t.calendarContainer.style.right=\"auto\"}}}}function W(){for(var d=null,h=0;h<document.styleSheets.length;h++){var w=document.styleSheets[h];if(w.cssRules){try{w.cssRules}catch{continue}d=w;break}}return d??Z()}function Z(){var d=document.createElement(\"style\");return document.head.appendChild(d),d.sheet}function j(){t.config.noCalendar||t.isMobile||(z(),Pe(),N())}function te(){t._input.focus(),window.navigator.userAgent.indexOf(\"MSIE\")!==-1||navigator.msMaxTouchPoints!==void 0?setTimeout(t.close,0):t.close()}function ce(d){d.preventDefault(),d.stopPropagation();var h=function(me){return me.classList&&me.classList.contains(\"flatpickr-day\")&&!me.classList.contains(\"flatpickr-disabled\")&&!me.classList.contains(\"notAllowed\")},w=up(jt(d),h);if(w!==void 0){var I=w,Y=t.latestSelectedDateObj=new Date(I.dateObj.getTime()),ie=(Y.getMonth()<t.currentMonth||Y.getMonth()>t.currentMonth+t.config.showMonths-1)&&t.config.mode!==\"range\";if(t.selectedDateElem=I,t.config.mode===\"single\")t.selectedDates=[Y];else if(t.config.mode===\"multiple\"){var _e=Te(Y);_e?t.selectedDates.splice(parseInt(_e),1):t.selectedDates.push(Y)}else t.config.mode===\"range\"&&(t.selectedDates.length===2&&t.clear(!1,!1),t.latestSelectedDateObj=Y,t.selectedDates.push(Y),Bt(Y,t.selectedDates[0],!0)!==0&&t.selectedDates.sort(function(me,je){return me.getTime()-je.getTime()}));if(f(),ie){var le=t.currentYear!==Y.getFullYear();t.currentYear=Y.getFullYear(),t.currentMonth=Y.getMonth(),le&&(J(\"onYearChange\"),z()),J(\"onMonthChange\")}if(Pe(),N(),Ue(),!ie&&t.config.mode!==\"range\"&&t.config.showMonths===1?L(I):t.selectedDateElem!==void 0&&t.hourElement===void 0&&t.selectedDateElem&&t.selectedDateElem.focus(),t.hourElement!==void 0&&t.hourElement!==void 0&&t.hourElement.focus(),t.config.closeOnSelect){var Se=t.config.mode===\"single\"&&!t.config.enableTime,ae=t.config.mode===\"range\"&&t.selectedDates.length===2&&!t.config.enableTime;(Se||ae)&&te()}M()}}var oe={locale:[B,He],showMonths:[ne,a,Q],minDate:[A],maxDate:[A],positionElement:[G],clickOpens:[function(){t.config.clickOpens===!0?(b(t._input,\"focus\",t.open),b(t._input,\"click\",t.open)):(t._input.removeEventListener(\"focus\",t.open),t._input.removeEventListener(\"click\",t.open))}]};function pe(d,h){if(d!==null&&typeof d==\"object\"){Object.assign(t.config,d);for(var w in d)oe[w]!==void 0&&oe[w].forEach(function(I){return I()})}else t.config[d]=h,oe[d]!==void 0?oe[d].forEach(function(I){return I()}):Uo.indexOf(d)>-1&&(t.config[d]=qo(h));t.redraw(),Ue(!0)}function ge(d,h){var w=[];if(d instanceof Array)w=d.map(function(I){return t.parseDate(I,h)});else if(d instanceof Date||typeof d==\"number\")w=[t.parseDate(d,h)];else if(typeof d==\"string\")switch(t.config.mode){case\"single\":case\"time\":w=[t.parseDate(d,h)];break;case\"multiple\":w=d.split(t.config.conjunction).map(function(I){return t.parseDate(I,h)});break;case\"range\":w=d.split(t.l10n.rangeSeparator).map(function(I){return t.parseDate(I,h)});break}else t.config.errorHandler(new Error(\"Invalid date supplied: \"+JSON.stringify(d)));t.selectedDates=t.config.allowInvalidPreload?w:w.filter(function(I){return I instanceof Date&&Ie(I,!1)}),t.config.mode===\"range\"&&t.selectedDates.sort(function(I,Y){return I.getTime()-Y.getTime()})}function Le(d,h,w){if(h===void 0&&(h=!1),w===void 0&&(w=t.config.dateFormat),d!==0&&!d||d instanceof Array&&d.length===0)return t.clear(h);ge(d,w),t.latestSelectedDateObj=t.selectedDates[t.selectedDates.length-1],t.redraw(),A(void 0,h),p(),t.selectedDates.length===0&&t.clear(!1),Ue(h),h&&J(\"onChange\")}function E(d){return d.slice().map(function(h){return typeof h==\"string\"||typeof h==\"number\"||h instanceof Date?t.parseDate(h,void 0,!0):h&&typeof h==\"object\"&&h.from&&h.to?{from:t.parseDate(h.from,void 0),to:t.parseDate(h.to,void 0)}:h}).filter(function(h){return h})}function S(){t.selectedDates=[],t.now=t.parseDate(t.config.now)||new Date;var d=t.config.defaultDate||((t.input.nodeName===\"INPUT\"||t.input.nodeName===\"TEXTAREA\")&&t.input.placeholder&&t.input.value===t.input.placeholder?null:t.input.value);d&&ge(d,t.config.dateFormat),t._initialDate=t.selectedDates.length>0?t.selectedDates[0]:t.config.minDate&&t.config.minDate.getTime()>t.now.getTime()?t.config.minDate:t.config.maxDate&&t.config.maxDate.getTime()<t.now.getTime()?t.config.maxDate:t.now,t.currentYear=t._initialDate.getFullYear(),t.currentMonth=t._initialDate.getMonth(),t.selectedDates.length>0&&(t.latestSelectedDateObj=t.selectedDates[0]),t.config.minTime!==void 0&&(t.config.minTime=t.parseDate(t.config.minTime,\"H:i\")),t.config.maxTime!==void 0&&(t.config.maxTime=t.parseDate(t.config.maxTime,\"H:i\")),t.minDateHasTime=!!t.config.minDate&&(t.config.minDate.getHours()>0||t.config.minDate.getMinutes()>0||t.config.minDate.getSeconds()>0),t.maxDateHasTime=!!t.config.maxDate&&(t.config.maxDate.getHours()>0||t.config.maxDate.getMinutes()>0||t.config.maxDate.getSeconds()>0)}function V(){if(t.input=$(),!t.input){t.config.errorHandler(new Error(\"Invalid input element specified\"));return}t.input._type=t.input.type,t.input.type=\"text\",t.input.classList.add(\"flatpickr-input\"),t._input=t.input,t.config.altInput&&(t.altInput=ke(t.input.nodeName,t.config.altInputClass),t._input=t.altInput,t.altInput.placeholder=t.input.placeholder,t.altInput.disabled=t.input.disabled,t.altInput.required=t.input.required,t.altInput.tabIndex=t.input.tabIndex,t.altInput.type=\"text\",t.input.setAttribute(\"type\",\"hidden\"),!t.config.static&&t.input.parentNode&&t.input.parentNode.insertBefore(t.altInput,t.input.nextSibling)),t.config.allowInput||t._input.setAttribute(\"readonly\",\"readonly\"),G()}function G(){t._positionElement=t.config.positionElement||t._input}function ue(){var d=t.config.enableTime?t.config.noCalendar?\"time\":\"datetime-local\":\"date\";t.mobileInput=ke(\"input\",t.input.className+\" flatpickr-mobile\"),t.mobileInput.tabIndex=1,t.mobileInput.type=d,t.mobileInput.disabled=t.input.disabled,t.mobileInput.required=t.input.required,t.mobileInput.placeholder=t.input.placeholder,t.mobileFormatStr=d===\"datetime-local\"?\"Y-m-d\\\\TH:i:S\":d===\"date\"?\"Y-m-d\":\"H:i:S\",t.selectedDates.length>0&&(t.mobileInput.defaultValue=t.mobileInput.value=t.formatDate(t.selectedDates[0],t.mobileFormatStr)),t.config.minDate&&(t.mobileInput.min=t.formatDate(t.config.minDate,\"Y-m-d\")),t.config.maxDate&&(t.mobileInput.max=t.formatDate(t.config.maxDate,\"Y-m-d\")),t.input.getAttribute(\"step\")&&(t.mobileInput.step=String(t.input.getAttribute(\"step\"))),t.input.type=\"hidden\",t.altInput!==void 0&&(t.altInput.type=\"hidden\");try{t.input.parentNode&&t.input.parentNode.insertBefore(t.mobileInput,t.input.nextSibling)}catch{}b(t.mobileInput,\"change\",function(h){t.setDate(jt(h).value,!1,t.mobileFormatStr),J(\"onChange\"),J(\"onClose\")})}function he(d){if(t.isOpen===!0)return t.close();t.open(d)}function J(d,h){if(t.config!==void 0){var w=t.config[d];if(w!==void 0&&w.length>0)for(var I=0;w[I]&&I<w.length;I++)w[I](t.selectedDates,t.input.value,t,h);d===\"onChange\"&&(t.input.dispatchEvent(ye(\"change\")),t.input.dispatchEvent(ye(\"input\")))}}function ye(d){var h=document.createEvent(\"Event\");return h.initEvent(d,!0,!0),h}function Te(d){for(var h=0;h<t.selectedDates.length;h++){var w=t.selectedDates[h];if(w instanceof Date&&Bt(w,d)===0)return\"\"+h}return!1}function Ge(d){return t.config.mode!==\"range\"||t.selectedDates.length<2?!1:Bt(d,t.selectedDates[0])>=0&&Bt(d,t.selectedDates[1])<=0}function Pe(){t.config.noCalendar||t.isMobile||!t.monthNav||(t.yearElements.forEach(function(d,h){var w=new Date(t.currentYear,t.currentMonth,1);w.setMonth(t.currentMonth+h),t.config.showMonths>1||t.config.monthSelectorType===\"static\"?t.monthElements[h].textContent=Ks(w.getMonth(),t.config.shorthandCurrentMonth,t.l10n)+\" \":t.monthsDropdownContainer.value=w.getMonth().toString(),d.value=w.getFullYear().toString()}),t._hidePrevMonthArrow=t.config.minDate!==void 0&&(t.currentYear===t.config.minDate.getFullYear()?t.currentMonth<=t.config.minDate.getMonth():t.currentYear<t.config.minDate.getFullYear()),t._hideNextMonthArrow=t.config.maxDate!==void 0&&(t.currentYear===t.config.maxDate.getFullYear()?t.currentMonth+1>t.config.maxDate.getMonth():t.currentYear>t.config.maxDate.getFullYear()))}function Qe(d){var h=d||(t.config.altInput?t.config.altFormat:t.config.dateFormat);return t.selectedDates.map(function(w){return t.formatDate(w,h)}).filter(function(w,I,Y){return t.config.mode!==\"range\"||t.config.enableTime||Y.indexOf(w)===I}).join(t.config.mode!==\"range\"?t.config.conjunction:t.l10n.rangeSeparator)}function Ue(d){d===void 0&&(d=!0),t.mobileInput!==void 0&&t.mobileFormatStr&&(t.mobileInput.value=t.latestSelectedDateObj!==void 0?t.formatDate(t.latestSelectedDateObj,t.mobileFormatStr):\"\"),t.input.value=Qe(t.config.dateFormat),t.altInput!==void 0&&(t.altInput.value=Qe(t.config.altFormat)),d!==!1&&J(\"onValueUpdate\")}function Dt(d){var h=jt(d),w=t.prevMonthNav.contains(h),I=t.nextMonthNav.contains(h);w||I?Ye(w?-1:1):t.yearElements.indexOf(h)>=0?h.select():h.classList.contains(\"arrowUp\")?t.changeYear(t.currentYear+1):h.classList.contains(\"arrowDown\")&&t.changeYear(t.currentYear-1)}function Xn(d){d.preventDefault();var h=d.type===\"keydown\",w=jt(d),I=w;t.amPM!==void 0&&w===t.amPM&&(t.amPM.textContent=t.l10n.amPM[Jt(t.amPM.textContent===t.l10n.amPM[0])]);var Y=parseFloat(I.getAttribute(\"min\")),ie=parseFloat(I.getAttribute(\"max\")),_e=parseFloat(I.getAttribute(\"step\")),le=parseInt(I.value,10),Se=d.delta||(h?d.which===38?1:-1:0),ae=le+_e*Se;if(typeof I.value<\"u\"&&I.value.length===2){var me=I===t.hourElement,je=I===t.minuteElement;ae<Y?(ae=ie+ae+Jt(!me)+(Jt(me)&&Jt(!t.amPM)),je&&C(void 0,-1,t.hourElement)):ae>ie&&(ae=I===t.hourElement?ae-ie-Jt(!t.amPM):Y,je&&C(void 0,1,t.hourElement)),t.amPM&&me&&(_e===1?ae+le===23:Math.abs(ae-le)>_e)&&(t.amPM.textContent=t.l10n.amPM[Jt(t.amPM.textContent===t.l10n.amPM[0])]),I.value=kt(ae)}}return r(),t}function Vi(e,n){for(var t=Array.prototype.slice.call(e).filter(function(o){return o instanceof HTMLElement}),i=[],r=0;r<t.length;r++){var s=t[r];try{if(s.getAttribute(\"data-fp-omit\")!==null)continue;s._flatpickr!==void 0&&(s._flatpickr.destroy(),s._flatpickr=void 0),s._flatpickr=Q_(s,n||{}),i.push(s._flatpickr)}catch(o){console.error(o)}}return i.length===1?i[0]:i}typeof HTMLElement<\"u\"&&typeof HTMLCollection<\"u\"&&typeof NodeList<\"u\"&&(HTMLCollection.prototype.flatpickr=NodeList.prototype.flatpickr=function(e){return Vi(this,e)},HTMLElement.prototype.flatpickr=function(e){return Vi([this],e)});var et=function(e,n){return typeof e==\"string\"?Vi(window.document.querySelectorAll(e),n):e instanceof Node?Vi([e],n):Vi(e,n)};et.defaultConfig={};et.l10ns={en:vt({},Tr),default:vt({},Tr)};et.localize=function(e){et.l10ns.default=vt(vt({},et.l10ns.default),e)};et.setDefaults=function(e){et.defaultConfig=vt(vt({},et.defaultConfig),e)};et.parseDate=Ia({});et.formatDate=fp({});et.compareDates=Bt;typeof jQuery<\"u\"&&typeof jQuery.fn<\"u\"&&(jQuery.fn.flatpickr=function(e){return Vi(this,e)});Date.prototype.fp_incr=function(e){return new Date(this.getFullYear(),this.getMonth(),this.getDate()+(typeof e==\"string\"?parseInt(e,10):e))};typeof window<\"u\"&&(window.flatpickr=et);const eE={install:e=>{window.Flatpickr=et;const n=i=>{var s;if((s=document.getElementById(\"flatpickr\"))==null||s.remove(),i===\"light\")return;const r=document.createElement(\"link\");r.rel=\"stylesheet\",r.type=\"text/css\",r.href=`https://npmcdn.com/flatpickr/dist/themes/${i}.css`,r.id=\"flatpickr\",document.head.appendChild(r)},t=document.documentElement.classList.contains(\"dark\")?\"dark\":\"light\";n(t),e.config.globalProperties.$emitter.on(\"change-theme\",i=>{n(i)})}};/**\n  * vee-validate v4.13.2\n  * (c) 2024 Abdelrahman Awad\n  * @license MIT\n  */function dt(e){return typeof e==\"function\"}function dp(e){return e==null}const bi=e=>e!==null&&!!e&&typeof e==\"object\"&&!Array.isArray(e);function $l(e){return Number(e)>=0}function tE(e){const n=parseFloat(e);return isNaN(n)?e:n}function nE(e){return typeof e==\"object\"&&e!==null}function iE(e){return e==null?e===void 0?\"[object Undefined]\":\"[object Null]\":Object.prototype.toString.call(e)}function hu(e){if(!nE(e)||iE(e)!==\"[object Object]\")return!1;if(Object.getPrototypeOf(e)===null)return!0;let n=e;for(;Object.getPrototypeOf(n)!==null;)n=Object.getPrototypeOf(n);return Object.getPrototypeOf(e)===n}function Ar(e,n){return Object.keys(n).forEach(t=>{if(hu(n[t])&&hu(e[t])){e[t]||(e[t]={}),Ar(e[t],n[t]);return}e[t]=n[t]}),e}function rr(e){const n=e.split(\".\");if(!n.length)return\"\";let t=String(n[0]);for(let i=1;i<n.length;i++){if($l(n[i])){t+=`[${n[i]}]`;continue}t+=`.${n[i]}`}return t}const hp={};function En(e,n){sE(e,n),hp[e]=n}function rE(e){return hp[e]}function sE(e,n){if(!dt(n))throw new Error(`Extension Error: The validator '${e}' must be a function.`)}function pu(e,n,t){typeof t.value==\"object\"&&(t.value=Fe(t.value)),!t.enumerable||t.get||t.set||!t.configurable||!t.writable||n===\"__proto__\"?Object.defineProperty(e,n,t):e[n]=t.value}function Fe(e){if(typeof e!=\"object\")return e;var n=0,t,i,r,s=Object.prototype.toString.call(e);if(s===\"[object Object]\"?r=Object.create(e.__proto__||null):s===\"[object Array]\"?r=Array(e.length):s===\"[object Set]\"?(r=new Set,e.forEach(function(o){r.add(Fe(o))})):s===\"[object Map]\"?(r=new Map,e.forEach(function(o,a){r.set(Fe(a),Fe(o))})):s===\"[object Date]\"?r=new Date(+e):s===\"[object RegExp]\"?r=new RegExp(e.source,e.flags):s===\"[object DataView]\"?r=new e.constructor(Fe(e.buffer)):s===\"[object ArrayBuffer]\"?r=e.slice(0):s.slice(-6)===\"Array]\"&&(r=new e.constructor(e)),r){for(i=Object.getOwnPropertySymbols(e);n<i.length;n++)pu(r,i[n],Object.getOwnPropertyDescriptor(e,i[n]));for(n=0,i=Object.getOwnPropertyNames(e);n<i.length;n++)Object.hasOwnProperty.call(r,t=i[n])&&r[t]===e[t]||pu(r,t,Object.getOwnPropertyDescriptor(e,t))}return r||e}const Co=Symbol(\"vee-validate-form\"),oE=Symbol(\"vee-validate-field-instance\"),Ws=Symbol(\"Default empty value\"),aE=typeof window<\"u\";function ka(e){return dt(e)&&!!e.__locatorRef}function ln(e){return!!e&&dt(e.parse)&&e.__type===\"VVTypedSchema\"}function Ys(e){return!!e&&dt(e.validate)}function $r(e){return e===\"checkbox\"||e===\"radio\"}function lE(e){return bi(e)||Array.isArray(e)}function cE(e){return Array.isArray(e)?e.length===0:bi(e)&&Object.keys(e).length===0}function To(e){return/^\\[.+\\]$/i.test(e)}function uE(e){return pp(e)&&e.multiple}function pp(e){return e.tagName===\"SELECT\"}function fE(e,n){const t=![!1,null,void 0,0].includes(n.multiple)&&!Number.isNaN(n.multiple);return e===\"select\"&&\"multiple\"in n&&t}function dE(e,n){return!fE(e,n)&&n.type!==\"file\"&&!$r(n.type)}function mp(e){return jl(e)&&e.target&&\"submit\"in e.target}function jl(e){return e?!!(typeof Event<\"u\"&&dt(Event)&&e instanceof Event||e&&e.srcElement):!1}function mu(e,n){return n in e&&e[n]!==Ws}function xt(e,n){if(e===n)return!0;if(e&&n&&typeof e==\"object\"&&typeof n==\"object\"){if(e.constructor!==n.constructor)return!1;var t,i,r;if(Array.isArray(e)){if(t=e.length,t!=n.length)return!1;for(i=t;i--!==0;)if(!xt(e[i],n[i]))return!1;return!0}if(e instanceof Map&&n instanceof Map){if(e.size!==n.size)return!1;for(i of e.entries())if(!n.has(i[0]))return!1;for(i of e.entries())if(!xt(i[1],n.get(i[0])))return!1;return!0}if(gu(e)&&gu(n))return!(e.size!==n.size||e.name!==n.name||e.lastModified!==n.lastModified||e.type!==n.type);if(e instanceof Set&&n instanceof Set){if(e.size!==n.size)return!1;for(i of e.entries())if(!n.has(i[0]))return!1;return!0}if(ArrayBuffer.isView(e)&&ArrayBuffer.isView(n)){if(t=e.length,t!=n.length)return!1;for(i=t;i--!==0;)if(e[i]!==n[i])return!1;return!0}if(e.constructor===RegExp)return e.source===n.source&&e.flags===n.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===n.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===n.toString();for(r=Object.keys(e),t=r.length,i=t;i--!==0;){var s=r[i];if(!xt(e[s],n[s]))return!1}return!0}return e!==e&&n!==n}function gu(e){return aE?e instanceof File:!1}function Bl(e){return To(e)?e.replace(/\\[|\\]/gi,\"\"):e}function Ft(e,n,t){return e?To(n)?e[Bl(n)]:(n||\"\").split(/\\.|\\[(\\d+)\\]/).filter(Boolean).reduce((r,s)=>lE(r)&&s in r?r[s]:t,e):t}function Sn(e,n,t){if(To(n)){e[Bl(n)]=t;return}const i=n.split(/\\.|\\[(\\d+)\\]/).filter(Boolean);let r=e;for(let s=0;s<i.length;s++){if(s===i.length-1){r[i[s]]=t;return}(!(i[s]in r)||dp(r[i[s]]))&&(r[i[s]]=$l(i[s+1])?[]:{}),r=r[i[s]]}}function Yo(e,n){if(Array.isArray(e)&&$l(n)){e.splice(Number(n),1);return}bi(e)&&delete e[n]}function yu(e,n){if(To(n)){delete e[Bl(n)];return}const t=n.split(/\\.|\\[(\\d+)\\]/).filter(Boolean);let i=e;for(let s=0;s<t.length;s++){if(s===t.length-1){Yo(i,t[s]);break}if(!(t[s]in i)||dp(i[t[s]]))break;i=i[t[s]]}const r=t.map((s,o)=>Ft(e,t.slice(0,o).join(\".\")));for(let s=r.length-1;s>=0;s--)if(cE(r[s])){if(s===0){Yo(e,t[0]);continue}Yo(r[s-1],t[s-1])}}function Ut(e){return Object.keys(e)}function gp(e,n=void 0){const t=Yt();return(t==null?void 0:t.provides[e])||fi(e,n)}function vu(e,n,t){if(Array.isArray(e)){const i=[...e],r=i.findIndex(s=>xt(s,n));return r>=0?i.splice(r,1):i.push(n),i}return xt(e,n)?t:n}function bu(e,n=0){let t=null,i=[];return function(...r){return t&&clearTimeout(t),t=setTimeout(()=>{const s=e(...r);i.forEach(o=>o(s)),i=[]},n),new Promise(s=>i.push(s))}}function hE(e,n){return bi(n)&&n.number?tE(e):e}function Ra(e,n){let t;return async function(...r){const s=e(...r);t=s;const o=await s;return s!==t?o:(t=void 0,n(o,r))}}function Pa(e){return Array.isArray(e)?e:e?[e]:[]}function rs(e,n){const t={};for(const i in e)n.includes(i)||(t[i]=e[i]);return t}function pE(e){let n=null,t=[];return function(...i){const r=It(()=>{if(n!==r)return;const s=e(...i);t.forEach(o=>o(s)),t=[],n=null});return n=r,new Promise(s=>t.push(s))}}function Hl(e,n,t){return n.slots.default?typeof e==\"string\"||!e?n.slots.default(t()):{default:()=>{var i,r;return(r=(i=n.slots).default)===null||r===void 0?void 0:r.call(i,t())}}:n.slots.default}function Zo(e){if(yp(e))return e._value}function yp(e){return\"_value\"in e}function mE(e){return e.type===\"number\"||e.type===\"range\"?Number.isNaN(e.valueAsNumber)?e.value:e.valueAsNumber:e.value}function Zs(e){if(!jl(e))return e;const n=e.target;if($r(n.type)&&yp(n))return Zo(n);if(n.type===\"file\"&&n.files){const t=Array.from(n.files);return n.multiple?t:t[0]}if(uE(n))return Array.from(n.options).filter(t=>t.selected&&!t.disabled).map(Zo);if(pp(n)){const t=Array.from(n.options).find(i=>i.selected);return t?Zo(t):n.value}return mE(n)}function vp(e){const n={};return Object.defineProperty(n,\"_$$isNormalized\",{value:!0,writable:!1,enumerable:!1,configurable:!1}),e?bi(e)&&e._$$isNormalized?e:bi(e)?Object.keys(e).reduce((t,i)=>{const r=gE(e[i]);return e[i]!==!1&&(t[i]=_u(r)),t},n):typeof e!=\"string\"?n:e.split(\"|\").reduce((t,i)=>{const r=yE(i);return r.name&&(t[r.name]=_u(r.params)),t},n):n}function gE(e){return e===!0?[]:Array.isArray(e)||bi(e)?e:[e]}function _u(e){const n=t=>typeof t==\"string\"&&t[0]===\"@\"?vE(t.slice(1)):t;return Array.isArray(e)?e.map(n):e instanceof RegExp?[e]:Object.keys(e).reduce((t,i)=>(t[i]=n(e[i]),t),{})}const yE=e=>{let n=[];const t=e.split(\":\")[0];return e.includes(\":\")&&(n=e.split(\":\").slice(1).join(\":\").split(\",\")),{name:t,params:n}};function vE(e){const n=t=>Ft(t,e)||t[e];return n.__locatorRef=e,n}function bE(e){return Array.isArray(e)?e.filter(ka):Ut(e).filter(n=>ka(e[n])).map(n=>e[n])}const _E={generateMessage:({field:e})=>`${e} is not valid.`,bails:!0,validateOnBlur:!0,validateOnChange:!0,validateOnInput:!1,validateOnModelUpdate:!0};let Fa=Object.assign({},_E);const oi=()=>Fa,EE=e=>{Fa=Object.assign(Object.assign({},Fa),e)},SE=EE;async function bp(e,n,t={}){const i=t==null?void 0:t.bails,r={name:(t==null?void 0:t.name)||\"{field}\",rules:n,label:t==null?void 0:t.label,bails:i??!0,formData:(t==null?void 0:t.values)||{}},s=await wE(r,e);return Object.assign(Object.assign({},s),{valid:!s.errors.length})}async function wE(e,n){const t=e.rules;if(ln(t)||Ys(t))return TE(n,Object.assign(Object.assign({},e),{rules:t}));if(dt(t)||Array.isArray(t)){const a={field:e.label||e.name,name:e.name,label:e.label,form:e.formData,value:n},l=Array.isArray(t)?t:[t],c=l.length,u=[];for(let f=0;f<c;f++){const p=l[f],m=await p(n,a);if(!(typeof m!=\"string\"&&!Array.isArray(m)&&m)){if(Array.isArray(m))u.push(...m);else{const b=typeof m==\"string\"?m:Ep(a);u.push(b)}if(e.bails)return{errors:u}}}return{errors:u}}const i=Object.assign(Object.assign({},e),{rules:vp(t)}),r=[],s=Object.keys(i.rules),o=s.length;for(let a=0;a<o;a++){const l=s[a],c=await AE(i,n,{name:l,params:i.rules[l]});if(c.error&&(r.push(c.error),e.bails))return{errors:r}}return{errors:r}}function CE(e){return!!e&&e.name===\"ValidationError\"}function _p(e){return{__type:\"VVTypedSchema\",async parse(t,i){var r;try{return{output:await e.validate(t,{abortEarly:!1,context:(i==null?void 0:i.formData)||{}}),errors:[]}}catch(s){if(!CE(s))throw s;if(!(!((r=s.inner)===null||r===void 0)&&r.length)&&s.errors.length)return{errors:[{path:s.path,errors:s.errors}]};const o=s.inner.reduce((a,l)=>{const c=l.path||\"\";return a[c]||(a[c]={errors:[],path:c}),a[c].errors.push(...l.errors),a},{});return{errors:Object.values(o)}}}}}async function TE(e,n){const i=await(ln(n.rules)?n.rules:_p(n.rules)).parse(e,{formData:n.formData}),r=[];for(const s of i.errors)s.errors.length&&r.push(...s.errors);return{value:i.value,errors:r}}async function AE(e,n,t){const i=rE(t.name);if(!i)throw new Error(`No such validator '${t.name}' exists.`);const r=OE(t.params,e.formData),s={field:e.label||e.name,name:e.name,label:e.label,value:n,form:e.formData,rule:Object.assign(Object.assign({},t),{params:r})},o=await i(n,r,s);return typeof o==\"string\"?{error:o}:{error:o?void 0:Ep(s)}}function Ep(e){const n=oi().generateMessage;return n?n(e):\"Field is invalid\"}function OE(e,n){const t=i=>ka(i)?i(n):i;return Array.isArray(e)?e.map(t):Object.keys(e).reduce((i,r)=>(i[r]=t(e[r]),i),{})}async function xE(e,n){const i=await(ln(e)?e:_p(e)).parse(Fe(n)),r={},s={};for(const o of i.errors){const a=o.errors,l=(o.path||\"\").replace(/\\[\"(\\d+)\"\\]/g,(c,u)=>`[${u}]`);r[l]={valid:!a.length,errors:a},a.length&&(s[l]=a[0])}return{valid:!i.errors.length,results:r,errors:s,values:i.value,source:\"schema\"}}async function DE(e,n,t){const r=Ut(e).map(async c=>{var u,f,p;const m=(u=t==null?void 0:t.names)===null||u===void 0?void 0:u[c],g=await bp(Ft(n,c),e[c],{name:(m==null?void 0:m.name)||c,label:m==null?void 0:m.label,values:n,bails:(p=(f=t==null?void 0:t.bailsMap)===null||f===void 0?void 0:f[c])!==null&&p!==void 0?p:!0});return Object.assign(Object.assign({},g),{path:c})});let s=!0;const o=await Promise.all(r),a={},l={};for(const c of o)a[c.path]={valid:c.valid,errors:c.errors},c.valid||(s=!1,l[c.path]=c.errors[0]);return{valid:s,results:a,errors:l,source:\"schema\"}}let Eu=0;function ME(e,n){const{value:t,initialValue:i,setInitialValue:r}=NE(e,n.modelValue,n.form);if(!n.form){let p=function(g){var b;\"value\"in g&&(t.value=g.value),\"errors\"in g&&c(g.errors),\"touched\"in g&&(f.touched=(b=g.touched)!==null&&b!==void 0?b:f.touched),\"initialValue\"in g&&r(g.initialValue)};var a=p;const{errors:l,setErrors:c}=RE(),u=Eu>=Number.MAX_SAFE_INTEGER?0:++Eu,f=kE(t,i,l,n.schema);return{id:u,path:e,value:t,initialValue:i,meta:f,flags:{pendingUnmount:{[u]:!1},pendingReset:!1},errors:l,setState:p}}const s=n.form.createPathState(e,{bails:n.bails,label:n.label,type:n.type,validate:n.validate,schema:n.schema}),o=Me(()=>s.errors);function a(l){var c,u,f;\"value\"in l&&(t.value=l.value),\"errors\"in l&&((c=n.form)===null||c===void 0||c.setFieldError(Ve(e),l.errors)),\"touched\"in l&&((u=n.form)===null||u===void 0||u.setFieldTouched(Ve(e),(f=l.touched)!==null&&f!==void 0?f:!1)),\"initialValue\"in l&&r(l.initialValue)}return{id:Array.isArray(s.id)?s.id[s.id.length-1]:s.id,path:e,value:t,errors:o,meta:s,initialValue:i,flags:s.__flags,setState:a}}function NE(e,n,t){const i=bt(Ve(n));function r(){return t?Ft(t.initialValues.value,Ve(e),Ve(i)):Ve(i)}function s(c){if(!t){i.value=c;return}t.setFieldInitialValue(Ve(e),c,!0)}const o=Me(r);if(!t)return{value:bt(r()),initialValue:o,setInitialValue:s};const a=IE(n,t,o,e);return t.stageInitialValue(Ve(e),a,!0),{value:Me({get(){return Ft(t.values,Ve(e))},set(c){t.setFieldValue(Ve(e),c,!1)}}),initialValue:o,setInitialValue:s}}function IE(e,n,t,i){return Xe(e)?Ve(e):e!==void 0?e:Ft(n.values,Ve(i),Ve(t))}function kE(e,n,t,i){const r=Me(()=>{var o,a,l;return(l=(a=(o=Ce(i))===null||o===void 0?void 0:o.describe)===null||a===void 0?void 0:a.call(o).required)!==null&&l!==void 0?l:!1}),s=zn({touched:!1,pending:!1,valid:!0,required:r,validated:!!Ve(t).length,initialValue:Me(()=>Ve(n)),dirty:Me(()=>!xt(Ve(e),Ve(n)))});return en(t,o=>{s.valid=!o.length},{immediate:!0,flush:\"sync\"}),s}function RE(){const e=bt([]);return{errors:e,setErrors:n=>{e.value=Pa(n)}}}function PE(e,n,t){return $r(t==null?void 0:t.type)?LE(e,n,t):Sp(e,n,t)}function Sp(e,n,t){const{initialValue:i,validateOnMount:r,bails:s,type:o,checkedValue:a,label:l,validateOnValueUpdate:c,uncheckedValue:u,controlled:f,keepValueOnUnmount:p,syncVModel:m,form:g}=FE(t),b=f?gp(Co):void 0,M=g||b,P=Me(()=>rr(Ce(e))),A=Me(()=>{if(Ce(M==null?void 0:M.schema))return;const de=Ve(n);return Ys(de)||ln(de)||dt(de)||Array.isArray(de)?de:vp(de)}),v=!dt(A.value)&&ln(Ce(n)),{id:C,value:D,initialValue:O,meta:L,setState:F,errors:T,flags:x}=ME(P,{modelValue:i,form:M,bails:s,label:l,type:o,validate:A.value?U:void 0,schema:v?n:void 0}),H=Me(()=>T.value[0]);m&&VE({value:D,prop:m,handleChange:X,shouldValidate:()=>c&&!x.pendingReset});const N=(ee,de=!1)=>{L.touched=!0,de&&re()};async function z(ee){var de,Ie;if(M!=null&&M.validateSchema){const{results:we}=await M.validateSchema(ee);return(de=we[Ce(P)])!==null&&de!==void 0?de:{valid:!0,errors:[]}}return A.value?bp(D.value,A.value,{name:Ce(P),label:Ce(l),values:(Ie=M==null?void 0:M.values)!==null&&Ie!==void 0?Ie:{},bails:s}):{valid:!0,errors:[]}}const re=Ra(async()=>(L.pending=!0,L.validated=!0,z(\"validated-only\")),ee=>(x.pendingUnmount[ht.id]||(F({errors:ee.errors}),L.pending=!1,L.valid=ee.valid),ee)),ne=Ra(async()=>z(\"silent\"),ee=>(L.valid=ee.valid,ee));function U(ee){return(ee==null?void 0:ee.mode)===\"silent\"?ne():re()}function X(ee,de=!0){const Ie=Zs(ee);Ye(Ie,de)}Ci(()=>{if(r)return re();(!M||!M.validateSchema)&&ne()});function Q(ee){L.touched=ee}function He(ee){var de;const Ie=ee&&\"value\"in ee?ee.value:O.value;F({value:Fe(Ie),initialValue:Fe(Ie),touched:(de=ee==null?void 0:ee.touched)!==null&&de!==void 0?de:!1,errors:(ee==null?void 0:ee.errors)||[]}),L.pending=!1,L.validated=!1,ne()}const wt=Yt();function Ye(ee,de=!0){D.value=wt&&m?hE(ee,wt.props.modelModifiers):ee,(de?re:ne)()}function Ct(ee){F({errors:Array.isArray(ee)?ee:[ee]})}const hn=Me({get(){return D.value},set(ee){Ye(ee,c)}}),ht={id:C,name:P,label:l,value:hn,meta:L,errors:T,errorMessage:H,type:o,checkedValue:a,uncheckedValue:u,bails:s,keepValueOnUnmount:p,resetField:He,handleReset:()=>He(),validate:U,handleChange:X,handleBlur:N,setState:F,setTouched:Q,setErrors:Ct,setValue:Ye};if(co(oE,ht),Xe(n)&&typeof Ve(n)!=\"function\"&&en(n,(ee,de)=>{xt(ee,de)||(L.validated?re():ne())},{deep:!0}),!M)return ht;const sn=Me(()=>{const ee=A.value;return!ee||dt(ee)||Ys(ee)||ln(ee)||Array.isArray(ee)?{}:Object.keys(ee).reduce((de,Ie)=>{const we=bE(ee[Ie]).map(at=>at.__locatorRef).reduce((at,lt)=>{const ct=Ft(M.values,lt)||M.values[lt];return ct!==void 0&&(at[lt]=ct),at},{});return Object.assign(de,we),de},{})});return en(sn,(ee,de)=>{if(!Object.keys(ee).length)return;!xt(ee,de)&&(L.validated?re():ne())}),Mr(()=>{var ee;const de=(ee=Ce(ht.keepValueOnUnmount))!==null&&ee!==void 0?ee:Ce(M.keepValuesOnUnmount),Ie=Ce(P);if(de||!M||x.pendingUnmount[ht.id]){M==null||M.removePathState(Ie,C);return}x.pendingUnmount[ht.id]=!0;const we=M.getPathState(Ie);if(Array.isArray(we==null?void 0:we.id)&&(we!=null&&we.multiple)?we!=null&&we.id.includes(ht.id):(we==null?void 0:we.id)===ht.id){if(we!=null&&we.multiple&&Array.isArray(we.value)){const lt=we.value.findIndex(ct=>xt(ct,Ce(ht.checkedValue)));if(lt>-1){const ct=[...we.value];ct.splice(lt,1),M.setFieldValue(Ie,ct)}Array.isArray(we.id)&&we.id.splice(we.id.indexOf(ht.id),1)}else M.unsetPathValue(Ce(P));M.removePathState(Ie,C)}}),ht}function FE(e){const n=()=>({initialValue:void 0,validateOnMount:!1,bails:!0,label:void 0,validateOnValueUpdate:!0,keepValueOnUnmount:void 0,syncVModel:!1,controlled:!0}),t=!!(e!=null&&e.syncVModel),i=typeof(e==null?void 0:e.syncVModel)==\"string\"?e.syncVModel:(e==null?void 0:e.modelPropName)||\"modelValue\",r=t&&!(\"initialValue\"in(e||{}))?La(Yt(),i):e==null?void 0:e.initialValue;if(!e)return Object.assign(Object.assign({},n()),{initialValue:r});const s=\"valueProp\"in e?e.valueProp:e.checkedValue,o=\"standalone\"in e?!e.standalone:e.controlled,a=(e==null?void 0:e.modelPropName)||(e==null?void 0:e.syncVModel)||!1;return Object.assign(Object.assign(Object.assign({},n()),e||{}),{initialValue:r,controlled:o??!0,checkedValue:s,syncVModel:a})}function LE(e,n,t){const i=t!=null&&t.standalone?void 0:gp(Co),r=t==null?void 0:t.checkedValue,s=t==null?void 0:t.uncheckedValue;function o(a){const l=a.handleChange,c=Me(()=>{const f=Ce(a.value),p=Ce(r);return Array.isArray(f)?f.findIndex(m=>xt(m,p))>=0:xt(p,f)});function u(f,p=!0){var m,g;if(c.value===((m=f==null?void 0:f.target)===null||m===void 0?void 0:m.checked)){p&&a.validate();return}const b=Ce(e),M=i==null?void 0:i.getPathState(b),P=Zs(f);let A=(g=Ce(r))!==null&&g!==void 0?g:P;i&&(M!=null&&M.multiple)&&M.type===\"checkbox\"?A=vu(Ft(i.values,b)||[],A,void 0):(t==null?void 0:t.type)===\"checkbox\"&&(A=vu(Ce(a.value),A,Ce(s))),l(A,p)}return Object.assign(Object.assign({},a),{checked:c,checkedValue:r,uncheckedValue:s,handleChange:u})}return o(Sp(e,n,t))}function VE({prop:e,value:n,handleChange:t,shouldValidate:i}){const r=Yt();if(!r||!e)return;const s=typeof e==\"string\"?e:\"modelValue\",o=`update:${s}`;s in r.props&&(en(n,a=>{xt(a,La(r,s))||r.emit(o,a)}),en(()=>La(r,s),a=>{if(a===Ws&&n.value===void 0)return;const l=a===Ws?void 0:a;xt(l,n.value)||t(l,i())}))}function La(e,n){if(e)return e.props[n]}const $E=Zi({name:\"Field\",inheritAttrs:!1,props:{as:{type:[String,Object],default:void 0},name:{type:String,required:!0},rules:{type:[Object,String,Function],default:void 0},validateOnMount:{type:Boolean,default:!1},validateOnBlur:{type:Boolean,default:void 0},validateOnChange:{type:Boolean,default:void 0},validateOnInput:{type:Boolean,default:void 0},validateOnModelUpdate:{type:Boolean,default:void 0},bails:{type:Boolean,default:()=>oi().bails},label:{type:String,default:void 0},uncheckedValue:{type:null,default:void 0},modelValue:{type:null,default:Ws},modelModifiers:{type:null,default:()=>({})},\"onUpdate:modelValue\":{type:null,default:void 0},standalone:{type:Boolean,default:!1},keepValue:{type:Boolean,default:void 0}},setup(e,n){const t=Vn(e,\"rules\"),i=Vn(e,\"name\"),r=Vn(e,\"label\"),s=Vn(e,\"uncheckedValue\"),o=Vn(e,\"keepValue\"),{errors:a,value:l,errorMessage:c,validate:u,handleChange:f,handleBlur:p,setTouched:m,resetField:g,handleReset:b,meta:M,checked:P,setErrors:A,setValue:v}=PE(i,t,{validateOnMount:e.validateOnMount,bails:e.bails,standalone:e.standalone,type:n.attrs.type,initialValue:BE(e,n),checkedValue:n.attrs.value,uncheckedValue:s,label:r,validateOnValueUpdate:e.validateOnModelUpdate,keepValueOnUnmount:o,syncVModel:!0}),C=function(x,H=!0){f(x,H)},D=Me(()=>{const{validateOnInput:T,validateOnChange:x,validateOnBlur:H,validateOnModelUpdate:N}=jE(e);function z(X){p(X,H),dt(n.attrs.onBlur)&&n.attrs.onBlur(X)}function re(X){C(X,T),dt(n.attrs.onInput)&&n.attrs.onInput(X)}function ne(X){C(X,x),dt(n.attrs.onChange)&&n.attrs.onChange(X)}const U={name:e.name,onBlur:z,onInput:re,onChange:ne};return U[\"onUpdate:modelValue\"]=X=>C(X,N),U}),O=Me(()=>{const T=Object.assign({},D.value);$r(n.attrs.type)&&P&&(T.checked=P.value);const x=Su(e,n);return dE(x,n.attrs)&&(T.value=l.value),T}),L=Me(()=>Object.assign(Object.assign({},D.value),{modelValue:l.value}));function F(){return{field:O.value,componentField:L.value,value:l.value,meta:M,errors:a.value,errorMessage:c.value,validate:u,resetField:g,handleChange:C,handleInput:T=>C(T,!1),handleReset:b,handleBlur:D.value.onBlur,setTouched:m,setErrors:A,setValue:v}}return n.expose({value:l,meta:M,errors:a,errorMessage:c,setErrors:A,setTouched:m,setValue:v,reset:g,validate:u,handleChange:f}),()=>{const T=lo(Su(e,n)),x=Hl(T,n,F);return T?Bi(T,Object.assign(Object.assign({},n.attrs),O.value),x):x}}});function Su(e,n){let t=e.as||\"\";return!e.as&&!n.slots.default&&(t=\"input\"),t}function jE(e){var n,t,i,r;const{validateOnInput:s,validateOnChange:o,validateOnBlur:a,validateOnModelUpdate:l}=oi();return{validateOnInput:(n=e.validateOnInput)!==null&&n!==void 0?n:s,validateOnChange:(t=e.validateOnChange)!==null&&t!==void 0?t:o,validateOnBlur:(i=e.validateOnBlur)!==null&&i!==void 0?i:a,validateOnModelUpdate:(r=e.validateOnModelUpdate)!==null&&r!==void 0?r:l}}function BE(e,n){return $r(n.attrs.type)?mu(e,\"modelValue\")?e.modelValue:void 0:mu(e,\"modelValue\")?e.modelValue:n.attrs.value}const HE=$E;let UE=0;const ss=[\"bails\",\"fieldsCount\",\"id\",\"multiple\",\"type\",\"validate\"];function wp(e){const n=(e==null?void 0:e.initialValues)||{},t=Object.assign({},Ce(n)),i=Ve(e==null?void 0:e.validationSchema);return i&&ln(i)&&dt(i.cast)?Fe(i.cast(t)||{}):Fe(t)}function qE(e){var n;const t=UE++;let i=0;const r=bt(!1),s=bt(!1),o=bt(0),a=[],l=zn(wp(e)),c=bt([]),u=bt({}),f=bt({}),p=pE(()=>{f.value=c.value.reduce((E,S)=>(E[rr(Ce(S.path))]=S,E),{})});function m(E,S){const V=U(E);if(!V){typeof E==\"string\"&&(u.value[rr(E)]=Pa(S));return}if(typeof E==\"string\"){const G=rr(E);u.value[G]&&delete u.value[G]}V.errors=Pa(S),V.valid=!V.errors.length}function g(E){Ut(E).forEach(S=>{m(S,E[S])})}e!=null&&e.initialErrors&&g(e.initialErrors);const b=Me(()=>{const E=c.value.reduce((S,V)=>(V.errors.length&&(S[V.path]=V.errors),S),{});return Object.assign(Object.assign({},u.value),E)}),M=Me(()=>Ut(b.value).reduce((E,S)=>{const V=b.value[S];return V!=null&&V.length&&(E[S]=V[0]),E},{})),P=Me(()=>c.value.reduce((E,S)=>(E[S.path]={name:S.path||\"\",label:S.label||\"\"},E),{})),A=Me(()=>c.value.reduce((E,S)=>{var V;return E[S.path]=(V=S.bails)!==null&&V!==void 0?V:!0,E},{})),v=Object.assign({},(e==null?void 0:e.initialErrors)||{}),C=(n=e==null?void 0:e.keepValuesOnUnmount)!==null&&n!==void 0?n:!1,{initialValues:D,originalInitialValues:O,setInitialValues:L}=KE(c,l,e),F=zE(c,l,O,M),T=Me(()=>c.value.reduce((E,S)=>{const V=Ft(l,S.path);return Sn(E,S.path,V),E},{})),x=e==null?void 0:e.validationSchema;function H(E,S){var V,G;const ue=Me(()=>Ft(D.value,Ce(E))),he=f.value[Ce(E)],J=(S==null?void 0:S.type)===\"checkbox\"||(S==null?void 0:S.type)===\"radio\";if(he&&J){he.multiple=!0;const Dt=i++;return Array.isArray(he.id)?he.id.push(Dt):he.id=[he.id,Dt],he.fieldsCount++,he.__flags.pendingUnmount[Dt]=!1,he}const ye=Me(()=>Ft(l,Ce(E))),Te=Ce(E),Ge=Q.findIndex(Dt=>Dt===Te);Ge!==-1&&Q.splice(Ge,1);const Pe=Me(()=>{var Dt,Xn,d,h;const w=Ce(x);if(ln(w))return(Xn=(Dt=w.describe)===null||Dt===void 0?void 0:Dt.call(w,Ce(E)).required)!==null&&Xn!==void 0?Xn:!1;const I=Ce(S==null?void 0:S.schema);return ln(I)&&(h=(d=I.describe)===null||d===void 0?void 0:d.call(I).required)!==null&&h!==void 0?h:!1}),Qe=i++,Ue=zn({id:Qe,path:E,touched:!1,pending:!1,valid:!0,validated:!!(!((V=v[Te])===null||V===void 0)&&V.length),required:Pe,initialValue:ue,errors:Ef([]),bails:(G=S==null?void 0:S.bails)!==null&&G!==void 0?G:!1,label:S==null?void 0:S.label,type:(S==null?void 0:S.type)||\"default\",value:ye,multiple:!1,__flags:{pendingUnmount:{[Qe]:!1},pendingReset:!1},fieldsCount:1,validate:S==null?void 0:S.validate,dirty:Me(()=>!xt(Ve(ye),Ve(ue)))});return c.value.push(Ue),f.value[Te]=Ue,p(),M.value[Te]&&!v[Te]&&It(()=>{K(Te,{mode:\"silent\"})}),Xe(E)&&en(E,Dt=>{p();const Xn=Fe(ye.value);f.value[Dt]=Ue,It(()=>{Sn(l,Dt,Xn)})}),Ue}const N=bu(te,5),z=bu(te,5),re=Ra(async E=>await(E===\"silent\"?N():z()),(E,[S])=>{const V=Ut(ee.errorBag.value),ue=[...new Set([...Ut(E.results),...c.value.map(he=>he.path),...V])].sort().reduce((he,J)=>{var ye;const Te=J,Ge=U(Te)||X(Te),Pe=((ye=E.results[Te])===null||ye===void 0?void 0:ye.errors)||[],Qe=Ce(Ge==null?void 0:Ge.path)||Te,Ue=WE({errors:Pe,valid:!Pe.length},he.results[Qe]);return he.results[Qe]=Ue,Ue.valid||(he.errors[Qe]=Ue.errors[0]),Ge&&u.value[Qe]&&delete u.value[Qe],Ge?(Ge.valid=Ue.valid,S===\"silent\"||S===\"validated-only\"&&!Ge.validated||m(Ge,Ue.errors),he):(m(Qe,Pe),he)},{valid:E.valid,results:{},errors:{},source:E.source});return E.values&&(ue.values=E.values,ue.source=E.source),Ut(ue.results).forEach(he=>{var J;const ye=U(he);ye&&S!==\"silent\"&&(S===\"validated-only\"&&!ye.validated||m(ye,(J=ue.results[he])===null||J===void 0?void 0:J.errors))}),ue});function ne(E){c.value.forEach(E)}function U(E){const S=typeof E==\"string\"?rr(E):E;return typeof S==\"string\"?f.value[S]:S}function X(E){return c.value.filter(V=>E.startsWith(V.path)).reduce((V,G)=>V?G.path.length>V.path.length?G:V:G,void 0)}let Q=[],He;function wt(E){return Q.push(E),He||(He=It(()=>{[...Q].sort().reverse().forEach(V=>{yu(l,V)}),Q=[],He=null})),He}function Ye(E){return function(V,G){return function(he){return he instanceof Event&&(he.preventDefault(),he.stopPropagation()),ne(J=>J.touched=!0),r.value=!0,o.value++,B().then(J=>{const ye=Fe(l);if(J.valid&&typeof V==\"function\"){const Te=Fe(T.value);let Ge=E?Te:ye;return J.values&&(Ge=J.source===\"schema\"?J.values:Object.assign({},Ge,J.values)),V(Ge,{evt:he,controlledValues:Te,setErrors:g,setFieldError:m,setTouched:k,setFieldTouched:lt,setValues:we,setFieldValue:de,resetForm:$,resetField:q})}!J.valid&&typeof G==\"function\"&&G({values:ye,evt:he,errors:J.errors,results:J.results})}).then(J=>(r.value=!1,J),J=>{throw r.value=!1,J})}}}const hn=Ye(!1);hn.withControlled=Ye(!0);function ht(E,S){const V=c.value.findIndex(ue=>ue.path===E&&(Array.isArray(ue.id)?ue.id.includes(S):ue.id===S)),G=c.value[V];if(!(V===-1||!G)){if(It(()=>{K(E,{mode:\"silent\",warn:!1})}),G.multiple&&G.fieldsCount&&G.fieldsCount--,Array.isArray(G.id)){const ue=G.id.indexOf(S);ue>=0&&G.id.splice(ue,1),delete G.__flags.pendingUnmount[S]}(!G.multiple||G.fieldsCount<=0)&&(c.value.splice(V,1),W(E),p(),delete f.value[E])}}function sn(E){Ut(f.value).forEach(S=>{S.startsWith(E)&&delete f.value[S]}),c.value=c.value.filter(S=>!S.path.startsWith(E)),It(()=>{p()})}const ee={formId:t,values:l,controlledValues:T,errorBag:b,errors:M,schema:x,submitCount:o,meta:F,isSubmitting:r,isValidating:s,fieldArrays:a,keepValuesOnUnmount:C,validateSchema:Ve(x)?re:void 0,validate:B,setFieldError:m,validateField:K,setFieldValue:de,setValues:we,setErrors:g,setFieldTouched:lt,setTouched:k,resetForm:$,resetField:q,handleSubmit:hn,useFieldModel:pe,defineInputBinds:ge,defineComponentBinds:Le,defineField:oe,stageInitialValue:Z,unsetInitialValue:W,setFieldInitialValue:j,createPathState:H,getPathState:U,unsetPathValue:wt,removePathState:ht,initialValues:D,getAllPathStates:()=>c.value,destroyPath:sn,isFieldTouched:ct,isFieldDirty:y,isFieldValid:_};function de(E,S,V=!0){const G=Fe(S),ue=typeof E==\"string\"?E:E.path;U(ue)||H(ue),Sn(l,ue,G),V&&K(ue)}function Ie(E,S=!0){Ut(l).forEach(V=>{delete l[V]}),Ut(E).forEach(V=>{de(V,E[V],!1)}),S&&B()}function we(E,S=!0){Ar(l,E),a.forEach(V=>V&&V.reset()),S&&B()}function at(E,S){const V=U(Ce(E))||H(E);return Me({get(){return V.value},set(G){var ue;const he=Ce(E);de(he,G,(ue=Ce(S))!==null&&ue!==void 0?ue:!1)}})}function lt(E,S){const V=U(E);V&&(V.touched=S)}function ct(E){const S=U(E);return S?S.touched:c.value.filter(V=>V.path.startsWith(E)).some(V=>V.touched)}function y(E){const S=U(E);return S?S.dirty:c.value.filter(V=>V.path.startsWith(E)).some(V=>V.dirty)}function _(E){const S=U(E);return S?S.valid:c.value.filter(V=>V.path.startsWith(E)).every(V=>V.valid)}function k(E){if(typeof E==\"boolean\"){ne(S=>{S.touched=E});return}Ut(E).forEach(S=>{lt(S,!!E[S])})}function q(E,S){var V;const G=S&&\"value\"in S?S.value:Ft(D.value,E),ue=U(E);ue&&(ue.__flags.pendingReset=!0),j(E,Fe(G),!0),de(E,G,!1),lt(E,(V=S==null?void 0:S.touched)!==null&&V!==void 0?V:!1),m(E,(S==null?void 0:S.errors)||[]),It(()=>{ue&&(ue.__flags.pendingReset=!1)})}function $(E,S){let V=Fe(E!=null&&E.values?E.values:O.value);V=S!=null&&S.force?V:Ar(O.value,V),V=ln(x)&&dt(x.cast)?x.cast(V):V,L(V,{force:S==null?void 0:S.force}),ne(G=>{var ue;G.__flags.pendingReset=!0,G.validated=!1,G.touched=((ue=E==null?void 0:E.touched)===null||ue===void 0?void 0:ue[G.path])||!1,de(G.path,Ft(V,G.path),!1),m(G.path,void 0)}),S!=null&&S.force?Ie(V,!1):we(V,!1),g((E==null?void 0:E.errors)||{}),o.value=(E==null?void 0:E.submitCount)||0,It(()=>{B({mode:\"silent\"}),ne(G=>{G.__flags.pendingReset=!1})})}async function B(E){const S=(E==null?void 0:E.mode)||\"force\";if(S===\"force\"&&ne(J=>J.validated=!0),ee.validateSchema)return ee.validateSchema(S);s.value=!0;const V=await Promise.all(c.value.map(J=>J.validate?J.validate(E).then(ye=>({key:J.path,valid:ye.valid,errors:ye.errors,value:ye.value})):Promise.resolve({key:J.path,valid:!0,errors:[],value:void 0})));s.value=!1;const G={},ue={},he={};for(const J of V)G[J.key]={valid:J.valid,errors:J.errors},J.value&&Sn(he,J.key,J.value),J.errors.length&&(ue[J.key]=J.errors[0]);return{valid:V.every(J=>J.valid),results:G,errors:ue,values:he,source:\"fields\"}}async function K(E,S){var V;const G=U(E);if(G&&(S==null?void 0:S.mode)!==\"silent\"&&(G.validated=!0),x){const{results:ue}=await re((S==null?void 0:S.mode)||\"validated-only\");return ue[E]||{errors:[],valid:!0}}return G!=null&&G.validate?G.validate(S):(!G&&(V=S==null?void 0:S.warn),Promise.resolve({errors:[],valid:!0}))}function W(E){yu(D.value,E)}function Z(E,S,V=!1){j(E,S),Sn(l,E,S),V&&!(e!=null&&e.initialValues)&&Sn(O.value,E,Fe(S))}function j(E,S,V=!1){Sn(D.value,E,Fe(S)),V&&Sn(O.value,E,Fe(S))}async function te(){const E=Ve(x);if(!E)return{valid:!0,results:{},errors:{},source:\"none\"};s.value=!0;const S=Ys(E)||ln(E)?await xE(E,l):await DE(E,l,{names:P.value,bailsMap:A.value});return s.value=!1,S}const ce=hn((E,{evt:S})=>{mp(S)&&S.target.submit()});Ci(()=>{if(e!=null&&e.initialErrors&&g(e.initialErrors),e!=null&&e.initialTouched&&k(e.initialTouched),e!=null&&e.validateOnMount){B();return}ee.validateSchema&&ee.validateSchema(\"silent\")}),Xe(x)&&en(x,()=>{var E;(E=ee.validateSchema)===null||E===void 0||E.call(ee,\"validated-only\")}),co(Co,ee);function oe(E,S){const V=dt(S)||S==null?void 0:S.label,G=U(Ce(E))||H(E,{label:V}),ue=()=>dt(S)?S(rs(G,ss)):S||{};function he(){var Pe;G.touched=!0,((Pe=ue().validateOnBlur)!==null&&Pe!==void 0?Pe:oi().validateOnBlur)&&K(G.path)}function J(){var Pe;((Pe=ue().validateOnInput)!==null&&Pe!==void 0?Pe:oi().validateOnInput)&&It(()=>{K(G.path)})}function ye(){var Pe;((Pe=ue().validateOnChange)!==null&&Pe!==void 0?Pe:oi().validateOnChange)&&It(()=>{K(G.path)})}const Te=Me(()=>{const Pe={onChange:ye,onInput:J,onBlur:he};return dt(S)?Object.assign(Object.assign({},Pe),S(rs(G,ss)).props||{}):S!=null&&S.props?Object.assign(Object.assign({},Pe),S.props(rs(G,ss))):Pe});return[at(E,()=>{var Pe,Qe,Ue;return(Ue=(Pe=ue().validateOnModelUpdate)!==null&&Pe!==void 0?Pe:(Qe=oi())===null||Qe===void 0?void 0:Qe.validateOnModelUpdate)!==null&&Ue!==void 0?Ue:!0}),Te]}function pe(E){return Array.isArray(E)?E.map(S=>at(S,!0)):at(E)}function ge(E,S){const[V,G]=oe(E,S);function ue(){G.value.onBlur()}function he(ye){const Te=Zs(ye);de(Ce(E),Te,!1),G.value.onInput()}function J(ye){const Te=Zs(ye);de(Ce(E),Te,!1),G.value.onChange()}return Me(()=>Object.assign(Object.assign({},G.value),{onBlur:ue,onInput:he,onChange:J,value:V.value}))}function Le(E,S){const[V,G]=oe(E,S),ue=U(Ce(E));function he(J){V.value=J}return Me(()=>{const J=dt(S)?S(rs(ue,ss)):S||{};return Object.assign({[J.model||\"modelValue\"]:V.value,[`onUpdate:${J.model||\"modelValue\"}`]:he},G.value)})}return Object.assign(Object.assign({},ee),{values:eo(l),handleReset:()=>$(),submitForm:ce})}function zE(e,n,t,i){const r={touched:\"some\",pending:\"some\",valid:\"every\"},s=Me(()=>!xt(n,Ve(t)));function o(){const l=e.value;return Ut(r).reduce((c,u)=>{const f=r[u];return c[u]=l[f](p=>p[u]),c},{})}const a=zn(o());return ud(()=>{const l=o();a.touched=l.touched,a.valid=l.valid,a.pending=l.pending}),Me(()=>Object.assign(Object.assign({initialValues:Ve(t)},a),{valid:a.valid&&!Ut(i.value).length,dirty:s.value}))}function KE(e,n,t){const i=wp(t),r=bt(i),s=bt(Fe(i));function o(a,l){l!=null&&l.force?(r.value=Fe(a),s.value=Fe(a)):(r.value=Ar(Fe(r.value)||{},Fe(a)),s.value=Ar(Fe(s.value)||{},Fe(a))),l!=null&&l.updateFields&&e.value.forEach(c=>{if(c.touched)return;const f=Ft(r.value,c.path);Sn(n,c.path,Fe(f))})}return{initialValues:r,originalInitialValues:s,setInitialValues:o}}function WE(e,n){return n?{valid:e.valid&&n.valid,errors:[...e.errors,...n.errors]}:e}const YE=Zi({name:\"Form\",inheritAttrs:!1,props:{as:{type:null,default:\"form\"},validationSchema:{type:Object,default:void 0},initialValues:{type:Object,default:void 0},initialErrors:{type:Object,default:void 0},initialTouched:{type:Object,default:void 0},validateOnMount:{type:Boolean,default:!1},onSubmit:{type:Function,default:void 0},onInvalidSubmit:{type:Function,default:void 0},keepValues:{type:Boolean,default:!1}},setup(e,n){const t=Vn(e,\"validationSchema\"),i=Vn(e,\"keepValues\"),{errors:r,errorBag:s,values:o,meta:a,isSubmitting:l,isValidating:c,submitCount:u,controlledValues:f,validate:p,validateField:m,handleReset:g,resetForm:b,handleSubmit:M,setErrors:P,setFieldError:A,setFieldValue:v,setValues:C,setFieldTouched:D,setTouched:O,resetField:L}=qE({validationSchema:t.value?t:void 0,initialValues:e.initialValues,initialErrors:e.initialErrors,initialTouched:e.initialTouched,validateOnMount:e.validateOnMount,keepValuesOnUnmount:i}),F=M((U,{evt:X})=>{mp(X)&&X.target.submit()},e.onInvalidSubmit),T=e.onSubmit?M(e.onSubmit,e.onInvalidSubmit):F;function x(U){jl(U)&&U.preventDefault(),g(),typeof n.attrs.onReset==\"function\"&&n.attrs.onReset()}function H(U,X){return M(typeof U==\"function\"&&!X?U:X,e.onInvalidSubmit)(U)}function N(){return Fe(o)}function z(){return Fe(a.value)}function re(){return Fe(r.value)}function ne(){return{meta:a.value,errors:r.value,errorBag:s.value,values:o,isSubmitting:l.value,isValidating:c.value,submitCount:u.value,controlledValues:f.value,validate:p,validateField:m,handleSubmit:H,handleReset:g,submitForm:F,setErrors:P,setFieldError:A,setFieldValue:v,setValues:C,setFieldTouched:D,setTouched:O,resetForm:b,resetField:L,getValues:N,getMeta:z,getErrors:re}}return n.expose({setFieldError:A,setErrors:P,setFieldValue:v,setValues:C,setFieldTouched:D,setTouched:O,resetForm:b,validate:p,validateField:m,resetField:L,getValues:N,getMeta:z,getErrors:re,values:o,meta:a,errors:r}),function(){const X=e.as===\"form\"?e.as:e.as?lo(e.as):null,Q=Hl(X,n,ne);return X?Bi(X,Object.assign(Object.assign(Object.assign({},X===\"form\"?{novalidate:!0}:{}),n.attrs),{onSubmit:T,onReset:x}),Q):Q}}}),ZE=YE,GE=Zi({name:\"ErrorMessage\",props:{as:{type:String,default:void 0},name:{type:String,required:!0}},setup(e,n){const t=fi(Co,void 0),i=Me(()=>t==null?void 0:t.errors.value[e.name]);function r(){return{message:i.value}}return()=>{if(!i.value)return;const s=e.as?lo(e.as):e.as,o=Hl(s,n,r),a=Object.assign({role:\"alert\"},n.attrs);return!s&&(Array.isArray(o)||!o)&&(o!=null&&o.length)?o:(Array.isArray(o)||!o)&&!(o!=null&&o.length)?Bi(s||\"span\",a,i.value):Bi(s,a,o)}}}),JE=GE;/**\n  * vee-validate v4.13.2\n  * (c) 2024 Abdelrahman Awad\n  * @license MIT\n  */function wu(e){return typeof e==\"function\"}function XE(e){return typeof e==\"object\"&&e!==null}function QE(e){return e==null?e===void 0?\"[object Undefined]\":\"[object Null]\":Object.prototype.toString.call(e)}function Cu(e){if(!XE(e)||QE(e)!==\"[object Object]\")return!1;if(Object.getPrototypeOf(e)===null)return!0;let n=e;for(;Object.getPrototypeOf(n)!==null;)n=Object.getPrototypeOf(n);return Object.getPrototypeOf(e)===n}function Cp(e,n){return Object.keys(n).forEach(t=>{if(Cu(n[t])&&Cu(e[t])){e[t]||(e[t]={}),Cp(e[t],n[t]);return}e[t]=n[t]}),e}function Tu(e,n,t){const{prefix:i,suffix:r}=t,s=new RegExp(`([0-9]:)?${i}([^${r}]+)${r}`,\"g\");return e.replace(s,function(o,a,l){if(!a||!n.params)return l in n?n[l]:n.params&&l in n.params?n.params[l]:`${i}${l}${r}`;if(!Array.isArray(n.params))return l in n.params?n.params[l]:`${i}${l}${r}`;const c=Number(a.replace(\":\",\"\"));return c in n.params?n.params[c]:`${a}${i}${l}${r}`})}class eS{constructor(n,t,i={prefix:\"{\",suffix:\"}\"}){this.container={},this.locale=n,this.interpolateOptions=i,this.merge(t)}resolve(n,t){return this.format(this.locale,n,t)}getLocaleDefault(n,t){var i,r,s,o,a;return((s=(r=(i=this.container[n])===null||i===void 0?void 0:i.fields)===null||r===void 0?void 0:r[t])===null||s===void 0?void 0:s._default)||((a=(o=this.container[n])===null||o===void 0?void 0:o.messages)===null||a===void 0?void 0:a._default)}resolveLabel(n,t,i){var r,s,o,a;return i?((s=(r=this.container[n])===null||r===void 0?void 0:r.names)===null||s===void 0?void 0:s[i])||i:((a=(o=this.container[n])===null||o===void 0?void 0:o.names)===null||a===void 0?void 0:a[t])||t}format(n,t,i){var r,s,o,a,l;let c;const{rule:u,form:f,label:p,name:m}=t,g=this.resolveLabel(n,m,p);return u?(c=((o=(s=(r=this.container[n])===null||r===void 0?void 0:r.fields)===null||s===void 0?void 0:s[m])===null||o===void 0?void 0:o[u.name])||((l=(a=this.container[n])===null||a===void 0?void 0:a.messages)===null||l===void 0?void 0:l[u.name]),c||(c=this.getLocaleDefault(n,m)||`${g} is not valid`),wu(c)?c(t):Tu(c,Object.assign(Object.assign({},f),{field:g,params:u.params}),i??this.interpolateOptions)):(c=this.getLocaleDefault(n,m)||`${g} is not valid`,wu(c)?c(t):Tu(c,Object.assign(Object.assign({},f),{field:g}),i??this.interpolateOptions))}merge(n){Cp(this.container,n)}}const sr=new eS(\"en\",{});function tS(e,n,t){const i=r=>sr.resolve(r,t);return typeof e==\"string\"?(sr.locale=e,n&&sr.merge({[e]:n}),i):(sr.merge(e),i)}function nS(e){sr.locale=e}const iS=\"ar\",rS={alpha:\"{field} يجب ان يحتوي على حروف فقط\",alpha_num:\"{field} قد يحتوي فقط على حروف وارقام\",alpha_dash:\"{field} قد يحتوي على حروف او الرموز - و _\",alpha_spaces:\"{field} قد يحتوي فقط على حروف ومسافات\",between:\"قيمة {field} يجب ان تكون ما بين 0:{min} و 1:{max}\",confirmed:\"{field} لا يماثل التأكيد\",digits:\"{field} يجب ان تحتوي فقط على ارقام والا يزيد عددها عن 0:{length} رقم\",dimensions:\"{field} يجب ان تكون بمقاس 0:{width} بكسل في 1:{height} بكسل\",email:\"{field} يجب ان يكون بريدا اليكتروني صحيح\",not_one_of:\"الحقل {field} غير صحيح\",ext:\"نوع ملف {field} غير صحيح\",image:\"{field} يجب ان تكون صورة\",integer:\"الحقل {field} يجب ان يكون عدداً صحيحاً\",length:\"حقل {field} يجب الا يزيد عن 0:{length}\",max_value:\"قيمة الحقل {field} يجب ان تكون اصغر من 0:{min} او تساويها\",max:\"الحقل {field} يجب ان يحتوي على 0:{length} حروف على الأكثر\",mimes:\"نوع ملف {field} غير صحيح\",min_value:\"قيمة الحقل {field} يجب ان تكون اكبر من 0:{min} او تساويها\",min:\"الحقل {field} يجب ان يحتوي على 0:{length} حروف على الأقل\",numeric:\"{field} يمكن ان يحتوي فقط على ارقام\",one_of:\"الحقل {field} يجب ان يكون قيمة صحيحة\",regex:\"الحقل {field} غير صحيح\",required:\"{field} مطلوب\",required_if:\"حقل {field} مطلوب\",size:\"{field} يجب ان يكون اقل من 0:{size} كيلوبايت\",url:\"حقل {field} ليس رابطاً صحيحاً\"},Au={code:iS,messages:rS},sS=\"bn\",oS={alpha:\"এই {field} ক্ষেত্রে কেবলমাত্র অক্ষর থাকতে পারে\",alpha_num:\"এই {field} ক্ষেত্রে কেবলমাত্র অক্ষর, সংখ্যা থাকতে পারে\",alpha_dash:\"এই {field} ক্ষেত্রে কেবলমাত্র অক্ষর, সংখ্যা, ড্যাশ এবং আন্ডারস্কোর থাকতে পারে\",alpha_spaces:\"এই {field} ক্ষেত্রে কেবলমাত্র অক্ষর, সংখ্যা, ড্যাশ এবং আন্ডারস্কোর থাকতে পারে\",between:\"এই {field} ক্ষেত্রটি 0:{min} এবং 1:{max} এর মধ্যে হতে হবে\",confirmed:\"এই {field} ক্ষেত্রটি মিলছে না\",digits:\"এই {field} ক্ষেত্রটি সংখ্যা হতে হবে এবং ঠিক 0:{length} অঙ্ক থাকতে হবে\",dimensions:\"এই {field} ক্ষেত্রটি 0:{width} পিক্সেল 1:{height} পিক্সেল হতে হবে\",email:\"এই {field} ক্ষেত্রটি একটি বৈধ ইমেল হতে হবে\",not_one_of:\"এই {field} ক্ষেত্রটির মান বৈধ না\",ext:\"এই {field} ক্ষেত্রটির ফাইল বৈধ না\",image:\"এই {field} ক্ষেত্রটি একটি চিত্র হতে হবে\",integer:\"এই {field} ক্ষেত্রটি পূর্ণসংখ্যা হতে হবে\",length:\"এই {field} ক্ষেত্রটি 0:{length} দীর্ঘ হতে হবে\",max_value:\"এই {field} ক্ষেত্রটি 0:{max} বা তার চেয়ে কম হতে হবে\",max:\"এই {field} ক্ষেত্রটি 0:{length} অক্ষরের চেয়ে বেশি হওয়া উচিত নয়\",mimes:\"এই {field} ক্ষেত্রের একটি বৈধ ফাইল প্রকার থাকতে হবে\",min_value:\"এই {field} ক্ষেত্রটি 0:{min} বা তার বেশি হতে হবে\",min:\"এই {field} ক্ষেত্রটি কমপক্ষে 0:{length} অক্ষর হতে হবে\",numeric:\"এই {field} ক্ষেত্রে কেবলমাত্র সংখ্যা থাকতে পারে\",one_of:\"এই {field} ক্ষেত্রটির মান বৈধ না\",regex:\"এই {field} ক্ষেত্রটির বিন্যাস বৈধ না\",required_if:\"এই {field} ক্ষেত্রটি অবশ্যক\",required:\"এই {field} ক্ষেত্রটি অবশ্যক\",size:\"এই {field} ক্ষেত্রের আকার 0:{size}KB এর চেয়ে কম হওয়া উচিত\"},Ou={code:sS,messages:oS},aS=\"de\",lS={_default:\"{field} ist ungültig\",alpha:\"{field} darf nur alphabetische Zeichen enthalten\",alpha_dash:\"{field} darf alphanumerische Zeichen sowie Striche und Unterstriche enthalten\",alpha_num:\"{field} darf nur alphanumerische Zeichen enthalten\",alpha_spaces:\"{field} darf nur alphanumerische Zeichen und Leerzeichen enthalten\",between:\"{field} muss zwischen 0:{min} und 1:{max} liegen\",confirmed:\"Die Bestätigung von {field} stimmt nicht überein\",digits:\"{field} muss numerisch sein und exakt 0:{length} Ziffern enthalten\",dimensions:\"{field} muss 0:{width} x 1:{height} Bildpunkte groß sein\",email:\"{field} muss eine gültige E-Mail-Adresse sein\",not_one_of:\"{field} muss ein gültiger Wert sein\",ext:\"{field} muss eine gültige Datei sein\",image:\"{field} muss eine Grafik sein\",one_of:\"{field} muss ein gültiger Wert sein\",integer:\"{field} muss eine ganze Zahl sein\",length:\"Die Länge von {field} muss 0:{length} sein\",max:\"{field} darf nicht länger als 0:{length} Zeichen sein\",max_value:\"{field} darf maximal 0:{max} sein\",mimes:\"{field} muss einen gültigen Dateityp haben\",min:\"{field} muss mindestens 0:{length} Zeichen lang sein\",min_value:\"{field} muss mindestens 0:{min} sein\",numeric:\"{field} darf nur numerische Zeichen enthalten\",regex:\"Das Format von {field} ist ungültig\",required:\"{field} ist ein Pflichtfeld\",required_if:\"{field} ist ein Pflichtfeld\",size:\"{field} muss kleiner als 0:{size}KB sein\",url:\"{field} ist keine gültige URL\"},xu={code:aS,messages:lS},cS=\"en\",uS={_default:\"The {field} is not valid\",alpha:\"The {field} field may only contain alphabetic characters\",alpha_num:\"The {field} field may only contain alpha-numeric characters\",alpha_dash:\"The {field} field may contain alpha-numeric characters as well as dashes and underscores\",alpha_spaces:\"The {field} field may only contain alphabetic characters as well as spaces\",between:\"The {field} field must be between 0:{min} and 1:{max}\",confirmed:\"The {field} field confirmation does not match\",digits:\"The {field} field must be numeric and exactly contain 0:{length} digits\",dimensions:\"The {field} field must be 0:{width} pixels by 1:{height} pixels\",email:\"The {field} field must be a valid email\",not_one_of:\"The {field} field is not a valid value\",ext:\"The {field} field is not a valid file\",image:\"The {field} field must be an image\",integer:\"The {field} field must be an integer\",length:\"The {field} field must be 0:{length} long\",max_value:\"The {field} field must be 0:{max} or less\",max:\"The {field} field may not be greater than 0:{length} characters\",mimes:\"The {field} field must have a valid file type\",min_value:\"The {field} field must be 0:{min} or more\",min:\"The {field} field must be at least 0:{length} characters\",numeric:\"The {field} field may only contain numeric characters\",one_of:\"The {field} field is not a valid value\",regex:\"The {field} field format is invalid\",required_if:\"The {field} field is required\",required:\"The {field} field is required\",size:\"The {field} field size must be less than 0:{size}KB\",url:\"The {field} field is not a valid URL\"},Du={code:cS,messages:uS},fS=\"es\",dS={alpha:\"El campo {field} solo debe contener letras\",alpha_dash:\"El campo {field} solo debe contener letras, números y guiones\",alpha_num:\"El campo {field} solo debe contener letras y números\",alpha_spaces:\"El campo {field} solo debe contener letras y espacios\",between:\"El campo {field} debe estar entre 0:{min} y 1:{max}\",confirmed:\"El campo {field} no coincide\",digits:\"El campo {field} debe ser numérico y contener exactamente 0:{length} dígitos\",dimensions:\"El campo {field} debe ser de 0:{width} píxeles por 1:{height} píxeles\",email:\"El campo {field} debe ser un correo electrónico válido\",not_one_of:\"El campo {field} debe ser un valor válido\",ext:\"El campo {field} debe ser un archivo válido\",image:\"El campo {field} debe ser una imagen\",one_of:\"El campo {field} debe ser un valor válido\",integer:\"El campo {field} debe ser un entero\",length:\"El largo del campo {field} debe ser 0:{length}\",max:\"El campo {field} no debe ser mayor a 0:{length} caracteres\",max_value:\"El campo {field} debe de ser 0:{max} o menor\",mimes:\"El campo {field} debe ser un tipo de archivo válido\",min:\"El campo {field} debe tener al menos 0:{length} caracteres\",min_value:\"El campo {field} debe ser 0:{min} o superior\",numeric:\"El campo {field} debe contener solo caracteres numéricos\",regex:\"El formato del campo {field} no es válido\",required:\"El campo {field} es obligatorio\",required_if:\"El campo {field} es obligatorio\",size:\"El campo {field} debe ser menor a 0:{size}KB\"},Mu={code:fS,messages:dS},hS=\"fa\",pS={alpha:\"{field} فقط می تواند از حروف تشکیل شود\",alpha_num:\"{field} فقط میتواند از حروف و اعداد تشکیل شود\",alpha_dash:\"{field} فقط می تواند از حروف، اعداد، خط فاصله و زیرخط تشکیل شود\",alpha_spaces:\"{field} فقط می تواند از حروف و فاصله تشکیل شود\",between:\"{field} باید بین 0:{min} و 1:{max} کارکتر باشد\",confirmed:\"{field} با تاییدیه اش مطابقت ندارد\",digits:\"{field} باید یک مقدار عددی و دقیقاً 0:{length} رقم باشد\",dimensions:\"{field} باید در اندازه 0:{width} پیکسل عرض و 1:{height} پیکسل ارتفاع باشد\",email:\"{field} باید یک پست الکترونیک معتبر باشد\",not_one_of:\"{field}باید یک مقدار معتبر باشد\",ext:\"{field} باید یک فایل معتبر باشد\",image:\"{field} باید یک تصویر باشد\",integer:\"{field} باید یک عدد صحیح باشد\",length:\"{field} باید دقیقا 0:{length} کاراکتر باشد\",max_value:\"مقدار {field} باید 0:{max} یا کمتر باشد\",max:\"{field} نباید بیشتر از 0:{length} کارکتر باشد\",mimes:\"{field} باید از نوع معتبر باشد\",min_value:\"مقدار {field} باید 0:{min} یا بیشتر باشد\",min:\"{field} باید حداقل 0:{length} کارکتر باشد\",numeric:\"{field} فقط می تواند عددی باشد\",one_of:\"{field} باید یک مقدار معتبر باشد\",regex:\"قالب {field} قابل قبول نیست\",required_if:\"{field} الزامی است\",required:\"{field} الزامی است\",size:\"حجم {field} کمتر از 0:{size}KB باشد\"},Nu={code:hS,messages:pS},mS=\"fr\",gS={_default:\"Le champ {field} est invalide\",alpha:\"Le champ {field} ne peut contenir que des lettres\",alpha_num:\"Le champ {field} ne peut contenir que des caractères alpha-numériques\",alpha_dash:\"Le champ {field} ne peut contenir que des caractères alpha-numériques, tirets ou soulignés\",alpha_spaces:\"Le champ {field} ne peut contenir que des lettres ou des espaces\",between:\"Le champ {field} doit être compris entre 0:{min} et 1:{max}\",confirmed:\"Le champ {field} ne correspond pas\",digits:\"Le champ {field} doit être un nombre entier de 0:{length} chiffres\",dimensions:\"Le champ {field} doit avoir une taille de 0:{width} pixels par 1:{height} pixels\",email:\"Le champ {field} doit être une adresse e-mail valide\",not_one_of:\"Le champ {field} doit être une valeur valide\",ext:\"Le champ {field} doit être un fichier valide\",image:\"Le champ {field} doit être une image\",integer:\"Le champ {field} doit être un entier\",length:\"Le champ {field} doit contenir 0:{length} caractères\",max_value:\"Le champ {field} doit avoir une valeur de 0:{max} ou moins\",max:\"Le champ {field} ne peut pas contenir plus de 0:{length} caractères\",mimes:\"Le champ {field} doit avoir un type MIME valide\",min_value:\"Le champ {field} doit avoir une valeur de 0:{min} ou plus\",min:\"Le champ {field} doit contenir au minimum 0:{length} caractères\",numeric:\"Le champ {field} ne peut contenir que des chiffres\",one_of:\"Le champ {field} doit être une valeur valide\",regex:\"Le champ {field} est invalide\",required:\"Le champ {field} est obligatoire\",required_if:\"Le champ {field} est obligatoire lorsque {target} possède cette valeur\",size:\"Le champ {field} doit avoir un poids inférieur à 0:{size}KB\"},Iu={code:mS,messages:gS},yS=\"he\",vS={alpha:\"השדה {field} יכול להכיל רק אותיות\",alpha_num:\"השדה {field} יכול להכיל רק אותיות ומספרים.\",alpha_dash:\"השדה {field} יכול להכיל רק אותיות, מספרים ומקפים\",alpha_spaces:\"השדה {field} יכול להכיל רק אותיות ורווחים\",between:\"הערך {field} חייב להיות בין 0:{min} ל- 1:{max}\",confirmed:\"הערכים של {field} חייבים להיות זהים\",digits:\"השדה {field} חייב להיות מספר ולהכיל 0:{length} ספרות בדיוק\",dimensions:\"השדה {field} חייב להיות 0:{width} פיקסלים על 1:{height} פיקסלים\",email:\"השדה {field} חייב להכיל כתובת אימייל תקינה\",not_one_of:\"השדה {field} חייב להכיל ערך תקין\",ext:\"השדה {field} חייב להכיל קובץ תקין\",image:\"השדה {field} חייב להכיל תמונה\",max_value:\"השדה {field} יכול להיות 0:{max} לכל היותר\",max:\"השדה {field} לא יכול להכיל יותר מ- 0:{length} תווים\",mimes:\"הקובץ חייב להיות מסוג תקין\",min_value:\"הערך של {field} חייב להיות לפחות 0:{min}\",min:\"השדה {field} חייב להכיל 0:{length} תווים לפחות\",numeric:\"השדה {field} יכול להכיל ספרות בלבד\",one_of:\"השדה {field} חייב להיות בעל ערך תקין\",regex:\"הפורמט של {field} אינו תקין\",required:\"חובה למלא את השדה {field}\",required_if:\"חובה למלא את השדה {field}\",size:\"השדה {field} חייב לשקול פחות מ 0:{size}KB\"},ku={code:yS,messages:vS},bS=\"hi_IN\",_S={_default:\"यह {field} मान्य नहीं है\",alpha:\"{field} फ़ील्ड में केवल वर्णात्मक अक्षर हो सकते हैं\",alpha_num:\"{field} फ़ील्ड में केवल वर्णात्मक और संख्यात्मक अक्षर हो सकते हैं\",alpha_dash:\"{field} फ़ील्ड में वर्णात्मक और संख्यात्मक अक्षरों के साथ डैश और अंडरस्कोर हो सकते हैं\",alpha_spaces:\"{field} फ़ील्ड में केवल वर्णात्मक अक्षर और अंतर हो सकते हैं\",between:\"{field} फ़ील्ड 0:{min} और 1:{max} के बीच होना चाहिए\",confirmed:\"{field} फ़ील्ड की पुष्टि मेल नहीं खाती\",digits:\"{field} फ़ील्ड संख्यात्मक होनी चाहिए और बिल्कुल 0:{length} अंक होने चाहिए\",dimensions:\"{field} फ़ील्ड 0:{width} पिक्सेल और 1:{height} पिक्सेल होना चाहिए\",email:\"{field} फ़ील्ड में एक मान्य ईमेल होना चाहिए\",not_one_of:\"{field} फ़ील्ड मान्य मूल्य नहीं है\",ext:\"{field} फ़ील्ड में मान्य फ़ाइल नहीं है\",image:\"{field} फ़ील्ड एक छवि होनी चाहिए\",integer:\"{field} फ़ील्ड एक पूर्णांक होना चाहिए\",length:\"{field} फ़ील्ड 0:{length} लंबा होना चाहिए\",max_value:\"{field} फ़ील्ड 0:{max} या उससे कम होना चाहिए\",max:\"{field} फ़ील्ड 0:{length} अक्षरों से अधिक नहीं हो सकता\",mimes:\"{field} फ़ील्ड को मान्य फ़ाइल प्रकार होना चाहिए\",min_value:\"{field} फ़ील्ड 0:{min} या उससे अधिक होना चाहिए\",min:\"{field} फ़ील्ड कम से कम 0:{length} अक्षरों का होना चाहिए\",numeric:\"{field} फ़ील्ड में केवल संख्याएँ हो सकती हैं\",one_of:\"{field} फ़ील्ड मान्य मूल्य नहीं है\",regex:\"{field} फ़ील्ड का प्रारूप अवैध है\",required_if:\"{field} फ़ील्ड आवश्यक है\",required:\"{field} फ़ील्ड आवश्यक है\",size:\"{field} फ़ील्ड का आकार 0:{size}KB से कम होना चाहिए\",url:\"{field} फ़ील्ड में एक मान्य URL नहीं है\"},Ru={code:bS,messages:_S},ES=\"it\",SS={alpha:\"Il campo {field} può contenere solo caratteri alfabetici\",alpha_num:\"Il campo {field} può contenere solo caratteri alfanumerici\",alpha_dash:\"Il campo {field} può contenere caratteri alfa-numerici così come lineette e trattini di sottolineatura\",alpha_spaces:\"Il campo {field} può contenere solo caratteri alfanumerici così come spazi\",between:\"Il campo {field} deve essere compreso tra 0:{min} e 1:{max}\",confirmed:\"Il campo {field} non corrisponde\",digits:\"Il campo {field} deve essere numerico e contenere esattamente 0:{length} cifre\",dimensions:\"Il campo {field} deve essere 0:{width} x 1:{height}\",email:\"Il campo {field} deve essere un indirizzo email valido\",not_one_of:\"Il campo {field} deve avere un valore valido\",ext:\"Il campo {field} deve essere un file valido\",image:\"Il campo {field} deve essere un'immagine\",integer:\"Il campo {field} deve essere un numero\",is_not:\"Il campo {field} non è valido\",length:\"La lunghezza del campo {field} deve essere 0:{length}\",max_value:\"Il campo {field} deve essere minore o uguale a 0:{max}\",max:\"Il campo {field} non può essere più lungo di 0:{length} caratteri\",mimes:\"Il campo {field} deve avere un tipo di file valido\",min_value:\"Il campo {field} deve essere maggiore o uguale a 0:{min}\",min:\"Il campo {field} deve avere almeno 0:{length} caratteri\",numeric:\"Il campo {field} può contenere solo caratteri numerici\",one_of:\"Il campo {field} deve avere un valore valido\",regex:\"Il campo {field} non ha un formato valido\",required:\"Il campo {field} è richiesto\",required_if:\"Il campo {field} è richiesto\",size:\"Il campo {field} deve essere inferiore a 0:{size}KB\"},Pu={code:ES,messages:SS},wS=\"ja\",CS={_default:\"{field}は有効な値ではありません\",alpha:\"{field}はアルファベットのみ使用できます\",alpha_num:\"{field}は英数字のみ使用できます\",alpha_dash:\"{field}は英数字とハイフン、アンダースコアのみ使用できます\",alpha_spaces:\"{field}はアルファベットと空白のみ使用できます\",between:\"{field}は 0:{min} から 1:{max} の間でなければなりません\",confirmed:\"{field}が一致しません\",digits:\"{field}は 0:{length}桁の数字でなければなりません\",dimensions:\"{field}は幅 0:{width}px、高さ 1:{height}px 以内でなければなりません\",email:\"{field}は有効なメールアドレスではありません\",not_one_of:\"{field}は不正な値です\",ext:\"{field}は有効なファイル形式ではありません\",image:\"{field}は有効な画像形式ではありません\",integer:\"{field}は整数のみ使用できます\",is:\"{field}が一致しません\",length:\"{field}は 0:{length} 文字でなければなりません\",max_value:\"{field}は 0:{max} 以下でなければなりません\",max:\"{field}は 0:{length} 文字以内にしてください\",mimes:\"{field}は有効なファイル形式ではありません\",min_value:\"{field}は 0:{min} 以上でなければなりません\",min:\"{field}は 0:{length} 文字以上でなければなりません\",numeric:\"{field}は数字のみ使用できます\",one_of:\"{field}は有効な値ではありません\",regex:\"{field}のフォーマットが正しくありません\",required:\"{field}は必須項目です\",required_if:\"{field}は必須項目です\",size:\"{field}は 0:{size}KB 以内でなければなりません\",url:\"{field}は有効なURLではありません\"},Fu={code:wS,messages:CS},TS=\"nl\",AS={_default:\"{field} is ongeldig\",alpha:\"{field} mag alleen letters bevatten\",alpha_dash:\"{field} mag alleen letters, nummers, en streepjes bevatten\",alpha_num:\"{field} mag alleen letters en nummers bevatten\",alpha_spaces:\"{field} mag alleen letters en spaties bevatten\",between:\"{field} moet tussen 0:{min} en 1:{max} liggen\",confirmed:\"{field} bevestiging komt niet overeen\",digits:\"{field} moet een nummer zijn en exact 0:{length} tekens bevatten\",dimensions:\"{field} moet 0:{width} pixels breed zijn en 1:{height} pixels hoog\",email:\"{field} moet een geldig e-mailadres zijn\",not_one_of:\"{field} is ongeldig\",ext:\"{field} moet een geldig bestand zijn\",image:\"{field} moet een afbeelding zijn\",one_of:\"{field} moet een geldige waarde zijn\",max:\"{field} mag niet groter zijn dan 0:{length} karakters\",max_value:\"{field} mag maximaal 0:{max} zijn\",mimes:\"{field} moet een geldig bestandstype hebben\",min:\"{field} moet minimaal 0:{length} karakters zijn\",min_value:\"{field} moet minimaal 0:{min} zijn\",numeric:\"{field} mag alleen nummers bevatten\",regex:\"{field} formaat is ongeldig\",required:\"{field} is verplicht\",required_if:\"{field} is verplicht\",size:\"{field} mag niet groter zijn dan 0:{size}KB\"},Lu={code:TS,messages:AS},OS=\"pl\",xS={alpha:\"Pole {field} może zawierać tylko litery\",alpha_dash:\"Pole {field} może zawierać litery, cyfry oraz myślnik lub podkreślnik\",alpha_num:\"Pole {field} może zawierać tylko litery i cyfry\",alpha_spaces:\"Pole {field} może zawierać tylko litery oraz spacje\",between:\"Pole {field} musi być pomiędzy 0:{min} oraz 1:{max}\",confirmed:\"Pole {field} nie zgadza się z polem potwierdzającym {target}\",digits:\"Pole {field} musi być liczbą i dokładnie 0:{length} cyfr\",dimensions:\"Obraz {field} musi być szeroki na 0:{width} pikseli i wysoki na 1:{height} pikseli\",email:\"Pole {field} musi być poprawnym adresem email\",not_one_of:\"Pole {field} musi być poprawną wartością\",ext:\"Plik {field} musi być poprawnym plikiem\",image:\"Pole {field} musi być obrazem\",one_of:\"Pole {field} musi być poprawną wartością\",integer:\"Pole {field} musi być liczbą całkowitą\",length:\"Pole {field} musi mieć długość 0:{length}\",max:\"Pole {field} nie może być dłuższe niż 0:{length}\",max_value:\"Pole {field} musi mieć maksymalną wartość 0:{max}\",mimes:\"Plik {field} musi posiadać poprawne rozszerzenie\",min:\"Pole {field} musi być długie na co najmniej 0:{length}\",min_value:\"Pole {field} musi mieć minimalną wartość 0:{min}\",numeric:\"Pole {field} może zawierać tylko cyfry\",regex:\"Format pola {field} jest nieodpowiedni\",required:\"Pole {field} jest wymagane\",required_if:\"Pole {field} jest wymagane\",size:\"Plik {field} musi być mniejszy niż 0:{size}KB\"},Vu={code:OS,messages:xS},DS=\"pt_BR\",MS={alpha:\"O campo {field} deve conter somente letras\",alpha_dash:\"O campo {field} deve conter letras, números e traços\",alpha_num:\"O campo {field} deve conter somente letras e números\",alpha_spaces:\"O campo {field} só pode conter caracteres alfabéticos e espaços\",between:\"O campo {field} deve estar entre 0:{min} e 1:{max}\",confirmed:\"A confirmação do campo {field} deve ser igual\",digits:\"O campo {field} deve ser numérico e ter exatamente 0:{length} dígitos\",dimensions:\"O campo {field} deve ter 0:{width} pixels de largura por 1:{height} pixels de altura\",email:\"O campo {field} deve ser um email válido\",not_one_of:\"O campo {field} deve ser um valor válido\",ext:\"O campo {field} deve ser um arquivo válido\",image:\"O campo {field} deve ser uma imagem\",integer:\"O campo {field} deve ser um número inteiro\",is:\"O valor inserido no campo {field} não é válido\",one_of:\"O campo {field} deve ter um valor válido\",length:\"O tamanho do campo {field} deve ser 0:{length}\",max:\"O campo {field} não deve ter mais que 0:{length} caracteres\",max_value:\"O campo {field} precisa ser 0:{max} ou menor\",mimes:\"O campo {field} deve ser um tipo de arquivo válido\",min:\"O campo {field} deve conter pelo menos 0:{length} caracteres\",min_value:\"O campo {field} precisa ser 0:{min} ou maior\",numeric:\"O campo {field} deve conter apenas números\",regex:\"O campo {field} possui um formato inválido\",required:\"O campo {field} é obrigatório\",required_if:\"O campo {field} é obrigatório\",size:\"O campo {field} deve ser menor que 0:{size}KB\",url:\"O campo {field} deve ser uma URL válida\"},$u={code:DS,messages:MS},NS=\"ru\",IS={_default:\"Поле {field} некорректно\",alpha:\"Поле {field} может содержать только буквы\",alpha_num:\"Поле {field} может содержать только буквы и цифры\",alpha_dash:\"Поле {field} может содержать только буквы, цифры и дефис\",alpha_spaces:\"Поле {field} может содержать только буквы и пробелы\",between:\"Поле {field} должно быть числом между 0:{min} и 1:{max}\",confirmed:\"Поле {field} не совпадает с другим полем\",digits:\"Поле {field} должно быть числом ровно из 0:{length} цифр\",dimensions:\"Поле {field} должно быть изображением 0:{width} пикселей на 1:{height} пикселей\",email:\"Поле {field} должно быть действительным электронным адресом\",not_one_of:\"Поле {field} должно быть допустимым значением\",ext:\"Поле {field} должно быть действительным файлом\",image:\"Поле {field} должно быть изображением\",integer:\"Поле {field} должно быть целым числом\",length:\"Длина поля {field} должна быть 0:{length}\",max_value:\"Поле {field} должно быть числом 0:{max} или меньше\",max:\"Поле {field} не может быть длиннее 0:{length} символов\",mimes:\"Поле {field} должно иметь допустимый тип файла\",min_value:\"Поле {field} должно быть числом 0:{min} или больше\",min:\"Поле {field} должно быть не короче 0:{length} символов\",numeric:\"Поле {field} должно быть числом\",one_of:\"Поле {field} должно быть допустимым значением\",regex:\"Поле {field} имеет некорректный формат\",required_if:\"Поле {field} обязательно для заполнения\",required:\"Поле {field} обязательно для заполнения\",size:\"Поле {field} должно быть меньше, чем 0:{size}KB\",url:\"Поле {field} содержит ссылку в некорректном формате\"},ju={code:NS,messages:IS},kS=\"sin\",RS={_default:\"මේ {field} වල වලංගු නොවේ\",alpha:\"{field} ක්ෂණික සංඛ්‍යාවක් පිළිබඳව සියල්ල සියල්ල සහිතව හැකිය\",alpha_num:\"{field} ක්ෂණික සහ සංඛ්‍යාවක් පිළිබඳව සියල්ල සහිතව හැකිය\",alpha_dash:\"{field} ක්ෂණික සහ සංඛ්‍යාවක් සමග දැහැ හෝ පරිදි ලොව සහිතව හැකිය\",alpha_spaces:\"{field} ක්ෂණික සංඛ්‍යාවක් සහිතව හැකිය, සහ වීඩියෝ හෝම්හෝ සහිතව හැකිය\",between:\"{field} ක්ෂණික 0:{min} සහ 1:{max} අතර විය යුතුය\",confirmed:\"{field} ක්ෂණික තහවුරු නොගත් බව තහවුරු කර නොයාය\",digits:\"{field} ක්ෂණික සෂ්යෝගයක් හා සියලුමේ විය 0:{length} දිගු විය යුතුය\",dimensions:\"{field} ක්ෂණික 0:{width} පික්සල සහ 1:{height} පික්සල විය යුතුය\",email:\"{field} ක්ෂණික වලංගු ඊමේල් එක හෝ යුක්ත විය යුතුය\",not_one_of:\"{field} ක්ෂණික වලංගු අගය නොවේ\",ext:\"{field} ක්ෂණික වලංගු ගොනුව නොවේ\",image:\"{field} ක්ෂණික වලංගු ඡායාරූපය යුතුය\",integer:\"{field} ක්ෂණික වලංගු නික්මෙර වර්ගයේ යුතුය\",length:\"{field} ක්ෂණික වලංගු 0:{length} හෝමාව යුතුය\",max_value:\"{field} ක්ෂණික 0:{max} හෝමා හෝමා හෝමා යුතුය\",max:\"{field} ක්ෂණික 0:{length} අකුරු වලංගු වී නොයාය\",mimes:\"{field} ක්ෂණික ගොනුවේ වලංගු ගොනු වර්ගය හෝ හෝ හෝ යුතුය\",min_value:\"{field} ක්ෂණික 0:{min} හෝමාව හෝමාව හෝමාව හෝමාව හෝමාව යුතුය\",min:\"{field} ක්ෂණික 0:{length} හෝමාවක් හෝමාවක් හෝමාවක් හෝමාවක් යුතුය\",numeric:\"{field} ක්ෂණික වලංගු සංඛ්‍යාවෙන් වයස්ක්‍ර සංඛ්‍යාවෙන් වයස්ක්‍ර විය ෺\",one_of:\"{field} ක්ෂණික වලංගු අගය නොවේ\",regex:\"{field} ක්ෂණික වලංගු ආකාරය අවලංගුය\",required_if:\"{field} ක්ෂණිකයෙන් හෝයි\",required:\"{field} ක්ෂණිකයෙන් හෝයි\",size:\"{field} ක්ෂණික වලංගු විය හැකි ආකාරය 0:{size}KB හෝ හොයා යුතුයි\",url:\"{field} ක්ෂණික වලංගු වර්ගවල URL නොවේ\"},Bu={code:kS,messages:RS},PS=\"tr\",FS={alpha:\"{field} yalnızca harf içerebilir\",alpha_dash:\"{field} alanı harf ve tire (-) ya da alttan tire (_) içerebilir\",alpha_num:\"{field} yalnızca harf ve rakam içerebilir\",alpha_spaces:\"{field} yalnızca harf boşluk (space) içerebilir\",between:\"{field} 0:{min} ile 1:{max} aralığında olmalıdır\",confirmed:\"{field} doğrulaması hatalı\",digits:\"{field} sayısal ve 0:{length} basamaklı olmalıdır\",dimensions:\"{field} alanı 0:{width} piksel ile 1:{height} piksel arasında olmalıdır\",email:\"{field} alanının geçerli bir e-posta olması gerekir\",not_one_of:\"{field} alanına geçerli bir değer giriniz\",ext:\"{field} alanı geçerli bir dosya olmalıdır\",image:\"{field} alanı resim dosyası olmalıdır\",integer:\"{field} alanı bir tamsayı olmalıdır\",length:\"{field} alanı 0:{length} uzunluğunda olmalıdır\",one_of:\"{field} alanına geçerli bir değer giriniz\",max:\"{field} alanı 0:{length} karakterden fazla olmamalıdır\",max_value:\"{field} alanı 0:{max} ya da daha az bir değer olmalıdır\",mimes:\"{field} geçerli bir dosya olmalıdır\",min:\"{field} alanına en az 0:{length} karakter girilmelidir\",min_value:\"{field} alanı 0:{min} ya da daha fazla bir değer olmalıdır\",numeric:\"{field} alanına sayısal bir değer giriniz\",regex:\"{field} formatı geçersiz\",required:\"{field} alanı gereklidir\",required_if:\"{field} alanı gereklidir\",size:\"{field} alanı 0:{size}KB'dan daha az olmalıdır\",url:\"{field} geçerli bir URL değil\"},Hu={code:PS,messages:FS},LS=\"uk\",VS={alpha:\"Поле {field} може містити тільки літери\",alpha_dash:\"Поле {field} може містити буквено-цифрові символи, а також тире та підкреслення\",alpha_num:\"Поле {field} може містити тільки літери та цифри\",alpha_spaces:\"Поле {field} може містити тільки літери та пробіли\",between:\"Поле {field} повинно бути між 0:{min} та 1:{max}\",confirmed:\"Поле {field} не співпадає з підтвердженням\",digits:\"Поле {field} повинно бути числовим та точно містити 0:{length} цифри\",dimensions:\"Поле {field} повинно бути 0:{width} пікселів на 1:{height} пікселів\",email:\"В полі {field} повинна бути адреса електронної пошти\",not_one_of:\"Поле {field} повинно мати допустиме значення\",ext:\"Поле {field} повинно бути дійсним файлом\",image:\"В полі {field} має бути зображення\",one_of:\"Поле {field} повинно бути допустимим значенням\",max:\"Поле {field} не може бути більше, ніж 0:{length} символів\",max_value:\"Поле {field} повинно бути 0:{max} або менше\",mimes:\"Поле {field} повиннно мати дійсний тип файлу\",min:\"Поле {field} має бути принаймні 0:{length} символів\",min_value:\"Поле {field} повинно бути 0:{min} або більше\",numeric:\"Поле {field} може містить лише цифри\",regex:\"Поле {field} має невірний формат\",required:\"Поле {field} повинно мати значення\",required_if:\"Поле {field} повинно мати значення\",size:\"Поле {field} повинно бути менше 0:{size}KB\"},Uu={code:LS,messages:VS},$S=\"zh_CN\",jS={_default:\"{field}不是一个有效值\",alpha:\"{field}只能包含字母字符\",alpha_dash:\"{field}能够包含字母数字字符、破折号和下划线\",alpha_num:\"{field}只能包含字母数字字符\",alpha_spaces:\"{field}只能包含字母字符和空格\",between:\"{field}必须在0:{min}与1:{max}之间\",confirmed:\"{field}不能和0:{target}匹配\",digits:\"{field}必须是数字，且精确到0:{length}位数\",dimensions:\"{field}必须在0:{width}像素与1:{height}像素之间\",email:\"{field}不是一个有效的邮箱\",not_one_of:\"{field}不是一个有效值\",ext:\"{field}不是一个有效的文件\",image:\"{field}不是一张有效的图片\",one_of:\"{field}不是一个有效值\",integer:\"{field}必须是整数\",length:\"{field}长度必须为0:{length}\",max:\"{field}不能超过0:{length}个字符\",max_value:\"{field}必须小于或等于0:{max}\",mimes:\"{field}不是一个有效的文件类型\",min:\"{field}必须至少有0:{length}个字符\",min_value:\"{field}必须大于或等于0:{min}\",numeric:\"{field}只能包含数字字符\",regex:\"{field}格式无效\",required:\"{field}是必须的\",required_if:\"{field}是必须的\",size:\"{field}必须小于0:{size}KB\",url:\"{field}不是一个有效的URL\"},qu={code:$S,messages:jS};/**\n  * vee-validate v4.13.2\n  * (c) 2024 Abdelrahman Awad\n  * @license MIT\n  */const os={en:/^[A-Z]*$/i,cs:/^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]*$/i,da:/^[A-ZÆØÅ]*$/i,de:/^[A-ZÄÖÜß]*$/i,es:/^[A-ZÁÉÍÑÓÚÜ]*$/i,fr:/^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]*$/i,it:/^[A-Z\\xC0-\\xFF]*$/i,lt:/^[A-ZĄČĘĖĮŠŲŪŽ]*$/i,nl:/^[A-ZÉËÏÓÖÜ]*$/i,hu:/^[A-ZÁÉÍÓÖŐÚÜŰ]*$/i,pl:/^[A-ZĄĆĘŚŁŃÓŻŹ]*$/i,pt:/^[A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]*$/i,ru:/^[А-ЯЁ]*$/i,kz:/^[А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA]*$/i,sk:/^[A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ]*$/i,sr:/^[A-ZČĆŽŠĐ]*$/i,sv:/^[A-ZÅÄÖ]*$/i,tr:/^[A-ZÇĞİıÖŞÜ]*$/i,uk:/^[А-ЩЬЮЯЄІЇҐ]*$/i,ar:/^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]*$/,az:/^[A-ZÇƏĞİıÖŞÜ]*$/i,ug:/^[A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ]*$/i},as={en:/^[A-Z\\s]*$/i,cs:/^[A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ\\s]*$/i,da:/^[A-ZÆØÅ\\s]*$/i,de:/^[A-ZÄÖÜß\\s]*$/i,es:/^[A-ZÁÉÍÑÓÚÜ\\s]*$/i,fr:/^[A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ\\s]*$/i,it:/^[A-Z\\xC0-\\xFF\\s]*$/i,lt:/^[A-ZĄČĘĖĮŠŲŪŽ\\s]*$/i,nl:/^[A-ZÉËÏÓÖÜ\\s]*$/i,hu:/^[A-ZÁÉÍÓÖŐÚÜŰ\\s]*$/i,pl:/^[A-ZĄĆĘŚŁŃÓŻŹ\\s]*$/i,pt:/^[A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ\\s]*$/i,ru:/^[А-ЯЁ\\s]*$/i,kz:/^[А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA\\s]*$/i,sk:/^[A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ\\s]*$/i,sr:/^[A-ZČĆŽŠĐ\\s]*$/i,sv:/^[A-ZÅÄÖ\\s]*$/i,tr:/^[A-ZÇĞİıÖŞÜ\\s]*$/i,uk:/^[А-ЩЬЮЯЄІЇҐ\\s]*$/i,ar:/^[ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ\\s]*$/,az:/^[A-ZÇƏĞİıÖŞÜ\\s]*$/i,ug:/^[A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ\\s]*$/i},ls={en:/^[0-9A-Z]*$/i,cs:/^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ]*$/i,da:/^[0-9A-ZÆØÅ]$/i,de:/^[0-9A-ZÄÖÜß]*$/i,es:/^[0-9A-ZÁÉÍÑÓÚÜ]*$/i,fr:/^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ]*$/i,it:/^[0-9A-Z\\xC0-\\xFF]*$/i,lt:/^[0-9A-ZĄČĘĖĮŠŲŪŽ]*$/i,hu:/^[0-9A-ZÁÉÍÓÖŐÚÜŰ]*$/i,nl:/^[0-9A-ZÉËÏÓÖÜ]*$/i,pl:/^[0-9A-ZĄĆĘŚŁŃÓŻŹ]*$/i,pt:/^[0-9A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ]*$/i,ru:/^[0-9А-ЯЁ]*$/i,kz:/^[0-9А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA]*$/i,sk:/^[0-9A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ]*$/i,sr:/^[0-9A-ZČĆŽŠĐ]*$/i,sv:/^[0-9A-ZÅÄÖ]*$/i,tr:/^[0-9A-ZÇĞİıÖŞÜ]*$/i,uk:/^[0-9А-ЩЬЮЯЄІЇҐ]*$/i,ar:/^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ]*$/,az:/^[0-9A-ZÇƏĞİıÖŞÜ]*$/i,ug:/^[0-9A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ]*$/i},cs={en:/^[0-9A-Z_-]*$/i,cs:/^[0-9A-ZÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ_-]*$/i,da:/^[0-9A-ZÆØÅ_-]*$/i,de:/^[0-9A-ZÄÖÜß_-]*$/i,es:/^[0-9A-ZÁÉÍÑÓÚÜ_-]*$/i,fr:/^[0-9A-ZÀÂÆÇÉÈÊËÏÎÔŒÙÛÜŸ_-]*$/i,it:/^[0-9A-Z\\xC0-\\xFF_-]*$/i,lt:/^[0-9A-ZĄČĘĖĮŠŲŪŽ_-]*$/i,nl:/^[0-9A-ZÉËÏÓÖÜ_-]*$/i,hu:/^[0-9A-ZÁÉÍÓÖŐÚÜŰ_-]*$/i,pl:/^[0-9A-ZĄĆĘŚŁŃÓŻŹ_-]*$/i,pt:/^[0-9A-ZÃÁÀÂÇÉÊÍÕÓÔÚÜ_-]*$/i,ru:/^[0-9А-ЯЁ_-]*$/i,kz:/^[0-9А-ЯЁ\\u04D8\\u04B0\\u0406\\u04A2\\u0492\\u04AE\\u049A\\u04E8\\u04BA_-]*$/i,sk:/^[0-9A-ZÁÄČĎÉÍĹĽŇÓŔŠŤÚÝŽ_-]*$/i,sr:/^[0-9A-ZČĆŽŠĐ_-]*$/i,sv:/^[0-9A-ZÅÄÖ_-]*$/i,tr:/^[0-9A-ZÇĞİıÖŞÜ_-]*$/i,uk:/^[0-9А-ЩЬЮЯЄІЇҐ_-]*$/i,ar:/^[٠١٢٣٤٥٦٧٨٩0-9ءآأؤإئابةتثجحخدذرزسشصضطظعغفقكلمنهوىيًٌٍَُِّْٰ_-]*$/,az:/^[0-9A-ZÇƏĞİıÖŞÜ_-]*$/i,ug:/^[0-9A-Zچۋېرتيۇڭوپھسداەىقكلزشغۈبنمژفگخجۆئ_-]*$/i},Ao=e=>{if(e)return Array.isArray(e)?e[0]:e.locale};function rn(e,n){return Array.isArray(e)?e[0]:e[n]}function We(e){return!!(e==null||e===\"\"||Array.isArray(e)&&e.length===0)}const Tp=(e,n)=>{if(We(e))return!0;const t=Ao(n);if(Array.isArray(e))return e.every(r=>Tp(r,{locale:t}));const i=String(e);return t?(os[t]||os.en).test(i):Object.keys(os).some(r=>os[r].test(i))},Ap=(e,n)=>{if(We(e))return!0;const t=Ao(n);if(Array.isArray(e))return e.every(r=>Ap(r,{locale:t}));const i=String(e);return t?(cs[t]||cs.en).test(i):Object.keys(cs).some(r=>cs[r].test(i))},Op=(e,n)=>{if(We(e))return!0;const t=Ao(n);if(Array.isArray(e))return e.every(r=>Op(r,{locale:t}));const i=String(e);return t?(ls[t]||ls.en).test(i):Object.keys(ls).some(r=>ls[r].test(i))},xp=(e,n)=>{if(We(e))return!0;const t=Ao(n);if(Array.isArray(e))return e.every(r=>xp(r,{locale:t}));const i=String(e);return t?(as[t]||as.en).test(i):Object.keys(as).some(r=>as[r].test(i))};function BS(e){return Array.isArray(e)?{min:e[0],max:e[1]}:e}const Dp=(e,n)=>{if(We(e))return!0;const{min:t,max:i}=BS(n);if(Array.isArray(e))return e.every(s=>Dp(s,{min:t,max:i}));const r=Number(e);return Number(t)<=r&&Number(i)>=r},HS=(e,n)=>{const t=rn(n,\"target\");return String(e)===String(t)},Mp=(e,n)=>{if(We(e))return!0;const t=rn(n,\"length\");if(Array.isArray(e))return e.every(r=>Mp(r,{length:t}));const i=String(e);return/^[0-9]*$/.test(i)&&i.length===Number(t)},US=(e,n,t)=>{const i=window.URL||window.webkitURL;return new Promise(r=>{const s=new Image;s.onerror=()=>r(!1),s.onload=()=>r(s.width===n&&s.height===t),s.src=i.createObjectURL(e)})};function qS(e){return e?Array.isArray(e)?{width:Number(e[0]),height:Number(e[1])}:{width:Number(e.width),height:Number(e.height)}:{width:0,height:0}}const zS=(e,n)=>{if(We(e))return!0;const{width:t,height:i}=qS(n),r=[],s=Array.isArray(e)?e:[e];for(let o=0;o<s.length;o++){if(!/\\.(jpg|svg|jpeg|png|bmp|gif)$/i.test(s[o].name))return Promise.resolve(!1);r.push(s[o])}return Promise.all(r.map(o=>US(o,t,i))).then(o=>o.every(a=>a))},zu=/^(?!\\.)(?!.*\\.\\.)([A-Z0-9_+-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i,KS=e=>We(e)?!0:Array.isArray(e)?e.every(n=>zu.test(String(n))):zu.test(String(e)),WS=(e,n)=>{if(We(e))return!0;const t=new RegExp(`\\\\.(${n.join(\"|\")})$`,\"i\");return Array.isArray(e)?e.every(i=>t.test(i.name)):t.test(e.name)},YS=e=>{if(We(e))return!0;const n=/\\.(jpg|svg|jpeg|png|bmp|gif|webp)$/i;return Array.isArray(e)?e.every(t=>n.test(t.name)):n.test(e.name)},ZS=e=>We(e)?!0:Array.isArray(e)?e.every(n=>/^-?[0-9]+$/.test(String(n))):/^-?[0-9]+$/.test(String(e)),GS=(e,n)=>{const t=rn(n,\"other\");return e===t},JS=(e,n)=>{const t=rn(n,\"other\");return e!==t},XS=(e,n)=>{if(We(e))return!0;const t=rn(n,\"length\");return typeof e==\"number\"&&(e=String(e)),e.length||(e=Array.from(e)),e.length===Number(t)},Np=(e,n)=>{if(We(e))return!0;const t=rn(n,\"length\");return Array.isArray(e)?e.every(i=>Np(i,{length:t})):[...String(e)].length<=Number(t)},Ip=(e,n)=>{if(We(e))return!0;const t=rn(n,\"max\");return Array.isArray(e)?e.length>0&&e.every(i=>Ip(i,{max:t})):Number(e)<=Number(t)},Ku=/\\+(.+)?/;function QS(e){let n=e;return Ku.test(e)&&(n=e.replace(Ku,\"(\\\\+$1)?\")),new RegExp(n.replace(\"*\",\".+\"),\"i\")}const ew=(e,n)=>{if(We(e))return!0;n||(n=[]);const t=n.map(QS);return Array.isArray(e)?e.every(i=>t.some(r=>r.test(i.type))):t.some(i=>i.test(e.type))},kp=(e,n)=>{if(We(e))return!0;const t=rn(n,\"length\");return Array.isArray(e)?e.every(i=>kp(i,{length:t})):[...String(e)].length>=Number(t)},Rp=(e,n)=>{if(We(e))return!0;const t=rn(n,\"min\");return Array.isArray(e)?e.length>0&&e.every(i=>Rp(i,{min:t})):Number(e)>=Number(t)},Ul=(e,n)=>We(e)?!0:Array.isArray(e)?e.every(t=>Ul(t,n)):Array.from(n).some(t=>t==e),tw=(e,n)=>We(e)?!0:!Ul(e,n),nw=/^[٠١٢٣٤٥٦٧٨٩]+$/,iw=/^[0-9]+$/,rw=e=>{if(We(e))return!0;const n=t=>{const i=String(t);return iw.test(i)||nw.test(i)};return Array.isArray(e)?e.every(n):n(e)},Pp=(e,n)=>{if(We(e))return!0;let t=rn(n,\"regex\");return typeof t==\"string\"&&(t=new RegExp(t)),Array.isArray(e)?e.every(i=>Pp(i,{regex:t})):t.test(String(e))};function sw(e){return e==null}function ow(e){return Array.isArray(e)&&e.length===0}const aw=e=>sw(e)||ow(e)||e===!1?!1:!!String(e).trim().length,lw=(e,n)=>{if(We(e))return!0;let t=rn(n,\"size\");if(t=Number(t),isNaN(t))return!1;const i=t*1024;if(!Array.isArray(e))return e.size<=i;for(let r=0;r<e.length;r++)if(e[r].size>i)return!1;return!0},cw=(e,n)=>{var t;if(We(e))return!0;let i=rn(n,\"pattern\");typeof i==\"string\"&&(i=new RegExp(i));try{new URL(e)}catch{return!1}return(t=i==null?void 0:i.test(e))!==null&&t!==void 0?t:!0},uw={alpha_dash:Ap,alpha_num:Op,alpha_spaces:xp,alpha:Tp,between:Dp,confirmed:HS,digits:Mp,dimensions:zS,email:KS,ext:WS,image:YS,integer:ZS,is_not:JS,is:GS,length:XS,max_value:Ip,max:Np,mimes:ew,min_value:Rp,min:kp,not_one_of:tw,numeric:rw,one_of:Ul,regex:Pp,required:aw,size:lw,url:cw};window.defineRule=En;const fw={install:e=>{e.component(\"VForm\",ZE),e.component(\"VField\",HE),e.component(\"VErrorMessage\",JE),window.addEventListener(\"load\",()=>nS(document.documentElement.attributes.lang.value)),Object.entries(uw).forEach(([n,t])=>En(n,t)),En(\"phone\",n=>!n||!n.length?!0:!!/^\\+?\\d+$/.test(n)),En(\"address\",n=>!n||!n.length?!0:!!/^[a-zA-Z0-9\\s.\\/*'\\u0600-\\u06FF\\u0750-\\u077F\\u08A0-\\u08FF\\u0590-\\u05FF\\u3040-\\u309F\\u30A0-\\u30FF\\u0400-\\u04FF\\u0D80-\\u0DFF\\u3400-\\u4DBF\\u2000-\\u2A6D\\u00C0-\\u017F\\u0980-\\u09FF\\u0900-\\u097F\\u4E00-\\u9FFF,\\(\\)-]{1,60}$/iu.test(n)),En(\"decimal\",(n,{decimals:t=\"*\",separator:i=\".\"}={})=>{if(n==null||n===\"\")return!0;if(Number(t)===0)return/^-?\\d*$/.test(n);const r=t===\"*\"?\"+\":`{1,${t}}`;return new RegExp(`^[-+]?\\\\d*(\\\\${i}\\\\d${r})?([eE]{1}[-]?\\\\d+)?$`).test(n)}),En(\"required_if\",(n,{condition:t=!0}={})=>!(t&&(n==null||n===\"\"))),En(\"\",()=>!0),En(\"date_format\",n=>!0),En(\"after\",n=>!0),SE({generateMessage:tS({ar:{...Au,messages:{...Au.messages,phone:\"يجب أن يكون هذا {field} رقم هاتف صالحًا\"}},bn:{...Ou,messages:{...Ou.messages,phone:\"এই {field} একটি বৈধ ফোন নম্বর হতে হবে\"}},de:{...xu,messages:{...xu.messages,phone:\"Dieses {field} muss eine gültige Telefonnummer sein.\"}},en:{...Du,messages:{...Du.messages,phone:\"This {field} must be a valid phone number\"}},es:{...Mu,messages:{...Mu.messages,phone:\"Este {field} debe ser un número de teléfono válido.\"}},fa:{...Nu,messages:{...Nu.messages,phone:\"این {field} باید یک شماره تلفن معتبر باشد.\"}},fr:{...Iu,messages:{...Iu.messages,phone:\"Ce {field} doit être un numéro de téléphone valide.\"}},he:{...ku,messages:{...ku.messages,phone:\"זה {field} חייב להיות מספר טלפון תקין.\"}},hi_IN:{...Ru,messages:{...Ru.messages,phone:\"यह {field} कोई मान्य फ़ोन नंबर होना चाहिए।\"}},it:{...Pu,messages:{...Pu.messages,phone:\"Questo {field} deve essere un numero di telefono valido.\"}},ja:{...Fu,messages:{...Fu.messages,phone:\"この{field}は有効な電話番号である必要があります。\"}},nl:{...Lu,messages:{...Lu.messages,phone:\"Dit {field} moet een geldig telefoonnummer zijn.\"}},pl:{...Vu,messages:{...Vu.messages,phone:\"To {field} musi być prawidłowy numer telefonu.\"}},pt_BR:{...$u,messages:{...$u.messages,phone:\"Este {field} deve ser um número de telefone válido.\"}},ru:{...ju,messages:{...ju.messages,phone:\"Это {field} должно быть действительным номером телефона.\"}},sin:{...Bu,messages:{...Bu.messages,phone:\"මෙම {field} වටේ වලංගු දුරකතන අංකය විය යුතුයි.\"}},tr:{...Hu,messages:{...Hu.messages,phone:\"Bu {field} geçerli bir telefon numarası olmalıdır.\"}},uk:{...Uu,messages:{...Uu.messages,phone:\"Це {field} повинно бути дійсним номером телефону.\"}},zh_CN:{...qu,messages:{...qu.messages,phone:\"这个 {field} 必须是一个有效的电话号码。\"}}}),validateOnBlur:!0,validateOnInput:!0,validateOnChange:!0})}};window.app=Gd({data(){return{isMenuActive:!1,hoveringMenu:\"\"}},methods:{onSubmit(){},onInvalidSubmit({values:e,errors:n,results:t}){setTimeout(()=>{const i=Object.entries(n).map(([s,o])=>({key:s,value:o})).filter(s=>s.value.length);document.querySelector('[name=\"'+i[0].key+'\"]').scrollIntoView({behavior:\"smooth\",block:\"center\"})},100)}}});[z_,W_,eE,fw].forEach(e=>app.use(e));app;\n"
  },
  {
    "path": "public/webform/build/assets/app-c04ede37.css",
    "content": ".flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,.08);box-shadow:1px 0 #e6e6e6,-1px 0 #e6e6e6,0 1px #e6e6e6,0 -1px #e6e6e6,0 3px 13px #00000014}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1);animation:fpFadeInDown .3s cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none!important;box-shadow:none!important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:\"\";height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:#000000e6;fill:#000000e6;height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:#000000e6;fill:#000000e6}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{left:0}.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{right:0}.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,.1)}.numInputWrapper span:active{background:rgba(0,0,0,.2)}.numInputWrapper span:after{display:block;content:\"\";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:#00000080}.numInputWrapper:hover{background:rgba(0,0,0,.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0px,0px,0px);transform:translateZ(0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch�;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:#000000e6}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:#000000e6}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:#00000080;background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:#0000008a;line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0px,0px,0px);transform:translateZ(0);opacity:1}.dayContainer+.dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange+.endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange+.endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 #e6e6e6,5px 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:#3939394d;background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:#3939391a}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 #569ff7,5px 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:#3939394d;background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:\"\";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:700}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:700;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}}@keyframes fpFadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translateZ(0)}}\n"
  },
  {
    "path": "public/webform/build/manifest.json",
    "content": "{\n  \"src/Resources/assets/css/app.css\": {\n    \"file\": \"assets/app-499ae59b.css\",\n    \"isEntry\": true,\n    \"src\": \"src/Resources/assets/css/app.css\"\n  },\n  \"src/Resources/assets/fonts/icomoon.woff\": {\n    \"file\": \"assets/icomoon-8bbcff3c.woff\",\n    \"src\": \"src/Resources/assets/fonts/icomoon.woff\"\n  },\n  \"src/Resources/assets/js/app.css\": {\n    \"file\": \"assets/app-c04ede37.css\",\n    \"src\": \"src/Resources/assets/js/app.css\"\n  },\n  \"src/Resources/assets/js/app.js\": {\n    \"css\": [\n      \"assets/app-c04ede37.css\"\n    ],\n    \"file\": \"assets/app-8787c790.js\",\n    \"isEntry\": true,\n    \"src\": \"src/Resources/assets/js/app.js\"\n  }\n}"
  },
  {
    "path": "resources/css/app.css",
    "content": ""
  },
  {
    "path": "resources/js/app.js",
    "content": "import './bootstrap';\n"
  },
  {
    "path": "resources/js/bootstrap.js",
    "content": "/**\n * We'll load the axios HTTP library which allows us to easily issue requests\n * to our Laravel back-end. This library automatically handles sending the\n * CSRF token as a header based on the value of the \"XSRF\" token cookie.\n */\n\nimport axios from 'axios';\nwindow.axios = axios;\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\n\n/**\n * Echo exposes an expressive API for subscribing to channels and listening\n * for events that are broadcast by Laravel. Echo and event broadcasting\n * allows your team to easily build robust real-time web applications.\n */\n\n// import Echo from 'laravel-echo';\n\n// import Pusher from 'pusher-js';\n// window.Pusher = Pusher;\n\n// window.Echo = new Echo({\n//     broadcaster: 'pusher',\n//     key: import.meta.env.VITE_PUSHER_APP_KEY,\n//     cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER ?? 'mt1',\n//     wsHost: import.meta.env.VITE_PUSHER_HOST ? import.meta.env.VITE_PUSHER_HOST : `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`,\n//     wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80,\n//     wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443,\n//     forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https',\n//     enabledTransports: ['ws', 'wss'],\n// });\n"
  },
  {
    "path": "resources/views/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "routes/api.php",
    "content": "<?php\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Route;\n\n/*\n|--------------------------------------------------------------------------\n| API Routes\n|--------------------------------------------------------------------------\n|\n| Here is where you can register API routes for your application. These\n| routes are loaded by the RouteServiceProvider within a group which\n| is assigned the \"api\" middleware group. Enjoy building your API!\n|\n*/\n\nRoute::middleware('auth:api')->get('/user', function (Request $request) {\n    return $request->user();\n});\n"
  },
  {
    "path": "routes/breadcrumbs.php",
    "content": "<?php\n\nuse Diglactic\\Breadcrumbs\\Breadcrumbs;\nuse Diglactic\\Breadcrumbs\\Generator as BreadcrumbTrail;\n\n// Dashboard\nBreadcrumbs::for('dashboard', function (BreadcrumbTrail $trail) {\n    $trail->push(trans('admin::app.layouts.dashboard'), route('admin.dashboard.index'));\n});\n\n// Dashboard > Leads\nBreadcrumbs::for('leads', function (BreadcrumbTrail $trail) {\n    $trail->parent('dashboard');\n    $trail->push(trans('admin::app.layouts.leads'), route('admin.leads.index'));\n});\n\n// Dashboard > Leads > Create\nBreadcrumbs::for('leads.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('leads');\n    $trail->push(trans('admin::app.leads.create.title'), route('admin.leads.create'));\n});\n\n// Leads Edit\nBreadcrumbs::for('leads.edit', function (BreadcrumbTrail $trail, $lead) {\n    $trail->parent('leads');\n    $trail->push(trans('admin::app.leads.edit.title'), route('admin.leads.edit', $lead->id));\n});\n\n// Dashboard > Leads > Title\nBreadcrumbs::for('leads.view', function (BreadcrumbTrail $trail, $lead) {\n    $trail->parent('leads');\n    $trail->push('#'.$lead->id, route('admin.leads.view', $lead->id));\n});\n\n// Dashboard > Quotes\nBreadcrumbs::for('quotes', function (BreadcrumbTrail $trail) {\n    $trail->parent('dashboard');\n    $trail->push(trans('admin::app.layouts.quotes'), route('admin.quotes.index'));\n});\n\n// Dashboard > Quotes > Add Quote\nBreadcrumbs::for('quotes.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('quotes');\n    $trail->push(trans('admin::app.quotes.create.title'), route('admin.quotes.create'));\n});\n\n// Dashboard > Quotes > Edit Quote\nBreadcrumbs::for('quotes.edit', function (BreadcrumbTrail $trail, $quote) {\n    $trail->parent('quotes');\n    $trail->push(trans('admin::app.quotes.edit.title'), route('admin.quotes.edit', $quote->id));\n});\n\n// Mail\nBreadcrumbs::for('mail', function (BreadcrumbTrail $trail) {\n    $trail->parent('dashboard');\n    $trail->push(trans('admin::app.layouts.mail.title'), route('admin.mail.index', ['route' => 'inbox']));\n});\n\n// Mail > [Compose | Inbox | Outbox | Draft | Sent | Trash]\nBreadcrumbs::for('mail.route', function (BreadcrumbTrail $trail, $route) {\n    $trail->parent('mail');\n    $trail->push(trans('admin::app.mail.index.'.$route), route('admin.mail.index', ['route' => $route]));\n});\n\n// Mail > [Inbox | Outbox | Draft | Sent | Trash] > Title\nBreadcrumbs::for('mail.route.view', function (BreadcrumbTrail $trail, $route, $email) {\n    $trail->parent('mail.route', $route);\n    $trail->push($email->subject ?? '', route('admin.mail.view', ['route' => $route, 'id' => $email->id]));\n});\n\n// Dashboard > Activities\nBreadcrumbs::for('activities', function (BreadcrumbTrail $trail) {\n    $trail->parent('dashboard');\n    $trail->push(trans('admin::app.layouts.activities'), route('admin.activities.index'));\n});\n\n// Dashboard > activities > Edit Activity\nBreadcrumbs::for('activities.edit', function (BreadcrumbTrail $trail, $activity) {\n    $trail->parent('activities');\n    $trail->push(trans('admin::app.activities.edit.title'), route('admin.activities.edit', $activity->id));\n});\n\n// Dashboard > Contacts\nBreadcrumbs::for('contacts', function (BreadcrumbTrail $trail) {\n    $trail->parent('dashboard');\n    $trail->push(trans('admin::app.layouts.contacts'), route('admin.contacts.persons.index'));\n});\n\n// Dashboard > Contacts > Persons\nBreadcrumbs::for('contacts.persons', function (BreadcrumbTrail $trail) {\n    $trail->parent('contacts');\n    $trail->push(trans('admin::app.layouts.persons'), route('admin.contacts.persons.index'));\n});\n\n// Dashboard > Contacts > Persons > Create\nBreadcrumbs::for('contacts.persons.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('contacts.persons');\n    $trail->push(trans('admin::app.contacts.persons.create.title'), route('admin.contacts.persons.create'));\n});\n\n// Dashboard > Contacts > Persons > Edit\nBreadcrumbs::for('contacts.persons.edit', function (BreadcrumbTrail $trail, $person) {\n    $trail->parent('contacts.persons');\n    $trail->push(trans('admin::app.contacts.persons.edit.title'), route('admin.contacts.persons.edit', $person->id));\n});\n\n// Dashboard > Contacts > Persons > View\nBreadcrumbs::for('contacts.persons.view', function (BreadcrumbTrail $trail, $person) {\n    $trail->parent('contacts.persons');\n    $trail->push('#'.$person->id, route('admin.contacts.persons.index'));\n});\n\n// Dashboard > Contacts > Organizations\nBreadcrumbs::for('contacts.organizations', function (BreadcrumbTrail $trail) {\n    $trail->parent('contacts');\n    $trail->push(trans('admin::app.layouts.organizations'), route('admin.contacts.organizations.index'));\n});\n\n// Dashboard > Contacts > Organizations > Create\nBreadcrumbs::for('contacts.organizations.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('contacts.organizations');\n    $trail->push(trans('admin::app.contacts.organizations.create.title'), route('admin.contacts.organizations.create'));\n});\n\n// Dashboard > Contacts > Organizations > Edit\nBreadcrumbs::for('contacts.organizations.edit', function (BreadcrumbTrail $trail, $organization) {\n    $trail->parent('contacts.organizations');\n    $trail->push(trans('admin::app.contacts.organizations.edit.title'), route('admin.contacts.organizations.edit', $organization->id));\n});\n\n// Products\nBreadcrumbs::for('products', function (BreadcrumbTrail $trail) {\n    $trail->parent('dashboard');\n    $trail->push(trans('admin::app.layouts.products'), route('admin.products.index'));\n});\n\n// Dashboard > Products > Create Product\nBreadcrumbs::for('products.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('products');\n    $trail->push(trans('admin::app.products.create.title'), route('admin.products.create'));\n});\n\n// Dashboard > Products > View Product\nBreadcrumbs::for('products.view', function (BreadcrumbTrail $trail, $product) {\n    $trail->parent('products');\n    $trail->push('#'.$product->id, route('admin.products.view', $product->id));\n});\n\n// Dashboard > Products > Edit Product\nBreadcrumbs::for('products.edit', function (BreadcrumbTrail $trail, $product) {\n    $trail->parent('products');\n    $trail->push(trans('admin::app.products.edit.title'), route('admin.products.edit', $product->id));\n});\n\n// Settings\nBreadcrumbs::for('settings', function (BreadcrumbTrail $trail) {\n    $trail->parent('dashboard');\n    $trail->push(trans('admin::app.layouts.settings'), route('admin.settings.index'));\n});\n\n// Settings > Groups\nBreadcrumbs::for('settings.groups', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.layouts.groups'), route('admin.settings.groups.index'));\n});\n\n// Dashboard > Groups > Create Group\nBreadcrumbs::for('settings.groups.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings.groups');\n    $trail->push(trans('admin::app.settings.groups.create-title'), route('admin.settings.groups.create'));\n});\n\n// Dashboard > Groups > Edit Group\nBreadcrumbs::for('settings.groups.edit', function (BreadcrumbTrail $trail, $role) {\n    $trail->parent('settings.groups');\n    $trail->push(trans('admin::app.settings.groups.edit-title'), route('admin.settings.groups.edit', $role->id));\n});\n\n// Settings > Roles\nBreadcrumbs::for('settings.roles', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.layouts.roles'), route('admin.settings.roles.index'));\n});\n\n// Dashboard > Roles > Create Role\nBreadcrumbs::for('settings.roles.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings.roles');\n    $trail->push(trans('admin::app.settings.roles.create.title'), route('admin.settings.roles.create'));\n});\n\n// Dashboard > Roles > Edit Role\nBreadcrumbs::for('settings.roles.edit', function (BreadcrumbTrail $trail, $role) {\n    $trail->parent('settings.roles');\n    $trail->push(trans('admin::app.settings.roles.edit.title'), route('admin.settings.roles.edit', $role->id));\n});\n\n// Settings > Users\nBreadcrumbs::for('settings.users', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.layouts.users'), route('admin.settings.users.index'));\n});\n\n// Dashboard > Users > Create Role\nBreadcrumbs::for('settings.users.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings.users');\n    $trail->push(trans('admin::app.settings.users.create-title'), route('admin.settings.users.create'));\n});\n\n// Dashboard > Users > Edit Role\nBreadcrumbs::for('settings.users.edit', function (BreadcrumbTrail $trail, $user) {\n    $trail->parent('settings.users');\n    $trail->push(trans('admin::app.settings.users.edit-title'), route('admin.settings.users.edit', $user->id));\n});\n\n// Settings > Attributes\nBreadcrumbs::for('settings.attributes', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.layouts.attributes'), route('admin.settings.attributes.index'));\n});\n\n// Dashboard > Attributes > Create Attribute\nBreadcrumbs::for('settings.attributes.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings.attributes');\n    $trail->push(trans('admin::app.settings.attributes.create.title'), route('admin.settings.attributes.create'));\n});\n\n// Dashboard > Attributes > Edit Attribute\nBreadcrumbs::for('settings.attributes.edit', function (BreadcrumbTrail $trail, $attribute) {\n    $trail->parent('settings.attributes');\n    $trail->push(trans('admin::app.settings.attributes.edit.title'), route('admin.settings.attributes.edit', $attribute->id));\n});\n\n// Settings > Pipelines\nBreadcrumbs::for('settings.pipelines', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.layouts.pipelines'), route('admin.settings.pipelines.index'));\n});\n\n// Dashboard > Pipelines > Create Pipeline\nBreadcrumbs::for('settings.pipelines.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings.pipelines');\n    $trail->push(trans('admin::app.settings.pipelines.create.title'), route('admin.settings.pipelines.create'));\n});\n\n// Dashboard > Pipelines > Edit Pipeline\nBreadcrumbs::for('settings.pipelines.edit', function (BreadcrumbTrail $trail, $pipeline) {\n    $trail->parent('settings.pipelines');\n    $trail->push(trans('admin::app.settings.pipelines.edit.title'), route('admin.settings.pipelines.edit', $pipeline->id));\n});\n\n// Settings > Sources\nBreadcrumbs::for('settings.sources', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.layouts.sources'), route('admin.settings.sources.index'));\n});\n\n// Dashboard > Sources > Edit Source\nBreadcrumbs::for('settings.sources.edit', function (BreadcrumbTrail $trail, $source) {\n    $trail->parent('settings.sources');\n    $trail->push(trans('admin::app.settings.sources.edit-title'), route('admin.settings.sources.edit', $source->id));\n});\n\n// Settings > Types\nBreadcrumbs::for('settings.types', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.layouts.types'), route('admin.settings.types.index'));\n});\n\n// Dashboard > Types > Edit Type\nBreadcrumbs::for('settings.types.edit', function (BreadcrumbTrail $trail, $type) {\n    $trail->parent('settings.types');\n    $trail->push(trans('admin::app.settings.types.edit-title'), route('admin.settings.types.edit', $type->id));\n});\n\n// Settings > Email Templates\nBreadcrumbs::for('settings.email_templates', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.settings.email-template.index.title'), route('admin.settings.email_templates.index'));\n});\n\n// Dashboard > Email Templates > Create Email Template\nBreadcrumbs::for('settings.email_templates.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings.email_templates');\n    $trail->push(trans('admin::app.settings.email-template.create.title'), route('admin.settings.email_templates.create'));\n});\n\n// Dashboard > Email Templates > Edit Email Template\nBreadcrumbs::for('settings.email_templates.edit', function (BreadcrumbTrail $trail, $emailTemplate) {\n    $trail->parent('settings.email_templates');\n    $trail->push(trans('admin::app.settings.email-template.edit.title'), route('admin.settings.email_templates.edit', $emailTemplate->id));\n});\n\n// Settings > Marketing Events\nBreadcrumbs::for('settings.marketing.events', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.settings.marketing.events.index.title'), route('admin.settings.marketing.events.index'));\n});\n\nBreadcrumbs::for('settings.marketing.campaigns', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.settings.marketing.campaigns.index.title'), route('admin.settings.marketing.campaigns.index'));\n});\n\n// Settings > Workflows\nBreadcrumbs::for('settings.workflows', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.layouts.workflows'), route('admin.settings.workflows.index'));\n});\n\n// Dashboard > Workflows > Create Workflow\nBreadcrumbs::for('settings.workflows.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings.workflows');\n    $trail->push(trans('admin::app.settings.workflows.create.title'), route('admin.settings.workflows.create'));\n});\n\n// Dashboard > Workflows > Edit Workflow\nBreadcrumbs::for('settings.workflows.edit', function (BreadcrumbTrail $trail, $workflow) {\n    $trail->parent('settings.workflows');\n    $trail->push(trans('admin::app.settings.workflows.edit.title'), route('admin.settings.workflows.edit', $workflow->id));\n});\n\n// Settings > Webhooks\nBreadcrumbs::for('settings.webhooks', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.settings.webhooks.index.title'), route('admin.settings.webhooks.index'));\n});\n\n// Dashboard > Webhooks > Create Workflow\nBreadcrumbs::for('settings.webhooks.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings.webhooks');\n    $trail->push(trans('admin::app.settings.webhooks.create.title'), route('admin.settings.webhooks.create'));\n});\n\n// Dashboard > Webhooks > Edit Workflow\nBreadcrumbs::for('settings.webhooks.edit', function (BreadcrumbTrail $trail, $workflow) {\n    $trail->parent('settings.webhooks');\n    $trail->push(trans('admin::app.settings.webhooks.edit.edit-btn'), route('admin.settings.workflows.edit', $workflow->id));\n});\n\n// Settings > Tags\nBreadcrumbs::for('settings.tags', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.layouts.tags'), route('admin.settings.tags.index'));\n});\n\n// Dashboard > Tags > Edit Tag\nBreadcrumbs::for('settings.tags.edit', function (BreadcrumbTrail $trail, $tag) {\n    $trail->parent('settings.tags');\n    $trail->push(trans('admin::app.settings.tags.edit-title'), route('admin.settings.tags.edit', $tag->id));\n});\n\n// Settings > Web Form\nBreadcrumbs::for('settings.web_forms', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.settings.webforms.index.title'), route('admin.settings.web_forms.index'));\n});\n\n// Dashboard > Web Form > Create Web Form\nBreadcrumbs::for('settings.web_forms.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings.web_forms');\n    $trail->push(trans('admin::app.settings.webforms.create.title'), route('admin.settings.web_forms.create'));\n});\n\n// Dashboard > Web Form > Edit Web Form\nBreadcrumbs::for('settings.web_forms.edit', function (BreadcrumbTrail $trail, $webForm) {\n    $trail->parent('settings.web_forms');\n    $trail->push(trans('admin::app.settings.webforms.edit.title'), route('admin.settings.web_forms.edit', $webForm->id));\n});\n\n// Settings > Warehouse\nBreadcrumbs::for('settings.warehouses', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.settings.warehouses.index.title'), route('admin.settings.warehouses.index'));\n});\n\n// Dashboard > Settings > Warehouse > Create Warehouse\nBreadcrumbs::for('settings.warehouses.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings.warehouses');\n    $trail->push(trans('admin::app.settings.warehouses.create.title'), route('admin.settings.warehouses.create'));\n});\n\n// Dashboard > Settings > Warehouse > Edit Warehouse\nBreadcrumbs::for('settings.warehouses.edit', function (BreadcrumbTrail $trail, $warehouse) {\n    $trail->parent('settings.warehouses');\n    $trail->push(trans('admin::app.settings.warehouses.edit.title'), route('admin.settings.warehouses.edit', $warehouse->id));\n});\n\n// Dashboard > Settings > Warehouse > View Warehouse\nBreadcrumbs::for('settings.warehouses.view', function (BreadcrumbTrail $trail, $warehouse) {\n    $trail->parent('settings.warehouses');\n    $trail->push('#'.$warehouse->id, route('admin.settings.warehouses.view', $warehouse->id));\n});\n\n// Dashboard > Settings > Warehouse > View Warehouse > Products\nBreadcrumbs::for('settings.warehouses.view.products', function (BreadcrumbTrail $trail, $warehouse) {\n    $trail->parent('settings.warehouses.view', $warehouse);\n    $trail->push(trans('admin::app.settings.warehouses.products'), route('admin.settings.warehouses.products.index', $warehouse->id));\n});\n\n// Dashboard > Settings > Locations\nBreadcrumbs::for('settings.locations', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.settings.locations.title'), route('admin.settings.locations.index'));\n});\n\n// Dashboard > Settings > Locations > Create Warehouse\nBreadcrumbs::for('settings.locations.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings.locations');\n    $trail->push(trans('admin::app.settings.locations.create-title'), route('admin.settings.locations.create'));\n});\n\n// Dashboard > Settings > Locations > Edit Warehouse\nBreadcrumbs::for('settings.locations.edit', function (BreadcrumbTrail $trail, $location) {\n    $trail->parent('settings.locations');\n    $trail->push(trans('admin::app.settings.locations.edit-title'), route('admin.settings.locations.edit', $location->id));\n});\n\n// Dashboard > Settings > Data Transfers\nBreadcrumbs::for('settings.data_transfers', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings');\n    $trail->push(trans('admin::app.settings.data-transfer.imports.index.title'), route('admin.settings.data_transfer.imports.index'));\n});\n\n// Dashboard > Settings > Data Transfers > Create Data Transfer\nBreadcrumbs::for('settings.data_transfers.create', function (BreadcrumbTrail $trail) {\n    $trail->parent('settings.data_transfers');\n    $trail->push(trans('admin::app.settings.data-transfer.imports.create.title'), route('admin.settings.data_transfer.imports.create'));\n});\n\n// Dashboard > Settings > Data Transfers > Edit Data Transfer\nBreadcrumbs::for('settings.data_transfers.edit', function (BreadcrumbTrail $trail, $import) {\n    $trail->parent('settings.data_transfers');\n    $trail->push(trans('admin::app.settings.data-transfer.imports.edit.title'), route('admin.settings.data_transfer.imports.edit', $import->id));\n});\n\n// Dashboard > Settings > Data Transfers > Import Data Transfer\nBreadcrumbs::for('settings.data_transfers.import', function (BreadcrumbTrail $trail, $import) {\n    $trail->parent('settings.data_transfers');\n    $trail->push(trans('admin::app.settings.data-transfer.imports.import.title'), route('admin.settings.data_transfer.imports.import', $import->id));\n});\n\n// Configuration\nBreadcrumbs::for('configuration', function (BreadcrumbTrail $trail) {\n    $trail->parent('dashboard');\n    $trail->push(trans('admin::app.layouts.configuration'), route('admin.configuration.index'));\n});\n\n// Configuration > Config\nBreadcrumbs::for('configuration.slug', function (BreadcrumbTrail $trail, $slug) {\n    $trail->parent('configuration');\n    $trail->push('', route('admin.configuration.index', ['slug' => $slug]));\n});\n\n// Dashboard > Account > Edit\nBreadcrumbs::for('dashboard.account.edit', function (BreadcrumbTrail $trail, $user) {\n    $trail->parent('dashboard');\n    $trail->push(trans('admin::app.account.edit.title'), route('admin.user.account.edit', $user->id));\n});\n"
  },
  {
    "path": "routes/channels.php",
    "content": "<?php\n\nuse Illuminate\\Support\\Facades\\Broadcast;\n\n/*\n|--------------------------------------------------------------------------\n| Broadcast Channels\n|--------------------------------------------------------------------------\n|\n| Here you may register all of the event broadcasting channels that your\n| application supports. The given channel authorization callbacks are\n| used to check if an authenticated user can listen to the channel.\n|\n*/\n\nBroadcast::channel('App.Models.User.{id}', function ($user, $id) {\n    return (int) $user->id === (int) $id;\n});\n"
  },
  {
    "path": "routes/console.php",
    "content": "<?php\n\nuse Illuminate\\Foundation\\Inspiring;\nuse Illuminate\\Support\\Facades\\Artisan;\nuse Illuminate\\Support\\Facades\\Schedule;\n\n/*\n|--------------------------------------------------------------------------\n| Console Routes\n|--------------------------------------------------------------------------\n|\n| This file is where you may define all of your Closure based console\n| commands. Each Closure is bound to a command instance allowing a\n| simple approach to interacting with each command's IO methods.\n|\n*/\n\nArtisan::command('inspire', function () {\n    $this->comment(Inspiring::quote());\n})->purpose('Display an inspiring quote');\n\nSchedule::command('inbound-emails:process')->everyFiveMinutes();\n"
  },
  {
    "path": "routes/web.php",
    "content": "<?php\n"
  },
  {
    "path": "storage/.gitignore",
    "content": "installed"
  },
  {
    "path": "storage/app/.gitignore",
    "content": "*\n!public/\n!.gitignore\n"
  },
  {
    "path": "storage/debugbar/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "storage/framework/.gitignore",
    "content": "compiled.php\nconfig.php\ndown\nevents.scanned.php\n/laravel-excel\nmaintenance.php\nroutes.php\nroutes.scanned.php\nschedule-*\nservices.json\n"
  },
  {
    "path": "storage/framework/cache/.gitignore",
    "content": "*\n!data/\n!.gitignore\n"
  },
  {
    "path": "storage/framework/sessions/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "storage/framework/testing/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "storage/framework/views/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "storage/logs/.gitignore",
    "content": "*\n!.gitignore\n"
  },
  {
    "path": "tests/Feature/AuthenticationTest.php",
    "content": "<?php\n\nit('can see the admin login page', function () {\n    test()->get(route('admin.session.create'))\n        ->assertOK();\n});\n\nit('can see the dashboard page after login', function () {\n    $admin = getDefaultAdmin();\n\n    test()->actingAs($admin)\n        ->get(route('admin.dashboard.index'))\n        ->assertOK();\n\n    expect(auth()->guard('user')->user()->name)->toBe($admin->name);\n});\n\nit('can logout from the admin panel', function () {\n    $admin = getDefaultAdmin();\n\n    test()->actingAs($admin)\n        ->delete(route('admin.session.destroy'), [\n            '_token' => csrf_token(),\n        ])\n        ->assertStatus(302);\n\n    expect(auth()->guard('user')->user())->toBeNull();\n});\n"
  },
  {
    "path": "tests/Pest.php",
    "content": "<?php\n\nuse Laravel\\Sanctum\\Sanctum;\nuse Tests\\TestCase;\nuse Webkul\\User\\Models\\User;\n\n/*\n|--------------------------------------------------------------------------\n| Test Case\n|--------------------------------------------------------------------------\n|\n| The closure you provide to your test functions is always bound to a specific PHPUnit test\n| case class. By default, that class is \"PHPUnit\\Framework\\TestCase\". Of course, you may\n| need to change it using the \"uses()\" function to bind a different classes or traits.\n|\n */\n\nuses(TestCase::class)->in('Feature');\n\n/*\n|--------------------------------------------------------------------------\n| Expectations\n|--------------------------------------------------------------------------\n|\n| When you're writing tests, you often need to check that values meet certain conditions. The\n| \"expect()\" function gives you access to a set of \"expectations\" methods that you can use\n| to assert different things. Of course, you may extend the Expectation API at any time.\n|\n */\n\nexpect()->extend('toBeOne', function () {\n    return $this->toBe(1);\n});\n\n/*\n|--------------------------------------------------------------------------\n| Functions\n|--------------------------------------------------------------------------\n|\n| While Pest is very powerful out-of-the-box, you may have some testing code specific to your\n| project that you don't want to repeat in every file. Here you can also expose helpers as\n| global functions to help you to reduce the number of lines of code in your test files.\n|\n */\n\n/**\n * Get default admin which is created on fresh instance.\n *\n * @return User\n */\nfunction getDefaultAdmin()\n{\n    $admin = User::find(1);\n\n    return $admin;\n}\n\n/**\n * Sanctum authenticated admin.\n *\n * @return User\n */\nfunction actingAsSanctumAuthenticatedAdmin()\n{\n    return Sanctum::actingAs(\n        getDefaultAdmin(),\n        ['*']\n    );\n}\n\n/**\n * Get first name.\n *\n * @param  string  $fullName\n * @return string\n */\nfunction getFirstName($fullName)\n{\n    return explode(' ', $fullName)[0];\n}\n"
  },
  {
    "path": "tests/TestCase.php",
    "content": "<?php\n\nnamespace Tests;\n\nuse Illuminate\\Foundation\\Testing\\TestCase as BaseTestCase;\n\nabstract class TestCase extends BaseTestCase\n{\n    //\n}\n"
  },
  {
    "path": "tests/Unit/BasicTest.php",
    "content": "<?php\n\ntest('check basic unit test', function () {\n    $this->assertTrue(true);\n\n    expect(true)->toBeTrue();\n});\n"
  },
  {
    "path": "vite.config.js",
    "content": "import { defineConfig } from 'vite';\nimport laravel from 'laravel-vite-plugin';\n\nexport default defineConfig({\n    plugins: [\n        laravel({\n            input: ['resources/css/app.css', 'resources/js/app.js'],\n            refresh: true,\n        }),\n    ],\n});\n"
  }
]