[
  {
    "path": ".editorconfig",
    "content": "# https://editorconfig.org/\n\nroot = true\n\n[*]\nindent_style = space\nindent_size = 4\ninsert_final_newline = true\ntrim_trailing_whitespace = true\nend_of_line = lf\ncharset = utf-8\n\n[*.html]\nindent_size = 2\n\n[Makefile]\nindent_style = tab\n\n[*.bat]\nindent_style = tab\n\n[*.yml]\nindent_size = 2\n"
  },
  {
    "path": ".git-blame-ignore-revs",
    "content": ""
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "#### Description\n\nPlease include a summary of the change and which issue is fixed. Please also\ninclude relevant motivation and context. Your commit message should include\nthis information as well.\n\nFixes # (issue)\n\n#### Checklist:\n\n- [ ] I have added the relevant tests for this change.\n- [ ] I have added an item to the Pending section of ``docs/changes.rst``.\n\n#### AI/LLM Usage\n- [ ] This PR includes code generated with the help of an AI/LLM\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "# Keep GitHub Actions up to date with GitHub's Dependabot...\n# https://docs.github.com/en/code-security/dependabot/working-with-dependabot/keeping-your-actions-up-to-date-with-dependabot\n# https://docs.github.com/en/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file#package-ecosystem\nversion: 2\nupdates:\n  - package-ecosystem: github-actions\n    directory: /\n    groups:\n      github-actions:\n        patterns:\n          - \"*\"  # Group all Actions updates into a single larger pull request\n    schedule:\n      interval: weekly\n    cooldown:\n      default-days: 7\n"
  },
  {
    "path": ".github/release.yml",
    "content": "---\nchangelog:\n  exclude:\n    authors:\n      - dependabot[bot]\n      - pre-commit-ci[bot]\n"
  },
  {
    "path": ".github/workflows/coverage.yml",
    "content": "# .github/workflows/coverage.yml\nname: Post coverage comment\n\non:\n  workflow_run: # zizmor: ignore[dangerous-triggers] - This follows GitHub's recommended pattern for posting PR comments from untrusted forks\n    workflows: [\"Test\"]\n    types:\n      - completed\n\njobs:\n  test:\n    name: Run tests & display coverage\n    runs-on: ubuntu-latest\n    if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success'\n    permissions:\n      # Gives the action the necessary permissions for publishing new\n      # comments in pull requests.\n      pull-requests: write\n      # Gives the action the necessary permissions for editing existing\n      # comments (to avoid publishing multiple comments in the same PR)\n      contents: write\n      # Gives the action the necessary permissions for looking up the\n      # workflow that launched this workflow, and download the related\n      # artifact that contains the comment to be published\n      actions: read\n    steps:\n      # DO NOT run actions/checkout here, for security reasons\n      # For details, refer to https://securitylab.github.com/research/github-actions-preventing-pwn-requests/\n      - name: Post comment\n        uses: py-cov-action/python-coverage-comment-action@7188638f871f721a365d644f505d1ff3df20d683  # v3.40\n        with:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          GITHUB_PR_RUN_ID: ${{ github.event.workflow_run.id }}\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "name: Publish Python 🐍 distribution 📦 to PyPI and TestPyPI\n\non: push\n\npermissions: {}\n\nenv:\n  PYPI_URL: https://pypi.org/p/django-debug-toolbar\n  PYPI_TEST_URL: https://test.pypi.org/p/django-debug-toolbar\n\njobs:\n\n  build:\n    name: Build distribution 📦\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd  # v6.0.2\n      with:\n        persist-credentials: false\n    - name: Set up Python\n      uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405  # v6.2.0\n      with:\n        python-version: \"3.x\"\n    - name: Install pypa/build\n      run:\n        python3 -m pip install build --user\n    - name: Build a binary wheel and a source tarball\n      run: python3 -m build\n    - name: Store the distribution packages\n      uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f  # v7.0.0\n      with:\n        name: python-package-distributions\n        path: dist/\n\n  publish-to-pypi:\n    name: >-\n      Publish Python 🐍 distribution 📦 to PyPI\n    if: startsWith(github.ref, 'refs/tags/')  # only publish to PyPI on tag pushes\n    needs:\n    - build\n    runs-on: ubuntu-latest\n    environment:\n      name: pypi\n      url: ${{ env.PYPI_URL }}\n    permissions:\n      id-token: write  # IMPORTANT: mandatory for trusted publishing\n    steps:\n    - name: Download all the dists\n      uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3  # v8.0.0\n      with:\n        name: python-package-distributions\n        path: dist/\n    - name: Publish distribution 📦 to PyPI\n      uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e  # release/v1.13\n\n  github-release:\n    name: >-\n      Sign the Python 🐍 distribution 📦 with Sigstore\n      and upload them to GitHub Release\n    needs:\n    - publish-to-pypi\n    runs-on: ubuntu-latest\n\n    permissions:\n      contents: write  # IMPORTANT: mandatory for making GitHub Releases\n      id-token: write  # IMPORTANT: mandatory for sigstore\n\n    steps:\n    - name: Download all the dists\n      uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3  # v8.0.0\n      with:\n        name: python-package-distributions\n        path: dist/\n    - name: Sign the dists with Sigstore\n      uses: sigstore/gh-action-sigstore-python@a5caf349bc536fbef3668a10ed7f5cd309a4b53d  # v3.2.0\n      with:\n        inputs: >-\n          ./dist/*.tar.gz\n          ./dist/*.whl\n    - name: Create GitHub Release\n      env:\n        GITHUB_TOKEN: ${{ github.token }}\n      run: >-\n        gh release create\n        \"${GITHUB_REF_NAME}\"\n        --repo '${{ github.repository }}'\n        --notes \"\"\n    - name: Upload artifact signatures to GitHub Release\n      env:\n        GITHUB_TOKEN: ${{ github.token }}\n      # Upload to GitHub Release using the `gh` CLI.\n      # `dist/` contains the built packages, and the\n      # sigstore-produced signatures and certificates.\n      run: >-\n        gh release upload\n        \"${GITHUB_REF_NAME}\" dist/**\n        --repo '${{ github.repository }}'\n\n  publish-to-testpypi:\n    name: Publish Python 🐍 distribution 📦 to TestPyPI\n    if: startsWith(github.ref, 'refs/tags/')  # only publish to Test PyPI on tag pushes\n    needs:\n    - build\n    runs-on: ubuntu-latest\n\n    environment:\n      name: testpypi\n      url: ${{ env.PYPI_TEST_URL }}\n\n    permissions:\n      id-token: write  # IMPORTANT: mandatory for trusted publishing\n\n    steps:\n    - name: Download all the dists\n      uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3  # v8.0.0\n      with:\n        name: python-package-distributions\n        path: dist/\n    - name: Publish distribution 📦 to TestPyPI\n      uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e  # release/v1.13\n      with:\n        repository-url: https://test.pypi.org/legacy/\n        skip-existing: true\n"
  },
  {
    "path": ".github/workflows/test.yml",
    "content": "name: Test\n\non:\n  push:\n    branches:\n    - main\n    tags:\n    - '**'\n  pull_request:\n  schedule:\n    # Run weekly on Saturday\n    - cron: '37 3 * * SAT'\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\npermissions:\n  contents: read\n\njobs:\n  mysql:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      max-parallel: 5\n      matrix:\n        python-version: ['3.10', '3.11', '3.12', '3.13', '3.14']\n\n    services:\n      mariadb:\n        image: mariadb:11.8\n        env:\n          MARIADB_ROOT_PASSWORD: debug_toolbar\n        options: >-\n          --health-cmd \"mariadb-admin ping\"\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n        - 3306:3306\n\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd  # v6.0.2\n      with:\n        persist-credentials: false\n\n    - name: Set up Python ${{ matrix.python-version }}\n      uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405  # v6.2.0\n      with:\n        python-version: ${{ matrix.python-version }}\n        allow-prereleases: true\n\n    - name: Get pip cache dir\n      id: pip-cache\n      run: |\n        echo \"dir=$(pip cache dir)\" >> $GITHUB_OUTPUT\n\n    - name: Cache\n      uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306  # v5.0.3\n      with:\n        path: ${{ steps.pip-cache.outputs.dir }}\n        key:\n          ${{ matrix.python-version }}-v1-${{ hashFiles('**/pyproject.toml') }}-${{ hashFiles('**/tox.ini') }}\n        restore-keys: |\n          ${{ matrix.python-version }}-v1-\n        lookup-only: true\n\n    - name: Install dependencies\n      run: |\n        python -m pip install --upgrade pip\n        python -m pip install --upgrade tox tox-gh-actions\n\n    - name: Test with tox\n      run: tox\n      env:\n        DB_BACKEND: mysql\n        DB_USER: root\n        DB_PASSWORD: debug_toolbar\n        DB_HOST: 127.0.0.1\n        DB_PORT: 3306\n        COVERAGE_FILE: \".coverage.mysql.${{ matrix.python-version }}\"\n\n    - name: Store coverage file\n      uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f  # v7.0.0\n      with:\n        name: coverage-mysql-${{ matrix.python-version }}\n        path: .coverage.mysql.${{ matrix.python-version }}*\n        include-hidden-files: true\n\n\n  postgres:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      max-parallel: 5\n      matrix:\n        python-version: ['3.10', '3.11', '3.12', '3.13', '3.14']\n        database: [postgresql, postgis, psycopg3]\n        exclude:\n            - python-version: '3.13'\n              database: postgis\n            - python-version: '3.13'\n              database: postgresql\n            - python-version: '3.14'\n              database: postgis\n            - python-version: '3.14'\n              database: postgresql\n        # Add postgis3 to our matrix for modern Python versions\n        include:\n            - python-version: '3.13'\n              database: postgis3\n            - python-version: '3.13'\n              database: psycopg3\n              env:\n                DJANGO_SELENIUM_TESTS=true\n            - python-version: '3.14'\n              database: postgis3\n            - python-version: '3.14'\n              database: psycopg3\n              env:\n                DJANGO_SELENIUM_TESTS=true\n\n    services:\n      postgres:\n        image: postgis/postgis:17-3.5\n        env:\n          POSTGRES_DB: debug_toolbar\n          POSTGRES_USER: debug_toolbar\n          POSTGRES_PASSWORD: debug_toolbar\n        ports:\n        - 5432:5432\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd  # v6.0.2\n      with:\n        persist-credentials: false\n\n    - name: Set up Python ${{ matrix.python-version }}\n      uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405  # v6.2.0\n      with:\n        python-version: ${{ matrix.python-version }}\n        allow-prereleases: true\n\n    - name: Get pip cache dir\n      id: pip-cache\n      run: |\n        echo \"dir=$(pip cache dir)\" >> $GITHUB_OUTPUT\n\n    - name: Cache\n      uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306  # v5.0.3\n      with:\n        path: ${{ steps.pip-cache.outputs.dir }}\n        key:\n          ${{ matrix.python-version }}-v1-${{ hashFiles('**/pyproject.toml') }}-${{ hashFiles('**/tox.ini') }}\n        restore-keys: |\n          ${{ matrix.python-version }}-v1-\n        lookup-only: true\n\n    - name: Install gdal-bin (for postgis)\n      run: |\n        sudo apt-get -qq update\n        sudo apt-get -y install gdal-bin\n\n    - name: Install dependencies\n      run: |\n        python -m pip install --upgrade pip\n        python -m pip install --upgrade tox tox-gh-actions\n\n    - name: Test with tox\n      run: tox\n      env:\n        DB_BACKEND: ${{ matrix.database }}\n        DB_HOST: localhost\n        DB_PORT: 5432\n        DJANGO_SELENIUM_TESTS: ${{ matrix.env.DJANGO_SELENIUM_TESTS }}\n        COVERAGE_FILE: \".coverage.${{ matrix.database }}.${{ matrix.python-version }}\"\n\n    - name: Store coverage file\n      uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f  # v7.0.0\n      with:\n        name: coverage-${{ matrix.database }}-${{ matrix.python-version }}\n        path: .coverage.${{ matrix.database }}.${{ matrix.python-version }}*\n        include-hidden-files: true\n\n  sqlite:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      max-parallel: 5\n      matrix:\n        python-version: ['3.10', '3.11', '3.12', '3.13', '3.14']\n\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd  # v6.0.2\n      with:\n        persist-credentials: false\n\n    - name: Set up Python ${{ matrix.python-version }}\n      uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405  # v6.2.0\n      with:\n        python-version: ${{ matrix.python-version }}\n        allow-prereleases: true\n\n    - name: Get pip cache dir\n      id: pip-cache\n      run: |\n        echo \"dir=$(pip cache dir)\" >> $GITHUB_OUTPUT\n\n    - name: Cache\n      uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306  # v5.0.3\n      with:\n        path: ${{ steps.pip-cache.outputs.dir }}\n        key:\n          ${{ matrix.python-version }}-v1-${{ hashFiles('**/pyproject.toml') }}-${{ hashFiles('**/tox.ini') }}\n        restore-keys: |\n          ${{ matrix.python-version }}-v1-\n        lookup-only: true\n\n    - name: Install dependencies\n      run: |\n        python -m pip install --upgrade pip\n        python -m pip install --upgrade tox tox-gh-actions\n\n    - name: Test with tox\n      run: tox\n      env:\n        DB_BACKEND: sqlite3\n        DB_NAME: \":memory:\"\n        COVERAGE_FILE: \".coverage.sqlite.${{ matrix.python-version }}\"\n\n    - name: Store coverage file\n      uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f  # v7.0.0\n      with:\n        name: coverage-sqlite-${{ matrix.python-version }}\n        path: .coverage.sqlite.${{ matrix.python-version }}*\n        include-hidden-files: true\n\n  lint:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd  # v6.0.2\n      with:\n        persist-credentials: false\n\n    - name: Set up Python ${{ matrix.python-version }}\n      uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405  # v6.2.0\n      with:\n        python-version: '3.10'\n\n    - name: Get pip cache dir\n      id: pip-cache\n      run: |\n        echo \"dir=$(pip cache dir)\" >> $GITHUB_OUTPUT\n\n    - name: Cache\n      uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306  # v5.0.3\n      with:\n        path: ${{ steps.pip-cache.outputs.dir }}\n        key:\n          ${{ matrix.python-version }}-v1-${{ hashFiles('**/pyproject.toml') }}-${{ hashFiles('**/tox.ini') }}\n        restore-keys: |\n          ${{ matrix.python-version }}-v1-\n        lookup-only: true\n\n    - name: Install dependencies\n      run: |\n        python -m pip install --upgrade pip\n        python -m pip install --upgrade tox\n\n    - name: Test with tox\n      run: tox -e docs,packaging\n\n  coverage:\n    name: Coverage\n    runs-on: ubuntu-latest\n    needs:\n      - mysql\n      - postgres\n      - sqlite\n    permissions:\n      pull-requests: write\n      contents: write\n    steps:\n      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd  # v6.0.2\n        with:\n          # Persist the credentials because coverage_comment needs them too.\n          persist-credentials: true\n\n      - uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3  # v8.0.0\n        id: download\n        with:\n          pattern: coverage-*\n          merge-multiple: true\n\n      - name: Coverage comment\n        id: coverage_comment\n        uses: py-cov-action/python-coverage-comment-action@7188638f871f721a365d644f505d1ff3df20d683  # v3.40\n        with:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          MERGE_COVERAGE_FILES: true\n\n      - name: Store Pull Request comment to be posted\n        uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f  # v7.0.0\n        if: steps.coverage_comment.outputs.COMMENT_FILE_WRITTEN == 'true'\n        with:\n          name: python-coverage-comment-action\n          path: python-coverage-comment-action.txt\n"
  },
  {
    "path": ".github/workflows/zizmor.yml",
    "content": "name: GitHub Actions Security Analysis with zizmor 🌈\n\non:\n  push:\n    branches: [\"main\"]\n  pull_request:\n    branches: [\"**\"]\n\npermissions: {}\n\njobs:\n  zizmor:\n    name: Run zizmor 🌈\n    runs-on: ubuntu-latest\n    permissions:\n      security-events: write\n      contents: read # only needed for private repos\n      actions: read # only needed for private repos\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd  # v6.0.2\n        with:\n          persist-credentials: false\n\n      - name: Run zizmor 🌈\n        uses: zizmorcore/zizmor-action@71321a20a9ded102f6e9ce5718a2fcec2c4f70d8  # v0.5.2\n"
  },
  {
    "path": ".gitignore",
    "content": "*.pyc\n*.DS_Store\n*~\n.idea\nbuild\n.coverage*\ndist\ndjango_debug_toolbar.egg-info\ndocs/_build\nexample/db.sqlite3\nhtmlcov\n.tox\ngeckodriver.log\ncoverage.xml\nvenv\n.direnv/\n.envrc\n.venv\n.vscode\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "repos:\n-   repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v6.0.0\n    hooks:\n    -   id: check-toml\n    -   id: check-yaml\n    -   id: end-of-file-fixer\n    -   id: trailing-whitespace\n    -   id: mixed-line-ending\n    -   id: file-contents-sorter\n        files: docs/spelling_wordlist.txt\n-   repo: https://github.com/pycqa/doc8\n    rev: v2.0.0\n    hooks:\n    -   id: doc8\n-   repo: https://github.com/adamchainz/django-upgrade\n    rev: 1.30.0\n    hooks:\n    -   id: django-upgrade\n        args: [--target-version, \"4.2\"]\n-   repo: https://github.com/adamchainz/djade-pre-commit\n    rev: \"1.9.0\"\n    hooks:\n    -   id: djade\n        args: [--target-version, \"4.2\"]\n-   repo: https://github.com/pre-commit/pygrep-hooks\n    rev: v1.10.0\n    hooks:\n    -   id: rst-backticks\n    -   id: rst-directive-colons\n-   repo: https://github.com/biomejs/pre-commit\n    rev: v2.4.7\n    hooks:\n      - id: biome-check\n        verbose: true\n-   repo: https://github.com/astral-sh/ruff-pre-commit\n    rev: 'v0.15.6'\n    hooks:\n      - id: ruff\n        args: [--fix, --exit-non-zero-on-fix]\n      - id: ruff-format\n-   repo: https://github.com/tox-dev/pyproject-fmt\n    rev: v2.19.0\n    hooks:\n      - id: pyproject-fmt\n-   repo: https://github.com/abravalheri/validate-pyproject\n    rev: v0.25\n    hooks:\n      - id: validate-pyproject\n"
  },
  {
    "path": ".readthedocs.yaml",
    "content": "# .readthedocs.yaml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details\n\nversion: 2\n\nbuild:\n  os: ubuntu-24.04\n  tools:\n    python: \"3.13\"\n  jobs:\n    install:\n      - pip install -U pip\n      - pip install --group docs\n\nsphinx:\n  configuration: docs/conf.py\n"
  },
  {
    "path": ".tx/config",
    "content": "[main]\nhost     = https://www.transifex.com\nlang_map = sr@latin: sr_Latn\n\n[o:django-debug-toolbar:p:django-debug-toolbar:r:main]\nfile_filter            = debug_toolbar/locale/<lang>/LC_MESSAGES/django.po\nsource_file            = debug_toolbar/locale/en/LC_MESSAGES/django.po\nsource_lang            = en\nreplace_edited_strings = false\nkeep_translations      = false\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Django Debug Toolbar Code of Conduct\n\nThe django-debug-toolbar project utilizes the [Django Commons Code of Conduct](https://github.com/django-commons/membership/blob/main/CODE_OF_CONDUCT.md).\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to Django Debug Toolbar\n\nThis is a [Django Commons](https://github.com/django-commons/) project. By contributing you agree to abide by the [Contributor Code of Conduct](https://github.com/django-commons/membership/blob/main/CODE_OF_CONDUCT.md).\n\n## Documentation\n\nFor detailed contributing guidelines, please see our [Documentation](https://django-debug-toolbar.readthedocs.io/en/latest/contributing.html).\n\n## Additional Resources\n\nPlease see the [README](https://github.com/django-commons/membership/blob/main/README.md) for more help.\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) Rob Hudson and individual contributors.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    1. Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n\n    2. Redistributions in binary form must reproduce the above copyright\n       notice, this list of conditions and the following disclaimer in the\n       documentation and/or other materials provided with the distribution.\n\n    3. Neither the name of Django nor the names of its contributors may be used\n       to endorse or promote products derived from this software without\n       specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "Makefile",
    "content": ".PHONY: example test coverage translatable_strings update_translations help\n.DEFAULT_GOAL := help\n\nexample:  ## Run the example application\n\tpython example/manage.py migrate --noinput\n\t-DJANGO_SUPERUSER_PASSWORD=p python example/manage.py createsuperuser \\\n\t\t--noinput --username=\"$(USER)\" --email=\"$(USER)@mailinator.com\"\n\tpython example/manage.py runserver\n\nexample_async:\n\tpython example/manage.py migrate --noinput\n\t-DJANGO_SUPERUSER_PASSWORD=p python example/manage.py createsuperuser \\\n\t\t--noinput --username=\"$(USER)\" --email=\"$(USER)@mailinator.com\"\n\tdaphne example.asgi:application\n\nexample_test:  ## Run the test suite for the example application\n\tpython example/manage.py test example\n\ntest:  ## Run the test suite\n\tDJANGO_SETTINGS_MODULE=tests.settings \\\n\t\tpython -m django test $${TEST_ARGS:-tests}\n\ntest_selenium:  ## Run frontend tests written with Selenium\n\tDJANGO_SELENIUM_TESTS=true DJANGO_SETTINGS_MODULE=tests.settings \\\n\t\tpython -m django test $${TEST_ARGS:-tests}\n\ncoverage:  ## Run the test suite with coverage enabled\n\tpython --version\n\tDJANGO_SETTINGS_MODULE=tests.settings \\\n\t\tpython -b -W always -m coverage run -m django test -v2 $${TEST_ARGS:-tests}\n\tcoverage report\n\tcoverage html\n\tcoverage xml\n\ntranslatable_strings:  ## Update the English '.po' file\n\tcd debug_toolbar && python -m django makemessages -l en --no-obsolete\n\t@echo \"Please commit changes and run 'tx push -s' (or wait for Transifex to pick them)\"\n\nupdate_translations:  ## Download updated '.po' files from Transifex\n\ttx pull -a --minimum-perc=10\n\tcd debug_toolbar && python -m django compilemessages\n\n.PHONY: example/django-debug-toolbar.png\nexample/django-debug-toolbar.png: example/screenshot.py  ## Update the screenshot in 'README.rst'\n\tpython $< --browser firefox --headless -o $@\n\toptipng $@\n\nhelp:  ## Help message for targets\n\t@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) \\\n\t\t| awk 'BEGIN {FS = \":.*?## \"}; {printf \"\\033[36m%-30s\\033[0m %s\\n\", $$1, $$2}'\n"
  },
  {
    "path": "README.rst",
    "content": "=====================================\nDjango Debug Toolbar |latest-version|\n=====================================\n\n|build-status| |coverage| |docs| |python-support| |django-support|\n\n.. |latest-version| image:: https://img.shields.io/pypi/v/django-debug-toolbar.svg\n   :target: https://pypi.org/project/django-debug-toolbar/\n   :alt: Latest version on PyPI\n\n.. |build-status| image:: https://github.com/django-commons/django-debug-toolbar/workflows/Test/badge.svg\n   :target: https://github.com/django-commons/django-debug-toolbar/actions/workflows/test.yml\n   :alt: Build Status\n\n.. |coverage| image:: https://img.shields.io/badge/Coverage-94%25-green\n   :target: https://github.com/django-commons/django-debug-toolbar/actions/workflows/test.yml?query=branch%3Amain\n   :alt: Test coverage status\n\n.. |docs| image:: https://img.shields.io/readthedocs/django-debug-toolbar/latest.svg\n   :target: https://readthedocs.org/projects/django-debug-toolbar/\n   :alt: Documentation status\n\n.. |python-support| image:: https://img.shields.io/pypi/pyversions/django-debug-toolbar\n   :target: https://pypi.org/project/django-debug-toolbar/\n   :alt: Supported Python versions\n\n.. |django-support| image:: https://img.shields.io/pypi/djversions/django-debug-toolbar\n   :target: https://pypi.org/project/django-debug-toolbar/\n   :alt: Supported Django versions\n\nThe Django Debug Toolbar is a configurable set of panels that display various\ndebug information about the current request/response and when clicked, display\nmore details about the panel's content.\n\nHere's a screenshot of the toolbar in action:\n\n.. image:: https://raw.github.com/django-commons/django-debug-toolbar/main/example/django-debug-toolbar.png\n   :alt: Django Debug Toolbar screenshot\n\nIn addition to the built-in panels, a number of third-party panels are\ncontributed by the community.\n\nThe current stable version of the Debug Toolbar is 6.2.0. It works on\nDjango ≥ 4.2.0.\n\nThe Debug Toolbar has experimental support for `Django's asynchronous views\n<https://docs.djangoproject.com/en/dev/topics/async/>`_. Please note that\nthe Debug Toolbar still lacks the capability for handling concurrent requests.\nIf you find any issues, please report them on the `issue tracker`_.\n\nDocumentation, including installation and configuration instructions, is\navailable at https://django-debug-toolbar.readthedocs.io/.\n\nThe Django Debug Toolbar is released under the BSD license, like Django\nitself. If you like it, please consider contributing!\n\nThe Django Debug Toolbar was originally created by Rob Hudson <rob@cogit8.org>\nin August 2008 and was further developed by many contributors_.\n\n.. _contributors: https://github.com/django-commons/django-debug-toolbar/graphs/contributors\n.. _issue tracker: https://github.com/django-commons/django-debug-toolbar/issues\n"
  },
  {
    "path": "SECURITY.md",
    "content": "# Security Policy\n\n## Supported Versions\n\nOnly the latest version of django-debug-toolbar [![PyPI version](https://badge.fury.io/py/django-debug-toolbar.svg)](https://pypi.python.org/pypi/django-debug-toolbar) is supported.\n\n## Reporting a Vulnerability\n\nIf you think you have found a vulnerability, and even if you are not sure, please [report it to us in private](https://github.com/django-commons/django-debug-toolbar/security/advisories/new). We will review it and get back to you. Please refrain from public discussions of the issue.\n"
  },
  {
    "path": "biome.json",
    "content": "{\n    \"$schema\": \"https://biomejs.dev/schemas/2.3.7/schema.json\",\n    \"formatter\": {\n        \"enabled\": true,\n        \"useEditorconfig\": true\n    },\n    \"assist\": {\n        \"actions\": {\n            \"source\": {\n                \"organizeImports\": \"on\"\n            }\n        }\n    },\n    \"linter\": {\n        \"enabled\": true,\n        \"rules\": {\n            \"recommended\": true,\n            \"complexity\": {\n                \"noImportantStyles\": \"off\"\n            },\n            \"correctness\": {\n                \"noUndeclaredVariables\": \"error\"\n            },\n            \"suspicious\": {\n                \"noDocumentCookie\": \"off\"\n            }\n        }\n    },\n    \"javascript\": {\n        \"formatter\": {\n            \"trailingCommas\": \"es5\"\n        }\n    }\n}\n"
  },
  {
    "path": "debug_toolbar/__init__.py",
    "content": "__all__ = [\"APP_NAME\", \"VERSION\"]\n\nAPP_NAME = \"djdt\"\n\n# Do not use pkg_resources to find the version but set it here directly!\n# see issue #1446\nVERSION = \"6.2.0\"\n\n# Code that discovers files or modules in INSTALLED_APPS imports this module.\nurls = \"debug_toolbar.urls\", APP_NAME\n"
  },
  {
    "path": "debug_toolbar/_compat.py",
    "content": "import django\n\ntry:\n    from django.contrib.auth.decorators import login_not_required\nexcept ImportError:\n    # For Django < 5.1, copy the current Django implementation\n    def login_not_required(view_func):\n        \"\"\"\n        Decorator for views that allows access to unauthenticated requests.\n        \"\"\"\n        view_func.login_required = False\n        return view_func\n\n\nif django.VERSION >= (6, 0):\n    from django.middleware.csp import get_nonce\nelse:\n    # For Django < 6.0, there is no native CSP support, hence no CSP nonces.\n    def get_nonce(request):\n        return None\n"
  },
  {
    "path": "debug_toolbar/_stubs.py",
    "content": "from __future__ import annotations\n\nfrom typing import Any, NamedTuple, Protocol\n\nfrom django import template as dj_template\nfrom django.http import HttpRequest, HttpResponse\n\n\nclass InspectStack(NamedTuple):\n    frame: Any\n    filename: str\n    lineno: int\n    function: str\n    code_context: str\n    index: int\n\n\nTidyStackTrace = list[tuple[str, int, str, str, Any | None]]\n\n\nclass RenderContext(dj_template.context.RenderContext):\n    template: dj_template.Template\n\n\nclass RequestContext(dj_template.RequestContext):\n    template: dj_template.Template\n    render_context: RenderContext\n\n\nclass GetResponse(Protocol):\n    def __call__(self, request: HttpRequest) -> HttpResponse: ...\n"
  },
  {
    "path": "debug_toolbar/apps.py",
    "content": "import inspect\nimport mimetypes\n\nfrom django.apps import AppConfig\nfrom django.conf import settings\nfrom django.core.checks import Error, Warning, register\nfrom django.middleware.gzip import GZipMiddleware\nfrom django.urls import NoReverseMatch, reverse\nfrom django.utils.module_loading import import_string\nfrom django.utils.translation import gettext_lazy as _\n\nfrom debug_toolbar import APP_NAME, settings as dt_settings\nfrom debug_toolbar.settings import CONFIG_DEFAULTS\n\n\nclass DebugToolbarConfig(AppConfig):\n    name = \"debug_toolbar\"\n    verbose_name = _(\"Debug Toolbar\")\n\n    def ready(self):\n        from debug_toolbar.toolbar import DebugToolbar\n\n        # Import the panels when the app is ready and call their ready() methods.  This\n        # allows panels like CachePanel to enable their instrumentation immediately.\n        for cls in DebugToolbar.get_panel_classes():\n            cls.ready()\n        _manage_migrations_visibility(self.name)\n\n    def import_models(self):\n        \"\"\"\n        Override import models to avoid allowing users to dynamically fetch a model\n        that doesn't have a table behind it unless they are using the DatabaseStore.\n        This also prevents the command `migrate --run-syncdb` from creating tables\n        for the models.\n        \"\"\"\n        dt_config = dt_settings.get_config()\n        if dt_config[\"TOOLBAR_STORE_CLASS\"] == \"debug_toolbar.store.DatabaseStore\":\n            return super().import_models()\n        # Not using the database store, don't import the models\n        self.models = {}\n\n\ndef _manage_migrations_visibility(app_name):\n    \"\"\"\n    Adjust the toolbar's migration visibility by manipulating the\n    project's settings.\n\n    This is a hack since it's manipulating settings.\n    \"\"\"\n    if (\n        dt_settings.get_config()[\"TOOLBAR_STORE_CLASS\"]\n        != \"debug_toolbar.store.DatabaseStore\"\n    ):\n        # This effectively hides the migrations by telling Django they don't exist.\n        settings.MIGRATION_MODULES.setdefault(app_name, None)\n\n\ndef check_template_config(config):\n    \"\"\"\n    Checks if a template configuration is valid.\n\n    The toolbar requires either the toolbars to be unspecified or\n    ``django.template.loaders.app_directories.Loader`` to be\n    included in the loaders.\n    If custom loaders are specified, then APP_DIRS must be True.\n    \"\"\"\n\n    def flat_loaders(loaders):\n        \"\"\"\n        Recursively flatten the settings list of template loaders.\n\n        Check for (loader, [child_loaders]) tuples.\n        Django's default cached loader uses this pattern.\n        \"\"\"\n        for loader in loaders:\n            if isinstance(loader, tuple):\n                yield loader[0]\n                yield from flat_loaders(loader[1])\n            else:\n                yield loader\n\n    app_dirs = config.get(\"APP_DIRS\", False)\n    loaders = config.get(\"OPTIONS\", {}).get(\"loaders\", None)\n    if loaders:\n        loaders = list(flat_loaders(loaders))\n\n    # By default the app loader is included.\n    has_app_loaders = (\n        loaders is None or \"django.template.loaders.app_directories.Loader\" in loaders\n    )\n    return has_app_loaders or app_dirs\n\n\n@register\ndef check_middleware(app_configs, **kwargs):\n    from debug_toolbar.middleware import DebugToolbarMiddleware\n\n    errors = []\n    gzip_index = None\n    debug_toolbar_indexes = []\n\n    if all(not check_template_config(config) for config in settings.TEMPLATES):\n        errors.append(\n            Warning(\n                \"At least one DjangoTemplates TEMPLATES configuration needs \"\n                \"to use django.template.loaders.app_directories.Loader or \"\n                \"have APP_DIRS set to True.\",\n                hint=(\n                    \"Include django.template.loaders.app_directories.Loader \"\n                    'in [\"OPTIONS\"][\"loaders\"]. Alternatively use '\n                    \"APP_DIRS=True for at least one \"\n                    \"django.template.backends.django.DjangoTemplates \"\n                    \"backend configuration.\"\n                ),\n                id=\"debug_toolbar.W006\",\n            )\n        )\n\n    # If old style MIDDLEWARE_CLASSES is being used, report an error.\n    if settings.is_overridden(\"MIDDLEWARE_CLASSES\"):\n        errors.append(\n            Warning(\n                \"debug_toolbar is incompatible with MIDDLEWARE_CLASSES setting.\",\n                hint=\"Use MIDDLEWARE instead of MIDDLEWARE_CLASSES\",\n                id=\"debug_toolbar.W004\",\n            )\n        )\n        return errors\n\n    # Determine the indexes which gzip and/or the toolbar are installed at\n    for i, middleware in enumerate(settings.MIDDLEWARE):\n        if is_middleware_class(GZipMiddleware, middleware):\n            gzip_index = i\n        elif is_middleware_class(DebugToolbarMiddleware, middleware):\n            debug_toolbar_indexes.append(i)\n\n    if not debug_toolbar_indexes:\n        # If the toolbar does not appear, report an error.\n        errors.append(\n            Warning(\n                \"debug_toolbar.middleware.DebugToolbarMiddleware is missing \"\n                \"from MIDDLEWARE.\",\n                hint=\"Add debug_toolbar.middleware.DebugToolbarMiddleware to \"\n                \"MIDDLEWARE.\",\n                id=\"debug_toolbar.W001\",\n            )\n        )\n    elif len(debug_toolbar_indexes) != 1:\n        # If the toolbar appears multiple times, report an error.\n        errors.append(\n            Warning(\n                \"debug_toolbar.middleware.DebugToolbarMiddleware occurs \"\n                \"multiple times in MIDDLEWARE.\",\n                hint=\"Load debug_toolbar.middleware.DebugToolbarMiddleware only \"\n                \"once in MIDDLEWARE.\",\n                id=\"debug_toolbar.W002\",\n            )\n        )\n    elif gzip_index is not None and debug_toolbar_indexes[0] < gzip_index:\n        # If the toolbar appears before the gzip index, report an error.\n        errors.append(\n            Warning(\n                \"debug_toolbar.middleware.DebugToolbarMiddleware occurs before \"\n                \"django.middleware.gzip.GZipMiddleware in MIDDLEWARE.\",\n                hint=\"Move debug_toolbar.middleware.DebugToolbarMiddleware to \"\n                \"after django.middleware.gzip.GZipMiddleware in MIDDLEWARE.\",\n                id=\"debug_toolbar.W003\",\n            )\n        )\n    return errors\n\n\n@register\ndef check_panel_configs(app_configs, **kwargs):\n    \"\"\"Allow each panel to check the toolbar's integration for their its own purposes.\"\"\"\n    from debug_toolbar.toolbar import DebugToolbar\n\n    errors = []\n    for panel_class in DebugToolbar.get_panel_classes():\n        for check_message in panel_class.run_checks():\n            errors.append(check_message)\n    return errors\n\n\ndef is_middleware_class(middleware_class, middleware_path):\n    try:\n        middleware_cls = import_string(middleware_path)\n    except ImportError:\n        return\n    return inspect.isclass(middleware_cls) and issubclass(\n        middleware_cls, middleware_class\n    )\n\n\n@register\ndef check_panels(app_configs, **kwargs):\n    errors = []\n    panels = dt_settings.get_panels()\n    if not panels:\n        errors.append(\n            Warning(\n                \"Setting DEBUG_TOOLBAR_PANELS is empty.\",\n                hint=\"Set DEBUG_TOOLBAR_PANELS to a non-empty list in your \"\n                \"settings.py.\",\n                id=\"debug_toolbar.W005\",\n            )\n        )\n    return errors\n\n\n@register\ndef js_mimetype_check(app_configs, **kwargs):\n    \"\"\"\n    Check that JavaScript files are resolving to the correct content type.\n    \"\"\"\n    # Ideally application/javascript is returned, but text/javascript is\n    # acceptable.\n    javascript_types = {\"application/javascript\", \"text/javascript\"}\n    check_failed = not set(mimetypes.guess_type(\"toolbar.js\")).intersection(\n        javascript_types\n    )\n    if check_failed:\n        return [\n            Warning(\n                \"JavaScript files are resolving to the wrong content type.\",\n                hint=\"The Django Debug Toolbar may not load properly while mimetypes are misconfigured. \"\n                \"See the Django documentation for an explanation of why this occurs.\\n\"\n                \"https://docs.djangoproject.com/en/stable/ref/contrib/staticfiles/#static-file-development-view\\n\"\n                \"\\n\"\n                \"This typically occurs on Windows machines. The suggested solution is to modify \"\n                \"HKEY_CLASSES_ROOT in the registry to specify the content type for JavaScript \"\n                \"files.\\n\"\n                \"\\n\"\n                \"[HKEY_CLASSES_ROOT\\\\.js]\\n\"\n                '\"Content Type\"=\"application/javascript\"',\n                id=\"debug_toolbar.W007\",\n            )\n        ]\n    return []\n\n\n@register\ndef debug_toolbar_installed_when_running_tests_check(app_configs, **kwargs):\n    \"\"\"\n    Check that the toolbar is not being used when tests are running\n    \"\"\"\n    # Check if show toolbar callback has changed\n    show_toolbar_changed = (\n        dt_settings.get_config()[\"SHOW_TOOLBAR_CALLBACK\"]\n        != CONFIG_DEFAULTS[\"SHOW_TOOLBAR_CALLBACK\"]\n    )\n    try:\n        # Check if the toolbar's urls are installed\n        reverse(f\"{APP_NAME}:render_panel\")\n        toolbar_urls_installed = True\n    except NoReverseMatch:\n        toolbar_urls_installed = False\n\n    # If the user is using the default SHOW_TOOLBAR_CALLBACK,\n    # then the middleware will respect the change to settings.DEBUG.\n    # However, if the user has changed the callback to:\n    # DEBUG_TOOLBAR_CONFIG = {\"SHOW_TOOLBAR_CALLBACK\": lambda request: DEBUG}\n    # where DEBUG is not settings.DEBUG, then it won't pick up that Django'\n    # test runner has changed the value for settings.DEBUG, and the middleware\n    # will inject the toolbar, while the URLs aren't configured leading to a\n    # NoReverseMatch error.\n    likely_error_setup = show_toolbar_changed and not toolbar_urls_installed\n\n    if (\n        not settings.DEBUG\n        and dt_settings.get_config()[\"IS_RUNNING_TESTS\"]\n        and likely_error_setup\n    ):\n        return [\n            Error(\n                \"The Django Debug Toolbar can't be used with tests\",\n                hint=\"Django changes the DEBUG setting to False when running \"\n                \"tests. By default the Django Debug Toolbar is installed because \"\n                \"DEBUG is set to True. For most cases, you need to avoid installing \"\n                \"the toolbar when running tests. If you feel this check is in error, \"\n                \"you can set `DEBUG_TOOLBAR_CONFIG['IS_RUNNING_TESTS'] = False` to \"\n                \"bypass this check.\",\n                id=\"debug_toolbar.E001\",\n            )\n        ]\n    else:\n        return []\n\n\n@register\ndef check_settings(app_configs, **kwargs):\n    errors = []\n    USER_CONFIG = getattr(settings, \"DEBUG_TOOLBAR_CONFIG\", {})\n    if \"OBSERVE_REQUEST_CALLBACK\" in USER_CONFIG:\n        errors.append(\n            Warning(\n                \"The deprecated OBSERVE_REQUEST_CALLBACK setting is present in DEBUG_TOOLBAR_CONFIG.\",\n                hint=\"Use the UPDATE_ON_FETCH and/or SHOW_TOOLBAR_CALLBACK settings instead.\",\n                id=\"debug_toolbar.W008\",\n            )\n        )\n    return errors\n"
  },
  {
    "path": "debug_toolbar/decorators.py",
    "content": "import functools\n\nfrom asgiref.sync import iscoroutinefunction\nfrom django.http import Http404\nfrom django.utils.translation import get_language, override as language_override\n\nfrom debug_toolbar import settings as dt_settings\n\n\ndef require_show_toolbar(view):\n    \"\"\"\n    Async compatible decorator to restrict access to a view\n    based on the Debug Toolbar's visibility settings.\n    \"\"\"\n    from debug_toolbar.middleware import get_show_toolbar\n\n    if iscoroutinefunction(view):\n\n        @functools.wraps(view)\n        async def inner(request, *args, **kwargs):\n            show_toolbar = get_show_toolbar(async_mode=True)\n            if not await show_toolbar(request):\n                raise Http404\n\n            return await view(request, *args, **kwargs)\n    else:\n\n        @functools.wraps(view)\n        def inner(request, *args, **kwargs):\n            show_toolbar = get_show_toolbar(async_mode=False)\n            if not show_toolbar(request):\n                raise Http404\n\n            return view(request, *args, **kwargs)\n\n    return inner\n\n\ndef render_with_toolbar_language(view):\n    \"\"\"Force any rendering within the view to use the toolbar's language.\"\"\"\n\n    @functools.wraps(view)\n    def inner(request, *args, **kwargs):\n        lang = dt_settings.get_config()[\"TOOLBAR_LANGUAGE\"] or get_language()\n        with language_override(lang):\n            return view(request, *args, **kwargs)\n\n    return inner\n"
  },
  {
    "path": "debug_toolbar/forms.py",
    "content": "import json\n\nfrom django import forms\nfrom django.core import signing\nfrom django.core.exceptions import ValidationError\n\nfrom debug_toolbar.sanitize import force_str\n\n\nclass SignedDataForm(forms.Form):\n    \"\"\"Helper form that wraps a form to validate its contents on post.\n\n    class PanelForm(forms.Form):\n        # fields\n\n    On render:\n        form = SignedDataForm(initial=PanelForm(initial=data).initial)\n\n    On POST:\n        signed_form = SignedDataForm(request.POST)\n        if signed_form.is_valid():\n            panel_form = PanelForm(signed_form.verified_data)\n            if panel_form.is_valid():\n                # Success\n    \"\"\"\n\n    salt = \"django_debug_toolbar\"\n    signed = forms.CharField(required=True, widget=forms.HiddenInput)\n\n    def __init__(self, *args, **kwargs):\n        initial = kwargs.pop(\"initial\", None)\n        if initial:\n            initial = {\"signed\": self.sign(initial)}\n        super().__init__(*args, initial=initial, **kwargs)\n\n    def clean_signed(self):\n        try:\n            verified = json.loads(\n                signing.Signer(salt=self.salt).unsign(self.cleaned_data[\"signed\"])\n            )\n            return verified\n        except signing.BadSignature as exc:\n            raise ValidationError(\"Bad signature\") from exc\n\n    def verified_data(self):\n        return self.is_valid() and self.cleaned_data[\"signed\"]\n\n    @classmethod\n    def sign(cls, data):\n        return signing.Signer(salt=cls.salt).sign(\n            json.dumps({key: force_str(value) for key, value in data.items()})\n        )\n"
  },
  {
    "path": "debug_toolbar/locale/bg/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# arneatec <arneatec@gmail.com>, 2022\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: arneatec <arneatec@gmail.com>, 2022\\n\"\n\"Language-Team: Bulgarian (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/bg/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: bg\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"Debug Toolbar\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Кеш\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(cache_calls)d извикване за %(time).2fms\"\nmsgstr[1] \"%(cache_calls)d извиквания за %(time).2fms\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"Извиквания на кеша от %(count)d бекенд\"\nmsgstr[1] \"Извиквания на кеша от %(count)d бекенда\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"Хедъри\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"История\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"Профилиране\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"Прехвани пренасочвания\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"Заявка\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"<no view>\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<unavailable>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Настройки\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"Настройки от %s\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"%(num_receivers)d получател на 1 сигнал\"\nmsgstr[1] \"%(num_receivers)d получатели на 1 сигнал\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_receivers)d приемник на %(num_signals)d сигнала\"\nmsgstr[1] \"%(num_receivers)d приемника на %(num_signals)d сигнала\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Сигнали\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"Read uncommitted\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"Read committed\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"Repeatable read\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"Serializable\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"Autocommit\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"Незает\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Активен\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"В транзакция\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"В грешка\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"Непознато\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"%(query_count)d заявка за %(sql_time).2fms\"\nmsgstr[1] \"%(query_count)d заявки за %(sql_time).2fms\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"SQL заявки от %(count)d връзка\"\nmsgstr[1] \"SQL заявки от %(count)d връзки\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"Статични файлове (%(num_found)s открити, %(num_used)s използвани)\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"Статични файлове\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"%(num_used)s файл използван\"\nmsgstr[1] \"%(num_used)s файла са използвани\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Шаблони\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Шаблони (%(num_templates)s рендерирани)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"Няма произход\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"Процесор: %(cum)0.2fms (%(total)0.2fms)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Общо: %0.2fms\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Време\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"Потребителско процесорно време \"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"%(utime)0.3f ms\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"Системно процесорно време\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"%(stime)0.3f ms\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"Общо процесорно време\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"%(total)0.3f ms\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Изминало време\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"%(total_time)0.3f ms\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"Контекстни превключвания\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"%(vcsw)d волеви, %(ivcsw)d неволеви\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Версии\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"Скрий лента с инструменти \"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Скрий\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"Покажи лента с инструменти\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"Деактивирай за следващо и всички последващи заявки\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"Активирай за следващо и всички последващи заявки\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Обобщение\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"Общо извиквания\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"Общо време\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"Кеш успехи\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"Кеш неуспехи\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"Команди\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"Извиквания\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Вид\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"Аргументи\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"Аргументи с ключови думи\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"Бекенд\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"Хедъри на заявката\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Ключ\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Стойност\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"Хедъри на отговора\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"WSGI environ\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"Понеже WSGI environ наследява средата на сървъра, е показана само важната част от него по-долу.\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"Метод\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"Път\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"Променливи на зявката\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"Състояние\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Действие\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Променлива\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Извикване\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"КумулативноВреме\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"За\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"ОбщоВреме\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Брой\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"Информация за изгледа\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"Функция на изгледа\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"Име на URL\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"Бисквитки\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"Няма бисквитки\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"Данни на сесията\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"Няма данни от сесията\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"GET данни\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Няма GET данни\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"POST данни\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Няма POST данни\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Настройка\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Сигнал\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Получатели\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)s заявка\"\nmsgstr[1] \"%(num)s заявки\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"Включва <abbr title=\\\"Similar queries are queries with the same SQL, but potentially different parameters.\\\">%(count)s подобни</abbr>\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"и <abbr title=\\\"Duplicate queries are identical to each other: they execute exactly the same SQL and parameters.\\\">%(dupes)s повторени</abbr>\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Заявка\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Във времето\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"%(count)s подобни заявки.\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"Повторени %(dupes)s пъти.\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Връзка:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"Изолационно ниво:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Статус на транзакцията:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(неясен)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"Не са записани никакви SQL заявки по време на тази заявка.\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"SQL разяснен\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"Изпълнен SQL\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"База данни\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"SQL профилиран\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Грешка\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"Избран SQL\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Празно множество\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"Път към статичен файл\"\nmsgstr[1] \"Пътища към статични файлове\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"(префикс %(prefix)s)\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"None\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"Приложение статичен файл\"\nmsgstr[1] \"Приложения статично файлове\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"Статичен файл\"\nmsgstr[1] \"Статични файлове\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"%(payload_count)s файл\"\nmsgstr[1] \"%(payload_count)s файла\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Местоположение\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"Произход на шаблона:\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"Път към шаблон\"\nmsgstr[1] \"Пътища към шаблони\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"Шаблон\"\nmsgstr[1] \"Шаблони\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"Превключи контекста\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"Контекстен процесор\"\nmsgstr[1] \"Контекстни процесори\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"Използване на ресурси\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"Време в браузъра\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"Атрибут на измерването\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"Време от началото на навигацията (+продължителност)\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"Пакет\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Име\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Версия\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"Местоположение:\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"Django Debug Toolbar прехвана пренасочване към горния URL с цел преглед за отстраняване на грешки /дебъг/. Можете да кликнете върху връзката по-горе, за да продължите с пренасочването по нормалния начин.\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"Данните за този панел вече не са налични. Моля, презаредете страницата и опитайте отново. \"\n"
  },
  {
    "path": "debug_toolbar/locale/ca/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# el_libre como el chaval <el.libre@gmail.com>, 2013\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: el_libre como el chaval <el.libre@gmail.com>, 2013\\n\"\n\"Language-Team: Catalan (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/ca/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: ca\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Caxè\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"Encapçalaments\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"Demanar\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Configuració\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Senyals\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"Seriable\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Actiu\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"En transacció\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"Desconegut\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Plantilles\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Total: %0.2fms\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Hora\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Temps emprat\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Versions\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"Amagar barra d'eina\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Amagar\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"Mostrar barra d'eines\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Resum\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"Total crides\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"Total temps\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"Comandes\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"Crides\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Tipus\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"Administració\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Clau\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Valor\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Acció\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Variable\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Cridar\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"Per\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"TempsTotal\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Recomptar\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"Veure informació\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Sense dades GET\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Sense dades POST\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Configuració\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Senyal\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Destinataris\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Petició\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Línia temporal\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Connexió:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(desconegut)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"SQL Executat\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"Base de dades\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Error\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"Cap\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Ubicació\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"\"\nmsgstr[1] \"Plantilles\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Font\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Nom\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Versió\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"Ubicació:\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"\"\n"
  },
  {
    "path": "debug_toolbar/locale/cs/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Josef Kolář <mail@josefkolar.cz>, 2020\n# kuboja, 2024\n# Vláďa Macek <macek@sandbox.cz>, 2013-2014\n# Vláďa Macek <macek@sandbox.cz>, 2015,2021\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: kuboja, 2024\\n\"\n\"Language-Team: Czech (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/cs/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: cs\\n\"\n\"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"Debug Toolbar\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Mezipaměť\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(cache_calls)d volání během %(time).2fms\"\nmsgstr[1] \"%(cache_calls)d volání během %(time).2fms\"\nmsgstr[2] \"%(cache_calls)d volání během %(time).2fms\"\nmsgstr[3] \"%(cache_calls)d volání během %(time).2fms\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"Volání mezipaměti z %(count)d backendu\"\nmsgstr[1] \"Volání mezipaměti z %(count)d backendů\"\nmsgstr[2] \"Volání mezipaměti z %(count)d backendů\"\nmsgstr[3] \"Volání mezipaměti z %(count)d backendů\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"Hlavičky\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"Historie\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"Profilování\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"Zachycení přesměrování\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"Požadavek\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"<žádný pohled>\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<není k dispozici>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Nastavení\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"%(num_receivers)d příjemce 1 signálu\"\nmsgstr[1] \"%(num_receivers)d příjemci 1 signálu\"\nmsgstr[2] \"%(num_receivers)d příjemců 1 signálu\"\nmsgstr[3] \"%(num_receivers)d příjemců 1 signálu\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_receivers)d příjemce %(num_signals)d signálů\"\nmsgstr[1] \"%(num_receivers)d příjemci %(num_signals)d signálů\"\nmsgstr[2] \"%(num_receivers)d příjemců %(num_signals)d signálů\"\nmsgstr[3] \"%(num_receivers)d příjemců %(num_signals)d signálů\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Signály\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"Read uncommitted\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"Read committed\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"Repeatable read\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"Serializable\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"Autocommit\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"V klidu (idle)\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Aktivní\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"Uvnitř transakce\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"V chybovém stavu\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"Neznámé\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"%(query_count)ddotaz během %(sql_time).2f ms\"\nmsgstr[1] \"%(query_count)d dotazy během %(sql_time).2f ms\"\nmsgstr[2] \"%(query_count)d dotazů během %(sql_time).2f ms\"\nmsgstr[3] \"%(query_count)d dotazů během %(sql_time).2f ms\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"SQL dotazy z %(count)d spojení\"\nmsgstr[1] \"SQL dotazy ze %(count)d spojení\"\nmsgstr[2] \"SQL dotazy z %(count)d spojení\"\nmsgstr[3] \"SQL dotazy z %(count)d spojení\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"Statické soubory (nalezeno: %(num_found)s, použito: %(num_used)s)\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"Statické soubory\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"%(num_used)s soubor použit\"\nmsgstr[1] \"%(num_used)s soubory použity\"\nmsgstr[2] \"%(num_used)s souborů použito\"\nmsgstr[3] \"%(num_used)s souborů použito\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Šablony\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Šablony (renderovaných: %(num_templates)s)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"Zdroj chybí\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Celkem: %0.2fms\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Čas\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"Uživatelský čas CPU\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"%(utime)0.3f ms\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"Systémový čas CPU\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"%(stime)0.3f ms\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"Celkový čas CPU\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"%(total)0.3f ms\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Uplynulý čas\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"%(total_time)0.3f ms\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"Přepnutí kontextu\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"%(vcsw)d dobrovolně, %(ivcsw)d nedobrovolně\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Verze\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"Skrýt lištu\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Skrýt\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"Zobrazit lištu\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"Vypnout pro následné požadavky\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"Zapnout pro následné požadavky\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Souhrn\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"Celkem volání\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"Celkový čas\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"Nalezení v mezipaměti\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"Nebylo v mezipaměti\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"Příkazy\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"Volání\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Typ\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"Argumenty\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"Klíčované argumenty\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"Backend\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"Záhlaví požadavku\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Klíč\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Hodnota\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"Záhlaví odezvy\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"Prostředí WSGI\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"Níže je zobrazena pouze podstatná část proměnných prostředí, protože WSGI je dědí od serveru.\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"Metoda\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"Cesta\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"Proměnné požadavku\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"Stav\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Akce\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Proměnná\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Volání\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"KumulČas\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"Celk. za volání\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"CelkČas\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Počet\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"Informace o pohledových funkcích\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"Pohledová funkce\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"Název URL\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"Soubory cookie\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"Žádné soubory cookie\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"Data sezení\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"Žádná data sezení\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"Data typu GET\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Žádná data typu GET\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"Data typu POST\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Žádná data typu POST\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Nastavení\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Signál\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Příjemci\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)s dotaz\"\nmsgstr[1] \"%(num)s dotazy\"\nmsgstr[2] \"%(num)s dotazů\"\nmsgstr[3] \"%(num)s dotazů\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"včetně <abbr title=\\\"Podobné dotazy jsou dotazy se stejným SQL, ale potenciálně odlišnými parametry.\\\">%(count)s podobných</abbr>\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"a <abbr title=\\\"Duplicitní dotazy jsou navzájem identické: provádějí přesně stejné SQL a parametry.\\\">%(dupes)s duplicitních</abbr>\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Dotaz\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Časová osa\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"%(count)s podobných dotazů.\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Spojení:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"Úroveň izolace:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Stav transakce:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(neznámé)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"Pro tento požadavek nebyl zaznamenán žádný dotaz SQL.\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"Vysvětlené SQL\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"Spuštěné SQL\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"Databáze\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"Profilované SQL\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Chyba\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"Vybrané SQL\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Prázdná sada\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"Cesta ke statickým souborům\"\nmsgstr[1] \"Cesty ke statickým souborům\"\nmsgstr[2] \"Cesty ke statickým souborům\"\nmsgstr[3] \"Cesty ke statickým souborům\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"(prefix %(prefix)s)\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"Žádné\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"Aplikace se statickými soubory\"\nmsgstr[1] \"Aplikace se statickými soubory\"\nmsgstr[2] \"Aplikace se statickými soubory\"\nmsgstr[3] \"Aplikace se statickými soubory\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"Statický soubor\"\nmsgstr[1] \"Statické soubory\"\nmsgstr[2] \"Statické soubory\"\nmsgstr[3] \"Statické soubory\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"%(payload_count)s soubor\"\nmsgstr[1] \"%(payload_count)s soubory\"\nmsgstr[2] \"%(payload_count)s souborů\"\nmsgstr[3] \"%(payload_count)s souborů\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Adresa\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"Zdroj šablony:\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"Cesta k šabloně\"\nmsgstr[1] \"Cesty k šablonám\"\nmsgstr[2] \"Cesty k šablonám\"\nmsgstr[3] \"Cesty k šablonám\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"Šablona\"\nmsgstr[1] \"Šablony\"\nmsgstr[2] \"Šablony\"\nmsgstr[3] \"Šablony\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"Zap./vyp. kontext\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"Procesor kontextu\"\nmsgstr[1] \"Procesory kontextu\"\nmsgstr[2] \"Procesory kontextu\"\nmsgstr[3] \"Procesory kontextu\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"Využití zdrojů\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Prostředek\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"Časování prohlížeče\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"Atribut\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"Čas od začátku navigace (+trvání)\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"Balíček\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Název\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Verze\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"Adresa:\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"Aplikace Django Debug Toolbar zachytila přesměrování na výše uvedenou adresu URL za účelem ladicího zobrazení. Chcete-li přesměrování dokončit, klepněte na odkaz výše.\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"Data pro tento panel již nejsou k dispozici. Obnovte stránku a zkuste to znova.\"\n"
  },
  {
    "path": "debug_toolbar/locale/de/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Jannis Leidel <jannis@leidel.info>, 2012-2014,2021\n# Matthias Kestenholz <mk@feinheit.ch>, 2021\n# Tim Schilling, 2021\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Tim Schilling, 2021\\n\"\n\"Language-Team: German (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/de/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: de\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"Debug Toolbar\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(cache_calls)d Abfrage in %(time).2fms\"\nmsgstr[1] \"%(cache_calls)d Abfragen in %(time).2fms\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"Cache-Aufrufe von %(count)d Backend\"\nmsgstr[1] \"Cache-Aufrufe von %(count)d Backends\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"Header\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"Geschichte\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"Profiling\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"Umleitungen abfangen\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"Anfrage\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"<kein View>\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<nicht verfügbar>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Einstellungen\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"Einstellungen von %s\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"%(num_receivers)d Empfänger von einem Signal\"\nmsgstr[1] \"%(num_receivers)d Empfänger von einem Signal\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_receivers)d Empfänger von %(num_signals)d Signalen\"\nmsgstr[1] \"%(num_receivers)d Empfänger von %(num_signals)d Signalen\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Signale\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"Read uncommitted\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"Read committed\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"Repeatable read\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"Serializable\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"Autocommit\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"Wartet\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Aktiv\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"In einer Transaktion\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"Fehler\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"Unbekannt\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"%(query_count)d Abfrage in %(sql_time).2f ms\"\nmsgstr[1] \"%(query_count)d Abfragen in %(sql_time).2f ms\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"SQL-Abfragen von %(count)d Verbindung\"\nmsgstr[1] \"SQL-Abfragen von %(count)d Verbindungen\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"Statische Dateien (%(num_found)s gefunden, %(num_used)s benutzt)\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"Statische Dateien\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"%(num_used)s Datei benutzt\"\nmsgstr[1] \"%(num_used)s Dateien benutzt\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Templates\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Templates (%(num_templates)s gerendert)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"Kein Ursprung\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Gesamt: %0.2fms\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Zeit\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"CPU-Zeit Benutzer\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"%(utime)0.3f ms\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"CPU-Zeit System\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"%(stime)0.3f ms\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"CPU-Zeit gesamt\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"%(total)0.3f ms\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Verstrichene Zeit\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"%(total_time)0.3f ms\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"Kontextwechsel\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"%(vcsw)d freiwillig, %(ivcsw)d unfreiwillig\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Versionen\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"Toolbar ausblenden\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Ausblenden\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"Toolbar einblenden\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"Für nächste und die darauffolgenden Anfragen deaktivieren\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"Für nächste und die darauffolgenden Anfragen aktivieren\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Zusammenfassung\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"Aufrufe gesamt\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"Zeit gesamt\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"Cache erfolgreich\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"Cache verfehlt\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"Befehle\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"Aufrufe\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Typ\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"Argumente\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"Schlüsselwort-Argumente\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"Backend\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"Anfrage-Header\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Schlüssel\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Wert\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"Antwort-Header\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"WSGI-Umgebung\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"Da sich die WSGI-Umgebung von der Umgebung des Servers ableitet, wird nur eine notwendige Teilmenge dargestellt.\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"Methode\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"Pfad\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"Anfrage-Variablen\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"Status\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Aktion\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Variable\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Aufruf\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"Gesamt\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"Per\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"Total\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Anzahl\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"View-Informationen\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"View-Funktion\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"URL-Name\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"Cookies\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"Keine Cookies\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"Sitzungsdaten\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"Keine Sitzungsdaten\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"GET-Daten\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Keine GET-Daten\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"POST-Daten\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Keine POST-Daten\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Einstellung\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Signal\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Empfänger\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)s Abfrage\"\nmsgstr[1] \"%(num)s Abfragen\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"inklusive <abbr title=\\\"Similar queries are queries with the same SQL, but potentially different parameters.\\\">%(count)s ähnlich</abbr>\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"und <abbr title=\\\"Duplicate queries are identical to each other: they execute exactly the same SQL and parameters.\\\">%(dupes)s dupliziert</abbr>\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Abfrage\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Verlauf\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"%(count)s ähnliche Abfragen.\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"%(dupes)s-mal dupliziert.\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Verbindung:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"Isolationsebene:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Transaktionsstatus:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(unbekannt)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"Es wurde keine SQL-Abfrage während dieses Vorgangs aufgezeichnet.\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"SQL erklärt\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"Ausgeführtes SQL\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"Datenbank\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"SQL durchleuchtet\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Fehler\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"SQL ausgewählt\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Leeres Set\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"Pfad mit statischen Dateien\"\nmsgstr[1] \"Pfade mit statischen Dateien\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"(Präfix %(prefix)s)\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"-\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"App mit statischen Dateien\"\nmsgstr[1] \"Apps mit statischen Dateien\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"Statische Datei\"\nmsgstr[1] \"Statische Dateien\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"%(payload_count)s Datei\"\nmsgstr[1] \"%(payload_count)s Dateien\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Ort\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"Template-Quelle:\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"Template-Pfad\"\nmsgstr[1] \"Template-Pfade\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"Template\"\nmsgstr[1] \"Templates\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"Context zeigen\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"Context-Prozessor\"\nmsgstr[1] \"Context-Prozessoren\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"Ressourcenverwendung\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Ressource\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"Browserzeit\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"Timing-Attribut\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"Zeit seit Seitenaufruf (plus Dauer)\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"Paket\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Name\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Version\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"Ziel:\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"Die Django Debug Toolbar hat eine Weiterleitung an die obenstehende URL zur weiteren Überprüfung abgefangen. Klicken Sie den Link, um wie gewohnt weitergeleitet zu werden.\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"Die Daten für dieses Panel sind nicht mehr verfügbar. Bitte laden Sie die Seite neu.\"\n"
  },
  {
    "path": "debug_toolbar/locale/en/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2026-02-09 19:07-0600\\n\"\n\"PO-Revision-Date: 2012-03-31 20:10+0000\\n\"\n\"Last-Translator: \\n\"\n\"Language-Team: \\n\"\n\"Language: en\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1)\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"\"\n\n#: models.py:11\nmsgid \"history entry\"\nmsgstr \"\"\n\n#: models.py:12\nmsgid \"history entries\"\nmsgstr \"\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:169\nmsgid \"Cache\"\nmsgstr \"\"\n\n#: panels/cache.py:176\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/cache.py:185\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/community.py:13\nmsgid \"Community\"\nmsgstr \"\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"\"\n\n#: panels/history/panel.py:21 panels/history/panel.py:22\nmsgid \"History\"\nmsgstr \"\"\n\n#: panels/profiling.py:156\nmsgid \"Profiling\"\nmsgstr \"\"\n\n#: panels/redirects.py:19\nmsgid \"Intercept redirects\"\nmsgstr \"\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"\"\n\n#: panels/request.py:36\nmsgid \"<no view>\"\nmsgstr \"\"\n\n#: panels/request.py:53\nmsgid \"<unavailable>\"\nmsgstr \"\"\n\n#: panels/settings.py:27\nmsgid \"Settings\"\nmsgstr \"\"\n\n#: panels/settings.py:30\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:59\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/signals.py:64\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/signals.py:69\nmsgid \"Signals\"\nmsgstr \"\"\n\n#: panels/sql/forms.py:56\nmsgid \"Data for this panel isn't available anymore.\"\nmsgstr \"\"\n\n#: panels/sql/forms.py:68\nmsgid \"Invalid query id.\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:43\nmsgid \"Read uncommitted\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:45\nmsgid \"Read committed\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:34 panels/sql/panel.py:47\nmsgid \"Repeatable read\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:35 panels/sql/panel.py:49\nmsgid \"Serializable\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:41\nmsgid \"Autocommit\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"Idle\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"Active\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"In transaction\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:66 panels/sql/panel.py:76\nmsgid \"In error\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:67 panels/sql/panel.py:77\nmsgid \"Unknown\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:165\nmsgid \"SQL\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:172\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/sql/panel.py:184\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/staticfiles.py:47\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"\"\n\n#: panels/staticfiles.py:81\nmsgid \"Static files\"\nmsgstr \"\"\n\n#: panels/staticfiles.py:87\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/templates/panel.py:104\nmsgid \"Templates\"\nmsgstr \"\"\n\n#: panels/templates/panel.py:109\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"\"\n\n#: panels/templates/panel.py:199\nmsgid \"No origin\"\nmsgstr \"\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"\"\n\n#: panels/versions.py:21\nmsgid \"Versions\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:22\nmsgid \"Hide toolbar\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:22\nmsgid \"Hide\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:24 templates/debug_toolbar/base.html:25\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:34\nmsgid \"Show toolbar\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:5\nmsgid \"Community & Contribution\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:8\nmsgid \"\"\n\"Want to contribute to Django Debug Toolbar? Get involved in our community!\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:14\nmsgid \"Join Discussions\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:19\nmsgid \"View Issues\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:24\nmsgid \"Contribution Guide\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:31\nmsgid \"Django Debug Toolbar Documentation\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:34\nmsgid \"\"\n\"Explore the official documentation to learn more about Django Debug Toolbar.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:39\nmsgid \"Read Documentation\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:44\nmsgid \"How to Use Django Debug Toolbar\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:3\nmsgid \"SQL explained\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:3\nmsgid \"SQL profiled\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_select.html:3\nmsgid \"SQL selected\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/template_source.html:3\nmsgid \"Template source:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/redirect.html:61\nmsgid \"WARNING:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/redirect.html:62\n#, python-format\nmsgid \"\"\n\"\\n\"\n\"      The RedirectsPanel is deprecated and will be removed in a future \"\n\"version. The HistoryPanel\\n\"\n\"      now provides the ability to view toolbar data for redirected requests. \"\n\"If you still have a\\n\"\n\"      use case for this panel, please comment on this <a target=\\\"_blank\\\" \"\n\"rel=\\\"noopener noreferrer\\\"\\n\"\n\"      href=\\\"%(issue_url)s\\\">issue</a>.\\n\"\n\"      \"\nmsgstr \"\"\n\n#: templates/debug_toolbar/redirect.html:70\nmsgid \"Location:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/redirect.html:72\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"\"\n\n#: views.py:21\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"\"\n"
  },
  {
    "path": "debug_toolbar/locale/es/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# jcatalan <catalanojuan@gmail.com>, 2014\n# Daniel Iglesias <igledaniel@gmail.com>, 2021\n# Leonardo J. Caballero G. <leonardocaballero@gmail.com>, 2013-2014,2020\n# marcelor <marcelor@gmail.com>, 2013\n# Sergio Infante <rsinfante@gmail.com>, 2015\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Daniel Iglesias <igledaniel@gmail.com>, 2021\\n\"\n\"Language-Team: Spanish (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/es/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: es\\n\"\n\"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"Barra de herramientas de Depuración\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(cache_calls)d llamada en %(time).2fms\"\nmsgstr[1] \"%(cache_calls)d llamadas en %(time).2fms\"\nmsgstr[2] \"%(cache_calls)d llamadas en %(time).2fms\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"%(count)d llamadas al Cache desde el backend\"\nmsgstr[1] \"%(count)d llamadas al Caché desde backends\"\nmsgstr[2] \"%(count)d llamadas al Caché desde backends\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"Encabezados\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"Historial\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"Análisis de rendimiento\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"Interceptar re-direcionamiento\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"Petición\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"<sin vista>\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<no disponible>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Configuraciones\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"Valores procedentes de %s\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"%(num_receivers)d receptor de 1 señal\"\nmsgstr[1] \"%(num_receivers)d receptores de 1 señal\"\nmsgstr[2] \"%(num_receivers)d receptores de 1 señal\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_receivers)d receptor de %(num_signals)d señales\"\nmsgstr[1] \"%(num_receivers)d receptores de %(num_signals)d señales\"\nmsgstr[2] \"%(num_receivers)d receptores de %(num_signals)d señales\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Señales\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"Leer cambios tentativos\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"Leer cambios permanentes\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"Lectura repetible\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"Serializable\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"Autocommit\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"Inactivo\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Activo\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"En transacción\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"En error\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"Desconocido\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"Archivos estáticos (%(num_found)s encontrados, %(num_used)s en uso)\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"Archivos estáticos\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"%(num_used)s archivo usado\"\nmsgstr[1] \"%(num_used)s archivos usados\"\nmsgstr[2] \"%(num_used)s archivos usados\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Plantillas\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Plantillas (%(num_templates)s renderizadas)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"Sin origen\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Total: %0.2fms\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Tiempo\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"Tiempo en CPU de usuario\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"%(utime)0.3f ms\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"Tiempo en CPU del sistema\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"%(stime)0.3f ms\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"Tiempo total de CPU\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"%(total)0.3f ms\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Tiempo transcurrido\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"%(total_time)0.3f ms\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"Cambios de contexto\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"%(vcsw)d voluntario, %(ivcsw)d involuntario\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Versiones\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"Ocutar barra de herramientas\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Ocultar\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"Mostrar barra de herramientas\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"Deshabilitar para el próximo y sucesivos peticiones\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"Habilitar para el próximo y sucesivos peticiones\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Resúmen\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"Llamadas totales\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"Tiempo total\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"Aciertos de caché\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"Errores de caché\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"Comandos\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"Llamadas\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"Argumentos\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"Argumentos por palabra clave\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"Backend\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"Encabezados de peticiones\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Clave\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Valor\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"Encabezados de respuesta\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"Entorno WSGI\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"Ya que el entorno WSGI hereda el entorno del servidor, solo un subconjunto significativo es mostrado más abajo.\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"Método\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"Ruta\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"Variables de la petición\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"Estado\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Acción\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Variable\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Llamar\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"TiempoAcum\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"Por\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"TiempoTot\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Contar\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"Información de Vista\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"Función vista\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"Nombre de dirección URL\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"Cookies\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"Sin cookies\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"Datos de sesión\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"Sin datos de sesión\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"Datos del GET\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Sin datos GET\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"Datos del POST\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Sin datos POST\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Configuración\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Señal\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Receptores\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)s consulta\"\nmsgstr[1] \"%(num)s consultas\"\nmsgstr[2] \"%(num)s consultas\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"y <abbr title=\\\"Las consultas repetidas son idénticas: ejecutan el mismo SQL con los mismos parámetros. \\\">%(dupes)s repetidos</abbr>\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Query\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Línea de tiempo\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"%(count)s consultas similares. \"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"Repetidas %(dupes)s veces.\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Conexión:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"Nivel de aislamiento:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Estado de la transacción:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(desconocido)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"No se registraron consultas SQL durante ésta petición.\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"SQL explicado\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"SQL Ejecutado\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"Base de datos\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"SQL analizado\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Error\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"SQL seleccionado\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Establecer Vacío\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"Ruta a archivos estático\"\nmsgstr[1] \"Rutas a archivos estáticos\"\nmsgstr[2] \"Rutas a archivos estáticos\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"(prefijo %(prefix)s)\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"Ninguno\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"Aplicación a archivos estáticos\"\nmsgstr[1] \"Aplicaciones de archivos estáticos\"\nmsgstr[2] \"Aplicaciones de archivos estáticos\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"Archivo estático\"\nmsgstr[1] \"Archivos estáticos\"\nmsgstr[2] \"Archivos estáticos\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"%(payload_count)s archivo\"\nmsgstr[1] \"%(payload_count)s archivos\"\nmsgstr[2] \"%(payload_count)s archivos\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Ubicación\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"Fuente de plantilla:\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"Ruta de plantilla\"\nmsgstr[1] \"Rutas de plantillas\"\nmsgstr[2] \"Rutas de plantillas\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"Plantilla\"\nmsgstr[1] \"Plantillas\"\nmsgstr[2] \"Plantillas\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"Mostrar/Ocultar contexto\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"Procesador de contexto\"\nmsgstr[1] \"Procesadores de contexto\"\nmsgstr[2] \"Procesadores de contexto\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"Uso de recursos\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Recurso\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"Distribución de tiempos de navegador\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"Atributo de tiempo\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"Tiempo desde inicio de la navegación (+duración)\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"Paquete\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Versión\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"Ubicación:\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"El Django Debug Toolbar ha interceptado un re-direccionamiento a la dirección de Internet mostrada arriba, con el propósito de inspeccionarla. Usted puede hacer clic en el vínculo de arriba para continuar con el re-direccionamiento normalmente.\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"La información de este panel ya no se encuentra disponible. Por favor recargue la página y pruebe nuevamente.\"\n"
  },
  {
    "path": "debug_toolbar/locale/fa/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Ali Soltani <alisoltanics@gmail.com>, 2021\n# Elyas Ebrahimpour <eliasebrahimpour@gmail.com>, 2024\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Elyas Ebrahimpour <eliasebrahimpour@gmail.com>, 2024\\n\"\n\"Language-Team: Persian (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/fa/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: fa\\n\"\n\"Plural-Forms: nplurals=2; plural=(n > 1);\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"نوار ابزار دیباگ\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(cache_calls)d فراخوان در %(time).2f میلی‌ثانیه\"\nmsgstr[1] \"%(cache_calls)d فراخوان در %(time).2f میلی‌ثانیه\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"فراخوان‌های کش از %(count)d بک‌اند\"\nmsgstr[1] \"فراخوان‌های کش از %(count)d بک‌اندها\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"هدر ها\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"تاریخچه\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"نمایه سازی\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"رهگیری تغییر مسیرها\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"ریکوئست\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"<بدون نمایش>\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<در دسترس نیست>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"تنظیمات\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"تنظیمات از %s\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"%(num_receivers)d گیرنده از 1 سیگنال\"\nmsgstr[1] \"%(num_receivers)d گیرنده از 1 سیگنال\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_receivers)d گیرنده از %(num_signals)d سیگنال\"\nmsgstr[1] \"%(num_receivers)d گیرنده از %(num_signals)d سیگنال\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"سیگنال‌ها\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"خواندن بدون تاثیر\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"خواندن با تاثیر\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"خواندن تکرارپذیر\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"قابل سریالایز شدن\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"کامیت خودکار\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"IDLE\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"فعال\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"در تراکنش\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"در خطا\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"ناشناخته\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"اس کیو ال\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"%(query_count)d کوئری در %(sql_time).2f میلی‌ثانیه\"\nmsgstr[1] \"%(query_count)d کوئری در %(sql_time).2f میلی‌ثانیه\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"کوئری‌های SQL از %(count)d اتصال\"\nmsgstr[1] \"کوئری‌های SQL از %(count)d اتصال\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"فایل‌های استاتیک (%(num_found)s یافته شده، %(num_used)s استفاده شده)\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"فایل های استاتیک\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"%(num_used)s فایل استفاده شده\"\nmsgstr[1] \"%(num_used)s فایل استفاده شده\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"تمپلیت ها\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"تمپلیت ها (%(num_templates)s rendered)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"بدون origin\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"پردازنده: %(cum)0.2f میلی‌ثانیه (%(total)0.2f میلی‌ثانیه)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"مجموع: %0.2f میلی‌ثانیه\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"زمان\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"زمان سی پی یو کاربر\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"%(utime)0.3f میلی‌ثانیه\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"زمان CPU سیستم\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"%(stime)0.3f میلی‌ثانیه\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"زمان کل سی پی یو\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"%(total)0.3f میلی ثانیه\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"زمان سپری شده\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"%(total_time)0.3f میلی‌ثانیه\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"تغییرات زمینه\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"%(vcsw)d اختیاری، %(ivcsw)d غیراختیاری\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"ورژن ها\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"پنهان کردن toolbar\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"پنهان کردن\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"نمایش toolbar\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"غیر فعال کردن برای ریکوئست های پی در پی\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"فعال کردن برای ریکوئست های بعدی و پی در پی\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"خلاصه\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"تعداد نهایی کال کردن ها\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"زمان نهایی\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"Cache hits\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"عدم دسترسی به کش\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"دستورات\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"فراخوانی ها\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"نوع\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"آرگومان ها\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"آرگومان های کیورد\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"بک اند\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"هدر های ریکوئست\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"کلید\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"مقدار\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"هدر های ریسپانس\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"محیط WSGI\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"از آنجا که محیط WSGI محیط سرور را به ارث می برد ، فقط یک زیر مجموعه مهم در زیر نشان داده شده است.\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"متد\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"Path\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"متغیر های ریکوئست\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"وضعیت\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"اکشن\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"متغیر\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Call\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"بر\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"زمان نهایی\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"تعداد\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"اطلاعات View\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"تابع Viw\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"نام URL\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"کوکی ها\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"کوکی ای وجود ندارد\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"دیتای سشن\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"دیتای سشن وجود ندارد\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"دیتای GET\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"دیتای GET وجود ندارد\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"دیتای POST\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"دیتای POST وجود ندارد\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"تنظیمات\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Signal\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Receiver ها\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"کوئری\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"تایملاین\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"%(count)s کوئری مشابه\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"%(dupes)s بار تکرار شده\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"کانکشن:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"سطح isolation:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"وضعیت تراکنش\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(ناشناخته)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"کوئری SQL ای در این ریکوئست ثبت نشده است\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"توضیح SQL\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"کوئری اجرا شده\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"دیتابیس\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"SQL profiled\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"خطا\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"انتخاب شده SQL\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"set خالی\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"(prefix %(prefix)s)\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"خالی\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"مکان\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"منبع تمپلیت:\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"تغییر متن\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"پردازشگر محیط\"\nmsgstr[1] \"پردازشگرهای محیط\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"استفاده منابع\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"منابع\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"زمان بندی مرورگر\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"ویژگی زمان بندی\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"زمان از آغاز ناوبری (+مدت)\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"پکیج\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"نام\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"ورژن\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"مکان:\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"نوار ابزار اشکال‌زدای Django یک هدایت به URL بالا را به منظور مشاهده اشکال توسط ابزار اشکال‌زدای افزونه کرده است. می‌توانید بر روی پیوند بالا کلیک کنید تا با هدایت به صورت عادی ادامه دهید.\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"دیتا برای نمایش در دسترس نیست. لطفا صفحه را ریفرش کنید.\"\n"
  },
  {
    "path": "debug_toolbar/locale/fi/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Klaus Dahlén, 2012\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Klaus Dahlén, 2012\\n\"\n\"Language-Team: Finnish (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/fi/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: fi\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Välimuisti\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(cache_calls)d kutsu %(time).2fms\"\nmsgstr[1] \"%(cache_calls)d kutsua %(time).2fms\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"Profilointi\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Asetukset\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"%(num_receivers)d vastaanotin 1 signaalille\"\nmsgstr[1] \"%(num_receivers)d vastaanotinta 1 signaalille\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_receivers)d vastaanotin %(num_signals)d signaalille\"\nmsgstr[1] \"%(num_receivers)d vastaanotinta %(num_signals)d signaalille\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Signaalit\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"Muuttuja\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"Autocommit\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Tapahtuma\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"Tapahtuman tila:\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"Virhe\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"(tuntematon)\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"Staattiset tiedostot\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Asettelupohjat\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Asetttelupohjat (%(num_templates)s renderöity)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Aika\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"Käyttäjän CPU-aika\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"%(utime)0.3f ms\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"Järjestelmän CPU-aika\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"%(stime)0.3f ms\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"CPU-aika yhteensä\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"%(total)0.3f ms\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Kulunut aika\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"%(total_time)0.3f ms\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"Kontekstin vivut\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Versiot\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Piilota\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Tyyppi\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Avain\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Arvo\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"Polku\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Tapahtuma\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Muuttuja\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Kutsu\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"CumTime\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"/\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"TotTime\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Määrä\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"Näkymän tiedot\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Ei GET-dataa\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Ei POST-dataa\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Asetus\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Signaali\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Vastaanottimet\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)s kysely\"\nmsgstr[1] \"%(num)s kyselyä\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Kysely\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Aikajana\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Yhteys:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"Eristystaso:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Tapahtuman status:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(tuntematon)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"Tämän pyynnön aikana ei tehty yhtään SQL-kyselyä.\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"Suoritettu SQL\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"Tietokanta\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Virhe\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Tyhjä joukko\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"None\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"\"\nmsgstr[1] \"Staattiset tiedostot\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Sijainti\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"Sivupohjan polku\"\nmsgstr[1] \"Sivupohjan polku\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"Sivupohja\"\nmsgstr[1] \"Sivupohja\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"Kontekstiprosessori\"\nmsgstr[1] \"Kontekstiprosessori\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Resurssi\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Versio\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"\"\n"
  },
  {
    "path": "debug_toolbar/locale/fr/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Anthony Jorion <pingax@gmail.com>, 2013\n# c1b16e6c929c50740e884a23aafc8829_00449d9 <ec12d7f60c595a45665f74b651aefabe_13279>, 2014\n# Claude Paroz <claude@2xlibre.net>, 2013\n# Colin O'Brien <colin@things.be>, 2021\n# David Paccoud, 2009\n# Dominick Rivard <dominick.rivard@gmail.com>, 2013\n# Maxime Abry <maxime.abry@critizr.com>, 2016\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Colin O'Brien <colin@things.be>, 2021\\n\"\n\"Language-Team: French (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/fr/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: fr\\n\"\n\"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"Barre d'outils de débogage\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(cache_calls)d appel en %(time).2fms\"\nmsgstr[1] \"%(cache_calls)d appels en %(time).2fms\"\nmsgstr[2] \"%(cache_calls)d appels en %(time).2fms\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"Appels au cache depuis %(count)d moteur\"\nmsgstr[1] \"Appels au cache depuis %(count)d moteurs\"\nmsgstr[2] \"Appels au cache depuis %(count)d moteurs\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"En-têtes\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"Historique\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"Profilage\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"Interception des redirections\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"Requête\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"<pas de vue>\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<indisponible>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Paramètres\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"Paramètres de %s\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"%(num_receivers)d receveur d'un signal\"\nmsgstr[1] \"%(num_receivers)d receveurs d'un signal\"\nmsgstr[2] \"%(num_receivers)d receveurs d'un signal\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_receivers)d receveur de %(num_signals)d signaux\"\nmsgstr[1] \"%(num_receivers)d receveurs de %(num_signals)d signaux\"\nmsgstr[2] \"%(num_receivers)d receveurs de %(num_signals)d signaux\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Signaux\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"Lecture non validée\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"Lecture validée\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"Lecture répétable\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"Sérialisable\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"Auto validation\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"Inactif\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Actif\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"Transaction en cours\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"Erreur\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"Indéterminé\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"%(query_count)d requête en %(sql_time).2f ms\"\nmsgstr[1] \"%(query_count)d requêtes en %(sql_time).2f ms\"\nmsgstr[2] \"%(query_count)d requêtes en %(sql_time).2f ms\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"requêtes SQL venant de %(count)d connexion\"\nmsgstr[1] \"Requêtes SQL venant de %(count)d connexions\"\nmsgstr[2] \"Requêtes SQL venant de %(count)d connexions\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"Fichiers statiques (%(num_found)s trouvé(s), %(num_used)s utilisé(s))\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"Fichiers statiques\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"%(num_used)s fichier utilisé\"\nmsgstr[1] \"%(num_used)s fichiers utilisés\"\nmsgstr[2] \"%(num_used)s fichiers utilisés\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Gabarits\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Gabarits (%(num_templates)s affichés)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"Sans Origine\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Total : %0.2fms\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Temps\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"Temps CPU de l'utilisateur\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"%(utime)0.3f ms\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"Temps CPU du système\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"%(stime)0.3f ms\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"Temps total du CPU\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"%(total)0.3f ms\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Temps écoulé\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"%(total_time)0.3f ms\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"Basculements de contexte\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"%(vcsw)d volontaire, %(ivcsw)d involontaire\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Versions\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"Masquer la barre d'outils\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Masquer\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"Afficher la barre d'outils\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"Désactiver pour les requêtes suivantes\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"Activer pour les requêtes suivantes\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Résumé\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"Nombre total d'appels\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"Temps total\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"Succès de cache\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"Défauts de cache\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"Commandes\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"Appels\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Type\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"Paramètres\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"Paramètres nommés\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"Moteur\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"En-têtes de requête\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Clé\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Valeur\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"En-têtes de réponse\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"Environnement WSGI\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"Comme l'environnement WSGI hérite de celui du serveur, seul un sous-ensemble pertinent est affiché ci-dessous.\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"Méthode\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"Chemin\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"Variables de Requête\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"État\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Action\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Variable\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Appel\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"Temps cumulé\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"Par\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"Temps total\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Compte\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"Afficher l'information\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"Fonction de vue\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"Nom d'URL\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"Cookies\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"Pas de cookies\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"Données de session\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"Pas de données de session\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"Données GET\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Aucune donnée GET\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"Données POST\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Aucune donnée POST\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Paramètre\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Signal\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Receveurs\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)s requête\"\nmsgstr[1] \"%(num)s requêtes\"\nmsgstr[2] \"%(num)s requêtes\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"comprenant <abbr title=\\\"Similar queries are queries with the same SQL, but potentially different parameters.\\\">%(count)s similaires</abbr>\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"et <abbr title=\\\"Duplicate queries are identical to each other: they execute exactly the same SQL and parameters.\\\">%(dupes)s en double</abbr>\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Requête\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Chronologie\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"%(count)s requêtes similaires.\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"Dupliqué %(dupes)s fois.\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Connexion :\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"Niveau d'isolation :\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"État de la transaction :\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(indéterminé)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"Aucune requête SQL n'a été enregistrée durant cette requête.\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"SQL expliqué\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"SQL Exécuté\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"Base de données\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"SQL profilé\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Erreur\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"SQL sélectionné\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Ensemble vide\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"Chemin de fichier statique\"\nmsgstr[1] \"Chemins de fichiers statiques\"\nmsgstr[2] \"Chemins de fichiers statiques\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"(préfixe %(prefix)s)\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"Aucun\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"Application de fichiers statiques\"\nmsgstr[1] \"Applications de fichiers statiques\"\nmsgstr[2] \"Applications de fichiers statiques\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"\"\nmsgstr[1] \"Fichiers statiques\"\nmsgstr[2] \"Fichiers statiques\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"%(payload_count)s fichier\"\nmsgstr[1] \"%(payload_count)s fichiers\"\nmsgstr[2] \"%(payload_count)s fichiers\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Emplacement\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"Source du gabarit :\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"Chemin du gabarit\"\nmsgstr[2] \"Chemin du gabarit\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"\"\nmsgstr[1] \"Gabarit\"\nmsgstr[2] \"Gabarit\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"Afficher/masquer le contexte\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"Processeur de contexte\"\nmsgstr[1] \"Processeurs de contexte\"\nmsgstr[2] \"Processeurs de contexte\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"Utilisation des ressources\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Ressource\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"Chronologie du navigateur\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"Attribut mesuré\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"Temps depuis le début de la navigation (+durée)\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"Paquet\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Nom\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Version\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"Emplacement :\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"La barre de débogage Django a intercepté une redirection vers l'URL ci-dessus afin de permettre la consultation des messages de débogage.  Vous pouvez cliquer sur le lien ci-dessus pour continuer normalement avec la redirection.\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"Les données de ce panneau ne sont plus disponibles. Rechargez la page et essayez à nouveau.\"\n"
  },
  {
    "path": "debug_toolbar/locale/he/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# shaib <shai@platonix.com>, 2012\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: shaib <shai@platonix.com>, 2012\\n\"\n\"Language-Team: Hebrew (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/he/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: he\\n\"\n\"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"סיגנלים\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"משתנה\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"פעילות\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"שגיאה\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"תבניות\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"זמן\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"גירסאות\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"הסתר\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"סוג\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"מפתח\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"ערך\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"פעילות\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"משתנה\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"אין נתוני GET\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"אין נתוני POST\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"סיגנל\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"SQL שבוצע\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"שגיאה\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"קבוצה ריקה\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"מקום\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"\"\nmsgstr[1] \"תבנית\"\nmsgstr[2] \"תבנית\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"\"\n"
  },
  {
    "path": "debug_toolbar/locale/id/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Muhammad Panji <sumodirjo@gmail.com>, 2012\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Muhammad Panji <sumodirjo@gmail.com>, 2012\\n\"\n\"Language-Team: Indonesian (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/id/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: id\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Pengaturan\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Sinyal\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"Variabel\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Aksi\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"Status transaksi:\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"(tidak diketahui)\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"Berkas statik\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Template\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Waktu\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"CPU time pengguna\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"CPU time sistem\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"CPU time total\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Waktu terlampaui\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Versi\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Menyembunyikan\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Jenis\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Kunci\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Nilai\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Aksi\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Variabel\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Panggil\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"CumTime\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"Per\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"TotTime\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Hitung\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"Lihat informasi\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Tidak ada data GET\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Tidak ada data POST\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Pengaturan\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Sinyal\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Penerima\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Koneksi:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"Tingkat isolasi:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Status transaksi:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(tidak diketahui)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"SQL Tereksekusi\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"Basis data\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Himpunan kosong\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"Tidak ada\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"Berkas statik\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Lokasi\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"Template path\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Sumber daya\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Versi\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"\"\n"
  },
  {
    "path": "debug_toolbar/locale/it/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Dario Agliottone <dario.agliottone@gmail.com>, 2012\n# Flavio Curella <flavio.curella@gmail.com>, 2013\n# yakky <i.spalletti@nephila.it>, 2013-2014\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: yakky <i.spalletti@nephila.it>, 2013-2014\\n\"\n\"Language-Team: Italian (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/it/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: it\\n\"\n\"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(cache_calls)d chiamata in %(time).2fms\"\nmsgstr[1] \"%(cache_calls)d chiamate in %(time).2fms\"\nmsgstr[2] \"%(cache_calls)d chiamate in %(time).2fms\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"Chiamate alla cache da %(count)d backend\"\nmsgstr[1] \"Chiamate alla cache da %(count)d backend\"\nmsgstr[2] \"Chiamate alla cache da %(count)d backend\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"Intestazioni\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"Profilazione\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"Intercetta ridirezioni\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"Request\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"<nessuna view>\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<non disponibile>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Impostazioni\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"%(num_receivers)d ricevitore di 1 segnale\"\nmsgstr[1] \"%(num_receivers)d ricevitori di 1 segnale\"\nmsgstr[2] \"%(num_receivers)d ricevitori di 1 segnale\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_receivers)d ricevitore di %(num_signals)d segnali\"\nmsgstr[1] \"%(num_receivers)d ricevitori di %(num_signals)d segnali\"\nmsgstr[2] \"%(num_receivers)d ricevitori di %(num_signals)d segnali\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Segnali\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"Read uncommitted\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"Read committed\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"Repeatable read\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"Serializable\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"Autocommit\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"Idle\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Azione\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"Stato transazione:\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"Errore\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"(sconosciuto)\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"File statici (%(num_found)s trovati, %(num_used)s usati)\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"Files statici\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"%(num_used)s file usato\"\nmsgstr[1] \"%(num_used)s file usati\"\nmsgstr[2] \"%(num_used)s file usati\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Template\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Templates (%(num_templates)s rendered)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Totale: %0.2fms\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Tempo\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"Tempo CPU utente\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"%(utime)0.3f ms\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"Tempo CPU sistema\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"%(stime)0.3f ms\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"Tempo Totale CPU\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"%(total)0.3f ms\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Tempo Trascorso\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"%(total_time)0.3f ms\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"Cambi di contesto\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"%(vcsw)d volontario, %(ivcsw)d involontario\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Versioni\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"Nascondi Toolbar\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Nascondi\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"Mostra Toolbar\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"Disattiva per la prossima requests e le successive\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"Abilita per la prossima requests e le successive\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Sommario\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"Chiamate totali\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"Tempo Totale\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"Trovati in cache\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"Non trovati in cache\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"Comandi\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"Chiamate\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"Argomenti\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"Parole chiave\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"Backend\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"Header della request\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Nome\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Valore\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"Header della response\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"Ambiente WSGI\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"Visto che l'ambiente WSGI è ereditato dal server, sotto è mostrata solo la parte significativa.\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"Percorso\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Azione\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Variabile\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Chiamata\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"CumTime\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"Per\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"TotTime\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Numero\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"Vedi Informazioni\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"Funzione View\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"Nome URL\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"Cookies\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"Nessun cookie\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"Dati di sessione\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"Nessun dato in sessione\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"Dati GET\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Nessun dato in GET\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"Dati POST\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Nessuno dato in POST\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Impostazione\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Segnale\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Ricevitori\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)s query\"\nmsgstr[1] \"%(num)s query\"\nmsgstr[2] \"%(num)s query\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Query\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Timeline\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Connessione:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"Isolation level:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Stato transazione:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(sconosciuto)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"Nessuna Query SQL è stata registrata durante questa richiesta\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"SQL spigato\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"SQL eseguita\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"Database\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"SQL profilato\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Errore\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"SQL selezionato\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Insieme vuoto\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"Percorso file statici\"\nmsgstr[1] \"Percorsi file statici\"\nmsgstr[2] \"Percorsi file statici\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"(prefisso %(prefix)s)\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"Nessuno\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"App file statici\"\nmsgstr[1] \"App file statici\"\nmsgstr[2] \"App file statici\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"\"\nmsgstr[1] \"Files statici\"\nmsgstr[2] \"Files statici\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"%(payload_count)s file\"\nmsgstr[1] \"%(payload_count)s file\"\nmsgstr[2] \"%(payload_count)s file\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Location\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"Sorgente del template\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"Percorso dei template\"\nmsgstr[1] \"Percorsi dei template\"\nmsgstr[2] \"Percorsi dei template\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"\"\nmsgstr[1] \"Template\"\nmsgstr[2] \"Template\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"Cambia contesto\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"Context processor\"\nmsgstr[1] \"Context processors\"\nmsgstr[2] \"Context processors\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"Uso risorsa\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Risorsa\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"Tempo browser\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"Attributo\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"Tempo dall'inizio della navigazione (+durata)\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Nome\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Versione\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"Location:\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"Django Debug Toolbar ha intercettato un redirect verso la URL indicata per visualizzare il debug, Puoi cliccare sul link sopra per continuare normalmente con la redirezione.\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"Non sono più disponibili dati per questo pannello. Ricarica la pagina e riprova.\"\n"
  },
  {
    "path": "debug_toolbar/locale/ja/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Shinya Okano <tokibito@gmail.com>, 2012,2014,2020\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Shinya Okano <tokibito@gmail.com>, 2012,2014,2020\\n\"\n\"Language-Team: Japanese (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/ja/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: ja\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"デバッグツールバー\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"キャッシュ\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"ヘッダー\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"プロファイル\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"リダイレクトに割込み\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"リクエスト\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<利用不可>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"設定\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"シグナル\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"静的ファイル\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"テンプレート\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"時間\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"バージョン\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"ツールバーを隠す\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"隠す\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"ツールバーを表示\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"引数\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"キーワード引数\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"バックエンド\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"リクエストヘッダー\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"キー\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"値\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"レスポンスヘッダー\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"パス\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"変数\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"ビューの情報\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"ビュー関数\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"URL名\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"クッキー\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"クッキーはありません\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"セッションデータ\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"セッションデータはありません\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"設定項目\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"シグナル\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"レシーバー\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"タイムライン\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"実行されたSQL\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"データベース\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"エラー\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"静的ファイルのパス\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"ありません\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"静的ファイルを含むアプリケーション\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"静的ファイル\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"テンプレート\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"コンテキストプロセッサー\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"リソース\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"名前\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"バージョン\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"\"\n"
  },
  {
    "path": "debug_toolbar/locale/ko/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# yeongkwang, 2022\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: yeongkwang, 2022\\n\"\n\"Language-Team: Korean (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/ko/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: ko\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"Debug Toolbar\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"캐시\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(time).2f 밀리초 동안 %(cache_calls)d번 호출\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"백엔드에서 %(count)d개의 캐시 호출\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"헤더\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"히스토리\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"프로파일링\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"리다이렉션 가로채기\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"요청\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"<view 없음>\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<사용할 수 없음>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"설정\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"설정 %s\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"1개의 시그널 %(num_receivers)d개의 리시버\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_signals)d개의 시그널 %(num_receivers)d개의 리시버\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"시그널\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"유휴\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"활성\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"트랜잭션\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"에러\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"알 수 없음\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"%(sql_time).2f 밀리초 동안 %(query_count)d개의 쿼리\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"SQL 쿼리 %(count)d개의 커넥션\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"정적 파일 (%(num_found)s개 찾음, %(num_used)s개 사용됨)\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"정적 파일\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"%(num_used)s개의 파일 사용됨\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"템플릿\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"템플릿 (%(num_templates)s개 렌더링)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"시각\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"경과 시간\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"컨텍스트 스위치\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"버전\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"툴바 숨기기\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"숨기기\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"툴바 열기\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"다음 요청부터 비활성화 됩니다.\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"다음 요청부터 활성화 됩니다.\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"개요\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"총 요청 개수\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"총 소요 시간\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"캐시 적중\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"캐시 비적중\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"명령\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"호출\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"타입\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"매개변수\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"키워드 매개변수\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"백엔드\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"요청 헤더\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"키\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"값\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"응답 헤더\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"WSGI 환경\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"WSGI 환경이 서버 환경을 상속하므로 아래에는 중요한 하위 집합만 표시됩니다.\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"메서드\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"경로\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"요청 변수\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"상태 코드\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"액션\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"변수\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"호출\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"개수\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"View 정보\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"View 함수\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"URL 명칭\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"쿠키\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"쿠키 없음\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"세션 데이터\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"세션 데이터 없음\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"GET 요청 데이터\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"GET 요청 데이터 없음\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"POST 요청 데이터\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"POST 요청 데이터 없음\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"설정\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"시그널\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"리시버\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)s개의 쿼리\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"<abbr title=\\\"유사한 쿼리는 동일한 SQL이지만 잠재적으로 다른 매개변수를 사용하는 쿼리입니다.\\\">%(count)s 개의 유사한</abbr> 쿼리 포함\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"그리고 <abbr title=\\\"중복 쿼리는 서로 동일합니다. 정확히 동일한 SQL 및 매개변수를 실행합니다.\\\">%(dupes)s개의 중복</abbr>\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"쿼리\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"타임라인\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"%(count)s개의 유사한 쿼리\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"%(dupes)s번 중복됩니다.\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"커넥션:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"격리 수준:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"트랜잭션 상태:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(알 수 없음)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"이 요청을 처리하는 동안 기록된 SQL 쿼리가 없습니다.\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"SQL 설명\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"실행된 SQL 구문\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"데이터베이스\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"SQL 성능 분석\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"에러\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"선택된 SQL 구문\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"빈 셋\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"정적 파일 경로\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"정적 파일 앱\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"정적 파일\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"%(payload_count)s개 파일\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"위치\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"템플릿 소스:\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"템플릿 경로\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"템플릿\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"컨텍스트 토글\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"컨텍스트 프로세서\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"리소스 사용량\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"리소스\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"브라우저 타이밍\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"타이밍 속성\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"탐색 시작 이후 시간 (+기간)\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"패키지\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"이름\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"버전\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"위치:\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"Django Debug Toolbar는 디버그 보기를 제공하기 위해 위 URL으로 리다이렉션을 가로챘습니다. 위 링크를 클릭하여 정상적으로 리다이렉션을 계속 할수 있습니다.\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"이 패널의 데이터는 더이상 사용할 수 없습니다. 페이지를 새로고침한 뒤 다시 시도하십시오.\"\n"
  },
  {
    "path": "debug_toolbar/locale/lt/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Karolis Ryselis <karolis@esperonus.com>, 2025-2026\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-10-16 19:11-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Karolis Ryselis <karolis@esperonus.com>, 2025-2026\\n\"\n\"Language-Team: Lithuanian (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/lt/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: lt\\n\"\n\"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"Derinimo įrankių juosta\"\n\n#: models.py:11\nmsgid \"history entry\"\nmsgstr \"istorijos įrašas\"\n\n#: models.py:12\nmsgid \"history entries\"\nmsgstr \"istorijos įrašai\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"Formoje su id \\\"{form_id}\\\" yra failų laukas, bet jai nenurodytas atributas enctype=\\\"multipart/form-data\\\".\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"Formoje yra failų laukas, bet forma neturi atributo enctype=\\\"multipart/form-data\\\".\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"Įvesties elementas nurodo formą su ID „{form_id}“, tačiau ši forma neturi atributo enctype=\\\"multipart/form-data\\\".\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"Įspėjimai\"\n\n#: panels/cache.py:170\nmsgid \"Cache\"\nmsgstr \"Podėlis\"\n\n#: panels/cache.py:177\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(cache_calls)d kvietimas per %(time).2f ms\"\nmsgstr[1] \"%(cache_calls)d kvietimai per %(time).2f ms\"\nmsgstr[2] \"%(cache_calls)d kvietimų per %(time).2f ms\"\nmsgstr[3] \"%(cache_calls)d kvietimų per %(time).2f ms\"\n\n#: panels/cache.py:186\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"Podėlio kreipiniai iš %(count)d posistemio\"\nmsgstr[1] \"Podėlio kreipiniai iš %(count)d posistemių\"\nmsgstr[2] \"Podėlio kreipiniai iš %(count)d posistemių\"\nmsgstr[3] \"Podėlio kreipiniai iš %(count)d posistemių\"\n\n#: panels/community.py:13\nmsgid \"Community\"\nmsgstr \"Bendruomenė\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"Antraštės\"\n\n#: panels/history/panel.py:20 panels/history/panel.py:21\nmsgid \"History\"\nmsgstr \"Istorija\"\n\n#: panels/profiling.py:156\nmsgid \"Profiling\"\nmsgstr \"Profiliavimas\"\n\n#: panels/redirects.py:18\nmsgid \"Intercept redirects\"\nmsgstr \"Perimti nukreipimus\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"Užklausa\"\n\n#: panels/request.py:36\nmsgid \"<no view>\"\nmsgstr \"<nėra rodinio>\"\n\n#: panels/request.py:53\nmsgid \"<unavailable>\"\nmsgstr \"<neprieinamas>\"\n\n#: panels/settings.py:19\nmsgid \"Settings\"\nmsgstr \"Nustatymai\"\n\n#: panels/settings.py:22\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"Nustatymai iš %s\"\n\n#: panels/signals.py:59\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"%(num_receivers)d 1 signalo gavėjas\"\nmsgstr[1] \"%(num_receivers)d 1 signalo gavėjai\"\nmsgstr[2] \"%(num_receivers)d  1 signalo gavėjų\"\nmsgstr[3] \"%(num_receivers)d 1 signalo gavėjų\"\n\n#: panels/signals.py:64\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_receivers)d %(num_signals)d signalų gavėjas\"\nmsgstr[1] \"%(num_receivers)d %(num_signals)d signalų gavėjai\"\nmsgstr[2] \"%(num_receivers)d %(num_signals)d signalų gavėjų\"\nmsgstr[3] \"%(num_receivers)d %(num_signals)d signalų gavėjų\"\n\n#: panels/signals.py:69\nmsgid \"Signals\"\nmsgstr \"Signalai\"\n\n#: panels/sql/forms.py:56\nmsgid \"Data for this panel isn't available anymore.\"\nmsgstr \"Šio skydelio duomenys nebepasiekiami.\"\n\n#: panels/sql/forms.py:68\nmsgid \"Invalid query id.\"\nmsgstr \"Neteisingas užklausos id.\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:43\nmsgid \"Read uncommitted\"\nmsgstr \"Skaityti neužbaigtas\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:45\nmsgid \"Read committed\"\nmsgstr \"Skaityti užbaigtas\"\n\n#: panels/sql/panel.py:34 panels/sql/panel.py:47\nmsgid \"Repeatable read\"\nmsgstr \"Atkartojamas skaitymas\"\n\n#: panels/sql/panel.py:35 panels/sql/panel.py:49\nmsgid \"Serializable\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:41\nmsgid \"Autocommit\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"Idle\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"Active\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"In transaction\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:66 panels/sql/panel.py:76\nmsgid \"In error\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:67 panels/sql/panel.py:77\nmsgid \"Unknown\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:165\nmsgid \"SQL\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:172\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: panels/sql/panel.py:184\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: panels/staticfiles.py:47\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"\"\n\n#: panels/staticfiles.py:81\nmsgid \"Static files\"\nmsgstr \"\"\n\n#: panels/staticfiles.py:87\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: panels/templates/panel.py:104\nmsgid \"Templates\"\nmsgstr \"\"\n\n#: panels/templates/panel.py:109\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"\"\n\n#: panels/templates/panel.py:199\nmsgid \"No origin\"\nmsgstr \"\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f msec\"\nmsgstr \"\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f msec\"\nmsgstr \"\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f msec\"\nmsgstr \"\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f msec\"\nmsgstr \"\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"\"\n\n#: panels/versions.py:21\nmsgid \"Versions\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:22\nmsgid \"Hide toolbar\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:22\nmsgid \"Hide\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:24 templates/debug_toolbar/base.html:25\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:34\nmsgid \"Show toolbar\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/sql.html:36\nmsgid \"Time (ms)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:5\nmsgid \"Community & Contribution\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:8\nmsgid \"\"\n\"Want to contribute to Django Debug Toolbar? Get involved in our community!\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:14\nmsgid \"Join Discussions\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:19\nmsgid \"View Issues\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:24\nmsgid \"Contribution Guide\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:31\nmsgid \"Django Debug Toolbar Documentation\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:34\nmsgid \"\"\n\"Explore the official documentation to learn more about Django Debug Toolbar.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:39\nmsgid \"Read Documentation\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/community.html:44\nmsgid \"How to Use Django Debug Toolbar\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:3\nmsgid \"SQL explained\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:3\nmsgid \"SQL profiled\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_select.html:3\nmsgid \"SQL selected\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/template_source.html:3\nmsgid \"Template source:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Milliseconds since navigation start (+length)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"\"\n\n#: views.py:18\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"\"\n"
  },
  {
    "path": "debug_toolbar/locale/nl/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Ingo Berben <ingoberben@gmail.com>, 2012-2013\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Ingo Berben <ingoberben@gmail.com>, 2012-2013\\n\"\n\"Language-Team: Dutch (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/nl/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: nl\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"Profilering\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"<niet bekeken>\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<niet beschikbaar>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Instellingen\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"%(num_receivers)d ontvanger van 1 signaal\"\nmsgstr[1] \"%(num_receivers)d ontvangers van 1 signaal\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_receivers)d ontvanger van %(num_signals)d signalen\"\nmsgstr[1] \"%(num_receivers)d ontvangers van %(num_signals)d signalen\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Signalen\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"Serializeerbaar\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Actief\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"Foutief\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"Niet gekend\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Templates\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Templates (%(num_templates)s gerenderd)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Totaal: %0.2fms\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Tijd\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"Gebruikers CPU tijd\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"%(utime)0.3f ms\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"Systeem CPU tijd\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"%(stime)0.3f ms\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"Totaal CPU tijd\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"%(total)0.3f ms\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Verlopen tijd\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"%(total_time)0.3f ms\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"%(vcsw)d vrijwillig, %(ivcsw)d niet vrijwillig\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Versies\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"Verberg toolbar\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Verbergen\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"Bekijk toolbar\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Samenvatting\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Type\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Sleutel\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Waarde\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"Methode\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Actie\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Parameter\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Oproepen\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"TotTijd\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Aantal\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"Bekijk informatie\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"GET data\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Geen GET data\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"POST data\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Geen POST data\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Instelling\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Signaal\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Ontvangers\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Query\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Tijdslijn\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Verbinding:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Transactiestatus:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(niet gekend)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"SQL uitgelegd\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"Uitgevoerde SQL\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"Database\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Fout\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Lege set\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"None\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Locatie\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"Templatepad\"\nmsgstr[1] \"Templatepaden\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"Template\"\nmsgstr[1] \"Templates\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Bron\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"Pakket\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Naam\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Versie\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"\"\n"
  },
  {
    "path": "debug_toolbar/locale/pl/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Konrad Mosoń <mosonkonrad@gmail.com>, 2013,2015\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Konrad Mosoń <mosonkonrad@gmail.com>, 2013,2015\\n\"\n\"Language-Team: Polish (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/pl/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: pl\\n\"\n\"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"Debug Toolbar\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(cache_calls)d wywołanie w %(time).2fms\"\nmsgstr[1] \"%(cache_calls)d wywołania w %(time).2fms\"\nmsgstr[2] \"%(cache_calls)d wywołań w %(time).2fms\"\nmsgstr[3] \"%(cache_calls)d wywołań w %(time).2fms\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"Wywołań z cache z %(count)d backendu\"\nmsgstr[1] \"Wywołań z cache z %(count)d backendów\"\nmsgstr[2] \"Wywołań z cache z %(count)d backendów\"\nmsgstr[3] \"Wywołań z cache z %(count)d backendów\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"Nagłówki\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"Profilowanie\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"Przechwycone przekierowania\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"Zapytania\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"<brak widoku>\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<niedostępny>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Ustawienia\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"%(num_receivers)d orbiorca 1 sygnału\"\nmsgstr[1] \"%(num_receivers)d odbiorców 1 sygnału\"\nmsgstr[2] \"%(num_receivers)d odbiorców 1 sygnału\"\nmsgstr[3] \"%(num_receivers)d odbiorców 1 sygnału\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_receivers)d odbiora %(num_signals)d sygnału\"\nmsgstr[1] \"%(num_receivers)d odbiorców %(num_signals)d sygnałów\"\nmsgstr[2] \"%(num_receivers)d odbiorców %(num_signals)d sygnałów\"\nmsgstr[3] \"%(num_receivers)d odbiorców %(num_signals)d sygnałów\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Sygnały\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"Przeczaj niepopełnione\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"Przeczytaj popełnione\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"Autocommit\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"Bezczynny\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Aktywne\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"W transakcji\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"W błędzie\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"Nieznane\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"Pliki statyczne (znaleziono %(num_found)s, użyto %(num_used)s)\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"Pliki statyczne\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"%(num_used)s użyty plików\"\nmsgstr[1] \"%(num_used)s użyte plików\"\nmsgstr[2] \"%(num_used)s użytych plików\"\nmsgstr[3] \"%(num_used)s użytych plików\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Templatki\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Templatki (%(num_templates)s wyrenderowano)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Całkowity czas: %0.2fms\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Czas\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"%(utime)0.3f ms\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"%(stime)0.3f ms\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"%(total)0.3f ms\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Całkowity czas\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"%(total_time)0.3f ms\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"Przełączenia kontekstu\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Wersje\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"Ukryj toolbar\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Ukryj\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Podsumowanie\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"Polecenia\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"Wywołania\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Typ\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"Backend\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Klucz\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Wartość\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Akcja\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Zmienna\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Wywołanie\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Ilość\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"Pokaż informacje\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Brak danych GET\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Brak danych POST\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Ustawienie\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Sygnał\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Odbiorcy\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)s zapytanie\"\nmsgstr[1] \"%(num)s zapytania\"\nmsgstr[2] \"%(num)s zapytań\"\nmsgstr[3] \"%(num)s zapytań\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Zapytanie\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Oś czasu\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Połączenie:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"Poziom izolacji:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Status transakcji:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(nieznany)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"Żadne zapytania SQL nie zostały odnotowane podczas tego zapytania.\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"Wykonane zapytanie SQL\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"Baza danych\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Błąd\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Pusty zbiór\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"Brak\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Lokalizacja\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"Ścieżka templatki\"\nmsgstr[1] \"Ścieżki templatek\"\nmsgstr[2] \"Ścieżki templatek\"\nmsgstr[3] \"Ścieżki templatek\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"Templatki\"\nmsgstr[1] \"Templatki\"\nmsgstr[2] \"Templatki\"\nmsgstr[3] \"Templatki\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Zasób\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Wersja\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"\"\n"
  },
  {
    "path": "debug_toolbar/locale/pt/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# José Durães <jdmduraes@gmail.com>, 2014\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: José Durães <jdmduraes@gmail.com>, 2014\\n\"\n\"Language-Team: Portuguese (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/pt/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: pt\\n\"\n\"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"Intercetar redirecionamentos\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"Pedido\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<indisponível>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Configurações\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Sinais\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"Variável\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Acção\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"Erro\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"Desconhecido\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"Ficheiros estáticos\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Templates\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Templates (%(num_templates)s renderizados)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Total: %0.2fms\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Tempo\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Versões\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"Ocultar barra\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Ocultar\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"Mostrar barra\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"Desactivar para o seguinte e sucessivos pedidos\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"Activar para o próximo e sucessivos pedidos\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Resumo\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"Comandos\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Chave\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Valor\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"Método\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Acção\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Variável\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Sem dados GET\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"dados POST\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Sem variáveis POST\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Configurações\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Sinal\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Receptores\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Estado da transacção:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(desconhecido)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"Nenhuma query SQL foi registada durante este pedido.\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"SQL Executado\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Erro\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Set vazio\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"(prefixo %(prefix)s)\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"Nenhum\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"Ficheiro estático\"\nmsgstr[1] \"Ficheiros estáticos\"\nmsgstr[2] \"Ficheiros estáticos\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Localização\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"Caminho da Template\"\nmsgstr[2] \"Caminho da Template\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"\"\nmsgstr[1] \"Processador de Contexto\"\nmsgstr[2] \"Processador de Contexto\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Recurso\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"Pacote\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Nome\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Versão\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"Localização\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"\"\n"
  },
  {
    "path": "debug_toolbar/locale/pt_BR/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Fábio C. Barrionuevo da Luz <bnafta@gmail.com>, 2013-2014\n# Gladson <gladsonbrito@gmail.com>, 2017\n# Percy Pérez-Pinedo, 2009\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Gladson <gladsonbrito@gmail.com>, 2017\\n\"\n\"Language-Team: Portuguese (Brazil) (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/pt_BR/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: pt_BR\\n\"\n\"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"Debug Toolbar\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(cache_calls)d chamada em %(time).2fms\"\nmsgstr[1] \"%(cache_calls)d chamadas em %(time).2fms\"\nmsgstr[2] \"%(cache_calls)d chamadas em %(time).2fms\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"Chamadas ao cache de %(count)d backend\"\nmsgstr[1] \"Chamadas ao cache de %(count)d backends\"\nmsgstr[2] \"Chamadas ao cache de %(count)d backends\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"Cabeçalhos\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"Profiling\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"Interceptar redirecionamentos\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"Requisição\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"<nenhuma vista>\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<indisponível>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Configurações\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"%(num_receivers)d receptor de 1 sinal\"\nmsgstr[1] \"%(num_receivers)d receptores de 1 sinal\"\nmsgstr[2] \"%(num_receivers)d receptores de 1 sinal\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_receivers)d receptor de %(num_signals)d sinais\"\nmsgstr[1] \"%(num_receivers)d receptores de %(num_signals)d sinais\"\nmsgstr[2] \"%(num_receivers)d receptores de %(num_signals)d sinais\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Sinais\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"Read uncommitted\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"Read committed\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"Leitura repetida\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"Variável\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"Autocommit\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"Ocioso\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Ação\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"Na transação\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"Erro\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"Desconhecido\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"Arquivos estáticos (%(num_found)s encontrados, %(num_used)s sendo utilizados)\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"Arquivos estáticos\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"%(num_used)s arquivo utilizado\"\nmsgstr[1] \"%(num_used)s arquivos utilizados\"\nmsgstr[2] \"%(num_used)s arquivos utilizados\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Templates\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Templates (%(num_templates)s renderizados)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"Sem origem\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Total: %0.2fms\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Tempo\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"Tempo de CPU do usuário\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"%(utime)0.3f ms\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"Tempo de CPU do sistema\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"%(stime)0.3f ms\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"Tempo total de CPU\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"%(total)0.3f ms\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Tempo decorrido\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"%(total_time)0.3f ms\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"Mudanças de contexto\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"%(vcsw)d voluntário, %(ivcsw)d involuntário\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Versões\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"Ocultar barra de ferramentas\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Esconder\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"Mostrar barra de ferramentas\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"Desativar para próximas requisições\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"Habilitar para próximas requisições\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Resumo\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"Total de chamadas\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"Tempo total\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"Acessos ao cache\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"Falhas de cache\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"Comandos\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"Chamadas\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"Argumentos\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"Argumentos\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"Backend\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"Cabeçalhos de Requisição\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Chave\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Valor\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"Cabeçalhos de Resposta\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"Ambiente WSGI\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"Uma vez que o ambiente WSGI herda o ambiente do servidor, apenas um subconjunto significativo é mostrado abaixo.\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"Caminho\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Ação\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Variável\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Chamar\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"CumTime\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"Per\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"TotTime\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Contagem\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"Ver informação\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"Função View\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"Nome da URL\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"Cookies\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"Sem Cookies\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"Dados de Sessão\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"Sem dados de Sessão\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"Dados de GET\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Não há dados de GET\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"Dados de POST\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Não há dados de POST\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Configuração\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Sinais\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Recebedores\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)s consulta\"\nmsgstr[1] \"%(num)s consultas\"\nmsgstr[2] \"%(num)s consultas\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Query\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Linha do tempo\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Conexão:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"Nível de isolamento:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Status da transação:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(unknown)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"Nenhuma consulta SQL foi registrada durante esta requisição.\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"SQL explicada\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"SQL Executada\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"Banco de dados\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"SQL perfilado\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Erro\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"SQL selecionada\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Conjunto vazio\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"Caminho do arquivo estático\"\nmsgstr[1] \"Caminho dos arquivos estáticos\"\nmsgstr[2] \"Caminho dos arquivos estáticos\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"(prefixo %(prefix)s)\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"Nenhum\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"Arquivo estático de app\"\nmsgstr[1] \"Arquivos estáticos de apps\"\nmsgstr[2] \"Arquivos estáticos de apps\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"Arquivo estático\"\nmsgstr[1] \"Arquivos estáticos\"\nmsgstr[2] \"Arquivos estáticos\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"%(payload_count)s arquivo\"\nmsgstr[1] \"%(payload_count)s arquivos\"\nmsgstr[2] \"%(payload_count)s arquivos\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Localização\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"Origem do Template:\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"Caminho do Template\"\nmsgstr[1] \"Caminho do Templates\"\nmsgstr[2] \"Caminho do Templates\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"Template\"\nmsgstr[1] \"Templates\"\nmsgstr[2] \"Templates\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"Alternar contexto\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"\"\nmsgstr[1] \"Processador do Contexto\"\nmsgstr[2] \"Processador do Contexto\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"Uso de recursos\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Recurso\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"Cronometragem do Navegador\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"Atributo de Cronometragem\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"Tempo desde início de navegação (+duração)\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"Pacote\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Nome\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Versão\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"Localização:\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"O Django Debug Toolbar interceptou um redirecionamento para a URL acima para fins de visualização de depuração. Você pode clicar no link acima para continuar com o redirecionamento normalmente.\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"Os dados para este painel não está mais disponível. Por favor, recarregue a página e tente novamente.\"\n"
  },
  {
    "path": "debug_toolbar/locale/ru/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Andrei Satsevich, 2025\n# Dmitri Bogomolov <4glitch@gmail.com>, 2014\n# Ilya Baryshev <baryshev@gmail.com>, 2013\n# Mikhail Korobov, 2009\n# Алексей Борискин <sun.void@gmail.com>, 2013,2015,2024\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Andrei Satsevich, 2025\\n\"\n\"Language-Team: Russian (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/ru/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: ru\\n\"\n\"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"Панель отладки\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"Форма с идентификатором \\\"{form_id}\\\" содержит файл, но не имеет атрибута enctype=\\\"multipart/form-data\\\".\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"Форма содержит файл, но не имеет атрибута enctype=\\\"multipart/form-data\\\".\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"Элемент ввода ссылается на форму с id \\\"{form_id}\\\", но форма не имеет атрибута enctype=\\\"multipart/form-data\\\".\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"Оповещения\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Кэш\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(cache_calls)d обращение за %(time).2fms\"\nmsgstr[1] \"%(cache_calls)d обращения за %(time).2fms\"\nmsgstr[2] \"%(cache_calls)d обращений за %(time).2fms\"\nmsgstr[3] \"%(cache_calls)d обращений за %(time).2fms\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"Обращения к кэшу от %(count)d бэкенда\"\nmsgstr[1] \"Обращения к кэшу от %(count)d бэкендов\"\nmsgstr[2] \"Обращения к кэшу от %(count)d бэкендов\"\nmsgstr[3] \"Обращения к кэшу от %(count)d бэкендов\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"Заголовки\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"История\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"Профилирование\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"Перехват редиректов\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"Запрос\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"<нет view>\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<недоступно>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Настройки\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"Настройки из %s\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"%(num_receivers)d получатель 1 сигнала\"\nmsgstr[1] \"%(num_receivers)d получателя 1 сигнала\"\nmsgstr[2] \"%(num_receivers)d получателей 1 сигнала\"\nmsgstr[3] \"%(num_receivers)d получателей 1 сигнала\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_receivers)d получатель %(num_signals)d сигнала(ов)\"\nmsgstr[1] \"%(num_receivers)d получателя %(num_signals)d сигнала(ов)\"\nmsgstr[2] \"%(num_receivers)d получателей %(num_signals)d сигнала(ов)\"\nmsgstr[3] \"%(num_receivers)d получателей %(num_signals)d сигнала(ов)\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Сигналы\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"Read uncommitted\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"Read committed\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"Repeatable read\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"Serializable\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"Autocommit\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"Ожидание\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Действие\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"В транзакции\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"Ошибка\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"Неизвестно\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"%(query_count)d запрос за %(sql_time).2f мс \"\nmsgstr[1] \"%(query_count)d запросов за %(sql_time).2f мс\"\nmsgstr[2] \"%(query_count)d запросов за %(sql_time).2f мс\"\nmsgstr[3] \"%(query_count)d запросов за %(sql_time).2f мс\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"SQL-запросы из %(count)d соединения\"\nmsgstr[1] \"SQL-запросы из %(count)d соединений\"\nmsgstr[2] \"SQL-запросы из %(count)d соединений\"\nmsgstr[3] \"SQL-запросы из %(count)d соединений\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"Статические файлы (найдено %(num_found)s, используется %(num_used)s)\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"Статические файлы\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"%(num_used)s файл используется\"\nmsgstr[1] \" %(num_used)s файла используется\"\nmsgstr[2] \"%(num_used)s файлов используется\"\nmsgstr[3] \"%(num_used)s файлов используется\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Шаблоны\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Шаблоны (обработано %(num_templates)s)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"Без происхождения\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Итого: %0.2fms\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Время\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"User CPU time\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"%(utime)0.3f мс\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"System CPU time\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"%(stime)0.3f мс\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"Total CPU time\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"%(total)0.3f мс\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Затраченное время\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"%(total_time)0.3f мс\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"Переключений контекста\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"%(vcsw)d намеренных, %(ivcsw)d вынужденных\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Версии\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"Скрыть панель\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Скрыть\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"Переключатель темы\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"Показать панель\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"Отключить для последующих запросов\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"Включить для последующих запросов\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"Найдены оповещения\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"Оповещения не найдены\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Сводка\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"Всего вызовов\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"Общее время\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"Cache хитов\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"Промахи кэша\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"Команды\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"Вызовы\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Тип\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"Аргументы\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"Именованные аргументы\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"Бэкенд\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"Заголовки запроса\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Заголовок\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Значение\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"Заголовки ответа\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"WSGI-окружение\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"Так как WSGI-окружение наследует окружение сервера, ниже отображены лишь те из переменных, которые важны для нужд отладки.\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"Метод\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"Путь\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"Запрос переменных\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"Статус\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Действие\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Переменная\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Вызов\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"КумулВрем\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"ЗаВызов\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"ИтогВремя\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Кол-во\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"View\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"View функция\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"URL Name\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"Cookies\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"Нет cookies\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"Сессия\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"Нет данных в сессии\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"GET\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Нет GET данных\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"POST\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Нет POST данных\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Параметр\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Сигнал\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Получатели сигнала\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)s запрос\"\nmsgstr[1] \"%(num)s запроса\"\nmsgstr[2] \"%(num)s запросов\"\nmsgstr[3] \"%(num)s запросов\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"включая <abbr title=\\\"Similar queries are queries with the same SQL, but potentially different parameters.\\\">%(count)s похожий</abbr>\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"и <abbr title=\\\"Duplicate queries are identical to each other: they execute exactly the same SQL and parameters.\\\">%(dupes)s дубликаты</abbr>\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Запрос\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Временная диаграмма\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"%(count)s похожих запросов.\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"Дублируется %(dupes)s раз.\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Соединение:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"Уровень изоляции:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Статус транзакции:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(неизвестно)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"Во время обработки этого HTTP-запроса не было записано ни одного SQL-запроса.\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"SQL Explain\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"Запрос\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"База данных\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"Профилирование SQL\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Ошибка\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"Выбранные SQL-запросы\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Ничего, ноль строк\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"Путь к статическим файлам\"\nmsgstr[1] \"Пути к статическим файлам\"\nmsgstr[2] \"Пути к статическим файлам\"\nmsgstr[3] \"Пути к статическим файлам\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"(префикс %(prefix)s)\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"Нет\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"Приложение, использующее статические файлы\"\nmsgstr[1] \"Приложения, использующие статические файлы\"\nmsgstr[2] \"Приложения, использующие статические файлы\"\nmsgstr[3] \"Приложения, использующие статические файлы\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"Статический файл\"\nmsgstr[1] \"Статические файлы\"\nmsgstr[2] \"Статические файлы\"\nmsgstr[3] \"Статические файлы\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"%(payload_count)s файл\"\nmsgstr[1] \"%(payload_count)s файла\"\nmsgstr[2] \"%(payload_count)s файлов\"\nmsgstr[3] \"%(payload_count)s файлов\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Место\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"Источник шаблона:\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"Путь к шаблонам\"\nmsgstr[1] \"Пути к шаблонам\"\nmsgstr[2] \"Пути к шаблонам\"\nmsgstr[3] \"Пути к шаблонам\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"Шаблон\"\nmsgstr[1] \"Шаблоны\"\nmsgstr[2] \"Шаблоны\"\nmsgstr[3] \"Шаблоны\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"Контекст\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"Контекст процессор\"\nmsgstr[1] \"Контекст процессоры\"\nmsgstr[2] \"Контекст процессоры\"\nmsgstr[3] \"Контекст процессоры\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"Потребление ресурсов\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"Браузерное время\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"Событие\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"Время с начала навигации (+продолжительность)\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"Пакет\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Название\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Версия\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"Адрес:\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"Django Debug Toolbar в перехватил редирект на адрес, указанный выше. Вы можете нажать на ссылку, чтобы выполнить переход самостоятельно.\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"Данные этой панели больше недоступны. Пожалуйста, перезагрузите страницу и попробуйте ещё раз.\"\n"
  },
  {
    "path": "debug_toolbar/locale/sk/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# 18f25ad6fa9930fc67cb11aca9d16a27, 2012\n# 18f25ad6fa9930fc67cb11aca9d16a27, 2013\n# Rastislav Kober <kybiky@gmail.com>, 2012\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: 18f25ad6fa9930fc67cb11aca9d16a27, 2013\\n\"\n\"Language-Team: Slovak (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/sk/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: sk\\n\"\n\"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(cache_calls)d volanie za %(time).2fms\"\nmsgstr[1] \"%(cache_calls)d volaní za %(time).2fms\"\nmsgstr[2] \"%(cache_calls)d volaní za %(time).2fms\"\nmsgstr[3] \"%(cache_calls)d volaní za %(time).2fms\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"Cache volania z %(count)d backendu\"\nmsgstr[1] \"Cache volania z %(count)d backendov\"\nmsgstr[2] \"Cache volania z %(count)d backendov\"\nmsgstr[3] \"Cache volania z %(count)d backendov\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"Hlavičky\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"Analýza\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"Zachytiť presmerovania\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"Požiadavka\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"<ziadne zobrazenie>\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<nedostupny>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Nastavenia\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"%(num_receivers)d príjemca 1 signálu\"\nmsgstr[1] \"%(num_receivers)d príjemcov 1 signálu\"\nmsgstr[2] \"%(num_receivers)d príjemcov 1 signálu\"\nmsgstr[3] \"%(num_receivers)d príjemcov 1 signálu\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_receivers)d príjemca %(num_signals)d signálov\"\nmsgstr[1] \"%(num_receivers)d príjemcov %(num_signals)d signálov\"\nmsgstr[2] \"%(num_receivers)d príjemcov %(num_signals)d signálov\"\nmsgstr[3] \"%(num_receivers)d príjemcov %(num_signals)d signálov\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Signály\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"Read uncommitted\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"Read committed\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"Opakovateľné čítanie\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"Premenná\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"Autocommit\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"Nečinný\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Akcia\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"Stav transakcie:\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"Chyba\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"(neznámy)\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"Statické súbory (%(num_found)s nájdených, %(num_used)s použitých)\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"Statické súbory\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"%(num_used)s použitý súbor\"\nmsgstr[1] \"%(num_used)s použitých súborov\"\nmsgstr[2] \"%(num_used)s použitých súborov\"\nmsgstr[3] \"%(num_used)s použitých súborov\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Šablóny\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Šablóny (%(num_templates)s spracovaných)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Celkovo: %0.2fms\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Čas\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"Užívateľský čas CPU\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"%(utime)0.3f ms\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"Systémový čas CPU\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"%(stime)0.3f ms\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"Celkový čas CPU\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"%(total)0.3f ms\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Uplynutý čas\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"%(total_time)0.3f ms\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"Prepnutí kontextu\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"%(vcsw)d dobrovoľných, %(ivcsw)d nedobrovoľných\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Verzie\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"Skryť panel nástrojov\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Skryť\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"Zobraziť panel nástrojov\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"Zakázať pre ďalšie a nasledujúce požiadavky\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"Povoliť pre ďalšie a nasledujúce požiadavky\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Zhrnutie\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"Celkovo volaní\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"Celkový čas\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"Volaní cache\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"Vynechania cache\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"Príkazy\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"Volania\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Typ\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"Argumenty\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"Kľúčové argumenty\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"Backend\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"Hlavičky požiadavky\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Kľúč\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Hodnota\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"Hlavičky odpovede\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"WSGI prostredie\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"Keďže WSGI prostredie dedí z prostredia servera, je nižšie zobrazená iba významná podmnožina.\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"Cesta\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Akcia\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Premenná\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Volanie\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"CumTime\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"Za\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"TotTime\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Počet\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"Zobraziť informácie\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"View funkcia\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"URL meno\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"Cookies\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"Žiadne cookies\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"Dáta relácie\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"Žiadne dáta relácie\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"GET dáta\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Žiadne GET dáta\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"POST dáta\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Žiadne POST dáta\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Nastavenie\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Signál\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Príjemcovia\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)s dopyt\"\nmsgstr[1] \"%(num)s dopytov\"\nmsgstr[2] \"%(num)s dopytov\"\nmsgstr[3] \"%(num)s dopytov\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Dopyt\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Časová os\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Pripojenie:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"Úroveň izolácie:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Stav transakcie:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(neznámy)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"V priebehu tejto požiadavky neboli zaznamenané žiadne SQL dopyty.\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"SQL vysvetlené\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"Vykonané SQL\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"Databáza\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"SQL profilované\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Chyba\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"SQL označené\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Prázdny rad\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"Cesta k statickému súboru\"\nmsgstr[1] \"Cesty k statickým súborom\"\nmsgstr[2] \"Cesty k statickým súborom\"\nmsgstr[3] \"Cesty k statickým súborom\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"(prefix %(prefix)s)\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"Žiadny\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"Aplikácia pre statické súbory\"\nmsgstr[1] \"Aplikácie pre statické súbory\"\nmsgstr[2] \"Aplikácie pre statické súbory\"\nmsgstr[3] \"Aplikácie pre statické súbory\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"Statické súbory\"\nmsgstr[3] \"Statické súbory\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"%(payload_count)s súbor\"\nmsgstr[1] \"%(payload_count)s súborov\"\nmsgstr[2] \"%(payload_count)s súborov\"\nmsgstr[3] \"%(payload_count)s súborov\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Poloha\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"Zdrojový kód šablóny:\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"Cesta k šablóne\"\nmsgstr[1] \"Cesta k šablóne\"\nmsgstr[2] \"Cesta k šablóne\"\nmsgstr[3] \"Cesta k šablóne\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"Šablóna\"\nmsgstr[1] \"Šablóna\"\nmsgstr[2] \"Šablóna\"\nmsgstr[3] \"Šablóna\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"Prepnúť kontext\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"Spracovateľ kontextu\"\nmsgstr[1] \"Spracovateľ kontextu\"\nmsgstr[2] \"Spracovateľ kontextu\"\nmsgstr[3] \"Spracovateľ kontextu\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"Využitie prostriedkov\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Prostriedok\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"Čas prehliadača\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"Časový atribút\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"Čas od spustenia navigácie (+trvanie)\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Meno\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Verzia\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"Poloha:\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"Django Debug Toolbar zachytil presmerovanie na vyššie uvedenú URL pre účely ladenia. Pre normálne presmerovanie môžete kliknúť na vyššie uvedený odkaz.\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"Dáta pre tento panel už nie sú k dispozícii. Načítajte si prosím stránku a skúste to znova.\"\n"
  },
  {
    "path": "debug_toolbar/locale/sv_SE/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Alex Nordlund <deep.alexander@gmail.com>, 2012-2013\n# Alex Nordlund <deep.alexander@gmail.com>, 2012\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Alex Nordlund <deep.alexander@gmail.com>, 2012-2013\\n\"\n\"Language-Team: Swedish (Sweden) (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/sv_SE/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: sv_SE\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"Profilering\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Inställningar\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Signaler\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"Variabel\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"Åtgärd\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"Felmeddelande\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"(okänd)\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"Statiska filer\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Mallar\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Tid\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Versioner\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Dölj\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Sammanfattning\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Nyckel\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Värde\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"Sökväg\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Åtgärd\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Variabel\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Räkna\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"Visa informationen\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Ingen GET data\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Ingen POST data\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Inställning\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Signal\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Mottagare\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Fråga\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Anslutning:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(okänd)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"Utförd SQL\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"Databas\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Felmeddelande\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Tomt set\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"Inget\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"\"\nmsgstr[1] \"Statiska filer\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Plats\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"Mall\"\nmsgstr[1] \"Mallar\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Resurs\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Namn\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Version\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"\"\n"
  },
  {
    "path": "debug_toolbar/locale/tr/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Ertuğrul Keremoğlu, 2025\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-10-16 19:11-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Ertuğrul Keremoğlu, 2025\\n\"\n\"Language-Team: Turkish (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/tr/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: tr\\n\"\n\"Plural-Forms: nplurals=2; plural=(n > 1);\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"Hata Ayıklama Araç Çubuğu\"\n\n#: models.py:11\nmsgid \"history entry\"\nmsgstr \"geçmiş kayıt\"\n\n#: models.py:12\nmsgid \"history entries\"\nmsgstr \"geçmiş kayıtlar\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\\\"id\\\" değeri \\\"{form_id}\\\" olan form bir file-input içeriyor, ancak enctype=\\\"multipart/form-data\\\" attribute'sine sahip değil.\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"Form bir file-input içeriyor, ancak enctype=\\\"multipart/form-data\\\" attribute'sine sahip değil.\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"Bir input elementi, \\\"id\\\" değeri \\\"{form_id}\\\" olan forma referans veriyor, ancak form enctype=\\\"multipart/form-data\\\" attribute'sine sahip değil.\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"Uyarılar\"\n\n#: panels/cache.py:170\nmsgid \"Cache\"\nmsgstr \"Önbellek\"\n\n#: panels/cache.py:177\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(time).2f ms'de %(cache_calls)d çağrı\"\nmsgstr[1] \"%(time).2fms'de %(cache_calls)d çağrı\"\n\n#: panels/cache.py:186\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"%(count)d arka uçtan yapılan önbellek çağrıları\"\nmsgstr[1] \"%(count)d arka uçtan yapılan önbellek çağrıları\"\n\n#: panels/community.py:13\nmsgid \"Community\"\nmsgstr \"Komünite\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"Header'ler\"\n\n#: panels/history/panel.py:20 panels/history/panel.py:21\nmsgid \"History\"\nmsgstr \"Geçmiş\"\n\n#: panels/profiling.py:156\nmsgid \"Profiling\"\nmsgstr \"Profilleme\"\n\n#: panels/redirects.py:18\nmsgid \"Intercept redirects\"\nmsgstr \"Yönlendirmeleri yakala\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"İstek\"\n\n#: panels/request.py:36\nmsgid \"<no view>\"\nmsgstr \"<no view>\"\n\n#: panels/request.py:53\nmsgid \"<unavailable>\"\nmsgstr \"<unavailable>\"\n\n#: panels/settings.py:19\nmsgid \"Settings\"\nmsgstr \"Ayarlar\"\n\n#: panels/settings.py:22\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"Ayarlar (%s modülü)\"\n\n#: panels/signals.py:59\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"1 sinyalin %(num_receivers)d alıcısı\"\nmsgstr[1] \"1 sinyalin %(num_receivers)d alıcısı\"\n\n#: panels/signals.py:64\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_signals)d sinyalin %(num_receivers)d alıcısı\"\nmsgstr[1] \"%(num_signals)d sinyalin %(num_receivers)d alıcısı\"\n\n#: panels/signals.py:69\nmsgid \"Signals\"\nmsgstr \"Sinyaller\"\n\n#: panels/sql/forms.py:56\nmsgid \"Data for this panel isn't available anymore.\"\nmsgstr \"Bu panele ait veriler artık mevcut değil.\"\n\n#: panels/sql/forms.py:68\nmsgid \"Invalid query id.\"\nmsgstr \"Geçersiz sorgu ID'si\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:43\nmsgid \"Read uncommitted\"\nmsgstr \"Read uncommitted\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:45\nmsgid \"Read committed\"\nmsgstr \"Read committed\"\n\n#: panels/sql/panel.py:34 panels/sql/panel.py:47\nmsgid \"Repeatable read\"\nmsgstr \"Repeatable read\"\n\n#: panels/sql/panel.py:35 panels/sql/panel.py:49\nmsgid \"Serializable\"\nmsgstr \"Serializable\"\n\n#: panels/sql/panel.py:41\nmsgid \"Autocommit\"\nmsgstr \"Autocommit\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"Idle\"\nmsgstr \"Idle\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"Active\"\nmsgstr \"Active\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"In transaction\"\nmsgstr \"In transaction\"\n\n#: panels/sql/panel.py:66 panels/sql/panel.py:76\nmsgid \"In error\"\nmsgstr \"In error\"\n\n#: panels/sql/panel.py:67 panels/sql/panel.py:77\nmsgid \"Unknown\"\nmsgstr \"Bilinmeyen\"\n\n#: panels/sql/panel.py:165\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:172\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"%(sql_time).2fms'de %(query_count)d sorgu\"\nmsgstr[1] \"%(sql_time).2fms'de %(query_count)d sorgu\"\n\n#: panels/sql/panel.py:184\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"%(count)d bağlantıdan SQL sorguları\"\nmsgstr[1] \"%(count)d bağlantıdan SQL sorguları\"\n\n#: panels/staticfiles.py:47\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"Statik dosyalar (bulunan %(num_found)s, kullanılan %(num_used)s)\"\n\n#: panels/staticfiles.py:81\nmsgid \"Static files\"\nmsgstr \"Statik dosyalar\"\n\n#: panels/staticfiles.py:87\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"%(num_used)s dosya kullanıldı\"\nmsgstr[1] \"%(num_used)s dosya kullanıldı\"\n\n#: panels/templates/panel.py:104\nmsgid \"Templates\"\nmsgstr \"Şablonlar\"\n\n#: panels/templates/panel.py:109\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Şablonlar (%(num_templates)s işlenen)\"\n\n#: panels/templates/panel.py:199\nmsgid \"No origin\"\nmsgstr \"Kaynak yok\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Toplam: %0.2fms\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Zaman\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"Kullanıcı CPU süresi\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f msec\"\nmsgstr \"%(utime)0.3f ms\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"Sistem CPU süresi\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f msec\"\nmsgstr \"%(stime)0.3f ms\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"Toplam CPU süresi\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f msec\"\nmsgstr \"%(total)0.3f ms\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Geçen süre\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f msec\"\nmsgstr \"%(total_time)0.3f ms\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"Context switches\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\n\n#: panels/versions.py:21\nmsgid \"Versions\"\nmsgstr \"Versiyonlar\"\n\n#: templates/debug_toolbar/base.html:22\nmsgid \"Hide toolbar\"\nmsgstr \"Araç çubuğunu gizle\"\n\n#: templates/debug_toolbar/base.html:22\nmsgid \"Hide\"\nmsgstr \"Gizle\"\n\n#: templates/debug_toolbar/base.html:24 templates/debug_toolbar/base.html:25\nmsgid \"Toggle Theme\"\nmsgstr \"Temayı Değiştir\"\n\n#: templates/debug_toolbar/base.html:34\nmsgid \"Show toolbar\"\nmsgstr \"Araç çubuğunu göster\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"Sonraki istekler için devre dışı bırak\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"Sonraki istekler için etkinleştir\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"Uyarılar bulundu\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"Uyarı bulunmadı\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Özet\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"Toplam çağrılar\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"Toplam süre\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"Önbellek isabetleri\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"Önbellek ıskaları\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"Komutlar\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"Çağrılar\"\n\n#: templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/sql.html:36\nmsgid \"Time (ms)\"\nmsgstr \"Süre (ms)\"\n\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Tip\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"Argümanlar\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"Anahtar kelime argümanları\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"Arka uç\"\n\n#: templates/debug_toolbar/panels/community.html:5\nmsgid \"Community & Contribution\"\nmsgstr \"Komünite & Katkıda Bulunma\"\n\n#: templates/debug_toolbar/panels/community.html:8\nmsgid \"\"\n\"Want to contribute to Django Debug Toolbar? Get involved in our community!\"\nmsgstr \"Django Debug Toolbar'a katkıda bulunmak ister misiniz? Komünitemizin içinde yerinizi alın!\"\n\n#: templates/debug_toolbar/panels/community.html:14\nmsgid \"Join Discussions\"\nmsgstr \"Tartışmalara Katıl\"\n\n#: templates/debug_toolbar/panels/community.html:19\nmsgid \"View Issues\"\nmsgstr \"Sorunları Gör\"\n\n#: templates/debug_toolbar/panels/community.html:24\nmsgid \"Contribution Guide\"\nmsgstr \"Katkıda Bulunma Rehberi\"\n\n#: templates/debug_toolbar/panels/community.html:31\nmsgid \"Django Debug Toolbar Documentation\"\nmsgstr \"Django Debug Toolbar Dökümantasyonu\"\n\n#: templates/debug_toolbar/panels/community.html:34\nmsgid \"\"\n\"Explore the official documentation to learn more about Django Debug Toolbar.\"\nmsgstr \"Django Debug Toolbar hakkında daha fazla bilgi edinmek için resmi dokümantasyonu inceleyin.\"\n\n#: templates/debug_toolbar/panels/community.html:39\nmsgid \"Read Documentation\"\nmsgstr \"Dökümantasyonu Oku\"\n\n#: templates/debug_toolbar/panels/community.html:44\nmsgid \"How to Use Django Debug Toolbar\"\nmsgstr \"Django Debug Toolbar Nasıl Kullanılır\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"İstek header'leri\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Anahtar\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Değer\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"Cevap header'leri\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"WSGI ortamı\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"WSGI ortamı, sunucunun ortamını devraldığından, aşağıda yalnızca önemli bir alt kümesi gösterilmiştir.\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"Metot\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"Yol\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"İstek Değişkenleri\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"Durum\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Eylem\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Değişken\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Çağrı\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"Kümülatif Zaman\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"Çağrı başına\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"Toplam Zaman\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Adet\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"View bilgileri\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"View fonksiyonu\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"URL adı\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"Çerezler\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"Çerez yok\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"Oturum verileri\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"Oturum verisi yok\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"GET verileri\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"GET verisi yok\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"POST verileri\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"POST verisi yok\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Ayar\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Sinyal\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Alıcılar\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)s sorgu\"\nmsgstr[1] \"%(num)s sorgu\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"benzer <abbr title=\\\"Similar queries are queries with the same SQL, but potentially different parameters.\\\">%(count)s tane</abbr> dahil\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"ve <abbr title=\\\"Duplicate queries are identical to each other: they execute exactly the same SQL and parameters.\\\">%(dupes)s tekrarlanan</abbr>\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Sorgu\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Zaman çizelgesi\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"%(count)s benzer sorgu.\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"%(dupes)s defa tekrarlandı.\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Bağlantı:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"İzolasyon seviyesi:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Transaction durumu:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(bilinmiyor)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"Bu istek sırasında hiçbir SQL sorgusu kaydedilmedi.\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:3\nmsgid \"SQL explained\"\nmsgstr \"SQL sorgu planı\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"Çalıştırılan SQL\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"Veritabanı\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:3\nmsgid \"SQL profiled\"\nmsgstr \"Profillenen SQL\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Hata\"\n\n#: templates/debug_toolbar/panels/sql_select.html:3\nmsgid \"SQL selected\"\nmsgstr \"Seçilen SQL\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Boş küme\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"Statik dosya yolu\"\nmsgstr[1] \"Statik dosya yolları\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"(ön ek %(prefix)s)\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"None\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"Statik dosya uygulaması\"\nmsgstr[1] \"Statik dosya uygulamaları\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"Statik dosya\"\nmsgstr[1] \"Statik dosyalar\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"%(payload_count)s dosya\"\nmsgstr[1] \"%(payload_count)s dosya\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Konum\"\n\n#: templates/debug_toolbar/panels/template_source.html:3\nmsgid \"Template source:\"\nmsgstr \"Şablon kaynak kodu:\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"Şablon yolu\"\nmsgstr[1] \"Şablon yolları\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"Şablon\"\nmsgstr[1] \"Şablonlar\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"Context'i aç/kapat\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"Context işlemcisi\"\nmsgstr[1] \"Context işlemcileri\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"Kaynak kullanımı\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Kaynak\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"Tarayıcı zamanlaması\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"Zamanlama değerleri\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Milliseconds since navigation start (+length)\"\nmsgstr \"Gezinme başlangıcından bu yana geçen milisaniyeler (+uzunluk)\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"Paket\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"İsim\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Versiyon\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"Konum:\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"Django Hata Ayıklama Araç Çubuğu, hata ayıklama amacıyla yukarıdaki URL'ye yapılan yönlendirmeyi durdurdu. Yönlendirmeye devam etmek için yukarıdaki bağlantıya tıklayabilirsiniz.\"\n\n#: views.py:18\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"Bu panele ait veriler artık mevcut değil. Lütfen sayfayı yeniden yükleyin ve tekrar deneyin.\"\n"
  },
  {
    "path": "debug_toolbar/locale/uk/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Illia Volochii <illia.volochii@gmail.com>, 2017\n# Sergey Lysach <sergikoff88@gmail.com>, 2013\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Illia Volochii <illia.volochii@gmail.com>, 2017\\n\"\n\"Language-Team: Ukrainian (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/uk/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: uk\\n\"\n\"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"Панель Інструментів Налагодження\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"Кеш\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(cache_calls)d виклик за %(time).2f мс\"\nmsgstr[1] \"%(cache_calls)d виклики за %(time).2f мс\"\nmsgstr[2] \"%(cache_calls)d викликів за %(time).2f мс\"\nmsgstr[3] \"%(cache_calls)d викликів за %(time).2f мс\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"Виклики кешу з %(count)d бекенду\"\nmsgstr[1] \"Виклики кешу із %(count)d бекендів\"\nmsgstr[2] \"Виклики кешу із %(count)d бекендів\"\nmsgstr[3] \"Виклики кешу із %(count)d бекендів\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"Заголовки\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"Профілювання\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"Переривати запити\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"Запит\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"<немає відображення>\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<відсутнє>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"Налаштування\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"%(num_receivers)d отримувач 1 сигналу\"\nmsgstr[1] \"%(num_receivers)d отримувача 1 сигналу\"\nmsgstr[2] \"%(num_receivers)d отримувачів 1 сигналу\"\nmsgstr[3] \"%(num_receivers)d отримувачів 1 сигналу\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_receivers)d отримувач %(num_signals)d сигналів\"\nmsgstr[1] \"%(num_receivers)d отримувача %(num_signals)d сигналів\"\nmsgstr[2] \"%(num_receivers)d отримувачів %(num_signals)d сигналів\"\nmsgstr[3] \"%(num_receivers)d отримувачів %(num_signals)d сигналів\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"Сигнали\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"Автофіксація\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\nmsgstr[2] \"\"\nmsgstr[3] \"\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"Статичні файли (знайдено %(num_found)s, використано %(num_used)s)\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"Статичні файли\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"Використано %(num_used)s файл\"\nmsgstr[1] \"Використано %(num_used)s файли\"\nmsgstr[2] \"Використано %(num_used)s файлів\"\nmsgstr[3] \"Використано %(num_used)s файлів\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"Шаблони\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Шаблони (оброблено %(num_templates)s)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"Немає походження\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU: %(cum)0.2f мс (%(total)0.2f мс)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Загалом: %0.2f мс\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Час\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"Користувацький час CPU\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"%(utime)0.3f мс\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"Системний час CPU\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"%(stime)0.3f мс\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"Загальний час CPU\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"%(total)0.3f мс\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"Витрачений час\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"%(total_time)0.3f мс\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"Перемикачів контексту\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"навмисних - %(vcsw)d, мимовільних - %(ivcsw)d\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"Версії\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"Сховати панель інструментів\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"Сховати\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"Показати панель інструментів\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"Відключити для наступного і подальших запитів\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"Включити для наступного і подальших запитів\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Резюме\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"Загальна кількість викликів\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"Загальний час\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"Кеш-попадання\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"Кеш-промахи\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"Команди\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"Виклики\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Тип\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"Аргументи\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"Іменовані аргументи\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"Бекенд\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"Заголовки запиту\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Ключ\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Значення\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"Заголовки відповіді\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"Середовище WSGI\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"Оскільки середовище WSGI успадковує середовище сервера, тут показано лише найважливішу частину.\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"Шлях\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Подія\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"Змінна\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Виклик\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"Кумул. час\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"За виклик\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"Заг. час\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Кількість\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"Інформація про відображення\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"Функція відображення\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"Імʼя URL\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"Куки\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"Немає куків\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"Дані сесії\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"Немає даних сесії\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"GET дані\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"Немає GET даних\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"POST дані\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"Немає POST даних\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Налаштування\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Сигнал\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Отримувачі сигнала\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)s запит\"\nmsgstr[1] \"%(num)s запити\"\nmsgstr[2] \"%(num)s запитів\"\nmsgstr[3] \"%(num)s запитів\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"Запит\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Лінія часу\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Підключення:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"Рівень ізоляції:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Статус транзакції:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"Жодного SQL запиту не було записано протягом цього запиту\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"Виконаний SQL запит\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"База даних\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Помилка\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Порожня множина\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"Шлях до статичних файлів\"\nmsgstr[1] \"Шляхи до статичних файлів\"\nmsgstr[2] \"Шляхи до статичних файлів\"\nmsgstr[3] \"Шляхи до статичних файлів\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"(префікс %(prefix)s)\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"Немає\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"Застосунок, який використовує статичні файли\"\nmsgstr[1] \"Застосунки, які використовують статичні файли\"\nmsgstr[2] \"Застосунки, які використовують статичні файли\"\nmsgstr[3] \"Застосунки, які використовують статичні файли\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"Статичний файл\"\nmsgstr[1] \"Статичні файли\"\nmsgstr[2] \"Статичні файли\"\nmsgstr[3] \"Статичні файли\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"%(payload_count)s файл\"\nmsgstr[1] \"%(payload_count)s файли\"\nmsgstr[2] \"%(payload_count)s файлів\"\nmsgstr[3] \"%(payload_count)s файлів\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Місце\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"Джерело шаблону:\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"Шлях до шаблонів\"\nmsgstr[1] \"Шляхи до шаблонів\"\nmsgstr[2] \"Шляхи до шаблонів\"\nmsgstr[3] \"Шляхи до шаблонів\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"Шаблон\"\nmsgstr[1] \"Шаблони\"\nmsgstr[2] \"Шаблонів\"\nmsgstr[3] \"Шаблонів\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"Контекст\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"Процесор контексту\"\nmsgstr[1] \"Процесори контексту\"\nmsgstr[2] \"Процесори контексту\"\nmsgstr[3] \"Процесори контексту\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"Використання ресурсів\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"Хронометраж браузера\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"Атрибут хронометражу\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"Час від початку навігації (+тривалість)\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Імʼя\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Версія\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"Місцезнаходження:\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"Панель Інструментів Налагодження Django перервала перенаправлення до вищевказаного URL задля налагодження перегляду. Ви можете натиснути на посилання вище, щоб продовжити перенаправлення у звичайному режимі.\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"Дані для цієї панелі більше недоступні. Будь ласка, перезавантажте сторінку і спробуйте знову.\"\n"
  },
  {
    "path": "debug_toolbar/locale/uz/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# Hojiakbar Barotov <barotovhojiakbar.me@gmail.com>, 2026\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2025-10-16 19:11-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: Hojiakbar Barotov <barotovhojiakbar.me@gmail.com>, 2026\\n\"\n\"Language-Team: Uzbek (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/uz/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: uz\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"Tekshiruv Paneli\"\n\n#: models.py:11\nmsgid \"history entry\"\nmsgstr \"tarix yozuvi\"\n\n#: models.py:12\nmsgid \"history entries\"\nmsgstr \"tarix yozuvlari\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\\\"{form_id}\\\" identifikatorli forma fayl maydonini o'z ichiga oladi, lekin enctype=\\\"multipart/form-data\\\" atributiga ega emas.\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"Forma fayl maydonini o'z ichiga oladi, lekin enctype=\\\"multipart/form-data\\\" atributiga ega emas.\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"Kiritish elementi \\\"{form_id}\\\" formaga bog'langan, lekin unda enctype=\\\"multipart/form-data\\\" atributi yo'q.\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"Ogohlantirishlar\"\n\n#: panels/cache.py:170\nmsgid \"Cache\"\nmsgstr \"Kesh\"\n\n#: panels/cache.py:177\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(time).2fmillisekundda %(cache_calls)dta chaqiruvlar\"\n\n#: panels/cache.py:186\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"%(count)dta backend'dan kesh chaqiruvlari\"\n\n#: panels/community.py:13\nmsgid \"Community\"\nmsgstr \"Hamjamiyat\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"Sarlavhalar\"\n\n#: panels/history/panel.py:20 panels/history/panel.py:21\nmsgid \"History\"\nmsgstr \"Tarix\"\n\n#: panels/profiling.py:156\nmsgid \"Profiling\"\nmsgstr \"Ishlash tahlili\"\n\n#: panels/redirects.py:18\nmsgid \"Intercept redirects\"\nmsgstr \"Yo‘naltirishni to'xtatish\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"So'rov\"\n\n#: panels/request.py:36\nmsgid \"<no view>\"\nmsgstr \"<view yo'q>\"\n\n#: panels/request.py:53\nmsgid \"<unavailable>\"\nmsgstr \"<mavjud emas>\"\n\n#: panels/settings.py:19\nmsgid \"Settings\"\nmsgstr \"Sozlamalar\"\n\n#: panels/settings.py:22\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"%sdan sozlamalar\"\n\n#: panels/signals.py:59\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"1 signaldan %(num_receivers)dta qabul qiluvchilar\"\n\n#: panels/signals.py:64\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_signals)dta signaldan %(num_receivers)dta qabul qiluvchilar\"\n\n#: panels/signals.py:69\nmsgid \"Signals\"\nmsgstr \"Signallar\"\n\n#: panels/sql/forms.py:56\nmsgid \"Data for this panel isn't available anymore.\"\nmsgstr \"Bu panel uchun ma’lumotlar endi mavjud emas.\"\n\n#: panels/sql/forms.py:68\nmsgid \"Invalid query id.\"\nmsgstr \"So‘rov identifikatori yaroqsiz.\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:43\nmsgid \"Read uncommitted\"\nmsgstr \"Tasdiqlanmaganini o'qish\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:45\nmsgid \"Read committed\"\nmsgstr \"Tasdiqlanganini o'qish\"\n\n#: panels/sql/panel.py:34 panels/sql/panel.py:47\nmsgid \"Repeatable read\"\nmsgstr \"Takrorlanadigan o'qish\"\n\n#: panels/sql/panel.py:35 panels/sql/panel.py:49\nmsgid \"Serializable\"\nmsgstr \"Serializatsiyalangan\"\n\n#: panels/sql/panel.py:41\nmsgid \"Autocommit\"\nmsgstr \"Avtomatik saqlash\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"Idle\"\nmsgstr \"Bo'sh\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"Active\"\nmsgstr \"Aktiv\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"In transaction\"\nmsgstr \"Tranzaksiya ichida\"\n\n#: panels/sql/panel.py:66 panels/sql/panel.py:76\nmsgid \"In error\"\nmsgstr \"Xatolik holatida\"\n\n#: panels/sql/panel.py:67 panels/sql/panel.py:77\nmsgid \"Unknown\"\nmsgstr \"Noma'lum\"\n\n#: panels/sql/panel.py:165\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:172\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"%(sql_time).2fmillisekundda %(query_count)dta so'rovlar\"\n\n#: panels/sql/panel.py:184\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"%(count)dta ulanishdan SQL so'rovlari\"\n\n#: panels/staticfiles.py:47\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"Statik fayllar (%(num_found)sta  topildi, %(num_used)sta ishlatilgan)\"\n\n#: panels/staticfiles.py:81\nmsgid \"Static files\"\nmsgstr \"Statik fayllar\"\n\n#: panels/staticfiles.py:87\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"%(num_used)sta fayl ishlatilgan\"\n\n#: panels/templates/panel.py:104\nmsgid \"Templates\"\nmsgstr \"Shablonlar\"\n\n#: panels/templates/panel.py:109\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"Shablonlar (%(num_templates)sta ishlatilgan)\"\n\n#: panels/templates/panel.py:199\nmsgid \"No origin\"\nmsgstr \"Manbasi yo'q\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU:%(cum)0.2fmillisekund (%(total)0.2fmillisekund)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"Jami: %0.2fmillisekund\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"Vaqt\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"Foydalanuvchi CPU vaqti\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f msec\"\nmsgstr \"%(utime)0.3fmillisekund\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"Sistema CPU vaqti\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f msec\"\nmsgstr \"%(stime)0.3fmillisekund\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"Umumiy CPU vaqti\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f msec\"\nmsgstr \"%(total)0.3fmillisekund\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"O‘tgan vaqt\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f msec\"\nmsgstr \"%(total_time)0.3fmillisekund\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"Kontekst almashishlari\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"%(vcsw)dta ixtiyoriy, %(ivcsw)dta majburiy\"\n\n#: panels/versions.py:21\nmsgid \"Versions\"\nmsgstr \"Versiyalar\"\n\n#: templates/debug_toolbar/base.html:22\nmsgid \"Hide toolbar\"\nmsgstr \"Uskunalar panelini berkitish\"\n\n#: templates/debug_toolbar/base.html:22\nmsgid \"Hide\"\nmsgstr \"Berkitish\"\n\n#: templates/debug_toolbar/base.html:24 templates/debug_toolbar/base.html:25\nmsgid \"Toggle Theme\"\nmsgstr \"Mavzuni almashtirish\"\n\n#: templates/debug_toolbar/base.html:34\nmsgid \"Show toolbar\"\nmsgstr \"Uskunalar panelini ko'rsatish\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"Keyingi so‘rovlar uchun faolsizlantirish\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"Keyingi va keyingi so‘rovlar uchun faollashtirish\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"Ogohlantirishlar topildi\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"Ogohlantirishlar topilmadi\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"Qisqacha ma'lumot\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"Jami chaqiruvlar\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"Umumiy vaqt\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"Keshga tushgan so'rovlar\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"Keshda topilmaganlar\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"Buyruqlar\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"Chaqiruvlar\"\n\n#: templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/sql.html:36\nmsgid \"Time (ms)\"\nmsgstr \"Vaqt (ms)\"\n\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"Tur\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"Argumentlar\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"Kalit so'zli argumentlar\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"Backend\"\n\n#: templates/debug_toolbar/panels/community.html:5\nmsgid \"Community & Contribution\"\nmsgstr \"Hamjamiyat & Hissa qo'shish\"\n\n#: templates/debug_toolbar/panels/community.html:8\nmsgid \"\"\n\"Want to contribute to Django Debug Toolbar? Get involved in our community!\"\nmsgstr \"Django Tekshiruv Paneliga hissa qo'shmoqchimisiz? Hamjamiyatimizga qo'shiling!\"\n\n#: templates/debug_toolbar/panels/community.html:14\nmsgid \"Join Discussions\"\nmsgstr \"Muhokamalarga Qo'shilish\"\n\n#: templates/debug_toolbar/panels/community.html:19\nmsgid \"View Issues\"\nmsgstr \"Muammolarni Ko'rish\"\n\n#: templates/debug_toolbar/panels/community.html:24\nmsgid \"Contribution Guide\"\nmsgstr \"Hissa Qo'shish Qo'llanmasi\"\n\n#: templates/debug_toolbar/panels/community.html:31\nmsgid \"Django Debug Toolbar Documentation\"\nmsgstr \"Django Tekshiruv Paneli Dokumentatsiyasi\"\n\n#: templates/debug_toolbar/panels/community.html:34\nmsgid \"\"\n\"Explore the official documentation to learn more about Django Debug Toolbar.\"\nmsgstr \"Django Tekshiruv Paneli haqida batafsil ma’lumot olish uchun rasmiy dokumentatsiya bilan tanishib chiqing.\"\n\n#: templates/debug_toolbar/panels/community.html:39\nmsgid \"Read Documentation\"\nmsgstr \"Dokumentatsiyani o'qish\"\n\n#: templates/debug_toolbar/panels/community.html:44\nmsgid \"How to Use Django Debug Toolbar\"\nmsgstr \"Django Tekshiruv Panelidan Foydalanish\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"So'rov sarlavhalari\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"Kalit\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"Qiymat\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"Javob sarlavhalari\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"WSGI muhiti\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"WSGI server muhitini meros qilib olganligi sababli, quyida faqat muhim qism to‘plamlari ko‘rsatilgan.\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"Metod\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"Manzil\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"So'rov O'zgaruvchilari\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"Status\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"Amal\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"O'zgaruvchi\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"Chaqiruv\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"KumVaqt\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"Har biriga\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"JamiVaqt\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"Miqdor\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"Ma'lumotlarni ko'rish\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"Funksiyani ko'rish\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"URL nomi\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"Cookie'lar\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"Cookie'lar mavjud emas\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"Sessiya ma'lumotlari\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"Sessiya ma'lumotlari mavjud emas\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"GET ma'lumotlari\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"GET ma'lumotlari mavjud emas\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"POST ma'lumotlari\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"POST ma'lumotlari mavjud emas\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"Sozlama\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"Signal\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"Qabul qiluvchilar\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)sta so'rov\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"shu jumladan <abbr title=\\\"Similar queries are queries with the same SQL, but potentially different parameters.\\\">%(count)sta o'xshash</abbr>\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"va <abbr title=\\\"Duplicate queries are identical to each other: they execute exactly the same SQL and parameters.\\\">%(dupes)sta duplikat</abbr>\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"So'rov\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"Xronologiya\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"%(count)sta o'xshash so'rovlar.\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"%(dupes)smarta takrorlangan.\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"Ulanish:\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"Izolyatsiya darajasi:\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"Tranzaksiya statusi:\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(noma'lum)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"Bu so‘rov paytida hech qanday SQL so‘rovi qayd qilinmadi.\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:3\nmsgid \"SQL explained\"\nmsgstr \"Tushuntirilgan SQL so'rovi\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"Ijro etilgan SQL so'rovi\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"Ma'lumotlar bazasi\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:3\nmsgid \"SQL profiled\"\nmsgstr \"Tahlil qilingan SQL so'rovi\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"Xatolik\"\n\n#: templates/debug_toolbar/panels/sql_select.html:3\nmsgid \"SQL selected\"\nmsgstr \"Tanlangan SQL so'rovi\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"Bo'sh to'plam\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"Statik fayl manzillari\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"(old qo'shimcha %(prefix)s)\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"Yo'q\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"Statik fayl ilovalari\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"Statik fayllar\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"%(payload_count)sta fayl\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"Joylashuv\"\n\n#: templates/debug_toolbar/panels/template_source.html:3\nmsgid \"Template source:\"\nmsgstr \"Shablon manbasi\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"Shablon manzillari\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"Shablonlar\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"Kontekstni yoqib o'chirish\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"Kontekst protsessorlari\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"Resurs sarfi\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"Resurs\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"Brauzer vaqti\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"Vaqt ko'rsatkichi\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Milliseconds since navigation start (+length)\"\nmsgstr \"Navigatsiya boshlanganidan beri o'tgan millisoniyalar (+muddat)\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"Paket\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"Nom\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"Versiya\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"Joylashuv:\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"Django Tekshiruv Paneli paneli nosozliklarni tuzatish maqsadlarida yuqoridagi URL manzilga yo‘naltirishni to'xtatdi. Qayta yo‘naltirishni odatdagidek davom ettirish uchun yuqoridagi havolani bosishingiz mumkin.\"\n\n#: views.py:18\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"Bu panel uchun ma’lumotlar endi mavjud emas. Sahifani qayta yuklang va qayta urinib ko'ring.\"\n"
  },
  {
    "path": "debug_toolbar/locale/zh_CN/LC_MESSAGES/django.po",
    "content": "# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER\n# This file is distributed under the same license as the PACKAGE package.\n#\n#\n# Translators:\n# mozillazg <opensource.mozillazg@gmail.com>, 2013-2014\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: Django Debug Toolbar\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2024-08-06 07:12-0500\\n\"\n\"PO-Revision-Date: 2010-11-30 00:00+0000\\n\"\n\"Last-Translator: mozillazg <opensource.mozillazg@gmail.com>, 2013-2014\\n\"\n\"Language-Team: Chinese (China) (http://app.transifex.com/django-debug-toolbar/django-debug-toolbar/language/zh_CN/)\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: zh_CN\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\n#: apps.py:18\nmsgid \"Debug Toolbar\"\nmsgstr \"Debug Toolbar\"\n\n#: panels/alerts.py:67\n#, python-brace-format\nmsgid \"\"\n\"Form with id \\\"{form_id}\\\" contains file input, but does not have the \"\n\"attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:70\nmsgid \"\"\n\"Form contains file input, but does not have the attribute \"\n\"enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:73\n#, python-brace-format\nmsgid \"\"\n\"Input element references form with id \\\"{form_id}\\\", but the form does not \"\n\"have the attribute enctype=\\\"multipart/form-data\\\".\"\nmsgstr \"\"\n\n#: panels/alerts.py:77\nmsgid \"Alerts\"\nmsgstr \"\"\n\n#: panels/cache.py:168\nmsgid \"Cache\"\nmsgstr \"缓存\"\n\n#: panels/cache.py:174\n#, python-format\nmsgid \"%(cache_calls)d call in %(time).2fms\"\nmsgid_plural \"%(cache_calls)d calls in %(time).2fms\"\nmsgstr[0] \"%(time).2f 毫秒内 %(cache_calls)d 次调用\"\n\n#: panels/cache.py:183\n#, python-format\nmsgid \"Cache calls from %(count)d backend\"\nmsgid_plural \"Cache calls from %(count)d backends\"\nmsgstr[0] \"来自 %(count)d 个后端的缓存调用\"\n\n#: panels/headers.py:31\nmsgid \"Headers\"\nmsgstr \"HTTP 头\"\n\n#: panels/history/panel.py:19 panels/history/panel.py:20\nmsgid \"History\"\nmsgstr \"\"\n\n#: panels/profiling.py:140\nmsgid \"Profiling\"\nmsgstr \"性能分析\"\n\n#: panels/redirects.py:17\nmsgid \"Intercept redirects\"\nmsgstr \"拦截重定向\"\n\n#: panels/request.py:16\nmsgid \"Request\"\nmsgstr \"请求\"\n\n#: panels/request.py:38\nmsgid \"<no view>\"\nmsgstr \"<没有 view>\"\n\n#: panels/request.py:55\nmsgid \"<unavailable>\"\nmsgstr \"<不可用>\"\n\n#: panels/settings.py:17\nmsgid \"Settings\"\nmsgstr \"设置\"\n\n#: panels/settings.py:20\n#, python-format\nmsgid \"Settings from %s\"\nmsgstr \"\"\n\n#: panels/signals.py:57\n#, python-format\nmsgid \"%(num_receivers)d receiver of 1 signal\"\nmsgid_plural \"%(num_receivers)d receivers of 1 signal\"\nmsgstr[0] \"1个信号 %(num_receivers)d 个接收者\"\n\n#: panels/signals.py:62\n#, python-format\nmsgid \"%(num_receivers)d receiver of %(num_signals)d signals\"\nmsgid_plural \"%(num_receivers)d receivers of %(num_signals)d signals\"\nmsgstr[0] \"%(num_signals)d 个信号 %(num_receivers)d 个接收者\"\n\n#: panels/signals.py:67\nmsgid \"Signals\"\nmsgstr \"信号\"\n\n#: panels/sql/panel.py:30 panels/sql/panel.py:41\nmsgid \"Read uncommitted\"\nmsgstr \"读取未提交的\"\n\n#: panels/sql/panel.py:31 panels/sql/panel.py:43\nmsgid \"Read committed\"\nmsgstr \"读取已提交的\"\n\n#: panels/sql/panel.py:32 panels/sql/panel.py:45\nmsgid \"Repeatable read\"\nmsgstr \"可重复读取\"\n\n#: panels/sql/panel.py:33 panels/sql/panel.py:47\nmsgid \"Serializable\"\nmsgstr \"可序列化\"\n\n#: panels/sql/panel.py:39\nmsgid \"Autocommit\"\nmsgstr \"自动提交\"\n\n#: panels/sql/panel.py:61 panels/sql/panel.py:71\nmsgid \"Idle\"\nmsgstr \"空闲\"\n\n#: panels/sql/panel.py:62 panels/sql/panel.py:72\nmsgid \"Active\"\nmsgstr \"活跃\"\n\n#: panels/sql/panel.py:63 panels/sql/panel.py:73\nmsgid \"In transaction\"\nmsgstr \"事务\"\n\n#: panels/sql/panel.py:64 panels/sql/panel.py:74\nmsgid \"In error\"\nmsgstr \"错误\"\n\n#: panels/sql/panel.py:65 panels/sql/panel.py:75\nmsgid \"Unknown\"\nmsgstr \"未知\"\n\n#: panels/sql/panel.py:162\nmsgid \"SQL\"\nmsgstr \"SQL\"\n\n#: panels/sql/panel.py:168\n#, python-format\nmsgid \"%(query_count)d query in %(sql_time).2fms\"\nmsgid_plural \"%(query_count)d queries in %(sql_time).2fms\"\nmsgstr[0] \"\"\n\n#: panels/sql/panel.py:180\n#, python-format\nmsgid \"SQL queries from %(count)d connection\"\nmsgid_plural \"SQL queries from %(count)d connections\"\nmsgstr[0] \"\"\n\n#: panels/staticfiles.py:82\n#, python-format\nmsgid \"Static files (%(num_found)s found, %(num_used)s used)\"\nmsgstr \"静态文件 (%(num_found)s 个找到，%(num_used)s 个被使用)\"\n\n#: panels/staticfiles.py:103\nmsgid \"Static files\"\nmsgstr \"静态文件\"\n\n#: panels/staticfiles.py:109\n#, python-format\nmsgid \"%(num_used)s file used\"\nmsgid_plural \"%(num_used)s files used\"\nmsgstr[0] \"%(num_used)s 个文件被使用\"\n\n#: panels/templates/panel.py:101\nmsgid \"Templates\"\nmsgstr \"模板\"\n\n#: panels/templates/panel.py:106\n#, python-format\nmsgid \"Templates (%(num_templates)s rendered)\"\nmsgstr \"模板 (%(num_templates)s 个被渲染)\"\n\n#: panels/templates/panel.py:195\nmsgid \"No origin\"\nmsgstr \"\"\n\n#: panels/timer.py:27\n#, python-format\nmsgid \"CPU: %(cum)0.2fms (%(total)0.2fms)\"\nmsgstr \"CPU: %(cum)0.2f 毫秒 (总耗时: %(total)0.2f 毫秒)\"\n\n#: panels/timer.py:32\n#, python-format\nmsgid \"Total: %0.2fms\"\nmsgstr \"总共：%0.2f 毫秒\"\n\n#: panels/timer.py:38 templates/debug_toolbar/panels/cache.html:43\n#: templates/debug_toolbar/panels/history.html:9\n#: templates/debug_toolbar/panels/sql.html:36\n#: templates/debug_toolbar/panels/sql_explain.html:11\n#: templates/debug_toolbar/panels/sql_profile.html:12\n#: templates/debug_toolbar/panels/sql_select.html:11\nmsgid \"Time\"\nmsgstr \"时间\"\n\n#: panels/timer.py:46\nmsgid \"User CPU time\"\nmsgstr \"用户 CPU 时间\"\n\n#: panels/timer.py:46\n#, python-format\nmsgid \"%(utime)0.3f ms\"\nmsgstr \"%(utime)0.3f 毫秒\"\n\n#: panels/timer.py:47\nmsgid \"System CPU time\"\nmsgstr \"系统 CPU 时间\"\n\n#: panels/timer.py:47\n#, python-format\nmsgid \"%(stime)0.3f ms\"\nmsgstr \"%(stime)0.3f 毫秒\"\n\n#: panels/timer.py:48\nmsgid \"Total CPU time\"\nmsgstr \"总的 CPU 时间\"\n\n#: panels/timer.py:48\n#, python-format\nmsgid \"%(total)0.3f ms\"\nmsgstr \"%(total)0.3f 毫秒\"\n\n#: panels/timer.py:49\nmsgid \"Elapsed time\"\nmsgstr \"耗时\"\n\n#: panels/timer.py:49\n#, python-format\nmsgid \"%(total_time)0.3f ms\"\nmsgstr \"%(total_time)0.3f 毫秒\"\n\n#: panels/timer.py:51\nmsgid \"Context switches\"\nmsgstr \"上下文切换\"\n\n#: panels/timer.py:52\n#, python-format\nmsgid \"%(vcsw)d voluntary, %(ivcsw)d involuntary\"\nmsgstr \"%(vcsw)d 主动, %(ivcsw)d 被动\"\n\n#: panels/versions.py:19\nmsgid \"Versions\"\nmsgstr \"版本\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide toolbar\"\nmsgstr \"隐藏工具栏\"\n\n#: templates/debug_toolbar/base.html:23\nmsgid \"Hide\"\nmsgstr \"隐藏\"\n\n#: templates/debug_toolbar/base.html:25 templates/debug_toolbar/base.html:26\nmsgid \"Toggle Theme\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/base.html:35\nmsgid \"Show toolbar\"\nmsgstr \"显示工具栏\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Disable for next and successive requests\"\nmsgstr \"针对下一个连续的请求禁用该功能\"\n\n#: templates/debug_toolbar/includes/panel_button.html:4\nmsgid \"Enable for next and successive requests\"\nmsgstr \"针对下一个连续的请求启用该功能\"\n\n#: templates/debug_toolbar/panels/alerts.html:4\nmsgid \"Alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/alerts.html:11\nmsgid \"No alerts found\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/cache.html:2\nmsgid \"Summary\"\nmsgstr \"摘要\"\n\n#: templates/debug_toolbar/panels/cache.html:6\nmsgid \"Total calls\"\nmsgstr \"总调用次数\"\n\n#: templates/debug_toolbar/panels/cache.html:7\nmsgid \"Total time\"\nmsgstr \"总耗时\"\n\n#: templates/debug_toolbar/panels/cache.html:8\nmsgid \"Cache hits\"\nmsgstr \"缓存命中\"\n\n#: templates/debug_toolbar/panels/cache.html:9\nmsgid \"Cache misses\"\nmsgstr \"缓存未命中\"\n\n#: templates/debug_toolbar/panels/cache.html:21\nmsgid \"Commands\"\nmsgstr \"命令\"\n\n#: templates/debug_toolbar/panels/cache.html:39\nmsgid \"Calls\"\nmsgstr \"调用\"\n#: templates/debug_toolbar/panels/cache.html:44\nmsgid \"Type\"\nmsgstr \"类型\"\n\n#: templates/debug_toolbar/panels/cache.html:45\n#: templates/debug_toolbar/panels/request.html:8\nmsgid \"Arguments\"\nmsgstr \"参数\"\n\n#: templates/debug_toolbar/panels/cache.html:46\n#: templates/debug_toolbar/panels/request.html:9\nmsgid \"Keyword arguments\"\nmsgstr \"关键字参数\"\n\n#: templates/debug_toolbar/panels/cache.html:47\nmsgid \"Backend\"\nmsgstr \"后端\"\n\n#: templates/debug_toolbar/panels/headers.html:3\nmsgid \"Request headers\"\nmsgstr \"请求头\"\n\n#: templates/debug_toolbar/panels/headers.html:8\n#: templates/debug_toolbar/panels/headers.html:27\n#: templates/debug_toolbar/panels/headers.html:48\nmsgid \"Key\"\nmsgstr \"键\"\n\n#: templates/debug_toolbar/panels/headers.html:9\n#: templates/debug_toolbar/panels/headers.html:28\n#: templates/debug_toolbar/panels/headers.html:49\n#: templates/debug_toolbar/panels/history_tr.html:23\n#: templates/debug_toolbar/panels/request_variables.html:12\n#: templates/debug_toolbar/panels/settings.html:6\n#: templates/debug_toolbar/panels/timer.html:11\nmsgid \"Value\"\nmsgstr \"值\"\n\n#: templates/debug_toolbar/panels/headers.html:22\nmsgid \"Response headers\"\nmsgstr \"响应头\"\n\n#: templates/debug_toolbar/panels/headers.html:41\nmsgid \"WSGI environ\"\nmsgstr \"WSGI 环境变量\"\n\n#: templates/debug_toolbar/panels/headers.html:43\nmsgid \"\"\n\"Since the WSGI environ inherits the environment of the server, only a \"\n\"significant subset is shown below.\"\nmsgstr \"由于 WSGI 的环境变量继承自 server，所以下面只显示了一些重要的子集。\"\n\n#: templates/debug_toolbar/panels/history.html:10\nmsgid \"Method\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:43\nmsgid \"Path\"\nmsgstr \"路径\"\n\n#: templates/debug_toolbar/panels/history.html:12\nmsgid \"Request Variables\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:13\nmsgid \"Status\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/history.html:14\n#: templates/debug_toolbar/panels/sql.html:37\nmsgid \"Action\"\nmsgstr \"功能\"\n\n#: templates/debug_toolbar/panels/history_tr.html:22\n#: templates/debug_toolbar/panels/request_variables.html:11\nmsgid \"Variable\"\nmsgstr \"变量\"\n\n#: templates/debug_toolbar/panels/profiling.html:5\nmsgid \"Call\"\nmsgstr \"调用\"\n\n#: templates/debug_toolbar/panels/profiling.html:6\nmsgid \"CumTime\"\nmsgstr \"调用该函数及其内部调用其他函数花费的总时间\"\n\n#: templates/debug_toolbar/panels/profiling.html:7\n#: templates/debug_toolbar/panels/profiling.html:9\nmsgid \"Per\"\nmsgstr \"平均每次调用花费的时间\"\n\n#: templates/debug_toolbar/panels/profiling.html:8\nmsgid \"TotTime\"\nmsgstr \"调用该函数花费的总时间\"\n\n#: templates/debug_toolbar/panels/profiling.html:10\nmsgid \"Count\"\nmsgstr \"总的调用次数\"\n\n#: templates/debug_toolbar/panels/request.html:3\nmsgid \"View information\"\nmsgstr \"View 信息\"\n\n#: templates/debug_toolbar/panels/request.html:7\nmsgid \"View function\"\nmsgstr \"View 函数\"\n\n#: templates/debug_toolbar/panels/request.html:10\nmsgid \"URL name\"\nmsgstr \"URL 名称\"\n\n#: templates/debug_toolbar/panels/request.html:24\nmsgid \"Cookies\"\nmsgstr \"Cookies\"\n\n#: templates/debug_toolbar/panels/request.html:27\nmsgid \"No cookies\"\nmsgstr \"没有 cookies\"\n\n#: templates/debug_toolbar/panels/request.html:31\nmsgid \"Session data\"\nmsgstr \"Session 数据\"\n\n#: templates/debug_toolbar/panels/request.html:34\nmsgid \"No session data\"\nmsgstr \"没有 session 数据\"\n\n#: templates/debug_toolbar/panels/request.html:38\nmsgid \"GET data\"\nmsgstr \"GET 请求数据\"\n\n#: templates/debug_toolbar/panels/request.html:41\nmsgid \"No GET data\"\nmsgstr \"没有 GET 请求数据\"\n\n#: templates/debug_toolbar/panels/request.html:45\nmsgid \"POST data\"\nmsgstr \"POST 请求数据\"\n\n#: templates/debug_toolbar/panels/request.html:48\nmsgid \"No POST data\"\nmsgstr \"没有 POST 请求数据\"\n\n#: templates/debug_toolbar/panels/settings.html:5\nmsgid \"Setting\"\nmsgstr \"设置项\"\n\n#: templates/debug_toolbar/panels/signals.html:5\nmsgid \"Signal\"\nmsgstr \"信号\"\n\n#: templates/debug_toolbar/panels/signals.html:6\nmsgid \"Receivers\"\nmsgstr \"接收者\"\n\n#: templates/debug_toolbar/panels/sql.html:6\n#, python-format\nmsgid \"%(num)s query\"\nmsgid_plural \"%(num)s queries\"\nmsgstr[0] \"%(num)s 个查询\"\n\n#: templates/debug_toolbar/panels/sql.html:8\n#, python-format\nmsgid \"\"\n\"including <abbr title=\\\"Similar queries are queries with the same SQL, but \"\n\"potentially different parameters.\\\">%(count)s similar</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:12\n#, python-format\nmsgid \"\"\n\"and <abbr title=\\\"Duplicate queries are identical to each other: they \"\n\"execute exactly the same SQL and parameters.\\\">%(dupes)s duplicates</abbr>\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:34\nmsgid \"Query\"\nmsgstr \"查询\"\n\n#: templates/debug_toolbar/panels/sql.html:35\n#: templates/debug_toolbar/panels/timer.html:36\nmsgid \"Timeline\"\nmsgstr \"时间线\"\n\n#: templates/debug_toolbar/panels/sql.html:52\n#, python-format\nmsgid \"%(count)s similar queries.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:58\n#, python-format\nmsgid \"Duplicated %(dupes)s times.\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/sql.html:95\nmsgid \"Connection:\"\nmsgstr \"连接：\"\n\n#: templates/debug_toolbar/panels/sql.html:97\nmsgid \"Isolation level:\"\nmsgstr \"隔离级别\"\n\n#: templates/debug_toolbar/panels/sql.html:100\nmsgid \"Transaction status:\"\nmsgstr \"事务状态：\"\n\n#: templates/debug_toolbar/panels/sql.html:114\nmsgid \"(unknown)\"\nmsgstr \"(未知)\"\n\n#: templates/debug_toolbar/panels/sql.html:123\nmsgid \"No SQL queries were recorded during this request.\"\nmsgstr \"在处理这个请求期间没有记录到 SQL 查询。\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:4\nmsgid \"SQL explained\"\nmsgstr \"SQL explain 分析\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:9\n#: templates/debug_toolbar/panels/sql_profile.html:10\n#: templates/debug_toolbar/panels/sql_select.html:9\nmsgid \"Executed SQL\"\nmsgstr \"执行的 SQL 语句\"\n\n#: templates/debug_toolbar/panels/sql_explain.html:13\n#: templates/debug_toolbar/panels/sql_profile.html:14\n#: templates/debug_toolbar/panels/sql_select.html:13\nmsgid \"Database\"\nmsgstr \"数据库\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:4\nmsgid \"SQL profiled\"\nmsgstr \"SQL 性能分析\"\n\n#: templates/debug_toolbar/panels/sql_profile.html:37\nmsgid \"Error\"\nmsgstr \"错误\"\n\n#: templates/debug_toolbar/panels/sql_select.html:4\nmsgid \"SQL selected\"\nmsgstr \"选中的 SQL 语句\"\n\n#: templates/debug_toolbar/panels/sql_select.html:36\nmsgid \"Empty set\"\nmsgstr \"空集合\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:3\nmsgid \"Static file path\"\nmsgid_plural \"Static file paths\"\nmsgstr[0] \"静态文件路径\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:7\n#, python-format\nmsgid \"(prefix %(prefix)s)\"\nmsgstr \"(前缀 %(prefix)s)\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:11\n#: templates/debug_toolbar/panels/staticfiles.html:22\n#: templates/debug_toolbar/panels/staticfiles.html:34\n#: templates/debug_toolbar/panels/templates.html:10\n#: templates/debug_toolbar/panels/templates.html:30\n#: templates/debug_toolbar/panels/templates.html:47\nmsgid \"None\"\nmsgstr \"空\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:14\nmsgid \"Static file app\"\nmsgid_plural \"Static file apps\"\nmsgstr[0] \"包含静态文件的应用\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:25\nmsgid \"Static file\"\nmsgid_plural \"Static files\"\nmsgstr[0] \"静态文件\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:39\n#, python-format\nmsgid \"%(payload_count)s file\"\nmsgid_plural \"%(payload_count)s files\"\nmsgstr[0] \"%(payload_count)s 个文件\"\n\n#: templates/debug_toolbar/panels/staticfiles.html:44\nmsgid \"Location\"\nmsgstr \"位置\"\n\n#: templates/debug_toolbar/panels/template_source.html:4\nmsgid \"Template source:\"\nmsgstr \"模板源：\"\n\n#: templates/debug_toolbar/panels/templates.html:2\nmsgid \"Template path\"\nmsgid_plural \"Template paths\"\nmsgstr[0] \"模板路径\"\n\n#: templates/debug_toolbar/panels/templates.html:13\nmsgid \"Template\"\nmsgid_plural \"Templates\"\nmsgstr[0] \"模板\"\n\n#: templates/debug_toolbar/panels/templates.html:22\n#: templates/debug_toolbar/panels/templates.html:40\nmsgid \"Toggle context\"\nmsgstr \"切换上下文\"\n\n#: templates/debug_toolbar/panels/templates.html:33\nmsgid \"Context processor\"\nmsgid_plural \"Context processors\"\nmsgstr[0] \"Context processors\"\n\n#: templates/debug_toolbar/panels/timer.html:2\nmsgid \"Resource usage\"\nmsgstr \"资源使用\"\n\n#: templates/debug_toolbar/panels/timer.html:10\nmsgid \"Resource\"\nmsgstr \"资源\"\n\n#: templates/debug_toolbar/panels/timer.html:26\nmsgid \"Browser timing\"\nmsgstr \"浏览器计时\"\n\n#: templates/debug_toolbar/panels/timer.html:35\nmsgid \"Timing attribute\"\nmsgstr \"计时属性\"\n\n#: templates/debug_toolbar/panels/timer.html:37\nmsgid \"Time since navigation start (+duration)\"\nmsgstr \"导航开始后的时间 (+持续时间)\"\n\n#: templates/debug_toolbar/panels/versions.html:10\nmsgid \"Package\"\nmsgstr \"\"\n\n#: templates/debug_toolbar/panels/versions.html:11\nmsgid \"Name\"\nmsgstr \"名称\"\n\n#: templates/debug_toolbar/panels/versions.html:12\nmsgid \"Version\"\nmsgstr \"版本\"\n\n#: templates/debug_toolbar/redirect.html:10\nmsgid \"Location:\"\nmsgstr \"位置：\"\n\n#: templates/debug_toolbar/redirect.html:12\nmsgid \"\"\n\"The Django Debug Toolbar has intercepted a redirect to the above URL for \"\n\"debug viewing purposes. You can click the above link to continue with the \"\n\"redirect as normal.\"\nmsgstr \"Django Debug Toolbar 为了调试目的拦截了一个重定向到上面 URL 的请求。  您可以点击上面的链接继续执行重定向操作。\"\n\n#: views.py:16\nmsgid \"\"\n\"Data for this panel isn't available anymore. Please reload the page and \"\n\"retry.\"\nmsgstr \"当前面板的数据暂不可用。请刷新页面并重试。\"\n"
  },
  {
    "path": "debug_toolbar/management/__init__.py",
    "content": ""
  },
  {
    "path": "debug_toolbar/management/commands/__init__.py",
    "content": ""
  },
  {
    "path": "debug_toolbar/management/commands/debugsqlshell.py",
    "content": "from time import perf_counter\n\nimport sqlparse\nfrom django.core.management.commands.shell import Command\nfrom django.db import connection\n\nif connection.vendor == \"postgresql\":\n    from django.db.backends.postgresql import base as base_module\nelse:\n    from django.db.backends import utils as base_module\n\n# 'debugsqlshell' is the same as the 'shell'.\n\n\n# Command is required to exist to be loaded via\n# django.core.managementload_command_class\n__all__ = [\"Command\", \"PrintQueryWrapper\"]\n\n\nclass PrintQueryWrapper(base_module.CursorDebugWrapper):\n    def execute(self, sql, params=()):\n        start_time = perf_counter()\n        try:\n            return self.cursor.execute(sql, params)\n        finally:\n            raw_sql = self.db.ops.last_executed_query(self.cursor, sql, params)\n            end_time = perf_counter()\n            duration = (end_time - start_time) * 1000\n            formatted_sql = sqlparse.format(raw_sql, reindent=True)\n            print(f\"{formatted_sql} [{duration:.2f}ms]\")\n\n\nbase_module.CursorDebugWrapper = PrintQueryWrapper\n"
  },
  {
    "path": "debug_toolbar/middleware.py",
    "content": "\"\"\"\nDebug Toolbar middleware\n\"\"\"\n\nimport re\nimport socket\nfrom collections.abc import Callable\nfrom functools import cache\n\nfrom asgiref.sync import (\n    async_to_sync,\n    iscoroutinefunction,\n    markcoroutinefunction,\n    sync_to_async,\n)\nfrom django.conf import settings\nfrom django.http import HttpRequest, HttpResponse\nfrom django.utils.module_loading import import_string\n\nfrom debug_toolbar import settings as dt_settings\nfrom debug_toolbar._stubs import GetResponse\nfrom debug_toolbar.panels import Panel\nfrom debug_toolbar.toolbar import DebugToolbar\nfrom debug_toolbar.utils import clear_stack_trace_caches, is_processable_html_response\n\n_HTML_TYPES = (\"text/html\", \"application/xhtml+xml\")\n\n\ndef show_toolbar(request: HttpRequest) -> bool:\n    \"\"\"\n    Default function to determine whether to show the toolbar on a given page.\n    \"\"\"\n    if not settings.DEBUG:\n        return False\n\n    # Test: settings\n    if request.META.get(\"REMOTE_ADDR\") in settings.INTERNAL_IPS:\n        return True\n\n    # No test passed\n    return False\n\n\ndef show_toolbar_with_docker(request: HttpRequest) -> bool:\n    \"\"\"\n    Default function to determine whether to show the toolbar on a given page.\n    \"\"\"\n    if not settings.DEBUG:\n        return False\n\n    # Test: settings\n    if request.META.get(\"REMOTE_ADDR\") in settings.INTERNAL_IPS:\n        return True\n\n    # Test: Docker\n    try:\n        # This is a hack for docker installations. It attempts to look\n        # up the IP address of the docker host.\n        # This is not guaranteed to work.\n        docker_ip = (\n            # Convert the last segment of the IP address to be .1\n            \".\".join(socket.gethostbyname(\"host.docker.internal\").rsplit(\".\")[:-1])\n            + \".1\"\n        )\n        if request.META.get(\"REMOTE_ADDR\") == docker_ip:\n            return True\n    except socket.gaierror:\n        # It's fine if the lookup errored since they may not be using docker\n        pass\n\n    # No test passed\n    return False\n\n\n@cache\ndef show_toolbar_func_or_path() -> Callable:\n    \"\"\"\n    Fetch the show toolbar callback from settings\n\n    Cached to avoid importing multiple times.\n    \"\"\"\n    # If SHOW_TOOLBAR_CALLBACK is a string, which is the recommended\n    # setup, resolve it to the corresponding callable.\n    func_or_path = dt_settings.get_config()[\"SHOW_TOOLBAR_CALLBACK\"]\n    if isinstance(func_or_path, str):\n        return import_string(func_or_path)\n    else:\n        return func_or_path\n\n\ndef get_show_toolbar(async_mode) -> Callable:\n    \"\"\"\n    Get the callback function to show the toolbar.\n\n    Will wrap the function with sync_to_async or\n    async_to_sync depending on the status of async_mode\n    and whether the underlying function is a coroutine.\n    \"\"\"\n    show_toolbar = show_toolbar_func_or_path()\n    is_coroutine = iscoroutinefunction(show_toolbar)\n    if is_coroutine and not async_mode:\n        show_toolbar = async_to_sync(show_toolbar)\n    elif not is_coroutine and async_mode:\n        show_toolbar = sync_to_async(show_toolbar)\n    return show_toolbar\n\n\nclass DebugToolbarMiddleware:\n    \"\"\"\n    Middleware to set up Debug Toolbar on incoming request and render toolbar\n    on outgoing response.\n    \"\"\"\n\n    sync_capable = True\n    async_capable = True\n\n    def __init__(self, get_response: GetResponse):\n        self.get_response = get_response\n        # If get_response is a coroutine function, turns us into async mode so\n        # a thread is not consumed during a whole request.\n        self.async_mode = iscoroutinefunction(self.get_response)\n\n        if self.async_mode:\n            # Mark the class as async-capable, but do the actual switch inside\n            # __call__ to avoid swapping out dunder methods.\n            markcoroutinefunction(self)\n\n    def __call__(self, request: HttpRequest) -> HttpResponse:\n        if self.async_mode:\n            return self.__acall__(request)\n\n        # Decide whether the toolbar is active for this request.\n        show_toolbar = get_show_toolbar(async_mode=self.async_mode)\n\n        if not show_toolbar(request) or DebugToolbar.is_toolbar_request(request):\n            return self.get_response(request)\n        toolbar = DebugToolbar(request, self.get_response)\n        # Activate instrumentation ie. monkey-patch.\n        for panel in toolbar.enabled_panels:\n            panel.enable_instrumentation()\n        try:\n            # Run panels like Django middleware.\n            response = toolbar.process_request(request)\n        finally:\n            clear_stack_trace_caches()\n            # Deactivate instrumentation ie. monkey-unpatch. This must run\n            # regardless of the response. Keep 'return' clauses below.\n            for panel in reversed(toolbar.enabled_panels):\n                panel.disable_instrumentation()\n\n        return self._postprocess(request, response, toolbar)\n\n    async def __acall__(self, request: HttpRequest) -> HttpResponse:\n        # Decide whether the toolbar is active for this request.\n        show_toolbar = get_show_toolbar(async_mode=self.async_mode)\n\n        if not await show_toolbar(request) or DebugToolbar.is_toolbar_request(request):\n            response = await self.get_response(request)\n            return response\n\n        toolbar = DebugToolbar(request, self.get_response)\n\n        # Activate instrumentation ie. monkey-patch.\n        for panel in toolbar.enabled_panels:\n            if hasattr(panel, \"aenable_instrumentation\"):\n                await panel.aenable_instrumentation()\n            else:\n                panel.enable_instrumentation()\n        try:\n            # Run panels like Django middleware.\n            response = await toolbar.process_request(request)\n        finally:\n            clear_stack_trace_caches()\n            # Deactivate instrumentation ie. monkey-unpatch. This must run\n            # regardless of the response. Keep 'return' clauses below.\n            for panel in reversed(toolbar.enabled_panels):\n                panel.disable_instrumentation()\n\n        return self._postprocess(request, response, toolbar)\n\n    def _postprocess(\n        self, request: HttpRequest, response: HttpResponse, toolbar: DebugToolbar\n    ) -> HttpResponse:\n        \"\"\"\n        Post-process the response.\n        \"\"\"\n        # Generate the stats for all requests when the toolbar is being shown,\n        # but not necessarily inserted.\n        for panel in reversed(toolbar.enabled_panels):\n            panel.generate_stats(request, response)\n            panel.generate_server_timing(request, response)\n\n        # Always render the toolbar for the history panel, even if it is not\n        # included in the response.\n        rendered = toolbar.render_toolbar()\n\n        for header, value in self.get_headers(request, toolbar.enabled_panels).items():\n            response.headers[header] = value\n\n        # Check for responses where the toolbar can't be inserted.\n        if not is_processable_html_response(response):\n            return response\n\n        # Insert the toolbar in the response.\n        content = response.content.decode(response.charset)\n        insert_before = dt_settings.get_config()[\"INSERT_BEFORE\"]\n        pattern = re.escape(insert_before)\n        bits = re.split(pattern, content, flags=re.IGNORECASE)\n        if len(bits) > 1:\n            bits[-2] += rendered\n            response.content = insert_before.join(bits)\n            if \"Content-Length\" in response:\n                response[\"Content-Length\"] = len(response.content)\n        return response\n\n    @staticmethod\n    def get_headers(request: HttpRequest, panels: list[Panel]) -> dict[str, str]:\n        headers = {}\n        for panel in panels:\n            for header, value in panel.get_headers(request).items():\n                if header in headers:\n                    headers[header] += f\", {value}\"\n                else:\n                    headers[header] = value\n        return headers\n"
  },
  {
    "path": "debug_toolbar/migrations/0001_initial.py",
    "content": "from django.db import migrations, models\n\n\nclass Migration(migrations.Migration):\n    initial = True\n\n    operations = [\n        migrations.CreateModel(\n            name=\"HistoryEntry\",\n            fields=[\n                (\n                    \"request_id\",\n                    models.UUIDField(primary_key=True, serialize=False),\n                ),\n                (\"data\", models.JSONField(default=dict)),\n                (\"created_at\", models.DateTimeField(auto_now_add=True)),\n            ],\n            options={\n                \"verbose_name\": \"history entry\",\n                \"verbose_name_plural\": \"history entries\",\n                \"ordering\": [\"-created_at\"],\n            },\n        ),\n    ]\n"
  },
  {
    "path": "debug_toolbar/migrations/__init__.py",
    "content": ""
  },
  {
    "path": "debug_toolbar/models.py",
    "content": "from django.db import models\nfrom django.utils.translation import gettext_lazy as _\n\n\nclass HistoryEntry(models.Model):\n    request_id = models.UUIDField(primary_key=True)\n    data = models.JSONField(default=dict)\n    created_at = models.DateTimeField(auto_now_add=True)\n\n    class Meta:\n        verbose_name = _(\"history entry\")\n        verbose_name_plural = _(\"history entries\")\n        ordering = [\"-created_at\"]\n\n    def __str__(self):\n        return str(self.request_id)\n"
  },
  {
    "path": "debug_toolbar/panels/__init__.py",
    "content": "from django.core.handlers.asgi import ASGIRequest\nfrom django.template.loader import render_to_string\nfrom django.utils.functional import classproperty\n\nfrom debug_toolbar import settings as dt_settings\nfrom debug_toolbar._stubs import GetResponse\nfrom debug_toolbar.utils import get_name_from_obj\n\n\nclass Panel:\n    \"\"\"\n    Base class for panels.\n    \"\"\"\n\n    is_async = False\n\n    def __init__(self, toolbar, get_response: GetResponse):\n        self.toolbar = toolbar\n        self.get_response = get_response\n        self.from_store = False\n\n    # Private panel properties\n\n    @classproperty\n    def panel_id(cls) -> str:\n        return cls.__name__\n\n    @property\n    def enabled(self) -> bool:\n        # Check if the panel is async compatible\n        if not self.is_async and isinstance(self.toolbar.request, ASGIRequest):\n            return False\n\n        if self.from_store:\n            # If the toolbar was loaded from the store the existence of\n            # recorded data indicates whether it was enabled or not.\n            # We can't use the remainder of the logic since we don't have\n            # a request to work off of.\n            return bool(self.get_stats())\n\n        # The user's cookies should override the default value\n        cookie_value = self.toolbar.request.COOKIES.get(\"djdt\" + self.panel_id)\n        if cookie_value is not None:\n            return cookie_value == \"on\"\n\n        # Check to see if settings has a default value for it\n        disabled_panels = dt_settings.get_config()[\"DISABLE_PANELS\"]\n        panel_path = get_name_from_obj(self)\n        # Some panels such as the SQLPanel and TemplatesPanel exist in a\n        # panel module, but can be disabled without panel in the path.\n        # For that reason, replace .panel. in the path and check for that\n        # value in the disabled panels as well.\n        return (\n            panel_path not in disabled_panels\n            and panel_path.replace(\".panel.\", \".\") not in disabled_panels\n        )\n\n    # Titles and content\n\n    @property\n    def nav_title(self):\n        \"\"\"\n        Title shown in the side bar. Defaults to :attr:`title`.\n        \"\"\"\n        return self.title\n\n    @property\n    def nav_subtitle(self):\n        \"\"\"\n        Subtitle shown in the side bar. Defaults to the empty string.\n        \"\"\"\n        return \"\"\n\n    @property\n    def has_content(self):\n        \"\"\"\n        ``True`` if the panel can be displayed in full screen, ``False`` if\n        it's only shown in the side bar. Defaults to ``True``.\n        \"\"\"\n        return True\n\n    @property\n    def is_historical(self):\n        \"\"\"\n        Panel supports rendering historical values.\n\n        Defaults to :attr:`has_content`.\n        \"\"\"\n        return self.has_content\n\n    @property\n    def title(self):\n        \"\"\"\n        Title shown in the panel when it's displayed in full screen.\n\n        Mandatory, unless the panel sets :attr:`has_content` to ``False``.\n        \"\"\"\n        raise NotImplementedError\n\n    @property\n    def template(self):\n        \"\"\"\n        Template used to render :attr:`content`.\n\n        Mandatory, unless the panel sets :attr:`has_content` to ``False`` or\n        overrides :attr:`content`.\n        \"\"\"\n        raise NotImplementedError\n\n    @property\n    def content(self):\n        \"\"\"\n        Content of the panel when it's displayed in full screen.\n\n        By default this renders the template defined by :attr:`template`.\n        Statistics stored with :meth:`record_stats` are available in the\n        template's context.\n        \"\"\"\n        if self.has_content:\n            return render_to_string(self.template, self.get_stats())\n\n    @property\n    def scripts(self):\n        \"\"\"\n        Scripts used by the HTML content of the panel when it's displayed.\n\n        When a panel is rendered on the frontend, the ``djdt.panel.render``\n        JavaScript event will be dispatched. The scripts can listen for\n        this event to support dynamic functionality.\n        \"\"\"\n        return []\n\n    # Panel early initialization\n\n    @classmethod\n    def ready(cls):\n        \"\"\"\n        Perform early initialization for the panel.\n\n        This should only include initialization or instrumentation that needs to\n        be done unconditionally for the panel regardless of whether it is\n        enabled for a particular request.  It should be idempotent.\n        \"\"\"\n\n    # URLs for panel-specific views\n\n    @classmethod\n    def get_urls(cls):\n        \"\"\"\n        Return URLpatterns, if the panel has its own views.\n        \"\"\"\n        return []\n\n    # Enable and disable (expensive) instrumentation, must be idempotent\n\n    def enable_instrumentation(self):\n        \"\"\"\n        Enable instrumentation to gather data for this panel.\n\n        This usually means monkey-patching (!) or registering signal\n        receivers. Any instrumentation with a non-negligible effect on\n        performance should be installed by this method rather than at import\n        time.\n\n        Unless the toolbar or this panel is disabled, this method will be\n        called early in ``DebugToolbarMiddleware``. It should be idempotent.\n\n        Add the ``aenable_instrumentation``  method to a panel subclass\n        to support async logic for instrumentation.\n        \"\"\"\n\n    def disable_instrumentation(self):\n        \"\"\"\n        Disable instrumentation to gather data for this panel.\n\n        This is the opposite of :meth:`enable_instrumentation`.\n\n        Unless the toolbar or this panel is disabled, this method will be\n        called late in the middleware. It should be idempotent.\n        \"\"\"\n\n    # Store and retrieve stats (shared between panels for no good reason)\n\n    def record_stats(self, stats):\n        \"\"\"\n        Store data gathered by the panel. ``stats`` is a :class:`dict`.\n\n        Each call to ``record_stats`` updates the store's data for\n        the panel.\n\n        To support backwards compatibility, it will also update the\n        panel's statistics dictionary.\n        \"\"\"\n        self.toolbar.stats.setdefault(self.panel_id, {}).update(stats)\n        self.toolbar.store.save_panel(\n            self.toolbar.request_id, self.panel_id, self.toolbar.stats[self.panel_id]\n        )\n\n    def get_stats(self):\n        \"\"\"\n        Access data stored by the panel. Returns a :class:`dict`.\n        \"\"\"\n        return self.toolbar.stats.get(self.panel_id, {})\n\n    def record_server_timing(self, key, title, value):\n        \"\"\"\n        Store data gathered by the panel. ``stats`` is a :class:`dict`.\n\n        Each call to ``record_stats`` updates the statistics dictionary.\n        \"\"\"\n        data = {key: {\"title\": title, \"value\": value}}\n        self.toolbar.server_timing_stats.setdefault(self.panel_id, {}).update(data)\n\n    def get_server_timing_stats(self):\n        \"\"\"\n        Access data stored by the panel. Returns a :class:`dict`.\n        \"\"\"\n        return self.toolbar.server_timing_stats.get(self.panel_id, {})\n\n    # Standard middleware methods\n\n    def process_request(self, request):\n        \"\"\"\n        Like __call__ in Django's middleware.\n\n        Write panel logic related to the request there. Save data with\n        :meth:`record_stats`.\n\n        Return the existing response or overwrite it.\n        \"\"\"\n        return self.get_response(request)\n\n    def get_headers(self, request):\n        \"\"\"\n        Get headers the panel needs to set.\n\n        Called after :meth:`process_request\n        <debug_toolbar.panels.Panel.generate_stats>` and\n        :meth:`process_request<debug_toolbar.panels.Panel.generate_stats>`\n\n        Header values will be appended if multiple panels need to set it.\n\n        By default it sets the Server-Timing header.\n\n        Return dict of headers to be appended.\n        \"\"\"\n        headers = {}\n        stats = self.get_server_timing_stats()\n        if stats:\n            headers[\"Server-Timing\"] = \", \".join(\n                # example: `SQLPanel_sql_time;dur=0;desc=\"SQL 0 queries\"`\n                '{}_{};dur={};desc=\"{}\"'.format(\n                    self.panel_id, key, record.get(\"value\"), record.get(\"title\")\n                )\n                for key, record in stats.items()\n            )\n        return headers\n\n    def generate_stats(self, request, response):\n        \"\"\"\n        Write panel logic related to the response there. Post-process data\n        gathered while the view executed. Save data with :meth:`record_stats`.\n\n        Called after :meth:`process_request\n        <debug_toolbar.panels.Panel.process_request>`.\n\n\n        Does not return a value.\n        \"\"\"\n\n    def generate_server_timing(self, request, response):\n        \"\"\"\n        Similar to :meth:`generate_stats\n        <debug_toolbar.panels.Panel.generate_stats>`,\n\n        Generate stats for Server Timing https://w3c.github.io/server-timing/\n\n        Does not return a value.\n        \"\"\"\n\n    def load_stats_from_store(self, data):\n        \"\"\"\n        Instantiate the panel from serialized data.\n\n        Return the panel instance.\n        \"\"\"\n        self.toolbar.stats.setdefault(self.panel_id, {}).update(data)\n        self.from_store = True\n\n    @classmethod\n    def run_checks(cls):\n        \"\"\"\n        Check that the integration is configured correctly for the panel.\n\n        This will be called as a part of the Django checks system when the\n        application is being setup.\n\n        Return a list of :class:`django.core.checks.CheckMessage` instances.\n        \"\"\"\n        return []\n"
  },
  {
    "path": "debug_toolbar/panels/alerts.py",
    "content": "from html.parser import HTMLParser\n\nfrom django.utils.translation import gettext_lazy as _\n\nfrom debug_toolbar.panels import Panel\nfrom debug_toolbar.utils import is_processable_html_response\n\n\nclass FormParser(HTMLParser):\n    \"\"\"\n    HTML form parser, used to check for invalid configurations of forms that\n    take file inputs.\n    \"\"\"\n\n    def __init__(self):\n        super().__init__()\n        self.in_form = False\n        self.current_form = {}\n        self.forms = []\n        self.form_ids = []\n        self.referenced_file_inputs = []\n\n    def handle_starttag(self, tag, attrs):\n        attrs = dict(attrs)\n        if tag == \"form\":\n            self.in_form = True\n            form_id = attrs.get(\"id\")\n            if form_id:\n                self.form_ids.append(form_id)\n            self.current_form = {\n                \"file_form\": False,\n                \"form_attrs\": attrs,\n                \"submit_element_attrs\": [],\n            }\n        elif (\n            self.in_form\n            and tag == \"input\"\n            and attrs.get(\"type\") == \"file\"\n            and (not attrs.get(\"form\") or attrs.get(\"form\") == \"\")\n        ):\n            self.current_form[\"file_form\"] = True\n        elif (\n            self.in_form\n            and (\n                (tag == \"input\" and attrs.get(\"type\") in {\"submit\", \"image\"})\n                or tag == \"button\"\n            )\n            and (not attrs.get(\"form\") or attrs.get(\"form\") == \"\")\n        ):\n            self.current_form[\"submit_element_attrs\"].append(attrs)\n        elif tag == \"input\" and attrs.get(\"form\"):\n            self.referenced_file_inputs.append(attrs)\n\n    def handle_endtag(self, tag):\n        if tag == \"form\" and self.in_form:\n            self.forms.append(self.current_form)\n            self.in_form = False\n\n\nclass AlertsPanel(Panel):\n    \"\"\"\n    A panel to alert users to issues.\n    \"\"\"\n\n    messages = {\n        \"form_id_missing_enctype\": _(\n            'Form with id \"{form_id}\" contains file input, but does not have the attribute enctype=\"multipart/form-data\".'\n        ),\n        \"form_missing_enctype\": _(\n            'Form contains file input, but does not have the attribute enctype=\"multipart/form-data\".'\n        ),\n        \"input_refs_form_missing_enctype\": _(\n            'Input element references form with id \"{form_id}\", but the form does not have the attribute enctype=\"multipart/form-data\".'\n        ),\n    }\n\n    title = _(\"Alerts\")\n\n    is_async = True\n\n    template = \"debug_toolbar/panels/alerts.html\"\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.alerts = []\n\n    @property\n    def nav_subtitle(self):\n        if alerts := self.get_stats().get(\"alerts\"):\n            alert_text = \"alert\" if len(alerts) == 1 else \"alerts\"\n            return f\"{len(alerts)} {alert_text}\"\n        else:\n            return \"\"\n\n    def add_alert(self, alert):\n        self.alerts.append(alert)\n\n    def check_invalid_file_form_configuration(self, html_content):\n        \"\"\"\n        Inspects HTML content for a form that includes a file input but does\n        not have the encoding type set to multipart/form-data, and warns the\n        user if so.\n        \"\"\"\n        parser = FormParser()\n        parser.feed(html_content)\n\n        # Check for file inputs directly inside a form that do not reference\n        # any form through the form attribute\n        for form in parser.forms:\n            if (\n                form[\"file_form\"]\n                and form[\"form_attrs\"].get(\"enctype\") != \"multipart/form-data\"\n                and not any(\n                    elem.get(\"formenctype\") == \"multipart/form-data\"\n                    for elem in form[\"submit_element_attrs\"]\n                )\n            ):\n                if form_id := form[\"form_attrs\"].get(\"id\"):\n                    alert = self.messages[\"form_id_missing_enctype\"].format(\n                        form_id=form_id\n                    )\n                else:\n                    alert = self.messages[\"form_missing_enctype\"]\n                self.add_alert({\"alert\": alert})\n\n        # Check for file inputs that reference a form\n        form_attrs_by_id = {\n            form[\"form_attrs\"].get(\"id\"): form[\"form_attrs\"] for form in parser.forms\n        }\n\n        for attrs in parser.referenced_file_inputs:\n            form_id = attrs.get(\"form\")\n            if form_id and attrs.get(\"type\") == \"file\":\n                form_attrs = form_attrs_by_id.get(form_id)\n                if form_attrs and form_attrs.get(\"enctype\") != \"multipart/form-data\":\n                    alert = self.messages[\"input_refs_form_missing_enctype\"].format(\n                        form_id=form_id\n                    )\n                    self.add_alert({\"alert\": alert})\n\n        return self.alerts\n\n    def generate_stats(self, request, response):\n        if is_processable_html_response(response):\n            html_content = response.content.decode(response.charset)\n            self.check_invalid_file_form_configuration(html_content)\n\n        # Further alert checks can go here\n\n        # Write all alerts to record_stats\n        self.record_stats({\"alerts\": self.alerts})\n"
  },
  {
    "path": "debug_toolbar/panels/cache.py",
    "content": "import functools\nfrom time import perf_counter\n\nfrom asgiref.local import Local\nfrom django.conf import settings\nfrom django.core.cache import CacheHandler, caches\nfrom django.utils.translation import gettext_lazy as _, ngettext\n\nfrom debug_toolbar.panels import Panel\nfrom debug_toolbar.utils import get_stack_trace, get_template_info, render_stacktrace\n\n# The order of the methods in this list determines the order in which they are listed in\n# the Commands table in the panel content.\nWRAPPED_CACHE_METHODS = [\n    \"add\",\n    \"get\",\n    \"set\",\n    \"get_or_set\",\n    \"touch\",\n    \"delete\",\n    \"clear\",\n    \"get_many\",\n    \"set_many\",\n    \"delete_many\",\n    \"has_key\",\n    \"incr\",\n    \"decr\",\n    \"incr_version\",\n    \"decr_version\",\n]\n\n\ndef _monkey_patch_method(cache, name, alias):\n    original_method = getattr(cache, name)\n\n    @functools.wraps(original_method)\n    def wrapper(*args, **kwargs):\n        panel = cache._djdt_panel\n        if panel is None:\n            return original_method(*args, **kwargs)\n        else:\n            return panel._record_call(cache, alias, name, original_method, args, kwargs)\n\n    setattr(cache, name, wrapper)\n\n\ndef _monkey_patch_cache(cache, alias, panel):\n    if not getattr(cache, \"_djdt_panel\", None):\n        for name in WRAPPED_CACHE_METHODS:\n            _monkey_patch_method(cache, name, alias)\n        cache._djdt_panel = panel\n\n\nclass CachePanel(Panel):\n    \"\"\"\n    Panel that displays the cache statistics.\n    \"\"\"\n\n    template = \"debug_toolbar/panels/cache.html\"\n\n    is_async = True\n\n    _context_locals = Local()\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.total_time = 0\n        self.hits = 0\n        self.misses = 0\n        self.calls = []\n        self.counts = dict.fromkeys(WRAPPED_CACHE_METHODS, 0)\n\n    @classmethod\n    def current_instance(cls):\n        \"\"\"\n        Return the currently enabled CachePanel instance or None.\n\n        If a request is in process with a CachePanel enabled, this will return that\n        panel (based on the current thread or async task).  Otherwise it will return\n        None.\n        \"\"\"\n        return getattr(cls._context_locals, \"current_instance\", None)\n\n    @classmethod\n    def ready(cls):\n        if not hasattr(CacheHandler, \"_djdt_patched\"):\n            # Wrap the CacheHander.create_connection() method to monkey patch any new\n            # cache connections that are opened while instrumentation is enabled.  In\n            # the interests of thread safety, this is done once at startup time and\n            # never removed.\n            original_method = CacheHandler.create_connection\n\n            @functools.wraps(original_method)\n            def wrapper(self, alias):\n                cache = original_method(self, alias)\n                panel = cls.current_instance()\n                if panel is not None:\n                    _monkey_patch_cache(cache, alias, panel)\n                return cache\n\n            CacheHandler.create_connection = wrapper\n            CacheHandler._djdt_patched = True\n\n    def _store_call_info(\n        self,\n        name,\n        time_taken,\n        return_value,\n        args,\n        kwargs,\n        trace,\n        template_info,\n        backend,\n    ):\n        if name == \"get\" or name == \"get_or_set\":\n            if return_value is None:\n                self.misses += 1\n            else:\n                self.hits += 1\n        elif name == \"get_many\":\n            keys = kwargs[\"keys\"] if \"keys\" in kwargs else args[0]\n            self.hits += len(return_value)\n            self.misses += len(keys) - len(return_value)\n        time_taken *= 1000\n\n        self.total_time += time_taken\n        self.counts[name] += 1\n        self.calls.append(\n            {\n                \"time\": time_taken,\n                \"name\": name,\n                \"args\": args,\n                \"kwargs\": kwargs,\n                \"trace\": render_stacktrace(trace),\n                \"template_info\": template_info,\n                \"backend\": backend,\n            }\n        )\n\n    def _record_call(self, cache, alias, name, original_method, args, kwargs):\n        # Some cache backends implement certain cache methods in terms of other cache\n        # methods (e.g. get_or_set() in terms of get() and add()).  In order to only\n        # record the calls made directly by the user code, set the cache's _djdt_panel\n        # attribute to None before invoking the original method, which will cause the\n        # monkey-patched cache methods to skip recording additional calls made during\n        # the course of this call, and then reset it back afterward.\n        cache._djdt_panel = None\n        try:\n            start_time = perf_counter()\n            value = original_method(*args, **kwargs)\n            t = perf_counter() - start_time\n        finally:\n            cache._djdt_panel = self\n\n        self._store_call_info(\n            name=name,\n            time_taken=t,\n            return_value=value,\n            args=args,\n            kwargs=kwargs,\n            trace=get_stack_trace(skip=2),\n            template_info=get_template_info(),\n            backend=f\"{alias} ({type(cache).__name__})\",\n        )\n        return value\n\n    # Implement the Panel API\n\n    nav_title = _(\"Cache\")\n\n    @property\n    def nav_subtitle(self):\n        stats = self.get_stats()\n        cache_calls = len(stats.get(\"calls\"))\n        return ngettext(\n            \"%(cache_calls)d call in %(time).2fms\",\n            \"%(cache_calls)d calls in %(time).2fms\",\n            cache_calls,\n        ) % {\"cache_calls\": cache_calls, \"time\": stats.get(\"total_time\")}\n\n    @property\n    def title(self):\n        count = self.get_stats().get(\"total_caches\")\n        return ngettext(\n            \"Cache calls from %(count)d backend\",\n            \"Cache calls from %(count)d backends\",\n            count,\n        ) % {\"count\": count}\n\n    def enable_instrumentation(self):\n        # Monkey patch all open cache connections.  Django maintains cache connections\n        # on a per-thread/async task basis, so this will not affect any concurrent\n        # requests.  The monkey patch of CacheHander.create_connection() installed in\n        # the .ready() method will ensure that any new cache connections that get opened\n        # during this request will also be monkey patched.\n        for cache, alias in self.initialized_caches():\n            _monkey_patch_cache(cache, alias, self)\n        # Mark this panel instance as the current one for the active thread/async task\n        # context.  This will be used by the CacheHander.create_connection() monkey\n        # patch.\n        self._context_locals.current_instance = self\n\n    def disable_instrumentation(self):\n        if hasattr(self._context_locals, \"current_instance\"):\n            del self._context_locals.current_instance\n        for cache in caches.all(initialized_only=True):\n            cache._djdt_panel = None\n\n    def initialized_caches(self):\n        \"\"\"\n        Return the initialized caches and aliases.\n\n        This does the same as`caches.all(initialized_only=True)`, but keeps\n        the alias with each cache instance.\n        \"\"\"\n        for alias in caches:\n            if hasattr(caches._connections, alias):\n                yield caches[alias], alias\n\n    def generate_stats(self, request, response):\n        self.record_stats(\n            {\n                \"total_calls\": len(self.calls),\n                \"calls\": self.calls,\n                \"total_time\": self.total_time,\n                \"hits\": self.hits,\n                \"misses\": self.misses,\n                \"counts\": self.counts,\n                \"total_caches\": len(getattr(settings, \"CACHES\", [\"default\"])),\n            }\n        )\n\n    def generate_server_timing(self, request, response):\n        stats = self.get_stats()\n        value = stats.get(\"total_time\", 0)\n        title = \"Cache {} Calls\".format(stats.get(\"total_calls\", 0))\n        self.record_server_timing(\"total_time\", title, value)\n"
  },
  {
    "path": "debug_toolbar/panels/community.py",
    "content": "from django.utils.translation import gettext_lazy as _\n\nfrom debug_toolbar.panels import Panel\n\n\nclass CommunityPanel(Panel):\n    \"\"\"\n    A panel that provides links to the Django Debug Toolbar community.\n    \"\"\"\n\n    is_async = True\n    template = \"debug_toolbar/panels/community.html\"\n    title = _(\"Community\")\n"
  },
  {
    "path": "debug_toolbar/panels/headers.py",
    "content": "from django.utils.translation import gettext_lazy as _\n\nfrom debug_toolbar.panels import Panel\n\n\nclass HeadersPanel(Panel):\n    \"\"\"\n    A panel to display HTTP headers.\n    \"\"\"\n\n    # List of environment variables we want to display\n    ENVIRON_FILTER = {\n        \"CONTENT_LENGTH\",\n        \"CONTENT_TYPE\",\n        \"DJANGO_SETTINGS_MODULE\",\n        \"GATEWAY_INTERFACE\",\n        \"QUERY_STRING\",\n        \"PATH_INFO\",\n        \"PYTHONPATH\",\n        \"REMOTE_ADDR\",\n        \"REMOTE_HOST\",\n        \"REQUEST_METHOD\",\n        \"SCRIPT_NAME\",\n        \"SERVER_NAME\",\n        \"SERVER_PORT\",\n        \"SERVER_PROTOCOL\",\n        \"SERVER_SOFTWARE\",\n        \"TZ\",\n    }\n\n    title = _(\"Headers\")\n\n    is_async = True\n\n    template = \"debug_toolbar/panels/headers.html\"\n\n    def process_request(self, request):\n        wsgi_env = sorted(request.META.items())\n        self.request_headers = {\n            unmangle(k): v for (k, v) in wsgi_env if is_http_header(k)\n        }\n        if \"Cookie\" in self.request_headers:\n            self.request_headers[\"Cookie\"] = \"=> see Request panel\"\n        self.environ = {k: v for (k, v) in wsgi_env if k in self.ENVIRON_FILTER}\n        self.record_stats(\n            {\"request_headers\": self.request_headers, \"environ\": self.environ}\n        )\n        return super().process_request(request)\n\n    def generate_stats(self, request, response):\n        self.response_headers = dict(sorted(response.items()))\n        self.record_stats({\"response_headers\": self.response_headers})\n\n\ndef is_http_header(wsgi_key):\n    # The WSGI spec says that keys should be str objects in the environ dict,\n    # but this isn't true in practice. See issues #449 and #482.\n    return isinstance(wsgi_key, str) and wsgi_key.startswith(\"HTTP_\")\n\n\ndef unmangle(wsgi_key):\n    return wsgi_key[5:].replace(\"_\", \"-\").title()\n"
  },
  {
    "path": "debug_toolbar/panels/history/__init__.py",
    "content": "from debug_toolbar.panels.history.panel import HistoryPanel\n\n__all__: list[str] = [HistoryPanel.panel_id]\n"
  },
  {
    "path": "debug_toolbar/panels/history/forms.py",
    "content": "from django import forms\n\n\nclass HistoryStoreForm(forms.Form):\n    \"\"\"\n    Validate params\n\n        request_id: The key for the store instance to be fetched.\n    \"\"\"\n\n    request_id = forms.CharField(widget=forms.HiddenInput())\n    exclude_history = forms.BooleanField(widget=forms.HiddenInput(), required=False)\n"
  },
  {
    "path": "debug_toolbar/panels/history/panel.py",
    "content": "import contextlib\nimport json\n\nfrom django.http import HttpResponse, QueryDict\nfrom django.http.request import HttpRequest, RawPostDataException\nfrom django.template.loader import render_to_string\nfrom django.templatetags.static import static\nfrom django.urls import URLPattern, path\nfrom django.utils import timezone\nfrom django.utils.translation import gettext_lazy as _\n\nfrom debug_toolbar.panels import Panel\nfrom debug_toolbar.panels.history import views\nfrom debug_toolbar.panels.history.forms import HistoryStoreForm\n\n\nclass HistoryPanel(Panel):\n    \"\"\"A panel to display History\"\"\"\n\n    is_async = True\n    title = _(\"History\")\n    nav_title = _(\"History\")\n    template = \"debug_toolbar/panels/history.html\"\n\n    def get_headers(self, request: HttpRequest) -> dict:\n        headers: dict = super().get_headers(request)\n        observe_request = self.toolbar.get_observe_request()\n        request_id = self.toolbar.request_id\n        if request_id and observe_request(request):\n            headers[\"djdt-request-id\"] = request_id\n        return headers\n\n    @property\n    def enabled(self) -> bool:\n        # Do not show the history panel if the panels are rendered on request\n        # rather than loaded via ajax.\n        return super().enabled and not self.toolbar.should_render_panels()\n\n    @property\n    def is_historical(self) -> bool:\n        \"\"\"The HistoryPanel should not be included in the historical panels.\"\"\"\n        return False\n\n    @classmethod\n    def get_urls(cls) -> list[URLPattern]:\n        return [\n            path(\"history_sidebar/\", views.history_sidebar, name=\"history_sidebar\"),\n            path(\"history_refresh/\", views.history_refresh, name=\"history_refresh\"),\n        ]\n\n    @property\n    def nav_subtitle(self) -> str:\n        return self.get_stats().get(\"request_url\", \"\")\n\n    def generate_stats(self, request: HttpRequest, response: HttpResponse) -> None:\n        data: QueryDict | None = None\n        try:\n            if request.method == \"GET\":\n                data = request.GET.copy()\n            else:\n                data = request.POST.copy()\n            # GraphQL tends to not be populated in POST. If the request seems\n            # empty, check if it's a JSON request.\n            if (\n                not data\n                and request.body\n                and request.headers.get(\"content-type\") == \"application/json\"\n            ):\n                with contextlib.suppress(ValueError):\n                    data = json.loads(request.body)\n\n        except RawPostDataException:\n            # It is not guaranteed that we may read the request data (again).\n            pass\n\n        self.record_stats(\n            {\n                \"request_url\": request.get_full_path(),\n                \"request_method\": request.method,\n                \"status_code\": response.status_code,\n                \"data\": data,\n                \"time\": timezone.now(),\n            }\n        )\n\n    @property\n    def content(self) -> str:\n        \"\"\"Content of the panel when it's displayed in full screen.\n\n        Fetch every store for the toolbar and include it in the template.\n        \"\"\"\n        toolbar_history: dict[str, dict] = {}\n        for request_id in reversed(self.toolbar.store.request_ids()):\n            toolbar_history[request_id] = {\n                \"history_stats\": self.toolbar.store.panel(\n                    request_id, HistoryPanel.panel_id\n                ),\n                \"form\": HistoryStoreForm(\n                    initial={\"request_id\": request_id, \"exclude_history\": True}\n                ),\n            }\n\n        return render_to_string(\n            self.template,\n            {\n                \"current_request_id\": self.toolbar.request_id,\n                \"toolbar_history\": toolbar_history,\n                \"refresh_form\": HistoryStoreForm(\n                    initial={\n                        \"request_id\": self.toolbar.request_id,\n                        \"exclude_history\": True,\n                    }\n                ),\n            },\n        )\n\n    @property\n    def scripts(self) -> list[str]:\n        scripts: list[str] = super().scripts\n        scripts.append(static(\"debug_toolbar/js/history.js\"))\n        return scripts\n"
  },
  {
    "path": "debug_toolbar/panels/history/views.py",
    "content": "from django.http import HttpRequest, HttpResponseBadRequest, JsonResponse\nfrom django.template.loader import render_to_string\n\nfrom debug_toolbar._compat import login_not_required\nfrom debug_toolbar.decorators import render_with_toolbar_language, require_show_toolbar\nfrom debug_toolbar.panels.history.forms import HistoryStoreForm\nfrom debug_toolbar.store import get_store\nfrom debug_toolbar.toolbar import DebugToolbar\n\n\n@login_not_required\n@require_show_toolbar\n@render_with_toolbar_language\ndef history_sidebar(\n    request: HttpRequest,\n) -> HttpResponseBadRequest | JsonResponse:\n    \"\"\"Returns the selected debug toolbar history snapshot.\"\"\"\n    form = HistoryStoreForm(request.GET)\n\n    if form.is_valid():\n        request_id: str = form.cleaned_data[\"request_id\"]\n        toolbar: DebugToolbar | None = DebugToolbar.fetch(request_id)\n        exclude_history = form.cleaned_data[\"exclude_history\"]\n        context: dict[str, dict[str, str]] = {}\n        if toolbar is None:\n            # When the request_id has been popped already due to\n            # RESULTS_CACHE_SIZE\n            return JsonResponse(context)\n        for panel in toolbar.panels:\n            if exclude_history and not panel.is_historical:\n                continue\n            panel_context = {\"panel\": panel}\n            context[panel.panel_id] = {\n                \"button\": render_to_string(\n                    \"debug_toolbar/includes/panel_button.html\", panel_context\n                ),\n                \"content\": render_to_string(\n                    \"debug_toolbar/includes/panel_content.html\", panel_context\n                ),\n            }\n        return JsonResponse(context)\n    return HttpResponseBadRequest(f\"Form errors: {form.errors}\")\n\n\n@login_not_required\n@require_show_toolbar\n@render_with_toolbar_language\ndef history_refresh(\n    request: HttpRequest,\n) -> HttpResponseBadRequest | JsonResponse:\n    \"\"\"Returns the refreshed list of table rows for the History Panel.\"\"\"\n    form = HistoryStoreForm(request.GET)\n\n    if form.is_valid():\n        requests: list[dict[str, str]] = []\n        # Convert to list to handle mutations happening in parallel\n        for request_id in get_store().request_ids():\n            toolbar = DebugToolbar.fetch(request_id)\n            requests.append(\n                {\n                    \"id\": request_id,\n                    \"content\": render_to_string(\n                        \"debug_toolbar/panels/history_tr.html\",\n                        {\n                            \"request_id\": request_id,\n                            \"history_context\": {\n                                \"history_stats\": toolbar.store.panel(\n                                    request_id, \"HistoryPanel\"\n                                ),\n                                \"form\": HistoryStoreForm(\n                                    initial={\n                                        \"request_id\": request_id,\n                                        \"exclude_history\": True,\n                                    }\n                                ),\n                            },\n                        },\n                    ),\n                }\n            )\n\n        return JsonResponse({\"requests\": requests})\n    return HttpResponseBadRequest(\"Form errors\")\n"
  },
  {
    "path": "debug_toolbar/panels/profiling.py",
    "content": "import cProfile\nimport os\nfrom colorsys import hsv_to_rgb\nfrom pstats import Stats\n\nfrom django.conf import settings\nfrom django.utils.html import format_html\nfrom django.utils.translation import gettext_lazy as _\n\nfrom debug_toolbar import settings as dt_settings\nfrom debug_toolbar.panels import Panel\n\n\nclass FunctionCall:\n    def __init__(\n        self, statobj, func, depth=0, stats=None, id=0, parent_ids=None, hsv=(0, 0.5, 1)\n    ):\n        self.statobj = statobj\n        self.func = func\n        if stats:\n            self.stats = stats\n        else:\n            self.stats = statobj.stats[func][:4]\n        self.depth = depth\n        self.id = id\n        self.parent_ids = parent_ids or []\n        self.hsv = hsv\n        self.has_subfuncs = False\n\n    def parent_classes(self):\n        return self.parent_classes\n\n    def background(self):\n        r, g, b = hsv_to_rgb(*self.hsv)\n        return f\"rgb({r * 100:f}%,{g * 100:f}%,{b * 100:f}%)\"\n\n    def is_project_func(self):\n        \"\"\"\n        Check if the function is from the project code.\n\n        Project code is identified by the BASE_DIR setting\n        which is used in Django projects by default.\n        \"\"\"\n        if hasattr(settings, \"BASE_DIR\"):\n            file_name, _, _ = self.func\n            base_dir = str(settings.BASE_DIR)\n\n            file_name = os.path.normpath(file_name)\n            base_dir = os.path.normpath(base_dir)\n\n            return file_name.startswith(base_dir) and not any(\n                directory in file_name.split(os.path.sep)\n                for directory in [\"site-packages\", \"dist-packages\"]\n            )\n        return None\n\n    def func_std_string(self):  # match what old profile produced\n        func_name = self.func\n        if func_name[:2] == (\"~\", 0):\n            # special case for built-in functions\n            name = func_name[2]\n            if name.startswith(\"<\") and name.endswith(\">\"):\n                return f\"{{{name[1:-1]}}}\"\n            else:\n                return name\n        else:\n            file_name, line_num, method = self.func\n            idx = file_name.find(\"/site-packages/\")\n            if idx > -1:\n                file_name = file_name[(idx + 14) :]\n\n            split_path = file_name.rsplit(os.sep, 1)\n            if len(split_path) > 1:\n                file_path, file_name = file_name.rsplit(os.sep, 1)\n            else:\n                file_path = \"<module>\"\n\n            return format_html(\n                '<span class=\"djdt-path\">{0}/</span>'\n                '<span class=\"djdt-file\">{1}</span>'\n                ' in <span class=\"djdt-func\">{3}</span>'\n                '(<span class=\"djdt-lineno\">{2}</span>)',\n                file_path,\n                file_name,\n                line_num,\n                method,\n            )\n\n    def subfuncs(self):\n        h, s, v = self.hsv\n        count = len(self.statobj.all_callees[self.func])\n        for i, (func, stats) in enumerate(self.statobj.all_callees[self.func].items()):\n            h1 = h + ((i + 1) / count) / (self.depth + 1)\n            s1 = 0 if self.stats[3] == 0 else s * (stats[3] / self.stats[3])\n            yield FunctionCall(\n                self.statobj,\n                func,\n                self.depth + 1,\n                stats=stats,\n                id=str(self.id) + \"_\" + str(i),\n                parent_ids=self.parent_ids + [self.id],\n                hsv=(h1, s1, 1),\n            )\n\n    def count(self):\n        return self.stats[1]\n\n    def tottime(self):\n        return self.stats[2]\n\n    def cumtime(self):\n        cc, nc, tt, ct = self.stats\n        return self.stats[3]\n\n    def tottime_per_call(self):\n        cc, nc, tt, ct = self.stats\n\n        if nc == 0:\n            return 0\n\n        return tt / nc\n\n    def cumtime_per_call(self):\n        cc, nc, tt, ct = self.stats\n\n        if cc == 0:\n            return 0\n\n        return ct / cc\n\n    def indent(self):\n        return 16 * self.depth\n\n    def serialize(self):\n        return {\n            \"has_subfuncs\": self.has_subfuncs,\n            \"id\": self.id,\n            \"parent_ids\": self.parent_ids,\n            \"is_project_func\": self.is_project_func(),\n            \"indent\": self.indent(),\n            \"func_std_string\": self.func_std_string(),\n            \"cumtime\": self.cumtime(),\n            \"cumtime_per_call\": self.cumtime_per_call(),\n            \"tottime\": self.tottime(),\n            \"tottime_per_call\": self.tottime_per_call(),\n            \"count\": self.count(),\n        }\n\n\nclass ProfilingPanel(Panel):\n    \"\"\"\n    Panel that displays profiling information.\n    \"\"\"\n\n    is_async = False\n    title = _(\"Profiling\")\n\n    template = \"debug_toolbar/panels/profiling.html\"\n    capture_project_code = dt_settings.get_config()[\"PROFILER_CAPTURE_PROJECT_CODE\"]\n\n    def process_request(self, request):\n        self.profiler = cProfile.Profile()\n        return self.profiler.runcall(super().process_request, request)\n\n    def add_node(self, func_list, func, max_depth, cum_time):\n        func_list.append(func)\n        if func.depth < max_depth:\n            for subfunc in func.subfuncs():\n                # Always include the user's code\n                if subfunc.stats[3] >= cum_time or (\n                    self.capture_project_code\n                    and subfunc.is_project_func()\n                    and subfunc.stats[3] > 0\n                ):\n                    func.has_subfuncs = True\n                    self.add_node(func_list, subfunc, max_depth, cum_time)\n\n    def generate_stats(self, request, response):\n        if not hasattr(self, \"profiler\"):\n            return None\n        # Could be delayed until the panel content is requested (perf. optim.)\n        self.profiler.create_stats()\n        self.stats = Stats(self.profiler)\n        self.stats.calc_callees()\n\n        root_func = cProfile.label(super().process_request.__code__)\n\n        if root_func in self.stats.stats:\n            root = FunctionCall(self.stats, root_func, depth=0)\n            func_list = []\n            cum_time_threshold = (\n                root.stats[3] / dt_settings.get_config()[\"PROFILER_THRESHOLD_RATIO\"]\n            )\n            self.add_node(\n                func_list,\n                root,\n                dt_settings.get_config()[\"PROFILER_MAX_DEPTH\"],\n                cum_time_threshold,\n            )\n            self.record_stats({\"func_list\": [func.serialize() for func in func_list]})\n"
  },
  {
    "path": "debug_toolbar/panels/redirects.py",
    "content": "import warnings\nfrom inspect import iscoroutine\n\nfrom django.template.response import SimpleTemplateResponse\nfrom django.utils.translation import gettext_lazy as _\n\nfrom debug_toolbar.panels import Panel\n\n\nclass RedirectsPanel(Panel):\n    \"\"\"\n    Panel that intercepts redirects and displays a page with debug info.\n    \"\"\"\n\n    has_content = False\n\n    is_async = True\n\n    nav_title = _(\"Intercept redirects\")\n\n    def _process_response(self, response):\n        \"\"\"\n        Common response processing logic.\n        \"\"\"\n        if 300 <= response.status_code < 400:\n            if redirect_to := response.get(\"Location\"):\n                response = self.get_interception_response(response, redirect_to)\n                response.render()\n        return response\n\n    async def aprocess_request(self, request, response_coroutine):\n        \"\"\"\n        Async version of process_request. used for accessing the response\n        by awaiting it when running in ASGI.\n        \"\"\"\n\n        response = await response_coroutine\n        return self._process_response(response)\n\n    def process_request(self, request):\n        response = super().process_request(request)\n        if iscoroutine(response):\n            return self.aprocess_request(request, response)\n        return self._process_response(response)\n\n    def get_interception_response(self, response, redirect_to):\n        \"\"\"\n        Hook method to allow subclasses to customize the interception response.\n        \"\"\"\n        status_line = f\"{response.status_code} {response.reason_phrase}\"\n        cookies = response.cookies\n        original_response = response\n        context = {\n            \"redirect_to\": redirect_to,\n            \"status_line\": status_line,\n            \"toolbar\": self.toolbar,\n            \"original_response\": original_response,\n        }\n        # Using SimpleTemplateResponse avoids running global context processors.\n        response = SimpleTemplateResponse(\"debug_toolbar/redirect.html\", context)\n        response.cookies = cookies\n        response.original_response = original_response\n\n        warnings.warn(\n            \"The RedirectsPanel is deprecated and will be removed in a future version. \"\n            \"The HistoryPanel now provides the ability to view toolbar data for redirected requests. \"\n            \"If you still have a use case for this panel, please comment on \"\n            \"https://github.com/django-commons/django-debug-toolbar/issues/2216\",\n            DeprecationWarning,\n            stacklevel=2,\n        )\n        return response\n"
  },
  {
    "path": "debug_toolbar/panels/request.py",
    "content": "from django.http import Http404\nfrom django.urls import resolve\nfrom django.utils.translation import gettext_lazy as _\n\nfrom debug_toolbar.panels import Panel\nfrom debug_toolbar.utils import get_name_from_obj, sanitize_and_sort_request_vars\n\n\nclass RequestPanel(Panel):\n    \"\"\"\n    A panel to display request variables (POST/GET, session, cookies).\n    \"\"\"\n\n    template = \"debug_toolbar/panels/request.html\"\n\n    title = _(\"Request\")\n\n    @property\n    def nav_subtitle(self):\n        \"\"\"\n        Show abbreviated name of view function as subtitle\n        \"\"\"\n        view_func = self.get_stats().get(\"view_func\", \"\")\n        return view_func.rsplit(\".\", 1)[-1]\n\n    def generate_stats(self, request, response):\n        self.record_stats(\n            {\n                \"get\": sanitize_and_sort_request_vars(request.GET),\n                \"post\": sanitize_and_sort_request_vars(request.POST),\n                \"cookies\": sanitize_and_sort_request_vars(request.COOKIES),\n            }\n        )\n\n        view_info = {\n            \"view_func\": _(\"<no view>\"),\n            \"view_args\": \"None\",\n            \"view_kwargs\": \"None\",\n            \"view_urlname\": \"None\",\n        }\n        try:\n            match = resolve(request.path_info)\n            func, args, kwargs = match\n            view_info[\"view_func\"] = get_name_from_obj(func)\n            view_info[\"view_args\"] = args\n            view_info[\"view_kwargs\"] = kwargs\n\n            if getattr(match, \"url_name\", False):\n                url_name = match.url_name\n                if match.namespaces:\n                    url_name = \":\".join([*match.namespaces, url_name])\n            else:\n                url_name = _(\"<unavailable>\")\n\n            view_info[\"view_urlname\"] = url_name\n\n        except Http404:\n            pass\n        self.record_stats(view_info)\n\n        if hasattr(request, \"session\"):\n            session_data = dict(request.session)\n            self.record_stats({\"session\": sanitize_and_sort_request_vars(session_data)})\n"
  },
  {
    "path": "debug_toolbar/panels/settings.py",
    "content": "from pprint import pformat\n\nfrom django.utils.translation import gettext_lazy as _\nfrom django.views.debug import get_default_exception_reporter_filter\n\nfrom debug_toolbar.panels import Panel\n\nget_safe_settings = get_default_exception_reporter_filter().get_safe_settings\n\n\ndef safe_pformat(obj):\n    try:\n        return pformat(obj)\n    except Exception as e:\n        return f\"<unformattable {type(obj).__name__}: {e!r}>\"\n\n\nclass SettingsPanel(Panel):\n    \"\"\"\n    A panel to display all variables in django.conf.settings\n    \"\"\"\n\n    template = \"debug_toolbar/panels/settings.html\"\n\n    is_async = True\n\n    nav_title = _(\"Settings\")\n\n    def title(self):\n        return _(\"Settings from %s\") % self.get_stats()[\"settings\"].get(\n            \"SETTINGS_MODULE\"\n        )\n\n    def generate_stats(self, request, response):\n        self.record_stats(\n            {\n                \"settings\": {\n                    key: safe_pformat(value)\n                    for key, value in sorted(get_safe_settings().items())\n                }\n            }\n        )\n"
  },
  {
    "path": "debug_toolbar/panels/signals.py",
    "content": "import weakref\n\nfrom django.core.signals import (\n    got_request_exception,\n    request_finished,\n    request_started,\n    setting_changed,\n)\nfrom django.db.backends.signals import connection_created\nfrom django.db.models.signals import (\n    class_prepared,\n    m2m_changed,\n    post_delete,\n    post_init,\n    post_migrate,\n    post_save,\n    pre_delete,\n    pre_init,\n    pre_migrate,\n    pre_save,\n)\nfrom django.utils.module_loading import import_string\nfrom django.utils.translation import gettext_lazy as _, ngettext\n\nfrom debug_toolbar.panels import Panel\n\n\nclass SignalsPanel(Panel):\n    template = \"debug_toolbar/panels/signals.html\"\n\n    is_async = True\n\n    SIGNALS = {\n        \"request_started\": request_started,\n        \"request_finished\": request_finished,\n        \"got_request_exception\": got_request_exception,\n        \"connection_created\": connection_created,\n        \"class_prepared\": class_prepared,\n        \"pre_init\": pre_init,\n        \"post_init\": post_init,\n        \"pre_save\": pre_save,\n        \"post_save\": post_save,\n        \"pre_delete\": pre_delete,\n        \"post_delete\": post_delete,\n        \"m2m_changed\": m2m_changed,\n        \"pre_migrate\": pre_migrate,\n        \"post_migrate\": post_migrate,\n        \"setting_changed\": setting_changed,\n    }\n\n    def nav_subtitle(self):\n        signals = self.get_stats()[\"signals\"]\n        num_receivers = sum(len(receivers) for name, receivers in signals)\n        num_signals = len(signals)\n        # here we have to handle a double count translation, hence the\n        # hard coding of one signal\n        if num_signals == 1:\n            return ngettext(\n                \"%(num_receivers)d receiver of 1 signal\",\n                \"%(num_receivers)d receivers of 1 signal\",\n                num_receivers,\n            ) % {\"num_receivers\": num_receivers}\n        return ngettext(\n            \"%(num_receivers)d receiver of %(num_signals)d signals\",\n            \"%(num_receivers)d receivers of %(num_signals)d signals\",\n            num_receivers,\n        ) % {\"num_receivers\": num_receivers, \"num_signals\": num_signals}\n\n    title = _(\"Signals\")\n\n    @property\n    def signals(self):\n        signals = self.SIGNALS.copy()\n        for signal in self.toolbar.config[\"EXTRA_SIGNALS\"]:\n            signal_name = signal.rsplit(\".\", 1)[-1]\n            signals[signal_name] = import_string(signal)\n        return signals\n\n    def generate_stats(self, request, response):\n        signals = []\n        for name, signal in sorted(self.signals.items()):\n            receivers = []\n            for receiver in signal.receivers:\n                receiver = receiver[1]\n                if isinstance(receiver, weakref.ReferenceType):\n                    receiver = receiver()\n                if receiver is None:\n                    continue\n\n                receiver = getattr(receiver, \"__wraps__\", receiver)\n                receiver_name = getattr(receiver, \"__name__\", str(receiver))\n                if getattr(receiver, \"__self__\", None) is not None:\n                    receiver_class_name = getattr(\n                        receiver.__self__, \"__class__\", type\n                    ).__name__\n                    text = f\"{receiver_class_name}.{receiver_name}\"\n                else:\n                    text = receiver_name\n                receivers.append(text)\n            signals.append((name, receivers))\n\n        self.record_stats({\"signals\": signals})\n"
  },
  {
    "path": "debug_toolbar/panels/sql/__init__.py",
    "content": "from debug_toolbar.panels.sql.panel import SQLPanel\n\n__all__ = [SQLPanel.panel_id]\n"
  },
  {
    "path": "debug_toolbar/panels/sql/forms.py",
    "content": "import json\n\nfrom django import forms\nfrom django.core.exceptions import ValidationError\nfrom django.db import connections\nfrom django.utils.functional import cached_property\nfrom django.utils.translation import gettext_lazy as _\n\nfrom debug_toolbar.panels.sql.utils import is_select_query, reformat_sql\nfrom debug_toolbar.toolbar import DebugToolbar\n\n\nclass SQLSelectForm(forms.Form):\n    \"\"\"\n    Validate params\n\n        request_id: The identifier for the request\n        query_id: The identifier for the query\n    \"\"\"\n\n    request_id = forms.CharField()\n    djdt_query_id = forms.CharField()\n\n    def clean_raw_sql(self):\n        value = self.cleaned_data[\"raw_sql\"]\n\n        if not is_select_query(value):\n            raise ValidationError(\"Only 'select' queries are allowed.\")\n\n        return value\n\n    def clean_params(self):\n        value = self.cleaned_data[\"params\"]\n\n        try:\n            return json.loads(value)\n        except ValueError as exc:\n            raise ValidationError(\"Is not valid JSON\") from exc\n\n    def clean_alias(self):\n        value = self.cleaned_data[\"alias\"]\n\n        if value not in connections:\n            raise ValidationError(f\"Database alias '{value}' not found\")\n\n        return value\n\n    def clean(self):\n        from debug_toolbar.panels.sql import SQLPanel\n\n        cleaned_data = super().clean()\n        toolbar = DebugToolbar.fetch(\n            self.cleaned_data[\"request_id\"], panel_id=SQLPanel.panel_id\n        )\n        if toolbar is None:\n            raise ValidationError(_(\"Data for this panel isn't available anymore.\"))\n\n        panel = toolbar.get_panel_by_id(SQLPanel.panel_id)\n        # Find the query for this form submission\n        query = None\n        for q in panel.get_stats()[\"queries\"]:\n            if q[\"djdt_query_id\"] != self.cleaned_data[\"djdt_query_id\"]:\n                continue\n            else:\n                query = q\n                break\n        if not query:\n            raise ValidationError(_(\"Invalid query id.\"))\n        cleaned_data[\"query\"] = query\n        return cleaned_data\n\n    def select(self):\n        query = self.cleaned_data[\"query\"]\n        sql = query[\"raw_sql\"]\n        params = json.loads(query[\"params\"])\n        with self.cursor as cursor:\n            cursor.execute(sql, params)\n            headers = [d[0] for d in cursor.description]\n            result = cursor.fetchall()\n            return result, headers\n\n    def explain(self):\n        query = self.cleaned_data[\"query\"]\n        sql = query[\"raw_sql\"]\n        params = json.loads(query[\"params\"])\n        vendor = query[\"vendor\"]\n        with self.cursor as cursor:\n            if vendor == \"sqlite\":\n                # SQLite's EXPLAIN dumps the low-level opcodes generated for a query;\n                # EXPLAIN QUERY PLAN dumps a more human-readable summary\n                # See https://www.sqlite.org/lang_explain.html for details\n                cursor.execute(f\"EXPLAIN QUERY PLAN {sql}\", params)\n            elif vendor == \"postgresql\":\n                cursor.execute(f\"EXPLAIN ANALYZE {sql}\", params)\n            else:\n                cursor.execute(f\"EXPLAIN {sql}\", params)\n            headers = [d[0] for d in cursor.description]\n            result = cursor.fetchall()\n            return result, headers\n\n    def profile(self):\n        query = self.cleaned_data[\"query\"]\n        sql = query[\"raw_sql\"]\n        params = json.loads(query[\"params\"])\n        with self.cursor as cursor:\n            cursor.execute(\"SET PROFILING=1\")  # Enable profiling\n            cursor.execute(sql, params)  # Execute SELECT\n            cursor.execute(\"SET PROFILING=0\")  # Disable profiling\n            # The Query ID should always be 1 here but I'll subselect to get\n            # the last one just in case...\n            cursor.execute(\n                \"\"\"\n                SELECT *\n                FROM information_schema.profiling\n                WHERE query_id = (\n                    SELECT query_id\n                    FROM information_schema.profiling\n                    ORDER BY query_id DESC\n                    LIMIT 1\n                )\n                \"\"\"\n            )\n            headers = [d[0] for d in cursor.description]\n            result = cursor.fetchall()\n            return result, headers\n\n    def reformat_sql(self):\n        return reformat_sql(self.cleaned_data[\"query\"][\"sql\"], with_toggle=False)\n\n    @property\n    def connection(self):\n        return connections[self.cleaned_data[\"query\"][\"alias\"]]\n\n    @cached_property\n    def cursor(self):\n        return self.connection.cursor()\n"
  },
  {
    "path": "debug_toolbar/panels/sql/panel.py",
    "content": "import uuid\nfrom collections import defaultdict\n\nfrom asgiref.sync import sync_to_async\nfrom django.db import connections\nfrom django.template.loader import render_to_string\nfrom django.urls import path\nfrom django.utils.functional import cached_property\nfrom django.utils.translation import gettext_lazy as _, ngettext\n\nfrom debug_toolbar import settings as dt_settings\nfrom debug_toolbar.forms import SignedDataForm\nfrom debug_toolbar.panels import Panel\nfrom debug_toolbar.panels.sql import views\nfrom debug_toolbar.panels.sql.forms import SQLSelectForm\nfrom debug_toolbar.panels.sql.tracking import wrap_cursor\nfrom debug_toolbar.panels.sql.utils import (\n    contrasting_color_generator,\n    is_select_query,\n    reformat_sql,\n)\nfrom debug_toolbar.utils import render_stacktrace\n\n\ndef get_isolation_level_display(vendor, level):\n    if vendor == \"postgresql\":\n        try:\n            import psycopg\n\n            choices = {\n                # AUTOCOMMIT level does not exists in psycopg3\n                psycopg.IsolationLevel.READ_UNCOMMITTED: _(\"Read uncommitted\"),\n                psycopg.IsolationLevel.READ_COMMITTED: _(\"Read committed\"),\n                psycopg.IsolationLevel.REPEATABLE_READ: _(\"Repeatable read\"),\n                psycopg.IsolationLevel.SERIALIZABLE: _(\"Serializable\"),\n            }\n        except ImportError:\n            import psycopg2.extensions\n\n            choices = {\n                psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT: _(\"Autocommit\"),\n                psycopg2.extensions.ISOLATION_LEVEL_READ_UNCOMMITTED: _(\n                    \"Read uncommitted\"\n                ),\n                psycopg2.extensions.ISOLATION_LEVEL_READ_COMMITTED: _(\"Read committed\"),\n                psycopg2.extensions.ISOLATION_LEVEL_REPEATABLE_READ: _(\n                    \"Repeatable read\"\n                ),\n                psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE: _(\"Serializable\"),\n            }\n\n    else:\n        raise ValueError(vendor)\n    return choices.get(level)\n\n\ndef get_transaction_status_display(vendor, level):\n    if vendor == \"postgresql\":\n        try:\n            import psycopg\n\n            choices = {\n                psycopg.pq.TransactionStatus.IDLE: _(\"Idle\"),\n                psycopg.pq.TransactionStatus.ACTIVE: _(\"Active\"),\n                psycopg.pq.TransactionStatus.INTRANS: _(\"In transaction\"),\n                psycopg.pq.TransactionStatus.INERROR: _(\"In error\"),\n                psycopg.pq.TransactionStatus.UNKNOWN: _(\"Unknown\"),\n            }\n        except ImportError:\n            import psycopg2.extensions\n\n            choices = {\n                psycopg2.extensions.TRANSACTION_STATUS_IDLE: _(\"Idle\"),\n                psycopg2.extensions.TRANSACTION_STATUS_ACTIVE: _(\"Active\"),\n                psycopg2.extensions.TRANSACTION_STATUS_INTRANS: _(\"In transaction\"),\n                psycopg2.extensions.TRANSACTION_STATUS_INERROR: _(\"In error\"),\n                psycopg2.extensions.TRANSACTION_STATUS_UNKNOWN: _(\"Unknown\"),\n            }\n\n    else:\n        raise ValueError(vendor)\n    return choices.get(level)\n\n\ndef _similar_query_key(query):\n    return query[\"raw_sql\"]\n\n\ndef _duplicate_query_key(query):\n    raw_params = () if query[\"params\"] is None else tuple(query[\"params\"])\n    # repr() avoids problems because of unhashable types\n    # (e.g. lists) when used as dictionary keys.\n    # https://github.com/django-commons/django-debug-toolbar/issues/1091\n    return (query[\"raw_sql\"], repr(raw_params))\n\n\ndef _process_query_groups(query_groups, databases, colors, name):\n    counts = defaultdict(int)\n    for (alias, _key), query_group in query_groups.items():\n        count = len(query_group)\n        # Queries are similar / duplicates only if there are at least 2 of them.\n        if count > 1:\n            color = next(colors)\n            for query in query_group:\n                query[f\"{name}_count\"] = count\n                query[f\"{name}_color\"] = color\n            counts[alias] += count\n    for alias, db_info in databases.items():\n        db_info[f\"{name}_count\"] = counts[alias]\n\n\nclass SQLPanel(Panel):\n    \"\"\"\n    Panel that displays information about the SQL queries run while processing\n    the request.\n    \"\"\"\n\n    is_async = True\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self._sql_time = 0\n        self._queries = []\n        self._databases = {}\n        # synthetic transaction IDs, keyed by DB alias\n        self._transaction_ids = {}\n\n    def new_transaction_id(self, alias):\n        \"\"\"\n        Generate and return a new synthetic transaction ID for the specified DB alias.\n        \"\"\"\n        trans_id = uuid.uuid4().hex\n        self._transaction_ids[alias] = trans_id\n        return trans_id\n\n    def current_transaction_id(self, alias):\n        \"\"\"\n        Return the current synthetic transaction ID for the specified DB alias.\n        \"\"\"\n        trans_id = self._transaction_ids.get(alias)\n        # Sometimes it is not possible to detect the beginning of the first transaction,\n        # so current_transaction_id() will be called before new_transaction_id().  In\n        # that case there won't yet be a transaction ID. so it is necessary to generate\n        # one using new_transaction_id().\n        if trans_id is None:\n            trans_id = self.new_transaction_id(alias)\n        return trans_id\n\n    def record(self, **kwargs):\n        kwargs[\"djdt_query_id\"] = uuid.uuid4().hex\n        self._queries.append(kwargs)\n        alias = kwargs[\"alias\"]\n        if alias not in self._databases:\n            self._databases[alias] = {\n                \"time_spent\": kwargs[\"duration\"],\n                \"num_queries\": 1,\n            }\n        else:\n            self._databases[alias][\"time_spent\"] += kwargs[\"duration\"]\n            self._databases[alias][\"num_queries\"] += 1\n        self._sql_time += kwargs[\"duration\"]\n\n    # Implement the Panel API\n\n    nav_title = _(\"SQL\")\n\n    @property\n    def nav_subtitle(self):\n        stats = self.get_stats()\n        query_count = len(stats.get(\"queries\", []))\n        return ngettext(\n            \"%(query_count)d query in %(sql_time).2fms\",\n            \"%(query_count)d queries in %(sql_time).2fms\",\n            query_count,\n        ) % {\n            \"query_count\": query_count,\n            \"sql_time\": stats.get(\"sql_time\"),\n        }\n\n    @property\n    def title(self):\n        count = len(self.get_stats().get(\"databases\"))\n        return ngettext(\n            \"SQL queries from %(count)d connection\",\n            \"SQL queries from %(count)d connections\",\n            count,\n        ) % {\"count\": count}\n\n    template = \"debug_toolbar/panels/sql.html\"\n\n    @classmethod\n    def get_urls(cls):\n        return [\n            path(\"sql_select/\", views.sql_select, name=\"sql_select\"),\n            path(\"sql_explain/\", views.sql_explain, name=\"sql_explain\"),\n            path(\"sql_profile/\", views.sql_profile, name=\"sql_profile\"),\n        ]\n\n    async def aenable_instrumentation(self):\n        \"\"\"\n        Async version of enable instrumentation.\n        For async capable panels having async logic for instrumentation.\n        \"\"\"\n        await sync_to_async(self.enable_instrumentation)()\n\n    def enable_instrumentation(self):\n        # This is thread-safe because database connections are thread-local.\n        for connection in connections.all():\n            wrap_cursor(connection)\n            connection._djdt_logger = self\n\n    def disable_instrumentation(self):\n        for connection in connections.all():\n            connection._djdt_logger = None\n\n    def generate_stats(self, request, response):\n        similar_query_groups = defaultdict(list)\n        duplicate_query_groups = defaultdict(list)\n\n        if self._queries:\n            sql_warning_threshold = dt_settings.get_config()[\"SQL_WARNING_THRESHOLD\"]\n\n            width_ratio_tally = 0\n            factor = int(256.0 / (len(self._databases) * 2.5))\n            for n, db in enumerate(self._databases.values()):\n                rgb = [0, 0, 0]\n                color = n % 3\n                rgb[color] = 256 - n // 3 * factor\n                nn = color\n                # XXX: pretty sure this is horrible after so many aliases\n                while rgb[color] < factor:\n                    nc = min(256 - rgb[color], 256)\n                    rgb[color] += nc\n                    nn += 1\n                    if nn > 2:\n                        nn = 0\n                    rgb[nn] = nc\n                db[\"rgb_color\"] = rgb\n\n            # the last query recorded for each DB alias\n            last_by_alias = {}\n            for query in self._queries:\n                alias = query[\"alias\"]\n\n                similar_query_groups[(alias, _similar_query_key(query))].append(query)\n                duplicate_query_groups[(alias, _duplicate_query_key(query))].append(\n                    query\n                )\n\n                trans_id = query.get(\"trans_id\")\n                prev_query = last_by_alias.get(alias, {})\n                prev_trans_id = prev_query.get(\"trans_id\")\n\n                # If two consecutive queries for a given DB alias have different\n                # transaction ID values, a transaction started, finished, or both, so\n                # annotate the queries as appropriate.\n                if trans_id != prev_trans_id:\n                    if prev_trans_id is not None:\n                        prev_query[\"ends_trans\"] = True\n                    if trans_id is not None:\n                        query[\"starts_trans\"] = True\n                if trans_id is not None:\n                    query[\"in_trans\"] = True\n\n                if \"iso_level\" in query:\n                    query[\"iso_level\"] = get_isolation_level_display(\n                        query[\"vendor\"], query[\"iso_level\"]\n                    )\n                if \"trans_status\" in query:\n                    query[\"trans_status\"] = get_transaction_status_display(\n                        query[\"vendor\"], query[\"trans_status\"]\n                    )\n                query[\"is_slow\"] = query[\"duration\"] > sql_warning_threshold\n                query[\"is_select\"] = is_select_query(query[\"raw_sql\"])\n\n                query[\"rgb_color\"] = self._databases[alias][\"rgb_color\"]\n                try:\n                    query[\"width_ratio\"] = (query[\"duration\"] / self._sql_time) * 100\n                except ZeroDivisionError:\n                    query[\"width_ratio\"] = 0\n                query[\"start_offset\"] = width_ratio_tally\n                query[\"end_offset\"] = query[\"width_ratio\"] + query[\"start_offset\"]\n                width_ratio_tally += query[\"width_ratio\"]\n\n                last_by_alias[alias] = query\n\n            # Close out any transactions that were in progress, since there is no\n            # explicit way to know when a transaction finishes.\n            for final_query in last_by_alias.values():\n                if final_query.get(\"trans_id\") is not None:\n                    final_query[\"ends_trans\"] = True\n\n        group_colors = contrasting_color_generator()\n        _process_query_groups(\n            similar_query_groups, self._databases, group_colors, \"similar\"\n        )\n        _process_query_groups(\n            duplicate_query_groups, self._databases, group_colors, \"duplicate\"\n        )\n\n        self.record_stats(\n            {\n                \"databases\": sorted(\n                    self._databases.items(), key=lambda x: -x[1][\"time_spent\"]\n                ),\n                \"queries\": self._queries,\n                \"sql_time\": self._sql_time,\n            }\n        )\n\n    def generate_server_timing(self, request, response):\n        stats = self.get_stats()\n        title = \"SQL {} queries\".format(len(stats.get(\"queries\", [])))\n        value = stats.get(\"sql_time\", 0)\n        self.record_server_timing(\"sql_time\", title, value)\n\n    # Cache the content property since it manipulates the queries in the stats\n    # This allows the caller to treat content as idempotent\n    @cached_property\n    def content(self):\n        if self.has_content:\n            stats = self.get_stats()\n            colors = contrasting_color_generator()\n            trace_colors = defaultdict(lambda: next(colors))\n\n            for query in stats.get(\"queries\", []):\n                query[\"sql\"] = reformat_sql(query[\"sql\"], with_toggle=True)\n                query[\"form\"] = SignedDataForm(\n                    auto_id=None,\n                    initial=SQLSelectForm(\n                        initial={\n                            \"djdt_query_id\": query[\"djdt_query_id\"],\n                            \"request_id\": self.toolbar.request_id,\n                        }\n                    ).initial,\n                )\n                query[\"stacktrace\"] = render_stacktrace(query[\"stacktrace\"])\n                query[\"trace_color\"] = trace_colors[query[\"stacktrace\"]]\n\n            return render_to_string(self.template, stats)\n"
  },
  {
    "path": "debug_toolbar/panels/sql/tracking.py",
    "content": "import contextlib\nimport contextvars\nimport datetime\nimport json\nfrom time import perf_counter\n\nimport django.test.testcases\nfrom django.apps import apps\n\nfrom debug_toolbar import settings as dt_settings\nfrom debug_toolbar.sanitize import force_str\nfrom debug_toolbar.utils import get_stack_trace, get_template_info\n\ntry:\n    import psycopg\n\n    PostgresJson = psycopg.types.json.Jsonb\n    STATUS_IN_TRANSACTION = psycopg.pq.TransactionStatus.INTRANS\nexcept ImportError:\n    try:\n        from psycopg2._json import Json as PostgresJson\n        from psycopg2.extensions import STATUS_IN_TRANSACTION\n    except ImportError:\n        PostgresJson = None\n        STATUS_IN_TRANSACTION = None\n\n# Prevents SQL queries from being sent to the DB. It's used\n# by the TemplatePanel to prevent the toolbar from issuing\n# additional queries.\nallow_sql = contextvars.ContextVar(\"debug-toolbar-allow-sql\", default=True)\n\n\nDDT_MODELS = {\n    m._meta.db_table for m in apps.get_app_config(\"debug_toolbar\").get_models()\n}\n\n\nclass SQLQueryTriggered(Exception):\n    \"\"\"Thrown when template panel triggers a query\"\"\"\n\n\ndef wrap_cursor(connection):\n    # When running a SimpleTestCase, Django monkey patches some DatabaseWrapper\n    # methods, including .cursor() and .chunked_cursor(), to raise an exception\n    # if the test code tries to access the database, and then undoes the monkey\n    # patching when the test case is finished.  If we monkey patch those methods\n    # also, Django's process of undoing those monkey patches will fail.  To\n    # avoid this failure, and because database access is not allowed during a\n    # SimpleTestCase anyway, skip applying our instrumentation monkey patches if\n    # we detect that Django has already monkey patched DatabaseWrapper.cursor().\n    if isinstance(connection.cursor, django.test.testcases._DatabaseFailure):\n        return\n    if not hasattr(connection, \"_djdt_cursor\"):\n        connection._djdt_cursor = connection.cursor\n        connection._djdt_chunked_cursor = connection.chunked_cursor\n        connection._djdt_logger = None\n\n        def cursor(*args, **kwargs):\n            # Per the DB API cursor() does not accept any arguments. There's\n            # some code in the wild which does not follow that convention,\n            # so we pass on the arguments even though it's not clean.\n            # See:\n            # https://github.com/django-commons/django-debug-toolbar/pull/615\n            # https://github.com/django-commons/django-debug-toolbar/pull/896\n            logger = connection._djdt_logger\n            cursor = connection._djdt_cursor(*args, **kwargs)\n            if logger is None:\n                return cursor\n            mixin = NormalCursorMixin if allow_sql.get() else ExceptionCursorMixin\n            return patch_cursor_wrapper_with_mixin(cursor.__class__, mixin)(\n                cursor.cursor, connection, logger\n            )\n\n        def chunked_cursor(*args, **kwargs):\n            # prevent double wrapping\n            # solves https://github.com/django-commons/django-debug-toolbar/issues/1239\n            logger = connection._djdt_logger\n            cursor = connection._djdt_chunked_cursor(*args, **kwargs)\n            if logger is not None and not isinstance(cursor, DjDTCursorWrapperMixin):\n                mixin = NormalCursorMixin if allow_sql.get() else ExceptionCursorMixin\n                return patch_cursor_wrapper_with_mixin(cursor.__class__, mixin)(\n                    cursor.cursor, connection, logger\n                )\n            return cursor\n\n        connection.cursor = cursor\n        connection.chunked_cursor = chunked_cursor\n\n\ndef patch_cursor_wrapper_with_mixin(base_wrapper, mixin):\n    class DjDTCursorWrapper(mixin, base_wrapper):\n        pass\n\n    return DjDTCursorWrapper\n\n\nclass DjDTCursorWrapperMixin:\n    def __init__(self, cursor, db, logger):\n        super().__init__(cursor, db)\n        # logger must implement a ``record`` method\n        self.logger = logger\n\n\nclass ExceptionCursorMixin(DjDTCursorWrapperMixin):\n    \"\"\"\n    Wraps a cursor and raises an exception on any operation.\n    Used in Templates panel.\n    \"\"\"\n\n    def __getattr__(self, attr):\n        raise SQLQueryTriggered()\n\n\nclass NormalCursorMixin(DjDTCursorWrapperMixin):\n    \"\"\"\n    Wraps a cursor and logs queries.\n    \"\"\"\n\n    def _decode(self, param):\n        if PostgresJson and isinstance(param, PostgresJson):\n            # psycopg3\n            if hasattr(param, \"obj\"):\n                return param.dumps(param.obj)\n            # psycopg2\n            if hasattr(param, \"adapted\"):\n                return param.dumps(param.adapted)\n\n        # If a sequence type, decode each element separately\n        if isinstance(param, (tuple, list)):\n            return [self._decode(element) for element in param]\n\n        # If a dictionary type, decode each value separately\n        if isinstance(param, dict):\n            return {key: self._decode(value) for key, value in param.items()}\n\n        # make sure datetime, date and time are converted to string by force_str\n        CONVERT_TYPES = (datetime.datetime, datetime.date, datetime.time)\n        return force_str(param, strings_only=not isinstance(param, CONVERT_TYPES))\n\n    def _last_executed_query(self, sql, params):\n        \"\"\"Get the last executed query from the connection.\"\"\"\n        # Django's psycopg3 backend creates a new cursor in its implementation of the\n        # .last_executed_query() method.  To avoid wrapping that cursor, temporarily set\n        # the DatabaseWrapper's ._djdt_logger attribute to None.  This will cause the\n        # monkey-patched .cursor() and .chunked_cursor() methods to skip the wrapping\n        # process during the .last_executed_query() call.\n        self.db._djdt_logger = None\n        try:\n            return self.db.ops.last_executed_query(self.cursor, sql, params)\n        finally:\n            self.db._djdt_logger = self.logger\n\n    def _record(self, method, sql, params):\n        alias = self.db.alias\n        vendor = self.db.vendor\n\n        if vendor == \"postgresql\":\n            # The underlying DB connection (as opposed to Django's wrapper)\n            conn = self.db.connection\n            initial_conn_status = conn.info.transaction_status\n\n        start_time = perf_counter()\n        try:\n            return method(sql, params)\n        finally:\n            stop_time = perf_counter()\n            duration = (stop_time - start_time) * 1000\n            _params = \"\"\n            with contextlib.suppress(TypeError):\n                # object JSON serializable?\n                _params = json.dumps(self._decode(params))\n            template_info = get_template_info()\n\n            # Sql might be an object (such as psycopg Composed).\n            # For logging purposes, make sure it's str.\n            if vendor == \"postgresql\" and not isinstance(sql, str):\n                if isinstance(sql, bytes):\n                    sql = sql.decode(\"utf-8\")\n                else:\n                    sql = sql.as_string(conn)\n            else:\n                sql = str(sql)\n\n            kwargs = {\n                \"vendor\": vendor,\n                \"alias\": alias,\n                \"sql\": self._last_executed_query(sql, params),\n                \"duration\": duration,\n                \"raw_sql\": sql,\n                \"params\": _params,\n                \"stacktrace\": get_stack_trace(skip=2),\n                \"template_info\": template_info,\n            }\n\n            if vendor == \"postgresql\":\n                # If an erroneous query was ran on the connection, it might\n                # be in a state where checking isolation_level raises an\n                # exception.\n                try:\n                    iso_level = conn.isolation_level\n                except conn.InternalError:\n                    iso_level = \"unknown\"\n                # PostgreSQL does not expose any sort of transaction ID, so it is\n                # necessary to generate synthetic transaction IDs here.  If the\n                # connection was not in a transaction when the query started, and was\n                # after the query finished, a new transaction definitely started, so get\n                # a new transaction ID from logger.new_transaction_id().  If the query\n                # was in a transaction both before and after executing, make the\n                # assumption that it is the same transaction and get the current\n                # transaction ID from logger.current_transaction_id().  There is an edge\n                # case where Django can start a transaction before the first query\n                # executes, so in that case logger.current_transaction_id() will\n                # generate a new transaction ID since one does not already exist.\n                final_conn_status = conn.info.transaction_status\n                if final_conn_status == STATUS_IN_TRANSACTION:\n                    if initial_conn_status == STATUS_IN_TRANSACTION:\n                        trans_id = self.logger.current_transaction_id(alias)\n                    else:\n                        trans_id = self.logger.new_transaction_id(alias)\n                else:\n                    trans_id = None\n\n                kwargs.update(\n                    {\n                        \"trans_id\": trans_id,\n                        \"trans_status\": conn.info.transaction_status,\n                        \"iso_level\": iso_level,\n                    }\n                )\n\n            # Skip tracking for toolbar models by default.\n            # This can be overridden by setting SKIP_TOOLBAR_QUERIES = False\n            if not dt_settings.get_config()[\"SKIP_TOOLBAR_QUERIES\"] or not any(\n                table in sql for table in DDT_MODELS\n            ):\n                # We keep `sql` to maintain backwards compatibility\n                self.logger.record(**kwargs)\n\n    def callproc(self, procname, params=None):\n        return self._record(super().callproc, procname, params)\n\n    def execute(self, sql, params=None):\n        return self._record(super().execute, sql, params)\n\n    def executemany(self, sql, param_list):\n        return self._record(super().executemany, sql, param_list)\n"
  },
  {
    "path": "debug_toolbar/panels/sql/utils.py",
    "content": "from functools import cache, lru_cache\nfrom html import escape\nfrom itertools import cycle\n\nimport sqlparse\nfrom django.dispatch import receiver\nfrom django.test.signals import setting_changed\nfrom sqlparse import tokens as T\n\nfrom debug_toolbar import settings as dt_settings\n\n\nclass ElideSelectListsFilter:\n    \"\"\"sqlparse filter to elide the select list from top-level SELECT ... FROM clauses,\n    if present\"\"\"\n\n    def process(self, stream):\n        allow_elision = True\n        for token_type, value in stream:\n            yield token_type, value\n            if token_type in T.Keyword:\n                keyword = value.upper()\n                if allow_elision and keyword == \"SELECT\":\n                    yield from self.elide_until_from(stream)\n                allow_elision = keyword in [\"EXCEPT\", \"INTERSECT\", \"UNION\"]\n\n    @staticmethod\n    def elide_until_from(stream):\n        has_dot = False\n        saved_tokens = []\n        for token_type, value in stream:\n            if token_type in T.Keyword and value.upper() == \"FROM\":\n                # Do not elide a select lists that do not contain dots (used to separate\n                # table names from column names) in order to preserve\n                #    SELECT COUNT(*) AS `__count` FROM ...\n                # and\n                #    SELECT (1) AS `a` FROM ...\n                # queries.\n                if not has_dot:\n                    yield from saved_tokens\n                else:\n                    # U+2022: Unicode character 'BULLET'\n                    yield T.Other, \" \\u2022\\u2022\\u2022 \"\n                yield token_type, value\n                break\n            if not has_dot:\n                if token_type in T.Punctuation and value == \".\":\n                    has_dot = True\n                else:\n                    saved_tokens.append((token_type, value))\n\n\nclass BoldKeywordFilter:\n    \"\"\"sqlparse filter to bold SQL keywords\"\"\"\n\n    def process(self, stmt):\n        idx = 0\n        while idx < len(stmt.tokens):\n            token = stmt[idx]\n            if token.is_keyword:\n                stmt.insert_before(idx, sqlparse.sql.Token(T.Other, \"<strong>\"))\n                stmt.insert_after(\n                    idx + 1,\n                    sqlparse.sql.Token(T.Other, \"</strong>\"),\n                    skip_ws=False,\n                )\n                idx += 2\n            elif token.is_group:\n                self.process(token)\n            idx += 1\n\n\ndef escaped_value(token):\n    # Don't escape T.Whitespace tokens because AlignedIndentFilter inserts its tokens as\n    # T.Whitesapce, and in our case those tokens are actually HTML.\n    if token.ttype in (T.Other, T.Whitespace):\n        return token.value\n    return escape(token.value, quote=False)\n\n\nclass EscapedStringSerializer:\n    \"\"\"sqlparse post-processor to convert a Statement into a string escaped for\n    inclusion in HTML .\"\"\"\n\n    @staticmethod\n    def process(stmt):\n        return \"\".join(escaped_value(token) for token in stmt.flatten())\n\n\ndef is_select_query(sql):\n    # UNION queries can start with \"(\".\n    return sql.lower().lstrip(\" (\").startswith(\"select\")\n\n\ndef reformat_sql(sql, *, with_toggle=False):\n    formatted = parse_sql(sql)\n    if not with_toggle:\n        return formatted\n    simplified = parse_sql(sql, simplify=True)\n    uncollapsed = f'<span class=\"djDebugUncollapsed\">{simplified}</span>'\n    collapsed = f'<span class=\"djDebugCollapsed djdt-hidden\">{formatted}</span>'\n    return collapsed + uncollapsed\n\n\n@lru_cache(maxsize=128)\ndef parse_sql(sql, *, simplify=False):\n    stack = get_filter_stack(simplify=simplify)\n    return \"\".join(stack.run(sql))\n\n\n@cache\ndef get_filter_stack(*, simplify):\n    stack = sqlparse.engine.FilterStack()\n    if simplify:\n        stack.preprocess.append(ElideSelectListsFilter())\n    else:\n        if dt_settings.get_config()[\"PRETTIFY_SQL\"]:\n            stack.enable_grouping()\n        stack.stmtprocess.append(\n            sqlparse.filters.AlignedIndentFilter(char=\"&nbsp;\", n=\"<br/>\")\n        )\n    stack.stmtprocess.append(BoldKeywordFilter())\n    stack.postprocess.append(EscapedStringSerializer())  # Statement -> str\n    return stack\n\n\n@receiver(setting_changed)\ndef clear_caches(*, setting, **kwargs):\n    if setting == \"DEBUG_TOOLBAR_CONFIG\":\n        parse_sql.cache_clear()\n        get_filter_stack.cache_clear()\n\n\ndef contrasting_color_generator():\n    return cycle(\n        [\n            \"#0C375A\",\n            \"#21A0A0\",\n            \"#FFC300\",\n            \"#FF5733\",\n            \"#C70039\",\n            \"#900C3F\",\n            \"#581845\",\n            \"#F1C40F\",\n        ]\n    )\n"
  },
  {
    "path": "debug_toolbar/panels/sql/views.py",
    "content": "from django.http import HttpResponseBadRequest, JsonResponse\nfrom django.template.loader import render_to_string\nfrom django.views.decorators.csrf import csrf_exempt\n\nfrom debug_toolbar._compat import login_not_required\nfrom debug_toolbar.decorators import render_with_toolbar_language, require_show_toolbar\nfrom debug_toolbar.forms import SignedDataForm\nfrom debug_toolbar.panels.sql.forms import SQLSelectForm\nfrom debug_toolbar.panels.sql.utils import reformat_sql\n\n\ndef get_signed_data(request):\n    \"\"\"Unpack a signed data form, if invalid returns None\"\"\"\n    data = request.GET if request.method == \"GET\" else request.POST\n    signed_form = SignedDataForm(data)\n    if signed_form.is_valid():\n        return signed_form.verified_data()\n    return None\n\n\n@csrf_exempt\n@login_not_required\n@require_show_toolbar\n@render_with_toolbar_language\ndef sql_select(request):\n    \"\"\"Returns the output of the SQL SELECT statement\"\"\"\n    verified_data = get_signed_data(request)\n    if not verified_data:\n        return HttpResponseBadRequest(\"Invalid signature\")\n    form = SQLSelectForm(verified_data)\n\n    if form.is_valid():\n        query = form.cleaned_data[\"query\"]\n        result, headers = form.select()\n        context = {\n            \"result\": result,\n            \"sql\": reformat_sql(query[\"sql\"], with_toggle=False),\n            \"duration\": query[\"duration\"],\n            \"headers\": headers,\n            \"alias\": query[\"alias\"],\n        }\n        content = render_to_string(\"debug_toolbar/panels/sql_select.html\", context)\n        return JsonResponse({\"content\": content})\n    return HttpResponseBadRequest(\"Form errors\")\n\n\n@csrf_exempt\n@login_not_required\n@require_show_toolbar\n@render_with_toolbar_language\ndef sql_explain(request):\n    \"\"\"Returns the output of the SQL EXPLAIN on the given query\"\"\"\n    verified_data = get_signed_data(request)\n    if not verified_data:\n        return HttpResponseBadRequest(\"Invalid signature\")\n    form = SQLSelectForm(verified_data)\n\n    if form.is_valid():\n        query = form.cleaned_data[\"query\"]\n        result, headers = form.explain()\n        context = {\n            \"result\": result,\n            \"sql\": reformat_sql(query[\"sql\"], with_toggle=False),\n            \"duration\": query[\"duration\"],\n            \"headers\": headers,\n            \"alias\": query[\"alias\"],\n        }\n        content = render_to_string(\"debug_toolbar/panels/sql_explain.html\", context)\n        return JsonResponse({\"content\": content})\n    return HttpResponseBadRequest(\"Form errors\")\n\n\n@csrf_exempt\n@login_not_required\n@require_show_toolbar\n@render_with_toolbar_language\ndef sql_profile(request):\n    \"\"\"Returns the output of running the SQL and getting the profiling statistics\"\"\"\n    verified_data = get_signed_data(request)\n    if not verified_data:\n        return HttpResponseBadRequest(\"Invalid signature\")\n    form = SQLSelectForm(verified_data)\n\n    if form.is_valid():\n        query = form.cleaned_data[\"query\"]\n        result = None\n        headers = None\n        result_error = None\n        try:\n            result, headers = form.profile()\n        except Exception:\n            result_error = (\n                \"Profiling is either not available or not supported by your database.\"\n            )\n\n        context = {\n            \"result\": result,\n            \"result_error\": result_error,\n            \"sql\": form.reformat_sql(),\n            \"duration\": query[\"duration\"],\n            \"headers\": headers,\n            \"alias\": query[\"alias\"],\n        }\n        content = render_to_string(\"debug_toolbar/panels/sql_profile.html\", context)\n        return JsonResponse({\"content\": content})\n    return HttpResponseBadRequest(\"Form errors\")\n"
  },
  {
    "path": "debug_toolbar/panels/staticfiles.py",
    "content": "import contextlib\nimport uuid\nfrom contextvars import ContextVar\nfrom os.path import join, normpath\n\nfrom django.contrib.staticfiles import finders, storage\nfrom django.dispatch import Signal\nfrom django.utils.translation import gettext_lazy as _, ngettext\n\nfrom debug_toolbar import panels\n\n# This will record and map the StaticFile instances with its associated\n# request across threads and async concurrent requests state.\nrequest_id_context_var = ContextVar(\"djdt_request_id_store\")\nrecord_static_file_signal = Signal()\n\n\nclass URLMixin:\n    def url(self, path, *args, **kwargs):\n        url = super().url(path, *args, **kwargs)\n        with contextlib.suppress(LookupError):\n            # For LookupError:\n            # The ContextVar wasn't set yet. Since the toolbar wasn't properly\n            # configured to handle this request, we don't need to capture\n            # the static file.\n            request_id = request_id_context_var.get()\n            record_static_file_signal.send(\n                sender=self,\n                staticfile=(str(path), url, finders.find(str(path))),\n                request_id=request_id,\n            )\n        return url\n\n\nclass StaticFilesPanel(panels.Panel):\n    \"\"\"\n    A panel to display the found staticfiles.\n    \"\"\"\n\n    is_async = True\n    name = \"Static files\"\n    template = \"debug_toolbar/panels/staticfiles.html\"\n\n    @property\n    def title(self):\n        stats = self.get_stats()\n        return _(\"Static files (%(num_found)s found, %(num_used)s used)\") % {\n            \"num_found\": stats.get(\"num_found\"),\n            \"num_used\": stats.get(\"num_used\"),\n        }\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.num_found = 0\n        self.used_paths = set()\n        self.request_id = str(uuid.uuid4())\n\n    @classmethod\n    def ready(cls):\n        cls = storage.staticfiles_storage.__class__\n        if URLMixin not in cls.mro():\n            cls.__bases__ = (URLMixin, *cls.__bases__)\n\n    def _store_static_files_signal_handler(self, sender, staticfile, **kwargs):\n        # Only record the static file if the request_id matches the one\n        # that was used to create the panel.\n        # as sender of the signal and this handler will have multiple\n        # concurrent connections and we want to avoid storing of same\n        # staticfile from other connections as well.\n        if request_id_context_var.get() == self.request_id:\n            self.used_paths.add(staticfile)\n\n    def enable_instrumentation(self):\n        self.ctx_token = request_id_context_var.set(self.request_id)\n        record_static_file_signal.connect(self._store_static_files_signal_handler)\n\n    def disable_instrumentation(self):\n        record_static_file_signal.disconnect(self._store_static_files_signal_handler)\n        request_id_context_var.reset(self.ctx_token)\n\n    nav_title = _(\"Static files\")\n\n    @property\n    def nav_subtitle(self):\n        num_used = self.get_stats().get(\"num_used\")\n        return ngettext(\n            \"%(num_used)s file used\", \"%(num_used)s files used\", num_used\n        ) % {\"num_used\": num_used}\n\n    def generate_stats(self, request, response):\n        self.record_stats(\n            {\n                \"num_found\": self.num_found,\n                \"num_used\": len(self.used_paths),\n                \"staticfiles\": sorted(self.used_paths),\n                \"staticfiles_apps\": self.get_staticfiles_apps(),\n                \"staticfiles_dirs\": self.get_staticfiles_dirs(),\n                \"staticfiles_finders\": self.get_staticfiles_finders(),\n            }\n        )\n\n    def get_staticfiles_finders(self):\n        \"\"\"\n        Returns a sorted mapping between the finder path and the list\n        of relative and file system paths which that finder was able\n        to find.\n        \"\"\"\n        finders_mapping = {}\n        for finder in finders.get_finders():\n            try:\n                for path, finder_storage in finder.list([]):\n                    if getattr(finder_storage, \"prefix\", None):\n                        prefixed_path = join(finder_storage.prefix, path)\n                    else:\n                        prefixed_path = path\n                    finder_cls = finder.__class__\n                    finder_path = \".\".join([finder_cls.__module__, finder_cls.__name__])\n                    real_path = finder_storage.path(path)\n                    payload = (prefixed_path, real_path)\n                    finders_mapping.setdefault(finder_path, []).append(payload)\n                    self.num_found += 1\n            except OSError:\n                # This error should be captured and presented as a part of run_checks.\n                pass\n        return finders_mapping\n\n    def get_staticfiles_dirs(self):\n        \"\"\"\n        Returns a list of paths to inspect for additional static files\n        \"\"\"\n        dirs = []\n        for finder in finders.get_finders():\n            if isinstance(finder, finders.FileSystemFinder):\n                dirs.extend(finder.locations)\n        return [(prefix, normpath(dir)) for prefix, dir in dirs]\n\n    def get_staticfiles_apps(self):\n        \"\"\"\n        Returns a list of app paths that have a static directory\n        \"\"\"\n        apps = []\n        for finder in finders.get_finders():\n            if isinstance(finder, finders.AppDirectoriesFinder):\n                for app in finder.apps:\n                    if app not in apps:\n                        apps.append(app)\n        return apps\n"
  },
  {
    "path": "debug_toolbar/panels/templates/__init__.py",
    "content": "from debug_toolbar.panels.templates.panel import TemplatesPanel\n\n__all__ = [TemplatesPanel.panel_id]\n"
  },
  {
    "path": "debug_toolbar/panels/templates/jinja2.py",
    "content": "import functools\n\nfrom django.template.backends.jinja2 import Template as JinjaTemplate\nfrom django.template.context import make_context\nfrom django.test.signals import template_rendered\n\n\ndef patch_jinja_render():\n    orig_render = JinjaTemplate.render\n\n    @functools.wraps(orig_render)\n    def wrapped_render(self, context=None, request=None):\n        # This patching of render only instruments the rendering\n        # of the immediate template. It won't include the parent template(s).\n        self.name = self.template.name\n        template_rendered.send(\n            sender=self, template=self, context=make_context(context, request)\n        )\n        return orig_render(self, context, request)\n\n    if JinjaTemplate.render != wrapped_render:\n        JinjaTemplate.original_render = JinjaTemplate.render\n        JinjaTemplate.render = wrapped_render\n"
  },
  {
    "path": "debug_toolbar/panels/templates/panel.py",
    "content": "from contextlib import contextmanager\nfrom importlib.util import find_spec\nfrom os.path import normpath\nfrom pprint import pformat, saferepr\n\nfrom django import http\nfrom django.core import signing\nfrom django.db.models.query import QuerySet, RawQuerySet\nfrom django.template import RequestContext, Template\nfrom django.test.signals import template_rendered\nfrom django.test.utils import instrumented_test_render\nfrom django.urls import path\nfrom django.utils.translation import gettext_lazy as _\n\nfrom debug_toolbar.panels import Panel\nfrom debug_toolbar.panels.sql.tracking import SQLQueryTriggered, allow_sql\nfrom debug_toolbar.panels.templates import views\nfrom debug_toolbar.sanitize import force_str\n\nif find_spec(\"jinja2\"):\n    from debug_toolbar.panels.templates.jinja2 import patch_jinja_render\n\n    patch_jinja_render()\n\n# Monkey-patch to enable the template_rendered signal. The receiver returns\n# immediately when the panel is disabled to keep the overhead small.\n\n# Code taken and adapted from Simon Willison and Django Snippets:\n# https://www.djangosnippets.org/snippets/766/\n\nif Template._render != instrumented_test_render:\n    Template.original_render = Template._render\n    Template._render = instrumented_test_render\n\n# Monkey-patch to store items added by template context processors. The\n# overhead is sufficiently small to justify enabling it unconditionally.\n\n\n@contextmanager\ndef _request_context_bind_template(self, template):\n    if self.template is not None:\n        raise RuntimeError(\"Context is already bound to a template\")\n\n    self.template = template\n    # Set context processors according to the template engine's settings.\n    processors = template.engine.template_context_processors + self._processors\n    self.context_processors = {}\n    updates = {}\n    for processor in processors:\n        name = f\"{processor.__module__}.{processor.__name__}\"\n        context = processor(self.request)\n        self.context_processors[name] = context\n        updates.update(context)\n    self.dicts[self._processors_index] = updates\n\n    try:\n        yield\n    finally:\n        self.template = None\n        # Unset context processors.\n        self.dicts[self._processors_index] = {}\n\n\nRequestContext.bind_template = _request_context_bind_template\n\n\nclass TemplatesPanel(Panel):\n    \"\"\"\n    A panel that lists all templates used during processing of a response.\n    \"\"\"\n\n    is_async = True\n\n    def __init__(self, *args, **kwargs):\n        super().__init__(*args, **kwargs)\n        self.templates = []\n        # An associated list of dictionaries and their prettified\n        # representation.\n        self.pformat_layers = []\n\n    def _store_template_info(self, sender, **kwargs):\n        template, context = kwargs[\"template\"], kwargs[\"context\"]\n\n        # Skip templates that we are generating through the debug toolbar.\n        is_debug_toolbar_template = isinstance(template.name, str) and (\n            template.name.startswith(\"debug_toolbar/\")\n            or template.name.startswith(\n                tuple(self.toolbar.config[\"SKIP_TEMPLATE_PREFIXES\"])\n            )\n        )\n        if is_debug_toolbar_template:\n            return\n\n        kwargs[\"context\"] = [\n            context_layer\n            for context_layer in context.dicts\n            if hasattr(context_layer, \"items\") and context_layer\n        ]\n        kwargs[\"context_processors\"] = getattr(context, \"context_processors\", None)\n        self.templates.append(kwargs)\n\n    # Implement the Panel API\n\n    nav_title = _(\"Templates\")\n\n    @property\n    def title(self):\n        num_templates = len(self.get_stats()[\"templates\"])\n        return _(\"Templates (%(num_templates)s rendered)\") % {\n            \"num_templates\": num_templates\n        }\n\n    @property\n    def nav_subtitle(self):\n        templates = self.get_stats()[\"templates\"]\n        if templates:\n            return templates[0][\"template\"][\"name\"]\n        return \"\"\n\n    template = \"debug_toolbar/panels/templates.html\"\n\n    @classmethod\n    def get_urls(cls):\n        return [path(\"template_source/\", views.template_source, name=\"template_source\")]\n\n    def enable_instrumentation(self):\n        template_rendered.connect(self._store_template_info)\n\n    def disable_instrumentation(self):\n        template_rendered.disconnect(self._store_template_info)\n\n    def process_context_list(self, context_layers):\n        context_list = []\n        for context_layer in context_layers:\n            # Check if the layer is in the cache.\n            pformatted = None\n            for key_values, _pformatted in self.pformat_layers:\n                if key_values == context_layer:\n                    pformatted = _pformatted\n                    break\n\n            if pformatted is None:\n                temp_layer = {}\n                for key, value in context_layer.items():\n                    # Do not force evaluating LazyObject\n                    if hasattr(value, \"_wrapped\"):\n                        # SimpleLazyObject has __repr__ which includes actual value\n                        # if it has been already evaluated\n                        temp_layer[key] = repr(value)\n                    # Replace any request elements - they have a large\n                    # Unicode representation and the request data is\n                    # already made available from the Request panel.\n                    elif isinstance(value, http.HttpRequest):\n                        temp_layer[key] = \"<<request>>\"\n                    # Replace the debugging sql_queries element. The SQL\n                    # data is already made available from the SQL panel.\n                    elif key == \"sql_queries\" and isinstance(value, list):\n                        temp_layer[key] = \"<<sql_queries>>\"\n                    # Replace LANGUAGES, which is available in i18n context\n                    # processor\n                    elif key == \"LANGUAGES\" and isinstance(value, tuple):\n                        temp_layer[key] = \"<<languages>>\"\n                    # QuerySet would trigger the database: user can run the\n                    # query from SQL Panel\n                    elif isinstance(value, (QuerySet, RawQuerySet)):\n                        temp_layer[key] = (\n                            f\"<<{value.__class__.__name__.lower()} of {value.model._meta.label}>>\"\n                        )\n                    else:\n                        token = allow_sql.set(False)\n                        try:\n                            saferepr(value)  # this MAY trigger a db query\n                        except SQLQueryTriggered:\n                            temp_layer[key] = \"<<triggers database query>>\"\n                        except UnicodeEncodeError:\n                            temp_layer[key] = \"<<Unicode encode error>>\"\n                        except Exception:\n                            temp_layer[key] = \"<<unhandled exception>>\"\n                        else:\n                            temp_layer[key] = value\n                        finally:\n                            allow_sql.reset(token)\n                pformatted = pformat(temp_layer)\n                self.pformat_layers.append((context_layer, pformatted))\n            context_list.append(pformatted)\n\n        return context_list\n\n    def generate_stats(self, request, response):\n        template_context = []\n        for template_data in self.templates:\n            info = {}\n            # Clean up some info about templates\n            template = template_data[\"template\"]\n            if hasattr(template, \"origin\") and template.origin and template.origin.name:\n                template.origin_name = template.origin.name\n                template.origin_hash = signing.dumps(template.origin.name)\n            else:\n                template.origin_name = _(\"No origin\")\n                template.origin_hash = \"\"\n            info[\"template\"] = {\n                \"name\": template.name,\n                \"origin_name\": template.origin_name,\n                \"origin_hash\": template.origin_hash,\n            }\n            # Clean up context for better readability\n            if self.toolbar.config[\"SHOW_TEMPLATE_CONTEXT\"]:\n                if \"context_list\" not in template_data:\n                    template_data[\"context_list\"] = self.process_context_list(\n                        template_data.get(\"context\", [])\n                    )\n                info[\"context\"] = \"\\n\".join(template_data[\"context_list\"])\n            template_context.append(info)\n\n        # Fetch context_processors/template_dirs from any template\n        if self.templates:\n            context_processors = (\n                {\n                    key: force_str(value)\n                    for key, value in self.templates[0][\"context_processors\"].items()\n                }\n                if self.templates[0][\"context_processors\"]\n                else None\n            )\n            template = self.templates[0][\"template\"]\n            # django templates have the 'engine' attribute, while jinja\n            # templates use 'backend'\n            engine_backend = getattr(template, \"engine\", None) or template.backend\n            template_dirs = engine_backend.dirs\n        else:\n            context_processors = None\n            template_dirs = []\n\n        self.record_stats(\n            {\n                \"templates\": template_context,\n                \"template_dirs\": [normpath(x) for x in template_dirs],\n                \"context_processors\": context_processors,\n            }\n        )\n"
  },
  {
    "path": "debug_toolbar/panels/templates/views.py",
    "content": "from django.core import signing\nfrom django.http import HttpResponseBadRequest, JsonResponse\nfrom django.template import Origin, TemplateDoesNotExist\nfrom django.template.engine import Engine\nfrom django.template.loader import render_to_string\nfrom django.utils.html import format_html, mark_safe\n\nfrom debug_toolbar._compat import login_not_required\nfrom debug_toolbar.decorators import render_with_toolbar_language, require_show_toolbar\n\n\n@login_not_required\n@require_show_toolbar\n@render_with_toolbar_language\ndef template_source(request):\n    \"\"\"\n    Return the source of a template, syntax-highlighted by Pygments if\n    it's available.\n    \"\"\"\n    template_origin_name = request.GET.get(\"template_origin\")\n    if template_origin_name is None:\n        return HttpResponseBadRequest('\"template_origin\" key is required')\n    try:\n        template_origin_name = signing.loads(template_origin_name)\n    except Exception:\n        return HttpResponseBadRequest('\"template_origin\" is invalid')\n    template_name = request.GET.get(\"template\", template_origin_name)\n\n    final_loaders = []\n    loaders = list(Engine.get_default().template_loaders)\n\n    while loaders:\n        loader = loaders.pop(0)\n\n        if loader is not None:\n            # Recursively unwrap loaders until we get to loaders which do not\n            # themselves wrap other loaders. This adds support for\n            # django.template.loaders.cached.Loader and the\n            # django-template-partials loader (possibly among others)\n            if hasattr(loader, \"loaders\"):\n                loaders.extend(loader.loaders)\n            else:\n                final_loaders.append(loader)\n\n    for loader in final_loaders:\n        origin = Origin(template_origin_name)\n        try:\n            source = loader.get_contents(origin)\n            break\n        except TemplateDoesNotExist:\n            pass\n    else:\n        source = f\"Template Does Not Exist: {template_origin_name}\"\n\n    try:\n        from pygments import highlight\n        from pygments.formatters import HtmlFormatter\n        from pygments.lexers import HtmlDjangoLexer\n    except ModuleNotFoundError:\n        source = format_html(\"<code>{}</code>\", source)\n    else:\n        source = highlight(source, HtmlDjangoLexer(), HtmlFormatter(wrapcode=True))\n        source = mark_safe(source)\n\n    content = render_to_string(\n        \"debug_toolbar/panels/template_source.html\",\n        {\"source\": source, \"template_name\": template_name},\n    )\n    return JsonResponse({\"content\": content})\n"
  },
  {
    "path": "debug_toolbar/panels/timer.py",
    "content": "from time import perf_counter\n\nfrom django.template.loader import render_to_string\nfrom django.templatetags.static import static\nfrom django.utils.translation import gettext_lazy as _\n\nfrom debug_toolbar.panels import Panel\n\ntry:\n    import resource  # Not available on Win32 systems\nexcept ImportError:\n    resource = None\n\n\nclass TimerPanel(Panel):\n    \"\"\"\n    Panel that displays the time a response took in milliseconds.\n    \"\"\"\n\n    is_async = True\n\n    def nav_subtitle(self):\n        stats = self.get_stats()\n        if stats.get(\"utime\"):\n            utime = stats.get(\"utime\")\n            stime = stats.get(\"stime\")\n            return _(\"CPU: %(cum)0.2fms (%(total)0.2fms)\") % {\n                \"cum\": (utime + stime),\n                \"total\": stats[\"total_time\"],\n            }\n        elif \"total_time\" in stats:\n            return _(\"Total: %0.2fms\") % stats[\"total_time\"]\n        else:\n            return \"\"\n\n    has_content = resource is not None\n\n    title = _(\"Time\")\n\n    template = \"debug_toolbar/panels/timer.html\"\n\n    @property\n    def content(self):\n        stats = self.get_stats()\n        rows = (\n            (_(\"User CPU time\"), _(\"%(utime)0.3f ms\") % stats),\n            (_(\"System CPU time\"), _(\"%(stime)0.3f ms\") % stats),\n            (_(\"Total CPU time\"), _(\"%(total)0.3f ms\") % stats),\n            (_(\"Elapsed time\"), _(\"%(total_time)0.3f ms\") % stats),\n            (\n                _(\"Context switches\"),\n                _(\"%(vcsw)d voluntary, %(ivcsw)d involuntary\") % stats,\n            ),\n        )\n        return render_to_string(self.template, {\"rows\": rows})\n\n    @property\n    def scripts(self):\n        scripts = super().scripts\n        scripts.append(static(\"debug_toolbar/js/timer.js\"))\n        return scripts\n\n    def process_request(self, request):\n        self._start_time = perf_counter()\n        if self.has_content:\n            self._start_rusage = resource.getrusage(resource.RUSAGE_SELF)\n        return super().process_request(request)\n\n    def serialize_rusage(self, data):\n        fields_to_serialize = [\n            \"ru_utime\",\n            \"ru_stime\",\n            \"ru_nvcsw\",\n            \"ru_nivcsw\",\n            \"ru_minflt\",\n            \"ru_majflt\",\n        ]\n        return {field: getattr(data, field) for field in fields_to_serialize}\n\n    def generate_stats(self, request, response):\n        stats = {}\n        if hasattr(self, \"_start_time\"):\n            stats[\"total_time\"] = (perf_counter() - self._start_time) * 1000\n        if self.has_content:\n            self._end_rusage = resource.getrusage(resource.RUSAGE_SELF)\n            start = self.serialize_rusage(self._start_rusage)\n            end = self.serialize_rusage(self._end_rusage)\n            stats.update(\n                {\n                    \"utime\": 1000 * self._elapsed_ru(start, end, \"ru_utime\"),\n                    \"stime\": 1000 * self._elapsed_ru(start, end, \"ru_stime\"),\n                    \"vcsw\": self._elapsed_ru(start, end, \"ru_nvcsw\"),\n                    \"ivcsw\": self._elapsed_ru(start, end, \"ru_nivcsw\"),\n                    \"minflt\": self._elapsed_ru(start, end, \"ru_minflt\"),\n                    \"majflt\": self._elapsed_ru(start, end, \"ru_majflt\"),\n                }\n            )\n            stats[\"total\"] = stats[\"utime\"] + stats[\"stime\"]\n            # these are documented as not meaningful under Linux.  If you're\n            # running BSD feel free to enable them, and add any others that I\n            # hadn't gotten to before I noticed that I was getting nothing but\n            # zeroes and that the docs agreed. :-(\n            #\n            #        stats['blkin'] = self._elapsed_ru(start, end, 'ru_inblock')\n            #        stats['blkout'] = self._elapsed_ru(start, end, 'ru_oublock')\n            #        stats['swap'] = self._elapsed_ru(start, end, 'ru_nswap')\n            #        stats['rss'] = self._end_rusage.ru_maxrss\n            #        stats['srss'] = self._end_rusage.ru_ixrss\n            #        stats['urss'] = self._end_rusage.ru_idrss\n            #        stats['usrss'] = self._end_rusage.ru_isrss\n\n        self.record_stats(stats)\n\n    def generate_server_timing(self, request, response):\n        stats = self.get_stats()\n\n        self.record_server_timing(\"utime\", \"User CPU time\", stats.get(\"utime\", 0))\n        self.record_server_timing(\"stime\", \"System CPU time\", stats.get(\"stime\", 0))\n        self.record_server_timing(\"total\", \"Total CPU time\", stats.get(\"total\", 0))\n        self.record_server_timing(\n            \"total_time\", \"Elapsed time\", stats.get(\"total_time\", 0)\n        )\n\n    @staticmethod\n    def _elapsed_ru(start, end, name):\n        return end.get(name) - start.get(name)\n"
  },
  {
    "path": "debug_toolbar/panels/versions.py",
    "content": "import sys\n\nimport django\nfrom django.apps import apps\nfrom django.utils.translation import gettext_lazy as _\n\nfrom debug_toolbar.panels import Panel\n\n\nclass VersionsPanel(Panel):\n    \"\"\"\n    Shows versions of Python, Django, and installed apps if possible.\n    \"\"\"\n\n    is_async = True\n\n    @property\n    def nav_subtitle(self):\n        return \"Django %s\" % self.get_stats()[\"django_version\"]\n\n    title = _(\"Versions\")\n\n    template = \"debug_toolbar/panels/versions.html\"\n\n    def generate_stats(self, request, response):\n        versions = [\n            (\"Python\", \"\", \"%d.%d.%d\" % sys.version_info[:3]),\n            (\"Django\", \"\", self.get_app_version(django)),\n        ]\n        versions += list(self.gen_app_versions())\n        self.record_stats(\n            {\n                \"django_version\": django.get_version(),\n                \"versions\": sorted(versions, key=lambda v: v[0]),\n                \"paths\": sys.path,\n            }\n        )\n\n    def gen_app_versions(self):\n        for app_config in apps.get_app_configs():\n            name = app_config.verbose_name\n            app = app_config.module\n            version = self.get_app_version(app)\n            if version:\n                yield app.__name__, name, version\n\n    def get_app_version(self, app):\n        version = self.get_version_from_app(app)\n        if isinstance(version, (list, tuple)):\n            # We strip dots from the right because we do not want to show\n            # trailing dots if there are empty elements in the list/tuple\n            version = \".\".join(str(o) for o in version).rstrip(\".\")\n        return version\n\n    def get_version_from_app(self, app):\n        if hasattr(app, \"get_version\"):\n            get_version = app.get_version\n            if callable(get_version):\n                try:\n                    return get_version()\n                except TypeError:\n                    pass\n            else:\n                return get_version\n        if hasattr(app, \"VERSION\"):\n            return app.VERSION\n        if hasattr(app, \"__version__\"):\n            return app.__version__\n        return\n"
  },
  {
    "path": "debug_toolbar/py.typed",
    "content": ""
  },
  {
    "path": "debug_toolbar/sanitize.py",
    "content": "from django.utils.encoding import DjangoUnicodeDecodeError, force_str as force_string\n\n\ndef force_str(s, *args, **kwargs):\n    \"\"\"\n    Forces values to strings.\n    Will return \"Django Debug Toolbar was unable to parse value.\" when there's a decoding error.\n    \"\"\"\n    try:\n        return force_string(s, *args, **kwargs)\n    except DjangoUnicodeDecodeError:\n        return \"Django Debug Toolbar was unable to parse value.\"\n"
  },
  {
    "path": "debug_toolbar/settings.py",
    "content": "import os\nimport sys\nimport warnings\nfrom functools import cache\n\nfrom django.conf import settings\nfrom django.dispatch import receiver\nfrom django.test.signals import setting_changed\n\n\ndef _is_running_tests():\n    \"\"\"\n    Helper function to support testing default value for\n    IS_RUNNING_TESTS\n    \"\"\"\n    return \"test\" in sys.argv or \"PYTEST_VERSION\" in os.environ\n\n\nCONFIG_DEFAULTS = {\n    # Toolbar options\n    \"DISABLE_PANELS\": {\n        \"debug_toolbar.panels.profiling.ProfilingPanel\",\n        \"debug_toolbar.panels.redirects.RedirectsPanel\",\n    },\n    \"INSERT_BEFORE\": \"</body>\",\n    \"IS_RUNNING_TESTS\": _is_running_tests(),\n    \"OBSERVE_REQUEST_CALLBACK\": \"debug_toolbar.toolbar.observe_request\",\n    \"RENDER_PANELS\": None,\n    \"RESULTS_CACHE_SIZE\": 25,\n    \"ROOT_TAG_EXTRA_ATTRS\": \"\",\n    \"SHOW_COLLAPSED\": False,\n    \"SHOW_TOOLBAR_CALLBACK\": \"debug_toolbar.middleware.show_toolbar\",\n    \"TOOLBAR_LANGUAGE\": None,\n    \"TOOLBAR_STORE_CLASS\": \"debug_toolbar.store.MemoryStore\",\n    \"UPDATE_ON_FETCH\": False,\n    # Panel options\n    \"EXTRA_SIGNALS\": [],\n    \"ENABLE_STACKTRACES\": True,\n    \"ENABLE_STACKTRACES_LOCALS\": False,\n    \"HIDE_IN_STACKTRACES\": (\n        \"socketserver\",\n        \"threading\",\n        \"wsgiref\",\n        \"debug_toolbar\",\n        \"django.db\",\n        \"django.core.handlers\",\n        \"django.core.servers\",\n        \"django.utils.decorators\",\n        \"django.utils.deprecation\",\n        \"django.utils.functional\",\n    ),\n    \"PRETTIFY_SQL\": True,\n    \"PROFILER_CAPTURE_PROJECT_CODE\": True,\n    \"PROFILER_MAX_DEPTH\": 10,\n    \"PROFILER_THRESHOLD_RATIO\": 8,\n    \"SHOW_TEMPLATE_CONTEXT\": True,\n    \"SKIP_TEMPLATE_PREFIXES\": (\"django/forms/widgets/\", \"admin/widgets/\"),\n    \"SKIP_TOOLBAR_QUERIES\": True,\n    \"SQL_WARNING_THRESHOLD\": 500,  # milliseconds\n}\n\n\n@cache\ndef get_config():\n    USER_CONFIG = getattr(settings, \"DEBUG_TOOLBAR_CONFIG\", {})\n    CONFIG = CONFIG_DEFAULTS.copy()\n    CONFIG.update(USER_CONFIG)\n    return CONFIG\n\n\nPANELS_DEFAULTS = [\n    \"debug_toolbar.panels.history.HistoryPanel\",\n    \"debug_toolbar.panels.versions.VersionsPanel\",\n    \"debug_toolbar.panels.timer.TimerPanel\",\n    \"debug_toolbar.panels.settings.SettingsPanel\",\n    \"debug_toolbar.panels.headers.HeadersPanel\",\n    \"debug_toolbar.panels.request.RequestPanel\",\n    \"debug_toolbar.panels.sql.SQLPanel\",\n    \"debug_toolbar.panels.staticfiles.StaticFilesPanel\",\n    \"debug_toolbar.panels.templates.TemplatesPanel\",\n    \"debug_toolbar.panels.alerts.AlertsPanel\",\n    \"debug_toolbar.panels.cache.CachePanel\",\n    \"debug_toolbar.panels.signals.SignalsPanel\",\n    \"debug_toolbar.panels.community.CommunityPanel\",\n    \"debug_toolbar.panels.redirects.RedirectsPanel\",\n    \"debug_toolbar.panels.profiling.ProfilingPanel\",\n]\n\n\n@cache\ndef get_panels():\n    try:\n        PANELS = list(settings.DEBUG_TOOLBAR_PANELS)\n    except AttributeError:\n        PANELS = PANELS_DEFAULTS\n\n    logging_panel = \"debug_toolbar.panels.logging.LoggingPanel\"\n    if logging_panel in PANELS:\n        PANELS = [panel for panel in PANELS if panel != logging_panel]\n        warnings.warn(\n            f\"Please remove {logging_panel} from your DEBUG_TOOLBAR_PANELS setting.\",\n            DeprecationWarning,\n            stacklevel=1,\n        )\n    return PANELS\n\n\n@receiver(setting_changed)\ndef update_toolbar_config(*, setting, **kwargs):\n    \"\"\"\n    Refresh configuration when overriding settings.\n    \"\"\"\n    if setting == \"DEBUG_TOOLBAR_CONFIG\":\n        get_config.cache_clear()\n    elif setting == \"DEBUG_TOOLBAR_PANELS\":\n        from debug_toolbar.toolbar import DebugToolbar\n\n        get_panels.cache_clear()\n        DebugToolbar._panel_classes = None\n        # Not implemented: invalidate debug_toolbar.urls.\n"
  },
  {
    "path": "debug_toolbar/static/debug_toolbar/css/print.css",
    "content": "#djDebug {\n    display: none !important;\n}\n"
  },
  {
    "path": "debug_toolbar/static/debug_toolbar/css/toolbar.css",
    "content": "/* Variable definitions */\n:root {\n    /* Font families are the same as in Django admin/css/base.css */\n    --djdt-font-family-primary:\n        \"Segoe UI\", system-ui, Roboto, \"Helvetica Neue\", Arial, sans-serif,\n        \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\",\n        \"Noto Color Emoji\";\n    --djdt-font-family-monospace:\n        ui-monospace, Menlo, Monaco, \"Cascadia Mono\",\n        \"Segoe UI Mono\", \"Roboto Mono\", \"Oxygen Mono\", \"Ubuntu Monospace\",\n        \"Source Code Pro\", \"Fira Mono\", \"Droid Sans Mono\", \"Courier New\",\n        monospace, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\",\n        \"Noto Color Emoji\";\n}\n\n:root,\n#djDebug[data-theme=\"light\"] {\n    --djdt-font-color: black;\n    --djdt-background-color: white;\n    --djdt-panel-content-background-color: #eee;\n    --djdt-panel-content-table-background-color: var(--djdt-background-color);\n    --djdt-panel-title-background-color: #ffc;\n    --djdt-panel-content-table-strip-background-color: #f9f9f9;\n    --djdt-highlighted-background-color: #ffc;\n    --djdt-toggle-template-background-color: #bbb;\n\n    --djdt-sql-font-color: #333;\n    --djdt-pre-text-color: #666;\n    --djdt-path-and-locals: black;\n    --djdt-stack-span-color: #666;\n    --djdt-template-highlight-color: #333;\n\n    --djdt-table-header-color: #666;\n    --djdt-table-header-background-color: #f8f8f8;\n    --djdt-table-border-color: #ddd;\n    --djdt-button-border-color: #ccc;\n    --djdt-button-hover-border-color: #aaa;\n    --djdt-pre-border-color: var(--djdt-table-border-color);\n    --djdt-raw-border-color: var(--djdt-table-border-color);\n}\n\n#djDebug[data-theme=\"dark\"] {\n    --djdt-font-color: #f8f8f2;\n    --djdt-background-color: #121212;\n    --djdt-panel-content-background-color: #121212;\n    --djdt-panel-content-table-background-color: var(--djdt-background-color);\n    --djdt-panel-title-background-color: #417690;\n    --djdt-panel-content-table-strip-background-color: #171717;\n    --djdt-highlighted-background-color: #00363a;\n    --djdt-toggle-template-background-color: #353535;\n\n    --djdt-sql-font-color: var(--djdt-font-color);\n    --djdt-pre-text-color: var(--djdt-font-color);\n    --djdt-path-and-locals: #bbb;\n    --djdt-stack-span-color: #ccc;\n    --djdt-template-highlight-color: var(--djdt-stack-span-color);\n\n    --djdt-table-header-color: #f8f8f8;\n    --djdt-table-header-background-color: #212121;\n    --djdt-table-border-color: #353535;\n    --djdt-button-border-color: #666;\n    --djdt-pre-border-color: var(--djdt-table-border-color);\n    --djdt-raw-border-color: var(--djdt-table-border-color);\n}\n\n/* Debug Toolbar CSS Reset, adapted from Eric Meyer's CSS Reset */\n#djDebug {\n    color: var(--djdt-font-color);\n    background: var(--djdt-background-color);\n}\n#djDebug,\n#djDebug div,\n#djDebug span,\n#djDebug applet,\n#djDebug object,\n#djDebug iframe,\n#djDebug h1,\n#djDebug h2,\n#djDebug h3,\n#djDebug h4,\n#djDebug h5,\n#djDebug h6,\n#djDebug p,\n#djDebug blockquote,\n#djDebug pre,\n#djDebug a,\n#djDebug abbr,\n#djDebug acronym,\n#djDebug address,\n#djDebug big,\n#djDebug cite,\n#djDebug code,\n#djDebug del,\n#djDebug dfn,\n#djDebug em,\n#djDebug font,\n#djDebug img,\n#djDebug ins,\n#djDebug kbd,\n#djDebug q,\n#djDebug s,\n#djDebug samp,\n#djDebug small,\n#djDebug strike,\n#djDebug strong,\n#djDebug sub,\n#djDebug sup,\n#djDebug tt,\n#djDebug var,\n#djDebug b,\n#djDebug u,\n#djDebug i,\n#djDebug center,\n#djDebug dl,\n#djDebug dt,\n#djDebug dd,\n#djDebug ol,\n#djDebug ul,\n#djDebug li,\n#djDebug fieldset,\n#djDebug form,\n#djDebug label,\n#djDebug legend,\n#djDebug table,\n#djDebug caption,\n#djDebug tbody,\n#djDebug tfoot,\n#djDebug thead,\n#djDebug tr,\n#djDebug th,\n#djDebug td,\n#djDebug summary,\n#djDebug button {\n    margin: 0;\n    padding: 0;\n    min-width: auto;\n    width: auto;\n    min-height: auto;\n    height: auto;\n    border: 0;\n    outline: 0;\n    font-size: 12px;\n    line-height: 1.5em;\n    color: var(--djdt-font-color);\n    vertical-align: baseline;\n    background-color: transparent;\n    font-family: var(--djdt-font-family-primary);\n    text-align: left;\n    text-shadow: none;\n    white-space: normal;\n    transition: none;\n}\n\n#djDebug button {\n    background-color: var(--djdt-background-color);\n    border: 1px solid var(--djdt-button-border-color);\n    border-radius: 4px;\n    color: var(--djdt-font-color);\n    line-height: 1;\n    padding: 4px 8px;\n    text-align: center;\n    text-decoration: none;\n}\n\n#djDebug[data-theme=\"light\"] button {\n    box-shadow: 0 -15px 20px -10px rgba(0, 0, 0, 0.15) inset;\n}\n\n#djDebug button:hover {\n    border-color: var(--djdt-button-hover-border-color);\n    cursor: pointer;\n}\n\n#djDebug button:active {\n    border: 1px solid #aaa;\n}\n#djDebug summary {\n    cursor: pointer;\n}\n\n#djDebug #djDebugToolbar {\n    background-color: #111;\n    width: 220px;\n    z-index: 100000000;\n    position: fixed;\n    top: 0;\n    bottom: 0;\n    right: 0;\n    opacity: 0.9;\n    overflow-y: auto;\n}\n\n#djDebug #djDebugToolbar small {\n    color: #999;\n}\n\n#djDebug #djDebugToolbar ul {\n    margin: 0;\n    padding: 0;\n    list-style: none;\n}\n\n#djDebug #djDebugToolbar li {\n    border-bottom: 1px solid #222;\n    color: #fff;\n    display: block;\n    font-weight: bold;\n    float: none;\n    margin: 0;\n    padding: 0;\n    position: relative;\n    width: auto;\n}\n\n#djDebug #djDebugToolbar input[type=\"checkbox\"] {\n    float: right;\n    margin: 10px;\n}\n\n#djDebug #djDebugToolbar li > a,\n#djDebug #djDebugToolbar li > div.djdt-contentless {\n    font-weight: normal;\n    font-style: normal;\n    text-decoration: none;\n    display: block;\n    font-size: 16px;\n    padding: 7px 10px 8px 25px;\n    color: #fff;\n}\n#djDebug #djDebugToolbar li > div.djdt-disabled {\n    font-style: italic;\n    color: #999;\n}\n\n#djDebug #djDebugToolbar li a:hover {\n    color: #111;\n    background-color: #ffc;\n}\n\n#djDebug #djDebugToolbar li.djdt-active {\n    background: #333;\n}\n\n#djDebug #djDebugToolbar li.djdt-active:before {\n    content: \"▶\";\n    font-family: var(--djdt-font-family-primary);\n    position: absolute;\n    left: 0;\n    top: 50%;\n    transform: translateY(-50%);\n    color: #eee;\n    font-size: 150%;\n}\n\n#djDebug #djDebugToolbar li.djdt-active a:hover {\n    color: #b36a60;\n    background-color: transparent;\n}\n\n#djDebug #djDebugToolbar li small {\n    font-size: 12px;\n    color: #999;\n    font-style: normal;\n    text-decoration: none;\n}\n\n#djDebug #djDebugToolbarHandle {\n    position: fixed;\n    transform: translateY(-100%) rotate(-90deg);\n    transform-origin: right bottom;\n    background-color: #fff;\n    border: 1px solid #111;\n    border-bottom: 0;\n    top: 0;\n    right: 0;\n    z-index: 100000000;\n    opacity: 0.75;\n}\n\n#djDebug #djShowToolBarButton {\n    padding: 0 5px;\n    border: 4px solid #fff;\n    border-bottom-width: 0;\n    color: #fff;\n    font-size: 22px;\n    font-weight: bold;\n    background: #000;\n    opacity: 0.6;\n}\n\n#djDebug #djShowToolBarButton:hover {\n    background-color: #111;\n    border-color: #ffe761;\n    cursor: move;\n    opacity: 1;\n}\n\n#djDebug #djShowToolBarD {\n    color: #cf9;\n    font-size: 22px;\n}\n\n#djDebug #djShowToolBarJ {\n    color: #cf9;\n    font-size: 16px;\n}\n\n#djDebug pre,\n#djDebug code {\n    display: block;\n    font-family: var(--djdt-font-family-monospace);\n    overflow: auto;\n}\n\n#djDebug code {\n    font-size: 12px;\n    white-space: pre;\n}\n\n#djDebug pre {\n    white-space: pre-wrap;\n    color: var(--djdt-pre-text-color);\n    border: 1px solid var(--djdt-pre-border-color);\n    border-collapse: collapse;\n    background-color: var(--djdt-background-color);\n    padding: 8px;\n    margin-bottom: 3px;\n}\n\n#djDebug pre span {\n    font-family: var(--djdt-font-family-monospace);\n}\n\n#djDebug .djdt-panelContent {\n    position: fixed;\n    margin: 0;\n    top: 0;\n    right: 220px;\n    bottom: 0;\n    left: 0px;\n    background-color: var(--djdt-panel-content-background-color);\n    color: #666;\n    z-index: 100000000;\n}\n\n#djDebug .djdt-panelContent > div {\n    border-bottom: 1px solid var(--djdt-table-border-color);\n}\n\n#djDebug .djDebugPanelTitle {\n    position: absolute;\n    background-color: var(--djdt-panel-title-background-color);\n    color: #666;\n    padding-left: 20px;\n    top: 0;\n    right: 0;\n    left: 0;\n    height: 50px;\n}\n\n#djDebug .djDebugPanelTitle code {\n    display: inline;\n    font-size: inherit;\n}\n\n#djDebug .djDebugPanelContent {\n    position: absolute;\n    top: 50px;\n    right: 0;\n    bottom: 0;\n    left: 0;\n    height: auto;\n    padding: 5px 0 0 20px;\n}\n\n#djDebug .djDebugPanelContent .djdt-loader {\n    margin: 80px auto;\n    border: 6px solid white;\n    border-radius: 50%;\n    border-top: 6px solid #ffe761;\n    width: 38px;\n    height: 38px;\n    animation: spin 2s linear infinite;\n}\n\n@keyframes spin {\n    0% {\n        transform: rotate(0deg);\n    }\n    100% {\n        transform: rotate(360deg);\n    }\n}\n\n#djDebug .djDebugPanelContent .djdt-scroll {\n    height: 100%;\n    overflow: auto;\n    display: block;\n    padding: 0 10px 0 0;\n}\n\n#djDebug h3 {\n    font-size: 24px;\n    font-weight: normal;\n    line-height: 50px;\n}\n\n#djDebug h4 {\n    font-size: 20px;\n    font-weight: 400;\n    margin-top: 0.8em;\n}\n\n#djDebug .djdt-panelContent table {\n    border: 1px solid var(--djdt-table-border-color);\n    border-collapse: collapse;\n    width: 100%;\n    background-color: var(--djdt-panel-content-table-background-color);\n    display: table;\n    margin-top: 0.8em;\n    overflow: auto;\n}\n#djDebug .djdt-panelContent tbody > tr:nth-child(odd):not(.djdt-highlighted) {\n    background-color: var(--djdt-panel-content-table-strip-background-color);\n}\n#djDebug .djdt-panelContent tbody th {\n    border-top: 1px solid var(--djdt-table-border-color);\n}\n#djDebug .djdt-panelContent tbody td,\n#djDebug .djdt-panelContent tbody th {\n    vertical-align: top;\n    padding: 8px 10px;\n    border-bottom: 1px solid var(--djdt-table-border-color);\n}\n#djDebug .djdt-panelContent tbody td.djdt-time {\n    text-align: right;\n    min-width: 50px;\n}\n\n#djDebug .djdt-panelContent thead th {\n    padding: 8px 10px;\n    color: var(--djdt-table-header-color);\n    border-bottom: 1px solid var(--djdt-table-border-color);\n    background-color: var(--djdt-table-header-background-color);\n    text-align: left;\n    text-transform: uppercase;\n    font-weight: bold;\n    font-size: 11px;\n    white-space: nowrap;\n}\n#djDebug .djdt-panelContent .djdt-codeContext tbody td {\n    padding: 2px 3px;\n    border-bottom: none;\n}\n\n#djDebug .djTemplateContext {\n    padding: 8px;\n    background-color: var(--djdt-panel-content-table-strip-background-color);\n    border: 1px solid var(--djdt-pre-border-color);\n}\n\n#djDebug .djdt-panelContent .djDebugClose {\n    position: absolute;\n    top: 4px;\n    right: 15px;\n    line-height: 16px;\n    border: 3px solid #aaa;\n    border-radius: 50%;\n    background: #fff;\n    color: #aaa;\n    font-weight: 400;\n    font-size: 24px;\n    height: 36px;\n    width: 36px;\n    padding: 0 0 5px;\n    box-sizing: border-box;\n    display: grid;\n    place-items: center;\n    box-shadow: none;\n}\n\n#djDebug .djdt-panelContent .djDebugClose:hover {\n    background: #c0695d;\n}\n\n#djDebug .djdt-panelContent dt,\n#djDebug .djdt-panelContent dd {\n    display: block;\n}\n\n#djDebug .djdt-panelContent dt {\n    margin-top: 0.75em;\n}\n\n#djDebug .djdt-panelContent dd {\n    margin-left: 10px;\n}\n\n#djDebug a.toggleTemplate {\n    padding: 4px;\n    background-color: var(--djdt-toggle-template-background-color);\n    border-radius: 3px;\n}\n\n#djDebug a.toggleTemplate:hover {\n    padding: 4px;\n    background-color: #444;\n    color: #ffe761;\n    border-radius: 3px;\n}\n\n#djDebug .djDebugCollapsed {\n    color: var(--djdt-sql-font-color);\n}\n\n#djDebug .djDebugUncollapsed {\n    color: var(--djdt-sql-font-color);\n}\n\n#djDebug .djUnselected {\n    display: none;\n}\n\n#djDebug tr.djSelected {\n    display: table-row;\n}\n#djDebug .djdt-databaseLegend {\n    margin-top: 1em;\n}\n\n#djDebug .djDebugSql {\n    overflow-wrap: anywhere;\n}\n\n#djDebug .djSQLDetailsDiv tbody th {\n    text-align: left;\n}\n\n#djDebug span.djDebugLineChart {\n    background-color: #777;\n    height: 3px;\n    position: absolute;\n    bottom: 0;\n    top: 0;\n    left: 0;\n    display: block;\n    z-index: 1000000001;\n}\n#djDebug span.djDebugLineChartWarning {\n    background-color: #900;\n}\n\n#djDebug .highlight {\n    color: var(--djdt-font-color);\n}\n#djDebug .highlight .err {\n    color: var(--djdt-font-color);\n} /* Error */\n\n/*\nStyles for pygments HTMLFormatter\n\n- This should match debug_toolbar/panels/templates/views.py::template_source\n- Each line needs to be prefixed with #djDebug .highlight as well.\n- The .w definition needs to include:\n    white-space: pre-wrap\n\nTo regenerate:\n\n    from pygments.formatters import HtmlFormatter\n    print(HtmlFormatter(wrapcode=True).get_style_defs())\n */\n#djDebug[data-theme=\"light\"] .highlight pre {\n    line-height: 125%;\n}\n#djDebug[data-theme=\"light\"] .highlight td.linenos .normal {\n    color: inherit;\n    background-color: transparent;\n    padding-left: 5px;\n    padding-right: 5px;\n}\n#djDebug[data-theme=\"light\"] .highlight span.linenos {\n    color: inherit;\n    background-color: transparent;\n    padding-left: 5px;\n    padding-right: 5px;\n}\n#djDebug[data-theme=\"light\"] .highlight td.linenos .special {\n    color: #000000;\n    background-color: #ffffc0;\n    padding-left: 5px;\n    padding-right: 5px;\n}\n#djDebug[data-theme=\"light\"] .highlight span.linenos.special {\n    color: #000000;\n    background-color: #ffffc0;\n    padding-left: 5px;\n    padding-right: 5px;\n}\n#djDebug[data-theme=\"light\"] .highlight .hll {\n    background-color: #ffffcc;\n}\n#djDebug[data-theme=\"light\"] .highlight .c {\n    color: #3d7b7b;\n    font-style: italic;\n} /* Comment */\n#djDebug[data-theme=\"light\"] .highlight .err {\n    border: 1px solid #ff0000;\n} /* Error */\n#djDebug[data-theme=\"light\"] .highlight .k {\n    color: #008000;\n    font-weight: bold;\n} /* Keyword */\n#djDebug[data-theme=\"light\"] .highlight .o {\n    color: #666666;\n} /* Operator */\n#djDebug[data-theme=\"light\"] .highlight .ch {\n    color: #3d7b7b;\n    font-style: italic;\n} /* Comment.Hashbang */\n#djDebug[data-theme=\"light\"] .highlight .cm {\n    color: #3d7b7b;\n    font-style: italic;\n} /* Comment.Multiline */\n#djDebug[data-theme=\"light\"] .highlight .cp {\n    color: #9c6500;\n} /* Comment.Preproc */\n#djDebug[data-theme=\"light\"] .highlight .cpf {\n    color: #3d7b7b;\n    font-style: italic;\n} /* Comment.PreprocFile */\n#djDebug[data-theme=\"light\"] .highlight .c1 {\n    color: #3d7b7b;\n    font-style: italic;\n} /* Comment.Single */\n#djDebug[data-theme=\"light\"] .highlight .cs {\n    color: #3d7b7b;\n    font-style: italic;\n} /* Comment.Special */\n#djDebug[data-theme=\"light\"] .highlight .gd {\n    color: #a00000;\n} /* Generic.Deleted */\n#djDebug[data-theme=\"light\"] .highlight .ge {\n    font-style: italic;\n} /* Generic.Emph */\n#djDebug[data-theme=\"light\"] .highlight .ges {\n    font-weight: bold;\n    font-style: italic;\n} /* Generic.EmphStrong */\n#djDebug[data-theme=\"light\"] .highlight .gr {\n    color: #e40000;\n} /* Generic.Error */\n#djDebug[data-theme=\"light\"] .highlight .gh {\n    color: #000080;\n    font-weight: bold;\n} /* Generic.Heading */\n#djDebug[data-theme=\"light\"] .highlight .gi {\n    color: #008400;\n} /* Generic.Inserted */\n#djDebug[data-theme=\"light\"] .highlight .go {\n    color: #717171;\n} /* Generic.Output */\n#djDebug[data-theme=\"light\"] .highlight .gp {\n    color: #000080;\n    font-weight: bold;\n} /* Generic.Prompt */\n#djDebug[data-theme=\"light\"] .highlight .gs {\n    font-weight: bold;\n} /* Generic.Strong */\n#djDebug[data-theme=\"light\"] .highlight .gu {\n    color: #800080;\n    font-weight: bold;\n} /* Generic.Subheading */\n#djDebug[data-theme=\"light\"] .highlight .gt {\n    color: #0044dd;\n} /* Generic.Traceback */\n#djDebug[data-theme=\"light\"] .highlight .kc {\n    color: #008000;\n    font-weight: bold;\n} /* Keyword.Constant */\n#djDebug[data-theme=\"light\"] .highlight .kd {\n    color: #008000;\n    font-weight: bold;\n} /* Keyword.Declaration */\n#djDebug[data-theme=\"light\"] .highlight .kn {\n    color: #008000;\n    font-weight: bold;\n} /* Keyword.Namespace */\n#djDebug[data-theme=\"light\"] .highlight .kp {\n    color: #008000;\n} /* Keyword.Pseudo */\n#djDebug[data-theme=\"light\"] .highlight .kr {\n    color: #008000;\n    font-weight: bold;\n} /* Keyword.Reserved */\n#djDebug[data-theme=\"light\"] .highlight .kt {\n    color: #b00040;\n} /* Keyword.Type */\n#djDebug[data-theme=\"light\"] .highlight .m {\n    color: #666666;\n} /* Literal.Number */\n#djDebug[data-theme=\"light\"] .highlight .s {\n    color: #ba2121;\n} /* Literal.String */\n#djDebug[data-theme=\"light\"] .highlight .na {\n    color: #687822;\n} /* Name.Attribute */\n#djDebug[data-theme=\"light\"] .highlight .nb {\n    color: #008000;\n} /* Name.Builtin */\n#djDebug[data-theme=\"light\"] .highlight .nc {\n    color: #0000ff;\n    font-weight: bold;\n} /* Name.Class */\n#djDebug[data-theme=\"light\"] .highlight .no {\n    color: #880000;\n} /* Name.Constant */\n#djDebug[data-theme=\"light\"] .highlight .nd {\n    color: #aa22ff;\n} /* Name.Decorator */\n#djDebug[data-theme=\"light\"] .highlight .ni {\n    color: #717171;\n    font-weight: bold;\n} /* Name.Entity */\n#djDebug[data-theme=\"light\"] .highlight .ne {\n    color: #cb3f38;\n    font-weight: bold;\n} /* Name.Exception */\n#djDebug[data-theme=\"light\"] .highlight .nf {\n    color: #0000ff;\n} /* Name.Function */\n#djDebug[data-theme=\"light\"] .highlight .nl {\n    color: #767600;\n} /* Name.Label */\n#djDebug[data-theme=\"light\"] .highlight .nn {\n    color: #0000ff;\n    font-weight: bold;\n} /* Name.Namespace */\n#djDebug[data-theme=\"light\"] .highlight .nt {\n    color: #008000;\n    font-weight: bold;\n} /* Name.Tag */\n#djDebug[data-theme=\"light\"] .highlight .nv {\n    color: #19177c;\n} /* Name.Variable */\n#djDebug[data-theme=\"light\"] .highlight .ow {\n    color: #aa22ff;\n    font-weight: bold;\n} /* Operator.Word */\n#djDebug[data-theme=\"light\"] .highlight .w {\n    color: #bbbbbb;\n    white-space: pre-wrap;\n} /* Text.Whitespace */\n#djDebug[data-theme=\"light\"] .highlight .mb {\n    color: #666666;\n} /* Literal.Number.Bin */\n#djDebug[data-theme=\"light\"] .highlight .mf {\n    color: #666666;\n} /* Literal.Number.Float */\n#djDebug[data-theme=\"light\"] .highlight .mh {\n    color: #666666;\n} /* Literal.Number.Hex */\n#djDebug[data-theme=\"light\"] .highlight .mi {\n    color: #666666;\n} /* Literal.Number.Integer */\n#djDebug[data-theme=\"light\"] .highlight .mo {\n    color: #666666;\n} /* Literal.Number.Oct */\n#djDebug[data-theme=\"light\"] .highlight .sa {\n    color: #ba2121;\n} /* Literal.String.Affix */\n#djDebug[data-theme=\"light\"] .highlight .sb {\n    color: #ba2121;\n} /* Literal.String.Backtick */\n#djDebug[data-theme=\"light\"] .highlight .sc {\n    color: #ba2121;\n} /* Literal.String.Char */\n#djDebug[data-theme=\"light\"] .highlight .dl {\n    color: #ba2121;\n} /* Literal.String.Delimiter */\n#djDebug[data-theme=\"light\"] .highlight .sd {\n    color: #ba2121;\n    font-style: italic;\n} /* Literal.String.Doc */\n#djDebug[data-theme=\"light\"] .highlight .s2 {\n    color: #ba2121;\n} /* Literal.String.Double */\n#djDebug[data-theme=\"light\"] .highlight .se {\n    color: #aa5d1f;\n    font-weight: bold;\n} /* Literal.String.Escape */\n#djDebug[data-theme=\"light\"] .highlight .sh {\n    color: #ba2121;\n} /* Literal.String.Heredoc */\n#djDebug[data-theme=\"light\"] .highlight .si {\n    color: #a45a77;\n    font-weight: bold;\n} /* Literal.String.Interpol */\n#djDebug[data-theme=\"light\"] .highlight .sx {\n    color: #008000;\n} /* Literal.String.Other */\n#djDebug[data-theme=\"light\"] .highlight .sr {\n    color: #a45a77;\n} /* Literal.String.Regex */\n#djDebug[data-theme=\"light\"] .highlight .s1 {\n    color: #ba2121;\n} /* Literal.String.Single */\n#djDebug[data-theme=\"light\"] .highlight .ss {\n    color: #19177c;\n} /* Literal.String.Symbol */\n#djDebug[data-theme=\"light\"] .highlight .bp {\n    color: #008000;\n} /* Name.Builtin.Pseudo */\n#djDebug[data-theme=\"light\"] .highlight .fm {\n    color: #0000ff;\n} /* Name.Function.Magic */\n#djDebug[data-theme=\"light\"] .highlight .vc {\n    color: #19177c;\n} /* Name.Variable.Class */\n#djDebug[data-theme=\"light\"] .highlight .vg {\n    color: #19177c;\n} /* Name.Variable.Global */\n#djDebug[data-theme=\"light\"] .highlight .vi {\n    color: #19177c;\n} /* Name.Variable.Instance */\n#djDebug[data-theme=\"light\"] .highlight .vm {\n    color: #19177c;\n} /* Name.Variable.Magic */\n#djDebug[data-theme=\"light\"] .highlight .il {\n    color: #666666;\n} /* Literal.Number.Integer.Long */\n\n#djDebug[data-theme=\"dark\"] .highlight .hll {\n    background-color: #f1fa8c;\n}\n#djDebug[data-theme=\"dark\"] .highlight {\n    background: #282a36;\n    color: #f8f8f2;\n}\n#djDebug[data-theme=\"dark\"] .highlight .c {\n    color: #6272a4;\n} /* Comment */\n#djDebug[data-theme=\"dark\"] .highlight .err {\n    color: #f8f8f2;\n} /* Error */\n#djDebug[data-theme=\"dark\"] .highlight .g {\n    color: #f8f8f2;\n} /* Generic */\n#djDebug[data-theme=\"dark\"] .highlight .k {\n    color: #ff79c6;\n} /* Keyword */\n#djDebug[data-theme=\"dark\"] .highlight .l {\n    color: #f8f8f2;\n} /* Literal */\n#djDebug[data-theme=\"dark\"] .highlight .n {\n    color: #f8f8f2;\n} /* Name */\n#djDebug[data-theme=\"dark\"] .highlight .o {\n    color: #ff79c6;\n} /* Operator */\n#djDebug[data-theme=\"dark\"] .highlight .x {\n    color: #f8f8f2;\n} /* Other */\n#djDebug[data-theme=\"dark\"] .highlight .p {\n    color: #f8f8f2;\n} /* Punctuation */\n#djDebug[data-theme=\"dark\"] .highlight .ch {\n    color: #6272a4;\n} /* Comment.Hashbang */\n#djDebug[data-theme=\"dark\"] .highlight .cm {\n    color: #6272a4;\n} /* Comment.Multiline */\n#djDebug[data-theme=\"dark\"] .highlight .cp {\n    color: #ff79c6;\n} /* Comment.Preproc */\n#djDebug[data-theme=\"dark\"] .highlight .cpf {\n    color: #6272a4;\n} /* Comment.PreprocFile */\n#djDebug[data-theme=\"dark\"] .highlight .c1 {\n    color: #6272a4;\n} /* Comment.Single */\n#djDebug[data-theme=\"dark\"] .highlight .cs {\n    color: #6272a4;\n} /* Comment.Special */\n#djDebug[data-theme=\"dark\"] .highlight .gd {\n    color: #8b080b;\n} /* Generic.Deleted */\n#djDebug[data-theme=\"dark\"] .highlight .ge {\n    color: #f8f8f2;\n    text-decoration: underline;\n} /* Generic.Emph */\n#djDebug[data-theme=\"dark\"] .highlight .gr {\n    color: #f8f8f2;\n} /* Generic.Error */\n#djDebug[data-theme=\"dark\"] .highlight .gh {\n    color: #f8f8f2;\n    font-weight: bold;\n} /* Generic.Heading */\n#djDebug[data-theme=\"dark\"] .highlight .gi {\n    color: #f8f8f2;\n    font-weight: bold;\n} /* Generic.Inserted */\n#djDebug[data-theme=\"dark\"] .highlight .go {\n    color: #44475a;\n} /* Generic.Output */\n#djDebug[data-theme=\"dark\"] .highlight .gp {\n    color: #f8f8f2;\n} /* Generic.Prompt */\n#djDebug[data-theme=\"dark\"] .highlight .gs {\n    color: #f8f8f2;\n} /* Generic.Strong */\n#djDebug[data-theme=\"dark\"] .highlight .gu {\n    color: #f8f8f2;\n    font-weight: bold;\n} /* Generic.Subheading */\n#djDebug[data-theme=\"dark\"] .highlight .gt {\n    color: #f8f8f2;\n} /* Generic.Traceback */\n#djDebug[data-theme=\"dark\"] .highlight .kc {\n    color: #ff79c6;\n} /* Keyword.Constant */\n#djDebug[data-theme=\"dark\"] .highlight .kd {\n    color: #8be9fd;\n    font-style: italic;\n} /* Keyword.Declaration */\n#djDebug[data-theme=\"dark\"] .highlight .kn {\n    color: #ff79c6;\n} /* Keyword.Namespace */\n#djDebug[data-theme=\"dark\"] .highlight .kp {\n    color: #ff79c6;\n} /* Keyword.Pseudo */\n#djDebug[data-theme=\"dark\"] .highlight .kr {\n    color: #ff79c6;\n} /* Keyword.Reserved */\n#djDebug[data-theme=\"dark\"] .highlight .kt {\n    color: #8be9fd;\n} /* Keyword.Type */\n#djDebug[data-theme=\"dark\"] .highlight .ld {\n    color: #f8f8f2;\n} /* Literal.Date */\n#djDebug[data-theme=\"dark\"] .highlight .m {\n    color: #bd93f9;\n} /* Literal.Number */\n#djDebug[data-theme=\"dark\"] .highlight .s {\n    color: #f1fa8c;\n} /* Literal.String */\n#djDebug[data-theme=\"dark\"] .highlight .na {\n    color: #50fa7b;\n} /* Name.Attribute */\n#djDebug[data-theme=\"dark\"] .highlight .nb {\n    color: #8be9fd;\n    font-style: italic;\n} /* Name.Builtin */\n#djDebug[data-theme=\"dark\"] .highlight .nc {\n    color: #50fa7b;\n} /* Name.Class */\n#djDebug[data-theme=\"dark\"] .highlight .no {\n    color: #f8f8f2;\n} /* Name.Constant */\n#djDebug[data-theme=\"dark\"] .highlight .nd {\n    color: #f8f8f2;\n} /* Name.Decorator */\n#djDebug[data-theme=\"dark\"] .highlight .ni {\n    color: #f8f8f2;\n} /* Name.Entity */\n#djDebug[data-theme=\"dark\"] .highlight .ne {\n    color: #f8f8f2;\n} /* Name.Exception */\n#djDebug[data-theme=\"dark\"] .highlight .nf {\n    color: #50fa7b;\n} /* Name.Function */\n#djDebug[data-theme=\"dark\"] .highlight .nl {\n    color: #8be9fd;\n    font-style: italic;\n} /* Name.Label */\n#djDebug[data-theme=\"dark\"] .highlight .nn {\n    color: #f8f8f2;\n} /* Name.Namespace */\n#djDebug[data-theme=\"dark\"] .highlight .nx {\n    color: #f8f8f2;\n} /* Name.Other */\n#djDebug[data-theme=\"dark\"] .highlight .py {\n    color: #f8f8f2;\n} /* Name.Property */\n#djDebug[data-theme=\"dark\"] .highlight .nt {\n    color: #ff79c6;\n} /* Name.Tag */\n#djDebug[data-theme=\"dark\"] .highlight .nv {\n    color: #8be9fd;\n    font-style: italic;\n} /* Name.Variable */\n#djDebug[data-theme=\"dark\"] .highlight .ow {\n    color: #ff79c6;\n} /* Operator.Word */\n#djDebug[data-theme=\"dark\"] .highlight .w {\n    color: #f8f8f2;\n} /* Text.Whitespace */\n#djDebug[data-theme=\"dark\"] .highlight .mb {\n    color: #bd93f9;\n} /* Literal.Number.Bin */\n#djDebug[data-theme=\"dark\"] .highlight .mf {\n    color: #bd93f9;\n} /* Literal.Number.Float */\n#djDebug[data-theme=\"dark\"] .highlight .mh {\n    color: #bd93f9;\n} /* Literal.Number.Hex */\n#djDebug[data-theme=\"dark\"] .highlight .mi {\n    color: #bd93f9;\n} /* Literal.Number.Integer */\n#djDebug[data-theme=\"dark\"] .highlight .mo {\n    color: #bd93f9;\n} /* Literal.Number.Oct */\n#djDebug[data-theme=\"dark\"] .highlight .sa {\n    color: #f1fa8c;\n} /* Literal.String.Affix */\n#djDebug[data-theme=\"dark\"] .highlight .sb {\n    color: #f1fa8c;\n} /* Literal.String.Backtick */\n#djDebug[data-theme=\"dark\"] .highlight .sc {\n    color: #f1fa8c;\n} /* Literal.String.Char */\n#djDebug[data-theme=\"dark\"] .highlight .dl {\n    color: #f1fa8c;\n} /* Literal.String.Delimiter */\n#djDebug[data-theme=\"dark\"] .highlight .sd {\n    color: #f1fa8c;\n} /* Literal.String.Doc */\n#djDebug[data-theme=\"dark\"] .highlight .s2 {\n    color: #f1fa8c;\n} /* Literal.String.Double */\n#djDebug[data-theme=\"dark\"] .highlight .se {\n    color: #f1fa8c;\n} /* Literal.String.Escape */\n#djDebug[data-theme=\"dark\"] .highlight .sh {\n    color: #f1fa8c;\n} /* Literal.String.Heredoc */\n#djDebug[data-theme=\"dark\"] .highlight .si {\n    color: #f1fa8c;\n} /* Literal.String.Interpol */\n#djDebug[data-theme=\"dark\"] .highlight .sx {\n    color: #f1fa8c;\n} /* Literal.String.Other */\n#djDebug[data-theme=\"dark\"] .highlight .sr {\n    color: #f1fa8c;\n} /* Literal.String.Regex */\n#djDebug[data-theme=\"dark\"] .highlight .s1 {\n    color: #f1fa8c;\n} /* Literal.String.Single */\n#djDebug[data-theme=\"dark\"] .highlight .ss {\n    color: #f1fa8c;\n} /* Literal.String.Symbol */\n#djDebug[data-theme=\"dark\"] .highlight .bp {\n    color: #f8f8f2;\n    font-style: italic;\n} /* Name.Builtin.Pseudo */\n#djDebug[data-theme=\"dark\"] .highlight .fm {\n    color: #50fa7b;\n} /* Name.Function.Magic */\n#djDebug[data-theme=\"dark\"] .highlight .vc {\n    color: #8be9fd;\n    font-style: italic;\n} /* Name.Variable.Class */\n#djDebug[data-theme=\"dark\"] .highlight .vg {\n    color: #8be9fd;\n    font-style: italic;\n} /* Name.Variable.Global */\n#djDebug[data-theme=\"dark\"] .highlight .vi {\n    color: #8be9fd;\n    font-style: italic;\n} /* Name.Variable.Instance */\n#djDebug[data-theme=\"dark\"] .highlight .vm {\n    color: #8be9fd;\n    font-style: italic;\n} /* Name.Variable.Magic */\n#djDebug[data-theme=\"dark\"] .highlight .il {\n    color: #bd93f9;\n} /* Literal.Number.Integer.Long */\n\n#djDebug svg.djDebugLineChart {\n    width: 100%;\n    height: 1.5em;\n}\n\n#djDebug svg.djDebugLineChartWarning rect {\n    fill: #900;\n}\n\n#djDebug svg.djDebugLineChartInTransaction rect {\n    fill: #d3ff82;\n}\n#djDebug svg.djDebugLineChart line {\n    stroke: #94b24d;\n}\n\n#djDebug .djDebugRowWarning .djdt-time {\n    color: red;\n}\n#djDebug .djdt-panelContent table .djdt-toggle {\n    width: 14px;\n    padding-top: 3px;\n    padding-right: 0;\n}\n#djDebug .djdt-panelContent table .djdt-actions {\n    min-width: 82px;\n    white-space: nowrap;\n}\n#djDebug .djdt-color:after {\n    content: \"\\00a0\";\n}\n#djDebug .djToggleSwitch {\n    box-sizing: content-box;\n    padding: 1px 2px 3px;\n    margin-top: 5px;\n    border: 1px solid var(--djdt-button-border-color);\n    border-radius: 2px;\n    width: 12px;\n    color: var(--djdt-font-color);\n}\n#djDebug .djNoToggleSwitch {\n    height: 14px;\n    width: 14px;\n    display: inline-block;\n}\n\n#djDebug .djSQLDetailsDiv {\n    margin-top: 0.8em;\n}\n\n#djDebug .djdt-stack span {\n    color: var(--djdt-stack-span-color);\n    font-weight: bold;\n}\n#djDebug .djdt-stack span.djdt-path,\n#djDebug .djdt-stack pre.djdt-locals,\n#djDebug .djdt-stack pre.djdt-locals span {\n    color: var(--djdt-path-and-locals);\n    font-weight: normal;\n}\n#djDebug .djdt-stack span.djdt-code {\n    font-weight: normal;\n}\n#djDebug .djdt-stack pre.djdt-locals {\n    margin: 0 27px 27px 27px;\n}\n#djDebug .djdt-raw {\n    background-color: #fff;\n    border: 1px solid var(--djdt-raw-border-color);\n    margin-top: 0.8em;\n    padding: 5px;\n    white-space: pre-wrap;\n}\n\n#djDebug .djdt-width-20 {\n    width: 20%;\n}\n#djDebug .djdt-width-30 {\n    width: 30%;\n}\n#djDebug .djdt-width-60 {\n    width: 60%;\n}\n#djDebug .djdt-max-height-100 {\n    max-height: 100%;\n}\n#djDebug .djdt-highlighted {\n    background-color: var(--djdt-highlighted-background-color);\n}\n@keyframes djdt-flash-new {\n    from {\n        background-color: green;\n    }\n    to {\n        background-color: inherit;\n    }\n}\n#djDebug .flash-new {\n    animation: djdt-flash-new 1s;\n}\n\n.djdt-hidden {\n    display: none;\n}\n\n#djDebug #djDebugToolbar a#djToggleThemeButton {\n    display: flex;\n    align-items: center;\n    cursor: pointer;\n}\n#djToggleThemeButton > svg {\n    margin-left: auto;\n}\n#djDebug[data-user-theme=\"light\"] #djToggleThemeButton svg.theme-light,\n#djDebug[data-user-theme=\"dark\"] #djToggleThemeButton svg.theme-dark,\n#djDebug[data-user-theme=\"auto\"] #djToggleThemeButton svg.theme-auto {\n    display: block;\n    height: 1rem;\n    width: 1rem;\n}\n\n#djDebug .djdt-community-panel {\n    padding: 1.5em;\n}\n\n#djDebug .djdt-community-panel h2 {\n    font-size: 2em;\n}\n\n#djDebug .djdt-community-panel p {\n    font-size: 1em;\n    margin: 0 0 1em 0;\n}\n\n#djDebug .djdt-community-panel .djdt-community-description {\n    font-size: 1em;\n    margin: 0 0 1.5em 0;\n}\n\n#djDebug .djdt-community-panel ul {\n    list-style-type: disc;\n    padding-left: 1.25em;\n    margin: 1em 0;\n}\n\n#djDebug .djdt-community-panel li {\n    margin: 0.5em 0;\n}\n\n#djDebug .djdt-community-panel a {\n    font-weight: bold;\n    font-size: 1em;\n}\n\n#djDebug .djdt-community-panel a:hover {\n    text-decoration: underline;\n}\n"
  },
  {
    "path": "debug_toolbar/static/debug_toolbar/js/history.js",
    "content": "import { $$, ajaxForm, replaceToolbarState } from \"./utils.js\";\n\nconst djDebug = document.getElementById(\"djDebug\");\n\nfunction difference(setA, setB) {\n    const _difference = new Set(setA);\n    for (const elem of setB) {\n        _difference.delete(elem);\n    }\n    return _difference;\n}\n\n/**\n * Create an array of dataset properties from a NodeList.\n */\nfunction pluckData(nodes, key) {\n    return [...nodes].map((obj) => obj.dataset[key]);\n}\n\nfunction refreshHistory() {\n    const formTarget = djDebug.querySelector(\".refreshHistory\");\n    const container = document.getElementById(\"djdtHistoryRequests\");\n    const oldIds = new Set(\n        pluckData(\n            container.querySelectorAll(\"tr[data-request-id]\"),\n            \"requestId\"\n        )\n    );\n\n    ajaxForm(formTarget)\n        .then((data) => {\n            // Remove existing rows first then re-populate with new data\n            for (const node of container.querySelectorAll(\n                \"tr[data-request-id]\"\n            )) {\n                node.remove();\n            }\n            for (const request of data.requests) {\n                container.innerHTML = request.content + container.innerHTML;\n            }\n        })\n        .then(() => {\n            const allIds = new Set(\n                pluckData(\n                    container.querySelectorAll(\"tr[data-request-id]\"),\n                    \"requestId\"\n                )\n            );\n            const newIds = difference(allIds, oldIds);\n            const lastRequestId = newIds.values().next().value;\n            return {\n                allIds,\n                newIds,\n                lastRequestId,\n            };\n        })\n        .then((refreshInfo) => {\n            for (const newId of refreshInfo.newIds) {\n                const row = container.querySelector(\n                    `tr[data-request-id=\"${newId}\"]`\n                );\n                row.classList.add(\"flash-new\");\n            }\n            setTimeout(() => {\n                for (const row of container.querySelectorAll(\n                    \"tr[data-request-id]\"\n                )) {\n                    row.classList.remove(\"flash-new\");\n                }\n            }, 2000);\n        });\n}\n\nfunction switchHistory(newRequestId) {\n    const formTarget = djDebug.querySelector(\n        `.switchHistory[data-request-id='${newRequestId}']`\n    );\n    const tbody = formTarget.closest(\"tbody\");\n\n    const highlighted = tbody.querySelector(\".djdt-highlighted\");\n    if (highlighted) {\n        highlighted.classList.remove(\"djdt-highlighted\");\n    }\n    formTarget.closest(\"tr\").classList.add(\"djdt-highlighted\");\n\n    ajaxForm(formTarget).then((data) => {\n        if (Object.keys(data).length === 0) {\n            const container = document.getElementById(\"djdtHistoryRequests\");\n            container.querySelector(\n                `button[data-request-id=\"${newRequestId}\"]`\n            ).innerHTML = \"Switch [EXPIRED]\";\n        }\n        replaceToolbarState(newRequestId, data);\n    });\n}\n\n$$.on(djDebug, \"click\", \".switchHistory\", function (event) {\n    event.preventDefault();\n    switchHistory(this.dataset.requestId);\n});\n\n$$.on(djDebug, \"click\", \".refreshHistory\", (event) => {\n    event.preventDefault();\n    refreshHistory();\n});\n// We don't refresh the whole toolbar each fetch or ajax request,\n// so we need to refresh the history when we open the panel\n$$.onPanelRender(djDebug, \"HistoryPanel\", refreshHistory);\n"
  },
  {
    "path": "debug_toolbar/static/debug_toolbar/js/redirect.js",
    "content": "document.getElementById(\"redirect_to\").focus();\n"
  },
  {
    "path": "debug_toolbar/static/debug_toolbar/js/timer.js",
    "content": "import { $$ } from \"./utils.js\";\n\nfunction insertBrowserTiming() {\n    const timingOffset = performance.timing.navigationStart;\n    const timingEnd = performance.timing.loadEventEnd;\n    const totalTime = timingEnd - timingOffset;\n    function getLeft(stat) {\n        if (totalTime !== 0) {\n            return (\n                ((performance.timing[stat] - timingOffset) / totalTime) * 100.0\n            );\n        }\n        return 0;\n    }\n    function getCSSWidth(stat, endStat) {\n        let width = 0;\n        if (totalTime !== 0) {\n            width =\n                ((performance.timing[endStat] - performance.timing[stat]) /\n                    totalTime) *\n                100.0;\n        }\n        const denominator = 100.0 - getLeft(stat);\n        if (denominator !== 0) {\n            // Calculate relative percent (same as sql panel logic)\n            width = (100.0 * width) / denominator;\n        } else {\n            width = 0;\n        }\n        return width < 1 ? \"2px\" : `${width}%`;\n    }\n    function addRow(tbody, stat, endStat) {\n        const row = document.createElement(\"tr\");\n        const elapsed = performance.timing[stat] - timingOffset;\n        if (endStat) {\n            const duration =\n                performance.timing[endStat] - performance.timing[stat];\n            // Render a start through end bar\n            row.innerHTML = `\n<td>${stat.replace(\"Start\", \"\")}</td>\n<td><svg class=\"djDebugLineChart\" xmlns=\"http://www.w3.org/2000/svg\" viewbox=\"0 0 100 5\" preserveAspectRatio=\"none\"><rect y=\"0\" height=\"5\" fill=\"#ccc\" /></svg></td>\n<td>${elapsed}ms (+${duration}ms)</td>\n`;\n            row.querySelector(\"rect\").setAttribute(\n                \"width\",\n                getCSSWidth(stat, endStat)\n            );\n        } else {\n            // Render a point in time\n            row.innerHTML = `\n<td>${stat}</td>\n<td><svg class=\"djDebugLineChart\" xmlns=\"http://www.w3.org/2000/svg\" viewbox=\"0 0 100 5\" preserveAspectRatio=\"none\"><rect y=\"0\" height=\"5\" fill=\"#ccc\" /></svg></td>\n<td>${elapsed}ms</td>\n`;\n            row.querySelector(\"rect\").setAttribute(\"width\", 2);\n        }\n        row.querySelector(\"rect\").setAttribute(\"x\", getLeft(stat));\n        tbody.appendChild(row);\n    }\n\n    const browserTiming = document.getElementById(\"djDebugBrowserTiming\");\n    // Determine if the browser timing section has already been rendered.\n    if (browserTiming.classList.contains(\"djdt-hidden\")) {\n        const tbody = document.getElementById(\"djDebugBrowserTimingTableBody\");\n        // This is a reasonably complete and ordered set of timing periods (2 params) and events (1 param)\n        addRow(tbody, \"domainLookupStart\", \"domainLookupEnd\");\n        addRow(tbody, \"connectStart\", \"connectEnd\");\n        addRow(tbody, \"requestStart\", \"responseEnd\"); // There is no requestEnd\n        addRow(tbody, \"responseStart\", \"responseEnd\");\n        addRow(tbody, \"domLoading\", \"domComplete\"); // Spans the events below\n        addRow(tbody, \"domInteractive\");\n        addRow(tbody, \"domContentLoadedEventStart\", \"domContentLoadedEventEnd\");\n        addRow(tbody, \"loadEventStart\", \"loadEventEnd\");\n        browserTiming.classList.remove(\"djdt-hidden\");\n    }\n}\n\nconst djDebug = document.getElementById(\"djDebug\");\n// Insert the browser timing now since it's possible for this\n// script to miss the initial panel load event.\ninsertBrowserTiming();\n$$.onPanelRender(djDebug, \"TimerPanel\", insertBrowserTiming);\n"
  },
  {
    "path": "debug_toolbar/static/debug_toolbar/js/toolbar.js",
    "content": "import { $$, ajax, debounce, replaceToolbarState } from \"./utils.js\";\n\nfunction onKeyDown(event) {\n    if (event.keyCode === 27) {\n        djdt.hideOneLevel();\n    }\n}\n\nfunction getDebugElement() {\n    // Fetch the debug element from the DOM.\n    // This is used to avoid writing the element's id\n    // everywhere the element is being selected. A fixed reference\n    // to the element should be avoided because the entire DOM could\n    // be reloaded such as via HTMX boosting.\n    return document.getElementById(\"djDebug\");\n}\n\nconst djdt = {\n    handleDragged: false,\n    needUpdateOnFetch: false,\n    init() {\n        const djDebug = getDebugElement();\n        djdt.needUpdateOnFetch = djDebug.dataset.updateOnFetch === \"True\";\n        $$.on(djDebug, \"click\", \"#djDebugPanelList li a\", function (event) {\n            event.preventDefault();\n            if (!this.className) {\n                return;\n            }\n            const panelId = this.className;\n            const current = document.getElementById(panelId);\n            if ($$.visible(current)) {\n                djdt.hidePanels();\n            } else {\n                djdt.hidePanels();\n\n                $$.show(current);\n                this.parentElement.classList.add(\"djdt-active\");\n\n                const inner = current.querySelector(\n                    \".djDebugPanelContent .djdt-scroll\"\n                );\n                const requestId = djDebug.dataset.requestId;\n                if (requestId && inner.children.length === 0) {\n                    const url = new URL(\n                        djDebug.dataset.renderPanelUrl,\n                        window.location\n                    );\n                    url.searchParams.append(\"request_id\", requestId);\n                    url.searchParams.append(\"panel_id\", panelId);\n                    ajax(url).then((data) => {\n                        inner.previousElementSibling.remove(); // Remove AJAX loader\n                        inner.innerHTML = data.content;\n                        $$.executeScripts(data.scripts);\n                        $$.applyStyles(inner);\n                        djDebug.dispatchEvent(\n                            new CustomEvent(\"djdt.panel.render\", {\n                                detail: { panelId: panelId },\n                            })\n                        );\n                    });\n                } else {\n                    djDebug.dispatchEvent(\n                        new CustomEvent(\"djdt.panel.render\", {\n                            detail: { panelId: panelId },\n                        })\n                    );\n                }\n            }\n        });\n        $$.on(djDebug, \"click\", \".djDebugClose\", () => {\n            djdt.hideOneLevel();\n        });\n        $$.on(\n            djDebug,\n            \"click\",\n            \".djDebugPanelButton input[type=checkbox]\",\n            function () {\n                djdt.cookie.set(\n                    this.dataset.cookie,\n                    this.checked ? \"on\" : \"off\",\n                    {\n                        path: \"/\",\n                        expires: 10,\n                    }\n                );\n            }\n        );\n\n        // Used by the SQL and template panels\n        $$.on(djDebug, \"click\", \".remoteCall\", function (event) {\n            event.preventDefault();\n\n            let url;\n            const ajaxData = {};\n\n            if (this.tagName === \"BUTTON\") {\n                const form = this.closest(\"form\");\n                url = this.formAction;\n                ajaxData.method = form.method.toUpperCase();\n                ajaxData.body = new FormData(form);\n            } else if (this.tagName === \"A\") {\n                url = this.href;\n            }\n\n            ajax(url, ajaxData).then((data) => {\n                const win = document.getElementById(\"djDebugWindow\");\n                win.innerHTML = data.content;\n                $$.show(win);\n            });\n        });\n\n        // Used by the cache, profiling and SQL panels\n        $$.on(djDebug, \"click\", \".djToggleSwitch\", function () {\n            const id = this.dataset.toggleId;\n            const toggleOpen = \"+\";\n            const toggleClose = \"-\";\n            const openMe = this.textContent === toggleOpen;\n            const name = this.dataset.toggleName;\n            const container = document.getElementById(`${name}_${id}`);\n            for (const el of container.querySelectorAll(\".djDebugCollapsed\")) {\n                $$.toggle(el, openMe);\n            }\n            for (const el of container.querySelectorAll(\n                \".djDebugUncollapsed\"\n            )) {\n                $$.toggle(el, !openMe);\n            }\n            for (const el of this.closest(\n                \".djDebugPanelContent\"\n            ).querySelectorAll(`.djToggleDetails_${id}`)) {\n                if (openMe) {\n                    el.classList.add(\"djSelected\");\n                    el.classList.remove(\"djUnselected\");\n                    this.textContent = toggleClose;\n                } else {\n                    el.classList.remove(\"djSelected\");\n                    el.classList.add(\"djUnselected\");\n                    this.textContent = toggleOpen;\n                }\n                const switch_ = el.querySelector(\".djToggleSwitch\");\n                if (switch_) {\n                    switch_.textContent = this.textContent;\n                }\n            }\n        });\n\n        $$.on(djDebug, \"click\", \"#djHideToolBarButton\", (event) => {\n            event.preventDefault();\n            djdt.hideToolbar();\n        });\n\n        $$.on(djDebug, \"click\", \"#djShowToolBarButton\", () => {\n            if (!djdt.handleDragged) {\n                djdt.showToolbar();\n            }\n        });\n        let startPageY;\n        let baseY;\n        const handle = document.getElementById(\"djDebugToolbarHandle\");\n        function onHandleMove(event) {\n            // Chrome can send spurious mousemove events, so don't do anything unless the\n            // cursor really moved.  Otherwise, it will be impossible to expand the toolbar\n            // due to djdt.handleDragged being set to true.\n            if (djdt.handleDragged || event.pageY !== startPageY) {\n                let top = baseY + event.pageY;\n\n                if (top < 0) {\n                    top = 0;\n                } else if (top + handle.offsetHeight > window.innerHeight) {\n                    top = window.innerHeight - handle.offsetHeight;\n                }\n\n                handle.style.top = `${top}px`;\n                djdt.handleDragged = true;\n            }\n        }\n        $$.on(djDebug, \"mousedown\", \"#djShowToolBarButton\", (event) => {\n            event.preventDefault();\n            startPageY = event.pageY;\n            baseY = handle.offsetTop - startPageY;\n            document.addEventListener(\"mousemove\", onHandleMove);\n\n            document.addEventListener(\n                \"mouseup\",\n                (event) => {\n                    document.removeEventListener(\"mousemove\", onHandleMove);\n                    if (djdt.handleDragged) {\n                        event.preventDefault();\n                        localStorage.setItem(\"djdt.top\", handle.offsetTop);\n                        requestAnimationFrame(() => {\n                            djdt.handleDragged = false;\n                        });\n                        djdt.ensureHandleVisibility();\n                    }\n                },\n                { once: true }\n            );\n        });\n\n        // Make sure the debug element is rendered at least once.\n        // showToolbar will continue to show it in the future if the\n        // entire DOM is reloaded.\n        $$.show(djDebug);\n        const show =\n            localStorage.getItem(\"djdt.show\") || djDebug.dataset.defaultShow;\n        if (show === \"true\") {\n            djdt.showToolbar();\n        } else {\n            djdt.hideToolbar();\n        }\n        if (djDebug.dataset.sidebarUrl !== undefined) {\n            djdt.updateOnAjax();\n        }\n\n        const prefersDark = window.matchMedia(\n            \"(prefers-color-scheme: dark)\"\n        ).matches;\n        const themeList = prefersDark\n            ? [\"auto\", \"light\", \"dark\"]\n            : [\"auto\", \"dark\", \"light\"];\n        const setTheme = (theme) => {\n            djDebug.setAttribute(\n                \"data-theme\",\n                theme === \"auto\" ? (prefersDark ? \"dark\" : \"light\") : theme\n            );\n            djDebug.setAttribute(\"data-user-theme\", theme);\n        };\n\n        // Updates the theme using user settings\n        let userTheme = localStorage.getItem(\"djdt.user-theme\") || \"auto\";\n        setTheme(userTheme);\n\n        // Adds the listener to the Theme Toggle Button\n        $$.on(djDebug, \"click\", \"#djToggleThemeButton\", () => {\n            const index = themeList.indexOf(userTheme);\n            userTheme = themeList[(index + 1) % themeList.length];\n            localStorage.setItem(\"djdt.user-theme\", userTheme);\n            setTheme(userTheme);\n        });\n    },\n    hidePanels() {\n        const djDebug = getDebugElement();\n        $$.hide(document.getElementById(\"djDebugWindow\"));\n        for (const el of djDebug.querySelectorAll(\".djdt-panelContent\")) {\n            $$.hide(el);\n        }\n        for (const el of document.querySelectorAll(\"#djDebugToolbar li\")) {\n            el.classList.remove(\"djdt-active\");\n        }\n    },\n    ensureHandleVisibility() {\n        const handle = document.getElementById(\"djDebugToolbarHandle\");\n        // set handle position\n        const handleTop = Math.min(\n            localStorage.getItem(\"djdt.top\") || 265,\n            window.innerHeight - handle.offsetWidth\n        );\n        handle.style.top = `${handleTop}px`;\n    },\n    hideToolbar() {\n        djdt.hidePanels();\n\n        $$.hide(document.getElementById(\"djDebugToolbar\"));\n\n        const handle = document.getElementById(\"djDebugToolbarHandle\");\n        $$.show(handle);\n        djdt.ensureHandleVisibility();\n        window.addEventListener(\"resize\", djdt.ensureHandleVisibility);\n        document.removeEventListener(\"keydown\", onKeyDown);\n\n        localStorage.setItem(\"djdt.show\", \"false\");\n    },\n    hideOneLevel() {\n        const win = document.getElementById(\"djDebugWindow\");\n        if ($$.visible(win)) {\n            $$.hide(win);\n        } else {\n            const toolbar = document.getElementById(\"djDebugToolbar\");\n            if (toolbar.querySelector(\"li.djdt-active\")) {\n                djdt.hidePanels();\n            } else {\n                djdt.hideToolbar();\n            }\n        }\n    },\n    showToolbar() {\n        document.addEventListener(\"keydown\", onKeyDown);\n        $$.show(document.getElementById(\"djDebug\"));\n        $$.hide(document.getElementById(\"djDebugToolbarHandle\"));\n        $$.show(document.getElementById(\"djDebugToolbar\"));\n        localStorage.setItem(\"djdt.show\", \"true\");\n        window.removeEventListener(\"resize\", djdt.ensureHandleVisibility);\n    },\n    updateOnAjax() {\n        const sidebarUrl =\n            document.getElementById(\"djDebug\").dataset.sidebarUrl;\n        const slowjax = debounce(ajax, 200);\n\n        function handleAjaxResponse(requestId) {\n            const encodedRequestId = encodeURIComponent(requestId);\n            const dest = `${sidebarUrl}?request_id=${encodedRequestId}`;\n            slowjax(dest).then((data) => {\n                if (djdt.needUpdateOnFetch) {\n                    replaceToolbarState(encodedRequestId, data);\n                }\n            });\n        }\n\n        // Patch XHR / traditional AJAX requests\n        const origOpen = XMLHttpRequest.prototype.open;\n        XMLHttpRequest.prototype.open = function (...args) {\n            this.addEventListener(\"load\", function () {\n                // Chromium emits a \"Refused to get unsafe header\" uncatchable warning\n                // when the header can't be fetched. While it doesn't impede execution\n                // it's worrisome to developers.\n                if (\n                    this.getAllResponseHeaders().indexOf(\"djdt-request-id\") >= 0\n                ) {\n                    handleAjaxResponse(\n                        this.getResponseHeader(\"djdt-request-id\")\n                    );\n                }\n            });\n            origOpen.apply(this, args);\n        };\n\n        const origFetch = window.fetch;\n        window.fetch = function (...args) {\n            // Heads up! Before modifying this code, please be aware of the\n            // possible unhandled errors that might arise from changing this.\n            // For details, see\n            // https://github.com/django-commons/django-debug-toolbar/pull/2100\n            const promise = origFetch.apply(this, args);\n            return promise.then((response) => {\n                if (response.headers.get(\"djdt-request-id\") !== null) {\n                    try {\n                        handleAjaxResponse(\n                            response.headers.get(\"djdt-request-id\")\n                        );\n                    } catch (err) {\n                        throw new Error(\n                            `\"${err.name}\" occurred within django-debug-toolbar: ${err.message}`\n                        );\n                    }\n                }\n                return response;\n            });\n        };\n    },\n    cookie: {\n        get(key) {\n            if (!document.cookie.includes(key)) {\n                return null;\n            }\n\n            const cookieArray = document.cookie.split(\"; \");\n            const cookies = {};\n\n            for (const e of cookieArray) {\n                const parts = e.split(\"=\");\n                cookies[parts[0]] = parts[1];\n            }\n\n            return cookies[key];\n        },\n        set(key, value, options = {}) {\n            if (typeof options.expires === \"number\") {\n                const days = options.expires;\n                const expires = new Date();\n                expires.setDate(expires.setDate() + days);\n                options.expires = expires;\n            }\n\n            document.cookie = [\n                `${encodeURIComponent(key)}=${String(value)}`,\n                options.expires\n                    ? `; expires=${options.expires.toUTCString()}`\n                    : \"\",\n                options.path ? `; path=${options.path}` : \"\",\n                options.domain ? `; domain=${options.domain}` : \"\",\n                options.secure ? \"; secure\" : \"\",\n                \"samesite\" in options\n                    ? `; samesite=${options.samesite}`\n                    : \"; samesite=lax\",\n            ].join(\"\");\n\n            return value;\n        },\n    },\n};\nwindow.djdt = {\n    show_toolbar: djdt.showToolbar,\n    hide_toolbar: djdt.hideToolbar,\n    init: djdt.init,\n    close: djdt.hideOneLevel,\n    cookie: djdt.cookie,\n};\n\nif (document.readyState !== \"loading\") {\n    djdt.init();\n} else {\n    document.addEventListener(\"DOMContentLoaded\", djdt.init);\n}\n"
  },
  {
    "path": "debug_toolbar/static/debug_toolbar/js/utils.js",
    "content": "const $$ = {\n    on(root, eventName, selector, fn) {\n        root.removeEventListener(eventName, fn);\n        root.addEventListener(eventName, (event) => {\n            const target = event.target.closest(selector);\n            if (root.contains(target)) {\n                fn.call(target, event);\n            }\n        });\n    },\n    onPanelRender(root, panelId, fn) {\n        /*\n        This is a helper function to attach a handler for a `djdt.panel.render`\n        event of a specific panel.\n\n        root: The container element that the listener should be attached to.\n        panelId: The Id of the panel.\n        fn: A function to execute when the event is triggered.\n         */\n        root.addEventListener(\"djdt.panel.render\", (event) => {\n            if (event.detail.panelId === panelId) {\n                fn.call(event);\n            }\n        });\n    },\n    show(element) {\n        element.classList.remove(\"djdt-hidden\");\n    },\n    hide(element) {\n        element.classList.add(\"djdt-hidden\");\n    },\n    toggle(element, value) {\n        if (value) {\n            $$.show(element);\n        } else {\n            $$.hide(element);\n        }\n    },\n    visible(element) {\n        return !element.classList.contains(\"djdt-hidden\");\n    },\n    executeScripts(scripts) {\n        for (const script of scripts) {\n            const el = document.createElement(\"script\");\n            el.type = \"module\";\n            el.src = script;\n            el.async = true;\n            document.head.appendChild(el);\n        }\n    },\n    applyStyles(container) {\n        /*\n         * Given a container element, apply styles set via data-djdt-styles attribute.\n         * The format is data-djdt-styles=\"styleName1:value;styleName2:value2\"\n         * The style names should use the CSSStyleDeclaration camel cased names.\n         */\n        for (const element of container.querySelectorAll(\n            \"[data-djdt-styles]\"\n        )) {\n            const styles = element.dataset.djdtStyles || \"\";\n            for (const styleText of styles.split(\";\")) {\n                const styleKeyPair = styleText.split(\":\");\n                if (styleKeyPair.length === 2) {\n                    const name = styleKeyPair[0].trim();\n                    const value = styleKeyPair[1].trim();\n                    element.style[name] = value;\n                }\n            }\n        }\n    },\n};\n\nfunction ajax(url, init) {\n    return fetch(url, Object.assign({ credentials: \"same-origin\" }, init))\n        .then((response) => {\n            if (response.ok) {\n                return response\n                    .json()\n                    .catch((error) =>\n                        Promise.reject(\n                            new Error(\n                                `The response  is a invalid Json object : ${error}`\n                            )\n                        )\n                    );\n            }\n            return Promise.reject(\n                new Error(`${response.status}: ${response.statusText}`)\n            );\n        })\n        .catch((error) => {\n            const win = document.getElementById(\"djDebugWindow\");\n            win.innerHTML = `<div class=\"djDebugPanelTitle\"><h3>${error.message}</h3><button type=\"button\" class=\"djDebugClose\">»</button></div>`;\n            $$.show(win);\n            throw error;\n        });\n}\n\nfunction ajaxForm(element) {\n    const form = element.closest(\"form\");\n    const url = new URL(form.action);\n    const formData = new FormData(form);\n    for (const [name, value] of formData.entries()) {\n        url.searchParams.append(name, value);\n    }\n    const ajaxData = {\n        method: form.method.toUpperCase(),\n    };\n    return ajax(url, ajaxData);\n}\n\nfunction replaceToolbarState(newRequestId, data) {\n    const djDebug = document.getElementById(\"djDebug\");\n    djDebug.setAttribute(\"data-request-id\", newRequestId);\n    // Check if response is empty, it could be due to an expired requestId.\n    for (const panelId of Object.keys(data)) {\n        const panel = document.getElementById(panelId);\n        if (panel) {\n            panel.outerHTML = data[panelId].content;\n            document.getElementById(`djdt-${panelId}`).outerHTML =\n                data[panelId].button;\n        }\n    }\n}\n\nfunction debounce(func, delay) {\n    let timer = null;\n    let resolves = [];\n\n    return (...args) => {\n        clearTimeout(timer);\n        timer = setTimeout(() => {\n            const result = func(...args);\n            for (const r of resolves) {\n                r(result);\n            }\n            resolves = [];\n        }, delay);\n\n        return new Promise((r) => resolves.push(r));\n    };\n}\n\nexport { $$, ajax, ajaxForm, debounce, replaceToolbarState };\n"
  },
  {
    "path": "debug_toolbar/store.py",
    "content": "import contextlib\nimport json\nfrom collections import defaultdict, deque\nfrom collections.abc import Iterable\nfrom typing import Any\n\nfrom django.core.serializers.json import DjangoJSONEncoder\nfrom django.db import transaction\nfrom django.utils.module_loading import import_string\n\nfrom debug_toolbar import settings as dt_settings\nfrom debug_toolbar.models import HistoryEntry\nfrom debug_toolbar.sanitize import force_str\n\n\nclass DebugToolbarJSONEncoder(DjangoJSONEncoder):\n    def default(self, o):\n        try:\n            return super().default(o)\n        except (TypeError, ValueError):\n            return force_str(o)\n\n\ndef serialize(data: Any) -> str:\n    # If this starts throwing an exceptions, consider\n    # Subclassing DjangoJSONEncoder and using force_str to\n    # make it JSON serializable.\n    return json.dumps(data, cls=DebugToolbarJSONEncoder)\n\n\ndef deserialize(data: str) -> Any:\n    return json.loads(data)\n\n\nclass BaseStore:\n    @classmethod\n    def request_ids(cls) -> Iterable:\n        \"\"\"The stored request ids\"\"\"\n        raise NotImplementedError\n\n    @classmethod\n    def exists(cls, request_id: str) -> bool:\n        \"\"\"Does the given request_id exist in the store\"\"\"\n        raise NotImplementedError\n\n    @classmethod\n    def set(cls, request_id: str):\n        \"\"\"Set a request_id in the store\"\"\"\n        raise NotImplementedError\n\n    @classmethod\n    def clear(cls):\n        \"\"\"Remove all requests from the request store\"\"\"\n        raise NotImplementedError\n\n    @classmethod\n    def delete(cls, request_id: str):\n        \"\"\"Delete the store for the given request_id\"\"\"\n        raise NotImplementedError\n\n    @classmethod\n    def save_panel(cls, request_id: str, panel_id: str, data: Any = None):\n        \"\"\"Save the panel data for the given request_id\"\"\"\n        raise NotImplementedError\n\n    @classmethod\n    def panel(cls, request_id: str, panel_id: str) -> Any:\n        \"\"\"Fetch the panel data for the given request_id\"\"\"\n        raise NotImplementedError\n\n\nclass MemoryStore(BaseStore):\n    # ids is the collection of storage ids that have been used.\n    # Use a dequeue to support O(1) appends and pops\n    # from either direction.\n    _request_ids: deque = deque()\n    _request_store: dict[str, dict] = defaultdict(dict)\n\n    @classmethod\n    def request_ids(cls) -> Iterable:\n        \"\"\"The stored request ids\"\"\"\n        return cls._request_ids\n\n    @classmethod\n    def exists(cls, request_id: str) -> bool:\n        \"\"\"Does the given request_id exist in the request store\"\"\"\n        return request_id in cls._request_ids\n\n    @classmethod\n    def set(cls, request_id: str):\n        \"\"\"Set a request_id in the request store\"\"\"\n        if request_id not in cls._request_ids:\n            cls._request_ids.append(request_id)\n        for _ in range(\n            len(cls._request_ids) - dt_settings.get_config()[\"RESULTS_CACHE_SIZE\"]\n        ):\n            removed_id = cls._request_ids.popleft()\n            cls._request_store.pop(removed_id, None)\n\n    @classmethod\n    def clear(cls):\n        \"\"\"Remove all requests from the request store\"\"\"\n        cls._request_ids.clear()\n        cls._request_store.clear()\n\n    @classmethod\n    def delete(cls, request_id: str):\n        \"\"\"Delete the stored request for the given request_id\"\"\"\n        cls._request_store.pop(request_id, None)\n        # Suppress when request_id doesn't exist in the collection of ids.\n        with contextlib.suppress(ValueError):\n            cls._request_ids.remove(request_id)\n\n    @classmethod\n    def save_panel(cls, request_id: str, panel_id: str, data: Any = None):\n        \"\"\"Save the panel data for the given request_id\"\"\"\n        cls.set(request_id)\n        cls._request_store[request_id][panel_id] = serialize(data)\n\n    @classmethod\n    def panel(cls, request_id: str, panel_id: str) -> Any:\n        \"\"\"Fetch the panel data for the given request_id\"\"\"\n        try:\n            data = cls._request_store[request_id][panel_id]\n        except KeyError:\n            return {}\n        else:\n            return deserialize(data)\n\n    @classmethod\n    def panels(cls, request_id: str) -> Any:\n        \"\"\"Fetch all the panel data for the given request_id\"\"\"\n        try:\n            panel_mapping = cls._request_store[request_id]\n        except KeyError:\n            return {}\n        for panel, data in panel_mapping.items():\n            yield panel, deserialize(data)\n\n\nclass DatabaseStore(BaseStore):\n    @classmethod\n    def _cleanup_old_entries(cls):\n        \"\"\"\n        Enforce the cache size limit - keeping only the most recently used entries\n        up to RESULTS_CACHE_SIZE.\n        \"\"\"\n        # Determine which entries to keep\n        keep_ids = cls.request_ids()\n\n        # Delete all entries not in the keep list\n        if keep_ids:\n            HistoryEntry.objects.exclude(request_id__in=keep_ids).delete()\n\n    @classmethod\n    def request_ids(cls):\n        \"\"\"Return all stored request ids within the cache size limit\"\"\"\n        cache_size = dt_settings.get_config()[\"RESULTS_CACHE_SIZE\"]\n        return list(\n            HistoryEntry.objects.all()[:cache_size].values_list(\"request_id\", flat=True)\n        )\n\n    @classmethod\n    def exists(cls, request_id: str) -> bool:\n        \"\"\"Check if the given request_id exists in the store\"\"\"\n        return HistoryEntry.objects.filter(request_id=request_id).exists()\n\n    @classmethod\n    def set(cls, request_id: str):\n        \"\"\"Set a request_id in the store and clean up old entries\"\"\"\n        with transaction.atomic():\n            # Create the entry if it doesn't exist (ignore otherwise)\n            _, created = HistoryEntry.objects.get_or_create(request_id=request_id)\n\n            # Only enforce cache size limit when new entries are created\n            if created:\n                cls._cleanup_old_entries()\n\n    @classmethod\n    def clear(cls):\n        \"\"\"Remove all requests from the store\"\"\"\n        HistoryEntry.objects.all().delete()\n\n    @classmethod\n    def delete(cls, request_id: str):\n        \"\"\"Delete the stored request for the given request_id\"\"\"\n        HistoryEntry.objects.filter(request_id=request_id).delete()\n\n    @classmethod\n    def save_panel(cls, request_id: str, panel_id: str, data: Any = None):\n        \"\"\"Save the panel data for the given request_id\"\"\"\n        with transaction.atomic():\n            obj, _ = HistoryEntry.objects.get_or_create(request_id=request_id)\n            store_data = obj.data\n            store_data[panel_id] = serialize(data)\n            obj.data = store_data\n            obj.save()\n\n    @classmethod\n    def panel(cls, request_id: str, panel_id: str) -> Any:\n        \"\"\"Fetch the panel data for the given request_id\"\"\"\n        try:\n            data = HistoryEntry.objects.get(request_id=request_id).data\n            panel_data = data.get(panel_id)\n            if panel_data is None:\n                return {}\n            return deserialize(panel_data)\n        except HistoryEntry.DoesNotExist:\n            return {}\n\n    @classmethod\n    def panels(cls, request_id: str) -> Any:\n        \"\"\"Fetch all panel data for the given request_id\"\"\"\n        try:\n            data = HistoryEntry.objects.get(request_id=request_id).data\n            for panel_id, panel_data in data.items():\n                yield panel_id, deserialize(panel_data)\n        except HistoryEntry.DoesNotExist:\n            return {}\n\n\ndef get_store() -> BaseStore:\n    return import_string(dt_settings.get_config()[\"TOOLBAR_STORE_CLASS\"])\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/base.html",
    "content": "{% load i18n static %}\n{% block css %}\n<link{% if toolbar.csp_nonce %} nonce=\"{{ toolbar.csp_nonce }}\"{% endif %} rel=\"stylesheet\" href=\"{% static 'debug_toolbar/css/print.css' %}\" media=\"print\">\n<link{% if toolbar.csp_nonce %} nonce=\"{{ toolbar.csp_nonce }}\"{% endif %} rel=\"stylesheet\" href=\"{% static 'debug_toolbar/css/toolbar.css' %}\">\n{% endblock css %}\n{% block js %}\n<script{% if toolbar.csp_nonce %} nonce=\"{{ toolbar.csp_nonce }}\"{% endif %} type=\"module\" src=\"{% static 'debug_toolbar/js/toolbar.js' %}\" async></script>\n{% endblock js %}\n<div id=\"djDebug\" class=\"djdt-hidden\" dir=\"ltr\"\n     {% if not toolbar.should_render_panels %}\n     data-request-id=\"{{ toolbar.request_id }}\"\n     data-render-panel-url=\"{% url 'djdt:render_panel' %}\"\n     {% endif %}\n     {% url 'djdt:history_sidebar' as history_url %}\n     {% if history_url %}\n     data-sidebar-url=\"{{ history_url }}\"\n     {% endif %}\n     data-default-show=\"{% if toolbar.config.SHOW_COLLAPSED %}false{% else %}true{% endif %}\"\n     {{ toolbar.config.ROOT_TAG_EXTRA_ATTRS|safe }}  data-update-on-fetch=\"{{ toolbar.config.UPDATE_ON_FETCH }}\">\n  <div class=\"djdt-hidden\" id=\"djDebugToolbar\">\n    <ul id=\"djDebugPanelList\">\n      <li><a id=\"djHideToolBarButton\" href=\"#\" title=\"{% translate 'Hide toolbar' %}\">{% translate \"Hide\" %} »</a></li>\n      <li>\n        <a id=\"djToggleThemeButton\" href=\"#\" title=\"{% translate 'Toggle Theme' %}\">\n          {% translate \"Toggle Theme\" %} {% include \"debug_toolbar/includes/theme_selector.html\" %}\n        </a>\n      </li>\n      {% for panel in toolbar.panels %}\n        {% include \"debug_toolbar/includes/panel_button.html\" %}\n      {% endfor %}\n    </ul>\n  </div>\n  <div class=\"djdt-hidden\" id=\"djDebugToolbarHandle\">\n    <div title=\"{% translate 'Show toolbar' %}\" id=\"djShowToolBarButton\">\n      <span id=\"djShowToolBarD\">D</span><span id=\"djShowToolBarJ\">J</span>DT\n    </div>\n  </div>\n\n  {% for panel in toolbar.panels %}\n    {% include \"debug_toolbar/includes/panel_content.html\" %}\n  {% endfor %}\n  <div id=\"djDebugWindow\" class=\"djdt-panelContent djdt-hidden\"></div>\n</div>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/includes/panel_button.html",
    "content": "{% load i18n %}\n\n<li id=\"djdt-{{ panel.panel_id }}\" class=\"djDebugPanelButton\">\n  <input type=\"checkbox\" data-cookie=\"djdt{{ panel.panel_id }}\" {% if panel.enabled %}checked title=\"{% translate \"Disable for next and successive requests\" %}\"{% else %}title=\"{% translate \"Enable for next and successive requests\" %}\"{% endif %}>\n  {% if panel.has_content and panel.enabled %}\n    <a href=\"#\" title=\"{{ panel.title }}\" class=\"{{ panel.panel_id }}\">\n  {% else %}\n    <div class=\"djdt-contentless{% if not panel.enabled %} djdt-disabled{% endif %}\">\n  {% endif %}\n  {{ panel.nav_title }}\n  {% if panel.enabled %}\n    {% with subtitle=panel.nav_subtitle %}\n      {% if subtitle %}<br><small>{{ subtitle }}</small>{% endif %}\n    {% endwith %}\n  {% endif %}\n  {% if panel.has_content and panel.enabled %}\n    </a>\n  {% else %}\n    </div>\n  {% endif %}\n</li>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/includes/panel_content.html",
    "content": "{% load static %}\n\n{% if panel.has_content and panel.enabled %}\n  <div id=\"{{ panel.panel_id }}\" class=\"djdt-panelContent djdt-hidden\">\n    <div class=\"djDebugPanelTitle\">\n      <h3>{{ panel.title }}</h3>\n      <button type=\"button\" class=\"djDebugClose\">×</button>\n    </div>\n    <div class=\"djDebugPanelContent\">\n      {% if toolbar.should_render_panels %}\n        {% for script in panel.scripts %}<script{% if toolbar.csp_nonce %} nonce=\"{{ toolbar.csp_nonce }}\"{% endif %} type=\"module\" src=\"{{ script }}\" async></script>{% endfor %}\n        <div class=\"djdt-scroll\">{{ panel.content }}</div>\n      {% else %}\n        <div class=\"djdt-loader\"></div>\n        <div class=\"djdt-scroll\"></div>\n      {% endif %}\n    </div>\n  </div>\n{% endif %}\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/includes/theme_selector.html",
    "content": "<svg\n  aria-hidden=\"true\"\n  class=\"djdt-hidden theme-auto\"\n  fill=\"currentColor\"\n  viewBox=\"0 0 32 32\"\n  version=\"1.1\"\n  xmlns=\"http://www.w3.org/2000/svg\"\n>\n  <path\n    d=\"M0 16q0 3.264 1.28 6.24t3.392 5.088 5.12 3.424 6.208 1.248q3.264 0 6.24-1.248t5.088-3.424 3.392-5.088 1.28-6.24-1.28-6.208-3.392-5.12-5.088-3.392-6.24-1.28q-3.264 0-6.208 1.28t-5.12 3.392-3.392 5.12-1.28 6.208zM4 16q0-3.264 1.6-6.016t4.384-4.352 6.016-1.632 6.016 1.632 4.384 4.352 1.6 6.016-1.6 6.048-4.384 4.352-6.016 1.6-6.016-1.6-4.384-4.352-1.6-6.048zM16 26.016q2.72 0 5.024-1.344t3.648-3.648 1.344-5.024-1.344-4.992-3.648-3.648-5.024-1.344v20z\"\n  ></path>\n</svg>\n<svg\n  aria-hidden=\"true\"\n  class=\"djdt-hidden theme-light\"\n  viewBox=\"0 0 24 24\"\n  fill=\"none\"\n  xmlns=\"http://www.w3.org/2000/svg\"\n>\n  <path\n    fill-rule=\"evenodd\"\n    clip-rule=\"evenodd\"\n    d=\"M12 1.25C12.4142 1.25 12.75 1.58579 12.75 2V4C12.75 4.41421 12.4142 4.75 12 4.75C11.5858 4.75 11.25 4.41421 11.25 4V2C11.25 1.58579 11.5858 1.25 12 1.25ZM3.66865 3.71609C3.94815 3.41039 4.42255 3.38915 4.72825 3.66865L6.95026 5.70024C7.25596 5.97974 7.2772 6.45413 6.9977 6.75983C6.7182 7.06553 6.2438 7.08677 5.9381 6.80727L3.71609 4.77569C3.41039 4.49619 3.38915 4.02179 3.66865 3.71609ZM20.3314 3.71609C20.6109 4.02179 20.5896 4.49619 20.2839 4.77569L18.0619 6.80727C17.7562 7.08677 17.2818 7.06553 17.0023 6.75983C16.7228 6.45413 16.744 5.97974 17.0497 5.70024L19.2718 3.66865C19.5775 3.38915 20.0518 3.41039 20.3314 3.71609ZM12 7.75C9.65279 7.75 7.75 9.65279 7.75 12C7.75 14.3472 9.65279 16.25 12 16.25C14.3472 16.25 16.25 14.3472 16.25 12C16.25 9.65279 14.3472 7.75 12 7.75ZM6.25 12C6.25 8.82436 8.82436 6.25 12 6.25C15.1756 6.25 17.75 8.82436 17.75 12C17.75 15.1756 15.1756 17.75 12 17.75C8.82436 17.75 6.25 15.1756 6.25 12ZM1.25 12C1.25 11.5858 1.58579 11.25 2 11.25H4C4.41421 11.25 4.75 11.5858 4.75 12C4.75 12.4142 4.41421 12.75 4 12.75H2C1.58579 12.75 1.25 12.4142 1.25 12ZM19.25 12C19.25 11.5858 19.5858 11.25 20 11.25H22C22.4142 11.25 22.75 11.5858 22.75 12C22.75 12.4142 22.4142 12.75 22 12.75H20C19.5858 12.75 19.25 12.4142 19.25 12ZM17.0255 17.0252C17.3184 16.7323 17.7933 16.7323 18.0862 17.0252L20.3082 19.2475C20.6011 19.5404 20.601 20.0153 20.3081 20.3082C20.0152 20.6011 19.5403 20.601 19.2475 20.3081L17.0255 18.0858C16.7326 17.7929 16.7326 17.3181 17.0255 17.0252ZM6.97467 17.0253C7.26756 17.3182 7.26756 17.7931 6.97467 18.086L4.75244 20.3082C4.45955 20.6011 3.98468 20.6011 3.69178 20.3082C3.39889 20.0153 3.39889 19.5404 3.69178 19.2476L5.91401 17.0253C6.2069 16.7324 6.68177 16.7324 6.97467 17.0253ZM12 19.25C12.4142 19.25 12.75 19.5858 12.75 20V22C12.75 22.4142 12.4142 22.75 12 22.75C11.5858 22.75 11.25 22.4142 11.25 22V20C11.25 19.5858 11.5858 19.25 12 19.25Z\"\n    fill=\"currentColor\"\n  />\n</svg>\n<svg\n  aria-hidden=\"true\"\n  class=\"djdt-hidden theme-dark\"\n  viewBox=\"0 0 24 24\"\n  fill=\"none\"\n  xmlns=\"http://www.w3.org/2000/svg\"\n>\n  <path\n    d=\"M3.32031 11.6835C3.32031 16.6541 7.34975 20.6835 12.3203 20.6835C16.1075 20.6835 19.3483 18.3443 20.6768 15.032C19.6402 15.4486 18.5059 15.6834 17.3203 15.6834C12.3497 15.6834 8.32031 11.654 8.32031 6.68342C8.32031 5.50338 8.55165 4.36259 8.96453 3.32996C5.65605 4.66028 3.32031 7.89912 3.32031 11.6835Z\"\n    stroke=\"currentColor\"\n    stroke-width=\"2\"\n    stroke-linecap=\"round\"\n    stroke-linejoin=\"round\"\n  />\n</svg>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/alerts.html",
    "content": "{% load i18n %}\r\n\r\n{% if alerts %}\r\n  <h4>{% translate \"Alerts found\" %}</h4>\r\n  {% for alert in alerts %}\r\n    <ul>\r\n      <li>{{ alert.alert }}</li>\r\n    </ul>\r\n  {% endfor %}\r\n{% else %}\r\n  <h4>{% translate \"No alerts found\" %}</h4>\r\n{% endif %}\r\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/cache.html",
    "content": "{% load i18n %}\n<h4>{% translate \"Summary\" %}</h4>\n<table>\n  <thead>\n    <tr>\n      <th>{% translate \"Total calls\" %}</th>\n      <th>{% translate \"Total time\" %}</th>\n      <th>{% translate \"Cache hits\" %}</th>\n      <th>{% translate \"Cache misses\" %}</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>{{ total_calls }}</td>\n      <td>{{ total_time|floatformat:\"2\" }} ms</td>\n      <td>{{ hits }}</td>\n      <td>{{ misses }}</td>\n    </tr>\n  </tbody>\n</table>\n<h4>{% translate \"Commands\" %}</h4>\n<table>\n  <thead>\n    <tr>\n      {% for name in counts.keys %}\n        <th>{{ name }}</th>\n      {% endfor %}\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      {% for value in counts.values %}\n        <td>{{ value }}</td>\n      {% endfor %}\n    </tr>\n  </tbody>\n</table>\n{% if calls %}\n  <h4>{% translate \"Calls\" %}</h4>\n  <table>\n    <thead>\n      <tr>\n        <th colspan=\"2\">{% translate \"Time\" %}</th>\n        <th>{% translate \"Type\" %}</th>\n        <th>{% translate \"Arguments\" %}</th>\n        <th>{% translate \"Keyword arguments\" %}</th>\n        <th>{% translate \"Backend\" %}</th>\n      </tr>\n    </thead>\n    <tbody>\n      {% for call in calls %}\n        <tr id=\"cacheMain_{{ forloop.counter }}\">\n          <td class=\"djdt-toggle\">\n            <button class=\"djToggleSwitch\" data-toggle-name=\"cacheMain\" data-toggle-id=\"{{ forloop.counter }}\">+</button>\n          </td>\n          <td>{{ call.time|floatformat:\"2\" }}ms</td>\n          <td>{{ call.name|escape }}</td>\n          <td>{{ call.args|escape }}</td>\n          <td>{{ call.kwargs|escape }}</td>\n          <td>{{ call.backend }}</td>\n        </tr>\n        <tr class=\"djUnselected djToggleDetails_{{ forloop.counter }}\" id=\"cacheDetails_{{ forloop.counter }}\">\n          <td colspan=\"1\"></td>\n          <td colspan=\"5\"><pre class=\"djdt-stack\">{{ call.trace|safe }}</pre></td>\n        </tr>\n      {% endfor %}\n    </tbody>\n  </table>\n{% endif %}\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/community.html",
    "content": "﻿{% load i18n %}\n\n<div class=\"djdt-community-panel\">\n    <h2>\n        {% translate \"Community & Contribution\" %}\n    </h2>\n    <p>\n        {% translate \"Want to contribute to Django Debug Toolbar? Get involved in our community!\" %}\n    </p>\n\n    <ul>\n        <li>\n            <a href=\"https://github.com/django-commons/django-debug-toolbar/discussions\" target=\"_blank\">\n                {% translate \"Join Discussions\" %}\n            </a>\n        </li>\n        <li>\n            <a href=\"https://github.com/django-commons/django-debug-toolbar/issues\" target=\"_blank\">\n                {% translate \"View Issues\" %}\n            </a>\n        </li>\n        <li>\n            <a href=\"https://django-debug-toolbar.readthedocs.io/en/latest/contributing.html\" target=\"_blank\">\n                {% translate \"Contribution Guide\" %}\n            </a>\n        </li>\n    </ul>\n    <hr>\n    <br>\n    <h2>\n        {% translate \"Django Debug Toolbar Documentation\" %}\n    </h2>\n    <p class=\"djdt-community-description\">\n        {% translate \"Explore the official documentation to learn more about Django Debug Toolbar.\" %}\n    </p>\n    <ul>\n        <li>\n            <a href=\"https://django-debug-toolbar.readthedocs.io/en/latest/\" target=\"_blank\">\n                {% translate \"Read Documentation\" %}\n            </a>\n        </li>\n        <li>\n            <a href=\"https://django-debug-toolbar.readthedocs.io/en/latest/resources.html\" target=\"_blank\">\n                {% translate \"How to Use Django Debug Toolbar\" %}\n            </a>\n        </li>\n    </ul>\n</div>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/headers.html",
    "content": "{% load i18n %}\n\n<h4>{% translate \"Request headers\" %}</h4>\n\n<table>\n  <thead>\n    <tr>\n      <th>{% translate \"Key\" %}</th>\n      <th>{% translate \"Value\" %}</th>\n    </tr>\n  </thead>\n  <tbody>\n    {% for key, value in request_headers.items %}\n      <tr>\n        <td>{{ key|escape }}</td>\n        <td>{{ value|escape }}</td>\n      </tr>\n    {% endfor %}\n  </tbody>\n</table>\n\n<h4>{% translate \"Response headers\" %}</h4>\n\n<table>\n  <thead>\n    <tr>\n      <th>{% translate \"Key\" %}</th>\n      <th>{% translate \"Value\" %}</th>\n    </tr>\n  </thead>\n  <tbody>\n    {% for key, value in response_headers.items %}\n      <tr>\n        <td>{{ key|escape }}</td>\n        <td>{{ value|escape }}</td>\n      </tr>\n    {% endfor %}\n  </tbody>\n</table>\n\n<h4>{% translate \"WSGI environ\" %}</h4>\n\n<p>{% translate \"Since the WSGI environ inherits the environment of the server, only a significant subset is shown below.\" %}</p>\n\n<table>\n  <thead>\n    <tr>\n      <th>{% translate \"Key\" %}</th>\n      <th>{% translate \"Value\" %}</th>\n    </tr>\n  </thead>\n  <tbody>\n    {% for key, value in environ.items %}\n      <tr>\n        <td>{{ key|escape }}</td>\n        <td>{{ value|escape }}</td>\n      </tr>\n    {% endfor %}\n  </tbody>\n</table>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/history.html",
    "content": "{% load i18n static %}\n<form method=\"get\" action=\"{% url 'djdt:history_refresh' %}\">\n    {{ refresh_form.as_div }}\n    <button class=\"refreshHistory\">Refresh</button>\n</form>\n<table class=\"djdt-max-height-100\">\n    <thead>\n        <tr>\n            <th>{% translate \"Time\" %}</th>\n            <th>{% translate \"Method\" %}</th>\n            <th>{% translate \"Path\" %}</th>\n            <th>{% translate \"Request Variables\" %}</th>\n            <th>{% translate \"Status\" %}</th>\n            <th>{% translate \"Action\" %}</th>\n        </tr>\n    </thead>\n    <tbody id=\"djdtHistoryRequests\">\n        {% for request_id, history_context in toolbar_history.items %}\n            {% include \"debug_toolbar/panels/history_tr.html\" %}\n        {% endfor %}\n    </tbody>\n</table>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/history_tr.html",
    "content": "{% load i18n %}\n<tr class=\"{% if request_id == current_request_id %}djdt-highlighted{% endif %}\" id=\"historyMain_{{ request_id }}\" data-request-id=\"{{ request_id }}\">\n    <td>\n        {{ history_context.history_stats.time|escape }}\n    </td>\n    <td>\n        <p>{{ history_context.history_stats.request_method|escape }}</p>\n    </td>\n    <td>\n        <p>{{ history_context.history_stats.request_url|truncatechars:100|escape }}</p>\n    </td>\n    <td>\n        <button type=\"button\" class=\"djToggleSwitch\" data-toggle-name=\"historyMain\" data-toggle-id=\"{{ request_id }}\">+</button>\n        <div class=\"djUnselected djToggleDetails_{{ request_id }}\">\n          <table>\n            <colgroup>\n              <col class=\"djdt-width-20\">\n              <col>\n            </colgroup>\n            <thead>\n              <tr>\n                <th>{% translate \"Variable\" %}</th>\n                <th>{% translate \"Value\" %}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {% for key, value in history_context.history_stats.data.items %}\n                <tr>\n                  <td><code>{{ key|pprint }}</code></td>\n                  <td><code>{{ value|pprint }}</code></td>\n                </tr>\n              {% empty %}\n                <tr>\n                  <td colspan=\"2\">No data</td>\n                </tr>\n              {% endfor %}\n            </tbody>\n          </table>\n        </div>\n    </td>\n    <td>\n        <p>{{ history_context.history_stats.status_code|escape }}</p>\n    </td>\n    <td class=\"djdt-actions\">\n        <form method=\"get\" action=\"{% url 'djdt:history_sidebar' %}\">\n            {{ history_context.form.as_div }}\n            <button data-request-id=\"{{ request_id }}\" class=\"switchHistory\">Switch</button>\n        </form>\n    </td>\n</tr>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/profiling.html",
    "content": "{% load i18n %}\n<table>\n  <thead>\n    <tr>\n      <th>{% translate \"Call\" %}</th>\n      <th>{% translate \"CumTime\" %}</th>\n      <th>{% translate \"Per\" %}</th>\n      <th>{% translate \"TotTime\" %}</th>\n      <th>{% translate \"Per\" %}</th>\n      <th>{% translate \"Count\" %}</th>\n    </tr>\n  </thead>\n  <tbody>\n    {% for call in func_list %}\n      <tr class=\"djdt-profile-row {% if call.is_project_func %}djdt-highlighted {% endif %} {% for parent_id in call.parent_ids %} djToggleDetails_{{ parent_id }}{% endfor %}\" id=\"profilingMain_{{ call.id }}\">\n        <td>\n          <div data-djdt-styles=\"paddingLeft:{{ call.indent }}px\">\n            {% if call.has_subfuncs %}\n              <button type=\"button\" class=\"djProfileToggleDetails djToggleSwitch\" data-toggle-name=\"profilingMain\" data-toggle-id=\"{{ call.id }}\">-</button>\n            {% else %}\n              <span class=\"djNoToggleSwitch\"></span>\n            {% endif %}\n            <span class=\"djdt-stack\">{{ call.func_std_string|safe }}</span>\n          </div>\n        </td>\n        <td>{{ call.cumtime|floatformat:3 }}</td>\n        <td>{{ call.cumtime_per_call|floatformat:3 }}</td>\n        <td>{{ call.tottime|floatformat:3 }}</td>\n        <td>{{ call.tottime_per_call|floatformat:3 }}</td>\n        <td>{{ call.count }}</td>\n      </tr>\n    {% endfor %}\n  </tbody>\n</table>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/request.html",
    "content": "{% load i18n %}\n\n<h4>{% translate \"View information\" %}</h4>\n<table>\n  <thead>\n    <tr>\n      <th>{% translate \"View function\" %}</th>\n      <th>{% translate \"Arguments\" %}</th>\n      <th>{% translate \"Keyword arguments\" %}</th>\n      <th>{% translate \"URL name\" %}</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td><code>{{ view_func }}</code></td>\n      <td><code>{{ view_args|pprint }}</code></td>\n      <td><code>{{ view_kwargs|pprint }}</code></td>\n      <td><code>{{ view_urlname }}</code></td>\n    </tr>\n  </tbody>\n</table>\n\n{% if cookies.list or cookies.raw %}\n  <h4>{% translate \"Cookies\" %}</h4>\n  {% include 'debug_toolbar/panels/request_variables.html' with variables=cookies %}\n{% else %}\n  <h4>{% translate \"No cookies\" %}</h4>\n{% endif %}\n\n{% if session.list or session.raw %}\n  <h4>{% translate \"Session data\" %}</h4>\n  {% include 'debug_toolbar/panels/request_variables.html' with variables=session %}\n{% else %}\n  <h4>{% translate \"No session data\" %}</h4>\n{% endif %}\n\n{% if get.list or get.raw %}\n  <h4>{% translate \"GET data\" %}</h4>\n  {% include 'debug_toolbar/panels/request_variables.html' with variables=get %}\n{% else %}\n  <h4>{% translate \"No GET data\" %}</h4>\n{% endif %}\n\n{% if post.list or post.raw %}\n  <h4>{% translate \"POST data\" %}</h4>\n  {% include 'debug_toolbar/panels/request_variables.html' with variables=post %}\n{% else %}\n  <h4>{% translate \"No POST data\" %}</h4>\n{% endif %}\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/request_variables.html",
    "content": "{% load i18n %}\n\n{% if variables.list %}\n<table>\n  <colgroup>\n    <col class=\"djdt-width-20\">\n    <col>\n  </colgroup>\n  <thead>\n    <tr>\n      <th>{% translate \"Variable\" %}</th>\n      <th>{% translate \"Value\" %}</th>\n    </tr>\n  </thead>\n  <tbody>\n    {% for key, value in variables.list %}\n      <tr>\n        <td><code>{{ key|pprint }}</code></td>\n        <td><code>{{ value|pprint }}</code></td>\n      </tr>\n    {% endfor %}\n  </tbody>\n</table>\n{% elif variables.raw %}\n<code class=\"djdt-raw\">{{ variables.raw|pprint }}</code>\n{% endif %}\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/settings.html",
    "content": "{% load i18n %}\n<table>\n  <thead>\n    <tr>\n      <th>{% translate \"Setting\" %}</th>\n      <th>{% translate \"Value\" %}</th>\n    </tr>\n  </thead>\n  <tbody>\n    {% for name, value in settings.items %}\n      <tr>\n        <td>{{ name }}</td>\n        <td><code>{{ value }}</code></td>\n      </tr>\n    {% endfor %}\n  </tbody>\n</table>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/signals.html",
    "content": "{% load i18n %}\n<table>\n  <thead>\n    <tr>\n      <th>{% translate \"Signal\" %}</th>\n      <th>{% translate \"Receivers\" %}</th>\n    </tr>\n  </thead>\n  <tbody>\n    {% for name, receivers in signals %}\n      <tr>\n        <td>{{ name|escape }}</td>\n        <td>{{ receivers|join:\", \" }}</td>\n      </tr>\n    {% endfor %}\n  </tbody>\n</table>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/sql.html",
    "content": "{% load i18n l10n %}\n<ul class=\"djdt-databaseLegend\">\n  {% for alias, info in databases %}\n    <li>\n      <strong><span class=\"djdt-color\" data-djdt-styles=\"backgroundColor:rgb({{ info.rgb_color|join:', ' }})\"></span> {{ alias }}</strong>\n      {{ info.time_spent|floatformat:\"2\" }} ms ({% blocktranslate count num=info.num_queries %}{{ num }} query{% plural %}{{ num }} queries{% endblocktranslate %}\n      {% if info.similar_count %}\n        {% blocktranslate with count=info.similar_count trimmed %}\n          including <abbr title=\"Similar queries are queries with the same SQL, but potentially different parameters.\">{{ count }} similar</abbr>\n        {% endblocktranslate %}\n        {% if info.duplicate_count %}\n          {% blocktranslate with dupes=info.duplicate_count trimmed %}\n            and <abbr title=\"Duplicate queries are identical to each other: they execute exactly the same SQL and parameters.\">{{ dupes }} duplicates</abbr>\n          {% endblocktranslate %}\n        {% endif %}\n      {% endif %})\n    </li>\n  {% endfor %}\n</ul>\n\n{% if queries %}\n  <table>\n    <colgroup>\n      <col>\n      <col>\n      <col>\n      <col class=\"djdt-width-30\">\n      <col>\n      <col>\n    </colgroup>\n    <thead>\n      <tr>\n        <th></th>\n        <th colspan=\"2\">{% translate \"Query\" %}</th>\n        <th>{% translate \"Timeline\" %}</th>\n        <th>{% translate \"Time\" %}</th>\n        <th>{% translate \"Action\" %}</th>\n      </tr>\n    </thead>\n    <tbody>\n      {% for query in queries %}\n        <tr class=\"{% if query.is_slow %} djDebugRowWarning{% endif %}\" id=\"sqlMain_{{ forloop.counter }}\">\n          <td><span class=\"djdt-color\" data-djdt-styles=\"backgroundColor:rgb({{ query.rgb_color|join:', ' }})\"></span></td>\n          <td class=\"djdt-toggle\">\n            <button type=\"button\" class=\"djToggleSwitch\" data-toggle-name=\"sqlMain\" data-toggle-id=\"{{ forloop.counter }}\">+</button>\n          </td>\n          <td>\n            <div class=\"djDebugSql\">{{ query.sql|safe }}</div>\n            {% if query.similar_count %}\n              <strong>\n                <span class=\"djdt-color\" data-djdt-styles=\"backgroundColor:{{ query.similar_color }}\"></span>\n                {% blocktranslate with count=query.similar_count %}{{ count }} similar queries.{% endblocktranslate %}\n              </strong>\n            {% endif %}\n            {% if query.duplicate_count %}\n              <strong>\n                <span class=\"djdt-color\" data-djdt-styles=\"backgroundColor:{{ query.duplicate_color }}\"></span>\n                {% blocktranslate with dupes=query.duplicate_count %}Duplicated {{ dupes }} times.{% endblocktranslate %}\n              </strong>\n            {% endif %}\n          </td>\n          <td>\n            <svg class=\"djDebugLineChart{% if query.is_slow %} djDebugLineChartWarning{% endif %}{% if query.in_trans %} djDebugLineChartInTransaction{% endif %}\" xmlns=\"http://www.w3.org/2000/svg\" viewbox=\"0 0 100 5\" preserveAspectRatio=\"none\" aria-label=\"{{ query.width_ratio }}%\">\n              <rect x=\"{{ query.start_offset|unlocalize }}\" y=\"0\" height=\"5\" width=\"{{ query.width_ratio|unlocalize }}\" fill=\"{{ query.trace_color }}\" />\n              {% if query.starts_trans %}\n                <line x1=\"{{ query.start_offset|unlocalize }}\" y1=\"0\" x2=\"{{ query.start_offset|unlocalize }}\" y2=\"5\" />\n              {% endif %}\n              {% if query.ends_trans %}\n                <line x1=\"{{ query.end_offset|unlocalize }}\" y1=\"0\" x2=\"{{ query.end_offset|unlocalize }}\" y2=\"5\" />\n              {% endif %}\n            </svg>\n          </td>\n          <td class=\"djdt-time\">\n            {{ query.duration|floatformat:\"2\" }}ms\n          </td>\n          <td class=\"djdt-actions\">\n            {% if query.params %}\n              {% if query.is_select %}\n                <form method=\"post\">\n                  {{ query.form.as_div }}\n                  <button formaction=\"{% url 'djdt:sql_select' %}\" class=\"remoteCall\">Sel</button>\n                  <button formaction=\"{% url 'djdt:sql_explain' %}\" class=\"remoteCall\">Expl</button>\n                  {% if query.vendor == 'mysql' %}\n                    <button formaction=\"{% url 'djdt:sql_profile' %}\" class=\"remoteCall\">Prof</button>\n                  {% endif %}\n                </form>\n              {% endif %}\n            {% endif %}\n          </td>\n        </tr>\n        <tr class=\"djUnselected {% if query.is_slow %} djDebugRowWarning{% endif %} djToggleDetails_{{ forloop.counter }}\" id=\"sqlDetails_{{ forloop.counter }}\">\n          <td colspan=\"2\"></td>\n          <td colspan=\"4\">\n            <div class=\"djSQLDetailsDiv\">\n              <p><strong>{% translate \"Connection:\" %}</strong> {{ query.alias }}</p>\n              {% if query.iso_level %}\n                <p><strong>{% translate \"Isolation level:\" %}</strong> {{ query.iso_level }}</p>\n              {% endif %}\n              {% if query.trans_status %}\n                <p><strong>{% translate \"Transaction status:\" %}</strong> {{ query.trans_status }}</p>\n              {% endif %}\n              {% if query.stacktrace %}\n                <pre class=\"djdt-stack\">{{ query.stacktrace }}</pre>\n              {% endif %}\n              {% if query.template_info %}\n                <table class=\"djdt-codeContext\">\n                  {% for line in query.template_info.context %}\n                    <tr>\n                      <td>{{ line.num }}</td>\n                      <td><code {% if line.highlight %}class=\"djdt-highlighted\"{% endif %}>{{ line.content }}</code></td>\n                    </tr>\n                  {% endfor %}\n                </table>\n                <p><strong>{{ query.template_info.name|default:_(\"(unknown)\") }}</strong></p>\n              {% endif %}\n            </div>\n          </td>\n        </tr>\n      {% endfor %}\n    </tbody>\n  </table>\n{% else %}\n  <p>{% translate \"No SQL queries were recorded during this request.\" %}</p>\n{% endif %}\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/sql_explain.html",
    "content": "{% load i18n %}\n<div class=\"djDebugPanelTitle\">\n  <h3>{% translate \"SQL explained\" %}</h3>\n  <button type=\"button\" class=\"djDebugClose\">»</button>\n</div>\n<div class=\"djDebugPanelContent\">\n  <div class=\"djdt-scroll\">\n    <dl>\n      <dt>{% translate \"Executed SQL\" %}</dt>\n      <dd>{{ sql|safe }}</dd>\n      <dt>{% translate \"Time\" %}</dt>\n      <dd>{{ duration }} ms</dd>\n      <dt>{% translate \"Database\" %}</dt>\n      <dd>{{ alias }}</dd>\n    </dl>\n    <table>\n      <thead>\n        <tr>\n          {% for h in headers %}\n            <th>{{ h|upper }}</th>\n          {% endfor %}\n        </tr>\n      </thead>\n      <tbody>\n        {% for row in result %}\n          <tr>\n            {% for column in row %}\n              <td>{% if forloop.last %}<code>{% endif %}{{ column|escape }}{% if forloop.last %}</code>{% endif %}</td>\n            {% endfor %}\n          </tr>\n        {% endfor %}\n      </tbody>\n    </table>\n  </div>\n</div>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/sql_profile.html",
    "content": "{% load i18n %}\n<div class=\"djDebugPanelTitle\">\n  <h3>{% translate \"SQL profiled\" %}</h3>\n  <button type=\"button\" class=\"djDebugClose\">»</button>\n</div>\n<div class=\"djDebugPanelContent\">\n  <div class=\"djdt-scroll\">\n    {% if result %}\n      <dl>\n        <dt>{% translate \"Executed SQL\" %}</dt>\n        <dd>{{ sql|safe }}</dd>\n        <dt>{% translate \"Time\" %}</dt>\n        <dd>{{ duration }} ms</dd>\n        <dt>{% translate \"Database\" %}</dt>\n        <dd>{{ alias }}</dd>\n      </dl>\n      <table>\n        <thead>\n          <tr>\n            {% for h in headers %}\n              <th>{{ h|upper }}</th>\n            {% endfor %}\n          </tr>\n        </thead>\n        <tbody>\n          {% for row in result %}\n            <tr>\n              {% for column in row %}\n                <td>{{ column|escape }}</td>\n              {% endfor %}\n            </tr>\n          {% endfor %}\n        </tbody>\n      </table>\n    {% else %}\n      <dl>\n        <dt>{% translate \"Error\" %}</dt>\n        <dd>{{ result_error }}</dd>\n      </dl>\n    {% endif %}\n  </div>\n</div>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/sql_select.html",
    "content": "{% load i18n %}\n<div class=\"djDebugPanelTitle\">\n  <h3>{% translate \"SQL selected\" %}</h3>\n  <button type=\"button\" class=\"djDebugClose\">»</button>\n</div>\n<div class=\"djDebugPanelContent\">\n  <div class=\"djdt-scroll\">\n    <dl>\n      <dt>{% translate \"Executed SQL\" %}</dt>\n      <dd>{{ sql|safe }}</dd>\n      <dt>{% translate \"Time\" %}</dt>\n      <dd>{{ duration }} ms</dd>\n      <dt>{% translate \"Database\" %}</dt>\n      <dd>{{ alias }}</dd>\n    </dl>\n    {% if result %}\n      <table>\n        <thead>\n          <tr>\n            {% for h in headers %}\n              <th>{{ h|upper }}</th>\n            {% endfor %}\n          </tr>\n        </thead>\n        <tbody>\n          {% for row in result %}\n            <tr>\n              {% for column in row %}\n                <td>{{ column|escape }}</td>\n              {% endfor %}\n            </tr>\n          {% endfor %}\n        </tbody>\n      </table>\n    {% else %}\n      <p>{% translate \"Empty set\" %}</p>\n    {% endif %}\n  </div>\n</div>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/staticfiles.html",
    "content": "{% load i18n %}\n\n<h4>{% blocktranslate count dirs_count=staticfiles_dirs|length %}Static file path{% plural %}Static file paths{% endblocktranslate %}</h4>\n{% if staticfiles_dirs %}\n  <ol>\n    {% for prefix, staticfiles_dir in staticfiles_dirs %}\n      <li>{{ staticfiles_dir }}{% if prefix %} {% blocktranslate %}(prefix {{ prefix }}){% endblocktranslate %}{% endif %}</li>\n    {% endfor %}\n  </ol>\n{% else %}\n  <p>{% translate \"None\" %}</p>\n{% endif %}\n\n<h4>{% blocktranslate count apps_count=staticfiles_apps|length %}Static file app{% plural %}Static file apps{% endblocktranslate %}</h4>\n{% if staticfiles_apps %}\n  <ol>\n    {% for static_app in staticfiles_apps %}\n      <li>{{ static_app }}</li>\n    {% endfor %}\n  </ol>\n{% else %}\n  <p>{% translate \"None\" %}</p>\n{% endif %}\n\n<h4>{% blocktranslate count staticfiles_count=staticfiles|length %}Static file{% plural %}Static files{% endblocktranslate %}</h4>\n{% if staticfiles %}\n  <dl>\n    {% for path, url, real_path in staticfiles %}\n      <dt><strong><a class=\"toggleTemplate\" href=\"{{ url }}\" target=\"_blank\" rel=\"noopener\">{{ path }}</a></strong></dt>\n      <dd><samp>{{ real_path }}</samp></dd>\n    {% endfor %}\n  </dl>\n{% else %}\n  <p>{% translate \"None\" %}</p>\n{% endif %}\n\n\n{% for finder, payload in staticfiles_finders.items %}\n  <h4>{{ finder }} ({% blocktranslate count payload_count=payload|length %}{{ payload_count }} file{% plural %}{{ payload_count }} files{% endblocktranslate %})</h4>\n  <table>\n    <thead>\n      <tr>\n        <th>{% translate 'Path' %}</th>\n        <th>{% translate 'Location' %}</th>\n      </tr>\n    </thead>\n    <tbody>\n      {% for path, real_path in payload %}\n        <tr>\n          <td>{{ path }}</td>\n          <td>{{ real_path }}</td>\n        </tr>\n      {% endfor %}\n    </tbody>\n  </table>\n{% endfor %}\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/template_source.html",
    "content": "{% load i18n %}\n<div class=\"djDebugPanelTitle\">\n  <h3>{% translate \"Template source:\" %} <code>{{ template_name }}</code></h3>\n  <button type=\"button\" class=\"djDebugClose\">»</button>\n</div>\n<div class=\"djDebugPanelContent\">\n  <div class=\"djdt-scroll\">\n    {{ source }}\n  </div>\n</div>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/templates.html",
    "content": "{% load i18n %}\n<h4>{% blocktranslate count template_count=template_dirs|length %}Template path{% plural %}Template paths{% endblocktranslate %}</h4>\n{% if template_dirs %}\n  <ol>\n    {% for template in template_dirs %}\n      <li>{{ template }}</li>\n    {% endfor %}\n  </ol>\n{% else %}\n  <p>{% translate \"None\" %}</p>\n{% endif %}\n\n<h4>{% blocktranslate count template_count=templates|length %}Template{% plural %}Templates{% endblocktranslate %}</h4>\n{% if templates %}\n  <dl>\n    {% for template in templates %}\n      <dt><strong><a class=\"remoteCall toggleTemplate\" href=\"{% url 'djdt:template_source' %}?template={{ template.template.name }}&amp;template_origin={{ template.template.origin_hash }}\">{{ template.template.name|addslashes }}</a></strong></dt>\n      <dd><samp>{{ template.template.origin_name|addslashes }}</samp></dd>\n      {% if template.context %}\n        <dd>\n          <details>\n            <summary>{% translate \"Toggle context\" %}</summary>\n            <code class=\"djTemplateContext\">{{ template.context }}</code>\n          </details>\n        </dd>\n      {% endif %}\n    {% endfor %}\n  </dl>\n{% else %}\n  <p>{% translate \"None\" %}</p>\n{% endif %}\n\n<h4>{% blocktranslate count context_processors_count=context_processors|length %}Context processor{% plural %}Context processors{% endblocktranslate %}</h4>\n{% if context_processors %}\n  <dl>\n    {% for key, value in context_processors.items %}\n      <dt><strong>{{ key|escape }}</strong></dt>\n      <dd>\n        <details>\n          <summary>{% translate \"Toggle context\" %}</summary>\n          <code class=\"djTemplateContext\">{{ value|escape }}</code>\n        </details>\n      </dd>\n    {% endfor %}\n  </dl>\n{% else %}\n  <p>{% translate \"None\" %}</p>\n{% endif %}\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/timer.html",
    "content": "{% load i18n %}\n<h4>{% translate \"Resource usage\" %}</h4>\n<table>\n  <colgroup>\n    <col class=\"djdt-width-20\">\n    <col>\n  </colgroup>\n  <thead>\n    <tr>\n      <th>{% translate \"Resource\" %}</th>\n      <th>{% translate \"Value\" %}</th>\n    </tr>\n  </thead>\n  <tbody>\n    {% for key, value in rows %}\n      <tr>\n        <td>{{ key|escape }}</td>\n        <td>{{ value|escape }}</td>\n      </tr>\n    {% endfor %}\n  </tbody>\n</table>\n\n<!-- This hidden div is populated and displayed by code in toolbar.timer.js -->\n<div id=\"djDebugBrowserTiming\" class=\"djdt-hidden\">\n  <h4>{% translate \"Browser timing\" %}</h4>\n  <table>\n    <colgroup>\n      <col class=\"djdt-width-20\">\n      <col class=\"djdt-width-60\">\n      <col class=\"djdt-width-20\">\n    </colgroup>\n    <thead>\n      <tr>\n        <th>{% translate \"Timing attribute\" %}</th>\n        <th>{% translate \"Timeline\" %}</th>\n        <th>{% translate \"Time since navigation start (+duration)\" %}</th>\n      </tr>\n    </thead>\n    <tbody id=\"djDebugBrowserTimingTableBody\">\n    </tbody>\n  </table>\n</div>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/panels/versions.html",
    "content": "{% load i18n %}\n<table>\n  <colgroup>\n    <col class=\"djdt-width-20\">\n    <col class=\"djdt-width-20\">\n    <col>\n  </colgroup>\n  <thead>\n    <tr>\n      <th>{% translate \"Package\" %}</th>\n      <th>{% translate \"Name\" %}</th>\n      <th>{% translate \"Version\" %}</th>\n    </tr>\n  </thead>\n  <tbody>\n    {% for package, name, version in versions %}\n      <tr>\n        <td>{{ package }}</td>\n        <td>{{ name }}</td>\n        <td>{{ version }}</td>\n      </tr>\n    {% endfor %}\n  </tbody>\n</table>\n"
  },
  {
    "path": "debug_toolbar/templates/debug_toolbar/redirect.html",
    "content": "{% load i18n static %}\n<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Django Debug Toolbar Redirects Panel: {{ status_line }}</title>\n    <script{% if toolbar.csp_nonce %} nonce=\"{{ toolbar.csp_nonce }}\"{% endif %} type=\"module\" src=\"{% static 'debug_toolbar/js/redirect.js' %}\" async></script>\n    <style>\n      .djdt-deprecation-warning {\n        --djdt-warning-bg: #fff3cd;\n        --djdt-warning-text: #856404;\n        --djdt-warning-accent: #f1c40f;\n        --djdt-warning-link: #0056b3;\n        --djdt-warning-link-hover: #003d7a;\n        --djdt-warning-strong: #000;\n        --djdt-warning-shadow: rgba(0, 0, 0, 0.1);\n\n        position: relative;\n        background-color: var(--djdt-warning-bg);\n        color: var(--djdt-warning-text);\n        border-left: 0.25em solid var(--djdt-warning-accent);\n        padding: 1em;\n        margin: 1.5em 0;\n        border-radius: 0.25em;\n        box-shadow:\n          0 0.0625em 0.1875em var(--djdt-warning-shadow),\n          0 0.0625em 0.125em var(--djdt-warning-shadow);\n        font-family: var(--djdt-font-family-primary);\n        font-size: 0.875em;\n        line-height: 1.5;\n      }\n\n      .djdt-deprecation-warning::before {\n        content: \"⚠️\";\n        font-size: 1.125em;\n        margin-right: 0.75em;\n        vertical-align: middle;\n      }\n\n      .djdt-deprecation-warning a {\n        color: var(--djdt-warning-link);\n        text-decoration: none;\n        font-weight: 500;\n        border-bottom: 0.0625em solid currentColor;\n        padding-bottom: 0.0625em;\n        transition: all 0.2s ease;\n      }\n\n      .djdt-deprecation-warning a:hover {\n        color: var(--djdt-warning-link-hover);\n        border-bottom-width: 0.125em;\n      }\n\n      .djdt-deprecation-warning strong {\n        color: var(--djdt-warning-strong);\n        font-weight: 600;\n      }\n    </style>\n  </head>\n  <body>\n    <div class=\"djdt-deprecation-warning\">\n      <strong>{% translate \"WARNING:\" %}</strong>\n      {% blocktranslate with issue_url=\"https://github.com/django-commons/django-debug-toolbar/issues/2216\" %}\n      The RedirectsPanel is deprecated and will be removed in a future version. The HistoryPanel\n      now provides the ability to view toolbar data for redirected requests. If you still have a\n      use case for this panel, please comment on this <a target=\"_blank\" rel=\"noopener noreferrer\"\n      href=\"{{ issue_url }}\">issue</a>.\n      {% endblocktranslate %}\n    </div>\n    <h1>{{ status_line }}</h1>\n    <h2>{% translate \"Location:\" %} <a id=\"redirect_to\" href=\"{{ redirect_to }}\">{{ redirect_to }}</a></h2>\n    <p class=\"notice\">\n      {% translate \"The Django Debug Toolbar has intercepted a redirect to the above URL for debug viewing purposes. You can click the above link to continue with the redirect as normal.\" %}\n    </p>\n  </body>\n</html>\n"
  },
  {
    "path": "debug_toolbar/templatetags/__init__.py",
    "content": ""
  },
  {
    "path": "debug_toolbar/toolbar.py",
    "content": "\"\"\"\nThe main DebugToolbar class that loads and renders the Toolbar.\n\"\"\"\n\nfrom __future__ import annotations\n\nimport logging\nimport re\nimport uuid\nfrom collections.abc import Callable\nfrom functools import cache\n\nfrom django.apps import apps\nfrom django.conf import settings\nfrom django.core.exceptions import ImproperlyConfigured\nfrom django.dispatch import Signal\nfrom django.http import HttpRequest\nfrom django.template import TemplateSyntaxError\nfrom django.template.loader import render_to_string\nfrom django.urls import URLPattern, URLResolver, include, path, re_path, resolve\nfrom django.urls.exceptions import Resolver404\nfrom django.utils.module_loading import import_string\nfrom django.utils.translation import get_language, override as lang_override\n\nfrom debug_toolbar import APP_NAME, settings as dt_settings\nfrom debug_toolbar._stubs import GetResponse\nfrom debug_toolbar.store import BaseStore, get_store\n\nfrom .panels import Panel\nfrom .utils import get_csp_nonce\n\nlogger = logging.getLogger(__name__)\n\n\nclass DebugToolbar:\n    # for internal testing use only\n    _created = Signal()\n    store: BaseStore = None\n\n    def __init__(\n        self,\n        request: HttpRequest,\n        get_response: GetResponse,\n        request_id: str | None = None,\n    ):\n        self.request = request\n        self.config = dt_settings.get_config().copy()\n        panels = []\n        for panel_class in reversed(self.get_panel_classes()):\n            panel = panel_class(self, get_response)\n            panels.append(panel)\n            if panel.enabled:\n                get_response = panel.process_request\n        self.process_request = get_response\n        self._panels = {panel.panel_id: panel for panel in reversed(panels)}\n        self.stats = {}\n        self.server_timing_stats = {}\n        self.request_id = request_id\n        self.init_store()\n        self._created.send(request, toolbar=self)\n\n    # Manage panels\n\n    @property\n    def panels(self) -> list[Panel]:\n        \"\"\"\n        Get a list of all available panels.\n        \"\"\"\n        return list(self._panels.values())\n\n    @property\n    def enabled_panels(self) -> list[Panel]:\n        \"\"\"\n        Get a list of panels enabled for the current request.\n        \"\"\"\n        return [panel for panel in self._panels.values() if panel.enabled]\n\n    @property\n    def csp_nonce(self) -> str | None:\n        \"\"\"\n        Look up the Content Security Policy nonce if there is one.\n        \"\"\"\n        return get_csp_nonce(self.request)\n\n    def get_panel_by_id(self, panel_id: str) -> Panel:\n        \"\"\"\n        Get the panel with the given id, which is the class name by default.\n        \"\"\"\n        return self._panels[panel_id]\n\n    # Handle rendering the toolbar in HTML\n\n    def render_toolbar(self) -> str:\n        \"\"\"\n        Renders the overall Toolbar with panels inside.\n        \"\"\"\n        if not self.should_render_panels():\n            self.init_store()\n        try:\n            context = {\"toolbar\": self}\n            lang = self.config[\"TOOLBAR_LANGUAGE\"] or get_language()\n            with lang_override(lang):\n                return render_to_string(\"debug_toolbar/base.html\", context)\n        except TemplateSyntaxError:\n            if not apps.is_installed(\"django.contrib.staticfiles\"):\n                raise ImproperlyConfigured(\n                    \"The debug toolbar requires the staticfiles contrib app. \"\n                    \"Add 'django.contrib.staticfiles' to INSTALLED_APPS and \"\n                    \"define STATIC_URL in your settings.\"\n                ) from None\n            else:\n                raise\n\n    def should_render_panels(self) -> bool:\n        \"\"\"Determine whether the panels should be rendered during the request\n\n        If False, the panels will be loaded via Ajax.\n        \"\"\"\n        return self.config[\"RENDER_PANELS\"] or False\n\n    # Handle storing toolbars in memory and fetching them later on\n\n    def init_store(self):\n        # Store already initialized.\n        if self.store is None:\n            self.store = get_store()\n\n        if self.request_id:\n            return\n        self.request_id = uuid.uuid4().hex\n        self.store.set(self.request_id)\n\n    @classmethod\n    def fetch(\n        cls, request_id: str, panel_id: str | None = None\n    ) -> StoredDebugToolbar | None:\n        if get_store().exists(request_id):\n            return StoredDebugToolbar.from_store(request_id, panel_id=panel_id)\n\n    # Manually implement class-level caching of panel classes and url patterns\n    # because it's more obvious than going through an abstraction.\n\n    _panel_classes: list[Panel] | None = None\n\n    @classmethod\n    def get_panel_classes(cls) -> list[type[Panel]] | None:\n        if cls._panel_classes is None:\n            # Load panels in a temporary variable for thread safety.\n            panel_classes = [\n                import_string(panel_path) for panel_path in dt_settings.get_panels()\n            ]\n            cls._panel_classes = panel_classes\n        return cls._panel_classes\n\n    _urlpatterns: list[URLPattern | URLResolver] | None = None\n\n    @classmethod\n    def get_urls(cls) -> list[URLPattern | URLResolver]:\n        if cls._urlpatterns is None:\n            from . import views\n\n            # Load URLs in a temporary variable for thread safety.\n            # Global URLs\n            urlpatterns = [\n                path(\"render_panel/\", views.render_panel, name=\"render_panel\"),\n            ]\n            # Per-panel URLs\n            for panel_class in cls.get_panel_classes():\n                urlpatterns += panel_class.get_urls()\n            cls._urlpatterns = urlpatterns\n        return cls._urlpatterns\n\n    @classmethod\n    def is_toolbar_request(cls, request: HttpRequest) -> bool:\n        \"\"\"\n        Determine if the request is for a DebugToolbar view.\n        \"\"\"\n        # The primary caller of this function is in the middleware which may\n        # not have resolver_match set.\n        try:\n            resolver_match = request.resolver_match or resolve(\n                request.path_info, getattr(request, \"urlconf\", None)\n            )\n        except Resolver404:\n            return False\n        return (\n            bool(resolver_match.namespaces)\n            and resolver_match.namespaces[-1] == APP_NAME\n        )\n\n    @staticmethod\n    @cache\n    def get_observe_request() -> Callable:\n        # If OBSERVE_REQUEST_CALLBACK is a string, which is the recommended\n        # setup, resolve it to the corresponding callable.\n        func_or_path = dt_settings.get_config()[\"OBSERVE_REQUEST_CALLBACK\"]\n        if isinstance(func_or_path, str):\n            return import_string(func_or_path)\n        else:\n            return func_or_path\n\n\ndef observe_request(request: HttpRequest) -> bool:\n    \"\"\"\n    Determine whether to update the toolbar from a client side request.\n    \"\"\"\n    return True\n\n\ndef from_store_get_response(request: HttpRequest | None) -> None:\n    logger.warning(\n        \"get_response was called for debug toolbar after being loaded from the store. No request exists in this scenario as the request is not stored, only the panel's data.\"\n    )\n    return None\n\n\nclass StoredDebugToolbar(DebugToolbar):\n    def __init__(\n        self,\n        request: HttpRequest | None,\n        get_response: GetResponse,\n        request_id: str | None = None,\n    ):\n        self.request = None\n        self.config = dt_settings.get_config().copy()\n        self.process_request = get_response\n        self.stats = {}\n        self.server_timing_stats = {}\n        self.request_id = request_id\n        self.init_store()\n\n    @classmethod\n    def from_store(\n        cls, request_id: str, panel_id: str | None = None\n    ) -> StoredDebugToolbar:\n        toolbar = StoredDebugToolbar(\n            None, from_store_get_response, request_id=request_id\n        )\n        toolbar._panels = {}\n\n        for panel_class in reversed(cls.get_panel_classes()):\n            panel = panel_class(toolbar, from_store_get_response)\n            if panel_id and panel.panel_id != panel_id:\n                continue\n            data = toolbar.store.panel(toolbar.request_id, panel.panel_id)\n            panel.load_stats_from_store(data)\n            toolbar._panels[panel.panel_id] = panel\n        return toolbar\n\n\ndef debug_toolbar_urls(prefix: str = \"__debug__\") -> list[URLPattern | URLResolver]:\n    \"\"\"\n    Return a URL pattern for serving toolbar in debug mode.\n\n    from django.conf import settings\n    from debug_toolbar.toolbar import debug_toolbar_urls\n\n    urlpatterns = [\n        # ... the rest of your URLconf goes here ...\n    ] + debug_toolbar_urls()\n    \"\"\"\n    if not prefix:\n        raise ImproperlyConfigured(\"Empty urls prefix not permitted\")\n    elif not settings.DEBUG:\n        # No-op if not in debug mode.\n        return []\n    return [\n        re_path(\n            r\"^{}/\".format(re.escape(prefix.lstrip(\"/\"))),\n            include(\"debug_toolbar.urls\"),\n        ),\n    ]\n"
  },
  {
    "path": "debug_toolbar/urls.py",
    "content": "from debug_toolbar import APP_NAME\nfrom debug_toolbar.toolbar import DebugToolbar\n\napp_name = APP_NAME\nurlpatterns = DebugToolbar.get_urls()\n"
  },
  {
    "path": "debug_toolbar/utils.py",
    "content": "from __future__ import annotations\n\nimport inspect\nimport linecache\nimport os.path\nimport sys\nimport warnings\nfrom collections.abc import Sequence\nfrom pprint import PrettyPrinter, pformat\nfrom typing import Any\n\nfrom asgiref.local import Local\nfrom django.http import QueryDict\nfrom django.template import Node\nfrom django.utils.html import format_html\nfrom django.utils.safestring import SafeString, mark_safe\nfrom django.views.debug import get_default_exception_reporter_filter\n\nfrom debug_toolbar import _compat as compat, _stubs as stubs, settings as dt_settings\n\n_local_data = Local()\nsafe_filter = get_default_exception_reporter_filter()\n\n\ndef _is_excluded_frame(frame: Any, excluded_modules: Sequence[str] | None) -> bool:\n    if not excluded_modules:\n        return False\n    frame_module = frame.f_globals.get(\"__name__\")\n    if not isinstance(frame_module, str):\n        return False\n    return any(\n        frame_module == excluded_module\n        or frame_module.startswith(excluded_module + \".\")\n        for excluded_module in excluded_modules\n    )\n\n\ndef _stack_trace_deprecation_warning() -> None:\n    warnings.warn(\n        \"get_stack() and tidy_stacktrace() are deprecated in favor of\"\n        \" get_stack_trace()\",\n        DeprecationWarning,\n        stacklevel=2,\n    )\n\n\ndef tidy_stacktrace(stack: list[stubs.InspectStack]) -> stubs.TidyStackTrace:\n    \"\"\"\n    Clean up stacktrace and remove all entries that are excluded by the\n    HIDE_IN_STACKTRACES setting.\n\n    ``stack`` should be a list of frame tuples from ``inspect.stack()`` or\n    ``debug_toolbar.utils.get_stack()``.\n    \"\"\"\n    _stack_trace_deprecation_warning()\n\n    trace = []\n    excluded_modules = dt_settings.get_config()[\"HIDE_IN_STACKTRACES\"]\n    for frame, path, line_no, func_name, text in (f[:5] for f in stack):\n        if _is_excluded_frame(frame, excluded_modules):\n            continue\n        text = \"\".join(text).strip() if text else \"\"\n        frame_locals = (\n            pformat(frame.f_locals)\n            if dt_settings.get_config()[\"ENABLE_STACKTRACES_LOCALS\"]\n            else None\n        )\n        trace.append((path, line_no, func_name, text, frame_locals))\n    return trace\n\n\ndef render_stacktrace(trace: stubs.TidyStackTrace) -> SafeString:\n    show_locals = dt_settings.get_config()[\"ENABLE_STACKTRACES_LOCALS\"]\n    html = \"\"\n    for abspath, lineno, func, code, locals_ in trace:\n        if os.path.sep in abspath:\n            directory, filename = abspath.rsplit(os.path.sep, 1)\n            # We want the separator to appear in the UI so add it back.\n            directory += os.path.sep\n        else:\n            # abspath could be something like \"<frozen importlib._bootstrap>\"\n            directory = \"\"\n            filename = abspath\n        html += format_html(\n            (\n                '<span class=\"djdt-path\">{}</span>'\n                + '<span class=\"djdt-file\">{}</span> in'\n                + ' <span class=\"djdt-func\">{}</span>'\n                + '(<span class=\"djdt-lineno\">{}</span>)\\n'\n                + '  <span class=\"djdt-code\">{}</span>\\n'\n            ),\n            directory,\n            filename,\n            func,\n            lineno,\n            code,\n        )\n        if show_locals:\n            html += format_html(\n                '  <pre class=\"djdt-locals\">{}</pre>\\n',\n                locals_,\n            )\n        html += \"\\n\"\n    return mark_safe(html)\n\n\ndef get_template_info() -> dict[str, Any] | None:\n    template_info = None\n    cur_frame = sys._getframe().f_back\n    try:\n        while cur_frame is not None:\n            in_utils_module = cur_frame.f_code.co_filename.endswith(\n                \"/debug_toolbar/utils.py\"\n            )\n            is_get_template_context = (\n                cur_frame.f_code.co_name == get_template_context.__name__\n            )\n            if in_utils_module and is_get_template_context:\n                # If the method in the stack trace is this one\n                # then break from the loop as it's being check recursively.\n                break\n            elif cur_frame.f_code.co_name == \"render\":\n                node = cur_frame.f_locals[\"self\"]\n                context = cur_frame.f_locals[\"context\"]\n                if isinstance(node, Node):\n                    template_info = get_template_context(node, context)\n                    break\n            cur_frame = cur_frame.f_back\n    except Exception:\n        pass\n    del cur_frame\n    return template_info\n\n\ndef get_template_context(\n    node: Node, context: stubs.RequestContext, context_lines: int = 3\n) -> dict[str, Any]:\n    line, source_lines, name = get_template_source_from_exception_info(node, context)\n    debug_context = []\n    start = max(1, line - context_lines)\n    end = line + 1 + context_lines\n\n    for line_num, content in source_lines:\n        if start <= line_num <= end:\n            debug_context.append(\n                {\"num\": line_num, \"content\": content, \"highlight\": (line_num == line)}\n            )\n\n    return {\"name\": name, \"context\": debug_context}\n\n\ndef get_template_source_from_exception_info(\n    node: Node, context: stubs.RequestContext\n) -> tuple[int, list[tuple[int, str]], str]:\n    if context.template.origin == node.origin:\n        exception_info = context.template.get_exception_info(\n            Exception(\"DDT\"), node.token\n        )\n    else:\n        exception_info = context.render_context.template.get_exception_info(\n            Exception(\"DDT\"), node.token\n        )\n    line = exception_info[\"line\"]\n    source_lines = exception_info[\"source_lines\"]\n    name = exception_info[\"name\"]\n    return line, source_lines, name\n\n\ndef get_name_from_obj(obj: Any) -> str:\n    \"\"\"Get the best name as `str` from a view or a object.\"\"\"\n    # This is essentially a rewrite of the `django.contrib.admindocs.utils.get_view_name`\n    # https://github.com/django/django/blob/9a22d1769b042a88741f0ff3087f10d94f325d86/django/contrib/admindocs/utils.py#L26-L32\n    if hasattr(obj, \"view_class\"):\n        klass = obj.view_class\n        return f\"{klass.__module__}.{klass.__qualname__}\"\n    mod_name = obj.__module__\n    view_name = getattr(obj, \"__qualname__\", obj.__class__.__name__)\n    return mod_name + \".\" + view_name\n\n\ndef getframeinfo(frame: Any, context: int = 1) -> inspect.Traceback:\n    \"\"\"\n    Get information about a frame or traceback object.\n\n    A tuple of five things is returned: the filename, the line number of\n    the current line, the function name, a list of lines of context from\n    the source code, and the index of the current line within that list.\n    The optional second argument specifies the number of lines of context\n    to return, which are centered around the current line.\n\n    This originally comes from ``inspect`` but is modified to handle issues\n    with ``findsource()``.\n    \"\"\"\n    if inspect.istraceback(frame):\n        lineno = frame.tb_lineno\n        frame = frame.tb_frame\n    else:\n        lineno = frame.f_lineno\n    if not inspect.isframe(frame):\n        raise TypeError(\"arg is not a frame or traceback object\")\n\n    filename = inspect.getsourcefile(frame) or inspect.getfile(frame)\n    if context > 0:\n        start = lineno - 1 - context // 2\n        try:\n            lines, lnum = inspect.findsource(frame)\n        except Exception:  # findsource raises platform-dependant exceptions\n            lines = index = None\n        else:\n            start = max(start, 1)\n            start = max(0, min(start, len(lines) - context))\n            lines = lines[start : (start + context)]\n            index = lineno - 1 - start\n    else:\n        lines = index = None\n\n    return inspect.Traceback(filename, lineno, frame.f_code.co_name, lines, index)\n\n\ndef sanitize_and_sort_request_vars(\n    variable: dict[str, Any] | QueryDict,\n) -> dict[str, list[tuple[str, Any]] | Any]:\n    \"\"\"\n    Get a data structure for showing a sorted list of variables from the\n    request data with sensitive values redacted.\n    \"\"\"\n    if not isinstance(variable, (dict, QueryDict)):\n        return {\"raw\": variable}\n\n    # Get sorted keys if possible, otherwise just list them\n    keys = _get_sorted_keys(variable)\n\n    # Process the variable based on its type\n    if isinstance(variable, QueryDict):\n        result = _process_query_dict(variable, keys)\n    else:\n        result = _process_dict(variable, keys)\n\n    return {\"list\": result}\n\n\ndef _get_sorted_keys(variable):\n    \"\"\"Helper function to get sorted keys if possible.\"\"\"\n    try:\n        return sorted(variable)\n    except TypeError:\n        return list(variable)\n\n\ndef _process_query_dict(query_dict, keys):\n    \"\"\"Process a QueryDict into a list of (key, sanitized_value) tuples.\"\"\"\n    result = []\n    for k in keys:\n        values = query_dict.getlist(k)\n        # Return single value if there's only one, otherwise keep as list\n        value = values[0] if len(values) == 1 else values\n        result.append((k, safe_filter.cleanse_setting(k, value)))\n    return result\n\n\ndef _process_dict(dictionary, keys):\n    \"\"\"Process a dictionary into a list of (key, sanitized_value) tuples.\"\"\"\n    return [(k, safe_filter.cleanse_setting(k, dictionary.get(k))) for k in keys]\n\n\ndef get_stack(context=1) -> list[stubs.InspectStack]:\n    \"\"\"\n    Get a list of records for a frame and all higher (calling) frames.\n\n    Each record contains a frame object, filename, line number, function\n    name, a list of lines of context, and index within the context.\n\n    Modified version of ``inspect.stack()`` which calls our own ``getframeinfo()``\n    \"\"\"\n    _stack_trace_deprecation_warning()\n\n    frame = sys._getframe(1)\n    framelist = []\n    while frame:\n        framelist.append((frame,) + getframeinfo(frame, context))\n        frame = frame.f_back\n    return framelist\n\n\ndef _stack_frames(*, skip=0):\n    skip += 1  # Skip the frame for this generator.\n    frame = inspect.currentframe()\n    while frame is not None:\n        if skip > 0:\n            skip -= 1\n        else:\n            yield frame\n        frame = frame.f_back\n\n\nclass _StackTraceRecorder:\n    pretty_printer = PrettyPrinter()\n\n    def __init__(self):\n        self.filename_cache = {}\n\n    def get_source_file(self, frame):\n        frame_filename = frame.f_code.co_filename\n\n        value = self.filename_cache.get(frame_filename)\n        if value is None:\n            filename = inspect.getsourcefile(frame)\n            if filename is None:\n                is_source = False\n                filename = frame_filename\n            else:\n                is_source = True\n                # Ensure linecache validity the first time this recorder\n                # encounters the filename in this frame.\n                linecache.checkcache(filename)\n            value = (filename, is_source)\n            self.filename_cache[frame_filename] = value\n\n        return value\n\n    def get_stack_trace(\n        self,\n        *,\n        excluded_modules: Sequence[str] | None = None,\n        include_locals: bool = False,\n        skip: int = 0,\n    ):\n        trace = []\n        skip += 1  # Skip the frame for this method.\n        for frame in _stack_frames(skip=skip):\n            if _is_excluded_frame(frame, excluded_modules):\n                continue\n\n            filename, is_source = self.get_source_file(frame)\n\n            line_no = frame.f_lineno\n            func_name = frame.f_code.co_name\n\n            if is_source:\n                module = inspect.getmodule(frame, filename)\n                module_globals = module.__dict__ if module is not None else None\n                source_line = linecache.getline(\n                    filename, line_no, module_globals\n                ).strip()\n            else:\n                source_line = \"\"\n\n            if include_locals:\n                frame_locals = self.pretty_printer.pformat(frame.f_locals)\n            else:\n                frame_locals = None\n\n            trace.append((filename, line_no, func_name, source_line, frame_locals))\n        trace.reverse()\n        return trace\n\n\ndef get_stack_trace(*, skip=0):\n    \"\"\"\n    Return a processed stack trace for the current call stack.\n\n    If the ``ENABLE_STACKTRACES`` setting is False, return an empty :class:`list`.\n    Otherwise return a :class:`list` of processed stack frame tuples (file name, line\n    number, function name, source line, frame locals) for the current call stack.  The\n    first entry in the list will be for the bottom of the stack and the last entry will\n    be for the top of the stack.\n\n    ``skip`` is an :class:`int` indicating the number of stack frames above the frame\n    for this function to omit from the stack trace.  The default value of ``0`` means\n    that the entry for the caller of this function will be the last entry in the\n    returned stack trace.\n    \"\"\"\n    config = dt_settings.get_config()\n    if not config[\"ENABLE_STACKTRACES\"]:\n        return []\n    skip += 1  # Skip the frame for this function.\n    stack_trace_recorder = getattr(_local_data, \"stack_trace_recorder\", None)\n    if stack_trace_recorder is None:\n        stack_trace_recorder = _StackTraceRecorder()\n        _local_data.stack_trace_recorder = stack_trace_recorder\n    return stack_trace_recorder.get_stack_trace(\n        excluded_modules=config[\"HIDE_IN_STACKTRACES\"],\n        include_locals=config[\"ENABLE_STACKTRACES_LOCALS\"],\n        skip=skip,\n    )\n\n\ndef clear_stack_trace_caches():\n    if hasattr(_local_data, \"stack_trace_recorder\"):\n        del _local_data.stack_trace_recorder\n\n\n_HTML_TYPES = (\"text/html\", \"application/xhtml+xml\")\n\n\ndef is_processable_html_response(response):\n    content_encoding = response.get(\"Content-Encoding\", \"\")\n    content_type = response.get(\"Content-Type\", \"\").split(\";\")[0]\n    return (\n        not getattr(response, \"streaming\", False)\n        and content_encoding == \"\"\n        and content_type in _HTML_TYPES\n    )\n\n\ndef get_csp_nonce(request) -> str | None:\n    \"\"\"\n    Retrieve the Content Security Policy nonce from a request if there is one.\n\n    This supports both the django-csp and the built-in Django implementations.\n    \"\"\"\n    # django-csp uses request.csp_nonce\n    csp_nonce = getattr(request, \"csp_nonce\", None)\n    if csp_nonce is not None:\n        return csp_nonce\n    # Django's built-in CSP support uses get_nonce(request)\n    return compat.get_nonce(request)\n"
  },
  {
    "path": "debug_toolbar/views.py",
    "content": "from django.http import HttpRequest, JsonResponse\nfrom django.utils.html import escape\nfrom django.utils.translation import gettext as _\n\nfrom debug_toolbar._compat import login_not_required\nfrom debug_toolbar.decorators import render_with_toolbar_language, require_show_toolbar\nfrom debug_toolbar.panels import Panel\nfrom debug_toolbar.toolbar import DebugToolbar, StoredDebugToolbar\n\n\n@login_not_required\n@require_show_toolbar\n@render_with_toolbar_language\ndef render_panel(request: HttpRequest) -> JsonResponse:\n    \"\"\"Render the contents of a panel\"\"\"\n    toolbar: StoredDebugToolbar | None = DebugToolbar.fetch(\n        request.GET[\"request_id\"], request.GET[\"panel_id\"]\n    )\n    if toolbar is None:\n        content = _(\n            \"Data for this panel isn't available anymore. \"\n            \"Please reload the page and retry.\"\n        )\n        content = f\"<p>{escape(content)}</p>\"\n        scripts = []\n    else:\n        panel: Panel = toolbar.get_panel_by_id(request.GET[\"panel_id\"])\n        content = panel.content\n        scripts = panel.scripts\n    return JsonResponse({\"content\": content, \"scripts\": scripts})\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Minimal makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line, and also\n# from the environment for the first two.\nSPHINXOPTS    ?= -n -W\nSPHINXBUILD   ?= sphinx-build\nSOURCEDIR     = .\nBUILDDIR      = _build\n\n# Put it first so that \"make\" without argument is like \"make help\".\nhelp:\n\t@$(SPHINXBUILD) -M help \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n\n.PHONY: help Makefile\n\n# Catch-all target: route all unknown targets to Sphinx using the new\n# \"make mode\" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).\n%: Makefile\n\t@$(SPHINXBUILD) -M $@ \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n"
  },
  {
    "path": "docs/architecture.rst",
    "content": "Architecture\n============\n\nThe Django Debug Toolbar is designed to be flexible and extensible for\ndevelopers and third-party panel creators.\n\nCore Components\n---------------\n\nWhile there are several components, the majority of logic and complexity\nlives within the following:\n\n- ``debug_toolbar.middleware.DebugToolbarMiddleware``\n- ``debug_toolbar.toolbar.DebugToolbar``\n- ``debug_toolbar.panels``\n\n^^^^^^^^^^^^^^^^^^^^^^\nDebugToolbarMiddleware\n^^^^^^^^^^^^^^^^^^^^^^\n\nThe middleware is how the toolbar integrates with Django projects.\nIt determines if the toolbar should instrument the request, which\npanels to use, facilitates the processing of the request and augmenting\nthe response with the toolbar. Most logic for how the toolbar interacts\nwith the user's Django project belongs here.\n\n^^^^^^^^^^^^\nDebugToolbar\n^^^^^^^^^^^^\n\nThe ``DebugToolbar`` class orchestrates the processing of a request\nfor each of the panels. It contains the logic that needs to be aware\nof all the panels, but doesn't need to interact with the user's Django\nproject.\n\n^^^^^^\nPanels\n^^^^^^\n\nThe majority of the complex logic lives within the panels themselves. This\nis because the panels are responsible for collecting the various metrics.\nSome of the metrics are collected via\n`monkey-patching <https://stackoverflow.com/a/5626250>`_, such as\n``TemplatesPanel``. Others, such as ``SettingsPanel`` don't need to collect\nanything and include the data directly in the response.\n\nSome panels such as ``SQLPanel`` have additional functionality. This tends\nto involve a user clicking on something, and the toolbar presenting a new\npage with additional data. That additional data is handled in views defined\nin the panels package (for example, ``debug_toolbar.panels.sql.views``).\n\nLogic Flow\n----------\n\nWhen a request comes in, the toolbar first interacts with it in the\nmiddleware. If the middleware determines the request should be instrumented,\nit will instantiate the toolbar and pass the request for processing. The\ntoolbar will use the enabled panels to collect information on the request\nand/or response. When the toolbar has completed collecting its metrics on\nboth the request and response, the middleware will collect the results\nfrom the toolbar. It will inject the HTML and JavaScript to render the\ntoolbar as well as any headers into the response.\n\nAfter the browser renders the panel and the user interacts with it, the\ntoolbar's JavaScript will send requests to the server. If the view handling\nthe request needs to fetch data from the toolbar, the request must supply\nthe store ID. This is so that the toolbar can load the collected metrics\nfor that particular request.\n\nThe history panel allows a user to view the metrics for any request since\nthe application was started. The toolbar maintains its state entirely in\nmemory for the process running ``runserver``. If the application is\nrestarted the toolbar will lose its state.\n\nProblematic Parts\n-----------------\n\n- ``debug.panels.templates.panel``: This monkey-patches template rendering\n  when the panel module is loaded\n- ``debug.panels.sql``: This package is particularly complex, but provides\n  the main benefit of the toolbar\n- Support for async and multi-threading: ``debug_toolbar.middleware.DebugToolbarMiddleware``\n  is now async compatible and can process async requests. However certain\n  panels such as ``RequestPanel`` and ``ProfilingPanel`` aren't\n  fully compatible and currently being worked on. For now, these panels\n  are disabled by default when running in async environment.\n  follow the progress of this issue in `Async compatible toolbar project <https://github.com/orgs/jazzband/projects/9>`_.\n- Django Channels incompatibility: The toolbar does not currently support\n  Django Channels' consumers due to the difference in middleware design.\n"
  },
  {
    "path": "docs/changes.rst",
    "content": "Change log\n==========\n\nPending\n-------\n\n* Replaced ``requirements_dev.txt`` file for ``pyproject.toml`` support with\n  dependency groups.\n* Updated ReadTheDocs Python version to 3.13.\n* Modernize some panel styles and colors.\n* Standardize use of time/duration units and labels across panels.\n* Added translations for Lithuanian, Turkish and Uzbek.\n* Update the translations.\n* Expose a ``py.typed`` marker file.\n* Updated ``RedirectsPanel`` to emit the deprecation warning when it's used\n  rather than on instantiation.\n* Highlighted the documentation about disabling the browser's caching to\n  ensure the latest static assets are used.\n\n6.2.0 (2026-01-20)\n------------------\n\n* Deprecated ``RedirectsPanel`` in favor of ``HistoryPanel`` for viewing\n  toolbar data from redirected requests.\n* Fixed support for generating code coverage comments in PRs.\n* Added Django 6.0 to the testing matrix. Removed Django 5.0 to save CI\n  resources.\n* Show the cache backend alias and cache backend class name instead of\n  the cache instance in the cache panel.\n* Dropped support for the Python 3.9, it has reached its end of life date.\n* Toggle tracking the toolbar's queries when using\n  ``debug_toolbar.store.DatabaseStore`` with ``SKIP_TOOLBAR_QUERIES``.\n* Fixed font family for code blocks and stack traces in the toolbar.\n* Added test to confirm Django's ``TestCase.assertNumQueries`` works.\n* Fixed string representation of values in settings panel.\n* Declared support for Django 6.0.\n\n6.1.0 (2025-10-30)\n------------------\n\n* Added support for async to timer panel.\n* Added a note about the default password in ``make example``.\n* Removed logging about the toolbar failing to serialize a value into JSON.\n* Moved the the import statement of ``debug_toolbar.urls`` to within the if\n  statement's scope on the installation documentation.\n* Changed ``StoredDebugToolbar.from_store`` to always create a panel key and\n  class instance, regardless if any data was generated.\n* Fixed selenium tests for CI by using psycopg for Python 3.13 runs.\n* Added ``CommunityPanel`` containing links to documentation and resources.\n* Upgraded CI ``postgis`` version to 17-3.5.\n* Added how to generate the documentation locally to the contributing\n  documentation.\n* Updated logic that forces values to strings (``force_str``) to render\n  \"Django Debug Toolbar was unable to parse value.\" when there's a decoding\n  error.\n* Updated docs to show incompatibility with Django Channels.\n* Hide the toolbar's migrations unless ``debug_toolbar.store.DatabaseStore``\n  is being used. This may change in the future.\n* Hide ``debug_toolbar.HistoryEntry`` as a model unless\n  ``debug_toolbar.store.DatabaseStore`` is being used. This may change in the\n  future.\n\n6.0.0 (2025-07-22)\n------------------\n\n* Added support for checking if pytest as the test runner when determining\n  if tests are running.\n* Added ``show_toolbar_with_docker`` function to check Docker host IP address\n  when running inside Docker containers.\n* Defines the ``BaseStore`` interface for request storage mechanisms.\n* Added the setting ``TOOLBAR_STORE_CLASS`` to configure the request\n  storage mechanism. Defaults to ``debug_toolbar.store.MemoryStore``.\n* Rename ``store_id`` properties to ``request_id`` and ``Toolbar.store`` to\n  ``Toolbar.init_store``.\n* Support ``Panel`` instances with stored stats via\n  ``Panel.load_stats_from_store``.\n* Swapped ``Toolbar._store`` for the ``get_store()`` class.\n* Created a ``StoredDebugToolbar`` that support creating an instance of the\n  toolbar representing an old request. It should only be used for fetching\n  panels' contents.\n* Drop ``raw_params`` from query data.\n* Queries now have a unique ``djdt_query_id``. The SQL forms now reference\n  this id and avoid passing SQL to be executed.\n* Move the formatting logic of SQL queries to just before rendering in\n  ``SQLPanel.content``.\n* Make ``Panel.panel_id`` a class member.\n* Update all panels to utilize data from ``Panel.get_stats()`` to load content\n  to render. Specifically for ``Panel.title`` and ``Panel.nav_title``.\n* Extend example app to contain an async version.\n* Added ``debug_toolbar.store.DatabaseStore`` for persistent debug data\n  storage.\n* Deduplicated static files in the staticfiles panel.\n\n5.2.0 (2025-04-29)\n------------------\n\n* Added hook to RedirectsPanel for subclass customization.\n* Added feature to sanitize sensitive data in the Request Panel.\n* Fixed dark mode conflict in code block toolbar CSS.\n* Properly allowed overriding the system theme preference by using the theme\n  selector. Removed the ``DEFAULT_THEME`` setting, we should always default to\n  system-level defaults where possible.\n* Added support for using django-template-partials with the template panel's\n  source view functionality. The same change possibly adds support for other\n  template loaders.\n* Introduced `djade <https://github.com/adamchainz/djade>`__ to format Django\n  templates.\n* Swapped display order of panel header and close button to prevent style\n  conflicts\n* Added CSS for resetting the height of elements too to avoid problems with\n  global CSS of a website where the toolbar is used.\n\n5.1.0 (2025-03-20)\n------------------\n\n* Added Django 5.2 to the tox matrix.\n* Updated package metadata to include well-known labels.\n* Added resources section to the documentation.\n* Wrap ``SHOW_TOOLBAR_CALLBACK`` function with ``sync_to_async``\n  or ``async_to_sync`` to allow sync/async compatibility.\n* Make ``require_toolbar`` decorator compatible to async views.\n* Added link to contributing documentation in ``CONTRIBUTING.md``.\n* Replaced ESLint and prettier with biome in our pre-commit configuration.\n* Added a Makefile target (``make help``) to get a quick overview\n  of each target.\n* Avoided reinitializing the staticfiles storage during instrumentation.\n* Avoided a \"forked\" Promise chain in the rebound ``window.fetch`` function\n  with missing exception handling.\n* Fixed the pygments code highlighting when using dark mode.\n* Fix for exception-unhandled \"forked\" Promise chain in rebound window.fetch\n* Create a CSP nonce property on the toolbar ``Toolbar().csp_nonce``.\n\n\n5.0.1 (2025-01-13)\n------------------\n* Fixing the build and release process. No functional changes.\n\n5.0.0 (2025-01-11)\n------------------\n\n* Added Python 3.13 to the CI matrix.\n* Removed support for Python 3.8 as it has reached end of life.\n* Converted to Django Commons PyPI release process.\n* Fixed a crash which occurred when using non-``str`` static file values.\n* Documented experimental async support.\n* Improved troubleshooting doc for incorrect mime types for .js static files\n\nPlease see everything under 5.0.0-alpha as well.\n\n5.0.0-alpha (2024-09-01)\n------------------------\n\n* Support async applications and ASGI from\n  `Google Summer of Code Project 2024\n  <https://summerofcode.withgoogle.com/programs/2024/projects/iXVvyGYp>`__.\n* Added Django 5.1 to the CI matrix.\n* Added support for the ``LoginRequiredMiddleware`` introduced in Django 5.1.\n* Support select and explain buttons for ``UNION`` queries on PostgreSQL.\n* Fixed internal toolbar requests being instrumented if the Django setting\n  ``FORCE_SCRIPT_NAME`` was set.\n* Increase opacity of show Debug Toolbar handle to improve accessibility.\n* Changed the ``RedirectsPanel`` to be async compatible.\n* Increased the contrast of text with dark mode enabled.\n* Add translations for Bulgarian and Korean.\n* Update translations for several languages.\n* Include new translatable strings for translation.\n* Fixed a crash which happened in the fallback case when session keys cannot be\n  sorted.\n\n4.4.6 (2024-07-10)\n------------------\n\n* Changed ordering (and grammatical number) of panels and their titles in\n  documentation to match actual panel ordering and titles.\n* Skipped processing the alerts panel when response isn't a HTML response.\n\n4.4.5 (2024-07-05)\n------------------\n\n* Avoided crashing when the alerts panel was skipped.\n* Removed the inadvertently added hard dependency on Jinja2.\n\n4.4.4 (2024-07-05)\n------------------\n\n* Added check for StreamingHttpResponse in alerts panel.\n* Instrument the Django Jinja2 template backend. This only instruments\n  the immediate template that's rendered. It will not provide stats on\n  any parent templates.\n\n4.4.3 (2024-07-04)\n------------------\n\n* Added alerts panel with warning when form is using file fields\n  without proper encoding type.\n* Fixed overriding font-family for both light and dark themes.\n* Restored compatibility with ``iptools.IpRangeList``.\n* Limit ``E001`` check to likely error cases when the\n  ``SHOW_TOOLBAR_CALLBACK`` has changed, but the toolbar's URL\n  paths aren't installed.\n* Introduce helper function ``debug_toolbar_urls`` to\n  simplify installation.\n* Moved \"1rem\" height/width for SVGs to CSS properties.\n\n4.4.2 (2024-05-27)\n------------------\n\n* Removed some CSS which wasn't carefully limited to the toolbar's elements.\n* Stopped assuming that ``INTERNAL_IPS`` is a list.\n* Added a section to the installation docs about running tests in projects\n  where the toolbar is being used.\n\n\n4.4.1 (2024-05-26)\n------------------\n\n* Pin metadata version to 2.2 to be compatible with Jazzband release\n  process.\n\n4.4.0 (2024-05-26)\n------------------\n\n* Raised the minimum Django version to 4.2.\n* Automatically support Docker rather than having the developer write a\n  workaround for ``INTERNAL_IPS``.\n* Display a better error message when the toolbar's requests\n  return invalid json.\n* Render forms with ``as_div`` to silence Django 5.0 deprecation warnings.\n* Stayed on top of pre-commit hook updates.\n* Added :doc:`architecture documentation <architecture>` to help\n  on-board new contributors.\n* Removed the static file path validation check in\n  :class:`StaticFilesPanel <debug_toolbar.panels.staticfiles.StaticFilesPanel>`\n  since that check is made redundant by a similar check in Django 4.0 and\n  later.\n* Deprecated the ``OBSERVE_REQUEST_CALLBACK`` setting and added check\n  ``debug_toolbar.W008`` to warn when it is present in\n  ``DEBUG_TOOLBAR_SETTINGS``.\n* Add a note on the profiling panel about using Python 3.12 and later\n  about needing ``--nothreading``\n* Added ``IS_RUNNING_TESTS`` setting to allow overriding the\n  ``debug_toolbar.E001`` check to avoid including the toolbar when running\n  tests.\n* Fixed the bug causing ``'djdt' is not a registered namespace`` and updated\n  docs to help in initial configuration while running tests.\n* Added a link in the installation docs to a more complete installation\n  example in the example app.\n* Added check to prevent the toolbar from being installed when tests\n  are running.\n* Added test to example app and command to run the example app's tests.\n* Implemented dark mode theme and button to toggle the theme,\n  introduced the ``DEFAULT_THEME`` setting which sets the default theme\n  to use.\n\n4.3.0 (2024-02-01)\n------------------\n\n* Dropped support for Django 4.0.\n* Added Python 3.12 to test matrix.\n* Removed outdated third-party panels from the list.\n* Avoided the unnecessary work of recursively quoting SQL parameters.\n* Postponed context process in templates panel to include lazy evaluated\n  content.\n* Fixed template panel to avoid evaluating ``LazyObject`` when not already\n  evaluated.\n* Added support for Django 5.0.\n* Refactor the ``utils.get_name_from_obj`` to simulate the behavior of\n  ``django.contrib.admindocs.utils.get_view_name``.\n* Switched from black to the `ruff formatter\n  <https://astral.sh/blog/the-ruff-formatter>`__.\n* Changed the default position of the toolbar from top to the upper top\n  position.\n* Added the setting, ``UPDATE_ON_FETCH`` to control whether the\n  toolbar automatically updates to the latest AJAX request or not.\n  It defaults to ``False``.\n\n4.2.0 (2023-08-10)\n------------------\n\n* Adjusted app directories system check to allow for nested template loaders.\n* Switched from flake8, isort and pyupgrade to `ruff\n  <https://beta.ruff.rs/>`__.\n* Converted cookie keys to lowercase. Fixed the ``samesite`` argument to\n  ``djdt.cookie.set``.\n* Converted ``StaticFilesPanel`` to no longer use a thread collector. Instead,\n  it collects the used static files in a ``ContextVar``.\n* Added check ``debug_toolbar.W007`` to warn when JavaScript files are\n  resolving to the wrong content type.\n* Fixed SQL statement recording under PostgreSQL for queries encoded as byte\n  strings.\n* Patch the ``CursorWrapper`` class with a mixin class to support multiple\n  base wrapper classes.\n\n4.1.0 (2023-05-15)\n------------------\n* Improved SQL statement formatting performance.  Additionally, fixed the\n  indentation of ``CASE`` statements and stopped simplifying ``.count()``\n  queries.\n* Added support for the new STORAGES setting in Django 4.2 for static files.\n* Added support for theme overrides.\n* Reworked the cache panel instrumentation code to no longer attempt to undo\n  monkey patching of cache methods, as that turned out to be fragile in the\n  presence of other code which also monkey patches those methods.\n* Update all timing code that used :py:func:`time.time()` to use\n  :py:func:`time.perf_counter()` instead.\n* Made the check on ``request.META[\"wsgi.multiprocess\"]`` optional, but\n  defaults to forcing the toolbar to render the panels on each request. This\n  is because it's likely an ASGI application that's serving the responses\n  and that's more likely to be an incompatible setup. If you find that this\n  is incorrect for you in particular, you can use the ``RENDER_PANELS``\n  setting to forcibly control this logic.\n\n4.0.0 (2023-04-03)\n------------------\n\n* Added Django 4.2 to the CI.\n* Dropped support for Python 3.7.\n* Fixed PostgreSQL raw query with a tuple parameter during on explain.\n* Use ``TOOLBAR_LANGUAGE`` setting when rendering individual panels\n  that are loaded via AJAX.\n* Add decorator for rendering toolbar views with ``TOOLBAR_LANGUAGE``.\n* Removed the logging panel. The panel's implementation was too complex, caused\n  memory leaks and sometimes very verbose and hard to silence output in some\n  environments (but not others). The maintainers judged that time and effort is\n  better invested elsewhere.\n* Added support for psycopg3.\n* When ``ENABLE_STACKTRACE_LOCALS`` is ``True``, the stack frames' locals dicts\n  will be converted to strings when the stack trace is captured rather when it\n  is rendered, so that the correct values will be displayed in the rendered\n  stack trace, as they may have changed between the time the stack trace was\n  captured and when it is rendered.\n\n3.8.1 (2022-12-03)\n------------------\n\n* Fixed release process by re-adding twine to release dependencies. No\n  functional change.\n\n3.8.0 (2022-12-03)\n------------------\n\n* Added protection against division by 0 in timer.js\n* Auto-update History panel for JavaScript ``fetch`` requests.\n* Support `HTMX boosting <https://htmx.org/docs/#boosting>`__ and\n  `Turbo <https://turbo.hotwired.dev/>`__ pages.\n* Simplify logic for ``Panel.enabled`` property by checking cookies earlier.\n* Include panel scripts in content when ``RENDER_PANELS`` is set to True.\n* Create one-time mouseup listener for each mousedown when dragging the\n  handle.\n* Update package metadata to use Hatchling.\n* Fix highlighting on history panel so odd rows are highlighted when\n  selected.\n* Formalize support for Python 3.11.\n* Added ``TOOLBAR_LANGUAGE`` setting.\n\n3.7.0 (2022-09-25)\n------------------\n\n* Added Profiling panel setting ``PROFILER_THRESHOLD_RATIO`` to give users\n  better control over how many function calls are included. A higher value\n  will include more data, but increase render time.\n* Update Profiling panel to include try to always include user code. This\n  code is more important to developers than dependency code.\n* Highlight the project function calls in the profiling panel.\n* Added Profiling panel setting ``PROFILER_CAPTURE_PROJECT_CODE`` to allow\n  users to disable the inclusion of all project code. This will be useful\n  to project setups that have dependencies installed under\n  ``settings.BASE_DIR``.\n* The toolbar's font stack now prefers system UI fonts. Tweaked paddings,\n  margins and alignments a bit in the CSS code.\n* Only sort the session dictionary when the keys are all strings. Fixes a\n  bug that causes the toolbar to crash when non-strings are used as keys.\n\n3.6.0 (2022-08-17)\n------------------\n\n* Remove decorator ``signed_data_view`` as it was causing issues with\n  `django-urlconfchecks <https://github.com/AliSayyah/django-urlconfchecks/>`__.\n* Added pygments to the test environment and fixed a crash when using the\n  template panel with Django 4.1 and pygments installed.\n* Stayed on top of pre-commit hook and GitHub actions updates.\n* Added some workarounds to avoid a Chromium warning which was worrisome to\n  developers.\n* Avoided using deprecated Selenium methods to find elements.\n* Raised the minimum Django version from 3.2 to 3.2.4 so that we can take\n  advantage of backported improvements to the cache connection handler.\n\n3.5.0 (2022-06-23)\n------------------\n\n* Properly implemented tracking and display of PostgreSQL transactions.\n* Removed third party panels which have been archived on GitHub.\n* Added Django 4.1b1 to the CI matrix.\n* Stopped crashing when ``request.GET`` and ``request.POST`` are neither\n  dictionaries nor ``QueryDict`` instances. Using anything but ``QueryDict``\n  instances isn't a valid use of Django but, again, django-debug-toolbar\n  shouldn't crash.\n* Fixed the cache panel to work correctly in the presence of concurrency by\n  avoiding the use of signals.\n* Reworked the cache panel instrumentation mechanism to monkey patch methods on\n  the cache instances directly instead of replacing cache instances with\n  wrapper classes.\n* Added a :meth:`debug_toolbar.panels.Panel.ready` class method that panels can\n  override to perform any initialization or instrumentation that needs to be\n  done unconditionally at startup time.\n* Added pyflame (for flame graphs) to the list of third-party panels.\n* Fixed the cache panel to correctly count cache misses from the get_many()\n  cache method.\n* Removed some obsolete compatibility code from the stack trace recording code.\n* Added a new mechanism for capturing stack traces which includes per-request\n  caching to reduce expensive file system operations.  Updated the cache and\n  SQL panels to record stack traces using this new mechanism.\n* Changed the ``docs`` tox environment to allow passing positional arguments.\n  This allows e.g. building a HTML version of the docs using ``tox -e docs\n  html``.\n* Stayed on top of pre-commit hook updates.\n* Replaced ``OrderedDict`` by ``dict`` where possible.\n\nDeprecated features\n~~~~~~~~~~~~~~~~~~~\n\n* The ``debug_toolbar.utils.get_stack()`` and\n  ``debug_toolbar.utils.tidy_stacktrace()`` functions are deprecated in favor\n  of the new ``debug_toolbar.utils.get_stack_trace()`` function.  They will\n  removed in the next major version of the Debug Toolbar.\n\n3.4.0 (2022-05-03)\n------------------\n\n* Fixed issue of stacktrace having frames that have no path to the file,\n  but are instead a string of the code such as\n  ``'<frozen importlib._bootstrap>'``.\n* Renamed internal SQL tracking context var from ``recording`` to\n  ``allow_sql``.\n\n3.3.0 (2022-04-28)\n------------------\n\n* Track calls to :py:meth:`django.core.cache.cache.get_or_set`.\n* Removed support for Django < 3.2.\n* Updated check ``W006`` to look for\n  ``django.template.loaders.app_directories.Loader``.\n* Reset settings when overridden in tests. Packages or projects using\n  django-debug-toolbar can now use Django’s test settings tools, like\n  ``@override_settings``, to reconfigure the toolbar during tests.\n* Optimize rendering of SQL panel, saving about 30% of its run time.\n* New records in history panel will flash green.\n* Automatically update History panel on AJAX requests from client.\n\n3.2.4 (2021-12-15)\n------------------\n\n* Revert PR 1426 - Fixes issue with SQL parameters having leading and\n  trailing characters stripped away.\n\n3.2.3 (2021-12-12)\n------------------\n\n* Changed cache monkey-patching for Django 3.2+ to iterate over existing\n  caches and patch them individually rather than attempting to patch\n  ``django.core.cache`` as a whole. The ``middleware.cache`` is still\n  being patched as a whole in order to attempt to catch any cache\n  usages before ``enable_instrumentation`` is called.\n* Add check ``W006`` to warn that the toolbar is incompatible with\n  ``TEMPLATES`` settings configurations with ``APP_DIRS`` set to ``False``.\n* Create ``urls`` module and update documentation to no longer require\n  importing the toolbar package.\n\n\n3.2.2 (2021-08-14)\n------------------\n\n* Ensured that the handle stays within bounds when resizing the window.\n* Disabled ``HistoryPanel`` when ``RENDER_PANELS`` is ``True``\n  or if ``RENDER_PANELS`` is ``None`` and the WSGI container is\n  running with multiple processes.\n* Fixed ``RENDER_PANELS`` functionality so that when ``True`` panels are\n  rendered during the request and not loaded asynchronously.\n* HistoryPanel now shows status codes of responses.\n* Support ``request.urlconf`` override when checking for toolbar requests.\n\n\n3.2.1 (2021-04-14)\n------------------\n\n* Fixed SQL Injection vulnerability, CVE-2021-30459. The toolbar now\n  calculates a signature on all fields for the SQL select, explain,\n  and analyze forms.\n* Changed ``djdt.cookie.set()`` to set ``sameSite=Lax`` by default if\n  callers do not provide a value.\n* Added ``PRETTIFY_SQL`` configuration option to support controlling\n  SQL token grouping. By default it's set to True. When set to False,\n  a performance improvement can be seen by the SQL panel.\n* Added a JavaScript event when a panel loads of the format\n  ``djdt.panel.[PanelId]`` where PanelId is the ``panel_id`` property\n  of the panel's Python class. Listening for this event corrects the bug\n  in the Timer Panel in which it didn't insert the browser timings\n  after switching requests in the History Panel.\n* Fixed issue with the toolbar expecting URL paths to start with\n  ``/__debug__/`` while the documentation indicates it's not required.\n\n3.2 (2020-12-03)\n----------------\n\n* Moved CI to GitHub Actions: https://github.com/jazzband/django-debug-toolbar/actions\n* Stopped crashing when ``request.GET`` and ``request.POST`` are\n  dictionaries instead of ``QueryDict`` instances. This isn't a valid\n  use of Django but django-debug-toolbar shouldn't crash anyway.\n* Fixed a crash in the history panel when sending a  JSON POST request\n  with invalid JSON.\n* Added missing signals to the signals panel by default.\n* Documented how to avoid CORS errors now that we're using JavaScript\n  modules.\n* Verified support for Python 3.9.\n* Added a ``css`` and a ``js`` template block to\n  ``debug_toolbar/base.html`` to allow overriding CSS and JS.\n\n\n3.2a1 (2020-10-19)\n------------------\n\n* Fixed a regression where the JavaScript code crashed with an invalid\n  CSS selector when searching for an element to replace.\n* Replaced remaining images with CSS.\n* Continued refactoring the HTML and CSS code for simplicity, continued\n  improving the use of semantic HTML.\n* Stopped caring about prehistoric browsers for good. Started splitting\n  up the JavaScript code to take advantage of JavaScript modules.\n* Continued removing unused CSS.\n* Started running Selenium tests on Travis CI.\n* Added a system check which prevents using django-debug-toolbar without\n  any enabled panels.\n* Added :meth:`Panel.run_checks() <debug_toolbar.panels.Panel.run_checks>` for\n  panels to verify the configuration before the application starts.\n* Validate the static file paths specified in ``STATICFILES_DIRS``\n  exist via :class:`~debug_toolbar.panels.staticfiles.StaticFilesPanel`\n* Introduced `prettier <https://prettier.io/>`__ to format the frontend\n  code.\n* Started accessing history views using GET requests since they do not\n  change state on the server.\n* Fixed a bug where unsuccessful requests (e.g. network errors) were\n  silently ignored.\n* Started spellchecking the documentation.\n* Removed calls to the deprecated ``request.is_ajax()`` method. These calls\n  were unnecessary now that most endpoints return JSON anyway.\n* Removed support for Python 3.5.\n\n\n3.1 (2020-09-21)\n----------------\n\n* Fixed a crash in the history panel when sending an empty JSON POST\n  request.\n* Made ``make example`` also set up the database and a superuser\n  account.\n* Added a Makefile target for regenerating the django-debug-toolbar\n  screenshot.\n* Added automatic escaping of panel titles resp. disallowed HTML tags.\n* Removed some CSS\n* Restructured the SQL stats template.\n* Changed command line examples to prefer ``python -m pip`` to ``pip``.\n\n\n3.0 (2020-09-20)\n----------------\n\n* Added an ``.editorconfig`` file specifying indentation rules etc.\n* Updated the Italian translation.\n* Added support for Django 3.1a1. ``fetch()`` and ``jQuery.ajax`` requests are\n  now detected by the absence of a ``Accept: text/html`` header instead of the\n  jQuery-specific ``X-Requested-With`` header on Django 3.1 or better.\n* Pruned unused CSS and removed hacks for ancient browsers.\n* Added the new :attr:`Panel.scripts <debug_toolbar.panels.Panel.scripts>`\n  property. This property should return a list of JavaScript resources to be\n  loaded in the browser when displaying the panel. Right now, this is used by a\n  single panel, the Timer panel. Third party panels can use this property to\n  add scripts rather then embedding them in the content HTML.\n* Switched from JSHint to ESLint. Added an ESLint job to the Travis CI matrix.\n* Debug toolbar state which is only needed in the JavaScript code now uses\n  ``localStorage``.\n* Updated the code to avoid a few deprecation warnings and resource warnings.\n* Started loading JavaScript as ES6 modules.\n* Added support for :meth:`cache.touch() <django.core.cache.cache.touch>` when\n  using django-debug-toolbar.\n* Eliminated more inline CSS.\n* Updated ``tox.ini`` and ``Makefile`` to use isort>=5.\n* Increased RESULTS_CACHE_SIZE to 25 to better support AJAX requests.\n* Fixed the close button CSS by explicitly specifying the\n  ``box-sizing`` property.\n* Simplified the ``isort`` configuration by taking advantage of isort's\n  ``black`` profile.\n* Added :class:`~debug_toolbar.panels.history.HistoryPanel` including support\n  for AJAX requests.\n\n**Backwards incompatible changes**\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* Loading panel content no longer executes the scripts elements embedded in the\n  HTML. Third party panels that require JavaScript resources should now use the\n  :attr:`Panel.scripts <debug_toolbar.panels.Panel.scripts>` property.\n* Removed support for end of life Django 1.11. The minimum supported Django is\n  now 2.2.\n* The Debug Toolbar now loads a `JavaScript module`_. Typical local development\n  using Django ``runserver`` is not impacted. However, if your application\n  server and static files server are at different origins, you may see CORS\n  errors in your browser's development console. See the \"Cross-Origin Request\n  Blocked\" section of the :doc:`installation docs <installation>` for details\n  on how to resolve this issue.\n\n.. _JavaScript module: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules\n\n2.2 (2020-01-31)\n----------------\n\n* Removed support for end of life Django 2.0 and 2.1.\n* Added support for Python 3.8.\n* Add locals() option for SQL panel.\n* Added support for Django 3.0.\n\n\n2.1 (2019-11-12)\n----------------\n\n* Changed the Travis CI matrix to run style checks first.\n* Exposed the ``djdt.init`` function too.\n* Small improvements to the code to take advantage of newer Django APIs\n  and avoid warnings because of deprecated code.\n* Verified compatibility with the upcoming Django 3.0 (at the time of\n  writing).\n\n\n2.0 (2019-06-20)\n----------------\n\n* Updated :class:`~debug_toolbar.panels.staticfiles.StaticFilesPanel` to be\n  compatible with Django 3.0.\n* The :class:`~debug_toolbar.panels.profiling.ProfilingPanel` is now enabled\n  but inactive by default.\n* Fixed toggling of table rows in the profiling panel UI.\n* The :class:`~debug_toolbar.panels.profiling.ProfilingPanel` no longer skips\n  remaining panels or middlewares.\n* Improved the installation documentation.\n* Fixed a possible crash in the template panel.\n* Added support for psycopg2 ``Composed`` objects.\n* Changed the Jinja2 tests to use Django's own Jinja2 template backend.\n* Added instrumentation to queries using server side cursors.\n* Too many small improvements and cleanups to list them all.\n\n**Backwards incompatible changes**\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n* Removed support for Python 2.\n* Removed support for Django's deprecated ``MIDDLEWARE_CLASSES`` setting.\n* Restructured :class:`debug_toolbar.panels.Panel` to execute more like the\n  new-style Django MIDDLEWARE. The ``Panel.__init__()`` method is now passed\n  ``get_response`` as the first positional argument. The\n  :meth:`debug_toolbar.panels.Panel.process_request` method must now always\n  return a response. Usually this is the response returned by\n  ``get_response()`` but the panel may also return a different response as is\n  the case in the :class:`~debug_toolbar.panels.redirects.RedirectsPanel`.\n  Third party panels must adjust to this new architecture.\n  ``Panel.process_response()`` and ``Panel.process_view()`` have been removed\n  as a result of this change.\n\nThe deprecated API, ``debug_toolbar.panels.DebugPanel``, has been removed.\nThird party panels should use :class:`debug_toolbar.panels.Panel` instead.\n\nThe following deprecated settings have been removed:\n\n* ``HIDDEN_STACKTRACE_MODULES``\n* ``HIDE_DJANGO_SQL``\n* ``INTERCEPT_REDIRECTS``\n* ``RESULTS_STORE_SIZE``\n* ``ROOT_TAG_ATTRS``\n* ``TAG``\n\n1.11 (2018-12-03)\n-----------------\n\n* Use ``defer`` on all ``<script>`` tags to avoid blocking HTML parsing,\n  removed inline JavaScript.\n* Stop inlining images in CSS to avoid Content Security Policy errors\n  altogether.\n* Reformatted the code using `black <https://github.com/ambv/black>`__.\n* Added the Django mail panel to the list of third-party panels.\n* Convert system check errors to warnings to accommodate exotic\n  configurations.\n* Fixed a crash when explaining raw querysets.\n* Fixed an obscure Unicode error with binary data fields.\n* Added MariaDB and Python 3.7 builds to the CI.\n\n1.10.1 (2018-09-11)\n-------------------\n\n* Fixed a problem where the duplicate query detection breaks for\n  unhashable query parameters.\n* Added support for structured types when recording SQL.\n* Made Travis CI also run one test no PostgreSQL.\n* Added fallbacks for inline images in CSS.\n* Improved cross-browser compatibility around ``URLSearchParams`` usage.\n* Fixed a few typos and redundancies in the documentation, removed\n  mentions of django-debug-toolbar's jQuery which aren't accurate\n  anymore.\n\n1.10 (2018-09-06)\n-----------------\n\n* Removed support for Django < 1.11.\n* Added support and testing for Django 2.1 and Python 3.7. No actual code\n  changes were required.\n* Removed the jQuery dependency. This means that django-debug-toolbar\n  now requires modern browsers with support for ``fetch``, ``classList``\n  etc. The ``JQUERY_URL`` setting is also removed because it isn't\n  necessary anymore. If you depend on jQuery, integrate it yourself.\n* Added support for the server timing header.\n* Added a differentiation between similar and duplicate queries. Similar\n  queries are what duplicate queries used to be (same SQL, different\n  parameters).\n* Stopped hiding frames from Django's contrib apps in stacktraces by\n  default.\n* Lots of small cleanups and bug fixes.\n\n1.9.1 (2017-11-15)\n------------------\n\n* Fix erroneous ``ContentNotRenderedError`` raised by the redirects panel.\n\n1.9 (2017-11-13)\n----------------\n\nThis version is compatible with Django 2.0 and requires Django 1.8 or\nlater.\n\nBug fixes\n~~~~~~~~~\n\n* The profiling panel now escapes reported data resulting in valid HTML.\n* Many minor cleanups and bug fixes.\n\n1.8 (2017-05-05)\n----------------\n\nThis version is compatible with Django 1.11 and requires Django 1.8 or\nlater.\n\n**Backwards incompatible changes**\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* ``debug_toolbar.middleware.show_toolbar`` (the default value of setting\n  ``SHOW_TOOLBAR_CALLBACK``) no longer returns ``False`` for AJAX requests.\n  This is to allow reusing the ``SHOW_TOOLBAR_CALLBACK`` function to verify\n  access to panel views requested via AJAX. Projects defining a custom\n  ``SHOW_TOOLBAR_CALLBACK`` should remove checks for AJAX requests in order to\n  continue to allow access to these panels.\n\nFeatures\n~~~~~~~~\n\n* New decorator ``debug_toolbar.decorators.require_show_toolbar`` prevents\n  unauthorized access to decorated views by checking ``SHOW_TOOLBAR_CALLBACK``\n  every request. Unauthorized access results in a 404.\n* The ``SKIP_TEMPLATE_PREFIXES`` setting allows skipping templates in\n  the templates panel. Template-based form widgets' templates are\n  skipped by default to avoid panel sizes going into hundreds of\n  megabytes of HTML.\n\nBug fixes\n~~~~~~~~~\n\n* All views are now decorated with\n  ``debug_toolbar.decorators.require_show_toolbar`` preventing unauthorized\n  access.\n* The templates panel now reuses contexts' pretty printed version which\n  makes the debug toolbar usable again with Django 1.11's template-based\n  forms rendering.\n* Long SQL statements are now forcibly wrapped to fit on the screen.\n\n1.7 (2017-03-05)\n----------------\n\nBug fixes\n~~~~~~~~~\n\n* Recursive template extension is now understood.\n* Deprecation warnings were fixed.\n* The SQL panel uses HMAC instead of simple hashes to verify that SQL\n  statements have not been changed. Also, the handling of bytes and text\n  for hashing has been hardened. Also, a bug with Python's division\n  handling has been fixed for improved Python 3 support.\n* An error with django-jinja has been fixed.\n* A few CSS classes have been prefixed with ``djdt-`` to avoid\n  conflicting class names.\n\n1.6 (2016-10-05)\n----------------\n\nThe debug toolbar was adopted by Jazzband.\n\nRemoved features\n~~~~~~~~~~~~~~~~\n\n* Support for automatic setup has been removed as it was frequently\n  problematic. Installation now requires explicit setup. The\n  ``DEBUG_TOOLBAR_PATCH_SETTINGS`` setting has also been removed as it is now\n  unused. See the :doc:`installation documentation <installation>` for details.\n\nBug fixes\n~~~~~~~~~\n\n* The ``DebugToolbarMiddleware`` now also supports Django 1.10's ``MIDDLEWARE``\n  setting.\n\n1.5 (2016-07-21)\n----------------\n\nThis version is compatible with Django 1.10 and requires Django 1.8 or later.\n\nSupport for Python 3.2 is dropped.\n\nBug fixes\n~~~~~~~~~\n\n* Restore compatibility with sqlparse ≥ 0.2.0.\n* Add compatibility with Bootstrap 4, Pure CSS, MDL, etc.\n* Improve compatibility with RequireJS / AMD.\n* Improve the UI slightly.\n* Fix invalid (X)HTML.\n\n1.4 (2015-10-06)\n----------------\n\nThis version is compatible with Django 1.9 and requires Django 1.7 or later.\n\nNew features\n~~~~~~~~~~~~\n\n* New panel method :meth:`debug_toolbar.panels.Panel.generate_stats` allows\n  panels to only record stats when the toolbar is going to be inserted into\n  the response.\n\nBug fixes\n~~~~~~~~~\n\n* Response time for requests of projects with numerous media files has\n  been improved.\n\n1.3 (2015-03-10)\n----------------\n\nThis is the first version compatible with Django 1.8.\n\nNew features\n~~~~~~~~~~~~\n\n* A new panel is available: Template Profiler.\n* The ``SHOW_TOOLBAR_CALLBACK`` accepts a callable.\n* The toolbar now provides a :ref:`javascript-api`.\n\nBug fixes\n~~~~~~~~~\n\n* The toolbar handle cannot leave the visible area anymore when the toolbar is\n  collapsed.\n* The root level logger is preserved.\n* The ``RESULTS_CACHE_SIZE`` setting is taken into account.\n* CSS classes are prefixed with ``djdt-`` to prevent name conflicts.\n* The private copy of jQuery no longer registers as an AMD module on sites\n  that load RequireJS.\n\n1.2 (2014-04-25)\n----------------\n\nNew features\n~~~~~~~~~~~~\n\n* The ``JQUERY_URL`` setting defines where the toolbar loads jQuery from.\n\nBug fixes\n~~~~~~~~~\n\n* The toolbar now always loads a private copy of jQuery in order to avoid\n  using an incompatible version. It no longer attempts to integrate with AMD.\n\n  This private copy is available in ``djdt.jQuery``. Third-party panels are\n  encouraged to use it because it should be as stable as the toolbar itself.\n\n1.1 (2014-04-12)\n----------------\n\nThis is the first version compatible with Django 1.7.\n\nNew features\n~~~~~~~~~~~~\n\n* The SQL panel colors queries depending on the stack level.\n* The Profiler panel allows configuring the maximum depth.\n\nBug fixes\n~~~~~~~~~\n\n* Support languages where lowercase and uppercase strings may have different\n  lengths.\n* Allow using cursor as context managers.\n* Make the SQL explain more helpful on SQLite.\n* Various JavaScript improvements.\n\nDeprecated features\n~~~~~~~~~~~~~~~~~~~\n\n* The ``INTERCEPT_REDIRECTS`` setting is superseded by the more generic\n  ``DISABLE_PANELS``.\n\n1.0 (2013-12-21)\n----------------\n\nThis is the first stable version of the Debug Toolbar!\n\nIt includes many new features and performance improvements as well a few\nbackwards-incompatible changes to make the toolbar easier to deploy, use,\nextend and maintain in the future.\n\nYou're strongly encouraged to review the installation and configuration docs\nand redo the setup in your projects.\n\nThird-party panels will need to be updated to work with this version.\n"
  },
  {
    "path": "docs/checks.rst",
    "content": "=============\nSystem checks\n=============\n\nThe following :external:doc:`system checks <topics/checks>` help verify the\nDjango Debug Toolbar setup and configuration:\n\n* **debug_toolbar.W001**: ``debug_toolbar.middleware.DebugToolbarMiddleware``\n  is missing from ``MIDDLEWARE``.\n* **debug_toolbar.W002**: ``debug_toolbar.middleware.DebugToolbarMiddleware``\n  occurs multiple times in ``MIDDLEWARE``.\n* **debug_toolbar.W003**: ``debug_toolbar.middleware.DebugToolbarMiddleware``\n  occurs before ``django.middleware.gzip.GZipMiddleware`` in ``MIDDLEWARE``.\n* **debug_toolbar.W004**: ``debug_toolbar`` is incompatible with\n  ``MIDDLEWARE_CLASSES`` setting.\n* **debug_toolbar.W005**: Setting ``DEBUG_TOOLBAR_PANELS`` is empty.\n* **debug_toolbar.W006**: At least one ``DjangoTemplates`` ``TEMPLATES``\n  configuration needs to have\n  ``django.template.loaders.app_directories.Loader`` included in\n  ``[\"OPTIONS\"][\"loaders\"]`` or ``APP_DIRS`` set to ``True``.\n* **debug_toolbar.W007**: JavaScript files are resolving to the wrong content\n  type. Refer to :external:ref:`Django's explanation of\n  mimetypes on Windows <staticfiles-development-view>`.\n* **debug_toolbar.W008**: The deprecated ``OBSERVE_REQUEST_CALLBACK`` setting\n  is present in ``DEBUG_TOOLBAR_CONFIG``.  Use the ``UPDATE_ON_FETCH`` and/or\n  ``SHOW_TOOLBAR_CALLBACK`` settings instead.\n"
  },
  {
    "path": "docs/commands.rst",
    "content": "Commands\n========\n\nThe Debug Toolbar currently provides one Django management command.\n\n``debugsqlshell``\n-----------------\n\nThis command starts an interactive Python shell, like Django's built-in\n``shell`` management command. In addition, each ORM call that results in a\ndatabase query will be beautifully output in the shell.\n\nHere's an example::\n\n    >>> from page.models import Page\n    >>> ### Lookup and use resulting in an extra query...\n    >>> p = Page.objects.get(pk=1)\n    SELECT \"page_page\".\"id\",\n           \"page_page\".\"number\",\n           \"page_page\".\"template_id\",\n           \"page_page\".\"description\"\n    FROM \"page_page\"\n    WHERE \"page_page\".\"id\" = 1\n\n    >>> print(p.template.name)\n    SELECT \"page_template\".\"id\",\n           \"page_template\".\"name\",\n           \"page_template\".\"description\"\n    FROM \"page_template\"\n    WHERE \"page_template\".\"id\" = 1\n\n    Home\n    >>> ### Using select_related to avoid 2nd database call...\n    >>> p = Page.objects.select_related('template').get(pk=1)\n    SELECT \"page_page\".\"id\",\n           \"page_page\".\"number\",\n           \"page_page\".\"template_id\",\n           \"page_page\".\"description\",\n           \"page_template\".\"id\",\n           \"page_template\".\"name\",\n           \"page_template\".\"description\"\n    FROM \"page_page\"\n    INNER JOIN \"page_template\" ON (\"page_page\".\"template_id\" = \"page_template\".\"id\")\n    WHERE \"page_page\".\"id\" = 1\n\n    >>> print(p.template.name)\n    Home\n"
  },
  {
    "path": "docs/conf.py",
    "content": "# Configuration file for the Sphinx documentation builder.\n#\n# This file only contains a selection of the most common options. For a full\n# list see the documentation:\n# https://www.sphinx-doc.org/en/master/usage/configuration.html\n\n# -- Path setup --------------------------------------------------------------\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n\nimport datetime\nimport os\nimport sys\n\nos.environ[\"DJANGO_SETTINGS_MODULE\"] = \"example.settings\"\nsys.path.append(os.path.dirname(os.path.dirname(__file__)))\n\n\n# -- Project information -----------------------------------------------------\n\nproject = \"Django Debug Toolbar\"\ncopyright = \"{}, Django Debug Toolbar developers and contributors\"\ncopyright = copyright.format(datetime.date.today().year)\n\n# The full version, including alpha/beta/rc tags\nrelease = \"6.2.0\"\n\n\n# -- General configuration ---------------------------------------------------\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = [\n    \"sphinx.ext.autodoc\",\n    \"sphinx.ext.intersphinx\",\n]\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = [\"_templates\"]\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This pattern also affects html_static_path and html_extra_path.\nexclude_patterns = [\"_build\"]\n\n\n# -- Options for HTML output -------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\nhtml_theme = \"sphinx_rtd_theme\"\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\n# html_static_path = ['_static']\n\nintersphinx_mapping = {\n    \"python\": (\"https://docs.python.org/\", None),\n    \"django\": (\n        \"https://docs.djangoproject.com/en/dev/\",\n        \"https://docs.djangoproject.com/en/dev/_objects/\",\n    ),\n}\n\n# -- Options for Read the Docs -----------------------------------------------\n\n\ndef setup(app):\n    \"\"\"Configure documentation via Sphinx extension\"\"\"\n    # Add the :setting: role for intersphinx linking to Django's docs\n    app.add_crossref_type(\n        directivename=\"setting\",\n        rolename=\"setting\",\n        indextemplate=\"pair: %s; setting\",\n    )\n"
  },
  {
    "path": "docs/configuration.rst",
    "content": "Configuration\n=============\n\nThe debug toolbar provides two settings that you can add in your project's\nsettings module to customize its behavior.\n\n.. note:: Do you really need a customized configuration?\n\n    The debug toolbar ships with a default configuration that is considered\n    sane for the vast majority of Django projects. Don't copy-paste blindly\n    the default values shown below into your settings module! It's useless and\n    it'll prevent you from taking advantage of better defaults that may be\n    introduced in future releases.\n\nDEBUG_TOOLBAR_PANELS\n--------------------\n\nThis setting specifies the full Python path to each panel that you want\nincluded in the toolbar. It works like Django's ``MIDDLEWARE`` setting. The\ndefault value is::\n\n    DEBUG_TOOLBAR_PANELS = [\n        'debug_toolbar.panels.history.HistoryPanel',\n        'debug_toolbar.panels.versions.VersionsPanel',\n        'debug_toolbar.panels.timer.TimerPanel',\n        'debug_toolbar.panels.settings.SettingsPanel',\n        'debug_toolbar.panels.headers.HeadersPanel',\n        'debug_toolbar.panels.request.RequestPanel',\n        'debug_toolbar.panels.sql.SQLPanel',\n        'debug_toolbar.panels.staticfiles.StaticFilesPanel',\n        'debug_toolbar.panels.templates.TemplatesPanel',\n        'debug_toolbar.panels.alerts.AlertsPanel',\n        'debug_toolbar.panels.cache.CachePanel',\n        'debug_toolbar.panels.signals.SignalsPanel',\n        'debug_toolbar.panels.community.CommunityPanel',\n        'debug_toolbar.panels.redirects.RedirectsPanel',\n        'debug_toolbar.panels.profiling.ProfilingPanel',\n    ]\n\nThis setting allows you to:\n\n* add built-in panels that aren't enabled by default,\n* add third-party panels,\n* remove built-in panels,\n* change the order of panels.\n\nDEBUG_TOOLBAR_CONFIG\n--------------------\n\nThis dictionary contains all other configuration options. Some apply to the\ntoolbar itself, others are specific to some panels.\n\nToolbar options\n~~~~~~~~~~~~~~~\n\n* ``DISABLE_PANELS``\n\n  Default:\n\n  .. code-block:: python\n\n      {\n          \"debug_toolbar.panels.profiling.ProfilingPanel\",\n          \"debug_toolbar.panels.redirects.RedirectsPanel\",\n      }\n\n  This setting is a set of the full Python paths to each panel that you\n  want disabled (but still displayed) by default.\n\n* ``INSERT_BEFORE``\n\n  Default: ``'</body>'``\n\n  The toolbar searches for this string in the HTML and inserts itself just\n  before.\n\n.. _IS_RUNNING_TESTS:\n\n* ``IS_RUNNING_TESTS``\n\n  Default: ``\"test\" in sys.argv or \"PYTEST_VERSION\" in os.environ``\n\n  This setting whether the application is running tests. If this resolves to\n  ``True``, the toolbar will prevent you from running tests. This should only\n  be changed if your test command doesn't include ``test`` or if you wish to\n  test your application with the toolbar configured. If you do wish to test\n  your application with the toolbar configured, set this setting to\n  ``False``.\n\n.. _RENDER_PANELS:\n\n* ``RENDER_PANELS``\n\n  Default: ``None``\n\n  If set to ``False``, the debug toolbar will keep the contents of panels in\n  memory on the server and load them on demand.\n\n  If set to ``True``, it will disable ``HistoryPanel`` and render panels\n  inside every page. This may slow down page rendering but it's\n  required on multi-process servers, for example if you deploy the toolbar in\n  production (which isn't recommended).\n\n  The default value of ``None`` tells the toolbar to automatically do the\n  right thing depending on whether the WSGI container runs multiple processes.\n  This setting allows you to force a different behavior if needed. If the\n  WSGI container runs multiple processes, it will disable ``HistoryPanel``.\n\n* ``RESULTS_CACHE_SIZE``\n\n  Default: ``25``\n\n  The toolbar keeps up to this many results in memory or persistent storage.\n\n\n.. _ROOT_TAG_EXTRA_ATTRS:\n\n* ``ROOT_TAG_EXTRA_ATTRS``\n\n  Default: ``''``\n\n  This setting is injected in the root template div in order to avoid\n  conflicts with client-side frameworks. For example, when using the debug\n  toolbar with Angular.js, set this to ``'ng-non-bindable'`` or\n  ``'class=\"ng-non-bindable\"'``.\n\n* ``SHOW_COLLAPSED``\n\n  Default: ``False``\n\n  If changed to ``True``, the toolbar will be collapsed by default.\n\n.. _SHOW_TOOLBAR_CALLBACK:\n\n* ``SHOW_TOOLBAR_CALLBACK``\n\n  Default: ``'debug_toolbar.middleware.show_toolbar'``\n\n  This is the dotted path to a function used for determining whether the\n  toolbar should show or not. The default checks are that ``DEBUG`` must be set\n  to ``True`` and the IP of the request must be in ``INTERNAL_IPS``. You can\n  provide your own function ``callback(request)`` which returns ``True`` or\n  ``False``.\n\n  For versions < 1.8, the callback should also return ``False`` for AJAX\n  requests. Since version 1.8, AJAX requests are checked in the middleware, not\n  the callback. This allows reusing the callback to verify access to panel\n  views requested via AJAX.\n\n  .. warning::\n\n     Please note that the debug toolbar isn't hardened for use in production\n     environments or on public servers. You should be aware of the implications\n     to the security of your servers when using your own callback. One known\n     implication is that it is possible to execute arbitrary SQL through the\n     SQL panel when the ``SECRET_KEY`` value is leaked somehow.\n\n  .. warning::\n\n     Do not use\n     ``DEBUG_TOOLBAR_CONFIG = {\"SHOW_TOOLBAR_CALLBACK\": lambda request: DEBUG}``\n     in your project's settings.py file. The toolbar expects to use\n     ``django.conf.settings.DEBUG``. Using your project's setting's ``DEBUG``\n     is likely to cause unexpected results when running your tests. This is because\n     Django automatically sets ``settings.DEBUG = False``, but your project's\n     setting's ``DEBUG`` will still be set to ``True``.\n\n.. _OBSERVE_REQUEST_CALLBACK:\n\n* ``OBSERVE_REQUEST_CALLBACK``\n\n  Default: ``'debug_toolbar.toolbar.observe_request'``\n\n  .. note::\n\n     This setting is deprecated in favor of the ``UPDATE_ON_FETCH`` and\n     ``SHOW_TOOLBAR_CALLBACK`` settings.\n\n  This is the dotted path to a function used for determining whether the\n  toolbar should update on AJAX requests or not. The default implementation\n  always returns ``True``.\n\n.. _TOOLBAR_STORE_CLASS:\n\n* ``TOOLBAR_STORE_CLASS``\n\n  Default: ``\"debug_toolbar.store.MemoryStore\"``\n\n  The path to the class to be used for storing the toolbar's data per request.\n\n  Available store classes:\n\n  * ``debug_toolbar.store.MemoryStore`` - Stores data in memory\n  * ``debug_toolbar.store.DatabaseStore`` - Stores data in the database\n\n  The DatabaseStore provides persistence and automatically cleans up old\n  entries based on the ``RESULTS_CACHE_SIZE`` setting.\n\n  Note: When using ``DatabaseStore`` migrations are required for\n  the ``debug_toolbar`` app:\n\n  .. code-block:: bash\n\n      python manage.py migrate debug_toolbar\n\n  For the ``DatabaseStore`` to work properly, you need to run migrations for the\n  ``debug_toolbar`` app. The migrations create the necessary database table to store\n  toolbar data.\n\n.. _TOOLBAR_LANGUAGE:\n\n* ``TOOLBAR_LANGUAGE``\n\n  Default: ``None``\n\n  The language used to render the toolbar. If no value is supplied, then the\n  application's current language will be used. This setting can be used to\n  render the toolbar in a different language than what the application is\n  rendered in. For example, if you wish to use English for development,\n  but want to render your application in French, you would set this to\n  ``\"en-us\"`` and :setting:`LANGUAGE_CODE` to ``\"fr\"``.\n\n.. _UPDATE_ON_FETCH:\n\n* ``UPDATE_ON_FETCH``\n\n  Default: ``False``\n\n  This controls whether the toolbar should update to the latest AJAX\n  request when it occurs. This is especially useful when using htmx\n  boosting or similar JavaScript techniques.\n\n\nPanel options\n~~~~~~~~~~~~~\n\n* ``EXTRA_SIGNALS``\n\n  Default: ``[]``\n\n  Panel: signals\n\n  A list of custom signals that might be in your project, defined as the\n  Python path to the signal.\n\n* ``ENABLE_STACKTRACES``\n\n  Default: ``True``\n\n  Panels: cache, SQL\n\n  If set to ``True``, this will show stacktraces for SQL queries and cache\n  calls. Enabling stacktraces can increase the CPU time used when executing\n  queries.\n\n* ``ENABLE_STACKTRACES_LOCALS``\n\n  Default: ``False``\n\n  Panels: cache, SQL\n\n  If set to ``True``, this will show locals() for each stacktrace piece of\n  code for SQL queries and cache calls.\n  Enabling stacktraces locals will increase the CPU time used when executing\n  queries and will give too verbose information in most cases, but is useful\n  for debugging complex cases.\n\n.. caution::\n   This will expose all members from each frame of the stacktrace. This can\n   potentially expose sensitive or private information. It's advised to only\n   use this configuration locally.\n\n* ``HIDE_IN_STACKTRACES``\n\n  Default::\n\n    (\n        \"socketserver\",\n        \"threading\",\n        \"wsgiref\",\n        \"debug_toolbar\",\n        \"django.db\",\n        \"django.core.handlers\",\n        \"django.core.servers\",\n        \"django.utils.decorators\",\n        \"django.utils.deprecation\",\n        \"django.utils.functional\",\n    )\n\n\n  Panels: cache, SQL\n\n  Useful for eliminating server-related entries which can result\n  in enormous DOM structures and toolbar rendering delays.\n\n* ``PRETTIFY_SQL``\n\n  Default: ``True``\n\n  Panel: SQL\n\n  Controls SQL token grouping.\n\n  Token grouping allows pretty print of similar tokens,\n  like aligned indentation for every selected field.\n\n  When set to ``True``, it might cause render slowdowns\n  when a view make long SQL textual queries.\n\n  **Without grouping**::\n\n    SELECT\n        \"auth_user\".\"id\", \"auth_user\".\"password\", \"auth_user\".\"last_login\",\n        \"auth_user\".\"is_superuser\", \"auth_user\".\"username\", \"auth_user\".\"first_name\",\n        \"auth_user\".\"last_name\"\n    FROM \"auth_user\"\n    WHERE \"auth_user\".\"username\" = '''test_username'''\n    LIMIT 21\n\n  **With grouping**::\n\n    SELECT \"auth_user\".\"id\",\n       \"auth_user\".\"password\",\n       \"auth_user\".\"last_login\",\n       \"auth_user\".\"is_superuser\",\n       \"auth_user\".\"username\",\n       \"auth_user\".\"first_name\",\n       \"auth_user\".\"last_name\",\n      FROM \"auth_user\"\n    WHERE \"auth_user\".\"username\" = '''test_username'''\n    LIMIT 21\n\n* ``PROFILER_CAPTURE_PROJECT_CODE``\n\n  Default: ``True``\n\n  Panel: profiling\n\n  When enabled this setting will include all project function calls in the\n  panel. Project code is defined as files in the path defined at\n  ``settings.BASE_DIR``. If you install dependencies under\n  ``settings.BASE_DIR`` in a directory other than ``sites-packages`` or\n  ``dist-packages`` you may need to disable this setting.\n\n* ``PROFILER_MAX_DEPTH``\n\n  Default: ``10``\n\n  Panel: profiling\n\n  This setting affects the depth of function calls in the profiler's\n  analysis.\n\n* ``PROFILER_THRESHOLD_RATIO``\n\n  Default: ``8``\n\n  Panel: profiling\n\n  This setting affects the which calls are included in the profile. A higher\n  value will include more function calls. A lower value will result in a faster\n  render of the profiling panel, but will exclude data.\n\n  This value is used to determine the threshold of cumulative time to include\n  the nested functions. The threshold is calculated by the root calls'\n  cumulative time divided by this ratio.\n\n* ``SHOW_TEMPLATE_CONTEXT``\n\n  Default: ``True``\n\n  Panel: templates\n\n  If set to ``True`` then a template's context will be included with it in the\n  template debug panel. Turning this off is useful when you have large\n  template contexts, or you have template contexts with lazy data structures\n  that you don't want to be evaluated.\n\n* ``SKIP_TEMPLATE_PREFIXES``\n\n  Default: ``('django/forms/widgets/', 'admin/widgets/')``\n\n  Panel: templates.\n\n  Templates starting with those strings are skipped when collecting\n  rendered templates and contexts. Template-based form widgets are\n  skipped by default because the panel HTML can easily grow to hundreds\n  of megabytes with many form fields and many options.\n\n* ``SKIP_TOOLBAR_QUERIES``\n\n  Default: ``True``\n\n  Panel: SQL\n\n  The debug toolbar can generate queries if ``TOOLBAR_STORE_CLASS`` is set to\n  use ``DatabaseStore``. This setting controls whether those queries are\n  tracked in the ``SQLPanel``. Set this to ``False`` to see the debug\n  toolbar's queries.\n\n* ``SQL_WARNING_THRESHOLD``\n\n  Default: ``500``\n\n  Panel: SQL\n\n  The SQL panel highlights queries that took more that this amount of time,\n  in milliseconds, to execute.\n\nHere's what a slightly customized toolbar configuration might look like::\n\n    # This example is unlikely to be appropriate for your project.\n    DEBUG_TOOLBAR_CONFIG = {\n        # Toolbar options\n        'RESULTS_CACHE_SIZE': 3,\n        'SHOW_COLLAPSED': True,\n        # Panel options\n        'SQL_WARNING_THRESHOLD': 100,   # milliseconds\n    }\n\nHere's an example of using a persistent store to keep debug data between server\nrestarts::\n\n    DEBUG_TOOLBAR_CONFIG = {\n        'TOOLBAR_STORE_CLASS': 'debug_toolbar.store.DatabaseStore',\n        'RESULTS_CACHE_SIZE': 100,  # Store up to 100 requests\n    }\n\nTheming support\n---------------\nThe debug toolbar uses CSS variables to define fonts and colors. This allows\nchanging fonts and colors without having to override many individual CSS rules.\nFor example, if you preferred Roboto instead of the default list of fonts you\ncould add a **debug_toolbar/base.html** template override to your project:\n\n.. code-block:: django\n\n    {% extends 'debug_toolbar/base.html' %}\n\n    {% block css %}{{ block.super }}\n    <style>\n        :root {\n            --djdt-font-family-primary: 'Roboto', sans-serif;\n        }\n    </style>\n    {% endblock %}\n\nThe list of CSS variables are defined at\n`debug_toolbar/static/debug_toolbar/css/toolbar.css\n<https://github.com/django-commons/django-debug-toolbar/blob/main/debug_toolbar/static/debug_toolbar/css/toolbar.css>`_\n"
  },
  {
    "path": "docs/contributing.rst",
    "content": "Contributing\n============\n\nThis is a `Django Commons <https://github.com/django-commons>`_ project. By contributing you agree\nto abide by the `Contributor Code of Conduct <https://github.com/django-commons/membership/blob/main/CODE_OF_CONDUCT.md>`_.\n\nBug reports and feature requests\n--------------------------------\n\nYou can report bugs and request features in the `bug tracker\n<https://github.com/django-commons/django-debug-toolbar/issues>`_.\n\nPlease search the existing database for duplicates before filing an issue.\n\n.. _code:\n\nCode\n----\n\nThe code is available `on GitHub\n<https://github.com/django-commons/django-debug-toolbar>`_. Unfortunately, the\nrepository contains old and flawed objects, so if you have set\n`fetch.fsckObjects\n<https://github.com/git/git/blob/0afbf6caa5b16dcfa3074982e5b48e27d452dbbb/Documentation/config.txt#L1381>`_\nyou'll have to deactivate it for this repository::\n\n    git clone --config fetch.fsckobjects=false https://github.com/django-commons/django-debug-toolbar.git\n\nOnce you've obtained a checkout, you should create a virtualenv_ and install\nthe libraries required for working on the Debug Toolbar::\n\n    $ python -m pip install --group dev --group docs\n\n.. _virtualenv: https://virtualenv.pypa.io/\n\nYou can run now run the example application::\n\n    $ DJANGO_SETTINGS_MODULE=example.settings python -m django migrate\n    $ DJANGO_SETTINGS_MODULE=example.settings python -m django runserver\n\nFor convenience, there's an alias for the second command::\n\n    $ make example\n\nThe default password is ``p``, it can be overridden by setting the environment\nvariable ``DJANGO_SUPERUSER_PASSWORD``.\n\nLook at ``example/settings.py`` for running the example with another database\nthan SQLite.\n\nArchitecture\n------------\n\nThere is high-level information on how the Django Debug Toolbar is structured\nin the :doc:`architecture documentation <architecture>`.\n\nTests\n-----\n\nOnce you've set up a development environment as explained above, you can run\nthe test suite for the versions of Django and Python installed in that\nenvironment using the SQLite database::\n\n    $ make test\n\nYou can enable coverage measurement during tests::\n\n    $ make coverage\n\nYou can also run the test suite on all supported versions of Django and\nPython::\n\n    $ tox\n\nThis is strongly recommended before committing changes to Python code.\n\nThe test suite includes frontend tests written with Selenium. Since they're\nannoyingly slow, they're disabled by default. You can run them as follows::\n\n    $ make test_selenium\n\nor by setting the ``DJANGO_SELENIUM_TESTS`` environment variable::\n\n    $ DJANGO_SELENIUM_TESTS=true make test\n    $ DJANGO_SELENIUM_TESTS=true make coverage\n    $ DJANGO_SELENIUM_TESTS=true tox\n\nNote that by default, ``tox`` enables the Selenium tests for a single test\nenvironment.  To run the entire ``tox`` test suite with all Selenium tests\ndisabled, run the following::\n\n    $ DJANGO_SELENIUM_TESTS= tox\n\nTo test via ``tox`` against other databases, you'll need to create the user,\ndatabase and assign the proper permissions. For PostgreSQL in a ``psql``\nshell (note this allows the debug_toolbar user the permission to create\ndatabases)::\n\n    psql> CREATE USER debug_toolbar WITH PASSWORD 'debug_toolbar';\n    psql> ALTER USER debug_toolbar CREATEDB;\n    psql> CREATE DATABASE debug_toolbar;\n    psql> GRANT ALL PRIVILEGES ON DATABASE debug_toolbar to debug_toolbar;\n\nFor MySQL/MariaDB in a ``mysql`` shell::\n\n    mysql> CREATE DATABASE debug_toolbar;\n    mysql> CREATE USER 'debug_toolbar'@'localhost' IDENTIFIED BY 'debug_toolbar';\n    mysql> GRANT ALL PRIVILEGES ON debug_toolbar.* TO 'debug_toolbar'@'localhost';\n    mysql> GRANT ALL PRIVILEGES ON test_debug_toolbar.* TO 'debug_toolbar'@'localhost';\n\n\nStyle\n-----\n\nThe Django Debug Toolbar uses `ruff <https://github.com/astral-sh/ruff/>`__ to\nformat and lint Python code. The toolbar uses `pre-commit\n<https://pre-commit.com>`__ to automatically apply our style guidelines when a\ncommit is made. Set up pre-commit before committing with::\n\n    $ pre-commit install\n\nIf necessary you can bypass pre-commit locally with::\n\n    $ git commit --no-verify\n\nNote that it runs on CI.\n\nTo reformat the code manually use::\n\n    $ pre-commit run --all-files\n\n\nTyping\n------\n\nThe Debug Toolbar has been accepting patches which add type hints to the code\nbase, as long as the types themselves do not cause any problems or obfuscate\nthe intent.\n\nThe maintainers are not committed to adding type hints and are not requiring\nnew code to have type hints at this time. This may change in the future.\n\n\nPatches\n-------\n\nPlease submit `pull requests\n<https://github.com/django-commons/django-debug-toolbar/pulls>`_!\n\nThe Debug Toolbar includes a limited but growing test suite. If you fix a bug\nor add a feature code, please consider adding proper coverage in the test\nsuite, especially if it has a chance for a regression.\n\nTranslations\n------------\n\nTranslation efforts are coordinated on `Transifex\n<https://explore.transifex.com/django-debug-toolbar/django-debug-toolbar/>`_.\n\nHelp translate the Debug Toolbar in your language!\n\nMailing list\n------------\n\nThis project doesn't have a mailing list at this time. If you wish to discuss\na topic, please open an issue on GitHub.\n\nMaking a release\n----------------\n\nPrior to a release, the English ``.po`` file must be updated with ``make\ntranslatable_strings`` and pushed to Transifex. Once translators have done\ntheir job, ``.po`` files must be downloaded with ``make update_translations``.\n\nYou will need to\n`install the Transifex CLI <https://developers.transifex.com/docs/cli>`_.\n\nTo publish a release you have to be a `django-debug-toolbar project lead at\nDjango Commons <https://github.com/django-commons/django-debug-toolbar>`__.\n\nThe release itself requires the following steps:\n\n#. Update supported Python and Django versions:\n\n   - ``pyproject.toml`` options ``requires-python``, ``dependencies``,\n     and ``classifiers``\n   - ``README.rst``\n\n   Commit.\n\n#. Update the screenshot in ``README.rst``.\n\n   .. code-block:: console\n\n       $ make example/django-debug-toolbar.png\n\n   Commit.\n\n#. Bump version numbers in ``docs/changes.rst``, ``docs/conf.py``,\n   ``README.rst``, and ``debug_toolbar/__init__.py``.\n   Add the release date to ``docs/changes.rst``. Commit.\n\n#. Tag the new version.\n\n#. Push the commit and the tag.\n\n#. Publish the release from the GitHub actions workflow.\n\n#. **After the publishing completed** edit the automatically created GitHub\n   release to include the release notes (you may use GitHub's \"Generate release\n   notes\" button for this).\n\n\nBuilding the documentation locally\n----------------------------------\n\nThe project's documentation is built using `Sphinx <https://www.sphinx-doc.org>`_.\nYou can generate it locally to preview your changes before submitting a pull\nrequest.\n\n\nPrerequisites\n--------------\n\nBefore building the documentation, ensure that all dependencies are installed\nas described in :ref:`the setup instructions <code>`.\n\nAdditionally, to build the documentation with proper spell checking,\nyou need to install:\n\n- **Enchant Library** - This is required by the sphinxcontrib-spelling\n        extension via the pyenchant package. For detailed installation\n        instructions, see the\n        `pyenchant installation documentation <https://pyenchant.github.io/pyenchant/install.html#installing-the-enchant-c-library>`_.\n\n\n\n\nUsing Tox (Cross-Platform)\n------------------------------------\n\nTo build the documentation using Tox, run from the project root:\n\n.. code-block:: bash\n\n    tox -e docs -- html\n\nThis will generate the HTML files in ``docs/_build/html/``.\n\nYou can then open the documentation in your browser:\n\n- **Linux:** ``xdg-open docs/_build/html/index.html``\n- **macOS:** ``open docs/_build/html/index.html``\n- **Windows:** ``start docs\\_build\\html\\index.html``\n\n*Tox automatically installs the necessary dependencies, so you don’t need\nto activate a virtual environment manually.*\n\n\nTroubleshooting\n----------------\n\n\nIf you encounter an error about a missing dependency such as\n``sphinx-build: command not found``, ensure that your virtual environment is\nactivated and all dependencies are installed:\n\n.. code-block:: bash\n\n    pip install --group dev --group docs\n\nAlternatively, you can build the documentation using Tox, which automatically\nhandles dependencies and environment setup:\n\n.. code-block:: bash\n\n    tox -e docs -- html\n"
  },
  {
    "path": "docs/index.rst",
    "content": "Django Debug Toolbar\n====================\n\n.. toctree::\n   :maxdepth: 2\n\n   installation\n   configuration\n   checks\n   tips\n   panels\n   commands\n   resources\n   changes\n   contributing\n   architecture\n"
  },
  {
    "path": "docs/installation.rst",
    "content": "Installation\n============\n\nProcess\n-------\n\nEach of the following steps needs to be configured for the Debug Toolbar to be\nfully functional.\n\n.. warning::\n\n    The Debug Toolbar now supports `Django's asynchronous views <https://docs.djangoproject.com/en/dev/topics/async/>`_ and ASGI environment, but\n    still lacks the capability for handling concurrent requests.\n\n1. Install the Package\n^^^^^^^^^^^^^^^^^^^^^^\n\nThe recommended way to install the Debug Toolbar is via pip_:\n\n.. code-block:: console\n\n    $ python -m pip install django-debug-toolbar\n\nIf you aren't familiar with pip, you may also obtain a copy of the\n``debug_toolbar`` directory and add it to your Python path.\n\n.. _pip: https://pip.pypa.io/\n\nTo test an upcoming release, you can install the in-development version\ninstead with the following command:\n\n.. code-block:: console\n\n    $ python -m pip install -e git+https://github.com/django-commons/django-debug-toolbar.git#egg=django-debug-toolbar\n\nIf you're upgrading from a previous version, you should review the\n:doc:`change log <changes>` and look for specific upgrade instructions.\n\n2. Check for Prerequisites\n^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe Debug Toolbar requires two things from core Django. These are already\nconfigured in Django’s default ``startproject`` template, so in most cases you\nwill already have these set up.\n\nFirst, ensure that ``'django.contrib.staticfiles'`` is in your\n``INSTALLED_APPS`` setting, and `configured properly\n<https://docs.djangoproject.com/en/stable/howto/static-files/>`_:\n\n.. code-block:: python\n\n    INSTALLED_APPS = [\n        # ...\n        \"django.contrib.staticfiles\",\n        # ...\n    ]\n\n    STATIC_URL = \"static/\"\n\nSecond, ensure that your ``TEMPLATES`` setting contains a\n``DjangoTemplates`` backend whose ``APP_DIRS`` options is set to ``True``:\n\n.. code-block:: python\n\n    TEMPLATES = [\n        {\n            \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n            \"APP_DIRS\": True,\n            # ...\n        }\n    ]\n\n3. Install the App\n^^^^^^^^^^^^^^^^^^\n\nAdd ``\"debug_toolbar\"`` to your ``INSTALLED_APPS`` setting:\n\n.. code-block:: python\n\n    INSTALLED_APPS = [\n        # ...\n        \"debug_toolbar\",\n        # ...\n    ]\n.. note:: Check  out the configuration example in the\n   `example app\n   <https://github.com/django-commons/django-debug-toolbar/tree/main/example>`_\n   to learn how to set up the toolbar to function smoothly while running\n   your tests.\n\n4. Add the URLs\n^^^^^^^^^^^^^^^\n\nAdd django-debug-toolbar's URLs to your project's URLconf:\n\n.. code-block:: python\n\n    from django.urls import include, path\n    from debug_toolbar.toolbar import debug_toolbar_urls\n\n    urlpatterns = [\n        # ... the rest of your URLconf goes here ...\n    ] + debug_toolbar_urls()\n\nBy default this uses the ``__debug__`` prefix for the paths, but you can\nuse any prefix that doesn't clash with your application's URLs.\n\n\n5. Add the Middleware\n^^^^^^^^^^^^^^^^^^^^^\n\nThe Debug Toolbar is mostly implemented in a middleware. Add it to your\n``MIDDLEWARE`` setting:\n\n.. code-block:: python\n\n    MIDDLEWARE = [\n        # ...\n        \"debug_toolbar.middleware.DebugToolbarMiddleware\",\n        # ...\n    ]\n\n.. warning::\n\n    The order of ``MIDDLEWARE`` is important. You should include the Debug\n    Toolbar middleware as early as possible in the list. However, it must come\n    after any other middleware that encodes the response's content, such as\n    :class:`~django.middleware.gzip.GZipMiddleware`.\n\n.. _internal-ips:\n\n6. Configure Internal IPs\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe Debug Toolbar is shown only if your IP address is listed in Django’s\n:setting:`INTERNAL_IPS` setting.  This means that for local\ndevelopment, you *must* add ``\"127.0.0.1\"`` to :setting:`INTERNAL_IPS`.\nYou'll need to create this setting if it doesn't already exist in your\nsettings module:\n\n.. code-block:: python\n\n   INTERNAL_IPS = [\n       # ...\n       \"127.0.0.1\",\n       # ...\n   ]\n\nYou can change the logic of determining whether or not the Debug Toolbar\nshould be shown with the :ref:`SHOW_TOOLBAR_CALLBACK <SHOW_TOOLBAR_CALLBACK>`\noption.\n\n.. warning::\n\n    If using Docker you can use\n    ``debug_toolbar.middleware.show_toolbar_with_docker`` as your\n    ``SHOW_TOOLBAR_CALLBACK`` which attempts to automatically look up the\n    Docker gateway IP and treat it as an allowable internal IP so that the\n    toolbar is shown to you.\n\n7. Disable the toolbar when running tests (optional)\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nIf you're running tests in your project you shouldn't activate the toolbar. You\ncan do this by adding another setting:\n\n.. code-block:: python\n\n    TESTING = \"test\" in sys.argv or \"PYTEST_VERSION\" in os.environ\n\n    if not TESTING:\n        INSTALLED_APPS = [\n            *INSTALLED_APPS,\n            \"debug_toolbar\",\n        ]\n        MIDDLEWARE = [\n            \"debug_toolbar.middleware.DebugToolbarMiddleware\",\n            *MIDDLEWARE,\n        ]\n\nYou should also modify your URLconf file:\n\n.. code-block:: python\n\n    from django.conf import settings\n\n    if not settings.TESTING:\n        from debug_toolbar.toolbar import debug_toolbar_urls\n\n        urlpatterns = [\n            *urlpatterns,\n        ] + debug_toolbar_urls()\n\nAlternatively, you can check out the :ref:`IS_RUNNING_TESTS <IS_RUNNING_TESTS>`\noption.\n\nTroubleshooting\n---------------\n\nIf the toolbar doesn't appear, check your browser's development console for\nerrors. These errors can often point to one of the issues discussed in the\nsection below. Note that the toolbar only shows up for pages with an HTML body\ntag, which is absent in the templates of the Django Polls tutorial.\n\nIncorrect MIME type for toolbar.js\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWhen this error occurs, the development console shows an error similar to:\n\n.. code-block:: text\n\n    Loading module from “http://127.0.0.1:8000/static/debug_toolbar/js/toolbar.js” was blocked because of a disallowed MIME type (“text/plain”).\n\nOn some platforms (commonly on Windows O.S.), the Django ``runserver``\ncommand may use incorrect content types for static assets. To guess content\ntypes, Django relies on the :mod:`mimetypes` module from the Python standard\nlibrary, which itself relies on the underlying platform's map files.\n\nThe easiest workaround is to add the following to your ``settings.py`` file.\nThis forces the MIME type for ``.js`` files:\n\n.. code-block:: python\n\n    import mimetypes\n    mimetypes.add_type(\"application/javascript\", \".js\", True)\n\nAlternatively, you can try to fix your O.S. configuration. If you find improper\ncontent types for certain files, it is most likely that the platform's map\nfiles are incorrect or need to be updated. This can be achieved, for example:\n\n- On Red Hat distributions, install or update the ``mailcap`` package.\n- On Debian distributions, install or update the ``mime-support`` package.\n- On Windows O.S., edit the keys under ``HKEY_CLASSES_ROOT`` in the Windows\n  registry.\n\nCross-Origin Request Blocked\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe Debug Toolbar loads a `JavaScript module`_. Typical local development using\nDjango ``runserver`` is not impacted. However, if your application server and\nstatic files server are at different origins, you may see `CORS errors`_ in\nyour browser's development console:\n\n.. code-block:: text\n\n    Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost/static/debug_toolbar/js/toolbar.js. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).\n\nOr\n\n.. code-block:: text\n\n    Access to script at 'http://localhost/static/debug_toolbar/js/toolbar.js' from origin 'http://localhost:8000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.\n\nTo resolve, configure your static files server to add the\n`Access-Control-Allow-Origin header`_ with the origin of the application\nserver. For example, if your application server is at ``http://example.com``,\nand your static files are served by NGINX, add:\n\n.. code-block:: nginx\n\n    add_header Access-Control-Allow-Origin http://example.com;\n\nAnd for Apache:\n\n.. code-block:: apache\n\n    Header add Access-Control-Allow-Origin http://example.com\n\n.. _JavaScript module: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules\n.. _CORS errors: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSMissingAllowOrigin\n.. _Access-Control-Allow-Origin header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin\n\nDjango Channels & Async\n^^^^^^^^^^^^^^^^^^^^^^^\n\nThe Debug Toolbar currently has experimental support for async projects.\nThe Debug Toolbar is compatible with the following exceptions:\n\n- Concurrent requests aren't supported\n- ``TimerPanel``, ``RequestPanel`` and ``ProfilingPanel`` can't be used\n  in async contexts.\n- Django Channels is not supported yet.\n\nHTMX\n^^^^\n\nIf you're using `HTMX`_ to `boost a page`_ you will need to add the following\nevent handler to your code:\n\n.. code-block:: javascript\n\n    {% if debug %}\n        if (typeof window.htmx !== \"undefined\") {\n            htmx.on(\"htmx:afterSettle\", function(detail) {\n                if (\n                    typeof window.djdt !== \"undefined\"\n                    && detail.target instanceof HTMLBodyElement\n                ) {\n                    djdt.show_toolbar();\n                }\n            });\n        }\n    {% endif %}\n\n\nThe use of ``{% if debug %}`` requires\n`django.template.context_processors.debug`_ be included in the\n``'context_processors'`` option of the `TEMPLATES`_ setting. Django's\ndefault configuration includes this context processor.\n\n\n.. _HTMX: https://htmx.org/\n.. _boost a page: https://htmx.org/docs/#boosting\n.. _django.template.context_processors.debug: https://docs.djangoproject.com/en/4.1/ref/templates/api/#django-template-context-processors-debug\n.. _TEMPLATES: https://docs.djangoproject.com/en/4.1/ref/settings/#std-setting-TEMPLATES\n"
  },
  {
    "path": "docs/make.bat",
    "content": "@ECHO OFF\r\n\r\npushd %~dp0\r\n\r\nREM Command file for Sphinx documentation\r\n\r\nif \"%SPHINXBUILD%\" == \"\" (\r\n\tset SPHINXBUILD=sphinx-build\r\n)\r\nset SOURCEDIR=.\r\nset BUILDDIR=_build\r\n\r\nif \"%1\" == \"\" goto help\r\n\r\n%SPHINXBUILD% >NUL 2>NUL\r\nif errorlevel 9009 (\r\n\techo.\r\n\techo.The 'sphinx-build' command was not found. Make sure you have Sphinx\r\n\techo.installed, then set the SPHINXBUILD environment variable to point\r\n\techo.to the full path of the 'sphinx-build' executable. Alternatively you\r\n\techo.may add the Sphinx directory to PATH.\r\n\techo.\r\n\techo.If you don't have Sphinx installed, grab it from\r\n\techo.http://sphinx-doc.org/\r\n\texit /b 1\r\n)\r\n\r\n%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%\r\ngoto end\r\n\r\n:help\r\n%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%\r\n\r\n:end\r\npopd\r\n"
  },
  {
    "path": "docs/panels.rst",
    "content": "Panels\n======\n\nThe Django Debug Toolbar ships with a series of built-in panels. In addition,\nseveral third-party panels are available.\n\nDefault built-in panels\n-----------------------\n\nThe following panels are enabled by default.\n\nHistory\n~~~~~~~\n\n.. class:: debug_toolbar.panels.history.HistoryPanel\n\nThis panel shows the history of requests made and allows switching to a past\nsnapshot of the toolbar to view that request's stats.\n\n.. caution::\n   If :ref:`RENDER_PANELS <RENDER_PANELS>` configuration option is set to\n   ``True`` or if the server runs with multiple processes, the History Panel\n   will be disabled.\n\nVersions\n~~~~~~~~\n\n.. class:: debug_toolbar.panels.versions.VersionsPanel\n\nShows versions of Python, Django, and installed apps if possible.\n\nTimer\n~~~~~\n\n.. class:: debug_toolbar.panels.timer.TimerPanel\n\nRequest timer.\n\nSettings\n~~~~~~~~\n\n.. class:: debug_toolbar.panels.settings.SettingsPanel\n\nA list of settings in settings.py.\n\nHeaders\n~~~~~~~\n\n.. class:: debug_toolbar.panels.headers.HeadersPanel\n\nThis panels shows the HTTP request and response headers, as well as a\nselection of values from the WSGI environment.\n\nNote that headers set by middleware placed before the debug toolbar middleware\nin ``MIDDLEWARE`` won't be visible in the panel. The WSGI server itself may\nalso add response headers such as ``Date`` and ``Server``.\n\nRequest\n~~~~~~~\n\n.. class:: debug_toolbar.panels.request.RequestPanel\n\nGET/POST/cookie/session variable display.\n\nSQL\n~~~\n\n.. class:: debug_toolbar.panels.sql.SQLPanel\n\nSQL queries including time to execute and links to EXPLAIN each query.\n\nStatic files\n~~~~~~~~~~~~\n\n.. class:: debug_toolbar.panels.staticfiles.StaticFilesPanel\n\nUsed static files and their locations (via the ``staticfiles`` finders).\n\nTemplates\n~~~~~~~~~\n\n.. class:: debug_toolbar.panels.templates.TemplatesPanel\n\nTemplates and context used, and their template paths.\n\nAlerts\n~~~~~~~\n\n.. class:: debug_toolbar.panels.alerts.AlertsPanel\n\nThis panel shows alerts for a set of pre-defined cases:\n\n- Alerts when the response has a form without the\n  ``enctype=\"multipart/form-data\"`` attribute and the form contains\n  a file input.\n\nCache\n~~~~~\n\n.. class:: debug_toolbar.panels.cache.CachePanel\n\nCache queries. Is incompatible with Django's per-site caching.\n\nSignals\n~~~~~~~\n\n.. class:: debug_toolbar.panels.signals.SignalsPanel\n\nList of signals and receivers.\n\nCommunity\n~~~~~~~~~\n\n.. class:: debug_toolbar.panels.community.CommunityPanel\n\nA panel that provides links to the Django Debug Toolbar community.\n\nRedirects\n~~~~~~~~~\n\n.. class:: debug_toolbar.panels.redirects.RedirectsPanel\n\n.. deprecated:: 6.0\n\nThe RedirectsPanel is deprecated and will be removed in a future version.\nThe HistoryPanel now provides the ability to view toolbar data for redirected\nrequests. If you have a use case for this panel, please comment on the\nGitHub issue <https://github.com/django-commons/django-debug-toolbar/issues/2216>`_.\n\nWhen this panel is enabled, the debug toolbar will show an intermediate page\nupon redirect so you can view any debug information prior to redirecting. This\npage will provide a link to the redirect destination you can follow when\nready.\n\nSince this behavior is annoying when you aren't debugging a redirect, this\npanel is included but inactive by default. You can activate it by default with\nthe ``DISABLE_PANELS`` configuration option.\n\nTo further customize the behavior, you can subclass the ``RedirectsPanel``\nand override the ``get_interception_response`` method to manipulate the\nresponse directly. To use a custom ``RedirectsPanel``, you need to replace\nthe original one in ``DEBUG_TOOLBAR_PANELS`` in your ``settings.py``.\n\n.. _profiling-panel:\n\nProfiling\n~~~~~~~~~\n\n.. class:: debug_toolbar.panels.profiling.ProfilingPanel\n\nProfiling information for the processing of the request.\n\nThis panel is included but inactive by default. You can activate it by default\nwith the ``DISABLE_PANELS`` configuration option.\n\nFor version of Python 3.12 and later you need to use\n``python -m manage runserver --nothreading``\nConcurrent requests don't work with the profiling panel.\n\nThe panel will include all function calls made by your project if you're using\nthe setting ``settings.BASE_DIR`` to point to your project's root directory.\nIf a function is in a file within that directory and does not include\n``\"/site-packages/\"`` or ``\"/dist-packages/\"`` in the path, it will be\nincluded.\n\nThird-party panels\n------------------\n\n.. note:: Third-party panels aren't officially supported!\n\n    The authors of the Django Debug Toolbar maintain a list of third-party\n    panels, but they can't vouch for the quality of each of them. Please\n    report bugs to their authors.\n\nIf you'd like to add a panel to this list, please submit a pull request!\n\nFlame Graphs\n~~~~~~~~~~~~\n\nURL: https://gitlab.com/living180/pyflame\n\nPath: ``pyflame.djdt.panel.FlamegraphPanel``\n\nDisplays a flame graph for visualizing the performance profile of the request,\nusing Brendan Gregg's `flamegraph.pl script\n<https://github.com/brendangregg/FlameGraph/flamegraph.pl>`_ to perform the\nheavy lifting.\n\nLDAP Tracing\n~~~~~~~~~~~~\n\nURL: https://github.com/danyi1212/django-windowsauth\n\nPath: ``windows_auth.panels.LDAPPanel``\n\nLDAP Operations performed during the request, including timing, request and response messages,\nthe entries received, write changes list, stack-tracing and error debugging.\nThis panel also shows connection usage metrics when it is collected.\n`Check out the docs <https://django-windowsauth.readthedocs.io/en/latest/howto/debug_toolbar.html>`_.\n\nLine Profiler\n~~~~~~~~~~~~~\n\nURL: https://github.com/mikekeda/django-debug-toolbar-line-profiler\n\nPath: ``debug_toolbar_line_profiler.panel.ProfilingPanel``\n\nThis package provides a profiling panel that incorporates output from\nline_profiler_.\n\n.. _line_profiler: https://github.com/rkern/line_profiler\n\nMail\n~~~~~~~~\n\nURL: https://github.com/scuml/django-mail-panel\n\nPath: ``mail_panel.panels.MailToolbarPanel``\n\nThis panel captures and displays emails sent from your application.\n\nMemcache\n~~~~~~~~\n\nURL: https://github.com/ross/memcache-debug-panel\n\nPath: ``memcache_toolbar.panels.memcache.MemcachePanel`` or\n``memcache_toolbar.panels.pylibmc.PylibmcPanel``\n\nThis panel tracks memcached usage. It currently supports both the pylibmc and\nmemcache libraries.\n\nMongoDB\n~~~~~~~\n\nURL: https://github.com/hmarr/django-debug-toolbar-mongo\n\nPath: ``debug_toolbar_mongo.panel.MongoDebugPanel``\n\nAdds MongoDB debugging information.\n\nMrBenn Toolbar Plugin\n~~~~~~~~~~~~~~~~~~~~~\n\nURL: https://github.com/andytwoods/mrbenn\n\nPath: ``mrbenn_panel.panel.MrBennPanel``\n\nAllows you to quickly open template files and views directly in your IDE!\nIn addition to the path above, you need to add ``mrbenn_panel`` in\n``INSTALLED_APPS``\n\nNeo4j\n~~~~~\n\nURL: https://github.com/robinedwards/django-debug-toolbar-neo4j-panel\n\nPath: ``neo4j_panel.Neo4jPanel``\n\nTrace neo4j rest API calls in your Django application, this also works for\nneo4django and neo4jrestclient, support for py2neo is on its way.\n\nPympler\n~~~~~~~\n\nURL: https://pythonhosted.org/Pympler/django.html\n\nPath: ``pympler.panels.MemoryPanel``\n\nShows process memory information (virtual size, resident set size) and model\ninstances for the current request.\n\nRequest History\n~~~~~~~~~~~~~~~\n\nURL: https://github.com/djsutho/django-debug-toolbar-request-history\n\nPath: ``ddt_request_history.panels.request_history.RequestHistoryPanel``\n\nSwitch between requests to view their stats. Also adds support for viewing\nstats for AJAX requests.\n\nRequests\n~~~~~~~~\n\nURL: https://github.com/marceltschoppch/django-requests-debug-toolbar\n\nPath: ``requests_panel.panel.RequestsDebugPanel``\n\nLists HTTP requests made with the popular `requests <https://requests.readthedocs.io/>`_ library.\n\nTemplate Profiler\n~~~~~~~~~~~~~~~~~\n\nURL: https://github.com/node13h/django-debug-toolbar-template-profiler\n\nPath: ``template_profiler_panel.panels.template.TemplateProfilerPanel``\n\nShows template render call duration and distribution on the timeline.\nLightweight. Compatible with WSGI servers which reuse threads for multiple\nrequests (Werkzeug).\n\nTemplate Timings\n~~~~~~~~~~~~~~~~\n\nURL: https://github.com/orf/django-debug-toolbar-template-timings\n\nPath: ``template_timings_panel.panels.TemplateTimings.TemplateTimings``\n\nDisplays template rendering times for your Django application.\n\nVCS Info\n~~~~~~~~\n\nURL: https://github.com/giginet/django-debug-toolbar-vcs-info\n\nPath: ``vcs_info_panel.panels.GitInfoPanel``\n\nDisplays VCS status (revision, branch, latest commit log and more) of your\nDjango application.\n\nuWSGI Stats\n~~~~~~~~~~~\n\nURL: https://github.com/unbit/django-uwsgi\n\nPath: ``django_uwsgi.panels.UwsgiPanel``\n\nDisplays uWSGI stats (workers, applications, spooler jobs and more).\n\nAPI for third-party panels\n--------------------------\n\nThird-party panels must subclass :class:`~debug_toolbar.panels.Panel`,\naccording to the public API described below. Unless noted otherwise, all\nmethods are optional.\n\nPanels can ship their own templates, static files and views.\n\nAny views defined for the third-party panel use the following decorators:\n\n- ``debug_toolbar.decorators.require_show_toolbar`` - Prevents unauthorized\n  access to the view. This decorator is compatible with async views.\n- ``debug_toolbar.decorators.render_with_toolbar_language`` - Supports\n  internationalization for any content rendered by the view. This will render\n  the response with the :ref:`TOOLBAR_LANGUAGE <TOOLBAR_LANGUAGE>` rather than\n  :setting:`LANGUAGE_CODE`.\n\nThere is no public CSS API at this time.\n\n.. autoclass:: debug_toolbar.panels.Panel\n\n    .. autoattribute:: debug_toolbar.panels.Panel.nav_title\n\n    .. autoattribute:: debug_toolbar.panels.Panel.nav_subtitle\n\n    .. autoattribute:: debug_toolbar.panels.Panel.has_content\n\n    .. autoattribute:: debug_toolbar.panels.Panel.title\n\n    .. autoattribute:: debug_toolbar.panels.Panel.template\n\n    .. autoattribute:: debug_toolbar.panels.Panel.content\n\n    .. autoattribute:: debug_toolbar.panels.Panel.scripts\n\n    .. automethod:: debug_toolbar.panels.Panel.ready\n\n    .. automethod:: debug_toolbar.panels.Panel.get_urls\n\n    .. automethod:: debug_toolbar.panels.Panel.enable_instrumentation\n\n    .. automethod:: debug_toolbar.panels.Panel.disable_instrumentation\n\n    .. automethod:: debug_toolbar.panels.Panel.record_stats\n\n    .. automethod:: debug_toolbar.panels.Panel.get_stats\n\n    .. automethod:: debug_toolbar.panels.Panel.process_request\n\n    .. automethod:: debug_toolbar.panels.Panel.generate_server_timing\n\n    .. automethod:: debug_toolbar.panels.Panel.generate_stats\n\n    .. automethod:: debug_toolbar.panels.Panel.get_headers\n\n    .. automethod:: debug_toolbar.panels.Panel.run_checks\n\n.. autoclass:: debug_toolbar._stubs.GetResponse\n\n.. _javascript-api:\n\nJavaScript API\n~~~~~~~~~~~~~~\n\nPanel templates should include any JavaScript files they need. There are a few\ncommon methods available.\n\n.. js:function:: djdt.close\n\n    Closes the topmost level (window/panel/toolbar)\n\n.. js:function:: djdt.cookie.get(key)\n\n    This is a helper function to fetch values stored in the cookies.\n\n    :param key: The key for the value to be fetched.\n\n.. js:function:: djdt.cookie.set(key, value, options)\n\n    This is a helper function to set a value stored in the cookies.\n\n    :param key: The key to be used.\n\n    :param value: The value to be set.\n\n    :param options: The options for the value to be set. It should contain the\n        properties ``expires`` and ``path``. The properties ``domain``,\n        ``secure`` and ``samesite`` are also supported. ``samesite`` defaults\n        to ``lax`` if not provided.\n\n.. js:function:: djdt.hide_toolbar\n\n    Closes any panels and hides the toolbar.\n\n.. js:function:: djdt.show_toolbar\n\n    Shows the toolbar. This can be used to re-render the toolbar when reloading the\n    entire DOM. For example, then using `HTMX's boosting`_.\n\n.. _HTMX's boosting: https://htmx.org/docs/#boosting\n\nEvents\n^^^^^^\n\n.. js:attribute:: djdt.panel.render\n\n    This is an event raised when a panel is rendered. It has the property\n    ``detail.panelId`` which identifies which panel has been loaded. This\n    event can be useful when creating custom scripts to process the HTML\n    further.\n\n    An example of this for the ``CustomPanel`` would be:\n\n.. code-block:: javascript\n\n    import { $$ } from \"./utils.js\";\n    function addCustomMetrics() {\n        // Logic to process/add custom metrics here.\n\n        // Be sure to cover the case of this function being called twice\n        // due to file being loaded asynchronously.\n    }\n    const djDebug = document.getElementById(\"djDebug\");\n    $$.onPanelRender(djDebug, \"CustomPanel\", addCustomMetrics);\n    // Since a panel's scripts are loaded asynchronously, it's possible that\n    // the above statement would occur after the djdt.panel.render event has\n    // been raised. To account for that, the rendering function should be\n    // called here as well.\n    addCustomMetrics();\n"
  },
  {
    "path": "docs/resources.rst",
    "content": "Resources\n=========\n\nThis section includes resources that can be used to learn more about\nthe Django Debug Toolbar.\n\nTutorials\n---------\n\nDjango Debugging Tutorial\n^^^^^^^^^^^^^^^^^^^^^^^^^\n\nOriginally presented as an in-person workshop at DjangoCon US 2022, this\ntutorial by **Tim Schilling** covers debugging techniques in Django. Follow\nalong independently using the slides and GitHub repository.\n\n* `View the tutorial details on the conference website <https://2022.djangocon.us/tutorials/it-doesnt-work-a-djangonauts-debugging/>`__\n* `Follow along with the GitHub repository <https://github.com/tim-schilling/debug-tutorial/>`__\n* `View the slides on Google Docs <https://docs.google.com/presentation/d/1dmeFD5kGsukQaMinU0BJQyyCeu5ZGR4drc0pJilT10Y/edit?usp=share_link>`__\n* Last updated: February 13, 2025.\n* Estimated time to complete: 1-2 hours.\n\nMastering Django Debug Toolbar: Efficient Debugging and Optimization Techniques\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThis tutorial by **Bob Belderbos** provides an in-depth look at effectively\nusing Django Debug Toolbar to debug Django applications, covering installation,\nconfiguration, and practical usage.\n\n* `Watch on YouTube <https://www.youtube.com/watch?v=c5riXBYFxLk>`__\n* Published: May 13, 2023.\n* Duration: 11 minutes.\n\nTalks\n-----\n\nA Related Matter: Optimizing Your Web App by Using Django Debug Toolbar\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nPresented at DjangoCon US 2024 by **Christopher Adams**, this talk delves into\noptimizing web applications using Django Debug Toolbar, focusing on SQL query\nanalysis and performance improvements.\n\n* `View the talk details on the conference website <https://2024.djangocon.us/talks/a-related-matter-optimizing-your-webapp-by-using-django-debug-toolbar-select-related-and-prefetch-related/>`__\n* `Watch on DjangoTV <https://djangotv.com/videos/djangocon-us/2024/a-related-matter-optimizing-your-webapp-by-using-django-debug-toolbar-with-christopher-adams/>`__\n* Published: December 6, 2024.\n* Duration: 26 minutes.\n\nFast on My Machine: How to Debug Slow Requests in Production\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nPresented at DjangoCon Europe 2024 by **Raphael Michel**, this talk explores\ndebugging slow requests in production. While not focused on Django Debug\nToolbar, it highlights performance issues the tool can help diagnose.\n\n* `View the talk details on the conference website <https://pretalx.evolutio.pt/djangocon-europe-2024/talk/QGLCYX/>`__\n* `Watch on DjangoTV <https://djangotv.com/videos/djangocon-europe/2024/djangocon-europe-2024-fast-on-my-machine-how-to-debug-slow-requests-in-production/>`__\n* Published: July 11, 2024.\n* Duration: 23 minutes.\n\nWant to Add Your Content Here?\n------------------------------\n\nHave a great tutorial or talk about Django Debug Toolbar? We'd love to\nshowcase it! If your content helps developers improve their debugging skills,\nfollow our :doc:`contributing guidelines <contributing>` to submit it.\n\nTo ensure relevant and accessible content, please check the following\nbefore submitting:\n\n1. Does it at least partially focus on the Django Debug Toolbar?\n2. Does the content show a version of Django that is currently supported?\n3. What language is the tutorial in and what languages are the captions\n   available in?\n\nTalks and tutorials that cover advanced debugging techniques,\nperformance optimization, and real-world applications are particularly\nwelcome.\n"
  },
  {
    "path": "docs/spelling_wordlist.txt",
    "content": "Hatchling\nHotwire\nJazzband\nMakefile\nPympler\nRoboto\nTransifex\nWerkzeug\naenable\najax\nasgi\nasync\nbackend\nbackends\nbackported\nbiome\ncheckbox\ncontrib\ncsp\ndeduplicated\ndicts\ndjango\nfallbacks\nflamegraph\nflatpages\nfrontend\nhtmx\ninlining\ninstrumentation\nisort\njQuery\njinja\njrestclient\njs\nmargins\nmemcache\nmemcached\nmiddleware\nmiddlewares\nmixin\nmousedown\nmouseup\nmulti\nneo\nnothreading\npaddings\npre\nprofiler\npsycopg\npy\npyenchant\npyflame\npylibmc\npytest\npyupgrade\nquerysets\nrefactoring\nreinitializing\nresizing\nrunserver\nspellchecking\nsphinxcontrib\nspooler\nstacktrace\nstacktraces\nstartup\nstaticfiles\ntheming\ntimeline\ntox\nuWSGI\nunhandled\nunhashable\nvalidator\n"
  },
  {
    "path": "docs/tips.rst",
    "content": "Tips\n====\n\nThe toolbar isn't displayed!\n----------------------------\n\nThe Debug Toolbar will only display when ``DEBUG = True`` in your project's\nsettings (see :ref:`Show Toolbar Callback <SHOW_TOOLBAR_CALLBACK>`) and your\nIP address must also match an entry in your project's ``INTERNAL_IPS`` setting\n(see :ref:`internal-ips`).  It will also only display if the MIME type of the\nresponse is either ``text/html`` or ``application/xhtml+xml`` and contains a\nclosing ``</body>`` tag.\n\nBe aware of middleware ordering and other middleware that may intercept\nrequests and return responses. Putting the debug toolbar middleware *after* the\n``FlatpageFallbackMiddleware`` middleware, for example, means the toolbar will\nnot show up on flatpages.\n\nCheck your browser's caching\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nBrowsers have become more aggressive with caching static assets, such as\nJavaScript and CSS files. Check your browser's development console, and if\nyou see errors, try a hard browser refresh or clearing your cache. There\nshould be an option on the network panel to disable caching, enable that\nat least temporarily to make sure you're using the latest static assets.\n\nWorking with htmx and Turbo\n----------------------------\n\nLibraries such as `htmx <https://htmx.org/>`_ and\n`Turbo <https://turbo.hotwired.dev/>`_ need additional configuration to retain\nthe toolbar handle element through page renders. This can be done by\nconfiguring the :ref:`ROOT_TAG_EXTRA_ATTRS <ROOT_TAG_EXTRA_ATTRS>` to include\nthe relevant JavaScript library's attribute.\n\nhtmx\n~~~~\n\nThe attribute `htmx <https://htmx.org/>`_ uses is\n`hx-preserve <https://htmx.org/attributes/hx-preserve/>`_.\n\nUpdate your settings to include:\n\n.. code-block:: python\n\n    DEBUG_TOOLBAR_CONFIG = {\n        \"ROOT_TAG_EXTRA_ATTRS\": \"hx-preserve\"\n    }\n\nHotwire Turbo\n~~~~~~~~~~~~~\n\nThe attribute `Turbo <https://turbo.hotwired.dev/>`_ uses is\n`data-turbo-permanent <https://turbo.hotwired.dev/reference/attributes>`_\n\nUpdate your settings to include:\n\n.. code-block:: python\n\n    DEBUG_TOOLBAR_CONFIG = {\n        \"ROOT_TAG_EXTRA_ATTRS\": \"data-turbo-permanent\"\n    }\n\n\nPerformance considerations\n--------------------------\n\nThe Debug Toolbar is designed to introduce as little overhead as possible in\nthe rendering of pages. However, depending on your project, the overhead may\nbecome noticeable. In extreme cases, it can make development impractical.\nHere's a breakdown of the performance issues you can run into and their\nsolutions.\n\nProblems\n~~~~~~~~\n\nThe Debug Toolbar works in two phases. First, it gathers data while Django\nhandles a request and stores this data in memory. Second, when you open a\npanel in the browser, it fetches the data on the server and displays it.\n\nIf you're seeing excessive CPU or memory consumption while browsing your site,\nyou must optimize the \"gathering\" phase. If displaying a panel is slow, you\nmust optimize the \"rendering\" phase.\n\nCulprits\n~~~~~~~~\n\nThe SQL panel may be the culprit if your view performs many SQL queries. You\nshould attempt to minimize the number of SQL queries, but this isn't always\npossible, for instance if you're using a CMS and have disabled caching for\ndevelopment.\n\nThe cache panel is very similar to the SQL panel, except it isn't always a bad\npractice to make many cache queries in a view.\n\nThe template panel becomes slow if your views or context processors return\nlarge contexts and your templates have complex inheritance or inclusion\nschemes.\n\nSolutions\n~~~~~~~~~\n\nIf the \"gathering\" phase is too slow, you can disable problematic panels\ntemporarily by deselecting the checkbox at the top right of each panel. That\nchange will apply to the next request. If you don't use some panels at all,\nyou can remove them permanently by customizing the ``DEBUG_TOOLBAR_PANELS``\nsetting.\n\nBy default, data gathered during the last 25 requests is kept in memory. This\nallows you to use the toolbar on a page even if you have browsed to a few\nother pages since you first loaded that page. You can reduce memory\nconsumption by setting the ``RESULTS_CACHE_SIZE`` configuration option to a\nlower value. At worst, the toolbar will tell you that the data you're looking\nfor isn't available anymore.\n\nIf the \"rendering\" phase is too slow, refrain from clicking on problematic\npanels :) Or reduce the amount of data gathered and rendered by these panels\nby disabling some configuration options that are enabled by default:\n\n- ``ENABLE_STACKTRACES`` for the SQL and cache panels,\n- ``SHOW_TEMPLATE_CONTEXT`` for the template panel.\n- ``PROFILER_CAPTURE_PROJECT_CODE`` and ``PROFILER_THRESHOLD_RATIO`` for the\n  profiling panel.\n\nAlso, check ``SKIP_TEMPLATE_PREFIXES`` when you're using template-based\nform widgets.\n"
  },
  {
    "path": "example/README.rst",
    "content": "README\n======\n\nAbout\n-----\n\nThis sample project demonstrates how to use the debug toolbar. It is designed\nto run under the latest stable version of Django.\n\nIt also provides a few test pages to ensure the debug toolbar doesn't\ninterfere with common JavaScript frameworks.\n\nHow to\n------\n\nThe example project requires a working installation of Django and a few other\npackages::\n\n    $ python -m pip install --group dev\n\nThe following command must run from the root directory of Django Debug Toolbar,\ni.e. the directory that contains ``example/``::\n\n    $ make example\n\nThis will create a database, superuser, and run the Django development server.\nThe superuser's username will be the same as the current OS user and the\npassword is \"p\".\n\nIf you'd like to run these steps individually, use the following commands.\nAgain, run from the root directory of Django Debug Toolbar.\n\nCreate a database::\n\n    $ python example/manage.py migrate\n\nCreate a superuser::\n\n    $ python example/manage.py createsuperuser\n\nRun the Django development server::\n\n    $ python example/manage.py runserver\n\nYou can change the database used by specifying the ``DB_BACKEND``\nenvironment variable::\n\n    $ DB_BACKEND=postgresql python example/manage.py migrate\n    $ DB_BACKEND=postgresql python example/manage.py runserver\n\nUsing an asynchronous (ASGI) server:\n\nInstall [Daphne](https://pypi.org/project/daphne/) first:\n\n    $ python -m pip install daphne\n\nThen run the Django development server:\n\n    $ ASYNC_SERVER=true python example/manage.py runserver\n"
  },
  {
    "path": "example/__init__.py",
    "content": ""
  },
  {
    "path": "example/asgi.py",
    "content": "\"\"\"\nASGI config for example_async project.\n\nIt exposes the ASGI callable as a module-level variable named ``application``.\n\nFor more information on this file, see\nhttps://docs.djangoproject.com/en/stable/howto/deployment/asgi/\n\"\"\"\n\nimport os\n\nfrom django.core.asgi import get_asgi_application\n\nos.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"example.async_.settings\")\n\napplication = get_asgi_application()\n"
  },
  {
    "path": "example/async_/__init__.py",
    "content": ""
  },
  {
    "path": "example/async_/settings.py",
    "content": "\"\"\"Django settings for example project.\"\"\"\n\nfrom ..settings import *  # noqa: F403\n\nROOT_URLCONF = \"example.async_.urls\"\n"
  },
  {
    "path": "example/async_/urls.py",
    "content": "from django.urls import path\n\nfrom example.async_ import views\nfrom example.urls import urlpatterns as sync_urlpatterns\n\nurlpatterns = [\n    path(\"async/db/\", views.async_db_view, name=\"async_db_view\"),\n    *sync_urlpatterns,\n]\n"
  },
  {
    "path": "example/async_/views.py",
    "content": "from django.contrib.auth.models import User\nfrom django.http import JsonResponse\n\n\nasync def async_db_view(request):\n    names = []\n    async for user in User.objects.all():\n        names.append(user.username)\n    return JsonResponse({\"names\": names})\n"
  },
  {
    "path": "example/manage.py",
    "content": "#!/usr/bin/env python\nimport os\nimport sys\n\nsys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))\n\nif __name__ == \"__main__\":\n    os.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"example.settings\")\n\n    from django.core.management import execute_from_command_line\n\n    execute_from_command_line(sys.argv)\n"
  },
  {
    "path": "example/screenshot.py",
    "content": "import argparse\nimport importlib\nimport os\nimport signal\nimport subprocess\nfrom time import sleep\n\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.common.keys import Keys\nfrom selenium.webdriver.support import expected_conditions as EC\nfrom selenium.webdriver.support.wait import WebDriverWait\n\n\ndef parse_args():\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\"--browser\", required=True)\n    parser.add_argument(\"--headless\", action=\"store_true\")\n    parser.add_argument(\"--outfile\", \"-o\", required=True)\n    parser.add_argument(\"--width\", type=int, default=900)\n    parser.add_argument(\"--height\", type=int, default=700)\n    return parser.parse_args()\n\n\ndef create_webdriver_options(browser, headless):\n    mod = importlib.import_module(f\"selenium.webdriver.{browser}.options\")\n    options = mod.Options()\n    if headless:\n        options.headless = True\n    return options\n\n\ndef create_webdriver(browser, headless):\n    mod = importlib.import_module(f\"selenium.webdriver.{browser}.webdriver\")\n    return mod.WebDriver(options=create_webdriver_options(browser, headless))\n\n\ndef example_server():\n    proc = subprocess.Popen([\"make\", \"example\"])\n    # `make example` runs a few things before runserver.\n    sleep(2)\n    return proc\n\n\ndef set_viewport_size(selenium, width, height):\n    script = \"\"\"\n        return [\n            window.outerWidth - window.innerWidth + arguments[0],\n            window.outerHeight - window.innerHeight + arguments[1],\n        ];\n    \"\"\"\n    window_width, window_height = selenium.execute_script(script, width, height)\n    selenium.set_window_size(window_width, window_height)\n\n\ndef submit_form(selenium, data):\n    url = selenium.current_url\n    for name, value in data.items():\n        el = selenium.find_element(By.NAME, name)\n        el.send_keys(value)\n    el.send_keys(Keys.RETURN)\n    WebDriverWait(selenium, timeout=5).until(EC.url_changes(url))\n\n\ndef main():\n    args = parse_args()\n    with example_server() as p:\n        try:\n            with create_webdriver(args.browser, args.headless) as selenium:\n                set_viewport_size(selenium, args.width, args.height)\n\n                selenium.get(\"http://localhost:8000/admin/login/\")\n                submit_form(selenium, {\"username\": os.environ[\"USER\"], \"password\": \"p\"})\n\n                selenium.get(\"http://localhost:8000/admin/auth/user/\")\n                # Check if SQL Panel is already visible:\n                sql_panel = selenium.find_element(By.ID, \"djdt-SQLPanel\")\n                if not sql_panel:\n                    # Open the admin sidebar.\n                    el = selenium.find_element(By.ID, \"djDebugToolbarHandle\")\n                    el.click()\n                    sql_panel = selenium.find_element(By.ID, \"djdt-SQLPanel\")\n                # Open the SQL panel.\n                sql_panel.click()\n\n                selenium.save_screenshot(args.outfile)\n        finally:\n            p.send_signal(signal.SIGTERM)\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "example/settings.py",
    "content": "\"\"\"Django settings for example project.\"\"\"\n\nimport os\nimport sys\n\nBASE_DIR = os.path.dirname(os.path.dirname(__file__))\n\n\n# Quick-start development settings - unsuitable for production\n\n\nSECRET_KEY = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\"\n\nDEBUG = True\n\nINTERNAL_IPS = [\"127.0.0.1\", \"::1\"]\n\n# Application definition\n\nINSTALLED_APPS = [\n    *([\"daphne\"] if os.getenv(\"ASYNC_SERVER\", False) else []),  # noqa: FBT003\n    \"django.contrib.admin\",\n    \"django.contrib.auth\",\n    \"django.contrib.contenttypes\",\n    \"django.contrib.sessions\",\n    \"django.contrib.messages\",\n    \"django.contrib.staticfiles\",\n]\n\nMIDDLEWARE = [\n    \"django.middleware.security.SecurityMiddleware\",\n    \"whitenoise.middleware.WhiteNoiseMiddleware\",\n    \"django.contrib.sessions.middleware.SessionMiddleware\",\n    \"django.middleware.common.CommonMiddleware\",\n    \"django.middleware.csrf.CsrfViewMiddleware\",\n    \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n    \"django.contrib.messages.middleware.MessageMiddleware\",\n    \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"example.urls\"\n\nSTATIC_URL = \"/static/\"\n\nTEMPLATES = [\n    {\n        \"NAME\": \"jinja2\",\n        \"BACKEND\": \"django.template.backends.jinja2.Jinja2\",\n        \"APP_DIRS\": True,\n        \"DIRS\": [os.path.join(BASE_DIR, \"example\", \"templates\", \"jinja2\")],\n    },\n    {\n        \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n        \"APP_DIRS\": True,\n        \"DIRS\": [os.path.join(BASE_DIR, \"example\", \"templates\")],\n        \"OPTIONS\": {\n            \"debug\": True,\n            \"context_processors\": [\n                \"django.template.context_processors.debug\",\n                \"django.template.context_processors.request\",\n                \"django.contrib.auth.context_processors.auth\",\n                \"django.contrib.messages.context_processors.messages\",\n            ],\n        },\n    },\n]\n\nUSE_TZ = True\n\nWSGI_APPLICATION = \"example.wsgi.application\"\nASGI_APPLICATION = \"example.asgi.application\"\n\n\n# Cache and database\n\nCACHES = {\"default\": {\"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\"}}\n\nDATABASES = {\n    \"default\": {\n        \"ENGINE\": \"django.db.backends.sqlite3\",\n        \"NAME\": os.path.join(BASE_DIR, \"example\", \"db.sqlite3\"),\n    }\n}\n\n# To use another database, set the DB_BACKEND environment variable.\nif os.environ.get(\"DB_BACKEND\", \"\").lower() == \"postgresql\":\n    # See docs/contributing for instructions on configuring PostgreSQL.\n    DATABASES = {\n        \"default\": {\n            \"ENGINE\": \"django.db.backends.postgresql\",\n            \"NAME\": \"debug_toolbar\",\n            \"USER\": \"debug_toolbar\",\n            \"PASSWORD\": \"debug_toolbar\",\n        }\n    }\nif os.environ.get(\"DB_BACKEND\", \"\").lower() == \"mysql\":\n    # See docs/contributing for instructions on configuring MySQL/MariaDB.\n    DATABASES = {\n        \"default\": {\n            \"ENGINE\": \"django.db.backends.mysql\",\n            \"NAME\": \"debug_toolbar\",\n            \"USER\": \"debug_toolbar\",\n            \"PASSWORD\": \"debug_toolbar\",\n        }\n    }\n\nSTATICFILES_DIRS = [os.path.join(BASE_DIR, \"example\", \"static\")]\n\n# Only enable the toolbar when we're in debug mode and we're\n# not running tests. Django will change DEBUG to be False for\n# tests, so we can't rely on DEBUG alone.\nENABLE_DEBUG_TOOLBAR = DEBUG and \"test\" not in sys.argv\nif ENABLE_DEBUG_TOOLBAR:\n    INSTALLED_APPS += [\n        \"debug_toolbar\",\n    ]\n    MIDDLEWARE += [\n        \"debug_toolbar.middleware.DebugToolbarMiddleware\",\n    ]\n    # Customize the config to support turbo and htmx boosting.\n    DEBUG_TOOLBAR_CONFIG = {\"ROOT_TAG_EXTRA_ATTRS\": \"data-turbo-permanent hx-preserve\"}\n"
  },
  {
    "path": "example/static/test.css",
    "content": "body {\n    color: green;\n}\n"
  },
  {
    "path": "example/templates/async_db.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n    <title>Async DB</title>\n  </head>\n  <body>\n    <h1>Async DB</h1>\n    <p>\n      <span>Value </span>\n      <span>{{ user_count }}</span>\n    </p>\n  </body>\n</html>\n"
  },
  {
    "path": "example/templates/bad_form.html",
    "content": "{% load cache %}\n<!DOCTYPE html>\n<html>\n  <head>\n    <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n    <title>Bad form</title>\n  </head>\n  <body>\n    <h1>Bad form test</h1>\n    <form>\n      <input type=\"file\" name=\"file\" />\n    </form>\n  </body>\n</html>\n"
  },
  {
    "path": "example/templates/cache.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n    <title>Cache</title>\n  </head>\n  <body>\n    <h1>Cache Test</h1>\n    <p>Check the cache panel to see the cache hits and misses.</p>\n  </body>\n</html>\n"
  },
  {
    "path": "example/templates/htmx/boost.html",
    "content": "{% load cache %}\n<!DOCTYPE html>\n<html>\n  <head>\n    <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n    <title>Index of Tests (htmx)</title>\n    <script src=\"//unpkg.com/htmx.org@1.8.4\"></script>\n  </head>\n  <body hx-boost=\"true\">\n    <h1>Index of Tests (htmx) - Page {{ page_num|default:\"1\" }}</h1>\n\n    <p>\n      For the debug panel to remain through page navigation, add the setting:\n      <pre>\nDEBUG_TOOLBAR_CONFIG = {\n  \"ROOT_TAG_EXTRA_ATTRS\": \"hx-preserve\"\n}\n      </pre>\n    </p>\n\n    <ul>\n        <li><a href=\"/admin/\">Django Admin</a></li>\n        <li><a href=\"{% url \"htmx\" %}\">HTMX - Page 1</a></li>\n        <li><a href=\"{% url \"htmx2\" %}\">HTMX- Page 2</a></li>\n    </ul>\n\n    <a href=\"{% url \"home\" %}\">Home</a>\n\n  </body>\n</html>\n"
  },
  {
    "path": "example/templates/index.html",
    "content": "{% load cache %}\n<!DOCTYPE html>\n<html>\n  <head>\n    <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n    <title>Index of Tests</title>\n  </head>\n  <body>\n    <h1>Index of Tests</h1>\n    {% cache 10 index_cache %}\n      <ul>\n        <li><a href=\"{% url 'jinja' %}\">Jinja2</a></li>\n        <li><a href=\"/jquery/\">jQuery 3.3.1</a></li>\n        <li><a href=\"/mootools/\">MooTools 1.6.0</a></li>\n        <li><a href=\"/prototype/\">Prototype 1.7.3.0</a></li>\n        <li><a href=\"{% url 'turbo' %}\">Hotwire Turbo</a></li>\n        <li><a href=\"{% url 'htmx' %}\">htmx</a></li>\n        <li><a href=\"{% url 'cache' %}\">Cache</a></li>\n        <li><a href=\"{% url 'bad_form' %}\">Bad form</a></li>\n      </ul>\n      <p><a href=\"/admin/\">Django Admin</a></p>\n    {% endcache %}\n    <p>\n      <span>Value </span>\n      <span id=\"session-value\">{{ request.session.value|default:0 }}</span>\n      <button id=\"incrementFetch\" data-url=\"{% url 'ajax_increment' %}\" type=\"button\">Increment via fetch</button>\n      <button id=\"incrementXHR\" data-url=\"{% url 'ajax_increment' %}\" type=\"button\">Increment via XHR</button>\n    </p>\n    {% comment %}\n    <button id=\"asyncRequest\" data-url=\"{% url 'async_db_view' %}\" type=\"button\">Make async call</button>\n    {% endcomment %}\n\n  <script>\n    const incrementFetch = document.querySelector(\"#incrementFetch\");\n    const incrementXHR = document.querySelector(\"#incrementXHR\");\n    const asyncButton = document.querySelector(\"#asyncRequest\");\n    const value = document.querySelector(\"#session-value\");\n    incrementFetch.addEventListener(\"click\", function () {\n      fetch(incrementFetch.dataset.url).then( function (response) {\n        response.json().then(function(data) {\n          value.innerHTML = data.value;\n        });\n      });\n    });\n    incrementXHR.addEventListener(\"click\", function () {\n      const xhr = new XMLHttpRequest();\n      xhr.onreadystatechange = () => {\n        if (xhr.readyState === 4) {\n          value.innerHTML = JSON.parse(xhr.response).value;\n        }\n      }\n      xhr.open('GET', incrementXHR.dataset.url, true);\n      xhr.send('');\n    });\n    asyncButton.addEventListener(\"click\", function () {\n      fetch(asyncButton.dataset.url).then( function (response) {\n        response.json().then(function(data) {\n          console.log(data)\n        });\n      });\n    });\n\n  </script>\n  </body>\n</html>\n"
  },
  {
    "path": "example/templates/jinja2/index.jinja",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n    <title>jinja Test</title>\n  </head>\n  <body>\n    <h1>jinja Test</h1>\n    {{ foo }}\n    {% for i in range(10) %}{{ i }}{% endfor %} {# Jinja2 supports range(), Django templates do not #}\n  </body>\n</html>\n"
  },
  {
    "path": "example/templates/jquery/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n    <title>jQuery Test</title>\n    <script src=\"//ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\"></script>\n    <script>\n      $(document).ready(function() {\n          $('p.djdt-hidden').show();\n          $('#v').text($.fn.jquery);\n      });\n    </script>\n  </head>\n  <body>\n    <h1>jQuery Test</h1>\n    <p class=\"djdt-hidden\">If you see this, jQuery <strong id=\"v\"></strong> is working.</p>\n  </body>\n</html>\n"
  },
  {
    "path": "example/templates/mootools/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n    <title>MooTools Test</title>\n    <script src=\"//ajax.googleapis.com/ajax/libs/mootools/1.6.0/mootools.min.js\"></script>\n    <script>\n      window.addEvent('domready', function() {\n          $$('p.djdt-hidden').setStyle('display', 'block');\n          $('v').set('text', MooTools.version);\n      });\n    </script>\n  </head>\n  <body>\n    <h1>MooTools Test</h1>\n    <p class=\"djdt-hidden\">If you see this, MooTools <strong id=\"v\"></strong> is working.</p>\n  </body>\n</html>\n"
  },
  {
    "path": "example/templates/prototype/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n    <title>Prototype Test</title>\n    <script src=\"//ajax.googleapis.com/ajax/libs/prototype/1.7.3.0/prototype.js\"></script>\n    <script>\n      document.observe('dom:loaded', function() {\n          $('showme').removeClassName('djdt-hidden');\n          $('v').textContent = Prototype.Version;\n      });\n    </script>\n  </head>\n  <body>\n    <h1>Prototype Test</h1>\n    <p class=\"djdt-hidden\" id=\"showme\">If you see this, Prototype <strong id=\"v\"></strong> is working.</p>\n  </body>\n</html>\n"
  },
  {
    "path": "example/templates/turbo/index.html",
    "content": "{% load cache %}\n<!DOCTYPE html>\n<html>\n  <head>\n    <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n    <title>Index of Tests</title>\n    <script src=\"//unpkg.com/@hotwired/turbo@7.2.4\"></script>\n  </head>\n  <body>\n    <h1>Turbo Index - Page {{ page_num|default:\"1\" }}</h1>\n\n    <p>\n      For the debug panel to remain through page navigation, add the setting:\n      <pre>\nDEBUG_TOOLBAR_CONFIG = {\n  \"ROOT_TAG_EXTRA_ATTRS\": \"data-turbo-permanent\"\n}\n      </pre>\n    </p>\n    <ul>\n      <li><a href=\"/admin/\">Django Admin</a></li>\n      <li><a href=\"{% url \"turbo\" %}\">Turbo - Page 1</a></li>\n      <li><a href=\"{% url \"turbo2\" %}\">Turbo - Page 2</a></li>\n    </ul>\n\n    <p>\n      <span>Value </span>\n      <span id=\"session-value\">{{ request.session.value|default:0 }}</span>\n      <button id=\"incrementFetch\" data-url=\"{% url 'ajax_increment' %}\" type=\"button\">Increment via fetch</button>\n      <button id=\"incrementXHR\" data-url=\"{% url 'ajax_increment' %}\" type=\"button\">Increment via XHR</button>\n    </p>\n    <script>\n      const incrementFetch = document.querySelector(\"#incrementFetch\");\n      const incrementXHR = document.querySelector(\"#incrementXHR\");\n      const value = document.querySelector(\"#session-value\");\n      incrementFetch.addEventListener(\"click\", function () {\n        fetch(incrementFetch.dataset.url).then( function (response) {\n          response.json().then(function(data) {\n            value.innerHTML = data.value;\n          });\n        });\n      });\n      incrementXHR.addEventListener(\"click\", function () {\n        const xhr = new XMLHttpRequest();\n        xhr.onreadystatechange = () => {\n          if (xhr.readyState === 4) {\n            value.innerHTML = JSON.parse(xhr.response).value;\n          }\n        }\n        xhr.open('GET', incrementXHR.dataset.url, true);\n        xhr.send('');\n      });\n    </script>\n    <a href=\"{% url \"home\" %}\">Home</a>\n  </body>\n</html>\n"
  },
  {
    "path": "example/test_views.py",
    "content": "# Add tests to example app to check how the toolbar is used\n# when running tests for a project.\n# See https://github.com/django-commons/django-debug-toolbar/issues/1405\n\nfrom django.test import TestCase\nfrom django.urls import reverse\n\n\nclass ViewTestCase(TestCase):\n    def test_index(self):\n        response = self.client.get(reverse(\"home\"))\n        assert response.status_code == 200\n"
  },
  {
    "path": "example/urls.py",
    "content": "from django.contrib import admin\nfrom django.urls import path\nfrom django.views.generic import TemplateView\n\nfrom debug_toolbar.toolbar import debug_toolbar_urls\nfrom example.views import (\n    async_db,\n    async_db_concurrent,\n    async_home,\n    cache_view,\n    increment,\n    jinja2_view,\n)\n\nurlpatterns = [\n    path(\"\", TemplateView.as_view(template_name=\"index.html\"), name=\"home\"),\n    path(\n        \"bad-form/\",\n        TemplateView.as_view(template_name=\"bad_form.html\"),\n        name=\"bad_form\",\n    ),\n    path(\"jinja/\", jinja2_view, name=\"jinja\"),\n    path(\"async/\", async_home, name=\"async_home\"),\n    path(\"async/db/\", async_db, name=\"async_db\"),\n    path(\"async/db-concurrent/\", async_db_concurrent, name=\"async_db_concurrent\"),\n    path(\"jquery/\", TemplateView.as_view(template_name=\"jquery/index.html\")),\n    path(\"mootools/\", TemplateView.as_view(template_name=\"mootools/index.html\")),\n    path(\"prototype/\", TemplateView.as_view(template_name=\"prototype/index.html\")),\n    path(\n        \"htmx/boost/\",\n        TemplateView.as_view(template_name=\"htmx/boost.html\"),\n        name=\"htmx\",\n    ),\n    path(\n        \"htmx/boost/2\",\n        TemplateView.as_view(\n            template_name=\"htmx/boost.html\", extra_context={\"page_num\": \"2\"}\n        ),\n        name=\"htmx2\",\n    ),\n    path(\n        \"turbo/\", TemplateView.as_view(template_name=\"turbo/index.html\"), name=\"turbo\"\n    ),\n    path(\n        \"turbo/2\",\n        TemplateView.as_view(\n            template_name=\"turbo/index.html\", extra_context={\"page_num\": \"2\"}\n        ),\n        name=\"turbo2\",\n    ),\n    path(\"cache/\", cache_view, name=\"cache\"),\n    path(\"admin/\", admin.site.urls),\n    path(\"ajax/increment\", increment, name=\"ajax_increment\"),\n] + debug_toolbar_urls()\n"
  },
  {
    "path": "example/views.py",
    "content": "import asyncio\n\nfrom asgiref.sync import sync_to_async\nfrom django.contrib.auth.models import User\nfrom django.core.cache import cache\nfrom django.http import JsonResponse\nfrom django.shortcuts import render\n\n\ndef increment(request):\n    try:\n        value = int(request.session.get(\"value\", 0)) + 1\n    except ValueError:\n        value = 1\n    request.session[\"value\"] = value\n    return JsonResponse({\"value\": value})\n\n\ndef jinja2_view(request):\n    return render(request, \"index.jinja\", {\"foo\": \"bar\"}, using=\"jinja2\")\n\n\nasync def async_home(request):\n    return await sync_to_async(render)(request, \"index.html\")\n\n\nasync def async_db(request):\n    user_count = await User.objects.acount()\n\n    return await sync_to_async(render)(\n        request, \"async_db.html\", {\"user_count\": user_count}\n    )\n\n\nasync def async_db_concurrent(request):\n    # Do database queries concurrently\n    (user_count, _) = await asyncio.gather(\n        User.objects.acount(), User.objects.filter(username=\"test\").acount()\n    )\n\n    return await sync_to_async(render)(\n        request, \"async_db.html\", {\"user_count\": user_count}\n    )\n\n\ndef cache_view(request):\n    cache.set(\"foo\", \"bar\")\n    cache.get(\"foo\")\n    cache.get(\"baz\")\n    return render(request, \"cache.html\")\n"
  },
  {
    "path": "example/wsgi.py",
    "content": "\"\"\"WSGI config for example project.\"\"\"\n\nimport os\n\nfrom django.core.wsgi import get_wsgi_application\n\nos.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"example.settings\")\n\napplication = get_wsgi_application()\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[build-system]\nbuild-backend = \"hatchling.build\"\nrequires = [\n  \"hatchling\",\n]\n\n[project]\nname = \"django-debug-toolbar\"\ndescription = \"A configurable set of panels that display various debug information about the current request/response.\"\nreadme = \"README.rst\"\nlicense = { text = \"BSD-3-Clause\" }\nauthors = [\n  { name = \"Rob Hudson\" },\n]\nrequires-python = \">=3.10\"\nclassifiers = [\n  \"Development Status :: 5 - Production/Stable\",\n  \"Environment :: Web Environment\",\n  \"Framework :: Django\",\n  \"Framework :: Django :: 4.2\",\n  \"Framework :: Django :: 5.1\",\n  \"Framework :: Django :: 5.2\",\n  \"Framework :: Django :: 6.0\",\n  \"Intended Audience :: Developers\",\n  \"License :: OSI Approved :: BSD License\",\n  \"Operating System :: OS Independent\",\n  \"Programming Language :: Python\",\n  \"Programming Language :: Python :: 3 :: Only\",\n  \"Programming Language :: Python :: 3.10\",\n  \"Programming Language :: Python :: 3.11\",\n  \"Programming Language :: Python :: 3.12\",\n  \"Programming Language :: Python :: 3.13\",\n  \"Programming Language :: Python :: 3.14\",\n  \"Topic :: Software Development :: Libraries :: Python Modules\",\n]\ndynamic = [\n  \"version\",\n]\ndependencies = [\n  \"django>=4.2.9\",\n  \"sqlparse>=0.2\",\n]\nurls.Changelog = \"https://django-debug-toolbar.readthedocs.io/en/latest/changes.html\"\nurls.Documentation = \"https://django-debug-toolbar.readthedocs.io/\"\nurls.Download = \"https://pypi.org/project/django-debug-toolbar/\"\nurls.Homepage = \"https://github.com/django-commons/django-debug-toolbar\"\nurls.Issues = \"https://github.com/django-commons/django-debug-toolbar/issues\"\nurls.Source = \"https://github.com/django-commons/django-debug-toolbar\"\n\n[dependency-groups]\ndev = [\n  \"black\",\n  \"coverage[toml]\",\n  \"daphne\",                   # async in Example app\n  \"django\",\n  \"django-csp\",               # Used in tests/test_csp_rendering\n  \"django-template-partials\",\n  \"html5lib\",\n  \"jinja2\",\n  \"pre-commit\",\n  \"pygments\",\n  \"selenium\",\n  \"sqlparse\",\n  \"tox\",\n  \"whitenoise\",               # To avoid dealing with static files\n]\ndocs = [\n  \"sphinx\",\n  \"sphinx-rtd-theme>1\",\n  \"sphinxcontrib-spelling\",\n]\n\n[tool.hatch]\nbuild.targets.wheel.packages = [\n  \"debug_toolbar\",\n]\nversion.path = \"debug_toolbar/__init__.py\"\n\n[tool.ruff]\ntarget-version = \"py310\"\nfix = true\nshow-fixes = true\nlint.extend-select = [\n  \"ASYNC\",  # flake8-async\n  \"B\",      # flake8-bugbear\n  \"C4\",     # flake8-comprehensions\n  \"C90\",    # McCabe cyclomatic complexity\n  \"DJ\",     # flake8-django\n  \"E\",      # pycodestyle errors\n  \"F\",      # Pyflakes\n  \"FBT\",    # flake8-boolean-trap\n  \"I\",      # isort\n  \"INT\",    # flake8-gettext\n  \"PGH\",    # pygrep-hooks\n  \"PIE\",    # flake8-pie\n  \"RUF100\", # Unused noqa directive\n  \"SLOT\",   # flake8-slots\n  \"UP\",     # pyupgrade\n  \"W\",      # pycodestyle warnings\n]\nlint.extend-ignore = [\n  \"B905\",  # Allow zip() without strict=\n  \"E501\",  # Ignore line length violations\n  \"UP031\", # It's not always wrong to use percent-formatting\n]\nlint.per-file-ignores.\"*/migrat*/*\" = [\n  \"N806\", # Allow using PascalCase model names in migrations\n  \"N999\", # Ignore the fact that migration files are invalid module names\n]\nlint.isort.combine-as-imports = true\nlint.mccabe.max-complexity = 16\n\n[tool.coverage]\nrun.branch = true\nrun.parallel = true\nrun.relative_files = true\nrun.source = [\n  \"debug_toolbar\",\n]\npaths.source = [\n  \"src\",\n  \".tox/*/site-packages\",\n]\n# Update coverage badge link in README.rst when fail_under changes\nreport.fail_under = 94\nreport.show_missing = true\nhtml.skip_covered = true\nhtml.skip_empty = true\n"
  },
  {
    "path": "setup.py",
    "content": "#!/usr/bin/env python3\n\nimport sys\n\nsys.stderr.write(\n    \"\"\"\\\n===============================\nUnsupported installation method\n===============================\nThis project no longer supports installation with `python setup.py install`.\nPlease use `python -m pip install .` instead.\n\"\"\"\n)\nsys.exit(1)\n"
  },
  {
    "path": "tests/__init__.py",
    "content": ""
  },
  {
    "path": "tests/additional_static/base.css",
    "content": "body {\n    color: green;\n}\n"
  },
  {
    "path": "tests/base.py",
    "content": "import contextvars\n\nimport html5lib\nfrom asgiref.local import Local\nfrom django.http import HttpResponse\nfrom django.test import (\n    AsyncClient,\n    AsyncRequestFactory,\n    Client,\n    RequestFactory,\n    TestCase,\n    TransactionTestCase,\n)\n\nfrom debug_toolbar.panels import Panel\nfrom debug_toolbar.store import get_store\nfrom debug_toolbar.toolbar import DebugToolbar\n\ndata_contextvar = contextvars.ContextVar(\"djdt_toolbar_test_client\")\n\n\nclass ToolbarTestClient(Client):\n    def request(self, **request):\n        # Use a thread/async task context-local variable to guard against a\n        # concurrent _created signal from a different thread/task.\n        data = Local()\n        data.toolbar = None\n\n        def handle_toolbar_created(sender, toolbar=None, **kwargs):\n            data.toolbar = toolbar\n\n        DebugToolbar._created.connect(handle_toolbar_created)\n        try:\n            response = super().request(**request)\n        finally:\n            DebugToolbar._created.disconnect(handle_toolbar_created)\n        response.toolbar = data.toolbar\n\n        return response\n\n\nclass AsyncToolbarTestClient(AsyncClient):\n    async def request(self, **request):\n        # Use a thread/async task context-local variable to guard against a\n        # concurrent _created signal from a different thread/task.\n        # In cases testsuite will have both regular and async tests or\n        # multiple async tests running in an eventloop making async_client calls.\n        data_contextvar.set(None)\n\n        def handle_toolbar_created(sender, toolbar=None, **kwargs):\n            data_contextvar.set(toolbar)\n\n        DebugToolbar._created.connect(handle_toolbar_created)\n        try:\n            response = await super().request(**request)\n        finally:\n            DebugToolbar._created.disconnect(handle_toolbar_created)\n        response.toolbar = data_contextvar.get()\n\n        return response\n\n\nrf = RequestFactory()\narf = AsyncRequestFactory()\n\n\nclass BaseMixin:\n    _is_async = False\n    client_class = ToolbarTestClient\n    async_client_class = AsyncToolbarTestClient\n\n    panel: Panel | None = None\n    panel_id = None\n\n    def setUp(self):\n        super().setUp()\n        self._get_response = lambda request: HttpResponse()\n        self.request = rf.get(\"/\")\n        if self._is_async:\n            self.request = arf.get(\"/\")\n            self.toolbar = DebugToolbar(self.request, self.get_response_async)\n        else:\n            self.toolbar = DebugToolbar(self.request, self.get_response)\n        self.toolbar.stats = {}\n\n        if self.panel_id:\n            self.panel = self.toolbar.get_panel_by_id(self.panel_id)\n            self.panel.enable_instrumentation()\n        else:\n            self.panel = None\n\n    def tearDown(self):\n        if self.panel:\n            self.panel.disable_instrumentation()\n        super().tearDown()\n\n    def get_response(self, request):\n        return self._get_response(request)\n\n    async def get_response_async(self, request):\n        return self._get_response(request)\n\n    def assertValidHTML(self, content):\n        parser = html5lib.HTMLParser()\n        parser.parseFragment(content)\n        if parser.errors:\n            msg_parts = [\"Invalid HTML:\"]\n            lines = content.split(\"\\n\")\n            for position, errorcode, datavars in parser.errors:\n                msg_parts.append(f\"  {html5lib.constants.E[errorcode]}\" % datavars)\n                msg_parts.append(f\"    {lines[position[0] - 1]}\")\n            raise self.failureException(\"\\n\".join(msg_parts))\n\n    def reload_stats(self):\n        data = self.toolbar.store.panel(self.toolbar.request_id, self.panel_id)\n        self.panel.load_stats_from_store(data)\n\n\nclass BaseTestCase(BaseMixin, TestCase):\n    pass\n\n\nclass BaseMultiDBTestCase(BaseMixin, TransactionTestCase):\n    databases = {\"default\", \"replica\"}\n\n\nclass IntegrationTestCase(TestCase):\n    \"\"\"Base TestCase for tests involving clients making requests.\"\"\"\n\n    def setUp(self):\n        # The HistoryPanel keeps track of previous stores in memory.\n        # This bleeds into other tests and violates their idempotency.\n        # Clear the store before each test.\n        get_store().clear()\n        super().setUp()\n"
  },
  {
    "path": "tests/commands/__init__.py",
    "content": ""
  },
  {
    "path": "tests/commands/test_debugsqlshell.py",
    "content": "import io\nimport sys\n\nfrom django.contrib.auth.models import User\nfrom django.core import management\nfrom django.db import connection\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\n\nif connection.vendor == \"postgresql\":\n    from django.db.backends.postgresql import base as base_module\nelse:\n    from django.db.backends import utils as base_module\n\n\n@override_settings(DEBUG=True)\nclass DebugSQLShellTestCase(TestCase):\n    def setUp(self):\n        self.original_wrapper = base_module.CursorDebugWrapper\n        # Since debugsqlshell monkey-patches django.db.backends.utils, we can\n        # test it simply by loading it, without executing it. But we have to\n        # undo the monkey-patch on exit.\n        command_name = \"debugsqlshell\"\n        app_name = management.get_commands()[command_name]\n        management.load_command_class(app_name, command_name)\n\n    def tearDown(self):\n        base_module.CursorDebugWrapper = self.original_wrapper\n\n    def test_command(self):\n        original_stdout, sys.stdout = sys.stdout, io.StringIO()\n        try:\n            User.objects.count()\n            self.assertIn(\"SELECT COUNT\", sys.stdout.getvalue())\n        finally:\n            sys.stdout = original_stdout\n"
  },
  {
    "path": "tests/context_processors.py",
    "content": "def broken(request):\n    _read = request.non_existing_attribute\n"
  },
  {
    "path": "tests/forms.py",
    "content": "from django import forms\nfrom django.contrib.auth.models import User\n\n\nclass TemplateReprForm(forms.Form):\n    user = forms.ModelChoiceField(queryset=User.objects.all())\n\n    def __repr__(self):\n        return str(self)\n"
  },
  {
    "path": "tests/loaders.py",
    "content": "from django.contrib.auth.models import User\nfrom django.template.loaders.app_directories import Loader\n\n\nclass LoaderWithSQL(Loader):\n    def get_template(self, *args, **kwargs):\n        # Force the template loader to run some SQL. Simulates a CMS.\n        User.objects.all().count()\n        return super().get_template(*args, **kwargs)\n"
  },
  {
    "path": "tests/middleware.py",
    "content": "from django.core.cache import cache\n\n\nclass UseCacheAfterToolbar:\n    \"\"\"\n    This middleware exists to use the cache before and after\n    the toolbar is setup.\n    \"\"\"\n\n    def __init__(self, get_response):\n        self.get_response = get_response\n\n    def __call__(self, request):\n        cache.set(\"UseCacheAfterToolbar.before\", 1)\n        response = self.get_response(request)\n        cache.set(\"UseCacheAfterToolbar.after\", 1)\n        return response\n"
  },
  {
    "path": "tests/models.py",
    "content": "from django.conf import settings\nfrom django.db import models\nfrom django.db.models import JSONField\n\n\nclass NonAsciiRepr:\n    def __repr__(self):\n        return \"nôt åscíì\"\n\n\nclass Binary(models.Model):\n    field = models.BinaryField()\n\n    def __str__(self):\n        return \"\"\n\n\nclass PostgresJSON(models.Model):\n    field = JSONField()\n\n    def __str__(self):\n        return \"\"\n\n\nif settings.USE_GIS:\n    from django.contrib.gis.db import models as gismodels\n\n    class Location(gismodels.Model):\n        point = gismodels.PointField()\n\n        def __str__(self):\n            return \"\"\n"
  },
  {
    "path": "tests/panels/__init__.py",
    "content": ""
  },
  {
    "path": "tests/panels/test_alerts.py",
    "content": "from django.http import HttpResponse, StreamingHttpResponse\nfrom django.template import Context, Template\n\nfrom ..base import BaseTestCase\n\n\nclass AlertsPanelTestCase(BaseTestCase):\n    panel_id = \"AlertsPanel\"\n\n    def test_alert_warning_display(self):\n        \"\"\"\n        Test that the panel (does not) display[s] an alert when there are\n        (no) problems.\n        \"\"\"\n        self.panel.record_stats({\"alerts\": []})\n        self.assertNotIn(\"alerts\", self.panel.nav_subtitle)\n\n        self.panel.record_stats({\"alerts\": [\"Alert 1\", \"Alert 2\"]})\n        self.assertIn(\"2 alerts\", self.panel.nav_subtitle)\n\n    def test_file_form_without_enctype_multipart_form_data(self):\n        \"\"\"\n        Test that the panel displays a form invalid message when there is\n        a file input but encoding not set to multipart/form-data.\n        \"\"\"\n        test_form = '<form id=\"test-form\"><input type=\"file\"></form>'\n        result = self.panel.check_invalid_file_form_configuration(test_form)\n        expected_error = (\n            'Form with id \"test-form\" contains file input, '\n            'but does not have the attribute enctype=\"multipart/form-data\".'\n        )\n        self.assertEqual(result[0][\"alert\"], expected_error)\n        self.assertEqual(len(result), 1)\n\n    def test_file_form_no_id_without_enctype_multipart_form_data(self):\n        \"\"\"\n        Test that the panel displays a form invalid message when there is\n        a file input but encoding not set to multipart/form-data.\n\n        This should use the message when the form has no id.\n        \"\"\"\n        test_form = '<form><input type=\"file\"></form>'\n        result = self.panel.check_invalid_file_form_configuration(test_form)\n        expected_error = (\n            \"Form contains file input, but does not have \"\n            'the attribute enctype=\"multipart/form-data\".'\n        )\n        self.assertEqual(result[0][\"alert\"], expected_error)\n        self.assertEqual(len(result), 1)\n\n    def test_file_form_with_enctype_multipart_form_data(self):\n        test_form = \"\"\"<form id=\"test-form\" enctype=\"multipart/form-data\">\n        <input type=\"file\">\n        </form>\"\"\"\n        result = self.panel.check_invalid_file_form_configuration(test_form)\n\n        self.assertEqual(len(result), 0)\n\n    def test_file_form_with_enctype_multipart_form_data_in_button(self):\n        test_form = \"\"\"<form id=\"test-form\">\n        <input type=\"file\">\n        <input type=\"submit\" formenctype=\"multipart/form-data\">\n        </form>\"\"\"\n        result = self.panel.check_invalid_file_form_configuration(test_form)\n\n        self.assertEqual(len(result), 0)\n\n    def test_referenced_file_input_without_enctype_multipart_form_data(self):\n        test_file_input = \"\"\"<form id=\"test-form\"></form>\n        <input type=\"file\" form = \"test-form\">\"\"\"\n        result = self.panel.check_invalid_file_form_configuration(test_file_input)\n\n        expected_error = (\n            'Input element references form with id \"test-form\", '\n            'but the form does not have the attribute enctype=\"multipart/form-data\".'\n        )\n        self.assertEqual(result[0][\"alert\"], expected_error)\n        self.assertEqual(len(result), 1)\n\n    def test_referenced_file_input_with_enctype_multipart_form_data(self):\n        test_file_input = \"\"\"<form id=\"test-form\" enctype=\"multipart/form-data\">\n        </form>\n        <input type=\"file\" form = \"test-form\">\"\"\"\n        result = self.panel.check_invalid_file_form_configuration(test_file_input)\n\n        self.assertEqual(len(result), 0)\n\n    def test_integration_file_form_without_enctype_multipart_form_data(self):\n        t = Template('<form id=\"test-form\"><input type=\"file\"></form>')\n        c = Context({})\n        rendered_template = t.render(c)\n        response = HttpResponse(content=rendered_template)\n\n        self.panel.generate_stats(self.request, response)\n\n        self.assertIn(\"1 alert\", self.panel.nav_subtitle)\n        self.assertIn(\n            \"Form with id &quot;test-form&quot; contains file input, \"\n            \"but does not have the attribute enctype=&quot;multipart/form-data&quot;.\",\n            self.panel.content,\n        )\n\n    def test_streaming_response(self):\n        \"\"\"Test to check for a streaming response.\"\"\"\n\n        def _render():\n            yield \"ok\"\n\n        response = StreamingHttpResponse(_render())\n\n        self.panel.generate_stats(self.request, response)\n        self.assertEqual(self.panel.get_stats(), {\"alerts\": []})\n"
  },
  {
    "path": "tests/panels/test_async_panel_compatibility.py",
    "content": "from django.http import HttpResponse\nfrom django.test import AsyncRequestFactory, RequestFactory, TestCase\n\nfrom debug_toolbar.panels import Panel\nfrom debug_toolbar.toolbar import DebugToolbar\n\n\nclass MockAsyncPanel(Panel):\n    is_async = True\n\n\nclass MockSyncPanel(Panel):\n    is_async = False\n\n\nclass PanelAsyncCompatibilityTestCase(TestCase):\n    def setUp(self):\n        self.async_factory = AsyncRequestFactory()\n        self.wsgi_factory = RequestFactory()\n\n    def test_panels_with_asgi(self):\n        async_request = self.async_factory.get(\"/\")\n        toolbar = DebugToolbar(async_request, lambda request: HttpResponse())\n\n        async_panel = MockAsyncPanel(toolbar, async_request)\n        sync_panel = MockSyncPanel(toolbar, async_request)\n\n        self.assertTrue(async_panel.enabled)\n        self.assertFalse(sync_panel.enabled)\n\n    def test_panels_with_wsgi(self):\n        wsgi_request = self.wsgi_factory.get(\"/\")\n        toolbar = DebugToolbar(wsgi_request, lambda request: HttpResponse())\n\n        async_panel = MockAsyncPanel(toolbar, wsgi_request)\n        sync_panel = MockSyncPanel(toolbar, wsgi_request)\n\n        self.assertTrue(async_panel.enabled)\n        self.assertTrue(sync_panel.enabled)\n"
  },
  {
    "path": "tests/panels/test_cache.py",
    "content": "from django.core import cache\n\nfrom debug_toolbar.panels.cache import CachePanel\n\nfrom ..base import BaseTestCase\n\n\nclass CachePanelTestCase(BaseTestCase):\n    panel_id = CachePanel.panel_id\n\n    def test_recording(self):\n        self.assertEqual(len(self.panel.calls), 0)\n        cache.cache.set(\"foo\", \"bar\")\n        cache.cache.get(\"foo\")\n        cache.cache.delete(\"foo\")\n        self.assertFalse(cache.cache.touch(\"foo\"))\n        cache.cache.set(\"foo\", \"bar\")\n        self.assertTrue(cache.cache.touch(\"foo\"))\n        # Verify that the cache has a valid clear method.\n        cache.cache.clear()\n        self.assertEqual(len(self.panel.calls), 7)\n\n    def test_recording_caches(self):\n        self.assertEqual(len(self.panel.calls), 0)\n        default_cache = cache.caches[cache.DEFAULT_CACHE_ALIAS]\n        second_cache = cache.caches[\"second\"]\n        default_cache.set(\"foo\", \"bar\")\n        second_cache.get(\"foo\")\n        self.assertEqual(len(self.panel.calls), 2)\n\n    def test_hits_and_misses(self):\n        cache.cache.clear()\n        cache.cache.get(\"foo\")\n        self.assertEqual(self.panel.hits, 0)\n        self.assertEqual(self.panel.misses, 1)\n        cache.cache.set(\"foo\", 1)\n        cache.cache.get(\"foo\")\n        self.assertEqual(self.panel.hits, 1)\n        self.assertEqual(self.panel.misses, 1)\n        cache.cache.get_many([\"foo\", \"bar\"])\n        self.assertEqual(self.panel.hits, 2)\n        self.assertEqual(self.panel.misses, 2)\n        cache.cache.set(\"bar\", 2)\n        cache.cache.get_many(keys=[\"foo\", \"bar\"])\n        self.assertEqual(self.panel.hits, 4)\n        self.assertEqual(self.panel.misses, 2)\n\n    def test_get_or_set_value(self):\n        cache.cache.get_or_set(\"baz\", \"val\")\n        self.assertEqual(cache.cache.get(\"baz\"), \"val\")\n        calls = [\n            (call[\"name\"], call[\"args\"], call[\"kwargs\"]) for call in self.panel.calls\n        ]\n        self.assertEqual(\n            calls,\n            [\n                (\"get_or_set\", (\"baz\", \"val\"), {}),\n                (\"get\", (\"baz\",), {}),\n            ],\n        )\n        self.assertEqual(\n            self.panel.counts,\n            {\n                \"add\": 0,\n                \"get\": 1,\n                \"set\": 0,\n                \"get_or_set\": 1,\n                \"touch\": 0,\n                \"delete\": 0,\n                \"clear\": 0,\n                \"get_many\": 0,\n                \"set_many\": 0,\n                \"delete_many\": 0,\n                \"has_key\": 0,\n                \"incr\": 0,\n                \"decr\": 0,\n                \"incr_version\": 0,\n                \"decr_version\": 0,\n            },\n        )\n\n    def test_get_or_set_does_not_override_existing_value(self):\n        cache.cache.set(\"foo\", \"bar\")\n        cached_value = cache.cache.get_or_set(\"foo\", \"other\")\n        self.assertEqual(cached_value, \"bar\")\n        calls = [\n            (call[\"name\"], call[\"args\"], call[\"kwargs\"]) for call in self.panel.calls\n        ]\n        self.assertEqual(\n            calls,\n            [\n                (\"set\", (\"foo\", \"bar\"), {}),\n                (\"get_or_set\", (\"foo\", \"other\"), {}),\n            ],\n        )\n        self.assertEqual(\n            self.panel.counts,\n            {\n                \"add\": 0,\n                \"get\": 0,\n                \"set\": 1,\n                \"get_or_set\": 1,\n                \"touch\": 0,\n                \"delete\": 0,\n                \"clear\": 0,\n                \"get_many\": 0,\n                \"set_many\": 0,\n                \"delete_many\": 0,\n                \"has_key\": 0,\n                \"incr\": 0,\n                \"decr\": 0,\n                \"incr_version\": 0,\n                \"decr_version\": 0,\n            },\n        )\n\n    def test_insert_content(self):\n        \"\"\"\n        Test that the panel only inserts content after generate_stats and\n        not the process_request.\n        \"\"\"\n        cache.cache.get(\"café\")\n        response = self.panel.process_request(self.request)\n        # ensure the panel does not have content yet.\n        self.assertNotIn(\"café\", self.panel.content)\n        self.panel.generate_stats(self.request, response)\n        self.reload_stats()\n        # ensure the panel renders correctly.\n        content = self.panel.content\n        self.assertIn(\"café\", content)\n        self.assertValidHTML(content)\n        # ensure traces aren't escaped\n        self.assertIn('<span class=\"djdt-path\">', content)\n\n    def test_generate_server_timing(self):\n        self.assertEqual(len(self.panel.calls), 0)\n        cache.cache.set(\"foo\", \"bar\")\n        cache.cache.get(\"foo\")\n        cache.cache.delete(\"foo\")\n\n        self.assertEqual(len(self.panel.calls), 3)\n\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        self.panel.generate_server_timing(self.request, response)\n\n        stats = self.panel.get_stats()\n\n        expected_data = {\n            \"total_time\": {\n                \"title\": \"Cache {} Calls\".format(stats[\"total_calls\"]),\n                \"value\": stats[\"total_time\"],\n            }\n        }\n\n        self.assertEqual(self.panel.get_server_timing_stats(), expected_data)\n\n    def test_backend_alias_is_recorded(self):\n        cache.cache.get(\"foo\")\n        self.assertEqual(self.panel.calls[0][\"backend\"], \"default (LocMemCache)\")\n"
  },
  {
    "path": "tests/panels/test_custom.py",
    "content": "from django.test import override_settings\n\nfrom debug_toolbar.panels import Panel\n\nfrom ..base import IntegrationTestCase\n\n\nclass CustomPanel(Panel):\n    def title(self):\n        return \"Title with special chars &\\\"'<>\"\n\n\n@override_settings(\n    DEBUG=True, DEBUG_TOOLBAR_PANELS=[\"tests.panels.test_custom.CustomPanel\"]\n)\nclass CustomPanelTestCase(IntegrationTestCase):\n    def test_escapes_panel_title(self):\n        response = self.client.get(\"/regular/basic/\")\n        self.assertContains(\n            response,\n            \"\"\"\n            <li id=\"djdt-CustomPanel\" class=\"djDebugPanelButton\">\n            <input type=\"checkbox\" checked title=\"Disable for next and successive requests\" data-cookie=\"djdtCustomPanel\">\n            <a class=\"CustomPanel\" href=\"#\" title=\"Title with special chars &amp;&quot;&#39;&lt;&gt;\">\n            Title with special chars &amp;&quot;&#39;&lt;&gt;\n            </a>\n            </li>\n            \"\"\",\n            html=True,\n        )\n        self.assertContains(\n            response,\n            \"\"\"\n            <div id=\"CustomPanel\" class=\"djdt-panelContent djdt-hidden\">\n            <div class=\"djDebugPanelTitle\">\n            <h3>Title with special chars &amp;&quot;&#39;&lt;&gt;</h3>\n            <button type=\"button\" class=\"djDebugClose\">×</button>\n            </div>\n            <div class=\"djDebugPanelContent\">\n            <div class=\"djdt-loader\"></div>\n            <div class=\"djdt-scroll\"></div>\n            </div>\n            </div>\n            \"\"\",\n            html=True,\n        )\n"
  },
  {
    "path": "tests/panels/test_history.py",
    "content": "import copy\nimport html\n\nfrom django.test import RequestFactory, override_settings\nfrom django.urls import resolve, reverse\n\nfrom debug_toolbar.panels.history import HistoryPanel\nfrom debug_toolbar.panels.redirects import RedirectsPanel\nfrom debug_toolbar.store import get_store\nfrom debug_toolbar.toolbar import DebugToolbar\n\nfrom ..base import BaseTestCase, IntegrationTestCase\n\nrf = RequestFactory()\n\n\nclass HistoryPanelTestCase(BaseTestCase):\n    panel_id = HistoryPanel.panel_id\n\n    def test_disabled(self):\n        config = {\"DISABLE_PANELS\": {\"debug_toolbar.panels.history.HistoryPanel\"}}\n        self.assertTrue(self.panel.enabled)\n        with self.settings(DEBUG_TOOLBAR_CONFIG=config):\n            self.assertFalse(self.panel.enabled)\n\n    def test_post(self):\n        self.request = rf.post(\"/\", data={\"foo\": \"bar\"})\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        data = self.panel.get_stats()[\"data\"]\n        self.assertEqual(data[\"foo\"], \"bar\")\n\n    def test_post_json(self):\n        for data, expected_stats_data in (\n            ({\"foo\": \"bar\"}, {\"foo\": \"bar\"}),\n            (\"\", {}),  # Empty JSON\n            (\"'\", {}),  # Invalid JSON\n        ):\n            with self.subTest(data=data):\n                self.request = rf.post(\n                    \"/\",\n                    data=data,\n                    content_type=\"application/json\",\n                    CONTENT_TYPE=\"application/json\",  # Force django test client to add the content-type even if no data\n                )\n                response = self.panel.process_request(self.request)\n                self.panel.generate_stats(self.request, response)\n                data = self.panel.get_stats()[\"data\"]\n                self.assertDictEqual(data, expected_stats_data)\n\n    def test_urls(self):\n        self.assertEqual(\n            reverse(\"djdt:history_sidebar\"),\n            \"/__debug__/history_sidebar/\",\n        )\n        self.assertEqual(\n            resolve(\"/__debug__/history_sidebar/\").url_name,\n            \"history_sidebar\",\n        )\n        self.assertEqual(\n            reverse(\"djdt:history_refresh\"),\n            \"/__debug__/history_refresh/\",\n        )\n        self.assertEqual(\n            resolve(\"/__debug__/history_refresh/\").url_name,\n            \"history_refresh\",\n        )\n\n\n@override_settings(DEBUG=True)\nclass HistoryViewsTestCase(IntegrationTestCase):\n    PANEL_KEYS = {\n        \"VersionsPanel\",\n        \"TimerPanel\",\n        \"SettingsPanel\",\n        \"HeadersPanel\",\n        \"RequestPanel\",\n        \"SQLPanel\",\n        \"StaticFilesPanel\",\n        \"TemplatesPanel\",\n        \"AlertsPanel\",\n        \"CachePanel\",\n        \"SignalsPanel\",\n        \"CommunityPanel\",\n        \"ProfilingPanel\",\n    }\n\n    def test_history_panel_integration_content(self):\n        \"\"\"Verify the history panel's content renders properly..\"\"\"\n        store = get_store()\n        self.assertEqual(len(list(store.request_ids())), 0)\n\n        data = {\"foo\": \"bar\"}\n        self.client.get(\"/json_view/\", data, content_type=\"application/json\")\n\n        # Check the history panel's stats to verify the toolbar rendered properly.\n        request_ids = list(store.request_ids())\n        self.assertEqual(len(request_ids), 1)\n        toolbar = DebugToolbar.fetch(request_ids[0])\n        content = toolbar.get_panel_by_id(HistoryPanel.panel_id).content\n        self.assertIn(\"bar\", content)\n        self.assertIn('name=\"exclude_history\" value=\"True\"', content)\n\n    def test_history_sidebar_invalid(self):\n        response = self.client.get(reverse(\"djdt:history_sidebar\"))\n        self.assertEqual(response.status_code, 400)\n\n    def test_history_headers(self):\n        \"\"\"Validate the headers injected from the history panel.\"\"\"\n        DebugToolbar.get_observe_request.cache_clear()\n        response = self.client.get(\"/json_view/\")\n        request_id = list(get_store().request_ids())[0]\n        self.assertEqual(response.headers[\"djdt-request-id\"], request_id)\n\n    def test_history_headers_unobserved(self):\n        \"\"\"Validate the headers aren't injected from the history panel.\"\"\"\n        with self.settings(\n            DEBUG_TOOLBAR_CONFIG={\"OBSERVE_REQUEST_CALLBACK\": lambda request: False}\n        ):\n            DebugToolbar.get_observe_request.cache_clear()\n            response = self.client.get(\"/json_view/\")\n            self.assertNotIn(\"djdt-request-id\", response.headers)\n        # Clear it again to avoid conflicting with another test\n        # Specifically, DebugToolbarLiveTestCase.test_ajax_refresh\n        DebugToolbar.get_observe_request.cache_clear()\n\n    def test_history_sidebar(self):\n        \"\"\"Validate the history sidebar view.\"\"\"\n        self.client.get(\"/json_view/\")\n        request_id = list(get_store().request_ids())[0]\n        data = {\"request_id\": request_id, \"exclude_history\": True}\n        response = self.client.get(reverse(\"djdt:history_sidebar\"), data=data)\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(\n            set(response.json()),\n            self.PANEL_KEYS,\n        )\n\n    def test_history_sidebar_includes_history(self):\n        \"\"\"Validate the history sidebar view.\"\"\"\n        self.client.get(\"/json_view/\")\n        panel_keys = copy.copy(self.PANEL_KEYS)\n        panel_keys.add(HistoryPanel.panel_id)\n        panel_keys.add(RedirectsPanel.panel_id)\n        request_id = list(get_store().request_ids())[0]\n        data = {\"request_id\": request_id}\n        response = self.client.get(reverse(\"djdt:history_sidebar\"), data=data)\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(\n            set(response.json()),\n            panel_keys,\n        )\n\n    @override_settings(\n        DEBUG_TOOLBAR_CONFIG={\"RENDER_PANELS\": False, \"RESULTS_CACHE_SIZE\": 1}\n    )\n    def test_history_sidebar_expired_request_id(self):\n        \"\"\"Validate the history sidebar view.\"\"\"\n        self.client.get(\"/json_view/\")\n        request_id = list(get_store().request_ids())[0]\n        data = {\"request_id\": request_id, \"exclude_history\": True}\n        response = self.client.get(reverse(\"djdt:history_sidebar\"), data=data)\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(\n            set(response.json()),\n            self.PANEL_KEYS,\n        )\n        # Make enough requests to unset the original\n        self.client.get(\"/json_view/\")\n\n        # Querying old request_id should return in empty response\n        data = {\"request_id\": request_id, \"exclude_history\": True}\n        response = self.client.get(reverse(\"djdt:history_sidebar\"), data=data)\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(response.json(), {})\n\n        # Querying with latest request_id\n        latest_request_id = list(get_store().request_ids())[0]\n        data = {\"request_id\": latest_request_id, \"exclude_history\": True}\n        response = self.client.get(reverse(\"djdt:history_sidebar\"), data=data)\n        self.assertEqual(response.status_code, 200)\n\n        self.assertEqual(\n            set(response.json()),\n            self.PANEL_KEYS,\n        )\n\n    def test_history_refresh(self):\n        \"\"\"Verify refresh history response has request variables.\"\"\"\n        self.client.get(\"/json_view/\", {\"foo\": \"bar\"}, content_type=\"application/json\")\n        self.client.get(\n            \"/json_view/\", {\"spam\": \"eggs\"}, content_type=\"application/json\"\n        )\n\n        response = self.client.get(\n            reverse(\"djdt:history_refresh\"), data={\"request_id\": \"foo\"}\n        )\n        self.assertEqual(response.status_code, 200)\n        data = response.json()\n        self.assertEqual(len(data[\"requests\"]), 2)\n\n        request_ids = list(get_store().request_ids())\n        self.assertIn(html.escape(request_ids[0]), data[\"requests\"][0][\"content\"])\n        self.assertIn(html.escape(request_ids[1]), data[\"requests\"][1][\"content\"])\n\n        for val in [\"foo\", \"bar\"]:\n            self.assertIn(val, data[\"requests\"][0][\"content\"])\n\n        for val in [\"spam\", \"eggs\"]:\n            self.assertIn(val, data[\"requests\"][1][\"content\"])\n"
  },
  {
    "path": "tests/panels/test_profiling.py",
    "content": "import sys\nimport unittest\n\nfrom django.contrib.auth.models import User\nfrom django.db import IntegrityError, transaction\nfrom django.http import HttpResponse\nfrom django.test.utils import override_settings\n\nfrom debug_toolbar.panels.profiling import ProfilingPanel\n\nfrom ..base import BaseTestCase, IntegrationTestCase\nfrom ..views import listcomp_view, regular_view\n\n\n@override_settings(\n    DEBUG_TOOLBAR_PANELS=[\"debug_toolbar.panels.profiling.ProfilingPanel\"]\n)\nclass ProfilingPanelTestCase(BaseTestCase):\n    panel_id = ProfilingPanel.panel_id\n\n    def test_regular_view(self):\n        self._get_response = lambda request: regular_view(request, \"profiling\")\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        self.assertIn(\"func_list\", self.panel.get_stats())\n        self.assertIn(\"regular_view\", self.panel.content)\n\n    def test_insert_content(self):\n        \"\"\"\n        Test that the panel only inserts content after generate_stats and\n        not the process_request.\n        \"\"\"\n        self._get_response = lambda request: regular_view(request, \"profiling\")\n        response = self.panel.process_request(self.request)\n        # ensure the panel does not have content yet.\n        self.assertNotIn(\"regular_view\", self.panel.content)\n        self.panel.generate_stats(self.request, response)\n        self.reload_stats()\n        # ensure the panel renders correctly.\n        content = self.panel.content\n        self.assertIn(\"regular_view\", content)\n        self.assertIn(\"render\", content)\n        self.assertValidHTML(content)\n        # ensure traces aren't escaped\n        self.assertIn('<span class=\"djdt-path\">', content)\n\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"PROFILER_THRESHOLD_RATIO\": 1})\n    def test_cum_time_threshold(self):\n        \"\"\"\n        Test that cumulative time threshold excludes calls\n        \"\"\"\n        self._get_response = lambda request: regular_view(request, \"profiling\")\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        # ensure the panel renders but doesn't include our function.\n        content = self.panel.content\n        self.assertIn(\"regular_view\", content)\n        self.assertNotIn(\"render\", content)\n        self.assertValidHTML(content)\n\n    @unittest.skipUnless(\n        sys.version_info < (3, 12, 0),\n        \"Python 3.12 no longer contains a frame for list comprehensions.\",\n    )\n    def test_listcomp_escaped(self):\n        self._get_response = lambda request: listcomp_view(request)\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        content = self.panel.content\n        self.assertNotIn('<span class=\"djdt-func\"><listcomp></span>', content)\n        self.assertIn('<span class=\"djdt-func\">&lt;listcomp&gt;</span>', content)\n\n    def test_generate_stats_no_profiler(self):\n        \"\"\"\n        Test generating stats with no profiler.\n        \"\"\"\n        response = HttpResponse()\n        self.assertIsNone(self.panel.generate_stats(self.request, response))\n\n    def test_generate_stats_no_root_func(self):\n        \"\"\"\n        Test generating stats using profiler without root function.\n        \"\"\"\n        response = self.panel.process_request(self.request)\n        self.panel.profiler.clear()\n        self.panel.profiler.enable()\n        self.panel.profiler.disable()\n        self.panel.generate_stats(self.request, response)\n        self.assertNotIn(\"func_list\", self.panel.get_stats())\n\n\n@override_settings(\n    DEBUG=True, DEBUG_TOOLBAR_PANELS=[\"debug_toolbar.panels.profiling.ProfilingPanel\"]\n)\nclass ProfilingPanelIntegrationTestCase(IntegrationTestCase):\n    def test_view_executed_once(self):\n        self.assertEqual(User.objects.count(), 0)\n\n        response = self.client.get(\"/new_user/\")\n        self.assertContains(response, \"Profiling\")\n        self.assertEqual(User.objects.count(), 1)\n\n        with self.assertRaises(IntegrityError), transaction.atomic():\n            response = self.client.get(\"/new_user/\")\n        self.assertEqual(User.objects.count(), 1)\n"
  },
  {
    "path": "tests/panels/test_redirects.py",
    "content": "import copy\n\nfrom django.conf import settings\nfrom django.http import HttpResponse\nfrom django.test import AsyncRequestFactory\n\nfrom debug_toolbar.panels.redirects import RedirectsPanel\n\nfrom ..base import BaseTestCase\n\n\nclass RedirectsPanelTestCase(BaseTestCase):\n    panel_id = RedirectsPanel.panel_id\n\n    def test_regular_response(self):\n        not_redirect = HttpResponse()\n        self._get_response = lambda request: not_redirect\n        response = self.panel.process_request(self.request)\n        self.assertTrue(response is not_redirect)\n\n    def test_not_a_redirect(self):\n        redirect = HttpResponse(status=304)\n        self._get_response = lambda request: redirect\n        response = self.panel.process_request(self.request)\n        self.assertTrue(response is redirect)\n\n    def test_redirect(self):\n        redirect = HttpResponse(status=302)\n        redirect[\"Location\"] = \"http://somewhere/else/\"\n        self._get_response = lambda request: redirect\n        response = self.panel.process_request(self.request)\n        self.assertFalse(response is redirect)\n        self.assertContains(response, \"302 Found\")\n        self.assertContains(response, \"http://somewhere/else/\")\n\n    def test_redirect_with_broken_context_processor(self):\n        TEMPLATES = copy.deepcopy(settings.TEMPLATES)\n        TEMPLATES[1][\"OPTIONS\"][\"context_processors\"] = [\n            \"tests.context_processors.broken\"\n        ]\n\n        with self.settings(TEMPLATES=TEMPLATES):\n            redirect = HttpResponse(status=302)\n            redirect[\"Location\"] = \"http://somewhere/else/\"\n            self._get_response = lambda request: redirect\n            response = self.panel.process_request(self.request)\n            self.assertFalse(response is redirect)\n            self.assertContains(response, \"302 Found\")\n            self.assertContains(response, \"http://somewhere/else/\")\n\n    def test_unknown_status_code(self):\n        redirect = HttpResponse(status=369)\n        redirect[\"Location\"] = \"http://somewhere/else/\"\n        self._get_response = lambda request: redirect\n        response = self.panel.process_request(self.request)\n        self.assertContains(response, \"369 Unknown Status Code\")\n\n    def test_unknown_status_code_with_reason(self):\n        redirect = HttpResponse(status=369, reason=\"Look Ma!\")\n        redirect[\"Location\"] = \"http://somewhere/else/\"\n        self._get_response = lambda request: redirect\n        response = self.panel.process_request(self.request)\n        self.assertContains(response, \"369 Look Ma!\")\n\n    async def test_async_compatibility(self):\n        redirect = HttpResponse(status=302)\n\n        async def get_response(request):\n            return redirect\n\n        await_response = await get_response(self.request)\n        self._get_response = get_response\n\n        self.request = AsyncRequestFactory().get(\"/\")\n        response = await self.panel.process_request(self.request)\n        self.assertIsInstance(response, HttpResponse)\n        self.assertTrue(response is await_response)\n\n    def test_original_response_preserved(self):\n        redirect = HttpResponse(status=302)\n        redirect[\"Location\"] = \"http://somewhere/else/\"\n        self._get_response = lambda request: redirect\n        response = self.panel.process_request(self.request)\n        self.assertFalse(response is redirect)\n        self.assertTrue(hasattr(response, \"original_response\"))\n        self.assertTrue(response.original_response is redirect)\n        self.assertIsNone(response.get(\"Location\"))\n        self.assertEqual(\n            response.original_response.get(\"Location\"), \"http://somewhere/else/\"\n        )\n\n    def test_deprecation_warning(self):\n        \"\"\"Test that a deprecation warning is shown when RedirectsPanel used.\"\"\"\n        redirect = HttpResponse(status=304)\n        redirect[\"Location\"] = \"http://somewhere/else/\"\n        self._get_response = lambda request: redirect\n\n        with self.assertWarns(DeprecationWarning) as cm:\n            self.panel.process_request(self.request)\n\n        self.assertIn(\"RedirectsPanel is deprecated\", str(cm.warning))\n        self.assertIn(\"HistoryPanel\", str(cm.warning))\n"
  },
  {
    "path": "tests/panels/test_request.py",
    "content": "from django.http import QueryDict\nfrom django.test import RequestFactory\n\nfrom debug_toolbar.panels.request import RequestPanel\n\nfrom ..base import BaseTestCase\n\nrf = RequestFactory()\n\n\nclass RequestPanelTestCase(BaseTestCase):\n    panel_id = RequestPanel.panel_id\n\n    def test_non_ascii_session(self):\n        self.request.session = {\"où\": \"où\"}\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        self.assertIn(\"où\", self.panel.content)\n\n    def test_object_with_non_ascii_repr_in_request_params(self):\n        request = rf.get(\"/non_ascii_request/\")\n        response = self.panel.process_request(request)\n        self.panel.generate_stats(request, response)\n        self.assertIn(\"nôt åscíì\", self.panel.content)\n\n    def test_insert_content(self):\n        \"\"\"\n        Test that the panel only inserts content after generate_stats and\n        not the process_request.\n        \"\"\"\n        request = rf.get(\"/non_ascii_request/\")\n        response = self.panel.process_request(request)\n        # ensure the panel does not have content yet.\n        self.assertNotIn(\"nôt åscíì\", self.panel.content)\n        self.panel.generate_stats(request, response)\n        # ensure the panel renders correctly.\n        content = self.panel.content\n        self.assertIn(\"nôt åscíì\", content)\n        self.assertValidHTML(content)\n\n    def test_query_dict_for_request_in_method_get(self):\n        \"\"\"\n        Test verifies the correctness of the statistics generation method\n        in the case when the GET request is class QueryDict\n        \"\"\"\n        self.request.GET = QueryDict(\"foo=bar\")\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        # ensure the panel GET request data is processed correctly.\n        content = self.panel.content\n        self.assertIn(\"foo\", content)\n        self.assertIn(\"bar\", content)\n\n    def test_dict_for_request_in_method_get(self):\n        \"\"\"\n        Test verifies the correctness of the statistics generation method\n        in the case when the GET request is class dict\n        \"\"\"\n        self.request.GET = {\"foo\": \"bar\"}\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        # ensure the panel GET request data is processed correctly.\n        content = self.panel.content\n        self.assertIn(\"foo\", content)\n        self.assertIn(\"bar\", content)\n\n    def test_query_dict_for_request_in_method_post(self):\n        \"\"\"\n        Test verifies the correctness of the statistics generation method\n        in the case when the POST request is class QueryDict\n        \"\"\"\n        self.request.POST = QueryDict(\"foo=bar\")\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        # ensure the panel POST request data is processed correctly.\n        content = self.panel.content\n        self.assertIn(\"foo\", content)\n        self.assertIn(\"bar\", content)\n\n    def test_dict_for_request_in_method_post(self):\n        \"\"\"\n        Test verifies the correctness of the statistics generation method\n        in the case when the POST request is class dict\n        \"\"\"\n        self.request.POST = {\"foo\": \"bar\"}\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        # ensure the panel POST request data is processed correctly.\n        content = self.panel.content\n        self.assertIn(\"foo\", content)\n        self.assertIn(\"bar\", content)\n\n    def test_list_for_request_in_method_post(self):\n        \"\"\"\n        Verify that the toolbar doesn't crash if request.POST contains unexpected data.\n\n        See https://github.com/django-commons/django-debug-toolbar/issues/1621\n        \"\"\"\n        self.request.POST = [{\"a\": 1}, {\"b\": 2}]\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        # ensure the panel POST request data is processed correctly.\n        content = self.panel.content\n        self.assertIn(\"[{&#x27;a&#x27;: 1}, {&#x27;b&#x27;: 2}]\", content)\n\n    def test_namespaced_url(self):\n        request = rf.get(\"/admin/login/\")\n        response = self.panel.process_request(request)\n        self.panel.generate_stats(request, response)\n        panel_stats = self.panel.get_stats()\n        self.assertEqual(panel_stats[\"view_urlname\"], \"admin:login\")\n\n    def test_session_list_sorted_or_not(self):\n        \"\"\"\n        Verify the session is sorted when all keys are strings.\n\n        See  https://github.com/django-commons/django-debug-toolbar/issues/1668\n        \"\"\"\n        self.request.session = {\n            1: \"value\",\n            \"data\": [\"foo\", \"bar\", 1],\n            (2, 3): \"tuple_key\",\n        }\n        data = {\n            \"list\": [(1, \"value\"), (\"data\", [\"foo\", \"bar\", 1]), ((2, 3), \"tuple_key\")]\n        }\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        panel_stats = self.panel.get_stats()\n        self.assertEqual(panel_stats[\"session\"], data)\n\n        self.request.session = {\n            \"b\": \"b-value\",\n            \"a\": \"a-value\",\n        }\n        data = {\"list\": [(\"a\", \"a-value\"), (\"b\", \"b-value\")]}\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        panel_stats = self.panel.get_stats()\n        self.assertEqual(panel_stats[\"session\"], data)\n\n    def test_sensitive_post_data_sanitized(self):\n        \"\"\"Test that sensitive POST data is redacted.\"\"\"\n        self.request.POST = {\"username\": \"testuser\", \"password\": \"secret123\"}\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n\n        # Check that password is redacted in panel content\n        content = self.panel.content\n        self.assertIn(\"username\", content)\n        self.assertIn(\"testuser\", content)\n        self.assertIn(\"password\", content)\n        self.assertNotIn(\"secret123\", content)\n        self.assertIn(\"********************\", content)\n\n    def test_sensitive_get_data_sanitized(self):\n        \"\"\"Test that sensitive GET data is redacted.\"\"\"\n        self.request.GET = {\"api_key\": \"abc123\", \"q\": \"search term\"}\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n\n        # Check that api_key is redacted in panel content\n        content = self.panel.content\n        self.assertIn(\"api_key\", content)\n        self.assertNotIn(\"abc123\", content)\n        self.assertIn(\"********************\", content)\n        self.assertIn(\"q\", content)\n        self.assertIn(\"search term\", content)\n\n    def test_sensitive_cookie_data_sanitized(self):\n        \"\"\"Test that sensitive cookie data is redacted.\"\"\"\n        self.request.COOKIES = {\"session_id\": \"abc123\", \"auth_token\": \"xyz789\"}\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n\n        # Check that auth_token is redacted in panel content\n        content = self.panel.content\n        self.assertIn(\"session_id\", content)\n        self.assertIn(\"abc123\", content)\n        self.assertIn(\"auth_token\", content)\n        self.assertNotIn(\"xyz789\", content)\n        self.assertIn(\"********************\", content)\n\n    def test_sensitive_session_data_sanitized(self):\n        \"\"\"Test that sensitive session data is redacted.\"\"\"\n        self.request.session = {\"user_id\": 123, \"auth_token\": \"xyz789\"}\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n\n        # Check that auth_token is redacted in panel content\n        content = self.panel.content\n        self.assertIn(\"user_id\", content)\n        self.assertIn(\"123\", content)\n        self.assertIn(\"auth_token\", content)\n        self.assertNotIn(\"xyz789\", content)\n        self.assertIn(\"********************\", content)\n\n    def test_querydict_sanitized(self):\n        \"\"\"Test that sensitive data in QueryDict objects is properly redacted.\"\"\"\n        query_dict = QueryDict(\"username=testuser&password=secret123&token=abc456\")\n        self.request.GET = query_dict\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n\n        # Check that sensitive data is redacted in panel content\n        content = self.panel.content\n        self.assertIn(\"username\", content)\n        self.assertIn(\"testuser\", content)\n        self.assertIn(\"password\", content)\n        self.assertNotIn(\"secret123\", content)\n        self.assertIn(\"token\", content)\n        self.assertNotIn(\"abc456\", content)\n        self.assertIn(\"********************\", content)\n"
  },
  {
    "path": "tests/panels/test_settings.py",
    "content": "from django.test import RequestFactory, override_settings\n\nfrom debug_toolbar.panels.settings import SettingsPanel\n\nfrom ..base import BaseTestCase, IntegrationTestCase\n\nrf = RequestFactory()\n\n\nclass SettingsPanelTestCase(BaseTestCase):\n    panel_id = SettingsPanel.panel_id\n\n    def test_panel_recording(self):\n        self.request = rf.post(\"/\", data={\"foo\": \"bar\"})\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n\n        settings = self.panel.get_stats()[\"settings\"]\n        self.assertEqual(settings[\"USE_THOUSAND_SEPARATOR\"], \"False\")\n        self.assertEqual(settings[\"ABSOLUTE_URL_OVERRIDES\"], \"{}\")\n        self.assertEqual(settings[\"EMAIL_HOST\"], \"'localhost'\")\n        self.assertEqual(settings[\"EMAIL_PORT\"], \"25\")\n\n\n@override_settings(DEBUG=True)\nclass SettingsIntegrationTestCase(IntegrationTestCase):\n    def test_panel_title(self):\n        response = self.client.get(\"/regular/basic/\")\n        # The settings module is None due to using Django's UserSettingsHolder\n        # in tests.\n        self.assertContains(\n            response,\n            \"\"\"\n            <li id=\"djdt-SettingsPanel\" class=\"djDebugPanelButton\">\n            <input type=\"checkbox\" checked title=\"Disable for next and successive requests\" data-cookie=\"djdtSettingsPanel\">\n            <a class=\"SettingsPanel\" href=\"#\" title=\"Settings from None\">Settings</a>\n            </li>\n            \"\"\",\n            html=True,\n        )\n        self.assertContains(\n            response,\n            \"\"\"\n            <div id=\"SettingsPanel\" class=\"djdt-panelContent djdt-hidden\">\n            <div class=\"djDebugPanelTitle\">\n            <h3>Settings from None</h3>\n            <button type=\"button\" class=\"djDebugClose\">×</button>\n            </div>\n            <div class=\"djDebugPanelContent\">\n            <div class=\"djdt-loader\"></div>\n            <div class=\"djdt-scroll\"></div>\n            </div>\n            </div>\n            \"\"\",\n            html=True,\n        )\n"
  },
  {
    "path": "tests/panels/test_sql.py",
    "content": "import asyncio\nimport datetime\nimport os\nimport unittest\nfrom unittest.mock import call, patch\n\nimport django\nfrom asgiref.sync import sync_to_async\nfrom django.apps import apps\nfrom django.contrib.auth.models import User\nfrom django.db import connection, transaction\nfrom django.db.backends.utils import CursorDebugWrapper, CursorWrapper\nfrom django.db.models import Count\nfrom django.db.utils import DatabaseError\nfrom django.shortcuts import render\nfrom django.test.utils import override_settings\n\nimport debug_toolbar.panels.sql.tracking as sql_tracking\nfrom debug_toolbar import settings as dt_settings\nfrom debug_toolbar.models import HistoryEntry\nfrom debug_toolbar.panels.sql import SQLPanel, tracking\n\ntry:\n    import psycopg\nexcept ImportError:\n    psycopg = None\n\nfrom ..base import BaseMultiDBTestCase, BaseTestCase\nfrom ..models import Binary, PostgresJSON\n\n\ndef sql_call(*, use_iterator=False):\n    qs = User.objects.all()\n    if use_iterator:\n        qs = qs.iterator()\n    return list(qs)\n\n\ndef sql_call_toolbar_model():\n    \"\"\"Query one of the toolbar's models to test tracking of SQL queries.\"\"\"\n    qs = HistoryEntry.objects.all()\n    return list(qs)\n\n\nasync def async_sql_call_toolbar_model():\n    \"\"\"(async) Query one of the toolbar's models to test tracking of SQL queries.\"\"\"\n    qs = HistoryEntry.objects.all()\n    return await sync_to_async(list)(qs)\n\n\nasync def async_sql_call(*, use_iterator=False):\n    qs = User.objects.all()\n    if use_iterator:\n        qs = qs.iterator()\n    return await sync_to_async(list)(qs)\n\n\nasync def concurrent_async_sql_call(*, use_iterator=False):\n    qs = User.objects.all()\n    if use_iterator:\n        qs = qs.iterator()\n    return await asyncio.gather(sync_to_async(list)(qs), User.objects.acount())\n\n\ndef patch_tracking_ddt_models():\n    \"\"\"\n    Set the tracking.DDT_MODELS constant to the toolbar's models.\n    This only gets configured when the store is set to the DatabaseStore.\n    \"\"\"\n    if (\n        dt_settings.get_config()[\"TOOLBAR_STORE_CLASS\"]\n        == \"debug_toolbar.store.DatabaseStore\"\n    ):\n        apps.get_app_config(\"debug_toolbar\").import_models()\n        tracking.DDT_MODELS = {\n            m._meta.db_table for m in apps.get_app_config(\"debug_toolbar\").get_models()\n        }\n\n\nclass SQLPanelTestCase(BaseTestCase):\n    panel_id = SQLPanel.panel_id\n\n    def test_disabled(self):\n        config = {\"DISABLE_PANELS\": {\"debug_toolbar.panels.sql.SQLPanel\"}}\n        self.assertTrue(self.panel.enabled)\n        with self.settings(DEBUG_TOOLBAR_CONFIG=config):\n            self.assertFalse(self.panel.enabled)\n\n    def test_recording(self):\n        self.assertEqual(len(self.panel._queries), 0)\n\n        sql_call()\n\n        # ensure query was logged\n        self.assertEqual(len(self.panel._queries), 1)\n        query = self.panel._queries[0]\n        self.assertEqual(query[\"alias\"], \"default\")\n        self.assertTrue(\"sql\" in query)\n        self.assertTrue(\"duration\" in query)\n        self.assertTrue(\"stacktrace\" in query)\n\n        # ensure the stacktrace is populated\n        self.assertTrue(len(query[\"stacktrace\"]) > 0)\n\n    def test_assert_num_queries_works(self):\n        \"\"\"\n        Confirm Django's assertNumQueries and CaptureQueriesContext works\n\n        See  https://github.com/django-commons/django-debug-toolbar/issues/1791\n        \"\"\"\n        self.assertEqual(len(self.panel._queries), 0)\n        with self.assertNumQueries(1):\n            sql_call()\n        self.assertEqual(len(self.panel._queries), 1)\n\n    async def test_recording_async(self):\n        self.assertEqual(len(self.panel._queries), 0)\n\n        await async_sql_call()\n\n        # ensure query was logged\n        self.assertEqual(len(self.panel._queries), 1)\n        query = self.panel._queries[0]\n        self.assertEqual(query[\"alias\"], \"default\")\n        self.assertTrue(\"sql\" in query)\n        self.assertTrue(\"duration\" in query)\n        self.assertTrue(\"stacktrace\" in query)\n\n        # ensure the stacktrace is populated\n        self.assertTrue(len(query[\"stacktrace\"]) > 0)\n\n    async def test_recording_concurrent_async(self):\n        self.assertEqual(len(self.panel._queries), 0)\n\n        await concurrent_async_sql_call()\n\n        # ensure query was logged\n        self.assertEqual(len(self.panel._queries), 2)\n        query = self.panel._queries[0]\n        self.assertEqual(query[\"alias\"], \"default\")\n        self.assertTrue(\"sql\" in query)\n        self.assertTrue(\"duration\" in query)\n        self.assertTrue(\"stacktrace\" in query)\n\n        # ensure the stacktrace is populated\n        self.assertTrue(len(query[\"stacktrace\"]) > 0)\n\n    @override_settings(\n        DEBUG_TOOLBAR_CONFIG={\n            \"SKIP_TOOLBAR_QUERIES\": False,\n            \"TOOLBAR_STORE_CLASS\": \"debug_toolbar.store.DatabaseStore\",\n        }\n    )\n    def test_toolbar_model_query_is_tracked(self):\n        \"\"\"\n        Test is toolbar models are tracked when the `SKIP_TOOLBAR_QUERIES`\n        is set to False.\n        \"\"\"\n        self.assertEqual(len(self.panel._queries), 0)\n\n        patch_tracking_ddt_models()\n        sql_call_toolbar_model()\n\n        # ensure query was logged\n        self.assertEqual(len(self.panel._queries), 1)\n        query = self.panel._queries[0]\n        self.assertTrue(HistoryEntry._meta.db_table in query[\"sql\"])\n\n    @override_settings(\n        DEBUG_TOOLBAR_CONFIG={\n            \"SKIP_TOOLBAR_QUERIES\": False,\n            \"TOOLBAR_STORE_CLASS\": \"debug_toolbar.store.DatabaseStore\",\n        }\n    )\n    async def test_toolbar_model_query_is_tracked_async(self):\n        \"\"\"\n        (async) Test is toolbar models are tracked when the `SKIP_TOOLBAR_QUERIES`\n        is set to False.\n        \"\"\"\n        self.assertEqual(len(self.panel._queries), 0)\n\n        patch_tracking_ddt_models()\n        await async_sql_call_toolbar_model()\n\n        # ensure query was logged\n        self.assertEqual(len(self.panel._queries), 1)\n        query = self.panel._queries[0]\n        self.assertTrue(HistoryEntry._meta.db_table in query[\"sql\"])\n\n    @override_settings(\n        DEBUG_TOOLBAR_CONFIG={\n            \"SKIP_TOOLBAR_QUERIES\": True,\n            \"TOOLBAR_STORE_CLASS\": \"debug_toolbar.store.DatabaseStore\",\n        }\n    )\n    def test_toolbar_model_query_is_not_tracked(self):\n        \"\"\"\n        Test is toolbar models are not tracked when the `SKIP_TOOLBAR_QUERIES`\n        is set to True.\n        \"\"\"\n        self.assertEqual(len(self.panel._queries), 0)\n\n        patch_tracking_ddt_models()\n        sql_call_toolbar_model()\n\n        self.assertEqual(len(self.panel._queries), 0)\n\n    @override_settings(\n        DEBUG_TOOLBAR_CONFIG={\n            \"SKIP_TOOLBAR_QUERIES\": True,\n            \"TOOLBAR_STORE_CLASS\": \"debug_toolbar.store.DatabaseStore\",\n        }\n    )\n    async def test_toolbar_model_query_is_not_tracked_async(self):\n        \"\"\"\n        (async) Test is toolbar models are not tracked when the `SKIP_TOOLBAR_QUERIES`\n        is set to True.\n        \"\"\"\n        self.assertEqual(len(self.panel._queries), 0)\n\n        patch_tracking_ddt_models()\n        await async_sql_call_toolbar_model()\n\n        self.assertEqual(len(self.panel._queries), 0)\n\n    @unittest.skipUnless(\n        connection.vendor == \"postgresql\", \"Test valid only on PostgreSQL\"\n    )\n    def test_recording_chunked_cursor(self):\n        self.assertEqual(len(self.panel._queries), 0)\n\n        sql_call(use_iterator=True)\n\n        # ensure query was logged\n        self.assertEqual(len(self.panel._queries), 1)\n\n    @patch(\n        \"debug_toolbar.panels.sql.tracking.patch_cursor_wrapper_with_mixin\",\n        wraps=sql_tracking.patch_cursor_wrapper_with_mixin,\n    )\n    def test_cursor_wrapper_singleton(self, mock_patch_cursor_wrapper):\n        sql_call()\n        # ensure that cursor wrapping is applied only once\n        self.assertIn(\n            mock_patch_cursor_wrapper.mock_calls,\n            [\n                [call(CursorWrapper, sql_tracking.NormalCursorMixin)],\n                # CursorDebugWrapper is used if the test is called with `--debug-sql`\n                [call(CursorDebugWrapper, sql_tracking.NormalCursorMixin)],\n            ],\n        )\n\n    @patch(\n        \"debug_toolbar.panels.sql.tracking.patch_cursor_wrapper_with_mixin\",\n        wraps=sql_tracking.patch_cursor_wrapper_with_mixin,\n    )\n    def test_chunked_cursor_wrapper_singleton(self, mock_patch_cursor_wrapper):\n        sql_call(use_iterator=True)\n\n        # ensure that cursor wrapping is applied only once\n        self.assertIn(\n            mock_patch_cursor_wrapper.mock_calls,\n            [\n                [call(CursorWrapper, sql_tracking.NormalCursorMixin)],\n                # CursorDebugWrapper is used if the test is called with `--debug-sql`\n                [call(CursorDebugWrapper, sql_tracking.NormalCursorMixin)],\n            ],\n        )\n\n    @patch(\n        \"debug_toolbar.panels.sql.tracking.patch_cursor_wrapper_with_mixin\",\n        wraps=sql_tracking.patch_cursor_wrapper_with_mixin,\n    )\n    async def test_cursor_wrapper_async(self, mock_patch_cursor_wrapper):\n        await sync_to_async(sql_call)()\n\n        self.assertIn(\n            mock_patch_cursor_wrapper.mock_calls,\n            [\n                [call(CursorWrapper, sql_tracking.NormalCursorMixin)],\n                # CursorDebugWrapper is used if the test is called with `--debug-sql`\n                [call(CursorDebugWrapper, sql_tracking.NormalCursorMixin)],\n            ],\n        )\n\n    @patch(\n        \"debug_toolbar.panels.sql.tracking.patch_cursor_wrapper_with_mixin\",\n        wraps=sql_tracking.patch_cursor_wrapper_with_mixin,\n    )\n    async def test_cursor_wrapper_asyncio_ctx(self, mock_patch_cursor_wrapper):\n        self.assertTrue(sql_tracking.allow_sql.get())\n        await sync_to_async(sql_call)()\n\n        async def task():\n            sql_tracking.allow_sql.set(False)\n            # By disabling sql_tracking.allow_sql, we are indicating that any\n            # future SQL queries should be stopped. If SQL query occurs,\n            # it raises an exception.\n            with self.assertRaises(sql_tracking.SQLQueryTriggered):\n                await sync_to_async(sql_call)()\n\n        # Ensure this is called in another context\n        await asyncio.create_task(task())\n        # Because it was called in another context, it should not have affected ours\n        self.assertTrue(sql_tracking.allow_sql.get())\n\n        self.assertIn(\n            mock_patch_cursor_wrapper.mock_calls,\n            [\n                [\n                    call(CursorWrapper, sql_tracking.NormalCursorMixin),\n                    call(CursorWrapper, sql_tracking.ExceptionCursorMixin),\n                ],\n                # CursorDebugWrapper is used if the test is called with `--debug-sql`\n                [\n                    call(CursorDebugWrapper, sql_tracking.NormalCursorMixin),\n                    call(CursorDebugWrapper, sql_tracking.ExceptionCursorMixin),\n                ],\n            ],\n        )\n\n    def test_generate_server_timing(self):\n        self.assertEqual(len(self.panel._queries), 0)\n\n        sql_call()\n\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        self.panel.generate_server_timing(self.request, response)\n\n        # ensure query was logged\n        self.assertEqual(len(self.panel._queries), 1)\n        query = self.panel._queries[0]\n\n        expected_data = {\n            \"sql_time\": {\"title\": \"SQL 1 queries\", \"value\": query[\"duration\"]}\n        }\n\n        self.assertEqual(self.panel.get_server_timing_stats(), expected_data)\n\n    def test_non_ascii_query(self):\n        self.assertEqual(len(self.panel._queries), 0)\n\n        # non-ASCII text query\n        list(User.objects.extra(where=[\"username = 'apéro'\"]))\n        self.assertEqual(len(self.panel._queries), 1)\n\n        # non-ASCII text parameters\n        list(User.objects.filter(username=\"thé\"))\n        self.assertEqual(len(self.panel._queries), 2)\n\n        # non-ASCII bytes parameters\n        list(Binary.objects.filter(field__in=[\"café\".encode()]))\n        self.assertEqual(len(self.panel._queries), 3)\n\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n\n        # ensure the panel renders correctly\n        self.assertIn(\"café\", self.panel.content)\n\n    @unittest.skipUnless(\n        connection.vendor == \"postgresql\", \"Test valid only on PostgreSQL\"\n    )\n    def test_bytes_query(self):\n        self.assertEqual(len(self.panel._queries), 0)\n\n        with connection.cursor() as cursor:\n            cursor.execute(b\"SELECT 1\")\n\n        self.assertEqual(len(self.panel._queries), 1)\n\n    def test_param_conversion(self):\n        self.assertEqual(len(self.panel._queries), 0)\n\n        list(\n            User.objects.filter(first_name=\"Foo\")\n            .filter(is_staff=True)\n            .filter(is_superuser=False)\n        )\n        list(\n            User.objects.annotate(group_count=Count(\"groups__id\"))\n            .filter(group_count__lt=10)\n            .filter(group_count__gt=1)\n        )\n        list(\n            User.objects.filter(\n                date_joined=datetime.datetime(\n                    2017, 12, 22, 16, 7, 1, tzinfo=datetime.timezone.utc\n                )\n            )\n        )\n\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n\n        # ensure query was logged\n        self.assertEqual(len(self.panel._queries), 3)\n\n        if connection.vendor == \"mysql\" and django.VERSION >= (4, 1):\n            # Django 4.1 started passing true/false back for boolean\n            # comparisons in MySQL.\n            expected_bools = '[\"Foo\", true, false]'\n        else:\n            expected_bools = '[\"Foo\"]'\n\n        if connection.vendor == \"postgresql\":\n            # PostgreSQL always includes timezone\n            expected_datetime = '[\"2017-12-22 16:07:01+00:00\"]'\n        else:\n            expected_datetime = '[\"2017-12-22 16:07:01\"]'\n\n        self.assertEqual(\n            tuple(query[\"params\"] for query in self.panel._queries),\n            (\n                expected_bools,\n                \"[10, 1]\",\n                expected_datetime,\n            ),\n        )\n\n    @unittest.skipUnless(\n        connection.vendor == \"postgresql\", \"Test valid only on PostgreSQL\"\n    )\n    def test_json_param_conversion(self):\n        self.assertEqual(len(self.panel._queries), 0)\n\n        list(PostgresJSON.objects.filter(field__contains={\"foo\": \"bar\"}))\n\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n\n        # ensure query was logged\n        self.assertEqual(len(self.panel._queries), 1)\n        self.assertEqual(\n            self.panel._queries[0][\"params\"],\n            '[\"{\\\\\"foo\\\\\": \\\\\"bar\\\\\"}\"]',\n        )\n\n    @unittest.skipUnless(\n        connection.vendor == \"postgresql\" and psycopg is None,\n        \"Test valid only on PostgreSQL with psycopg2\",\n    )\n    def test_tuple_param_conversion(self):\n        \"\"\"\n        Regression test for tuple parameter conversion.\n        \"\"\"\n        self.assertEqual(len(self.panel._queries), 0)\n\n        list(\n            PostgresJSON.objects.raw(\n                \"SELECT * FROM tests_postgresjson WHERE field ->> 'key' IN %s\",\n                [(\"a\", \"b'\")],\n            )\n        )\n\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n\n        # ensure query was logged\n        self.assertEqual(len(self.panel._queries), 1)\n        self.assertEqual(self.panel._queries[0][\"params\"], '[[\"a\", \"b\\'\"]]')\n\n    def test_binary_param_force_text(self):\n        self.assertEqual(len(self.panel._queries), 0)\n\n        with connection.cursor() as cursor:\n            cursor.execute(\n                \"SELECT * FROM tests_binary WHERE field = %s\",\n                [connection.Database.Binary(b\"\\xff\")],\n            )\n\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n\n        self.assertEqual(len(self.panel._queries), 1)\n        self.assertIn(\n            \"<strong>SELECT</strong> * <strong>FROM</strong>\"\n            \" tests_binary <strong>WHERE</strong> field =\",\n            self.panel.content,\n        )\n\n    @unittest.skipUnless(connection.vendor != \"sqlite\", \"Test invalid for SQLite\")\n    def test_raw_query_param_conversion(self):\n        self.assertEqual(len(self.panel._queries), 0)\n\n        list(\n            User.objects.raw(\n                \" \".join(\n                    [\n                        \"SELECT *\",\n                        \"FROM auth_user\",\n                        \"WHERE first_name = %s\",\n                        \"AND is_staff = %s\",\n                        \"AND is_superuser = %s\",\n                        \"AND date_joined = %s\",\n                    ]\n                ),\n                params=[\"Foo\", True, False, datetime.datetime(2017, 12, 22, 16, 7, 1)],\n            )\n        )\n\n        list(\n            User.objects.raw(\n                \" \".join(\n                    [\n                        \"SELECT *\",\n                        \"FROM auth_user\",\n                        \"WHERE first_name = %(first_name)s\",\n                        \"AND is_staff = %(is_staff)s\",\n                        \"AND is_superuser = %(is_superuser)s\",\n                        \"AND date_joined = %(date_joined)s\",\n                    ]\n                ),\n                params={\n                    \"first_name\": \"Foo\",\n                    \"is_staff\": True,\n                    \"is_superuser\": False,\n                    \"date_joined\": datetime.datetime(2017, 12, 22, 16, 7, 1),\n                },\n            )\n        )\n\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n\n        # ensure query was logged\n        self.assertEqual(len(self.panel._queries), 2)\n\n        self.assertEqual(\n            tuple(query[\"params\"] for query in self.panel._queries),\n            (\n                '[\"Foo\", true, false, \"2017-12-22 16:07:01\"]',\n                \" \".join(\n                    [\n                        '{\"first_name\": \"Foo\",',\n                        '\"is_staff\": true,',\n                        '\"is_superuser\": false,',\n                        '\"date_joined\": \"2017-12-22 16:07:01\"}',\n                    ]\n                ),\n            ),\n        )\n\n    def test_insert_content(self):\n        \"\"\"\n        Test that the panel only inserts content after generate_stats and\n        not the process_request.\n        \"\"\"\n        list(User.objects.filter(username=\"café\"))\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        # ensure the panel renders correctly.\n        content = self.panel.content\n        self.assertIn(\"café\", content)\n        self.assertValidHTML(content)\n\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"ENABLE_STACKTRACES_LOCALS\": True})\n    def test_insert_locals(self):\n        \"\"\"\n        Test that the panel inserts locals() content.\n        \"\"\"\n        local_var = \"<script>alert('test');</script>\"  # noqa: F841\n        list(User.objects.filter(username=\"café\"))\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        self.assertIn(\"local_var\", self.panel.content)\n        # Verify the escape logic works\n        content = self.panel.content\n        self.assertNotIn(\"<script>alert\", content)\n        self.assertIn(\"&lt;script&gt;alert\", content)\n        self.assertIn(\"djdt-locals\", content)\n\n    def test_not_insert_locals(self):\n        \"\"\"\n        Test that the panel does not insert locals() content.\n        \"\"\"\n        list(User.objects.filter(username=\"café\"))\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        self.assertNotIn(\"djdt-locals\", self.panel.content)\n\n    @unittest.skipUnless(\n        connection.vendor == \"postgresql\", \"Test valid only on PostgreSQL\"\n    )\n    def test_erroneous_query(self):\n        \"\"\"\n        Test that an error in the query isn't swallowed by the middleware.\n        \"\"\"\n        try:\n            connection.cursor().execute(\"erroneous query\")\n        except DatabaseError as e:\n            self.assertTrue(\"erroneous query\" in str(e))\n\n    @unittest.skipUnless(\n        connection.vendor == \"postgresql\", \"Test valid only on PostgreSQL\"\n    )\n    def test_execute_with_psycopg_composed_sql(self):\n        \"\"\"\n        Test command executed using a Composed psycopg object is logged.\n        Ref: https://www.psycopg.org/psycopg3/docs/api/sql.html\n        \"\"\"\n        try:\n            from psycopg import sql\n        except ImportError:\n            from psycopg2 import sql\n\n        self.assertEqual(len(self.panel._queries), 0)\n\n        with connection.cursor() as cursor:\n            command = sql.SQL(\"select {field} from {table}\").format(\n                field=sql.Identifier(\"username\"), table=sql.Identifier(\"auth_user\")\n            )\n            cursor.execute(command)\n\n        self.assertEqual(len(self.panel._queries), 1)\n\n        query = self.panel._queries[0]\n        self.assertEqual(query[\"alias\"], \"default\")\n        self.assertTrue(\"sql\" in query)\n        self.assertEqual(query[\"sql\"], 'select \"username\" from \"auth_user\"')\n\n    def test_disable_stacktraces(self):\n        self.assertEqual(len(self.panel._queries), 0)\n\n        with self.settings(DEBUG_TOOLBAR_CONFIG={\"ENABLE_STACKTRACES\": False}):\n            sql_call()\n\n        # ensure query was logged\n        self.assertEqual(len(self.panel._queries), 1)\n        query = self.panel._queries[0]\n        self.assertEqual(query[\"alias\"], \"default\")\n        self.assertTrue(\"sql\" in query)\n        self.assertTrue(\"duration\" in query)\n        self.assertTrue(\"stacktrace\" in query)\n\n        # ensure the stacktrace is empty\n        self.assertEqual([], query[\"stacktrace\"])\n\n    @override_settings(\n        DEBUG=True,\n        TEMPLATES=[\n            {\n                \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n                \"OPTIONS\": {\"debug\": True, \"loaders\": [\"tests.loaders.LoaderWithSQL\"]},\n            }\n        ],\n    )\n    def test_regression_infinite_recursion(self):\n        \"\"\"\n        Test case for when the template loader runs a SQL query that causes\n        an infinite recursion in the SQL panel.\n        \"\"\"\n        self.assertEqual(len(self.panel._queries), 0)\n\n        render(self.request, \"basic.html\", {})\n\n        # Two queries are logged because the loader runs SQL every time a\n        # template is loaded and basic.html extends base.html.\n        self.assertEqual(len(self.panel._queries), 2)\n        query = self.panel._queries[0]\n        self.assertEqual(query[\"alias\"], \"default\")\n        self.assertTrue(\"sql\" in query)\n        self.assertTrue(\"duration\" in query)\n        self.assertTrue(\"stacktrace\" in query)\n\n        # ensure the stacktrace is populated\n        self.assertTrue(len(query[\"stacktrace\"]) > 0)\n\n    def test_prettify_sql(self):\n        \"\"\"\n        Test case to validate that the PRETTIFY_SQL setting changes the output\n        of the sql when it's toggled. It does not validate what it does\n        though.\n        \"\"\"\n        with override_settings(DEBUG_TOOLBAR_CONFIG={\"PRETTIFY_SQL\": True}):\n            list(User.objects.filter(username__istartswith=\"spam\"))\n            response = self.panel.process_request(self.request)\n            self.panel.generate_stats(self.request, response)\n            # The content formats the sql and prettifies it\n            self.assertTrue(self.panel.content)\n            pretty_sql = self.panel._queries[-1][\"sql\"]\n            self.assertEqual(len(self.panel._queries), 1)\n\n        # Recreate the panel to reset the queries. Content being a cached_property\n        # which doesn't have a way to reset it.\n        self.panel.disable_instrumentation()\n        self.panel = SQLPanel(self.panel.toolbar, self.panel.get_response)\n        self.panel.enable_instrumentation()\n        # Run it again, but with prettify off. Verify that it's different.\n        with override_settings(DEBUG_TOOLBAR_CONFIG={\"PRETTIFY_SQL\": False}):\n            list(User.objects.filter(username__istartswith=\"spam\"))\n            response = self.panel.process_request(self.request)\n            self.panel.generate_stats(self.request, response)\n            # The content formats the sql and prettifies it\n            self.assertTrue(self.panel.content)\n            self.assertEqual(len(self.panel._queries), 1)\n            self.assertNotIn(pretty_sql, self.panel.content)\n\n        self.panel.disable_instrumentation()\n        self.panel = SQLPanel(self.panel.toolbar, self.panel.get_response)\n        self.panel.enable_instrumentation()\n        # Run it again, but with prettify back on.\n        # This is so we don't have to check what PRETTIFY_SQL does exactly,\n        # but we know it's doing something.\n        with override_settings(DEBUG_TOOLBAR_CONFIG={\"PRETTIFY_SQL\": True}):\n            list(User.objects.filter(username__istartswith=\"spam\"))\n            response = self.panel.process_request(self.request)\n            self.panel.generate_stats(self.request, response)\n            # The content formats the sql and prettifies it\n            self.assertTrue(self.panel.content)\n            self.assertEqual(len(self.panel._queries), 1)\n            self.assertIn(pretty_sql, self.panel.content)\n\n    def test_simplification(self):\n        \"\"\"\n        Test case to validate that select lists for .count() and .exist() queries do not\n        get elided, but other select lists do.\n        \"\"\"\n        User.objects.count()\n        User.objects.exists()\n        list(User.objects.values_list(\"id\"))\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        # The content formats the sql which injects the ellipsis character\n        self.assertTrue(self.panel.content)\n        self.assertEqual(len(self.panel._queries), 3)\n        self.assertNotIn(\"\\u2022\", self.panel._queries[0][\"sql\"])\n        self.assertNotIn(\"\\u2022\", self.panel._queries[1][\"sql\"])\n        self.assertIn(\"\\u2022\", self.panel._queries[2][\"sql\"])\n\n    def test_top_level_simplification(self):\n        \"\"\"\n        Test case to validate that top-level select lists get elided, but other select\n        lists for subselects do not.\n        \"\"\"\n        list(User.objects.filter(id__in=User.objects.filter(is_staff=True)))\n        list(User.objects.filter(id__lt=20).union(User.objects.filter(id__gt=10)))\n        if connection.vendor != \"mysql\":\n            list(\n                User.objects.filter(id__lt=20).intersection(\n                    User.objects.filter(id__gt=10)\n                )\n            )\n            list(\n                User.objects.filter(id__lt=20).difference(\n                    User.objects.filter(id__gt=10)\n                )\n            )\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        # The content formats the sql which injects the ellipsis character\n        self.assertTrue(self.panel.content)\n        if connection.vendor != \"mysql\":\n            self.assertEqual(len(self.panel._queries), 4)\n        else:\n            self.assertEqual(len(self.panel._queries), 2)\n        # WHERE ... IN SELECT ... queries should have only one elided select list\n        self.assertEqual(self.panel._queries[0][\"sql\"].count(\"SELECT\"), 4)\n        self.assertEqual(self.panel._queries[0][\"sql\"].count(\"\\u2022\"), 3)\n        # UNION queries should have two elidid select lists\n        self.assertEqual(self.panel._queries[1][\"sql\"].count(\"SELECT\"), 4)\n        self.assertEqual(self.panel._queries[1][\"sql\"].count(\"\\u2022\"), 6)\n        if connection.vendor != \"mysql\":\n            # INTERSECT queries should have two elidid select lists\n            self.assertEqual(self.panel._queries[2][\"sql\"].count(\"SELECT\"), 4)\n            self.assertEqual(self.panel._queries[2][\"sql\"].count(\"\\u2022\"), 6)\n            # EXCEPT queries should have two elidid select lists\n            self.assertEqual(self.panel._queries[3][\"sql\"].count(\"SELECT\"), 4)\n            self.assertEqual(self.panel._queries[3][\"sql\"].count(\"\\u2022\"), 6)\n\n    @override_settings(\n        DEBUG=True,\n    )\n    def test_flat_template_information(self):\n        \"\"\"\n        Test case for when the query is used in a flat template hierarchy\n        (without included templates).\n        \"\"\"\n        self.assertEqual(len(self.panel._queries), 0)\n\n        users = User.objects.all()\n        render(self.request, \"sql/flat.html\", {\"users\": users})\n\n        self.assertEqual(len(self.panel._queries), 1)\n\n        query = self.panel._queries[0]\n        template_info = query[\"template_info\"]\n        template_name = os.path.basename(template_info[\"name\"])\n        self.assertEqual(template_name, \"flat.html\")\n        self.assertEqual(template_info[\"context\"][3][\"content\"].strip(), \"{{ users }}\")\n        self.assertEqual(template_info[\"context\"][3][\"highlight\"], True)\n\n    @override_settings(\n        DEBUG=True,\n    )\n    def test_nested_template_information(self):\n        \"\"\"\n        Test case for when the query is used in a nested template\n        hierarchy (with included templates).\n        \"\"\"\n        self.assertEqual(len(self.panel._queries), 0)\n\n        users = User.objects.all()\n        render(self.request, \"sql/nested.html\", {\"users\": users})\n\n        self.assertEqual(len(self.panel._queries), 1)\n\n        query = self.panel._queries[0]\n        template_info = query[\"template_info\"]\n        template_name = os.path.basename(template_info[\"name\"])\n        self.assertEqual(template_name, \"included.html\")\n        self.assertEqual(template_info[\"context\"][0][\"content\"].strip(), \"{{ users }}\")\n        self.assertEqual(template_info[\"context\"][0][\"highlight\"], True)\n\n    def test_similar_and_duplicate_grouping(self):\n        self.assertEqual(len(self.panel._queries), 0)\n\n        User.objects.filter(id=1).count()\n        User.objects.filter(id=1).count()\n        User.objects.filter(id=2).count()\n        User.objects.filter(id__lt=10).count()\n        User.objects.filter(id__lt=20).count()\n        User.objects.filter(id__gt=10, id__lt=20).count()\n\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n\n        self.assertEqual(len(self.panel._queries), 6)\n\n        queries = self.panel._queries\n        query = queries[0]\n        self.assertEqual(query[\"similar_count\"], 3)\n        self.assertEqual(query[\"duplicate_count\"], 2)\n\n        query = queries[1]\n        self.assertEqual(query[\"similar_count\"], 3)\n        self.assertEqual(query[\"duplicate_count\"], 2)\n\n        query = queries[2]\n        self.assertEqual(query[\"similar_count\"], 3)\n        self.assertTrue(\"duplicate_count\" not in query)\n\n        query = queries[3]\n        self.assertEqual(query[\"similar_count\"], 2)\n        self.assertTrue(\"duplicate_count\" not in query)\n\n        query = queries[4]\n        self.assertEqual(query[\"similar_count\"], 2)\n        self.assertTrue(\"duplicate_count\" not in query)\n\n        query = queries[5]\n        self.assertTrue(\"similar_count\" not in query)\n        self.assertTrue(\"duplicate_count\" not in query)\n\n        self.assertEqual(queries[0][\"similar_color\"], queries[1][\"similar_color\"])\n        self.assertEqual(queries[0][\"similar_color\"], queries[2][\"similar_color\"])\n        self.assertEqual(queries[0][\"duplicate_color\"], queries[1][\"duplicate_color\"])\n        self.assertNotEqual(queries[0][\"similar_color\"], queries[0][\"duplicate_color\"])\n\n        self.assertEqual(queries[3][\"similar_color\"], queries[4][\"similar_color\"])\n        self.assertNotEqual(queries[0][\"similar_color\"], queries[3][\"similar_color\"])\n        self.assertNotEqual(queries[0][\"duplicate_color\"], queries[3][\"similar_color\"])\n\n    def test_explain_with_union(self):\n        list(User.objects.filter(id__lt=20).union(User.objects.filter(id__gt=10)))\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        query = self.panel._queries[0]\n        self.assertTrue(query[\"is_select\"])\n\n\nclass SQLPanelMultiDBTestCase(BaseMultiDBTestCase):\n    panel_id = SQLPanel.panel_id\n\n    def test_aliases(self):\n        self.assertFalse(self.panel._queries)\n\n        list(User.objects.all())\n        list(User.objects.using(\"replica\").all())\n\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n\n        self.assertTrue(self.panel._queries)\n\n        query = self.panel._queries[0]\n        self.assertEqual(query[\"alias\"], \"default\")\n\n        query = self.panel._queries[-1]\n        self.assertEqual(query[\"alias\"], \"replica\")\n\n    def test_transaction_status(self):\n        \"\"\"\n        Test case for tracking the transaction status is properly associated with\n        queries on PostgreSQL, and that transactions aren't broken on other database\n        engines.\n        \"\"\"\n        self.assertEqual(len(self.panel._queries), 0)\n\n        with transaction.atomic():\n            list(User.objects.all())\n            list(User.objects.using(\"replica\").all())\n\n            with transaction.atomic(using=\"replica\"):\n                list(User.objects.all())\n                list(User.objects.using(\"replica\").all())\n\n        with transaction.atomic():\n            list(User.objects.all())\n\n        list(User.objects.using(\"replica\").all())\n\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n\n        if connection.vendor == \"postgresql\":\n            # Connection tracking is currently only implemented for PostgreSQL.\n            self.assertEqual(len(self.panel._queries), 6)\n\n            query = self.panel._queries[0]\n            self.assertEqual(query[\"alias\"], \"default\")\n            self.assertIsNotNone(query[\"trans_id\"])\n            self.assertTrue(query[\"starts_trans\"])\n            self.assertTrue(query[\"in_trans\"])\n            self.assertFalse(\"end_trans\" in query)\n\n            query = self.panel._queries[-1]\n            self.assertEqual(query[\"alias\"], \"replica\")\n            self.assertIsNone(query[\"trans_id\"])\n            self.assertFalse(\"starts_trans\" in query)\n            self.assertFalse(\"in_trans\" in query)\n            self.assertFalse(\"end_trans\" in query)\n\n            query = self.panel._queries[2]\n            self.assertEqual(query[\"alias\"], \"default\")\n            self.assertIsNotNone(query[\"trans_id\"])\n            self.assertEqual(query[\"trans_id\"], self.panel._queries[0][\"trans_id\"])\n            self.assertFalse(\"starts_trans\" in query)\n            self.assertTrue(query[\"in_trans\"])\n            self.assertTrue(query[\"ends_trans\"])\n\n            query = self.panel._queries[3]\n            self.assertEqual(query[\"alias\"], \"replica\")\n            self.assertIsNotNone(query[\"trans_id\"])\n            self.assertNotEqual(query[\"trans_id\"], self.panel._queries[0][\"trans_id\"])\n            self.assertTrue(query[\"starts_trans\"])\n            self.assertTrue(query[\"in_trans\"])\n            self.assertTrue(query[\"ends_trans\"])\n\n            query = self.panel._queries[4]\n            self.assertEqual(query[\"alias\"], \"default\")\n            self.assertIsNotNone(query[\"trans_id\"])\n            self.assertNotEqual(query[\"trans_id\"], self.panel._queries[0][\"trans_id\"])\n            self.assertNotEqual(query[\"trans_id\"], self.panel._queries[3][\"trans_id\"])\n            self.assertTrue(query[\"starts_trans\"])\n            self.assertTrue(query[\"in_trans\"])\n            self.assertTrue(query[\"ends_trans\"])\n\n            query = self.panel._queries[5]\n            self.assertEqual(query[\"alias\"], \"replica\")\n            self.assertIsNone(query[\"trans_id\"])\n            self.assertFalse(\"starts_trans\" in query)\n            self.assertFalse(\"in_trans\" in query)\n            self.assertFalse(\"end_trans\" in query)\n        else:\n            # Ensure that nothing was recorded for other database engines.\n            self.assertTrue(self.panel._queries)\n            for query in self.panel._queries:\n                self.assertFalse(\"trans_id\" in query)\n                self.assertFalse(\"starts_trans\" in query)\n                self.assertFalse(\"in_trans\" in query)\n                self.assertFalse(\"end_trans\" in query)\n"
  },
  {
    "path": "tests/panels/test_staticfiles.py",
    "content": "from pathlib import Path\n\nfrom django.conf import settings\nfrom django.contrib.staticfiles import finders, storage\nfrom django.shortcuts import render\nfrom django.test import AsyncRequestFactory, RequestFactory\n\nfrom debug_toolbar.panels.staticfiles import StaticFilesPanel, URLMixin\n\nfrom ..base import BaseTestCase\n\n\nclass StaticFilesPanelTestCase(BaseTestCase):\n    panel_id = StaticFilesPanel.panel_id\n\n    def test_default_case(self):\n        response = self.panel.process_request(self.request)\n        self.panel.generate_stats(self.request, response)\n        content = self.panel.content\n        self.assertIn(\n            \"django.contrib.staticfiles.finders.AppDirectoriesFinder\", content\n        )\n        self.assertIn(\n            \"django.contrib.staticfiles.finders.FileSystemFinder (2 files)\", content\n        )\n        self.assertEqual(self.panel.get_stats()[\"num_used\"], 0)\n        self.assertNotEqual(self.panel.num_found, 0)\n        expected_apps = [\"django.contrib.admin\", \"debug_toolbar\"]\n        if settings.USE_GIS:\n            expected_apps = [\"django.contrib.gis\"] + expected_apps\n        self.assertEqual(self.panel.get_staticfiles_apps(), expected_apps)\n        self.assertEqual(\n            self.panel.get_staticfiles_dirs(), finders.FileSystemFinder().locations\n        )\n\n    async def test_store_staticfiles_with_async_context(self):\n        async def get_response(request):\n            # template contains one static file\n            return render(request, \"staticfiles/async_static.html\")\n\n        self._get_response = get_response\n        async_request = AsyncRequestFactory().get(\"/\")\n        response = await self.panel.process_request(async_request)\n        self.panel.generate_stats(self.request, response)\n        self.assertEqual(self.panel.get_stats()[\"num_used\"], 1)\n\n    def test_insert_content(self):\n        \"\"\"\n        Test that the panel only inserts content after generate_stats and\n        not the process_request.\n        \"\"\"\n        response = self.panel.process_request(self.request)\n        # ensure the panel does not have content yet.\n        self.assertNotIn(\n            \"django.contrib.staticfiles.finders.AppDirectoriesFinder\",\n            self.panel.content,\n        )\n        self.panel.generate_stats(self.request, response)\n        # ensure the panel renders correctly.\n        content = self.panel.content\n        self.assertIn(\n            \"django.contrib.staticfiles.finders.AppDirectoriesFinder\", content\n        )\n        self.assertValidHTML(content)\n\n    def test_path(self):\n        def get_response(request):\n            return render(\n                request,\n                \"staticfiles/path.html\",\n                {\n                    \"paths\": [\n                        Path(\"additional_static/base.css\"),\n                        \"additional_static/base.css\",\n                        \"additional_static/base2.css\",\n                    ]\n                },\n            )\n\n        self._get_response = get_response\n        request = RequestFactory().get(\"/\")\n        response = self.panel.process_request(request)\n        self.panel.generate_stats(self.request, response)\n        self.assertEqual(self.panel.get_stats()[\"num_used\"], 2)\n        self.assertIn(\n            'href=\"/static/additional_static/base.css\"', self.panel.content, 1\n        )\n        self.assertIn(\n            'href=\"/static/additional_static/base2.css\"', self.panel.content, 1\n        )\n\n    def test_storage_state_preservation(self):\n        \"\"\"Ensure the URLMixin doesn't affect storage state\"\"\"\n        original_storage = storage.staticfiles_storage\n        original_attrs = dict(original_storage.__dict__)\n\n        # Trigger mixin injection\n        self.panel.ready()\n\n        # Verify all original attributes are preserved\n        self.assertEqual(original_attrs, dict(original_storage.__dict__))\n\n    def test_context_variable_lifecycle(self):\n        \"\"\"Test the request_id context variable lifecycle\"\"\"\n        from debug_toolbar.panels.staticfiles import request_id_context_var\n\n        # Should not raise when context not set\n        url = storage.staticfiles_storage.url(\"test.css\")\n        self.assertTrue(url.startswith(\"/static/\"))\n\n        # Should track when context is set\n        token = request_id_context_var.set(\"test-request-id\")\n        try:\n            url = storage.staticfiles_storage.url(\"test.css\")\n            self.assertTrue(url.startswith(\"/static/\"))\n            # Verify file was tracked\n            self.assertIn(\"test.css\", [f[0] for f in self.panel.used_paths])\n        finally:\n            request_id_context_var.reset(token)\n\n    def test_multiple_initialization(self):\n        \"\"\"Ensure multiple panel initializations don't stack URLMixin\"\"\"\n        storage_class = storage.staticfiles_storage.__class__\n\n        # Initialize panel multiple times\n        for _ in range(3):\n            self.panel.ready()\n\n        # Verify URLMixin appears exactly once in bases\n        mixin_count = sum(1 for base in storage_class.__bases__ if base == URLMixin)\n        self.assertEqual(mixin_count, 1)\n"
  },
  {
    "path": "tests/panels/test_template.py",
    "content": "from unittest import expectedFailure\n\nimport django\nfrom django.contrib.auth.models import User\nfrom django.template import Context, RequestContext, Template\nfrom django.test import override_settings\nfrom django.utils.functional import SimpleLazyObject\n\nfrom debug_toolbar.panels.sql import SQLPanel\nfrom debug_toolbar.panels.templates import TemplatesPanel\n\nfrom ..base import BaseTestCase, IntegrationTestCase\nfrom ..forms import TemplateReprForm\nfrom ..models import NonAsciiRepr\n\n\nclass TemplatesPanelTestCase(BaseTestCase):\n    panel_id = TemplatesPanel.panel_id\n\n    def setUp(self):\n        super().setUp()\n        self.sql_panel = self.toolbar.get_panel_by_id(SQLPanel.panel_id)\n        self.sql_panel.enable_instrumentation()\n\n    def tearDown(self):\n        self.sql_panel.disable_instrumentation()\n        super().tearDown()\n\n    def test_queryset_hook(self):\n        response = self.panel.process_request(self.request)\n        t = Template(\"No context variables here!\")\n        c = Context(\n            {\n                \"queryset\": User.objects.all(),\n                \"deep_queryset\": {\"queryset\": User.objects.all()},\n            }\n        )\n        t.render(c)\n        self.panel.generate_stats(self.request, response)\n\n        # ensure the query was NOT logged\n        self.assertEqual(len(self.sql_panel._queries), 0)\n\n        self.assertEqual(\n            self.panel.templates[0][\"context_list\"],\n            [\n                \"{'False': False, 'None': None, 'True': True}\",\n                \"{'deep_queryset': '<<triggers database query>>',\\n\"\n                \" 'queryset': '<<queryset of auth.User>>'}\",\n            ],\n        )\n\n    def test_template_repr(self):\n        # Force widget templates to be included\n        self.toolbar.config[\"SKIP_TEMPLATE_PREFIXES\"] = ()\n\n        User.objects.create(username=\"admin\")\n        bad_repr = TemplateReprForm()\n        if django.VERSION < (5,):\n            t = Template(\"<table>{{ bad_repr }}</table>\")\n        else:\n            t = Template(\"{{ bad_repr }}\")\n        c = Context({\"bad_repr\": bad_repr})\n        html = t.render(c)\n        self.assertIsNotNone(html)\n        self.assertValidHTML(html)\n\n    def test_object_with_non_ascii_repr_in_context(self):\n        response = self.panel.process_request(self.request)\n        t = Template(\"{{ object }}\")\n        c = Context({\"object\": NonAsciiRepr()})\n        t.render(c)\n        self.panel.generate_stats(self.request, response)\n        self.assertIn(\"nôt åscíì\", self.panel.content)\n\n    def test_insert_content(self):\n        \"\"\"\n        Test that the panel only inserts content after generate_stats and\n        not the process_request.\n        \"\"\"\n        t = Template(\"{{ object }}\")\n        c = Context({\"object\": NonAsciiRepr()})\n        t.render(c)\n        response = self.panel.process_request(self.request)\n        # ensure the panel does not have content yet.\n        self.assertNotIn(\"nôt åscíì\", self.panel.content)\n        self.panel.generate_stats(self.request, response)\n        # ensure the panel renders correctly.\n        content = self.panel.content\n        self.assertIn(\"nôt åscíì\", content)\n        self.assertValidHTML(content)\n\n    def test_custom_context_processor(self):\n        response = self.panel.process_request(self.request)\n        t = Template(\"{{ content }}\")\n        c = RequestContext(self.request, processors=[context_processor])\n        t.render(c)\n        self.panel.generate_stats(self.request, response)\n        self.assertIn(\n            \"tests.panels.test_template.context_processor\", self.panel.content\n        )\n\n    def test_disabled(self):\n        config = {\"DISABLE_PANELS\": {\"debug_toolbar.panels.templates.TemplatesPanel\"}}\n        self.assertTrue(self.panel.enabled)\n        with self.settings(DEBUG_TOOLBAR_CONFIG=config):\n            self.assertFalse(self.panel.enabled)\n\n    def test_empty_context(self):\n        response = self.panel.process_request(self.request)\n        t = Template(\"\")\n        c = Context({})\n        t.render(c)\n        self.panel.generate_stats(self.request, response)\n\n        # Includes the builtin context but not the empty one.\n        self.assertEqual(\n            self.panel.templates[0][\"context_list\"],\n            [\"{'False': False, 'None': None, 'True': True}\"],\n        )\n\n    def test_lazyobject(self):\n        response = self.panel.process_request(self.request)\n        t = Template(\"\")\n        c = Context({\"lazy\": SimpleLazyObject(lambda: \"lazy_value\")})\n        t.render(c)\n        self.panel.generate_stats(self.request, response)\n        self.assertNotIn(\"lazy_value\", self.panel.content)\n\n    def test_lazyobject_eval(self):\n        response = self.panel.process_request(self.request)\n        t = Template(\"{{lazy}}\")\n        c = Context({\"lazy\": SimpleLazyObject(lambda: \"lazy_value\")})\n        self.assertEqual(t.render(c), \"lazy_value\")\n        self.panel.generate_stats(self.request, response)\n        self.assertIn(\"lazy_value\", self.panel.content)\n\n    @override_settings(\n        DEBUG=True,\n        DEBUG_TOOLBAR_PANELS=[\"debug_toolbar.panels.templates.TemplatesPanel\"],\n    )\n    def test_template_source(self):\n        from django.core import signing\n        from django.template.loader import get_template\n\n        template = get_template(\"basic.html\")\n        url = \"/__debug__/template_source/\"\n        data = {\n            \"template\": template.template.name,\n            \"template_origin\": signing.dumps(template.template.origin.name),\n        }\n\n        response = self.client.get(url, data)\n        self.assertEqual(response.status_code, 200)\n\n\n@override_settings(\n    DEBUG=True, DEBUG_TOOLBAR_PANELS=[\"debug_toolbar.panels.templates.TemplatesPanel\"]\n)\nclass JinjaTemplateTestCase(IntegrationTestCase):\n    def test_django_jinja2(self):\n        r = self.client.get(\"/regular_jinja/foobar/\")\n        self.assertContains(r, \"Test for foobar (Jinja)\")\n        # This should be 2 templates because of the parent template.\n        # See test_django_jinja2_parent_template_instrumented\n        self.assertContains(r, \"<h3>Templates (1 rendered)</h3>\")\n        self.assertContains(r, \"<small>basic.jinja</small>\")\n\n    @expectedFailure\n    def test_django_jinja2_parent_template_instrumented(self):\n        \"\"\"\n        When Jinja2 templates are properly instrumented, the\n        parent template should be instrumented.\n        \"\"\"\n        r = self.client.get(\"/regular_jinja/foobar/\")\n        self.assertContains(r, \"Test for foobar (Jinja)\")\n        self.assertContains(r, \"<h3>Templates (2 rendered)</h3>\")\n        self.assertContains(r, \"<small>basic.jinja</small>\")\n\n\ndef context_processor(request):\n    return {\"content\": \"set by processor\"}\n"
  },
  {
    "path": "tests/panels/test_versions.py",
    "content": "from collections import namedtuple\n\nfrom debug_toolbar.panels.versions import VersionsPanel\n\nfrom ..base import BaseTestCase\n\nversion_info_t = namedtuple(\n    \"version_info_t\", (\"major\", \"minor\", \"micro\", \"releaselevel\", \"serial\")\n)\n\n\nclass VersionsPanelTestCase(BaseTestCase):\n    panel_id = VersionsPanel.panel_id\n\n    def test_app_version_from_get_version_fn(self):\n        class FakeApp:\n            def get_version(self):\n                return version_info_t(1, 2, 3, \"\", \"\")\n\n        self.assertEqual(self.panel.get_app_version(FakeApp()), \"1.2.3\")\n\n    def test_incompatible_app_version_fn(self):\n        class FakeApp:\n            def get_version(self, some_other_arg):\n                # This should be ignored by the get_version_from_app\n                return version_info_t(0, 0, 0, \"\", \"\")\n\n            VERSION = version_info_t(1, 2, 3, \"\", \"\")\n\n        self.assertEqual(self.panel.get_app_version(FakeApp()), \"1.2.3\")\n\n    def test_app_version_from_VERSION(self):\n        class FakeApp:\n            VERSION = version_info_t(1, 2, 3, \"\", \"\")\n\n        self.assertEqual(self.panel.get_app_version(FakeApp()), \"1.2.3\")\n\n    def test_app_version_from_underscore_version(self):\n        class FakeApp:\n            __version__ = version_info_t(1, 2, 3, \"\", \"\")\n\n        self.assertEqual(self.panel.get_app_version(FakeApp()), \"1.2.3\")\n"
  },
  {
    "path": "tests/settings.py",
    "content": "\"\"\"Django settings for tests.\"\"\"\n\nimport os\n\nBASE_DIR = os.path.dirname(os.path.dirname(__file__))\n\n\n# Quick-start development settings - unsuitable for production\n\nDEBUG = False\nSECRET_KEY = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890\"\n\nINTERNAL_IPS = [\"127.0.0.1\"]\n\nLOGGING = {  # avoids spurious output in tests\n    \"version\": 1,\n    \"disable_existing_loggers\": True,\n}\n\n\n# Application definition\n\nINSTALLED_APPS = [\n    \"django.contrib.admin\",\n    \"django.contrib.auth\",\n    \"django.contrib.contenttypes\",\n    \"django.contrib.sessions\",\n    \"django.contrib.messages\",\n    \"django.contrib.staticfiles\",\n    \"debug_toolbar\",\n    # We are not actively using template-partials; we just want more nesting\n    # in our template loader configuration, see\n    # https://github.com/django-commons/django-debug-toolbar/issues/2109\n    \"template_partials\",\n    \"tests\",\n]\n\n\nUSE_GIS = os.getenv(\"DB_BACKEND\") == \"postgis\"\n\nif USE_GIS:\n    INSTALLED_APPS = [\"django.contrib.gis\"] + INSTALLED_APPS\n\nMEDIA_URL = \"/media/\"  # Avoids https://code.djangoproject.com/ticket/21451\n\nMIDDLEWARE = [\n    \"tests.middleware.UseCacheAfterToolbar\",\n    \"debug_toolbar.middleware.DebugToolbarMiddleware\",\n    \"django.middleware.security.SecurityMiddleware\",\n    \"django.contrib.sessions.middleware.SessionMiddleware\",\n    \"django.middleware.common.CommonMiddleware\",\n    \"django.middleware.csrf.CsrfViewMiddleware\",\n    \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n    \"django.contrib.messages.middleware.MessageMiddleware\",\n    \"django.middleware.clickjacking.XFrameOptionsMiddleware\",\n]\n\nROOT_URLCONF = \"tests.urls\"\n\nTEMPLATES = [\n    {\n        \"NAME\": \"jinja2\",\n        \"BACKEND\": \"django.template.backends.jinja2.Jinja2\",\n        \"APP_DIRS\": True,\n        \"DIRS\": [os.path.join(BASE_DIR, \"tests\", \"templates\", \"jinja2\")],\n    },\n    {\n        \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n        \"APP_DIRS\": True,\n        \"OPTIONS\": {\n            \"context_processors\": [\n                \"django.template.context_processors.debug\",\n                \"django.template.context_processors.request\",\n                \"django.contrib.auth.context_processors.auth\",\n                \"django.contrib.messages.context_processors.messages\",\n            ]\n        },\n    },\n]\n\nUSE_TZ = True\n\nSTATIC_ROOT = os.path.join(BASE_DIR, \"tests\", \"static\")\n\nSTATIC_URL = \"/static/\"\n\nSTATICFILES_DIRS = [\n    os.path.join(BASE_DIR, \"tests\", \"additional_static\"),\n    (\"prefix\", os.path.join(BASE_DIR, \"tests\", \"additional_static\")),\n]\n\n# Cache and database\n\nCACHES = {\n    \"default\": {\"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\"},\n    \"second\": {\"BACKEND\": \"django.core.cache.backends.locmem.LocMemCache\"},\n}\n\nDATABASES = {\n    \"default\": {\n        \"ENGINE\": \"django.{}db.backends.{}\".format(\n            \"contrib.gis.\" if USE_GIS else \"\", os.getenv(\"DB_BACKEND\", \"sqlite3\")\n        ),\n        \"NAME\": os.getenv(\"DB_NAME\", \":memory:\"),\n        \"USER\": os.getenv(\"DB_USER\"),\n        \"PASSWORD\": os.getenv(\"DB_PASSWORD\"),\n        \"HOST\": os.getenv(\"DB_HOST\", \"\"),\n        \"PORT\": os.getenv(\"DB_PORT\", \"\"),\n        \"TEST\": {\n            \"USER\": \"default_test\",\n        },\n    },\n    \"replica\": {\n        \"ENGINE\": \"django.{}db.backends.{}\".format(\n            \"contrib.gis.\" if USE_GIS else \"\", os.getenv(\"DB_BACKEND\", \"sqlite3\")\n        ),\n        \"NAME\": os.getenv(\"DB_NAME\", \":memory:\"),\n        \"USER\": os.getenv(\"DB_USER\"),\n        \"PASSWORD\": os.getenv(\"DB_PASSWORD\"),\n        \"HOST\": os.getenv(\"DB_HOST\", \"\"),\n        \"PORT\": os.getenv(\"DB_PORT\", \"\"),\n        \"TEST\": {\n            \"USER\": \"default_test\",\n            \"MIRROR\": \"default\",\n        },\n    },\n}\n\nDEFAULT_AUTO_FIELD = \"django.db.models.AutoField\"\n\n# Force the MIGRATION_MODULES to always find our migrations.\n# See debug_toolbar/apps.py::_manage_migrations_visibility\nMIGRATION_MODULES = {\"debug_toolbar\": \"debug_toolbar.migrations\"}\n\n# Debug Toolbar configuration\n\nDEBUG_TOOLBAR_CONFIG = {\n    # Django's test client sets wsgi.multiprocess to True inappropriately\n    \"RENDER_PANELS\": False,\n    \"RESULTS_CACHE_SIZE\": 3,\n    # IS_RUNNING_TESTS must be False even though we're running tests because we're running the toolbar's own tests.\n    \"IS_RUNNING_TESTS\": False,\n}\n"
  },
  {
    "path": "tests/sync.py",
    "content": "\"\"\"\nTaken from channels.db\n\"\"\"\n\nfrom asgiref.sync import SyncToAsync\nfrom django.db import close_old_connections\n\n\nclass DatabaseSyncToAsync(SyncToAsync):\n    \"\"\"\n    SyncToAsync version that cleans up old database connections when it exits.\n    \"\"\"\n\n    def thread_handler(self, loop, *args, **kwargs):\n        close_old_connections()\n        try:\n            return super().thread_handler(loop, *args, **kwargs)\n        finally:\n            close_old_connections()\n\n\n# The class is TitleCased, but we want to encourage use as a callable/decorator\ndatabase_sync_to_async = DatabaseSyncToAsync\n"
  },
  {
    "path": "tests/templates/ajax/ajax.html",
    "content": "{% extends \"base.html\" %}\n\n{% block content %}\n  <div id=\"click_for_ajax\">click for ajax</div>\n\n  <script>\n\n  let click_for_ajax = document.getElementById(\"click_for_ajax\");\n  function send_ajax() {\n    let xhr = new XMLHttpRequest();\n    let url = '/json_view/';\n    xhr.open(\"GET\", url, true);\n    xhr.onreadystatechange = function () {\n        if (this.readyState == 4 && this.status == 200) {\n            console.log(this.responseText);\n        }\n    }\n    xhr.send();\n  }\n  document.addEventListener(\"click\", (event) => {send_ajax()});\n  </script>\n{% endblock content %}\n"
  },
  {
    "path": "tests/templates/base.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <title>{{ title }}</title>\n        {% block head %}{% endblock %}\n    </head>\n    <body>\n    {% block content %}{% endblock %}\n    </body>\n</html>\n"
  },
  {
    "path": "tests/templates/basic.html",
    "content": "{% extends \"base.html\" %}\n\n{% block content %}Test for {{ title }}{% endblock %}\n"
  },
  {
    "path": "tests/templates/jinja2/base.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <title>{{ title }}</title>\n    </head>\n    <body>\n    {% block content %}{% endblock %}\n    </body>\n</html>\n"
  },
  {
    "path": "tests/templates/jinja2/basic.jinja",
    "content": "{% extends 'base.html' %}\n\n{% block content %}\nTest for {{ title }} (Jinja)\n{% for i in range(10) %}{{ i }}{% endfor %} {# Jinja2 supports range(), Django templates do not #}\n{% endblock content %}\n"
  },
  {
    "path": "tests/templates/registration/login.html",
    "content": "{% extends 'base.html' %}\n"
  },
  {
    "path": "tests/templates/sql/flat.html",
    "content": "{% extends \"base.html\" %}\n\n{% block content %}\n  {{ users }}\n{% endblock content %}\n"
  },
  {
    "path": "tests/templates/sql/included.html",
    "content": "{{ users }}\n"
  },
  {
    "path": "tests/templates/sql/nested.html",
    "content": "{% extends \"base.html\" %}\n\n{% block content %}\n  {% include \"sql/included.html\" %}\n{% endblock content %}\n"
  },
  {
    "path": "tests/templates/staticfiles/async_static.html",
    "content": "{% extends \"base.html\" %}\n{% load static %}\n\n{% block head %}\n    <link rel=\"stylesheet\" href=\"{% static 'additional_static/base.css' %}\">\n{% endblock head %}\n"
  },
  {
    "path": "tests/templates/staticfiles/path.html",
    "content": "{% load static %}{% for path in paths %}{% static path %}{% endfor %}\n"
  },
  {
    "path": "tests/test_apps.py",
    "content": "from unittest.mock import patch\n\nfrom django.apps import apps\nfrom django.test import SimpleTestCase, override_settings\n\nfrom debug_toolbar.apps import _manage_migrations_visibility\n\n\nclass AppsTestCase(SimpleTestCase):\n    @override_settings(\n        DEBUG_TOOLBAR_CONFIG={\n            \"TOOLBAR_STORE_CLASS\": \"debug_toolbar.store.DatabaseStore\"\n        }\n    )\n    @patch(\"debug_toolbar.apps.settings.MIGRATION_MODULES\")\n    def test_migrations_are_visible(self, mocked_migration_modules):\n        _manage_migrations_visibility(\"debug_toolbar\")\n        self.assertFalse(mocked_migration_modules.setdefault.called)\n\n    @override_settings(\n        DEBUG_TOOLBAR_CONFIG={\"TOOLBAR_STORE_CLASS\": \"debug_toolbar.store.MemoryStore\"}\n    )\n    @patch(\"debug_toolbar.apps.settings.MIGRATION_MODULES\")\n    def test_migrations_are_hidden(self, mocked_migration_modules):\n        _manage_migrations_visibility(\"debug_toolbar\")\n        mocked_migration_modules.setdefault.assert_called_once_with(\n            \"debug_toolbar\", None\n        )\n\n    @override_settings(\n        DEBUG_TOOLBAR_CONFIG={\n            \"TOOLBAR_STORE_CLASS\": \"debug_toolbar.store.DatabaseStore\"\n        }\n    )\n    def test_models_are_visible(self):\n        app_config = apps.get_app_config(\"debug_toolbar\")\n        app_config.import_models()\n        apps.get_model(\"debug_toolbar\", \"HistoryEntry\")\n\n    @override_settings(\n        DEBUG_TOOLBAR_CONFIG={\"TOOLBAR_STORE_CLASS\": \"debug_toolbar.store.MemoryStore\"}\n    )\n    def test_models_are_hidden(self):\n        app_config = apps.get_app_config(\"debug_toolbar\")\n        app_config.import_models()\n        with self.assertRaises(LookupError):\n            apps.get_model(\"debug_toolbar\", \"HistoryEntry\")\n"
  },
  {
    "path": "tests/test_checks.py",
    "content": "from unittest.mock import patch\n\nfrom django.core.checks import Warning, run_checks\nfrom django.test import SimpleTestCase, override_settings\nfrom django.urls import NoReverseMatch\n\nfrom debug_toolbar.apps import debug_toolbar_installed_when_running_tests_check\n\n\nclass ChecksTestCase(SimpleTestCase):\n    @override_settings(\n        MIDDLEWARE=[\n            \"django.contrib.messages.middleware.MessageMiddleware\",\n            \"django.contrib.sessions.middleware.SessionMiddleware\",\n            \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n            \"django.middleware.gzip.GZipMiddleware\",\n            \"debug_toolbar.middleware.DebugToolbarMiddleware\",\n        ]\n    )\n    def test_check_good_configuration(self):\n        messages = run_checks()\n        self.assertEqual(messages, [])\n\n    @override_settings(\n        MIDDLEWARE=[\n            \"django.contrib.messages.middleware.MessageMiddleware\",\n            \"django.contrib.sessions.middleware.SessionMiddleware\",\n            \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n        ]\n    )\n    def test_check_missing_middleware_error(self):\n        messages = run_checks()\n        self.assertEqual(\n            messages,\n            [\n                Warning(\n                    \"debug_toolbar.middleware.DebugToolbarMiddleware is \"\n                    \"missing from MIDDLEWARE.\",\n                    hint=\"Add debug_toolbar.middleware.DebugToolbarMiddleware \"\n                    \"to MIDDLEWARE.\",\n                    id=\"debug_toolbar.W001\",\n                )\n            ],\n        )\n\n    @override_settings(\n        MIDDLEWARE=[\n            \"django.contrib.messages.middleware.MessageMiddleware\",\n            \"django.contrib.sessions.middleware.SessionMiddleware\",\n            \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n            \"debug_toolbar.middleware.DebugToolbarMiddleware\",\n            \"django.middleware.gzip.GZipMiddleware\",\n        ]\n    )\n    def test_check_gzip_middleware_error(self):\n        messages = run_checks()\n        self.assertEqual(\n            messages,\n            [\n                Warning(\n                    \"debug_toolbar.middleware.DebugToolbarMiddleware occurs \"\n                    \"before django.middleware.gzip.GZipMiddleware in \"\n                    \"MIDDLEWARE.\",\n                    hint=\"Move debug_toolbar.middleware.DebugToolbarMiddleware \"\n                    \"to after django.middleware.gzip.GZipMiddleware in \"\n                    \"MIDDLEWARE.\",\n                    id=\"debug_toolbar.W003\",\n                )\n            ],\n        )\n\n    @override_settings(\n        MIDDLEWARE_CLASSES=[\n            \"django.contrib.messages.middleware.MessageMiddleware\",\n            \"django.contrib.sessions.middleware.SessionMiddleware\",\n            \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n            \"django.middleware.gzip.GZipMiddleware\",\n            \"debug_toolbar.middleware.DebugToolbarMiddleware\",\n        ]\n    )\n    def test_check_middleware_classes_error(self):\n        messages = run_checks()\n        self.assertIn(\n            Warning(\n                \"debug_toolbar is incompatible with MIDDLEWARE_CLASSES setting.\",\n                hint=\"Use MIDDLEWARE instead of MIDDLEWARE_CLASSES\",\n                id=\"debug_toolbar.W004\",\n            ),\n            messages,\n        )\n\n    @override_settings(DEBUG_TOOLBAR_PANELS=[])\n    def test_panels_is_empty(self):\n        errors = run_checks()\n        self.assertEqual(\n            errors,\n            [\n                Warning(\n                    \"Setting DEBUG_TOOLBAR_PANELS is empty.\",\n                    hint=\"Set DEBUG_TOOLBAR_PANELS to a non-empty list in your \"\n                    \"settings.py.\",\n                    id=\"debug_toolbar.W005\",\n                ),\n            ],\n        )\n\n    @override_settings(\n        TEMPLATES=[\n            {\n                \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n                \"APP_DIRS\": False,\n                \"OPTIONS\": {\n                    \"context_processors\": [\n                        \"django.template.context_processors.debug\",\n                        \"django.template.context_processors.request\",\n                        \"django.contrib.auth.context_processors.auth\",\n                        \"django.contrib.messages.context_processors.messages\",\n                    ],\n                    \"loaders\": [\n                        \"django.template.loaders.filesystem.Loader\",\n                    ],\n                },\n            },\n        ]\n    )\n    def test_check_w006_invalid(self):\n        errors = run_checks()\n        self.assertEqual(\n            errors,\n            [\n                Warning(\n                    \"At least one DjangoTemplates TEMPLATES configuration needs \"\n                    \"to use django.template.loaders.app_directories.Loader or \"\n                    \"have APP_DIRS set to True.\",\n                    hint=(\n                        \"Include django.template.loaders.app_directories.Loader \"\n                        'in [\"OPTIONS\"][\"loaders\"]. Alternatively use '\n                        \"APP_DIRS=True for at least one \"\n                        \"django.template.backends.django.DjangoTemplates \"\n                        \"backend configuration.\"\n                    ),\n                    id=\"debug_toolbar.W006\",\n                )\n            ],\n        )\n\n    @override_settings(\n        TEMPLATES=[\n            {\n                \"NAME\": \"use_loaders\",\n                \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n                \"APP_DIRS\": False,\n                \"OPTIONS\": {\n                    \"context_processors\": [\n                        \"django.template.context_processors.debug\",\n                        \"django.template.context_processors.request\",\n                        \"django.contrib.auth.context_processors.auth\",\n                        \"django.contrib.messages.context_processors.messages\",\n                    ],\n                    \"loaders\": [\n                        \"django.template.loaders.app_directories.Loader\",\n                    ],\n                },\n            },\n            {\n                \"NAME\": \"use_app_dirs\",\n                \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n                \"APP_DIRS\": True,\n                \"OPTIONS\": {\n                    \"context_processors\": [\n                        \"django.template.context_processors.debug\",\n                        \"django.template.context_processors.request\",\n                        \"django.contrib.auth.context_processors.auth\",\n                        \"django.contrib.messages.context_processors.messages\",\n                    ],\n                },\n            },\n        ]\n    )\n    def test_check_w006_valid(self):\n        self.assertEqual(run_checks(), [])\n\n    @override_settings(\n        TEMPLATES=[\n            {\n                \"NAME\": \"use_loaders\",\n                \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n                \"APP_DIRS\": False,\n                \"OPTIONS\": {\n                    \"context_processors\": [\n                        \"django.template.context_processors.debug\",\n                        \"django.template.context_processors.request\",\n                        \"django.contrib.auth.context_processors.auth\",\n                        \"django.contrib.messages.context_processors.messages\",\n                    ],\n                    \"loaders\": [\n                        (\n                            \"django.template.loaders.cached.Loader\",\n                            [\n                                \"django.template.loaders.filesystem.Loader\",\n                                \"django.template.loaders.app_directories.Loader\",\n                            ],\n                        ),\n                    ],\n                },\n            },\n        ]\n    )\n    def test_check_w006_valid_nested_loaders(self):\n        self.assertEqual(run_checks(), [])\n\n    @patch(\"debug_toolbar.apps.mimetypes.guess_type\")\n    def test_check_w007_valid(self, mocked_guess_type):\n        mocked_guess_type.return_value = (\"text/javascript\", None)\n        self.assertEqual(run_checks(), [])\n        mocked_guess_type.return_value = (\"application/javascript\", None)\n        self.assertEqual(run_checks(), [])\n\n    @patch(\"debug_toolbar.apps.mimetypes.guess_type\")\n    def test_check_w007_invalid(self, mocked_guess_type):\n        mocked_guess_type.return_value = (\"text/plain\", None)\n        self.assertEqual(\n            run_checks(),\n            [\n                Warning(\n                    \"JavaScript files are resolving to the wrong content type.\",\n                    hint=\"The Django Debug Toolbar may not load properly while mimetypes are misconfigured. \"\n                    \"See the Django documentation for an explanation of why this occurs.\\n\"\n                    \"https://docs.djangoproject.com/en/stable/ref/contrib/staticfiles/#static-file-development-view\\n\"\n                    \"\\n\"\n                    \"This typically occurs on Windows machines. The suggested solution is to modify \"\n                    \"HKEY_CLASSES_ROOT in the registry to specify the content type for JavaScript \"\n                    \"files.\\n\"\n                    \"\\n\"\n                    \"[HKEY_CLASSES_ROOT\\\\.js]\\n\"\n                    '\"Content Type\"=\"application/javascript\"',\n                    id=\"debug_toolbar.W007\",\n                )\n            ],\n        )\n\n    @patch(\"debug_toolbar.apps.reverse\")\n    def test_debug_toolbar_installed_when_running_tests(self, reverse):\n        params = [\n            {\n                \"debug\": True,\n                \"running_tests\": True,\n                \"show_callback_changed\": True,\n                \"urls_installed\": False,\n                \"errors\": False,\n            },\n            {\n                \"debug\": False,\n                \"running_tests\": False,\n                \"show_callback_changed\": True,\n                \"urls_installed\": False,\n                \"errors\": False,\n            },\n            {\n                \"debug\": False,\n                \"running_tests\": True,\n                \"show_callback_changed\": False,\n                \"urls_installed\": False,\n                \"errors\": False,\n            },\n            {\n                \"debug\": False,\n                \"running_tests\": True,\n                \"show_callback_changed\": True,\n                \"urls_installed\": True,\n                \"errors\": False,\n            },\n            {\n                \"debug\": False,\n                \"running_tests\": True,\n                \"show_callback_changed\": True,\n                \"urls_installed\": False,\n                \"errors\": True,\n            },\n        ]\n        for config in params:\n            with self.subTest(**config):\n                config_setting = {\n                    \"RENDER_PANELS\": False,\n                    \"IS_RUNNING_TESTS\": config[\"running_tests\"],\n                    \"SHOW_TOOLBAR_CALLBACK\": (\n                        (lambda *args: True)\n                        if config[\"show_callback_changed\"]\n                        else \"debug_toolbar.middleware.show_toolbar\"\n                    ),\n                }\n                if config[\"urls_installed\"]:\n                    reverse.side_effect = lambda *args: None\n                else:\n                    reverse.side_effect = NoReverseMatch()\n\n                with self.settings(\n                    DEBUG=config[\"debug\"], DEBUG_TOOLBAR_CONFIG=config_setting\n                ):\n                    errors = debug_toolbar_installed_when_running_tests_check(None)\n                    if config[\"errors\"]:\n                        self.assertEqual(len(errors), 1)\n                        self.assertEqual(errors[0].id, \"debug_toolbar.E001\")\n                    else:\n                        self.assertEqual(len(errors), 0)\n\n    @override_settings(\n        DEBUG_TOOLBAR_CONFIG={\n            \"OBSERVE_REQUEST_CALLBACK\": lambda request: False,\n            \"IS_RUNNING_TESTS\": False,\n        }\n    )\n    def test_observe_request_callback_specified(self):\n        errors = run_checks()\n        self.assertEqual(len(errors), 1)\n        self.assertEqual(errors[0].id, \"debug_toolbar.W008\")\n"
  },
  {
    "path": "tests/test_csp_rendering.py",
    "content": "from __future__ import annotations\n\nimport django\nfrom django.conf import settings\nfrom django.test.utils import override_settings\nfrom html5lib.constants import E\nfrom html5lib.html5parser import HTMLParser\n\nfrom debug_toolbar.store import get_store\nfrom debug_toolbar.toolbar import DebugToolbar\nfrom debug_toolbar.utils import get_csp_nonce\n\nfrom .base import IntegrationTestCase\n\nMIDDLEWARE_CSP_LIB_BEFORE = settings.MIDDLEWARE.copy()\nMIDDLEWARE_CSP_LIB_BEFORE.insert(\n    MIDDLEWARE_CSP_LIB_BEFORE.index(\"debug_toolbar.middleware.DebugToolbarMiddleware\"),\n    \"csp.middleware.CSPMiddleware\",\n)\nMIDDLEWARE_CSP_LIB_LAST = settings.MIDDLEWARE + [\"csp.middleware.CSPMiddleware\"]\n\nVALID_MIDDLEWARE_VARIATIONS = [MIDDLEWARE_CSP_LIB_BEFORE, MIDDLEWARE_CSP_LIB_LAST]\n\ndjango_has_builtin_csp_support = django.VERSION >= (6, 0)\nif django_has_builtin_csp_support:\n    MIDDLEWARE_CSP_BUILTIN_BEFORE = settings.MIDDLEWARE.copy()\n    MIDDLEWARE_CSP_BUILTIN_BEFORE.insert(\n        MIDDLEWARE_CSP_BUILTIN_BEFORE.index(\n            \"debug_toolbar.middleware.DebugToolbarMiddleware\"\n        ),\n        \"django.middleware.csp.ContentSecurityPolicyMiddleware\",\n    )\n    MIDDLEWARE_CSP_BUILTIN_LAST = settings.MIDDLEWARE + [\n        \"django.middleware.csp.ContentSecurityPolicyMiddleware\"\n    ]\n    VALID_MIDDLEWARE_VARIATIONS += [\n        MIDDLEWARE_CSP_BUILTIN_BEFORE,\n        MIDDLEWARE_CSP_BUILTIN_LAST,\n    ]\n\n\ndef get_namespaces(element):\n    \"\"\"\n    Return the default `xmlns`. See\n    https://docs.python.org/3/library/xml.etree.elementtree.html#parsing-xml-with-namespaces\n    \"\"\"\n    if not element.tag.startswith(\"{\"):\n        return {}\n    return {\"\": element.tag[1:].split(\"}\", maxsplit=1)[0]}\n\n\n@override_settings(DEBUG=True)\nclass CspRenderingTestCase(IntegrationTestCase):\n    \"\"\"Testing if `csp-nonce` renders.\"\"\"\n\n    def setUp(self):\n        super().setUp()\n        self.parser = HTMLParser()\n\n    def _fail_if_missing(self, root, path, namespaces, nonce):\n        \"\"\"\n        Search elements, fail if a `nonce` attribute is missing on them.\n        \"\"\"\n        elements = root.findall(path=path, namespaces=namespaces)\n        for item in elements:\n            if item.attrib.get(\"nonce\") != nonce:\n                raise self.failureException(f\"{item} has no nonce attribute.\")\n\n    def _fail_if_found(self, root, path, namespaces):\n        \"\"\"\n        Search elements, fail if a `nonce` attribute is found on them.\n        \"\"\"\n        elements = root.findall(path=path, namespaces=namespaces)\n        for item in elements:\n            if \"nonce\" in item.attrib:\n                raise self.failureException(f\"{item} has a nonce attribute.\")\n\n    def _fail_on_invalid_html(self, content, parser):\n        \"\"\"Fail if the passed HTML is invalid.\"\"\"\n        if parser.errors:\n            default_msg = [\"Content is invalid HTML:\"]\n            lines = content.split(b\"\\n\")\n            for position, error_code, data_vars in parser.errors:\n                default_msg.append(f\"  {E[error_code]}\" % data_vars)\n                default_msg.append(f\"    {lines[position[0] - 1]!r}\")\n            msg = self._formatMessage(None, \"\\n\".join(default_msg))\n            raise self.failureException(msg)\n\n    def test_exists(self):\n        \"\"\"A `nonce` should exist when using the `CSPMiddleware`.\"\"\"\n        for middleware in VALID_MIDDLEWARE_VARIATIONS:\n            with self.settings(MIDDLEWARE=middleware):\n                response = self.client.get(path=\"/csp_view/\")\n                self.assertEqual(response.status_code, 200)\n\n                html_root = self.parser.parse(stream=response.content)\n                self._fail_on_invalid_html(content=response.content, parser=self.parser)\n                self.assertContains(response, \"djDebug\")\n\n                namespaces = get_namespaces(element=html_root)\n                nonce = get_csp_nonce(response.context[\"request\"])\n                assert nonce is not None\n                self._fail_if_missing(\n                    root=html_root, path=\".//link\", namespaces=namespaces, nonce=nonce\n                )\n                self._fail_if_missing(\n                    root=html_root, path=\".//script\", namespaces=namespaces, nonce=nonce\n                )\n\n    def test_does_not_exist_nonce_wasnt_used(self):\n        \"\"\"\n        A `nonce` should not exist even when using the `CSPMiddleware`\n        if the view didn't access the request's CSP nonce.\n        \"\"\"\n        for middleware in VALID_MIDDLEWARE_VARIATIONS:\n            with self.settings(MIDDLEWARE=middleware):\n                response = self.client.get(path=\"/regular/basic/\")\n                self.assertEqual(response.status_code, 200)\n\n                html_root = self.parser.parse(stream=response.content)\n                self._fail_on_invalid_html(content=response.content, parser=self.parser)\n                self.assertContains(response, \"djDebug\")\n\n                namespaces = get_namespaces(element=html_root)\n                self._fail_if_found(\n                    root=html_root, path=\".//link\", namespaces=namespaces\n                )\n                self._fail_if_found(\n                    root=html_root, path=\".//script\", namespaces=namespaces\n                )\n\n    @override_settings(\n        DEBUG_TOOLBAR_CONFIG={\"DISABLE_PANELS\": set()},\n    )\n    def test_redirects_exists(self):\n        for middleware in VALID_MIDDLEWARE_VARIATIONS:\n            with self.settings(MIDDLEWARE=middleware):\n                response = self.client.get(path=\"/csp_view/\")\n                self.assertEqual(response.status_code, 200)\n\n                html_root = self.parser.parse(stream=response.content)\n                self._fail_on_invalid_html(content=response.content, parser=self.parser)\n                self.assertContains(response, \"djDebug\")\n\n                namespaces = get_namespaces(element=html_root)\n                context = response.context\n                nonce = str(context[\"toolbar\"].csp_nonce)\n                self._fail_if_missing(\n                    root=html_root, path=\".//link\", namespaces=namespaces, nonce=nonce\n                )\n                self._fail_if_missing(\n                    root=html_root, path=\".//script\", namespaces=namespaces, nonce=nonce\n                )\n\n    def test_panel_content_nonce_exists(self):\n        store = get_store()\n        for middleware in VALID_MIDDLEWARE_VARIATIONS:\n            with self.settings(MIDDLEWARE=middleware):\n                response = self.client.get(path=\"/csp_view/\")\n                self.assertEqual(response.status_code, 200)\n\n                request_ids = list(store.request_ids())\n                toolbar = DebugToolbar.fetch(request_ids[-1])\n                panels_to_check = [\"HistoryPanel\", \"TimerPanel\"]\n                for panel in panels_to_check:\n                    content = toolbar.get_panel_by_id(panel).content\n                    html_root = self.parser.parse(stream=content)\n                    namespaces = get_namespaces(element=html_root)\n                    nonce = str(toolbar.csp_nonce)\n                    self._fail_if_missing(\n                        root=html_root,\n                        path=\".//link\",\n                        namespaces=namespaces,\n                        nonce=nonce,\n                    )\n                    self._fail_if_missing(\n                        root=html_root,\n                        path=\".//script\",\n                        namespaces=namespaces,\n                        nonce=nonce,\n                    )\n\n    def test_missing(self):\n        \"\"\"A `nonce` should not exist when not using the `CSPMiddleware`.\"\"\"\n        response = self.client.get(path=\"/regular/basic/\")\n        self.assertEqual(response.status_code, 200)\n\n        html_root = self.parser.parse(stream=response.content)\n        self._fail_on_invalid_html(content=response.content, parser=self.parser)\n        self.assertContains(response, \"djDebug\")\n\n        namespaces = get_namespaces(element=html_root)\n        self._fail_if_found(root=html_root, path=\".//link\", namespaces=namespaces)\n        self._fail_if_found(root=html_root, path=\".//script\", namespaces=namespaces)\n"
  },
  {
    "path": "tests/test_decorators.py",
    "content": "from unittest.mock import patch\n\nfrom django.http import Http404, HttpResponse\nfrom django.test import AsyncRequestFactory, RequestFactory, TestCase\nfrom django.test.utils import override_settings\n\nfrom debug_toolbar.decorators import render_with_toolbar_language, require_show_toolbar\n\n\n@render_with_toolbar_language\ndef stub_view(request):\n    return HttpResponse(200)\n\n\n@require_show_toolbar\ndef stub_require_toolbar_view(request):\n    return HttpResponse(200)\n\n\n@require_show_toolbar\nasync def stub_require_toolbar_async_view(request):\n    return HttpResponse(200)\n\n\nclass TestRequireToolbar(TestCase):\n    \"\"\"\n    Tests require_toolbar functionality and async compatibility.\n    \"\"\"\n\n    def setUp(self):\n        self.factory = RequestFactory()\n        self.async_factory = AsyncRequestFactory()\n\n    @override_settings(DEBUG=True)\n    def test_require_toolbar_debug_true(self):\n        response = stub_require_toolbar_view(self.factory.get(\"/\"))\n        self.assertEqual(response.status_code, 200)\n\n    def test_require_toolbar_debug_false(self):\n        with self.assertRaises(Http404):\n            stub_require_toolbar_view(self.factory.get(\"/\"))\n\n    # Following tests additionally tests async compatibility\n    # of require_toolbar decorator\n    @override_settings(DEBUG=True)\n    async def test_require_toolbar_async_debug_true(self):\n        response = await stub_require_toolbar_async_view(self.async_factory.get(\"/\"))\n        self.assertEqual(response.status_code, 200)\n\n    async def test_require_toolbar_async_debug_false(self):\n        with self.assertRaises(Http404):\n            await stub_require_toolbar_async_view(self.async_factory.get(\"/\"))\n\n\n@override_settings(DEBUG=True, LANGUAGE_CODE=\"fr\")\nclass RenderWithToolbarLanguageTestCase(TestCase):\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"TOOLBAR_LANGUAGE\": \"de\"})\n    @patch(\"debug_toolbar.decorators.language_override\")\n    def test_uses_toolbar_language(self, mock_language_override):\n        stub_view(RequestFactory().get(\"/\"))\n        mock_language_override.assert_called_once_with(\"de\")\n\n    @patch(\"debug_toolbar.decorators.language_override\")\n    def test_defaults_to_django_language_code(self, mock_language_override):\n        stub_view(RequestFactory().get(\"/\"))\n        mock_language_override.assert_called_once_with(\"fr\")\n"
  },
  {
    "path": "tests/test_forms.py",
    "content": "from datetime import datetime, timezone\n\nfrom django import forms\nfrom django.test import TestCase\n\nfrom debug_toolbar.forms import SignedDataForm\n\nSIGNATURE = \"-WiogJKyy4E8Om00CrFSy0T6XHObwBa6Zb46u-vmeYE\"\n\nDATA = {\"date\": datetime(2020, 1, 1, tzinfo=timezone.utc), \"value\": \"foo\"}\nSIGNED_DATA = f'{{\"date\": \"2020-01-01 00:00:00+00:00\", \"value\": \"foo\"}}:{SIGNATURE}'\n\n\nclass FooForm(forms.Form):\n    value = forms.CharField()\n    # Include a datetime in the tests because it's not serializable back\n    # to a datetime by SignedDataForm\n    date = forms.DateTimeField()\n\n\nclass TestSignedDataForm(TestCase):\n    def test_signed_data(self):\n        data = {\"signed\": SignedDataForm.sign(DATA)}\n        form = SignedDataForm(data=data)\n        self.assertTrue(form.is_valid())\n        # Check the signature value\n        self.assertEqual(data[\"signed\"], SIGNED_DATA)\n\n    def test_verified_data(self):\n        form = SignedDataForm(data={\"signed\": SignedDataForm.sign(DATA)})\n        self.assertEqual(\n            form.verified_data(),\n            {\n                \"value\": \"foo\",\n                \"date\": \"2020-01-01 00:00:00+00:00\",\n            },\n        )\n        # Take it back to the foo form to validate the datetime is serialized\n        foo_form = FooForm(data=form.verified_data())\n        self.assertTrue(foo_form.is_valid())\n        self.assertDictEqual(foo_form.cleaned_data, DATA)\n\n    def test_initial_set_signed(self):\n        form = SignedDataForm(initial=DATA)\n        self.assertEqual(form.initial[\"signed\"], SIGNED_DATA)\n\n    def test_prevents_tampering(self):\n        data = {\"signed\": SIGNED_DATA.replace('\"value\": \"foo\"', '\"value\": \"bar\"')}\n        form = SignedDataForm(data=data)\n        self.assertFalse(form.is_valid())\n"
  },
  {
    "path": "tests/test_integration.py",
    "content": "import os\nimport re\nimport time\nimport unittest\nfrom unittest.mock import patch\n\nimport html5lib\nfrom django.contrib.staticfiles.testing import StaticLiveServerTestCase\nfrom django.core import signing\nfrom django.core.cache import cache\nfrom django.db import connection\nfrom django.http import HttpResponse\nfrom django.template.loader import get_template\nfrom django.test import RequestFactory\nfrom django.test.utils import override_settings\n\nfrom debug_toolbar.forms import SignedDataForm\nfrom debug_toolbar.middleware import (\n    DebugToolbarMiddleware,\n    show_toolbar,\n    show_toolbar_with_docker,\n)\nfrom debug_toolbar.panels import Panel\nfrom debug_toolbar.panels.cache import CachePanel\nfrom debug_toolbar.panels.history import HistoryPanel\nfrom debug_toolbar.panels.request import RequestPanel\nfrom debug_toolbar.panels.sql import SQLPanel\nfrom debug_toolbar.panels.templates import TemplatesPanel\nfrom debug_toolbar.panels.versions import VersionsPanel\nfrom debug_toolbar.store import get_store\nfrom debug_toolbar.toolbar import DebugToolbar\n\nfrom .base import BaseTestCase, IntegrationTestCase\nfrom .views import regular_view\n\ntry:\n    from selenium import webdriver\n    from selenium.common.exceptions import NoSuchElementException\n    from selenium.webdriver.common.by import By\n    from selenium.webdriver.firefox.options import Options\n    from selenium.webdriver.support import expected_conditions as EC\n    from selenium.webdriver.support.wait import WebDriverWait\nexcept ImportError:\n    webdriver = None\n\n\nrf = RequestFactory()\n\n\ndef toolbar_request_id():\n    def get_response(request):\n        return HttpResponse()\n\n    toolbar = DebugToolbar(rf.get(\"/\"), get_response)\n    toolbar.init_store()\n    return toolbar.request_id\n\n\nclass BuggyPanel(Panel):\n    def title(self):\n        return \"BuggyPanel\"\n\n    @property\n    def content(self):\n        raise Exception\n\n\n@override_settings(DEBUG=True)\nclass DebugToolbarTestCase(BaseTestCase):\n    def test_show_toolbar(self):\n        self.assertTrue(show_toolbar(self.request))\n\n    def test_show_toolbar_DEBUG(self):\n        with self.settings(DEBUG=False):\n            self.assertFalse(show_toolbar(self.request))\n\n    def test_show_toolbar_INTERNAL_IPS(self):\n        with self.settings(INTERNAL_IPS=[]):\n            self.assertFalse(show_toolbar(self.request))\n\n    @patch(\"socket.gethostbyname\", return_value=\"127.0.0.255\")\n    def test_show_toolbar_docker(self, mocked_gethostbyname):\n        with self.settings(INTERNAL_IPS=[]):\n            # Is true because REMOTE_ADDR is 127.0.0.1 and the 255\n            # is shifted to be 1.\n            self.assertFalse(show_toolbar(self.request))\n            self.assertTrue(show_toolbar_with_docker(self.request))\n        mocked_gethostbyname.assert_called_once_with(\"host.docker.internal\")\n\n    def test_not_iterating_over_INTERNAL_IPS(self):\n        \"\"\"Verify that the middleware does not iterate over INTERNAL_IPS in some way.\n\n        Some people use iptools.IpRangeList for their INTERNAL_IPS. This is a class\n        that can quickly answer the question if the setting contain a certain IP address,\n        but iterating over this object will drain all performance / blow up.\n        \"\"\"\n\n        class FailOnIteration:\n            def __iter__(self):\n                raise RuntimeError(\n                    \"The testcase failed: the code should not have iterated over INTERNAL_IPS\"\n                )\n\n            def __contains__(self, x):\n                return True\n\n        with self.settings(INTERNAL_IPS=FailOnIteration()):\n            response = self.client.get(\"/regular/basic/\")\n            self.assertEqual(response.status_code, 200)\n            self.assertContains(response, \"djDebug\")  # toolbar\n\n    def test_should_render_panels_RENDER_PANELS(self):\n        \"\"\"\n        The toolbar should force rendering panels on each request\n        based on the RENDER_PANELS setting.\n        \"\"\"\n        toolbar = DebugToolbar(self.request, self.get_response)\n        self.assertFalse(toolbar.should_render_panels())\n        toolbar.config[\"RENDER_PANELS\"] = True\n        self.assertTrue(toolbar.should_render_panels())\n        toolbar.config[\"RENDER_PANELS\"] = None\n        self.assertFalse(toolbar.should_render_panels())\n\n    def _resolve_stats(self, path):\n        # takes stats from Request panel\n        request = rf.get(path)\n        panel = self.toolbar.get_panel_by_id(RequestPanel.panel_id)\n        response = panel.process_request(request)\n        panel.generate_stats(request, response)\n        return panel.get_stats()\n\n    def test_url_resolving_positional(self):\n        stats = self._resolve_stats(\"/resolving1/a/b/\")\n        self.assertEqual(stats[\"view_urlname\"], \"positional-resolving\")\n        self.assertEqual(stats[\"view_func\"], \"tests.views.resolving_view\")\n        self.assertEqual(stats[\"view_args\"], (\"a\", \"b\"))\n        self.assertEqual(stats[\"view_kwargs\"], {})\n\n    def test_url_resolving_named(self):\n        stats = self._resolve_stats(\"/resolving2/a/b/\")\n        self.assertEqual(stats[\"view_args\"], ())\n        self.assertEqual(stats[\"view_kwargs\"], {\"arg1\": \"a\", \"arg2\": \"b\"})\n\n    def test_url_resolving_mixed(self):\n        stats = self._resolve_stats(\"/resolving3/a/\")\n        self.assertEqual(stats[\"view_args\"], (\"a\",))\n        self.assertEqual(stats[\"view_kwargs\"], {\"arg2\": \"default\"})\n\n    def test_url_resolving_bad(self):\n        stats = self._resolve_stats(\"/non-existing-url/\")\n        self.assertEqual(stats[\"view_urlname\"], \"None\")\n        self.assertEqual(stats[\"view_args\"], \"None\")\n        self.assertEqual(stats[\"view_kwargs\"], \"None\")\n        self.assertEqual(stats[\"view_func\"], \"<no view>\")\n\n    def test_middleware_response_insertion(self):\n        def get_response(request):\n            return regular_view(request, \"İ\")\n\n        response = DebugToolbarMiddleware(get_response)(self.request)\n        # check toolbar insertion before \"</body>\"\n        self.assertContains(response, \"</div>\\n</body>\")\n\n    def test_middleware_no_injection_when_encoded(self):\n        def get_response(request):\n            response = HttpResponse(\"<html><body></body></html>\")\n            response[\"Content-Encoding\"] = \"something\"\n            return response\n\n        response = DebugToolbarMiddleware(get_response)(self.request)\n        self.assertEqual(response.content, b\"<html><body></body></html>\")\n\n    def test_cache_page(self):\n        # Clear the cache before testing the views. Other tests that use cached_view\n        # may run earlier and cause fewer cache calls.\n        cache.clear()\n        response = self.client.get(\"/cached_view/\")\n        self.assertEqual(\n            len(response.toolbar.get_panel_by_id(CachePanel.panel_id).calls), 3\n        )\n        response = self.client.get(\"/cached_view/\")\n        self.assertEqual(\n            len(response.toolbar.get_panel_by_id(CachePanel.panel_id).calls), 2\n        )\n\n    @override_settings(ROOT_URLCONF=\"tests.urls_use_package_urls\")\n    def test_include_package_urls(self):\n        \"\"\"Test urlsconf that uses the debug_toolbar.urls in the include call\"\"\"\n        # Clear the cache before testing the views. Other tests that use cached_view\n        # may run earlier and cause fewer cache calls.\n        cache.clear()\n        response = self.client.get(\"/cached_view/\")\n        self.assertEqual(\n            len(response.toolbar.get_panel_by_id(CachePanel.panel_id).calls), 3\n        )\n        response = self.client.get(\"/cached_view/\")\n        self.assertEqual(\n            len(response.toolbar.get_panel_by_id(CachePanel.panel_id).calls), 2\n        )\n\n    def test_low_level_cache_view(self):\n        \"\"\"Test cases when low level caching API is used within a request.\"\"\"\n        response = self.client.get(\"/cached_low_level_view/\")\n        self.assertEqual(\n            len(response.toolbar.get_panel_by_id(CachePanel.panel_id).calls), 2\n        )\n        response = self.client.get(\"/cached_low_level_view/\")\n        self.assertEqual(\n            len(response.toolbar.get_panel_by_id(CachePanel.panel_id).calls), 1\n        )\n\n    def test_cache_disable_instrumentation(self):\n        \"\"\"\n        Verify that middleware cache usages before and after\n        DebugToolbarMiddleware are not counted.\n        \"\"\"\n        self.assertIsNone(cache.set(\"UseCacheAfterToolbar.before\", None))\n        self.assertIsNone(cache.set(\"UseCacheAfterToolbar.after\", None))\n        response = self.client.get(\"/execute_sql/\")\n        self.assertEqual(cache.get(\"UseCacheAfterToolbar.before\"), 1)\n        self.assertEqual(cache.get(\"UseCacheAfterToolbar.after\"), 1)\n        self.assertEqual(\n            len(response.toolbar.get_panel_by_id(CachePanel.panel_id).calls), 0\n        )\n\n    def test_is_toolbar_request(self):\n        request = rf.get(\"/__debug__/render_panel/\")\n        self.assertTrue(self.toolbar.is_toolbar_request(request))\n\n        request = rf.get(\"/invalid/__debug__/render_panel/\")\n        self.assertFalse(self.toolbar.is_toolbar_request(request))\n\n        request = rf.get(\"/render_panel/\")\n        self.assertFalse(self.toolbar.is_toolbar_request(request))\n\n    @override_settings(ROOT_URLCONF=\"tests.urls_invalid\")\n    def test_is_toolbar_request_without_djdt_urls(self):\n        \"\"\"Test cases when the toolbar urls aren't configured.\"\"\"\n        request = rf.get(\"/__debug__/render_panel/\")\n        self.assertFalse(self.toolbar.is_toolbar_request(request))\n\n        request = rf.get(\"/render_panel/\")\n        self.assertFalse(self.toolbar.is_toolbar_request(request))\n\n    @override_settings(ROOT_URLCONF=\"tests.urls_invalid\")\n    def test_is_toolbar_request_override_request_urlconf(self):\n        \"\"\"Test cases when the toolbar URL is configured on the request.\"\"\"\n        request = rf.get(\"/__debug__/render_panel/\")\n        self.assertFalse(self.toolbar.is_toolbar_request(request))\n\n        # Verify overriding the urlconf on the request is valid.\n        request.urlconf = \"tests.urls\"\n        self.assertTrue(self.toolbar.is_toolbar_request(request))\n\n    def test_is_toolbar_request_with_script_prefix(self):\n        \"\"\"\n        Test cases when Django is running under a path prefix, such as via the\n        FORCE_SCRIPT_NAME setting.\n        \"\"\"\n        request = rf.get(\"/__debug__/render_panel/\", SCRIPT_NAME=\"/path/\")\n        self.assertTrue(self.toolbar.is_toolbar_request(request))\n\n        request = rf.get(\"/invalid/__debug__/render_panel/\", SCRIPT_NAME=\"/path/\")\n        self.assertFalse(self.toolbar.is_toolbar_request(request))\n\n        request = rf.get(\"/render_panel/\", SCRIPT_NAME=\"/path/\")\n        self.assertFalse(self.toolbar.is_toolbar_request(self.request))\n\n    def test_data_gone(self):\n        response = self.client.get(\n            \"/__debug__/render_panel/?request_id=GONE&panel_id=RequestPanel\"\n        )\n        self.assertIn(\"Please reload the page and retry.\", response.json()[\"content\"])\n\n    def test_sql_page(self):\n        response = self.client.get(\"/execute_sql/\")\n        self.assertEqual(\n            len(response.toolbar.get_panel_by_id(\"SQLPanel\").get_stats()[\"queries\"]), 1\n        )\n\n    def test_async_sql_page(self):\n        response = self.client.get(\"/async_execute_sql/\")\n        self.assertEqual(\n            len(response.toolbar.get_panel_by_id(\"SQLPanel\").get_stats()[\"queries\"]), 2\n        )\n\n    def test_concurrent_async_sql_page(self):\n        response = self.client.get(\"/async_execute_sql_concurrently/\")\n        self.assertEqual(\n            len(response.toolbar.get_panel_by_id(\"SQLPanel\").get_stats()[\"queries\"]), 2\n        )\n\n\n@override_settings(DEBUG=True)\nclass DebugToolbarIntegrationTestCase(IntegrationTestCase):\n    def test_middleware(self):\n        response = self.client.get(\"/execute_sql/\")\n        self.assertEqual(response.status_code, 200)\n        self.assertContains(response, \"djDebug\")\n\n    @override_settings(DEFAULT_CHARSET=\"iso-8859-1\")\n    def test_non_utf8_charset(self):\n        response = self.client.get(\"/regular/ASCII/\")\n        self.assertContains(response, \"ASCII\")  # template\n        self.assertContains(response, \"djDebug\")  # toolbar\n\n        response = self.client.get(\"/regular/LÀTÍN/\")\n        self.assertContains(response, \"LÀTÍN\")  # template\n        self.assertContains(response, \"djDebug\")  # toolbar\n\n    def test_html5_validation(self):\n        response = self.client.get(\"/regular/HTML5/\")\n        parser = html5lib.HTMLParser()\n        content = response.content\n        parser.parse(content)\n        if parser.errors:\n            default_msg = [\"Content is invalid HTML:\"]\n            lines = content.split(b\"\\n\")\n            for position, errorcode, datavars in parser.errors:\n                default_msg.append(f\"  {html5lib.constants.E[errorcode]}\" % datavars)\n                default_msg.append(f\"    {lines[position[0] - 1]!r}\")\n            msg = self._formatMessage(None, \"\\n\".join(default_msg))\n            raise self.failureException(msg)\n\n    def test_render_panel_checks_show_toolbar(self):\n        request_id = toolbar_request_id()\n        get_store().save_panel(\n            request_id, VersionsPanel.panel_id, {\"value\": \"Test data\"}\n        )\n        data = {\"request_id\": request_id, \"panel_id\": VersionsPanel.panel_id}\n\n        url = \"/__debug__/render_panel/\"\n        response = self.client.get(url, data)\n        self.assertEqual(response.status_code, 200)\n        response = self.client.get(\n            url, data, headers={\"x-requested-with\": \"XMLHttpRequest\"}\n        )\n        self.assertEqual(response.status_code, 200)\n        with self.settings(INTERNAL_IPS=[]):\n            response = self.client.get(url, data)\n            self.assertEqual(response.status_code, 404)\n            response = self.client.get(\n                url, data, headers={\"x-requested-with\": \"XMLHttpRequest\"}\n            )\n            self.assertEqual(response.status_code, 404)\n\n    def test_middleware_render_toolbar_json(self):\n        \"\"\"Verify the toolbar is rendered and data is stored for a json request.\"\"\"\n        store = get_store()\n        self.assertEqual(len(list(store.request_ids())), 0)\n\n        data = {\"foo\": \"bar\"}\n        response = self.client.get(\"/json_view/\", data, content_type=\"application/json\")\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(response.content.decode(\"utf-8\"), '{\"foo\": \"bar\"}')\n        # Check the history panel's stats to verify the toolbar rendered properly.\n        request_ids = list(store.request_ids())\n        self.assertEqual(len(request_ids), 1)\n        toolbar = DebugToolbar.fetch(request_ids[0])\n        self.assertEqual(\n            toolbar.get_panel_by_id(HistoryPanel.panel_id).get_stats()[\"data\"],\n            {\"foo\": \"bar\"},\n        )\n\n    def test_template_source_checks_show_toolbar(self):\n        template = get_template(\"basic.html\")\n        url = \"/__debug__/template_source/\"\n        data = {\n            \"template\": template.template.name,\n            \"template_origin\": signing.dumps(template.template.origin.name),\n        }\n\n        response = self.client.get(url, data)\n        self.assertEqual(response.status_code, 200)\n        response = self.client.get(\n            url, data, headers={\"x-requested-with\": \"XMLHttpRequest\"}\n        )\n        self.assertEqual(response.status_code, 200)\n        with self.settings(INTERNAL_IPS=[]):\n            response = self.client.get(url, data)\n            self.assertEqual(response.status_code, 404)\n            response = self.client.get(\n                url, data, headers={\"x-requested-with\": \"XMLHttpRequest\"}\n            )\n            self.assertEqual(response.status_code, 404)\n\n    def test_template_source_errors(self):\n        url = \"/__debug__/template_source/\"\n\n        response = self.client.get(url, {})\n        self.assertContains(\n            response, '\"template_origin\" key is required', status_code=400\n        )\n\n        template = get_template(\"basic.html\")\n        response = self.client.get(\n            url,\n            {\"template_origin\": signing.dumps(template.template.origin.name) + \"xyz\"},\n        )\n        self.assertContains(response, '\"template_origin\" is invalid', status_code=400)\n\n        response = self.client.get(\n            url, {\"template_origin\": signing.dumps(\"does_not_exist.html\")}\n        )\n        self.assertContains(response, \"Template Does Not Exist: does_not_exist.html\")\n\n    def test_sql_select_checks_show_toolbar(self):\n        self.client.get(\"/execute_sql/\")\n        request_ids = list(get_store().request_ids())\n        request_id = request_ids[-1]\n        toolbar = DebugToolbar.fetch(request_id, SQLPanel.panel_id)\n        panel = toolbar.get_panel_by_id(SQLPanel.panel_id)\n        djdt_query_id = panel.get_stats()[\"queries\"][-1][\"djdt_query_id\"]\n\n        url = \"/__debug__/sql_select/\"\n        data = {\n            \"signed\": SignedDataForm.sign(\n                {\n                    \"request_id\": request_id,\n                    \"djdt_query_id\": djdt_query_id,\n                }\n            )\n        }\n\n        response = self.client.post(url, data)\n        self.assertEqual(response.status_code, 200)\n        response = self.client.post(\n            url, data, headers={\"x-requested-with\": \"XMLHttpRequest\"}\n        )\n        self.assertEqual(response.status_code, 200)\n        with self.settings(INTERNAL_IPS=[]):\n            response = self.client.post(url, data)\n            self.assertEqual(response.status_code, 404)\n            response = self.client.post(\n                url, data, headers={\"x-requested-with\": \"XMLHttpRequest\"}\n            )\n            self.assertEqual(response.status_code, 404)\n\n    def test_sql_explain_checks_show_toolbar(self):\n        self.client.get(\"/execute_sql/\")\n        request_ids = list(get_store().request_ids())\n        request_id = request_ids[-1]\n        toolbar = DebugToolbar.fetch(request_id, SQLPanel.panel_id)\n        panel = toolbar.get_panel_by_id(SQLPanel.panel_id)\n        djdt_query_id = panel.get_stats()[\"queries\"][-1][\"djdt_query_id\"]\n\n        url = \"/__debug__/sql_explain/\"\n        data = {\n            \"signed\": SignedDataForm.sign(\n                {\n                    \"request_id\": request_id,\n                    \"djdt_query_id\": djdt_query_id,\n                }\n            )\n        }\n\n        response = self.client.post(url, data)\n        self.assertEqual(response.status_code, 200)\n        response = self.client.post(\n            url, data, headers={\"x-requested-with\": \"XMLHttpRequest\"}\n        )\n        self.assertEqual(response.status_code, 200)\n        with self.settings(INTERNAL_IPS=[]):\n            response = self.client.post(url, data)\n            self.assertEqual(response.status_code, 404)\n            response = self.client.post(\n                url, data, headers={\"x-requested-with\": \"XMLHttpRequest\"}\n            )\n            self.assertEqual(response.status_code, 404)\n\n    @unittest.skipUnless(\n        connection.vendor == \"postgresql\", \"Test valid only on PostgreSQL\"\n    )\n    def test_sql_explain_postgres_union_query(self):\n        \"\"\"\n        Confirm select queries that start with a parenthesis can be explained.\n        \"\"\"\n        self.client.get(\"/execute_union_sql/\")\n        request_ids = list(get_store().request_ids())\n        request_id = request_ids[-1]\n        toolbar = DebugToolbar.fetch(request_id, SQLPanel.panel_id)\n        panel = toolbar.get_panel_by_id(SQLPanel.panel_id)\n        djdt_query_id = panel.get_stats()[\"queries\"][-1][\"djdt_query_id\"]\n\n        url = \"/__debug__/sql_explain/\"\n        data = {\n            \"signed\": SignedDataForm.sign(\n                {\n                    \"request_id\": request_id,\n                    \"djdt_query_id\": djdt_query_id,\n                }\n            )\n        }\n\n        response = self.client.post(url, data)\n        self.assertEqual(response.status_code, 200)\n\n    @unittest.skipUnless(\n        connection.vendor == \"postgresql\", \"Test valid only on PostgreSQL\"\n    )\n    def test_sql_explain_postgres_json_field(self):\n        self.client.get(\"/execute_json_sql/\")\n        request_ids = list(get_store().request_ids())\n        request_id = request_ids[-1]\n        toolbar = DebugToolbar.fetch(request_id, SQLPanel.panel_id)\n        panel = toolbar.get_panel_by_id(SQLPanel.panel_id)\n        djdt_query_id = panel.get_stats()[\"queries\"][-1][\"djdt_query_id\"]\n\n        url = \"/__debug__/sql_explain/\"\n        data = {\n            \"signed\": SignedDataForm.sign(\n                {\n                    \"request_id\": request_id,\n                    \"djdt_query_id\": djdt_query_id,\n                }\n            )\n        }\n        response = self.client.post(url, data)\n        self.assertEqual(response.status_code, 200)\n        response = self.client.post(\n            url, data, headers={\"x-requested-with\": \"XMLHttpRequest\"}\n        )\n        self.assertEqual(response.status_code, 200)\n        with self.settings(INTERNAL_IPS=[]):\n            response = self.client.post(url, data)\n            self.assertEqual(response.status_code, 404)\n            response = self.client.post(\n                url, data, headers={\"x-requested-with\": \"XMLHttpRequest\"}\n            )\n            self.assertEqual(response.status_code, 404)\n\n    def test_sql_profile_checks_show_toolbar(self):\n        self.client.get(\"/execute_sql/\")\n        request_ids = list(get_store().request_ids())\n        request_id = request_ids[-1]\n        toolbar = DebugToolbar.fetch(request_id, SQLPanel.panel_id)\n        panel = toolbar.get_panel_by_id(SQLPanel.panel_id)\n        djdt_query_id = panel.get_stats()[\"queries\"][-1][\"djdt_query_id\"]\n\n        url = \"/__debug__/sql_profile/\"\n        data = {\n            \"signed\": SignedDataForm.sign(\n                {\n                    \"request_id\": request_id,\n                    \"djdt_query_id\": djdt_query_id,\n                }\n            )\n        }\n\n        response = self.client.post(url, data)\n        self.assertEqual(response.status_code, 200)\n        response = self.client.post(\n            url, data, headers={\"x-requested-with\": \"XMLHttpRequest\"}\n        )\n        self.assertEqual(response.status_code, 200)\n        with self.settings(INTERNAL_IPS=[]):\n            response = self.client.post(url, data)\n            self.assertEqual(response.status_code, 404)\n            response = self.client.post(\n                url, data, headers={\"x-requested-with\": \"XMLHttpRequest\"}\n            )\n            self.assertEqual(response.status_code, 404)\n\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"RENDER_PANELS\": True})\n    def test_render_panels_in_request(self):\n        \"\"\"\n        Test that panels are are rendered during the request with\n        RENDER_PANELS=TRUE\n        \"\"\"\n        url = \"/regular/basic/\"\n        response = self.client.get(url)\n        self.assertIn(b'id=\"djDebug\"', response.content)\n        # Verify the store id is not included.\n        self.assertNotIn(b\"data-request-id\", response.content)\n        # Verify the history panel was disabled\n        self.assertIn(\n            b'<input type=\"checkbox\" data-cookie=\"djdtHistoryPanel\" '\n            b'title=\"Enable for next and successive requests\">',\n            response.content,\n        )\n        # Verify the a panel was rendered\n        self.assertIn(b\"Response headers\", response.content)\n\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"RENDER_PANELS\": False})\n    def test_load_panels(self):\n        \"\"\"\n        Test that panels are not rendered during the request with\n        RENDER_PANELS=False\n        \"\"\"\n        url = \"/execute_sql/\"\n        response = self.client.get(url)\n        self.assertIn(b'id=\"djDebug\"', response.content)\n        # Verify the store id is included.\n        self.assertIn(b\"data-request-id\", response.content)\n        # Verify the history panel was not disabled\n        self.assertNotIn(\n            b'<input type=\"checkbox\" data-cookie=\"djdtHistoryPanel\" '\n            b'title=\"Enable for next and successive requests\">',\n            response.content,\n        )\n        # Verify the a panel was not rendered\n        self.assertNotIn(b\"Response headers\", response.content)\n\n    def test_view_returns_template_response(self):\n        response = self.client.get(\"/template_response/basic/\")\n        self.assertEqual(response.status_code, 200)\n\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"DISABLE_PANELS\": set()})\n    def test_intercept_redirects(self):\n        response = self.client.get(\"/redirect/\")\n        self.assertEqual(response.status_code, 200)\n        # Link to LOCATION header.\n        self.assertIn(b'href=\"/regular/redirect/\"', response.content)\n\n    def test_server_timing_headers(self):\n        response = self.client.get(\"/execute_sql/\")\n        server_timing = response[\"Server-Timing\"]\n        expected_partials = [\n            r'TimerPanel_utime;dur=(\\d)*(\\.(\\d)*)?;desc=\"User CPU time\", ',\n            r'TimerPanel_stime;dur=(\\d)*(\\.(\\d)*)?;desc=\"System CPU time\", ',\n            r'TimerPanel_total;dur=(\\d)*(\\.(\\d)*)?;desc=\"Total CPU time\", ',\n            r'TimerPanel_total_time;dur=(\\d)*(\\.(\\d)*)?;desc=\"Elapsed time\", ',\n            r'SQLPanel_sql_time;dur=(\\d)*(\\.(\\d)*)?;desc=\"SQL 1 queries\", ',\n            r'CachePanel_total_time;dur=0;desc=\"Cache 0 Calls\"',\n        ]\n        for expected in expected_partials:\n            self.assertTrue(re.compile(expected).search(server_timing))\n\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"RENDER_PANELS\": True})\n    def test_timer_panel(self):\n        response = self.client.get(\"/regular/basic/\")\n        self.assertEqual(response.status_code, 200)\n        self.assertContains(\n            response,\n            '<script type=\"module\" src=\"/static/debug_toolbar/js/timer.js\" async>',\n        )\n\n    def test_auth_login_view_without_redirect(self):\n        response = self.client.get(\"/login_without_redirect/\")\n        self.assertEqual(response.status_code, 200)\n        parser = html5lib.HTMLParser()\n        doc = parser.parse(response.content)\n        el = doc.find(\".//*[@id='djDebug']\")\n        request_id = el.attrib[\"data-request-id\"]\n        response = self.client.get(\n            \"/__debug__/render_panel/\",\n            {\"request_id\": request_id, \"panel_id\": TemplatesPanel.panel_id},\n        )\n        self.assertEqual(response.status_code, 200)\n        # The key None (without quotes) exists in the list of template\n        # variables.\n        self.assertIn(\"None: &#x27;&#x27;\", response.json()[\"content\"])\n\n\n@unittest.skipIf(webdriver is None, \"selenium isn't installed\")\n@unittest.skipUnless(\n    os.environ.get(\"DJANGO_SELENIUM_TESTS\"), \"selenium tests not requested\"\n)\n@override_settings(DEBUG=True)\nclass DebugToolbarLiveTestCase(StaticLiveServerTestCase):\n    @classmethod\n    def setUpClass(cls):\n        super().setUpClass()\n        options = Options()\n        if os.environ.get(\"CI\"):\n            options.add_argument(\"-headless\")\n        # Set the browser preference to light mode for consistent testing\n        options.set_preference(\"ui.systemUsesDarkTheme\", 0)\n        options.set_preference(\"ui.prefersReducedMotion\", 0)\n        cls.selenium = webdriver.Firefox(options=options)\n\n    @classmethod\n    def tearDownClass(cls):\n        cls.selenium.quit()\n        super().tearDownClass()\n\n    def get(self, url):\n        self.selenium.get(self.live_server_url + url)\n\n    @property\n    def wait(self):\n        return WebDriverWait(self.selenium, timeout=3)\n\n    def test_basic(self):\n        self.get(\"/regular/basic/\")\n        version_panel = self.selenium.find_element(By.ID, VersionsPanel.panel_id)\n\n        # Versions panel isn't loaded\n        with self.assertRaises(NoSuchElementException):\n            version_panel.find_element(By.TAG_NAME, \"table\")\n\n        # Click to show the versions panel\n        self.selenium.find_element(By.CLASS_NAME, VersionsPanel.panel_id).click()\n\n        # Version panel loads\n        table = self.wait.until(\n            lambda selenium: version_panel.find_element(By.TAG_NAME, \"table\")\n        )\n        self.assertIn(\"Name\", table.text)\n        self.assertIn(\"Version\", table.text)\n\n    @override_settings(\n        DEBUG_TOOLBAR_CONFIG={\n            \"DISABLE_PANELS\": {\"debug_toolbar.panels.redirects.RedirectsPanel\"}\n        }\n    )\n    def test_basic_jinja(self):\n        self.get(\"/regular_jinja/basic\")\n        template_panel = self.selenium.find_element(By.ID, TemplatesPanel.panel_id)\n\n        # Click to show the template panel\n        self.selenium.find_element(By.CLASS_NAME, TemplatesPanel.panel_id).click()\n\n        # This should be 2 templates rendered, including base.html See\n        # JinjaTemplateTestCase.test_django_jinja2_parent_template_instrumented\n        self.assertIn(\"Templates (1 rendered)\", template_panel.text)\n        self.assertIn(\"basic.jinja\", template_panel.text)\n\n    @override_settings(\n        DEBUG_TOOLBAR_CONFIG={\n            \"DISABLE_PANELS\": {\"debug_toolbar.panels.redirects.RedirectsPanel\"}\n        }\n    )\n    def test_rerender_on_history_switch(self):\n        self.get(\"/regular_jinja/basic\")\n        # Make a new request so the history panel has more than one option.\n        self.get(\"/execute_sql/\")\n        template_panel = self.selenium.find_element(By.ID, HistoryPanel.panel_id)\n        # Record the current side panel of buttons for later comparison.\n        previous_button_panel = self.selenium.find_element(\n            By.ID, \"djDebugPanelList\"\n        ).text\n\n        # Click to show the history panel\n        self.selenium.find_element(By.CLASS_NAME, HistoryPanel.panel_id).click()\n        # Click to switch back to the jinja page view snapshot\n        list(template_panel.find_elements(By.CSS_SELECTOR, \"button\"))[-1].click()\n\n        current_button_panel = self.selenium.find_element(\n            By.ID, \"djDebugPanelList\"\n        ).text\n        # Verify the button side panels have updated.\n        self.assertNotEqual(previous_button_panel, current_button_panel)\n        self.assertNotIn(\"1 query\", current_button_panel)\n        self.assertIn(\"1 query\", previous_button_panel)\n\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"RESULTS_CACHE_SIZE\": 0})\n    def test_expired_store(self):\n        self.get(\"/regular/basic/\")\n        version_panel = self.selenium.find_element(By.ID, VersionsPanel.panel_id)\n\n        # Click to show the version panel\n        self.selenium.find_element(By.CLASS_NAME, VersionsPanel.panel_id).click()\n\n        # Version panel doesn't loads\n        error = self.wait.until(\n            lambda selenium: version_panel.find_element(By.TAG_NAME, \"p\")\n        )\n        self.assertIn(\"Data for this panel isn't available anymore.\", error.text)\n\n    @override_settings(\n        TEMPLATES=[\n            {\n                \"BACKEND\": \"django.template.backends.django.DjangoTemplates\",\n                \"OPTIONS\": {\n                    \"loaders\": [\n                        (\n                            \"django.template.loaders.cached.Loader\",\n                            (\n                                \"django.template.loaders.filesystem.Loader\",\n                                \"django.template.loaders.app_directories.Loader\",\n                            ),\n                        )\n                    ]\n                },\n            }\n        ],\n    )\n    def test_django_cached_template_loader(self):\n        self.get(\"/regular/basic/\")\n        version_panel = self.selenium.find_element(By.ID, TemplatesPanel.panel_id)\n\n        # Click to show the templates panel\n        self.selenium.find_element(By.CLASS_NAME, TemplatesPanel.panel_id).click()\n\n        # Templates panel loads\n        trigger = self.wait.until(\n            lambda selenium: version_panel.find_element(By.CSS_SELECTOR, \".remoteCall\")\n        )\n        trigger.click()\n\n        # Verify the code is displayed\n        self.wait.until(\n            lambda selenium: self.selenium.find_element(\n                By.CSS_SELECTOR, \"#djDebugWindow code\"\n            )\n        )\n\n    def test_sql_action_and_go_back(self):\n        self.get(\"/execute_sql/\")\n        sql_panel = self.selenium.find_element(By.ID, SQLPanel.panel_id)\n        debug_window = self.selenium.find_element(By.ID, \"djDebugWindow\")\n\n        # Click to show the SQL panel\n        self.selenium.find_element(By.CLASS_NAME, SQLPanel.panel_id).click()\n\n        # SQL panel loads\n        button = self.wait.until(\n            EC.visibility_of_element_located((By.CSS_SELECTOR, \".remoteCall\"))\n        )\n        button.click()\n\n        # SQL selected window loads\n        self.wait.until(EC.visibility_of(debug_window))\n        self.assertIn(\"SQL selected\", debug_window.text)\n\n        # Close the SQL selected window\n        debug_window.find_element(By.CLASS_NAME, \"djDebugClose\").click()\n        self.wait.until(EC.invisibility_of_element(debug_window))\n\n        # SQL panel is still visible\n        self.assertTrue(sql_panel.is_displayed())\n\n    @override_settings(DEBUG_TOOLBAR_PANELS=[\"tests.test_integration.BuggyPanel\"])\n    def test_displays_server_error(self):\n        self.get(\"/regular/basic/\")\n        debug_window = self.selenium.find_element(By.ID, \"djDebugWindow\")\n        self.selenium.find_element(By.CLASS_NAME, BuggyPanel.panel_id).click()\n        self.wait.until(EC.visibility_of(debug_window))\n        self.assertEqual(debug_window.text, \"500: Internal Server Error\\n»\")\n\n    def test_toolbar_language_will_render_to_default_language_when_not_set(self):\n        self.get(\"/regular/basic/\")\n        hide_button = self.selenium.find_element(By.ID, \"djHideToolBarButton\")\n        assert hide_button.text == \"Hide »\"\n\n        self.get(\"/execute_sql/\")\n        sql_panel = self.selenium.find_element(By.ID, SQLPanel.panel_id)\n\n        # Click to show the SQL panel\n        self.selenium.find_element(By.CLASS_NAME, SQLPanel.panel_id).click()\n\n        table = self.wait.until(\n            lambda selenium: sql_panel.find_element(By.TAG_NAME, \"table\")\n        )\n        self.assertIn(\"Query\", table.text)\n        self.assertIn(\"Action\", table.text)\n\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"TOOLBAR_LANGUAGE\": \"pt-br\"})\n    def test_toolbar_language_will_render_to_locale_when_set(self):\n        self.get(\"/regular/basic/\")\n        hide_button = self.selenium.find_element(By.ID, \"djHideToolBarButton\")\n        assert hide_button.text == \"Esconder »\"\n\n        self.get(\"/execute_sql/\")\n        sql_panel = self.selenium.find_element(By.ID, SQLPanel.panel_id)\n\n        # Click to show the SQL panel\n        self.selenium.find_element(By.CLASS_NAME, SQLPanel.panel_id).click()\n\n        table = self.wait.until(\n            lambda selenium: sql_panel.find_element(By.TAG_NAME, \"table\")\n        )\n        self.assertIn(\"Query\", table.text)\n        self.assertIn(\"Linha\", table.text)\n\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"TOOLBAR_LANGUAGE\": \"en-us\"})\n    @override_settings(LANGUAGE_CODE=\"de\")\n    def test_toolbar_language_will_render_to_locale_when_set_both(self):\n        self.get(\"/regular/basic/\")\n        hide_button = self.selenium.find_element(By.ID, \"djHideToolBarButton\")\n        assert hide_button.text == \"Hide »\"\n\n        self.get(\"/execute_sql/\")\n        sql_panel = self.selenium.find_element(By.ID, SQLPanel.panel_id)\n\n        # Click to show the SQL panel\n        self.selenium.find_element(By.CLASS_NAME, SQLPanel.panel_id).click()\n\n        table = self.wait.until(\n            lambda selenium: sql_panel.find_element(By.TAG_NAME, \"table\")\n        )\n        self.assertIn(\"Query\", table.text)\n        self.assertIn(\"Action\", table.text)\n\n    def test_ajax_dont_refresh(self):\n        self.get(\"/ajax/\")\n        make_ajax = self.selenium.find_element(By.ID, \"click_for_ajax\")\n        make_ajax.click()\n        history_panel = self.selenium.find_element(By.ID, \"djdt-HistoryPanel\")\n        self.assertIn(\"/ajax/\", history_panel.text)\n        self.assertNotIn(\"/json_view/\", history_panel.text)\n\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"UPDATE_ON_FETCH\": True})\n    def test_ajax_refresh(self):\n        self.get(\"/ajax/\")\n        make_ajax = self.selenium.find_element(By.ID, \"click_for_ajax\")\n        make_ajax.click()\n        # Sleep a tad to avoid a selenium.common.exceptions.StaleElementReferenceException\n        # when looking for the small text of the history panel\n        time.sleep(0.1)\n        # Need to wait until the ajax request is over and json_view is displayed on the toolbar\n        self.wait.until(\n            lambda selenium: (\n                self.selenium.find_element(\n                    By.CSS_SELECTOR, \"#djdt-HistoryPanel a.HistoryPanel small\"\n                ).text\n                == \"/json_view/\"\n            )\n        )\n        history_panel = self.selenium.find_element(By.ID, \"djdt-HistoryPanel\")\n        self.assertNotIn(\"/ajax/\", history_panel.text)\n        self.assertIn(\"/json_view/\", history_panel.text)\n\n    def test_theme_toggle(self):\n        self.get(\"/regular/basic/\")\n\n        toolbar = self.selenium.find_element(By.ID, \"djDebug\")\n\n        # Check that the default theme is auto\n        self.assertEqual(toolbar.get_attribute(\"data-user-theme\"), \"auto\")\n\n        # The theme toggle button is shown on the toolbar\n        toggle_button = self.selenium.find_element(By.ID, \"djToggleThemeButton\")\n        self.assertTrue(toggle_button.is_displayed())\n\n        # The browser is set to light mode via Firefox preferences\n        # With light mode system preference, the order is: auto -> dark -> light -> auto\n        # Check that auto initially uses light theme\n        self.assertEqual(toolbar.get_attribute(\"data-user-theme\"), \"auto\")\n        self.assertEqual(toolbar.get_attribute(\"data-theme\"), \"light\")\n\n        # The theme changes when user clicks the button\n        toggle_button.click()  # auto -> dark\n        self.assertEqual(toolbar.get_attribute(\"data-user-theme\"), \"dark\")\n        self.assertEqual(toolbar.get_attribute(\"data-theme\"), \"dark\")\n\n        toggle_button.click()  # dark -> light\n        self.assertEqual(toolbar.get_attribute(\"data-user-theme\"), \"light\")\n        self.assertEqual(toolbar.get_attribute(\"data-theme\"), \"light\")\n\n        toggle_button.click()  # light -> auto\n        self.assertEqual(toolbar.get_attribute(\"data-user-theme\"), \"auto\")\n        self.assertEqual(toolbar.get_attribute(\"data-theme\"), \"light\")\n\n        # Enter the page again to check that user settings is saved\n        self.get(\"/regular/basic/\")\n        toolbar = self.selenium.find_element(By.ID, \"djDebug\")\n        self.assertEqual(toolbar.get_attribute(\"data-user-theme\"), \"auto\")\n        self.assertEqual(toolbar.get_attribute(\"data-theme\"), \"light\")\n\n    def test_async_sql_action(self):\n        self.get(\"/async_execute_sql/\")\n        self.selenium.find_element(By.ID, \"SQLPanel\")\n        self.selenium.find_element(By.ID, \"djDebugWindow\")\n\n        # Click to show the SQL panel\n        self.selenium.find_element(By.CLASS_NAME, \"SQLPanel\").click()\n\n        # SQL panel loads\n        self.wait.until(\n            EC.visibility_of_element_located((By.CSS_SELECTOR, \".remoteCall\"))\n        )\n\n    def test_concurrent_async_sql_action(self):\n        self.get(\"/async_execute_sql_concurrently/\")\n        self.selenium.find_element(By.ID, \"SQLPanel\")\n        self.selenium.find_element(By.ID, \"djDebugWindow\")\n\n        # Click to show the SQL panel\n        self.selenium.find_element(By.CLASS_NAME, \"SQLPanel\").click()\n\n        # SQL panel loads\n        self.wait.until(\n            EC.visibility_of_element_located((By.CSS_SELECTOR, \".remoteCall\"))\n        )\n"
  },
  {
    "path": "tests/test_integration_async.py",
    "content": "import re\nimport unittest\nfrom unittest.mock import patch\n\nimport html5lib\nfrom django.core import signing\nfrom django.core.cache import cache\nfrom django.db import connection\nfrom django.http import HttpResponse\nfrom django.template.loader import get_template\nfrom django.test import AsyncRequestFactory\nfrom django.test.utils import override_settings\n\nfrom debug_toolbar.forms import SignedDataForm\nfrom debug_toolbar.middleware import (\n    DebugToolbarMiddleware,\n    show_toolbar,\n    show_toolbar_with_docker,\n)\nfrom debug_toolbar.panels import Panel\nfrom debug_toolbar.panels.history import HistoryPanel\nfrom debug_toolbar.panels.sql import SQLPanel\nfrom debug_toolbar.panels.versions import VersionsPanel\nfrom debug_toolbar.store import get_store\nfrom debug_toolbar.toolbar import DebugToolbar\n\nfrom .base import BaseTestCase, IntegrationTestCase\nfrom .views import regular_view\n\narf = AsyncRequestFactory()\n\n\ndef toolbar_request_id():\n    def get_response(request):\n        return HttpResponse()\n\n    toolbar = DebugToolbar(arf.get(\"/\"), get_response)\n    toolbar.store()\n    return toolbar.request_id\n\n\nclass BuggyPanel(Panel):\n    def title(self):\n        return \"BuggyPanel\"\n\n    @property\n    def content(self):\n        raise Exception\n\n\n@override_settings(DEBUG=True)\nclass DebugToolbarTestCase(BaseTestCase):\n    _is_async = True\n\n    def test_show_toolbar(self):\n        \"\"\"\n        Just to verify that show_toolbar() works with an ASGIRequest too\n        \"\"\"\n\n        self.assertTrue(show_toolbar(self.request))\n\n    async def test_show_toolbar_INTERNAL_IPS(self):\n        with self.settings(INTERNAL_IPS=[]):\n            self.assertFalse(show_toolbar(self.request))\n\n    @patch(\"socket.gethostbyname\", return_value=\"127.0.0.255\")\n    async def test_show_toolbar_docker(self, mocked_gethostbyname):\n        with self.settings(INTERNAL_IPS=[]):\n            # Is true because REMOTE_ADDR is 127.0.0.1 and the 255\n            # is shifted to be 1.\n            self.assertFalse(show_toolbar(self.request))\n            self.assertTrue(show_toolbar_with_docker(self.request))\n        mocked_gethostbyname.assert_called_once_with(\"host.docker.internal\")\n\n    async def test_not_iterating_over_INTERNAL_IPS(self):\n        \"\"\"\n        Verify that the middleware does not iterate over INTERNAL_IPS in some way.\n\n        Some people use iptools.IpRangeList for their INTERNAL_IPS. This is a class\n        that can quickly answer the question if the setting contain a certain IP address,\n        but iterating over this object will drain all performance / blow up.\n        \"\"\"\n\n        class FailOnIteration:\n            def __iter__(self):\n                raise RuntimeError(\n                    \"The testcase failed: the code should not have iterated over INTERNAL_IPS\"\n                )\n\n            def __contains__(self, x):\n                return True\n\n        with self.settings(INTERNAL_IPS=FailOnIteration()):\n            response = await self.async_client.get(\"/regular/basic/\")\n            self.assertEqual(response.status_code, 200)\n            self.assertContains(response, \"djDebug\")  # toolbar\n\n    async def test_middleware_response_insertion(self):\n        async def get_response(request):\n            return regular_view(request, \"İ\")\n\n        response = await DebugToolbarMiddleware(get_response)(self.request)\n        # check toolbar insertion before \"</body>\"\n        self.assertContains(response, \"</div>\\n</body>\")\n\n    async def test_middleware_no_injection_when_encoded(self):\n        async def get_response(request):\n            response = HttpResponse(\"<html><body></body></html>\")\n            response[\"Content-Encoding\"] = \"something\"\n            return response\n\n        response = await DebugToolbarMiddleware(get_response)(self.request)\n        self.assertEqual(response.content, b\"<html><body></body></html>\")\n\n    async def test_cache_page(self):\n        # Clear the cache before testing the views. Other tests that use cached_view\n        # may run earlier and cause fewer cache calls.\n        cache.clear()\n        response = await self.async_client.get(\"/cached_view/\")\n        self.assertEqual(len(response.toolbar.get_panel_by_id(\"CachePanel\").calls), 3)\n        response = await self.async_client.get(\"/cached_view/\")\n        self.assertEqual(len(response.toolbar.get_panel_by_id(\"CachePanel\").calls), 2)\n\n    @override_settings(ROOT_URLCONF=\"tests.urls_use_package_urls\")\n    async def test_include_package_urls(self):\n        \"\"\"Test urlsconf that uses the debug_toolbar.urls in the include call\"\"\"\n        # Clear the cache before testing the views. Other tests that use cached_view\n        # may run earlier and cause fewer cache calls.\n        cache.clear()\n        response = await self.async_client.get(\"/cached_view/\")\n        self.assertEqual(len(response.toolbar.get_panel_by_id(\"CachePanel\").calls), 3)\n        response = await self.async_client.get(\"/cached_view/\")\n        self.assertEqual(len(response.toolbar.get_panel_by_id(\"CachePanel\").calls), 2)\n\n    async def test_low_level_cache_view(self):\n        \"\"\"Test cases when low level caching API is used within a request.\"\"\"\n        response = await self.async_client.get(\"/cached_low_level_view/\")\n        self.assertEqual(len(response.toolbar.get_panel_by_id(\"CachePanel\").calls), 2)\n        response = await self.async_client.get(\"/cached_low_level_view/\")\n        self.assertEqual(len(response.toolbar.get_panel_by_id(\"CachePanel\").calls), 1)\n\n    async def test_cache_disable_instrumentation(self):\n        \"\"\"\n        Verify that middleware cache usages before and after\n        DebugToolbarMiddleware are not counted.\n        \"\"\"\n        self.assertIsNone(cache.set(\"UseCacheAfterToolbar.before\", None))\n        self.assertIsNone(cache.set(\"UseCacheAfterToolbar.after\", None))\n        response = await self.async_client.get(\"/execute_sql/\")\n        self.assertEqual(cache.get(\"UseCacheAfterToolbar.before\"), 1)\n        self.assertEqual(cache.get(\"UseCacheAfterToolbar.after\"), 1)\n        self.assertEqual(len(response.toolbar.get_panel_by_id(\"CachePanel\").calls), 0)\n\n    async def test_is_toolbar_request(self):\n        request = arf.get(\"/__debug__/render_panel/\")\n        self.assertTrue(self.toolbar.is_toolbar_request(request))\n\n        request = arf.get(\"/invalid/__debug__/render_panel/\")\n        self.assertFalse(self.toolbar.is_toolbar_request(request))\n\n        request = arf.get(\"/render_panel/\")\n        self.assertFalse(self.toolbar.is_toolbar_request(request))\n\n    @override_settings(ROOT_URLCONF=\"tests.urls_invalid\")\n    async def test_is_toolbar_request_without_djdt_urls(self):\n        \"\"\"Test cases when the toolbar urls aren't configured.\"\"\"\n        request = arf.get(\"/__debug__/render_panel/\")\n        self.assertFalse(self.toolbar.is_toolbar_request(request))\n\n        request = arf.get(\"/render_panel/\")\n        self.assertFalse(self.toolbar.is_toolbar_request(request))\n\n    @override_settings(ROOT_URLCONF=\"tests.urls_invalid\")\n    async def test_is_toolbar_request_override_request_urlconf(self):\n        \"\"\"Test cases when the toolbar URL is configured on the request.\"\"\"\n        request = arf.get(\"/__debug__/render_panel/\")\n        self.assertFalse(self.toolbar.is_toolbar_request(request))\n\n        # Verify overriding the urlconf on the request is valid.\n        request.urlconf = \"tests.urls\"\n        self.assertTrue(self.toolbar.is_toolbar_request(request))\n\n    async def test_is_toolbar_request_with_script_prefix(self):\n        \"\"\"\n        Test cases when Django is running under a path prefix, such as via the\n        FORCE_SCRIPT_NAME setting.\n        \"\"\"\n        request = arf.get(\"/__debug__/render_panel/\", SCRIPT_NAME=\"/path/\")\n        self.assertTrue(self.toolbar.is_toolbar_request(request))\n\n        request = arf.get(\"/invalid/__debug__/render_panel/\", SCRIPT_NAME=\"/path/\")\n        self.assertFalse(self.toolbar.is_toolbar_request(request))\n\n        request = arf.get(\"/render_panel/\", SCRIPT_NAME=\"/path/\")\n        self.assertFalse(self.toolbar.is_toolbar_request(self.request))\n\n    async def test_data_gone(self):\n        response = await self.async_client.get(\n            \"/__debug__/render_panel/?request_id=GONE&panel_id=RequestPanel\"\n        )\n        self.assertIn(\"Please reload the page and retry.\", response.json()[\"content\"])\n\n    async def test_sql_page(self):\n        response = await self.async_client.get(\"/execute_sql/\")\n        self.assertEqual(\n            len(response.toolbar.get_panel_by_id(\"SQLPanel\").get_stats()[\"queries\"]), 1\n        )\n\n    async def test_async_sql_page(self):\n        response = await self.async_client.get(\"/async_execute_sql/\")\n        self.assertEqual(\n            len(response.toolbar.get_panel_by_id(\"SQLPanel\").get_stats()[\"queries\"]), 2\n        )\n\n\n# Concurrent database queries are not fully supported by Django's backend with\n# current integrated database drivers like psycopg2\n# (considering postgresql as an example) and\n# support for async drivers like psycopg3 isn't integrated yet.\n# As a result, regardless of ASGI/async or WSGI/sync or any other attempts to make\n# concurrent database queries like tests/views/async_db_concurrent,\n# Django will still execute them synchronously.\n\n# Check out the following links for more information:\n\n# https://forum.djangoproject.com/t/are-concurrent-database-queries-in-asgi-a-thing/24136/2\n# https://github.com/django-commons/django-debug-toolbar/issues/1828\n\n# Work that is done so far for asynchrounous database backend\n# https://github.com/django/deps/blob/main/accepted/0009-async.rst#the-orm\n\n\n@override_settings(DEBUG=True)\nclass DebugToolbarIntegrationTestCase(IntegrationTestCase):\n    async def test_middleware_in_async_mode(self):\n        response = await self.async_client.get(\"/async_execute_sql/\")\n        self.assertEqual(response.status_code, 200)\n        self.assertContains(response, \"djDebug\")\n\n    @override_settings(DEFAULT_CHARSET=\"iso-8859-1\")\n    async def test_non_utf8_charset(self):\n        response = await self.async_client.get(\"/regular/ASCII/\")\n        self.assertContains(response, \"ASCII\")  # template\n        self.assertContains(response, \"djDebug\")  # toolbar\n\n        response = await self.async_client.get(\"/regular/ASCII/\")\n\n        self.assertContains(response, \"ASCII\")  # template\n        self.assertContains(response, \"djDebug\")  # toolbar\n\n    async def test_html5_validation(self):\n        response = await self.async_client.get(\"/regular/HTML5/\")\n        parser = html5lib.HTMLParser()\n        content = response.content\n        parser.parse(content)\n        if parser.errors:\n            default_msg = [\"Content is invalid HTML:\"]\n            lines = content.split(b\"\\n\")\n            for position, errorcode, datavars in parser.errors:\n                default_msg.append(f\"  {html5lib.constants.E[errorcode]}\" % datavars)\n                default_msg.append(f\"    {lines[position[0] - 1]!r}\")\n            msg = self._formatMessage(None, \"\\n\".join(default_msg))\n            raise self.failureException(msg)\n\n    async def test_render_panel_checks_show_toolbar(self):\n        request_id = toolbar_request_id()\n        get_store().save_panel(\n            request_id, VersionsPanel.panel_id, {\"value\": \"Test data\"}\n        )\n        data = {\"request_id\": request_id, \"panel_id\": VersionsPanel.panel_id}\n\n        url = \"/__debug__/render_panel/\"\n        response = await self.async_client.get(url, data)\n        self.assertEqual(response.status_code, 200)\n\n        with self.settings(INTERNAL_IPS=[]):\n            response = await self.async_client.get(url, data)\n            self.assertEqual(response.status_code, 404)\n\n    async def test_middleware_render_toolbar_json(self):\n        \"\"\"Verify the toolbar is rendered and data is stored for a json request.\"\"\"\n        store = get_store()\n        self.assertEqual(len(list(store.request_ids())), 0)\n\n        data = {\"foo\": \"bar\"}\n        response = await self.async_client.get(\n            \"/json_view/\", data, content_type=\"application/json\"\n        )\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(response.content.decode(\"utf-8\"), '{\"foo\": \"bar\"}')\n        # Check the history panel's stats to verify the toolbar rendered properly.\n        request_ids = list(store.request_ids())\n        self.assertEqual(len(request_ids), 1)\n        toolbar = DebugToolbar.fetch(request_ids[0])\n        self.assertEqual(\n            toolbar.get_panel_by_id(HistoryPanel.panel_id).get_stats()[\"data\"],\n            {\"foo\": \"bar\"},\n        )\n\n    async def test_template_source_checks_show_toolbar(self):\n        template = get_template(\"basic.html\")\n        url = \"/__debug__/template_source/\"\n        data = {\n            \"template\": template.template.name,\n            \"template_origin\": signing.dumps(template.template.origin.name),\n        }\n\n        response = await self.async_client.get(url, data)\n        self.assertEqual(response.status_code, 200)\n        with self.settings(INTERNAL_IPS=[]):\n            response = await self.async_client.get(url, data)\n            self.assertEqual(response.status_code, 404)\n\n    async def test_template_source_errors(self):\n        url = \"/__debug__/template_source/\"\n\n        response = await self.async_client.get(url, {})\n        self.assertContains(\n            response, '\"template_origin\" key is required', status_code=400\n        )\n\n        template = get_template(\"basic.html\")\n        response = await self.async_client.get(\n            url,\n            {\"template_origin\": signing.dumps(template.template.origin.name) + \"xyz\"},\n        )\n        self.assertContains(response, '\"template_origin\" is invalid', status_code=400)\n\n        response = await self.async_client.get(\n            url, {\"template_origin\": signing.dumps(\"does_not_exist.html\")}\n        )\n        self.assertContains(response, \"Template Does Not Exist: does_not_exist.html\")\n\n    async def test_sql_select_checks_show_toolbar(self):\n        await self.async_client.get(\"/execute_sql/\")\n        request_ids = list(get_store().request_ids())\n        request_id = request_ids[-1]\n        toolbar = DebugToolbar.fetch(request_id, SQLPanel.panel_id)\n        panel = toolbar.get_panel_by_id(SQLPanel.panel_id)\n        djdt_query_id = panel.get_stats()[\"queries\"][-1][\"djdt_query_id\"]\n\n        url = \"/__debug__/sql_select/\"\n        data = {\n            \"signed\": SignedDataForm.sign(\n                {\n                    \"request_id\": request_id,\n                    \"djdt_query_id\": djdt_query_id,\n                }\n            )\n        }\n\n        response = await self.async_client.post(url, data)\n        self.assertEqual(response.status_code, 200)\n        with self.settings(INTERNAL_IPS=[]):\n            response = await self.async_client.post(url, data)\n            self.assertEqual(response.status_code, 404)\n\n    async def test_sql_explain_checks_show_toolbar(self):\n        await self.async_client.get(\"/execute_sql/\")\n        request_ids = list(get_store().request_ids())\n        request_id = request_ids[-1]\n        toolbar = DebugToolbar.fetch(request_id, SQLPanel.panel_id)\n        panel = toolbar.get_panel_by_id(SQLPanel.panel_id)\n        djdt_query_id = panel.get_stats()[\"queries\"][-1][\"djdt_query_id\"]\n\n        url = \"/__debug__/sql_explain/\"\n        data = {\n            \"signed\": SignedDataForm.sign(\n                {\n                    \"request_id\": request_id,\n                    \"djdt_query_id\": djdt_query_id,\n                }\n            )\n        }\n\n        response = await self.async_client.post(url, data)\n        self.assertEqual(response.status_code, 200)\n        with self.settings(INTERNAL_IPS=[]):\n            response = await self.async_client.post(url, data)\n            self.assertEqual(response.status_code, 404)\n\n    @unittest.skipUnless(\n        connection.vendor == \"postgresql\", \"Test valid only on PostgreSQL\"\n    )\n    async def test_sql_explain_postgres_union_query(self):\n        \"\"\"\n        Confirm select queries that start with a parenthesis can be explained.\n        \"\"\"\n        await self.async_client.get(\"/async_execute_union_sql/\")\n        request_ids = list(get_store().request_ids())\n        request_id = request_ids[-1]\n        toolbar = DebugToolbar.fetch(request_id, SQLPanel.panel_id)\n        panel = toolbar.get_panel_by_id(SQLPanel.panel_id)\n        djdt_query_id = panel.get_stats()[\"queries\"][-1][\"djdt_query_id\"]\n\n        url = \"/__debug__/sql_explain/\"\n        data = {\n            \"signed\": SignedDataForm.sign(\n                {\n                    \"request_id\": request_id,\n                    \"djdt_query_id\": djdt_query_id,\n                }\n            )\n        }\n\n        response = await self.async_client.post(url, data)\n        self.assertEqual(response.status_code, 200)\n\n    @unittest.skipUnless(\n        connection.vendor == \"postgresql\", \"Test valid only on PostgreSQL\"\n    )\n    async def test_sql_explain_postgres_json_field(self):\n        await self.async_client.get(\"/async_execute_json_sql/\")\n        request_ids = list(get_store().request_ids())\n        request_id = request_ids[-1]\n        toolbar = DebugToolbar.fetch(request_id, SQLPanel.panel_id)\n        panel = toolbar.get_panel_by_id(SQLPanel.panel_id)\n        djdt_query_id = panel.get_stats()[\"queries\"][-1][\"djdt_query_id\"]\n\n        url = \"/__debug__/sql_explain/\"\n        data = {\n            \"signed\": SignedDataForm.sign(\n                {\n                    \"request_id\": request_id,\n                    \"djdt_query_id\": djdt_query_id,\n                }\n            )\n        }\n        response = await self.async_client.post(url, data)\n        self.assertEqual(response.status_code, 200)\n        with self.settings(INTERNAL_IPS=[]):\n            response = await self.async_client.post(url, data)\n            self.assertEqual(response.status_code, 404)\n\n    async def test_sql_profile_checks_show_toolbar(self):\n        await self.async_client.get(\"/execute_sql/\")\n        request_ids = list(get_store().request_ids())\n        request_id = request_ids[-1]\n        toolbar = DebugToolbar.fetch(request_id, SQLPanel.panel_id)\n        panel = toolbar.get_panel_by_id(SQLPanel.panel_id)\n        djdt_query_id = panel.get_stats()[\"queries\"][-1][\"djdt_query_id\"]\n\n        url = \"/__debug__/sql_profile/\"\n        data = {\n            \"signed\": SignedDataForm.sign(\n                {\n                    \"request_id\": request_id,\n                    \"djdt_query_id\": djdt_query_id,\n                }\n            )\n        }\n\n        response = await self.async_client.post(url, data)\n        self.assertEqual(response.status_code, 200)\n        with self.settings(INTERNAL_IPS=[]):\n            response = await self.async_client.post(url, data)\n            self.assertEqual(response.status_code, 404)\n\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"RENDER_PANELS\": True})\n    async def test_render_panels_in_request(self):\n        \"\"\"\n        Test that panels are are rendered during the request with\n        RENDER_PANELS=TRUE\n        \"\"\"\n        url = \"/regular/basic/\"\n        response = await self.async_client.get(url)\n        self.assertIn(b'id=\"djDebug\"', response.content)\n        # Verify the store id is not included.\n        self.assertNotIn(b\"data-request-id\", response.content)\n        # Verify the history panel was disabled\n        self.assertIn(\n            b'<input type=\"checkbox\" data-cookie=\"djdtHistoryPanel\" '\n            b'title=\"Enable for next and successive requests\">',\n            response.content,\n        )\n        # Verify the a panel was rendered\n        self.assertIn(b\"Response headers\", response.content)\n\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"RENDER_PANELS\": False})\n    async def test_load_panels(self):\n        \"\"\"\n        Test that panels are not rendered during the request with\n        RENDER_PANELS=False\n        \"\"\"\n        url = \"/execute_sql/\"\n        response = await self.async_client.get(url)\n        self.assertIn(b'id=\"djDebug\"', response.content)\n        # Verify the store id is included.\n        self.assertIn(b\"data-request-id\", response.content)\n        # Verify the history panel was not disabled\n        self.assertNotIn(\n            b'<input type=\"checkbox\" data-cookie=\"djdtHistoryPanel\" '\n            b'title=\"Enable for next and successive requests\">',\n            response.content,\n        )\n        # Verify the a panel was not rendered\n        self.assertNotIn(b\"Response headers\", response.content)\n\n    async def test_view_returns_template_response(self):\n        response = await self.async_client.get(\"/template_response/basic/\")\n        self.assertEqual(response.status_code, 200)\n\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"DISABLE_PANELS\": set()})\n    async def test_intercept_redirects(self):\n        response = await self.async_client.get(\"/redirect/\")\n        self.assertEqual(response.status_code, 200)\n        # Link to LOCATION header.\n        self.assertIn(b'href=\"/regular/redirect/\"', response.content)\n\n    async def test_server_timing_headers(self):\n        response = await self.async_client.get(\"/execute_sql/\")\n        server_timing = response[\"Server-Timing\"]\n        expected_partials = [\n            r'TimerPanel_utime;dur=(\\d)*(\\.(\\d)*)?;desc=\"User CPU time\", ',\n            r'TimerPanel_stime;dur=(\\d)*(\\.(\\d)*)?;desc=\"System CPU time\", ',\n            r'TimerPanel_total;dur=(\\d)*(\\.(\\d)*)?;desc=\"Total CPU time\", ',\n            r'TimerPanel_total_time;dur=(\\d)*(\\.(\\d)*)?;desc=\"Elapsed time\", ',\n            r'SQLPanel_sql_time;dur=(\\d)*(\\.(\\d)*)?;desc=\"SQL 1 queries\", ',\n            r'CachePanel_total_time;dur=0;desc=\"Cache 0 Calls\"',\n        ]\n        for expected in expected_partials:\n            self.assertTrue(re.compile(expected).search(server_timing))\n\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"RENDER_PANELS\": True})\n    async def test_timer_panel(self):\n        response = await self.async_client.get(\"/regular/basic/\")\n        self.assertEqual(response.status_code, 200)\n        self.assertContains(\n            response,\n            '<script type=\"module\" src=\"/static/debug_toolbar/js/timer.js\" async>',\n        )\n\n    async def test_auth_login_view_without_redirect(self):\n        response = await self.async_client.get(\"/login_without_redirect/\")\n        self.assertEqual(response.status_code, 200)\n        parser = html5lib.HTMLParser()\n        doc = parser.parse(response.content)\n        el = doc.find(\".//*[@id='djDebug']\")\n        request_id = el.attrib[\"data-request-id\"]\n        response = await self.async_client.get(\n            \"/__debug__/render_panel/\",\n            {\"request_id\": request_id, \"panel_id\": \"TemplatesPanel\"},\n        )\n        self.assertEqual(response.status_code, 200)\n        # The key None (without quotes) exists in the list of template\n        # variables.\n        self.assertIn(\"None: &#x27;&#x27;\", response.json()[\"content\"])\n"
  },
  {
    "path": "tests/test_login_not_required.py",
    "content": "import unittest\n\nimport django\nfrom django.test import SimpleTestCase, override_settings\nfrom django.urls import reverse\n\nfrom debug_toolbar.panels.versions import VersionsPanel\nfrom debug_toolbar.store import get_store\nfrom tests.test_integration import toolbar_request_id\n\n\n@unittest.skipIf(\n    django.VERSION < (5, 1),\n    \"Valid on Django 5.1 and above, requires LoginRequiredMiddleware\",\n)\n@override_settings(\n    DEBUG=True,\n    MIDDLEWARE=[\n        \"django.contrib.sessions.middleware.SessionMiddleware\",\n        \"django.contrib.auth.middleware.AuthenticationMiddleware\",\n        \"django.contrib.auth.middleware.LoginRequiredMiddleware\",\n        \"debug_toolbar.middleware.DebugToolbarMiddleware\",\n    ],\n)\nclass LoginNotRequiredTestCase(SimpleTestCase):\n    def test_panels(self):\n        for uri in (\n            \"history_sidebar\",\n            \"history_refresh\",\n            \"sql_select\",\n            \"sql_explain\",\n            \"sql_profile\",\n            \"template_source\",\n        ):\n            with self.subTest(uri=uri):\n                response = self.client.get(reverse(f\"djdt:{uri}\"))\n                self.assertNotEqual(response.status_code, 200)\n\n    def test_render_panel(self):\n        request_id = toolbar_request_id()\n        get_store().save_panel(\n            request_id, VersionsPanel.panel_id, {\"value\": \"Test data\"}\n        )\n        data = {\"request_id\": request_id, \"panel_id\": VersionsPanel.panel_id}\n\n        response = self.client.get(reverse(\"djdt:render_panel\"), query_params=data)\n        self.assertEqual(response.status_code, 200)\n"
  },
  {
    "path": "tests/test_middleware.py",
    "content": "import sys\nfrom unittest.mock import patch\n\nfrom django.contrib.auth.models import User\nfrom django.http import HttpResponse\nfrom django.test import AsyncRequestFactory, RequestFactory, TestCase, override_settings\n\nfrom debug_toolbar.middleware import DebugToolbarMiddleware\n\nif sys.version_info >= (3, 12):\n    from inspect import iscoroutinefunction\nelse:\n    from asyncio import iscoroutinefunction\n\n\ndef show_toolbar_if_staff(request):\n    # Hit the database, but always return True\n    return User.objects.exists() or True\n\n\nasync def ashow_toolbar_if_staff(request):\n    # Hit the database, but always return True\n    has_users = await User.objects.afirst()\n    return has_users or True\n\n\nclass MiddlewareSyncAsyncCompatibilityTestCase(TestCase):\n    def setUp(self):\n        self.factory = RequestFactory()\n        self.async_factory = AsyncRequestFactory()\n\n    @override_settings(DEBUG=True)\n    def test_sync_mode(self):\n        \"\"\"\n        test middleware switches to sync (__call__) based on get_response type\n        \"\"\"\n\n        request = self.factory.get(\"/\")\n        middleware = DebugToolbarMiddleware(\n            lambda x: HttpResponse(\"<html><body>Test app</body></html>\")\n        )\n\n        self.assertFalse(iscoroutinefunction(middleware))\n\n        response = middleware(request)\n        self.assertEqual(response.status_code, 200)\n        self.assertIn(b\"djdt\", response.content)\n\n    @override_settings(DEBUG=True)\n    async def test_async_mode(self):\n        \"\"\"\n        test middleware switches to async (__acall__) based on get_response type\n        and returns a coroutine\n        \"\"\"\n\n        async def get_response(request):\n            return HttpResponse(\"<html><body>Test app</body></html>\")\n\n        middleware = DebugToolbarMiddleware(get_response)\n        request = self.async_factory.get(\"/\")\n\n        self.assertTrue(iscoroutinefunction(middleware))\n\n        response = await middleware(request)\n        self.assertEqual(response.status_code, 200)\n        self.assertIn(b\"djdt\", response.content)\n\n    @override_settings(DEBUG=True)\n    @patch(\n        \"debug_toolbar.middleware.show_toolbar_func_or_path\",\n        return_value=ashow_toolbar_if_staff,\n    )\n    def test_async_show_toolbar_callback_sync_middleware(self, mocked_show):\n        def get_response(request):\n            return HttpResponse(\"<html><body>Hello world</body></html>\")\n\n        middleware = DebugToolbarMiddleware(get_response)\n\n        request = self.factory.get(\"/\")\n        response = middleware(request)\n        self.assertEqual(response.status_code, 200)\n        self.assertIn(b\"djdt\", response.content)\n\n    @override_settings(DEBUG=True)\n    @patch(\n        \"debug_toolbar.middleware.show_toolbar_func_or_path\",\n        return_value=show_toolbar_if_staff,\n    )\n    async def test_sync_show_toolbar_callback_async_middleware(self, mocked_show):\n        async def get_response(request):\n            return HttpResponse(\"<html><body>Hello world</body></html>\")\n\n        middleware = DebugToolbarMiddleware(get_response)\n\n        request = self.async_factory.get(\"/\")\n        response = await middleware(request)\n        self.assertEqual(response.status_code, 200)\n        self.assertIn(b\"djdt\", response.content)\n"
  },
  {
    "path": "tests/test_models.py",
    "content": "import uuid\n\nfrom django.test import TestCase\n\nfrom debug_toolbar.models import HistoryEntry\n\n\nclass HistoryEntryTestCase(TestCase):\n    def test_str_method(self):\n        test_uuid = uuid.uuid4()\n        entry = HistoryEntry(request_id=test_uuid)\n        self.assertEqual(str(entry), str(test_uuid))\n\n    def test_data_field_default(self):\n        \"\"\"Test that the data field defaults to an empty dict\"\"\"\n        entry = HistoryEntry(request_id=uuid.uuid4())\n        self.assertEqual(entry.data, {})\n\n    def test_model_persistence(self):\n        \"\"\"Test saving and retrieving a model instance\"\"\"\n        test_uuid = uuid.uuid4()\n        entry = HistoryEntry(request_id=test_uuid, data={\"test\": True})\n        entry.save()\n\n        # Retrieve from database and verify\n        saved_entry = HistoryEntry.objects.get(request_id=test_uuid)\n        self.assertEqual(saved_entry.data, {\"test\": True})\n        self.assertEqual(str(saved_entry), str(test_uuid))\n\n    def test_default_ordering(self):\n        \"\"\"Test that the default ordering is by created_at in descending order\"\"\"\n        self.assertEqual(HistoryEntry._meta.ordering, [\"-created_at\"])\n"
  },
  {
    "path": "tests/test_sanitize.py",
    "content": "import unittest\n\nfrom debug_toolbar.sanitize import force_str\n\n\nclass ForceStrTestCase(unittest.TestCase):\n    def test_success_convert(self):\n        input = 0\n\n        self.assertEqual(force_str(input), \"0\")\n\n    def test_failed_convert(self):\n        input = bytes.fromhex(\n            \"a3f2b8c14e972d5a8fb3c7291a64e0859c472bf63d18a0945e73b2c84f917ae2\"\n        )\n        self.assertEqual(\n            force_str(input), \"Django Debug Toolbar was unable to parse value.\"\n        )\n"
  },
  {
    "path": "tests/test_settings.py",
    "content": "from unittest.mock import patch\n\nfrom django.test import TestCase\n\nfrom debug_toolbar.settings import _is_running_tests\n\n\nclass SettingsTestCase(TestCase):\n    @patch(\"debug_toolbar.settings.sys\")\n    @patch(\"debug_toolbar.settings.os\")\n    def test_is_running_tests(self, mock_os, mock_sys):\n        mock_sys.argv = \"test\"\n        mock_os.environ = {}\n        self.assertTrue(_is_running_tests())\n\n        mock_sys.argv = \"\"\n        mock_os.environ = {}\n        self.assertFalse(_is_running_tests())\n\n        mock_sys.argv = \"\"\n        mock_os.environ = {\"PYTEST_VERSION\": \"1\"}\n        self.assertTrue(_is_running_tests())\n"
  },
  {
    "path": "tests/test_store.py",
    "content": "import uuid\n\nfrom django.test import TestCase\nfrom django.test.utils import override_settings\nfrom django.utils.safestring import SafeData, mark_safe\n\nfrom debug_toolbar import store\n\n\nclass SerializationTestCase(TestCase):\n    def test_serialize(self):\n        self.assertEqual(\n            store.serialize({\"hello\": {\"foo\": \"bar\"}}),\n            '{\"hello\": {\"foo\": \"bar\"}}',\n        )\n\n    def test_serialize_logs_on_failure(self):\n        self.assertEqual(\n            store.serialize({\"hello\": {\"foo\": b\"bar\"}}),\n            '{\"hello\": {\"foo\": \"bar\"}}',\n        )\n\n    def test_deserialize(self):\n        self.assertEqual(\n            store.deserialize('{\"hello\": {\"foo\": \"bar\"}}'),\n            {\"hello\": {\"foo\": \"bar\"}},\n        )\n\n\nclass BaseStoreTestCase(TestCase):\n    def test_methods_are_not_implemented(self):\n        # Find all the non-private and dunder class methods\n        methods = [\n            member for member in vars(store.BaseStore) if not member.startswith(\"_\")\n        ]\n        self.assertEqual(len(methods), 7)\n        with self.assertRaises(NotImplementedError):\n            store.BaseStore.request_ids()\n        with self.assertRaises(NotImplementedError):\n            store.BaseStore.exists(\"\")\n        with self.assertRaises(NotImplementedError):\n            store.BaseStore.set(\"\")\n        with self.assertRaises(NotImplementedError):\n            store.BaseStore.clear()\n        with self.assertRaises(NotImplementedError):\n            store.BaseStore.delete(\"\")\n        with self.assertRaises(NotImplementedError):\n            store.BaseStore.save_panel(\"\", \"\", None)\n        with self.assertRaises(NotImplementedError):\n            store.BaseStore.panel(\"\", \"\")\n\n\nclass MemoryStoreTestCase(TestCase):\n    @classmethod\n    def setUpTestData(cls) -> None:\n        cls.store = store.MemoryStore\n\n    def tearDown(self) -> None:\n        self.store.clear()\n\n    def test_ids(self):\n        self.store.set(\"foo\")\n        self.store.set(\"bar\")\n        self.assertEqual(list(self.store.request_ids()), [\"foo\", \"bar\"])\n\n    def test_exists(self):\n        self.assertFalse(self.store.exists(\"missing\"))\n        self.store.set(\"exists\")\n        self.assertTrue(self.store.exists(\"exists\"))\n\n    def test_set(self):\n        self.store.set(\"foo\")\n        self.assertEqual(list(self.store.request_ids()), [\"foo\"])\n\n    def test_set_max_size(self):\n        with self.settings(DEBUG_TOOLBAR_CONFIG={\"RESULTS_CACHE_SIZE\": 1}):\n            self.store.save_panel(\"foo\", \"foo.panel\", \"foo.value\")\n            self.store.save_panel(\"bar\", \"bar.panel\", {\"a\": 1})\n            self.assertEqual(list(self.store.request_ids()), [\"bar\"])\n            self.assertEqual(self.store.panel(\"foo\", \"foo.panel\"), {})\n            self.assertEqual(self.store.panel(\"bar\", \"bar.panel\"), {\"a\": 1})\n\n    def test_clear(self):\n        self.store.save_panel(\"bar\", \"bar.panel\", {\"a\": 1})\n        self.store.clear()\n        self.assertEqual(list(self.store.request_ids()), [])\n        self.assertEqual(self.store.panel(\"bar\", \"bar.panel\"), {})\n\n    def test_delete(self):\n        self.store.save_panel(\"bar\", \"bar.panel\", {\"a\": 1})\n        self.store.delete(\"bar\")\n        self.assertEqual(list(self.store.request_ids()), [])\n        self.assertEqual(self.store.panel(\"bar\", \"bar.panel\"), {})\n        # Make sure it doesn't error\n        self.store.delete(\"bar\")\n\n    def test_save_panel(self):\n        self.store.save_panel(\"bar\", \"bar.panel\", {\"a\": 1})\n        self.assertEqual(list(self.store.request_ids()), [\"bar\"])\n        self.assertEqual(self.store.panel(\"bar\", \"bar.panel\"), {\"a\": 1})\n\n    def test_panel(self):\n        self.assertEqual(self.store.panel(\"missing\", \"missing\"), {})\n        self.store.save_panel(\"bar\", \"bar.panel\", {\"a\": 1})\n        self.assertEqual(self.store.panel(\"bar\", \"bar.panel\"), {\"a\": 1})\n\n    def test_serialize_safestring(self):\n        before = {\"string\": mark_safe(\"safe\")}\n\n        self.store.save_panel(\"bar\", \"bar.panel\", before)\n        after = self.store.panel(\"bar\", \"bar.panel\")\n\n        self.assertFalse(type(before[\"string\"]) is str)\n        self.assertTrue(isinstance(before[\"string\"], SafeData))\n\n        self.assertTrue(type(after[\"string\"]) is str)\n        self.assertFalse(isinstance(after[\"string\"], SafeData))\n\n\nclass StubStore(store.BaseStore):\n    pass\n\n\nclass GetStoreTestCase(TestCase):\n    def test_get_store(self):\n        self.assertIs(store.get_store(), store.MemoryStore)\n\n    @override_settings(\n        DEBUG_TOOLBAR_CONFIG={\"TOOLBAR_STORE_CLASS\": \"tests.test_store.StubStore\"}\n    )\n    def test_get_store_with_setting(self):\n        self.assertIs(store.get_store(), StubStore)\n\n\n@override_settings(\n    DEBUG_TOOLBAR_CONFIG={\"TOOLBAR_STORE_CLASS\": \"debug_toolbar.store.DatabaseStore\"}\n)\nclass DatabaseStoreTestCase(TestCase):\n    @classmethod\n    def setUpTestData(cls) -> None:\n        cls.store = store.DatabaseStore\n\n    def tearDown(self) -> None:\n        self.store.clear()\n\n    def test_ids(self):\n        id1 = str(uuid.uuid4())\n        id2 = str(uuid.uuid4())\n        self.store.set(id1)\n        self.store.set(id2)\n        # Convert the UUIDs to strings for comparison\n        request_ids = {str(id) for id in self.store.request_ids()}\n        self.assertEqual(request_ids, {id1, id2})\n\n    def test_exists(self):\n        missing_id = str(uuid.uuid4())\n        self.assertFalse(self.store.exists(missing_id))\n        id1 = str(uuid.uuid4())\n        self.store.set(id1)\n        self.assertTrue(self.store.exists(id1))\n\n    def test_set(self):\n        id1 = str(uuid.uuid4())\n        self.store.set(id1)\n        self.assertTrue(self.store.exists(id1))\n\n    def test_set_max_size(self):\n        with self.settings(DEBUG_TOOLBAR_CONFIG={\"RESULTS_CACHE_SIZE\": 1}):\n            # Clear any existing entries first\n            self.store.clear()\n\n            # Add first entry\n            id1 = str(uuid.uuid4())\n            self.store.set(id1)\n\n            # Verify it exists\n            self.assertTrue(self.store.exists(id1))\n\n            # Add second entry, which should push out the first one due to size limit=1\n            id2 = str(uuid.uuid4())\n            self.store.set(id2)\n\n            # Verify only the bar entry exists now\n            # Convert the UUIDs to strings for comparison\n            request_ids = {str(id) for id in self.store.request_ids()}\n            self.assertEqual(request_ids, {id2})\n            self.assertFalse(self.store.exists(id1))\n\n    def test_clear(self):\n        id1 = str(uuid.uuid4())\n        self.store.save_panel(id1, \"bar.panel\", {\"a\": 1})\n        self.store.clear()\n        self.assertEqual(list(self.store.request_ids()), [])\n        self.assertEqual(self.store.panel(id1, \"bar.panel\"), {})\n\n    def test_delete(self):\n        id1 = str(uuid.uuid4())\n        self.store.save_panel(id1, \"bar.panel\", {\"a\": 1})\n        self.store.delete(id1)\n        self.assertEqual(list(self.store.request_ids()), [])\n        self.assertEqual(self.store.panel(id1, \"bar.panel\"), {})\n        # Make sure it doesn't error\n        self.store.delete(id1)\n\n    def test_save_panel(self):\n        id1 = str(uuid.uuid4())\n        self.store.save_panel(id1, \"bar.panel\", {\"a\": 1})\n        self.assertTrue(self.store.exists(id1))\n        self.assertEqual(self.store.panel(id1, \"bar.panel\"), {\"a\": 1})\n\n    def test_update_panel(self):\n        id1 = str(uuid.uuid4())\n        self.store.save_panel(id1, \"test.panel\", {\"original\": True})\n        self.assertEqual(self.store.panel(id1, \"test.panel\"), {\"original\": True})\n\n        # Update the panel\n        self.store.save_panel(id1, \"test.panel\", {\"updated\": True})\n        self.assertEqual(self.store.panel(id1, \"test.panel\"), {\"updated\": True})\n\n    def test_panels_nonexistent_request(self):\n        missing_id = str(uuid.uuid4())\n        panels = dict(self.store.panels(missing_id))\n        self.assertEqual(panels, {})\n\n    def test_panel(self):\n        id1 = str(uuid.uuid4())\n        missing_id = str(uuid.uuid4())\n        self.assertEqual(self.store.panel(missing_id, \"missing\"), {})\n        self.store.save_panel(id1, \"bar.panel\", {\"a\": 1})\n        self.assertEqual(self.store.panel(id1, \"bar.panel\"), {\"a\": 1})\n\n    def test_panels(self):\n        id1 = str(uuid.uuid4())\n        self.store.save_panel(id1, \"panel1\", {\"a\": 1})\n        self.store.save_panel(id1, \"panel2\", {\"b\": 2})\n        panels = dict(self.store.panels(id1))\n        self.assertEqual(len(panels), 2)\n        self.assertEqual(panels[\"panel1\"], {\"a\": 1})\n        self.assertEqual(panels[\"panel2\"], {\"b\": 2})\n\n    def test_cleanup_old_entries(self):\n        # Create multiple entries\n        ids = [str(uuid.uuid4()) for _ in range(5)]\n        for id in ids:\n            self.store.save_panel(id, \"test.panel\", {\"test\": True})\n\n        # Set a small cache size\n        with self.settings(DEBUG_TOOLBAR_CONFIG={\"RESULTS_CACHE_SIZE\": 2}):\n            # Trigger cleanup\n            self.store._cleanup_old_entries()\n\n            # Check that only the most recent 2 entries remain\n            self.assertEqual(len(list(self.store.request_ids())), 2)\n"
  },
  {
    "path": "tests/test_toolbar.py",
    "content": "from django.core.exceptions import ImproperlyConfigured\n\nfrom debug_toolbar.toolbar import debug_toolbar_urls\nfrom tests.base import BaseTestCase\n\n\nclass DebugToolbarUrlsTestCase(BaseTestCase):\n    def test_empty_prefix_errors(self):\n        with self.assertRaises(ImproperlyConfigured):\n            debug_toolbar_urls(prefix=\"\")\n\n    def test_empty_when_debug_is_false(self):\n        self.assertEqual(debug_toolbar_urls(), [])\n\n    def test_has_path(self):\n        with self.settings(DEBUG=True):\n            self.assertEqual(len(debug_toolbar_urls()), 1)\n"
  },
  {
    "path": "tests/test_utils.py",
    "content": "import unittest\n\nfrom django.http import QueryDict\nfrom django.test import override_settings\n\nimport debug_toolbar.utils\nfrom debug_toolbar.utils import (\n    get_name_from_obj,\n    get_stack,\n    get_stack_trace,\n    render_stacktrace,\n    sanitize_and_sort_request_vars,\n    tidy_stacktrace,\n)\n\n\nclass GetNameFromObjTestCase(unittest.TestCase):\n    def test_func(self):\n        def x():\n            return 1\n\n        res = get_name_from_obj(x)\n        self.assertEqual(\n            res, \"tests.test_utils.GetNameFromObjTestCase.test_func.<locals>.x\"\n        )\n\n    def test_lambda(self):\n        res = get_name_from_obj(lambda: 1)\n        self.assertEqual(\n            res, \"tests.test_utils.GetNameFromObjTestCase.test_lambda.<locals>.<lambda>\"\n        )\n\n    def test_class(self):\n        class A:\n            pass\n\n        res = get_name_from_obj(A)\n        self.assertEqual(\n            res, \"tests.test_utils.GetNameFromObjTestCase.test_class.<locals>.A\"\n        )\n\n\nclass RenderStacktraceTestCase(unittest.TestCase):\n    def test_importlib_path_issue_1612(self):\n        trace = [\n            (\"/server/app.py\", 1, \"foo\", [\"code line 1\", \"code line 2\"], {\"foo\": \"bar\"})\n        ]\n        result = render_stacktrace(trace)\n        self.assertIn('<span class=\"djdt-path\">/server/</span>', result)\n        self.assertIn('<span class=\"djdt-file\">app.py</span> in', result)\n\n        trace = [\n            (\n                \"<frozen importlib._bootstrap>\",\n                1,\n                \"foo\",\n                [\"code line 1\", \"code line 2\"],\n                {\"foo\": \"bar\"},\n            )\n        ]\n        result = render_stacktrace(trace)\n        self.assertIn('<span class=\"djdt-path\"></span>', result)\n        self.assertIn(\n            '<span class=\"djdt-file\">&lt;frozen importlib._bootstrap&gt;</span> in',\n            result,\n        )\n\n\nclass StackTraceTestCase(unittest.TestCase):\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"HIDE_IN_STACKTRACES\": []})\n    def test_get_stack_trace_skip(self):\n        stack_trace = get_stack_trace(skip=-1)\n        self.assertTrue(len(stack_trace) > 2)\n        self.assertEqual(stack_trace[-1][0], debug_toolbar.utils.__file__)\n        self.assertEqual(stack_trace[-1][2], \"get_stack_trace\")\n        self.assertEqual(stack_trace[-2][0], __file__)\n        self.assertEqual(stack_trace[-2][2], \"test_get_stack_trace_skip\")\n\n        stack_trace = get_stack_trace()\n        self.assertTrue(len(stack_trace) > 1)\n        self.assertEqual(stack_trace[-1][0], __file__)\n        self.assertEqual(stack_trace[-1][2], \"test_get_stack_trace_skip\")\n\n    def test_deprecated_functions(self):\n        with self.assertWarns(DeprecationWarning):\n            stack = get_stack()\n        self.assertEqual(stack[0][1], __file__)\n        with self.assertWarns(DeprecationWarning):\n            stack_trace = tidy_stacktrace(reversed(stack))\n        self.assertEqual(stack_trace[-1][0], __file__)\n\n    @override_settings(DEBUG_TOOLBAR_CONFIG={\"ENABLE_STACKTRACES_LOCALS\": True})\n    def test_locals(self):\n        # This wrapper class is necessary to mask the repr() of the list\n        # returned by get_stack_trace(); otherwise the 'test_locals_value_1'\n        # string will also be present in rendered_stack_2.\n        class HideRepr:\n            def __init__(self, value):\n                self.value = value\n\n        x = \"test_locals_value_1\"\n        stack_1_wrapper = HideRepr(get_stack_trace())\n\n        x = x.replace(\"1\", \"2\")\n        stack_2_wrapper = HideRepr(get_stack_trace())\n\n        rendered_stack_1 = render_stacktrace(stack_1_wrapper.value)\n        self.assertIn(\"test_locals_value_1\", rendered_stack_1)\n        self.assertNotIn(\"test_locals_value_2\", rendered_stack_1)\n\n        rendered_stack_2 = render_stacktrace(stack_2_wrapper.value)\n        self.assertNotIn(\"test_locals_value_1\", rendered_stack_2)\n        self.assertIn(\"test_locals_value_2\", rendered_stack_2)\n\n\nclass SanitizeAndSortRequestVarsTestCase(unittest.TestCase):\n    \"\"\"Tests for the sanitize_and_sort_request_vars function.\"\"\"\n\n    def test_dict_sanitization(self):\n        \"\"\"Test sanitization of a regular dictionary.\"\"\"\n        test_dict = {\n            \"username\": \"testuser\",\n            \"password\": \"secret123\",\n            \"api_key\": \"abc123\",\n        }\n        result = sanitize_and_sort_request_vars(test_dict)\n\n        # Convert to dict for easier testing\n        result_dict = dict(result[\"list\"])\n\n        self.assertEqual(result_dict[\"username\"], \"testuser\")\n        self.assertEqual(result_dict[\"password\"], \"********************\")\n        self.assertEqual(result_dict[\"api_key\"], \"********************\")\n\n    def test_querydict_sanitization(self):\n        \"\"\"Test sanitization of a QueryDict.\"\"\"\n        query_dict = QueryDict(\"username=testuser&password=secret123&api_key=abc123\")\n        result = sanitize_and_sort_request_vars(query_dict)\n\n        # Convert to dict for easier testing\n        result_dict = dict(result[\"list\"])\n\n        self.assertEqual(result_dict[\"username\"], \"testuser\")\n        self.assertEqual(result_dict[\"password\"], \"********************\")\n        self.assertEqual(result_dict[\"api_key\"], \"********************\")\n\n    def test_non_sortable_dict_keys(self):\n        \"\"\"Test dictionary with keys that can't be sorted.\"\"\"\n        test_dict = {\n            1: \"one\",\n            \"2\": \"two\",\n            None: \"none\",\n        }\n        result = sanitize_and_sort_request_vars(test_dict)\n        self.assertEqual(len(result[\"list\"]), 3)\n        result_dict = dict(result[\"list\"])\n        self.assertEqual(result_dict[1], \"one\")\n        self.assertEqual(result_dict[\"2\"], \"two\")\n        self.assertEqual(result_dict[None], \"none\")\n\n    def test_querydict_multiple_values(self):\n        \"\"\"Test QueryDict with multiple values for the same key.\"\"\"\n        query_dict = QueryDict(\"name=bar1&name=bar2&title=value\")\n        result = sanitize_and_sort_request_vars(query_dict)\n        result_dict = dict(result[\"list\"])\n        self.assertEqual(result_dict[\"name\"], [\"bar1\", \"bar2\"])\n        self.assertEqual(result_dict[\"title\"], \"value\")\n\n    def test_non_dict_input(self):\n        \"\"\"Test handling of non-dict input.\"\"\"\n        test_input = [\"not\", \"a\", \"dict\"]\n        result = sanitize_and_sort_request_vars(test_input)\n        self.assertEqual(result[\"raw\"], test_input)\n"
  },
  {
    "path": "tests/urls.py",
    "content": "from django.contrib import admin\nfrom django.contrib.auth.views import LoginView\nfrom django.urls import include, path, re_path\n\nfrom . import views\nfrom .models import NonAsciiRepr\n\nurlpatterns = [\n    re_path(\n        r\"^resolving1/(.+)/(.+)/$\", views.resolving_view, name=\"positional-resolving\"\n    ),\n    path(\"resolving2/<path:arg1>/<path:arg2>/\", views.resolving_view),\n    re_path(r\"^resolving3/(.+)/$\", views.resolving_view, {\"arg2\": \"default\"}),\n    re_path(r\"^regular/(?P<title>.*)/$\", views.regular_view),\n    re_path(r\"^template_response/(?P<title>.*)/$\", views.template_response_view),\n    re_path(r\"^regular_jinja/(?P<title>.*)/$\", views.regular_jinjia_view),\n    path(\"non_ascii_request/\", views.regular_view, {\"title\": NonAsciiRepr()}),\n    path(\"new_user/\", views.new_user),\n    path(\"execute_sql/\", views.execute_sql),\n    path(\"execute_json_sql/\", views.execute_json_sql),\n    path(\"execute_union_sql/\", views.execute_union_sql),\n    path(\"async_execute_sql/\", views.async_execute_sql),\n    path(\"async_execute_json_sql/\", views.async_execute_json_sql),\n    path(\"async_execute_union_sql/\", views.async_execute_union_sql),\n    path(\"async_execute_sql_concurrently/\", views.async_execute_sql_concurrently),\n    path(\"cached_view/\", views.cached_view),\n    path(\"cached_low_level_view/\", views.cached_low_level_view),\n    path(\"json_view/\", views.json_view),\n    path(\"redirect/\", views.redirect_view),\n    path(\"ajax/\", views.ajax_view),\n    path(\"login_without_redirect/\", LoginView.as_view(redirect_field_name=None)),\n    path(\"csp_view/\", views.csp_view),\n    path(\"admin/\", admin.site.urls),\n    path(\"__debug__/\", include(\"debug_toolbar.urls\")),\n]\n"
  },
  {
    "path": "tests/urls_invalid.py",
    "content": "\"\"\"Invalid urls.py file for testing\"\"\"\n\nurlpatterns = []\n"
  },
  {
    "path": "tests/urls_use_package_urls.py",
    "content": "\"\"\"urls.py to test using debug_toolbar.urls in include\"\"\"\n\nfrom django.urls import include, path\n\nimport debug_toolbar\n\nfrom . import views\n\nurlpatterns = [\n    path(\"cached_view/\", views.cached_view),\n    path(\"__debug__/\", include(debug_toolbar.urls)),\n]\n"
  },
  {
    "path": "tests/views.py",
    "content": "import asyncio\n\nfrom asgiref.sync import sync_to_async\nfrom django.contrib.auth.models import User\nfrom django.core.cache import cache\nfrom django.http import HttpResponseRedirect, JsonResponse\nfrom django.shortcuts import render\nfrom django.template.response import TemplateResponse\nfrom django.views.decorators.cache import cache_page\n\nfrom debug_toolbar.utils import get_csp_nonce\nfrom tests.models import PostgresJSON\n\n\ndef execute_sql(request):\n    list(User.objects.all())\n    return render(request, \"base.html\")\n\n\ndef execute_json_sql(request):\n    list(PostgresJSON.objects.filter(field__contains={\"foo\": \"bar\"}))\n    return render(request, \"base.html\")\n\n\nasync def async_execute_json_sql(request):\n    list_store = []\n    # make async query with filter, which is compatible with async for.\n    async for obj in PostgresJSON.objects.filter(field__contains={\"foo\": \"bar\"}):\n        list_store.append(obj)\n    return render(request, \"base.html\")\n\n\ndef execute_union_sql(request):\n    list(User.objects.all().union(User.objects.all(), all=True))\n    return render(request, \"base.html\")\n\n\nasync def async_execute_union_sql(request):\n    list_store = []\n    # make async query with filter, which is compatible with async for.\n    users = User.objects.all().union(User.objects.all(), all=True)\n    async for user in users:\n        list_store.append(user)\n    return render(request, \"base.html\")\n\n\nasync def async_execute_sql(request):\n    \"\"\"\n    Some query API can be executed asynchronously but some requires\n    async version of itself.\n\n    https://docs.djangoproject.com/en/5.1/topics/db/queries/#asynchronous-queries\n    \"\"\"\n    list_store = []\n\n    # make async query with filter, which is compatible with async for.\n    async for user in User.objects.filter(username=\"test\"):\n        list_store.append(user)\n\n    # make async query with afirst\n    async_fetched_user = await User.objects.filter(username=\"test\").afirst()\n    list_store.append(async_fetched_user)\n    return render(request, \"base.html\")\n\n\nasync def async_execute_sql_concurrently(request):\n    await asyncio.gather(sync_to_async(list)(User.objects.all()), User.objects.acount())\n    return render(request, \"base.html\")\n\n\ndef regular_view(request, title):\n    return render(request, \"basic.html\", {\"title\": title})\n\n\ndef csp_view(request):\n    \"\"\"Use request.csp_nonce to inject it into the headers\"\"\"\n    nonce = get_csp_nonce(request)\n    return render(request, \"basic.html\", {\"title\": f\"CSP {nonce}\"})\n\n\ndef template_response_view(request, title):\n    return TemplateResponse(request, \"basic.html\", {\"title\": title})\n\n\ndef new_user(request, username=\"joe\"):\n    User.objects.create_user(username=username)\n    return render(request, \"basic.html\", {\"title\": \"new user\"})\n\n\ndef resolving_view(request, arg1, arg2):\n    # see test_url_resolving in tests.py\n    return render(request, \"base.html\")\n\n\n@cache_page(60)\ndef cached_view(request):\n    return render(request, \"base.html\")\n\n\ndef cached_low_level_view(request):\n    key = \"spam\"\n    value = cache.get(key)\n    if not value:\n        value = \"eggs\"\n        cache.set(key, value, 60)\n    return render(request, \"base.html\")\n\n\ndef json_view(request):\n    return JsonResponse({\"foo\": \"bar\"})\n\n\ndef regular_jinjia_view(request, title):\n    return render(request, \"basic.jinja\", {\"title\": title}, using=\"jinja2\")\n\n\ndef listcomp_view(request):\n    lst = [i for i in range(50000) if i % 2 == 0]\n    return render(request, \"basic.html\", {\"title\": \"List comprehension\", \"lst\": lst})\n\n\ndef redirect_view(request):\n    return HttpResponseRedirect(\"/regular/redirect/\")\n\n\ndef ajax_view(request):\n    return render(request, \"ajax/ajax.html\")\n"
  },
  {
    "path": "tox.ini",
    "content": "[tox]\nisolated_build = true\nenvlist =\n    docs\n    packaging\n    py{310,311}-dj{42,51,52}-{sqlite,postgresql,psycopg3,postgis,mysql}\n    py{312}-dj{42,51,52,60}-{sqlite,postgresql,psycopg3,postgis,mysql}\n    py{313}-dj{51,52,60,main}-{sqlite,psycopg3,postgis3,mysql}\n    py{314}-dj{52,60,main}-{sqlite,psycopg3,postgis3,mysql}\n\n[testenv]\ndeps =\n    dj42: django~=4.2.1\n    dj51: django~=5.1.0\n    dj52: django~=5.2.0a1\n    dj60: django~=6.0\n    djmain: https://github.com/django/django/archive/main.tar.gz\n    postgresql: psycopg2-binary\n    psycopg3: psycopg[binary]\n    postgis: psycopg2-binary\n    postgis3: psycopg[binary]\n    mysql: mysqlclient\npassenv=\n    CI\n    COVERAGE_ARGS\n    COVERAGE_FILE\n    DB_BACKEND\n    DB_NAME\n    DB_USER\n    DB_PASSWORD\n    DB_HOST\n    DB_PORT\n    DISPLAY\n    DJANGO_SELENIUM_TESTS\n    GITHUB_*\nsetenv =\n    PYTHONPATH = {toxinidir}\n    PYTHONWARNINGS = d\n    DB_NAME = {env:DB_NAME:debug_toolbar}\n    DB_USER = {env:DB_USER:debug_toolbar}\n    DB_HOST = {env:DB_HOST:localhost}\n    DB_PASSWORD =  {env:DB_PASSWORD:debug_toolbar}\n    DJANGO_SETTINGS_MODULE = tests.settings\nallowlist_externals = make\npip_pre = True\ndependency_groups =\n    dev\ncommands = python -b -W always -m coverage run -m django test -v2 {posargs:tests}\n\n\n[testenv:py{310,311,312,313,314}-dj{42,51,52,60,main}-{postgresql,psycopg3}]\nsetenv =\n    {[testenv]setenv}\n    DB_BACKEND = postgresql\n    DB_PORT = {env:DB_PORT:5432}\n\n\n[testenv:py{310,311,312,313,314}-dj{42,51,52,60,main}-{postgis,postgis3}]\nsetenv =\n    {[testenv]setenv}\n    DB_BACKEND = postgis\n    DB_PORT = {env:DB_PORT:5432}\n\n\n[testenv:py{310,311,312,313,314}-dj{42,51,52,60,main}-mysql]\nsetenv =\n    {[testenv]setenv}\n    DB_BACKEND = mysql\n    DB_PORT = {env:DB_PORT:3306}\n\n\n[testenv:py{310,311,312,313,314}-dj{42,51,52,60,main}-sqlite]\nsetenv =\n    {[testenv]setenv}\n    DB_BACKEND = sqlite3\n    DB_NAME = \":memory:\"\n\n\n[testenv:docs]\ncommands = make -C {toxinidir}/docs {posargs:spelling}\ndependency_groups =\n    docs\n\n[testenv:packaging]\ncommands =\n    python -m build\n    twine check --strict dist/*\ndeps =\n build\n twine\nskip_install = true\n\n[gh-actions]\npython =\n    3.10: py310\n    3.11: py311\n    3.12: py312\n    3.13: py313\n    3.14: py314\n\n[gh-actions:env]\nDB_BACKEND =\n    mysql: mysql\n    postgresql: postgresql\n    psycopg3: psycopg3\n    postgis: postgis\n    postgis3: postgis3\n    sqlite3: sqlite\n"
  }
]