From bec8f92c21c0bd62a3652b543c05f96d1052f8f4 Mon Sep 17 00:00:00 2001 From: getzze Date: Thu, 25 Jul 2024 12:36:15 +0100 Subject: [PATCH 01/15] use pyproject.toml with hatch use hatch environments add test_script to test plotting figures --- .coveragerc | 2 - .github/workflows/python-package.yml | 139 ++++++++++++++++++++----- .gitignore | 3 + .pre-commit-config.yaml | 19 ++++ MANIFEST.in | 2 - coverage.sh | 1 - docs/source/_static/.gitignore | 1 + docs/source/conf.py | 7 +- docs/source/setup.rst | 7 -- hatch.toml | 147 +++++++++++++++++++++++++++ make_doc.sh | 3 - pyproject.toml | 103 +++++++++++++++++++ requirements.txt | 7 -- setup.py | 41 -------- usage/.png | Bin 46757 -> 0 bytes 15 files changed, 393 insertions(+), 89 deletions(-) delete mode 100644 .coveragerc create mode 100644 .pre-commit-config.yaml delete mode 100644 MANIFEST.in delete mode 100755 coverage.sh create mode 100644 docs/source/_static/.gitignore delete mode 100644 docs/source/setup.rst create mode 100644 hatch.toml delete mode 100755 make_doc.sh create mode 100644 pyproject.toml delete mode 100644 requirements.txt delete mode 100644 setup.py delete mode 100644 usage/.png diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index 9ff8d58..0000000 --- a/.coveragerc +++ /dev/null @@ -1,2 +0,0 @@ -[run] -omit = ./doc/* diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 32e0996..8644027 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -1,7 +1,7 @@ # This workflow will install Python dependencies, run tests and lint with a variety of Python versions # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions -name: Python package +name: CI on: push: @@ -10,34 +10,123 @@ on: branches: [ master, dev, v0.7] jobs: - build: + check: + name: ${{ matrix.env.name }} + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + env: + - {"name": "pkg", "target": "show"} + - {"name": "lint", "target": "run"} + # - {"name": "type", "target": "run"} + - {"name": "docs", "target": "all"} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.x" + - name: Let us have colors + run: echo "FORCE_COLOR=true" >> "$GITHUB_ENV" + - name: Install Hatch + uses: pypa/hatch@install + - name: Setup ${{ matrix.env.name }} + run: | + hatch -v env create ${{ matrix.env.name }} + hatch run ${{ matrix.env.name }}:pip freeze + - name: Run ${{ matrix.env.name }} + run: hatch -v run ${{ matrix.env.name }}:${{ matrix.env.target }} + test: + name: test py${{ matrix.python-version }} - seaborn-${{ matrix.seaborn-version }} runs-on: ubuntu-22.04 strategy: fail-fast: false matrix: - python-version: [3.8, 3.9, '3.10', 3.11, 3.12] + # keep synchronized with hatch tests matrix + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] + seaborn-version: ["0.11", "0.12", "0.13"] steps: - - uses: actions/checkout@v4 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - python -m pip install --upgrade pip - python -m pip install flake8 coverage packaging - if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - - name: Lint with flake8 - run: | - # stop the build if there are Python syntax errors or undefined names - flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics - # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide - flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - - name: Test with unittest - run: | - coverage run -m unittest discover tests - coverage report -m - - name: Upload Coverage to Codecov - uses: codecov/codecov-action@v4 + - name: Setup python + uses: actions/setup-python@v5 + with: + python-version: "3.x" + - name: Pick environment to run + run: | + import codecs + import os + env = "tests.py{}-{}".format("${{ matrix.python-version }}", "${{ matrix.seaborn-version }}") + print(f"Environment {env}") + with codecs.open(os.environ["GITHUB_ENV"], mode="a", encoding="utf-8") as file_handler: + file_handler.write("FORCE_COLOR=1\n") + file_handler.write(f"ENV={env}\n") + shell: python + - name: Install Hatch + uses: pypa/hatch@install + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Setup python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Setup test environment + run: | + hatch -v env create ${ENV} + hatch run ${ENV}:pip freeze + shell: bash + - name: Run test suite + run: hatch -v run ${ENV}:run-cov + env: + CI_RUN: "yes" + shell: bash + - name: Upload coverage data + uses: actions/upload-artifact@v4 + with: + name: coverage-${{ matrix.python-version }}-${{ matrix.seaborn-version }} + path: "report/.coverage.*" + + coverage: + name: coverage + runs-on: ubuntu-22.04 + needs: test + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/setup-python@v5 + with: + python-version: "3.x" + - name: Let us have colors + run: echo "FORCE_COLOR=true" >> "$GITHUB_ENV" + - name: Install Hatch + uses: pypa/hatch@install + - name: Setup coverage tool + run: | + hatch -v env create coverage + hatch run coverage:pip freeze + - name: Download coverage data + uses: actions/download-artifact@v4 + with: + pattern: coverage-* + path: report + merge-multiple: true + - name: Combine and report coverage + run: hatch run coverage:run + + - name: Upload HTML report + uses: actions/upload-artifact@v4 + with: + name: html-report + path: report/html + + - name: Upload Coverage to Codecov + uses: codecov/codecov-action@v4 + with: + directory: report + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index 32de0af..524db39 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,8 @@ statannot.egg-info/requires.txt statannot.egg-info/SOURCES.txt statannot.egg-info/top_level.txt +usage/figures/* +report/ + # IDE files .idea/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..d99bbae --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,19 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.3.0 + hooks: + - id: check-yaml + # - id: end-of-file-fixer + # - id: trailing-whitespace + - repo: https://github.com/abravalheri/validate-pyproject + rev: v0.18 + hooks: + - id: validate-pyproject +# - repo: https://github.com/astral-sh/ruff-pre-commit +# rev: v0.5.5 +# hooks: +# # Run the linter. +# - id: ruff +# args: [ --fix, --unsafe-fixes ] +# # Run the formatter. +# - id: ruff-format diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index a7da3fc..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,2 +0,0 @@ -include requirements.txt -include LICENSE diff --git a/coverage.sh b/coverage.sh deleted file mode 100755 index c1419ac..0000000 --- a/coverage.sh +++ /dev/null @@ -1 +0,0 @@ -coverage run -m unittest discover tests && coverage report && coverage-badge -f -o coverage.svg \ No newline at end of file diff --git a/docs/source/_static/.gitignore b/docs/source/_static/.gitignore new file mode 100644 index 0000000..f935021 --- /dev/null +++ b/docs/source/_static/.gitignore @@ -0,0 +1 @@ +!.gitignore diff --git a/docs/source/conf.py b/docs/source/conf.py index d423ab2..9e4921f 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -33,7 +33,12 @@ # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.coverage', 'sphinx_rtd_theme'] +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.coverage', + 'sphinx.ext.doctest', + 'sphinx_rtd_theme', +] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] diff --git a/docs/source/setup.rst b/docs/source/setup.rst deleted file mode 100644 index 552eb49..0000000 --- a/docs/source/setup.rst +++ /dev/null @@ -1,7 +0,0 @@ -setup module -============ - -.. automodule:: setup - :members: - :undoc-members: - :show-inheritance: diff --git a/hatch.toml b/hatch.toml new file mode 100644 index 0000000..4509a14 --- /dev/null +++ b/hatch.toml @@ -0,0 +1,147 @@ +# https://hatch.pypa.io/latest/config/environment/overview/ +# --------------------------------------------------------- +[envs.default] +description = "Development environment" +installer = "uv pip install" + +# --------------------------------------------------------- +[envs.pkg] +description = "package information" +[envs.pkg.scripts] +show = [ + "uv pip list --format=columns", + 'python -c "import sys; print(sys.version); print(sys.executable)"', +] + + +# --------------------------------------------------------- +[envs.lint] +template = "lint" +installer = "uv pip install" +description = "lint and format" +detached = true +dependencies = ["pre-commit"] + +[envs.lint.scripts] +run = "pre-commit run --all-files" + + +# --------------------------------------------------------- +[envs.docs] +template = "docs" +installer = "uv pip install" +description = "build and check documentation" +features = ["docs"] + +[envs.docs.scripts] +build = "sphinx-build -W --keep-going -b html docs/source docs/build" +doctest = "sphinx-build -W --keep-going -b doctest docs/source docs/build" +linkcheck = "sphinx-build -W --keep-going -b linkcheck docs/source docs/build" +all = ["build", "doctest", "linkcheck"] + + +# --------------------------------------------------------- +[envs.types] +template = "types" +installer = "uv pip install" +description = "Run the type checker" +dev-mode = false +dependencies = ["mypy"] + +[envs.types.scripts] +run = [ + """ + mypy --install-types --non-interactive --ignore-missing-imports \ + --config-file={root}/pyproject.toml {args:statannotations tests} + """, +] + + +# --------------------------------------------------------- +[envs.tests] +template = "tests" +installer = "uv pip install" +description = "Run the tests suite" +features = ["tests"] +extra-dependencies = [ + "matplotlib<3.9", + "seaborn=={matrix:seaborn_version}", +] + +[[envs.tests.matrix]] +# python = ["3.8", "3.9", "3.10", "3.11", "3.12"] +# seaborn_version = ["0.11", "0.12", "0.13"] +python = ["3.8", "3.9", "3.10", "3.11"] +seaborn_version = ["0.11"] + +[envs.tests.overrides] +matrix.seaborn_version.extra-dependencies = [ + "matplotlib<3.9", + "seaborn=={matrix:seaborn_version}", + { value = "pandas<2", if = ["0.11", "0.12"]}, + { value = "numpy<2", if = ["0.11", "0.12"]}, +] + +[envs.tests.env-vars] +COVERAGE_FILE = "report/.coverage.{matrix:python}-{matrix:seaborn_version}" +COVERAGE_PROCESS_START = "pyproject.toml" +_COVERAGE_SRC = "statannotations" + +[envs.tests.scripts] +run-cov = [ + """ + pytest --cov=statannotations \ + --cov-config=pyproject.toml --cov-context=test \ + --cov-report=term-missing:skip-covered \ + --cov-report html:report/html{matrix:python} \ + --cov-report xml:report/coverage{matrix:python}.xml \ + {args:-n auto --slow} + """, +] +run = "pytest {args:-n auto}" + + +# --------------------------------------------------------- +[envs.coverage] +template = "coverage" +installer = "uv pip install" +description = "combine coverage files" +detached = true +dependencies = [ + "coverage[toml]>=7.3", +] +env-vars = { COVERAGE_FILE = "report/.coverage" } + +[envs.coverage.scripts] +run = [ + "- coverage combine --rcfile=pyproject.toml report", + "coverage report {args:--skip-covered --show-missing}", + "coverage xml -o report/coverage.xml", + "coverage html -d report/html", +] + + +# --------------------------------------------------------- +[envs.examples] +template = "examples" +installer = "uv pip install" +description = "Run the examples" +python = "3.11" +extra-dependencies = [ + "matplotlib<3.9", + "seaborn=={matrix:seaborn_version}", +] + +[[envs.examples.matrix]] +seaborn_version = ["0.11", "0.12", "0.13"] + +[envs.examples.overrides] +matrix.seaborn_version.extra-dependencies = [ + "matplotlib<3.9", + "seaborn=={matrix:seaborn_version}", + { value = "pandas<2", if = ["0.11", "0.12"]}, + { value = "numpy<2", if = ["0.11", "0.12"]}, +] + +[envs.examples.scripts] +run = "- python usage/test_script.py {args}" diff --git a/make_doc.sh b/make_doc.sh deleted file mode 100755 index 2994014..0000000 --- a/make_doc.sh +++ /dev/null @@ -1,3 +0,0 @@ -cd docs && -# sphinx-apidoc -f -o source ../statannotations && -make html diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..448180c --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,103 @@ +# https://peps.python.org/pep-0517/ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +# https://peps.python.org/pep-0621/ +[project] +name = "statannotations" +description = "add statistical significance or custom annotations on seaborn plots. Based on statannot 0.2.3" +readme = "README.md" +license = {text = "MIT License"} +requires-python = ">=3.7" +maintainers = [ + { name = "Florian Charlier", email = "trevis@cascliniques.be" }, +] +classifiers = [ + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", +] +dynamic = ["version"] +dependencies = [ + "matplotlib>=2.2.2", + "numpy>=1.12.1", + "pandas>=0.23.0", + "scipy>=1.1.0", + "seaborn>=0.9.0", +] + +[project.optional-dependencies] +extra = ["statsmodels"] +tests = [ + "statannotations[extra]", + "pytest>=6", + "pytest-cov>=4.1", + "pytest-skip-slow", + "pytest-xdist", + "packaging", + # "coverage[toml]>=7.3", +] +docs = [ + "sphinx", + "sphinx-rtd-theme", +] +dev = [ + "ipython", +] + +[project.urls] +Homepage = "https://github.com/trevismd/statannotations" + +# https://hatch.pypa.io/latest/config/metadata/ +[tool.hatch.version] +path = "statannotations/_version.py" + +[tool.hatch.build.targets.sdist] +only-include = [ + "/statannotations", + # "usage", + # "tests", + # "docs", +] + + +# https://docs.pytest.org/en/stable/reference/customize.html +[tool.pytest.ini_options] +minversion = "6.0" +testpaths = ["tests"] +addopts = "--import-mode=importlib" + + +# https://coverage.readthedocs.io/en/latest/config.html +[tool.coverage.report] +exclude_also = [ + "pragma: no.cover", + "if TYPE_CHECKING:", + "@overload", + "except ImportError", + "\\.\\.\\.", + "raise NotImplementedError()", + "if __name__ == .__main__.:", +] +show_missing = true +skip_covered = false + +[tool.coverage.run] +source = ["."] +branch = true +parallel = true +# Cannot use, it results in 'no-data-collected' +# relative_files = true + +[tool.coverage.paths] +source = [ + "statannotations", + "**/site-packages/statannotations", +] diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 31019d5..0000000 --- a/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -numpy>=1.12.1 -seaborn>=0.9.0 -matplotlib>=2.2.2 -pandas>=0.23.0 -scipy>=1.1.0 -statsmodels -packaging diff --git a/setup.py b/setup.py deleted file mode 100644 index 58ac68e..0000000 --- a/setup.py +++ /dev/null @@ -1,41 +0,0 @@ -from setuptools import find_packages, setup -import re - -with open("README.md", "r") as f: - long_description = f.read() - -VERSIONFILE = "statannotations/_version.py" -verstrline = open(VERSIONFILE, "rt").read() -match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", verstrline, re.M) -if match: - version = match.group(1) -else: - raise RuntimeError("Unable to find version string in %s." % (VERSIONFILE,)) - - -def remove_dev_only(list_of_dependencies): - return [dep for dep in list_of_dependencies - if dep.strip() not in ("statsmodels", "packaging")] - - -setup( - name="statannotations", - version=version, - maintainer="Florian Charlier", - maintainer_email="trevis@cascliniques.be", - description=("add statistical significance or custom annotations on " - "seaborn plots. Based on statannot 0.2.3"), - license="MIT License", - license_file="LICENSE", - long_description=long_description, - long_description_content_type="text/markdown", - url="https://github.com/trevismd/statannotations", - packages=find_packages(exclude=("tests", "usage", "docs", "build", "dist")), - classifiers=[ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", - ], - install_requires=remove_dev_only(open("requirements.txt").readlines()), - python_requires='>=3.6', -) diff --git a/usage/.png b/usage/.png deleted file mode 100644 index 9bfb18ed8f1ffcd4382a840dceb5a368038fdc56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46757 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 Ck^`y$ From 9f525e2d7efceb3d18c06971e822678064f3175e Mon Sep 17 00:00:00 2001 From: getzze Date: Tue, 19 Nov 2024 14:06:37 +0000 Subject: [PATCH 02/15] bump python version to >=3.8 --- pyproject.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 448180c..ddefb81 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ name = "statannotations" description = "add statistical significance or custom annotations on seaborn plots. Based on statannot 0.2.3" readme = "README.md" license = {text = "MIT License"} -requires-python = ">=3.7" +requires-python = ">=3.8" maintainers = [ { name = "Florian Charlier", email = "trevis@cascliniques.be" }, ] @@ -17,7 +17,6 @@ classifiers = [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", From 90e5acb5e1cbf9112d64ee0338c44c0db013d891 Mon Sep 17 00:00:00 2001 From: getzze Date: Tue, 19 Nov 2024 14:10:24 +0000 Subject: [PATCH 03/15] test all matrix --- hatch.toml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/hatch.toml b/hatch.toml index 4509a14..f4e099a 100644 --- a/hatch.toml +++ b/hatch.toml @@ -69,10 +69,8 @@ extra-dependencies = [ ] [[envs.tests.matrix]] -# python = ["3.8", "3.9", "3.10", "3.11", "3.12"] -# seaborn_version = ["0.11", "0.12", "0.13"] -python = ["3.8", "3.9", "3.10", "3.11"] -seaborn_version = ["0.11"] +python = ["3.8", "3.9", "3.10", "3.11", "3.12"] +seaborn_version = ["0.11", "0.12", "0.13"] [envs.tests.overrides] matrix.seaborn_version.extra-dependencies = [ From 32232167e3aba19b852f145b5a269d93460144ae Mon Sep 17 00:00:00 2001 From: getzze Date: Tue, 19 Nov 2024 14:19:58 +0000 Subject: [PATCH 04/15] fix hue_order with seaborn v0.11 --- statannotations/compat.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/statannotations/compat.py b/statannotations/compat.py index 2331a68..235fae3 100644 --- a/statannotations/compat.py +++ b/statannotations/compat.py @@ -5,7 +5,6 @@ from collections.abc import Sequence from typing import TYPE_CHECKING, Any, Callable -from matplotlib.pyplot import plot import numpy as np import pandas as pd import seaborn as sns @@ -367,6 +366,7 @@ def __init__( order=order, **plot_params, ) + self._hue_order = self._check_hue_order(hue_order) @property def axis(self) -> str: @@ -382,6 +382,9 @@ def group_names(self) -> list: @property def hue_names(self) -> list: + return self._hue_order + + def _original_hue_names(self) -> list: if self.is_redundant_hue: return [] if not self.has_hue: @@ -389,6 +392,22 @@ def hue_names(self) -> list: # Can be None, force to be an empty list return self._plotter.hue_names or [] + def _check_hue_order(self, hue_order: list | None, *, check: bool = False) -> list: + plotter_hue_names = self._original_hue_names() + # No hue order defined, use the plotter list + if not hue_order: + return plotter_hue_names + + # Check hue_order is a permutation of the possible hue list + if check and set(plotter_hue_names) != set(hue_order): + msg = ( + "hue_order is not a permutation of the data hue values: " + f"hue_order={hue_order} not in {plotter_hue_names}" + ) + raise ValueError(msg) + + return hue_order + def _get_group_data_from_plotter( self, cat: TGroupValue | tuple[TGroupValue], From ac8edc096749416e5a3b7469294cf7e38cafedad Mon Sep 17 00:00:00 2001 From: getzze Date: Tue, 19 Nov 2024 14:42:28 +0000 Subject: [PATCH 05/15] support py3.13 --- .github/workflows/python-package.yml | 6 +++++- hatch.toml | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 8644027..b508bdd 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -47,8 +47,12 @@ jobs: fail-fast: false matrix: # keep synchronized with hatch tests matrix - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] seaborn-version: ["0.11", "0.12", "0.13"] + exclude: + # excludes node 8 on macOS + - python-version: ["3.12", "3.13"] + seaborn-version: ["0.11"] steps: - name: Setup python diff --git a/hatch.toml b/hatch.toml index f4e099a..eaa643a 100644 --- a/hatch.toml +++ b/hatch.toml @@ -69,7 +69,7 @@ extra-dependencies = [ ] [[envs.tests.matrix]] -python = ["3.8", "3.9", "3.10", "3.11", "3.12"] +python = ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] seaborn_version = ["0.11", "0.12", "0.13"] [envs.tests.overrides] From 0f32dcf3eb6532841ef8916705cd5d8e47f8b726 Mon Sep 17 00:00:00 2001 From: getzze Date: Tue, 19 Nov 2024 15:00:17 +0000 Subject: [PATCH 06/15] skip seaborn 0.11 with python >=3.12 --- .github/workflows/python-package.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index b508bdd..dc81309 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -50,9 +50,11 @@ jobs: python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] seaborn-version: ["0.11", "0.12", "0.13"] exclude: - # excludes node 8 on macOS - - python-version: ["3.12", "3.13"] - seaborn-version: ["0.11"] + # exclude seaborn-version 0.11 for python >= 3.12 + - python-version: "3.12" + seaborn-version: "0.11" + - python-version: "3.13" + seaborn-version: "0.11" steps: - name: Setup python From e791a112d70eb2642e190cd7915df0833f368d6f Mon Sep 17 00:00:00 2001 From: getzze Date: Tue, 19 Nov 2024 15:02:26 +0000 Subject: [PATCH 07/15] support py3.13 --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index ddefb81..c33b074 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,6 +22,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", ] dynamic = ["version"] dependencies = [ From b14dc719d8e1cb72bbd5b8ca800dee5196dbf948 Mon Sep 17 00:00:00 2001 From: getzze Date: Tue, 19 Nov 2024 15:04:07 +0000 Subject: [PATCH 08/15] skip seaborn 0.12 with python >=3.13 --- .github/workflows/python-package.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index dc81309..5cab929 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -55,6 +55,9 @@ jobs: seaborn-version: "0.11" - python-version: "3.13" seaborn-version: "0.11" + # exclude seaborn-version 0.12 for python >= 3.13 + - python-version: "3.13" + seaborn-version: "0.12" steps: - name: Setup python From d0822c4722e0de98a3b48478a1a98c61a56cf4fd Mon Sep 17 00:00:00 2001 From: getzze Date: Tue, 19 Nov 2024 15:26:55 +0000 Subject: [PATCH 09/15] untrack docs/build --- docs/build/doctrees/index.doctree | Bin 5096 -> 0 bytes docs/build/doctrees/modules.doctree | Bin 2839 -> 0 bytes docs/build/doctrees/setup.doctree | Bin 2468 -> 0 bytes docs/build/doctrees/statannotations.doctree | Bin 204267 -> 0 bytes .../doctrees/statannotations.stats.doctree | Bin 69979 -> 0 bytes docs/build/html/.buildinfo | 4 - docs/build/html/_sources/index.rst.txt | 20 - docs/build/html/_sources/modules.rst.txt | 8 - docs/build/html/_sources/setup.rst.txt | 7 - .../html/_sources/statannotations.rst.txt | 63 - .../_sources/statannotations.stats.rst.txt | 55 - docs/build/html/_static/alabaster.css | 701 - docs/build/html/_static/basic.css | 914 -- docs/build/html/_static/custom.css | 1 - docs/build/html/_static/doctools.js | 149 - .../html/_static/documentation_options.js | 13 - docs/build/html/_static/file.png | Bin 286 -> 0 bytes docs/build/html/_static/jquery-3.5.1.js | 10872 ---------------- docs/build/html/_static/jquery.js | 2 - docs/build/html/_static/language_data.js | 192 - docs/build/html/_static/minus.png | Bin 90 -> 0 bytes docs/build/html/_static/plus.png | Bin 90 -> 0 bytes docs/build/html/_static/pygments.css | 75 - docs/build/html/_static/searchtools.js | 632 - docs/build/html/_static/underscore-1.13.1.js | 2042 --- docs/build/html/_static/underscore.js | 6 - docs/build/html/genindex.html | 548 - docs/build/html/index.html | 125 - docs/build/html/modules.html | 223 - docs/build/html/objects.inv | Bin 1277 -> 0 bytes docs/build/html/py-modindex.html | 175 - docs/build/html/search.html | 120 - docs/build/html/searchindex.js | 1 - docs/build/html/setup.html | 104 - docs/build/html/statannotations.html | 745 -- docs/build/html/statannotations.stats.html | 304 - 36 files changed, 18101 deletions(-) delete mode 100644 docs/build/doctrees/index.doctree delete mode 100644 docs/build/doctrees/modules.doctree delete mode 100644 docs/build/doctrees/setup.doctree delete mode 100644 docs/build/doctrees/statannotations.doctree delete mode 100644 docs/build/doctrees/statannotations.stats.doctree delete mode 100644 docs/build/html/.buildinfo delete mode 100644 docs/build/html/_sources/index.rst.txt delete mode 100644 docs/build/html/_sources/modules.rst.txt delete mode 100644 docs/build/html/_sources/setup.rst.txt delete mode 100644 docs/build/html/_sources/statannotations.rst.txt delete mode 100644 docs/build/html/_sources/statannotations.stats.rst.txt delete mode 100644 docs/build/html/_static/alabaster.css delete mode 100644 docs/build/html/_static/basic.css delete mode 100644 docs/build/html/_static/custom.css delete mode 100644 docs/build/html/_static/doctools.js delete mode 100644 docs/build/html/_static/documentation_options.js delete mode 100644 docs/build/html/_static/file.png delete mode 100644 docs/build/html/_static/jquery-3.5.1.js delete mode 100644 docs/build/html/_static/jquery.js delete mode 100644 docs/build/html/_static/language_data.js delete mode 100644 docs/build/html/_static/minus.png delete mode 100644 docs/build/html/_static/plus.png delete mode 100644 docs/build/html/_static/pygments.css delete mode 100644 docs/build/html/_static/searchtools.js delete mode 100644 docs/build/html/_static/underscore-1.13.1.js delete mode 100644 docs/build/html/_static/underscore.js delete mode 100644 docs/build/html/genindex.html delete mode 100644 docs/build/html/index.html delete mode 100644 docs/build/html/modules.html delete mode 100644 docs/build/html/objects.inv delete mode 100644 docs/build/html/py-modindex.html delete mode 100644 docs/build/html/search.html delete mode 100644 docs/build/html/searchindex.js delete mode 100644 docs/build/html/setup.html delete mode 100644 docs/build/html/statannotations.html delete mode 100644 docs/build/html/statannotations.stats.html diff --git a/docs/build/doctrees/index.doctree b/docs/build/doctrees/index.doctree deleted file mode 100644 index f0463e6378c4230e15920cf5c87be78563293ac3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5096 zcmds5TW=&e70yhiueoO~u-Y9_`>;EiOQ*8~DW zp`=Ov7>nyxUh_!pmI^w7h|le3E%O(pi6%)R@E;e6@~T7J(2I%ERC;3`(Fa~2DbY0a zMzel#xxu>`500ThYELBIH?qY0Dn1WC>+OAhfA7uxHy?Tr_a45n+y9=(ynrMg2}!Cw z&A4(ZJzOY_sHV}()54qKC0@jjc`|w6jWX?V?I|X*DD;T-B8t281CeOL6X>9x6heE4 zS_E2Bdgz5*(m?YQx|_4k|}b=INDb!vDE6Ok}4`sXr7slCKJ0O zXMJ{yEt{TSF(${TU9s`Y!*5}S8UmUVu7&|9JbZf=Fe2l(r8ojmYS^IO5Q;GA=se^} zNT<6}>D*k4ctZ0>t!xBHJIZ1#lDQAC7HeC$cd*#fTt~FFWbS{5Mj#or^lBV;r@{4C z3)XCz!Nq(2`rfaf*;Syh17p0wUT4ef&H=l7kc|lY1kBG~0uf)v=Qci{!spe;dB$F2 zLx?{p#MutJ`>5j{*R}p2vLviMp?Dozg5e9IKf89(LF|@kIXeP<5JYl^`GM)gBFrKT zKFo<(0R?F&5U91nBvv>?Smi$Q}F12w4V>;fP(m*|=M<*pZ^5~+iI50_bP zfPKG+;0yNdRTF0WD@n)$syvc}o+cxUiwkI5|8Z%-KlR`7FRfi^)A4U*ltl=~e#GH- zRgzg;v1fXA#pjyFwPmxhkD#%CIH8GS+hG-cdk9Qq0*F{mn*GSVWy!3j6z@zX{uH~P z73i5ZPn_r1E>i5>GTrK|eDV5UUHtkTbIl!MmX!|S4EQ^+htei(egUMOHtALuGHvVw zLvr?YBwzbAMmEaXZ%qdyJxdWSm#u2Eg1>Z{Mm*pejJM0DL?-zYw+|_ELJ`{*53#KO zY03I+T;nH~UBe2Sn(&k734d4<{(&_V@c!YPaV3BV3v~d0T&=S|ILLn182_>{1}v3^ z8Z3Xl1Qzz27eeGum%Z*HL_T_PMA+|YH?QMx9XR~)vcu~*SmED4Pq@Ot3O|d(TH#2F z5*e`4jTR{Uy@5h8UZ7Bnw~&L~{u&1V`rk45=VdRu0E46Ml_lh@7j+E4P+h$a!VQ?} zAD5k82f+&e?Rml#2v)cRVUZoGcwYr@(=LKyZm!&Osr&t!E4dJQF1KvMgKY2~Ab1bT z;JwHp)oMMoUz#cqmoK|oS#7Z$b3;p#sK_NPKb2yFimfOBTN<@}ROH}N#--%U+U<&2 z4>D=XN59l{U{i*@*P)2d+bZ9+wz0kY3L$&*r^9zm5X4Ad_+*1rDid@IA7LjCkn)zD z%2nWYt9Xopa}>oQSW}AmRXJ^L*>5-m-H@%KfsNG`0`e6U!SmsxD`w038<>+!K*Wg0 zs2jevdB?1$H1%yU0WU>h!Oc-QrC>YmZe7ECl4+f){oxSPYB!x}CX!ttC-A77R?=Mn zl0M2dz@uG5N7KP;d!KN7rJ5k9Wd6PEg`D#kAg{<|5xTES4)-MAR~ zkqAi9shHcgog@K(FZ>Nwb|%E`<19tdWq$#2eMcDv(4=67Cu4A+j0@W~P^fIw5aY4s zZX`(IjJ5?m&OsS8G$A~Ah8r-70`AP*3?OyvQ`CWxj~{Dn+;z9!DmzthH5wN&?aVCG znH`8h(DXhd-I=*)?0Sx-`M!Gq-q_v6pP$dc+<$IhJN-t&XD8yN05+ zNHsXCn6b`U$rTT%&sc`JS)d+|L^LOco4nDOoJ;r4Y3x;}x=q{X^ds&{ox_W6Hg%ON zXh9K50(95l3vx{$(CWCK5|B(fZXJUVA>4!GxmGPmdym$W%*C4Is diff --git a/docs/build/doctrees/modules.doctree b/docs/build/doctrees/modules.doctree deleted file mode 100644 index 0db47ac2f75a8c6e03550be39edda1beafb72454..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2839 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 diff --git a/docs/build/doctrees/statannotations.doctree b/docs/build/doctrees/statannotations.doctree deleted file mode 100644 index 0564df3a224e36aa622b058208dad993dedc6dbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204267 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

3MRGLp(%>nM=~=>=A;9Me z&l7$|aE1Xs;Ugn}6ND!TPZ54O3V4;UYYecD@P#SBmkBQuenq%O7?=i}BAg*yCA>*k z+6kx;UL^dSaL+ElNx}~Z&k??~2XKz?FT%eGuO9@wLHOSxz%|0B4+BmSen|Kc;U9#5 z%F`n_`U&B8M**)99{e!iVZs%{D}+AI!xBNx!(|?=5{mTC3O(unt6QM|&&pWvUfgt5 ze_a!3ubfx`#}r$^GaT9X2nXi?A0%8Myh1oM54f4|65(aS`xgK=5xzpWNccP9D&goc zzyiT1Tp;{~@K?gzEr44ItAr;BZxQ}O_|$R0eFW+EUf|K62}P1;g`On8x&@Nw?M(HR zwl&kb^6zYtXo2I4weUJe`39l?cEApT^!Oj+4S>tsLK(0^PcpE#KnBsuWIbOjYb7J) zDB_XUIF>r$;9Y>52v-Sj5{wf7o4{W>H2HIg@&iI9zcOUXMxl$2xn&9VZcAxeQ8YqmXg-#(3sC zZoI#ABXc0IE{=Z6l1m39lSSJ+xZ6H*s;|#mD%{(N-j~~N+NfH%3sH(!#M{JnhJ6U* zPc7bihRf2{?gZm!Ej+!K5ttRx!v}7-V?ie*gWyraE?Yr`L3fSorjZI4i}AWDnxYH; E2ZdWnhX4Qo diff --git a/docs/build/doctrees/statannotations.stats.doctree b/docs/build/doctrees/statannotations.stats.doctree deleted file mode 100644 index 28f71433decfa1348d87514a0cb94f7b68f818be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69979 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 .section { - text-align: left; -} - -div.footer { - width: 940px; - margin: 20px auto 30px auto; - font-size: 14px; - color: #888; - text-align: right; -} - -div.footer a { - color: #888; -} - -p.caption { - font-family: inherit; - font-size: inherit; -} - - -div.relations { - display: none; -} - - -div.sphinxsidebar a { - color: #444; - text-decoration: none; - border-bottom: 1px dotted #999; -} - -div.sphinxsidebar a:hover { - border-bottom: 1px solid #999; -} - -div.sphinxsidebarwrapper { - padding: 18px 10px; -} - -div.sphinxsidebarwrapper p.logo { - padding: 0; - margin: -10px 0 0 0px; - text-align: center; -} - -div.sphinxsidebarwrapper h1.logo { - margin-top: -10px; - text-align: center; - margin-bottom: 5px; - text-align: left; -} - -div.sphinxsidebarwrapper h1.logo-name { - margin-top: 0px; -} - -div.sphinxsidebarwrapper p.blurb { - margin-top: 0; - font-style: normal; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: Georgia, serif; - color: #444; - font-size: 24px; - font-weight: normal; - margin: 0 0 5px 0; - padding: 0; -} - -div.sphinxsidebar h4 { - font-size: 20px; -} - -div.sphinxsidebar h3 a { - color: #444; -} - -div.sphinxsidebar p.logo a, -div.sphinxsidebar h3 a, -div.sphinxsidebar p.logo a:hover, -div.sphinxsidebar h3 a:hover { - border: none; -} - -div.sphinxsidebar p { - color: #555; - margin: 10px 0; -} - -div.sphinxsidebar ul { - margin: 10px 0; - padding: 0; - color: #000; -} - -div.sphinxsidebar ul li.toctree-l1 > a { - font-size: 120%; -} - -div.sphinxsidebar ul li.toctree-l2 > a { - font-size: 110%; -} - -div.sphinxsidebar input { - border: 1px solid #CCC; - font-family: Georgia, serif; - font-size: 1em; -} - -div.sphinxsidebar hr { - border: none; - height: 1px; - color: #AAA; - background: #AAA; - - text-align: left; - margin-left: 0; - width: 50%; -} - -div.sphinxsidebar .badge { - border-bottom: none; -} - -div.sphinxsidebar .badge:hover { - border-bottom: none; -} - -/* To address an issue with donation coming after search */ -div.sphinxsidebar h3.donation { - margin-top: 10px; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: Georgia, serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #DDD; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #EAEAEA; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - margin: 20px 0px; - padding: 10px 30px; - background-color: #EEE; - border: 1px solid #CCC; -} - -div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fafafa; -} - -div.admonition p.admonition-title { - font-family: Georgia, serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight { - background-color: #fff; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.warning { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.danger { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.error { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.caution { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.attention { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.important { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.note { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.tip { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.hint { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.seealso { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.topic { - background-color: #EEE; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt, code { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.9em; -} - -.hll { - background-color: #FFC; - margin: 0 -12px; - padding: 0 12px; - display: block; -} - -img.screenshot { -} - -tt.descname, tt.descclassname, code.descname, code.descclassname { - font-size: 0.95em; -} - -tt.descname, code.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #EEE; - background: #FDFDFD; - font-size: 0.9em; -} - -table.footnote + table.footnote { - margin-top: -15px; - border-top: none; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.field-list p { - margin-bottom: 0.8em; -} - -/* Cloned from - * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 - */ -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -table.footnote td.label { - width: .1px; - padding: 0.3em 0 0.3em 0.5em; -} - -table.footnote td { - padding: 0.3em 0.5em; -} - -dl { - margin: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -blockquote { - margin: 0 0 0 30px; - padding: 0; -} - -ul, ol { - /* Matches the 30px from the narrow-screen "li > ul" selector below */ - margin: 10px 0 10px 30px; - padding: 0; -} - -pre { - background: #EEE; - padding: 7px 30px; - margin: 15px 0px; - line-height: 1.3em; -} - -div.viewcode-block:target { - background: #ffd; -} - -dl pre, blockquote pre, li pre { - margin-left: 0; - padding-left: 30px; -} - -tt, code { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, code.xref, a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fff; -} - -a.reference { - text-decoration: none; - border-bottom: 1px dotted #004B6B; -} - -/* Don't put an underline on images */ -a.image-reference, a.image-reference:hover { - border-bottom: none; -} - -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - -a.footnote-reference { - text-decoration: none; - font-size: 0.7em; - vertical-align: top; - border-bottom: 1px dotted #004B6B; -} - -a.footnote-reference:hover { - border-bottom: 1px solid #6D4100; -} - -a:hover tt, a:hover code { - background: #EEE; -} - - -@media screen and (max-width: 870px) { - - div.sphinxsidebar { - display: none; - } - - div.document { - width: 100%; - - } - - div.documentwrapper { - margin-left: 0; - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - } - - div.bodywrapper { - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - margin-left: 0; - } - - ul { - margin-left: 0; - } - - li > ul { - /* Matches the 30px from the "ul, ol" selector above */ - margin-left: 30px; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .bodywrapper { - margin: 0; - } - - .footer { - width: auto; - } - - .github { - display: none; - } - - - -} - - - -@media screen and (max-width: 875px) { - - body { - margin: 0; - padding: 20px 30px; - } - - div.documentwrapper { - float: none; - background: #fff; - } - - div.sphinxsidebar { - display: block; - float: none; - width: 102.5%; - margin: 50px -30px -20px -30px; - padding: 10px 20px; - background: #333; - color: #FFF; - } - - div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, - div.sphinxsidebar h3 a { - color: #fff; - } - - div.sphinxsidebar a { - color: #AAA; - } - - div.sphinxsidebar p.logo { - display: none; - } - - div.document { - width: 100%; - margin: 0; - } - - div.footer { - display: none; - } - - div.bodywrapper { - margin: 0; - } - - div.body { - min-height: 0; - padding: 0; - } - - .rtd_doc_footer { - display: none; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .footer { - width: auto; - } - - .github { - display: none; - } -} - - -/* misc. */ - -.revsys-inline { - display: none!important; -} - -/* Make nested-list/multi-paragraph items look better in Releases changelog - * pages. Without this, docutils' magical list fuckery causes inconsistent - * formatter between different release sub-lists. - */ -div#changelog > div.section > ul > li > p:only-child { - margin-bottom: 0; -} - -/* Hide fugly table cell borders in ..bibliography:: directive output */ -table.docutils.citation, table.docutils.citation td, table.docutils.citation th { - border: none; - /* Below needed in some edge cases; if not applied, bottom shadows appear */ - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - - -/* relbar */ - -.related { - line-height: 30px; - width: 100%; - font-size: 0.9rem; -} - -.related.top { - border-bottom: 1px solid #EEE; - margin-bottom: 20px; -} - -.related.bottom { - border-top: 1px solid #EEE; -} - -.related ul { - padding: 0; - margin: 0; - list-style: none; -} - -.related li { - display: inline; -} - -nav#rellinks { - float: right; -} - -nav#rellinks li+li:before { - content: "|"; -} - -nav#breadcrumbs li+li:before { - content: "\00BB"; -} - -/* Hide certain items when printing */ -@media print { - div.related { - display: none; - } -} \ No newline at end of file diff --git a/docs/build/html/_static/basic.css b/docs/build/html/_static/basic.css deleted file mode 100644 index 7ebbd6d..0000000 --- a/docs/build/html/_static/basic.css +++ /dev/null @@ -1,914 +0,0 @@ -/* - * Sphinx stylesheet -- basic theme. - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin-top: 10px; -} - -ul.search li { - padding: 5px 0; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 360px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -a:visited { - color: #551A8B; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} - -nav.contents, -aside.topic, -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -nav.contents, -aside.topic, -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -nav.contents > :last-child, -aside.topic > :last-child, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -nav.contents::after, -aside.topic::after, -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -aside.footnote > span, -div.citation > span { - float: left; -} -aside.footnote > span:last-of-type, -div.citation > span:last-of-type { - padding-right: 0.5em; -} -aside.footnote > p { - margin-left: 2em; -} -div.citation > p { - margin-left: 4em; -} -aside.footnote > p:last-of-type, -div.citation > p:last-of-type { - margin-bottom: 0em; -} -aside.footnote > p:last-of-type:after, -div.citation > p:last-of-type:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -.sig dd { - margin-top: 0px; - margin-bottom: 0px; -} - -.sig dl { - margin-top: 0px; - margin-bottom: 0px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -.translated { - background-color: rgba(207, 255, 207, 0.2) -} - -.untranslated { - background-color: rgba(255, 207, 207, 0.2) -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/docs/build/html/_static/custom.css b/docs/build/html/_static/custom.css deleted file mode 100644 index 2a924f1..0000000 --- a/docs/build/html/_static/custom.css +++ /dev/null @@ -1 +0,0 @@ -/* This file intentionally left blank. */ diff --git a/docs/build/html/_static/doctools.js b/docs/build/html/_static/doctools.js deleted file mode 100644 index 0398ebb..0000000 --- a/docs/build/html/_static/doctools.js +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Base JavaScript utilities for all Sphinx HTML documentation. - */ -"use strict"; - -const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", -]); - -const _ready = (callback) => { - if (document.readyState !== "loading") { - callback(); - } else { - document.addEventListener("DOMContentLoaded", callback); - } -}; - -/** - * Small JavaScript module for the documentation. - */ -const Documentation = { - init: () => { - Documentation.initDomainIndexTable(); - Documentation.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS: {}, - PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), - LOCALE: "unknown", - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext: (string) => { - const translated = Documentation.TRANSLATIONS[string]; - switch (typeof translated) { - case "undefined": - return string; // no translation - case "string": - return translated; // translation exists - default: - return translated[0]; // (singular, plural) translation tuple exists - } - }, - - ngettext: (singular, plural, n) => { - const translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated !== "undefined") - return translated[Documentation.PLURAL_EXPR(n)]; - return n === 1 ? singular : plural; - }, - - addTranslations: (catalog) => { - Object.assign(Documentation.TRANSLATIONS, catalog.messages); - Documentation.PLURAL_EXPR = new Function( - "n", - `return (${catalog.plural_expr})` - ); - Documentation.LOCALE = catalog.locale; - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar: () => { - document.querySelectorAll("input[name=q]")[0]?.focus(); - }, - - /** - * Initialise the domain index toggle buttons - */ - initDomainIndexTable: () => { - const toggler = (el) => { - const idNumber = el.id.substr(7); - const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); - if (el.src.substr(-9) === "minus.png") { - el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; - toggledRows.forEach((el) => (el.style.display = "none")); - } else { - el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; - toggledRows.forEach((el) => (el.style.display = "")); - } - }; - - const togglerElements = document.querySelectorAll("img.toggler"); - togglerElements.forEach((el) => - el.addEventListener("click", (event) => toggler(event.currentTarget)) - ); - togglerElements.forEach((el) => (el.style.display = "")); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); - }, - - initOnKeyListeners: () => { - // only install a listener if it is really needed - if ( - !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS - ) - return; - - document.addEventListener("keydown", (event) => { - // bail for input elements - if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; - // bail with special keys - if (event.altKey || event.ctrlKey || event.metaKey) return; - - if (!event.shiftKey) { - switch (event.key) { - case "ArrowLeft": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const prevLink = document.querySelector('link[rel="prev"]'); - if (prevLink && prevLink.href) { - window.location.href = prevLink.href; - event.preventDefault(); - } - break; - case "ArrowRight": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const nextLink = document.querySelector('link[rel="next"]'); - if (nextLink && nextLink.href) { - window.location.href = nextLink.href; - event.preventDefault(); - } - break; - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case "/": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.focusSearchBar(); - event.preventDefault(); - } - }); - }, -}; - -// quick alias for translations -const _ = Documentation.gettext; - -_ready(Documentation.init); diff --git a/docs/build/html/_static/documentation_options.js b/docs/build/html/_static/documentation_options.js deleted file mode 100644 index f8e77fb..0000000 --- a/docs/build/html/_static/documentation_options.js +++ /dev/null @@ -1,13 +0,0 @@ -const DOCUMENTATION_OPTIONS = { - VERSION: '1.0.0a0', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: true, -}; \ No newline at end of file diff --git a/docs/build/html/_static/file.png b/docs/build/html/_static/file.png deleted file mode 100644 index a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( diff --git a/docs/build/html/_static/jquery-3.5.1.js b/docs/build/html/_static/jquery-3.5.1.js deleted file mode 100644 index 5093733..0000000 --- a/docs/build/html/_static/jquery-3.5.1.js +++ /dev/null @@ -1,10872 +0,0 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - - -
- - -
- -
-
-
-
    -
  • - -
  • -
  • -
-
-
-
-
- - -

Index

- -
- A - | C - | D - | E - | F - | G - | H - | I - | L - | M - | N - | O - | P - | R - | S - | T - | V - | W - -
-

A

- - - -
- -

C

- - - -
- -

D

- - -
- -

E

- - -
- -

F

- - - -
- -

G

- - - -
- -

H

- - -
- -

I

- - - -
- -

L

- - -
- -

M

- - -
- -

N

- - -
- -

O

- - -
- -

P

- - - -
- -

R

- - - -
- -

S

- - - -
- -

T

- - - -
- -

V

- - - -
- -

W

- - -
- - - -
-
-
- -
- -
-

© Copyright 2021, Florian Charlier.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - \ No newline at end of file diff --git a/docs/build/html/index.html b/docs/build/html/index.html deleted file mode 100644 index a2d20ee..0000000 --- a/docs/build/html/index.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - Welcome to statannotations’s documentation! — statannotations 1.0.0a0 documentation - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

Welcome to statannotations’s documentation!

- -
-
-

Indices and tables

- -
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/build/html/modules.html b/docs/build/html/modules.html deleted file mode 100644 index a57098e..0000000 --- a/docs/build/html/modules.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - statannotations — statannotations 1.0.0a0 documentation - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

statannotations

-
- -
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/build/html/objects.inv b/docs/build/html/objects.inv deleted file mode 100644 index 5b095b78049caaebcdaf4b7e7cc7a46a3ca76468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1277 zcmVNERX>N99Zgg*Qc_4OWa&u{KZXhxWBOp+6Z)#;@bUGk&bYXO1 zZf%ZEX>4U6 zX>%ZBZ*6dLWpi_7WFU2OX>MmAdTeQ8E(&D5MZ&8-L$Acq2r zrf81@ml|12D3TzljeYBD^!55A<%c9winVsk(Ph_`sNa7`4rhjxt)q@gsr)~#q^dCByZ^P?@0Ry}n?5697DOhfwbi@pz`IEY)&l!RYTuNE2Z#aN z3l~iW*Q&Z)p;4xz&OuF7?{pv8+9(aioy+OkaOsGk&mb(JvL;MP2NJah4o;<3D}&($ z%FKC>`asS(P@!8|+`Sx_K0(nGTqP3LTcJBu7I-r`>rpe+Uq0aMd){ z|7&{5@W3tgLwwfomaID;juN-z#XAURRABmxPz)0%;XBbnA-bG0d`MncHU|4PifTWg zNkbVp#F(72yMCdf2O{7IvPOg_Y^qN%huqgt+eMCu-Y^XYej1r=pd0z(m|L;t&>PF^ z;L-t1Y^#hTl6Hs|`}p>(EIexT(_djYKTXd2aBZ1`4xff%{ju`$I%=pR9vit8WLmUw z--5thj%8WLXJ63zzMzgNw=jIIOKdm7SasF9z_2Nd`GW9<^cHG#jXZn!y|b4*;?KgM z;#!|mS|w_WFJXD7#pWFel{u!bCLfBc0P1jb5hGS8ccVi+inSrmUmf&E(8HKw9Vz{Y zi~f;am^MH-){eeWLJi+v?{;i)v-7Fdhs(a>!+hJZ8GT)IElp&SC|c?G;MD+zE?Fzq zcel>b3RKg%W2~~W4dhf}z2a#FqFK-gV!nl!^W}uyR&uN*>sPkTrRrb&-#;#Aw-~G8 zf?Uvx{QfHSKEqvQ=|RI*!@ce!5hv7tMgN&V#MdVvzR+30PklTQ(` zebew0me`-;0W8+?2*4S+cxlXthsOAAzTnS>nlsMgnDgiRTC5>HeCL9x6HZ`rm~$3j zi^KR*`+CO(UVRg3Lvoy6%%GS!KxN%W&^G_a(L%i$i3|cw>%)( z^jXGo;c2Q(J{pr=4#0_l{@L<7pBx{-xqP⩰58lcFSGu#~C6c)O;PhEkxW+*nMY zfx4Hq&v~TnQM#O}-o=jiacFvvRCDISSx5Q2#41@Rdpkhh0XmVpBEk)lq1*z2lTKCK zQ59Ndpi?j41B(!)AQ{}3DIxBv{24>FUwLeLWIsK!_FIG0V3*z# z>|?46e7~s+^z3pZS07K#_amJ9I8`avf{AQy(+jwc7qPhfAsPLUxzY zZpb{HeFY}xY8I$r?P3Pwwe-xFbpMGS!MAn2&h3g92CL$|VeS?t&K|kq9m|WArtDi3 nym}t<3hk2Ts+F^xj2z#N+~dJn_8gyEbK^z5K8(lzfO - - - - - Python Module Index — statannotations 1.0.0a0 documentation - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
-
    -
  • - -
  • -
  • -
-
-
-
-
- - -

Python Module Index

- -
- s -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
- s
- statannotations -
    - statannotations.Annotation -
    - statannotations.Annotator -
    - statannotations.format_annotations -
    - statannotations.PValueFormat -
    - statannotations.stats -
    - statannotations.stats.ComparisonsCorrection -
    - statannotations.stats.StatResult -
    - statannotations.stats.StatTest -
    - statannotations.stats.test -
    - statannotations.stats.utils -
    - statannotations.utils -
- - -
-
-
- -
- -
-

© Copyright 2021, Florian Charlier.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - \ No newline at end of file diff --git a/docs/build/html/search.html b/docs/build/html/search.html deleted file mode 100644 index adeddb0..0000000 --- a/docs/build/html/search.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - Search — statannotations 1.0.0a0 documentation - - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
-
    -
  • - -
  • -
  • -
-
-
-
-
- - - - -
- -
- -
-
-
- -
- -
-

© Copyright 2021, Florian Charlier.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js deleted file mode 100644 index 22d2e84..0000000 --- a/docs/build/html/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({"alltitles": {"Contents:": [[1, null]], "Extending to other statistical functions": [[0, null]], "Indices and tables": [[1, "indices-and-tables"]], "Module contents": [[4, "module-statannotations"], [5, "module-statannotations.stats"]], "Submodules": [[4, "submodules"], [5, "submodules"]], "Subpackages": [[4, "subpackages"]], "Welcome to statannotations\u2019s documentation!": [[1, null]], "setup module": [[3, null]], "statannotations": [[2, null]], "statannotations package": [[4, null]], "statannotations.Annotation module": [[4, "module-statannotations.Annotation"]], "statannotations.Annotator module": [[4, "module-statannotations.Annotator"]], "statannotations.PValueFormat module": [[4, "module-statannotations.PValueFormat"]], "statannotations.format_annotations module": [[4, "module-statannotations.format_annotations"]], "statannotations.stats package": [[5, null]], "statannotations.stats.ComparisonsCorrection module": [[5, "module-statannotations.stats.ComparisonsCorrection"]], "statannotations.stats.StatResult module": [[5, "module-statannotations.stats.StatResult"]], "statannotations.stats.StatTest module": [[5, "module-statannotations.stats.StatTest"]], "statannotations.stats.test module": [[5, "module-statannotations.stats.test"]], "statannotations.stats.utils module": [[5, "module-statannotations.stats.utils"]], "statannotations.utils module": [[4, "module-statannotations.utils"]]}, "docnames": ["custom-test", "index", "modules", "setup", "statannotations", "statannotations.stats"], "envversion": {"sphinx": 64, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2}, "filenames": ["custom-test.rst", "index.rst", "modules.rst", "setup.rst", "statannotations.rst", "statannotations.stats.rst"], "indexentries": {}, "objects": {"": [[4, 0, 0, "-", "statannotations"]], "statannotations": [[4, 0, 0, "-", "Annotation"], [4, 0, 0, "-", "Annotator"], [4, 0, 0, "-", "PValueFormat"], [4, 0, 0, "-", "format_annotations"], [5, 0, 0, "-", "stats"], [4, 0, 0, "-", "utils"]], "statannotations.Annotation": [[4, 1, 1, "", "Annotation"]], "statannotations.Annotation.Annotation": [[4, 2, 1, "", "check_data_stat_result"], [4, 3, 1, "", "formatted_output"], [4, 2, 1, "", "print_labels_and_content"], [4, 3, 1, "", "text"]], "statannotations.Annotator": [[4, 1, 1, "", "Annotator"]], "statannotations.Annotator.Annotator": [[4, 3, 1, "", "alpha"], [4, 2, 1, "", "annotate"], [4, 2, 1, "", "annotate_custom_annotations"], [4, 2, 1, "", "apply_and_annotate"], [4, 2, 1, "", "apply_test"], [4, 3, 1, "", "comparisons_correction"], [4, 2, 1, "", "configure"], [4, 3, 1, "", "fig"], [4, 2, 1, "", "get_annotations_text"], [4, 2, 1, "", "get_configuration"], [4, 2, 1, "", "get_empty_annotator"], [4, 2, 1, "", "get_offset_func"], [4, 2, 1, "", "has_type0_comparisons_correction"], [4, 3, 1, "", "is_vertical"], [4, 3, 1, "", "loc"], [4, 2, 1, "", "new_plot"], [4, 3, 1, "", "orient"], [4, 2, 1, "", "plot_and_annotate"], [4, 2, 1, "", "plot_and_annotate_facets"], [4, 2, 1, "", "print_pvalue_legend"], [4, 3, 1, "", "pvalue_format"], [4, 2, 1, "", "reset_configuration"], [4, 2, 1, "", "set_custom_annotations"], [4, 2, 1, "", "set_pvalues"], [4, 2, 1, "", "set_pvalues_and_annotate"], [4, 3, 1, "", "test"], [4, 2, 1, "", "validate_test_short_name"], [4, 3, 1, "", "verbose"]], "statannotations.PValueFormat": [[4, 1, 1, "", "Formatter"], [4, 1, 1, "", "PValueFormat"], [4, 4, 1, "", "get_corrected_star"], [4, 4, 1, "", "sort_pvalue_thresholds"]], "statannotations.PValueFormat.Formatter": [[4, 2, 1, "", "config"], [4, 2, 1, "", "format_data"]], "statannotations.PValueFormat.PValueFormat": [[4, 2, 1, "", "config"], [4, 3, 1, "", "correction_format"], [4, 2, 1, "", "format_data"], [4, 2, 1, "", "get_configuration"], [4, 2, 1, "", "print_legend_if_used"], [4, 3, 1, "", "pvalue_format_string"], [4, 3, 1, "", "pvalue_thresholds"], [4, 3, 1, "", "simple_format_string"], [4, 3, 1, "", "text_format"]], "statannotations.format_annotations": [[4, 4, 1, "", "pval_annotation_text"], [4, 4, 1, "", "simple_text"]], "statannotations.stats": [[5, 0, 0, "-", "ComparisonsCorrection"], [5, 0, 0, "-", "StatResult"], [5, 0, 0, "-", "StatTest"], [5, 0, 0, "-", "test"], [5, 0, 0, "-", "utils"]], "statannotations.stats.ComparisonsCorrection": [[5, 1, 1, "", "ComparisonsCorrection"], [5, 4, 1, "", "check_valid_correction_name"], [5, 4, 1, "", "get_correction_parameters"], [5, 4, 1, "", "get_validated_comparisons_correction"]], "statannotations.stats.ComparisonsCorrection.ComparisonsCorrection": [[5, 2, 1, "", "apply"], [5, 2, 1, "", "document"]], "statannotations.stats.StatResult": [[5, 1, 1, "", "StatResult"]], "statannotations.stats.StatResult.StatResult": [[5, 2, 1, "", "adjust"], [5, 3, 1, "", "corrected_significance"], [5, 3, 1, "", "correction_method"], [5, 3, 1, "", "formatted_output"], [5, 3, 1, "", "is_significant"], [5, 3, 1, "", "significance_suffix"]], "statannotations.stats.StatTest": [[5, 1, 1, "", "StatTest"], [5, 4, 1, "", "wilcoxon"]], "statannotations.stats.StatTest.StatTest": [[5, 2, 1, "", "from_library"], [5, 3, 1, "", "short_name"]], "statannotations.stats.test": [[5, 4, 1, "", "apply_test"]], "statannotations.stats.utils": [[5, 4, 1, "", "check_alpha"], [5, 4, 1, "", "check_num_comparisons"], [5, 4, 1, "", "check_pvalues"], [5, 4, 1, "", "get_num_comparisons"], [5, 4, 1, "", "return_results"]], "statannotations.utils": [[4, 5, 1, "", "InvalidParametersError"], [4, 4, 1, "", "check_is_in"], [4, 4, 1, "", "check_not_none"], [4, 4, 1, "", "check_order_in_data"], [4, 4, 1, "", "check_pairs_in_data"], [4, 4, 1, "", "check_redundant_hue"], [4, 4, 1, "", "check_valid_text_format"], [4, 4, 1, "", "empty_dict_if_none"], [4, 4, 1, "", "get_closest"], [4, 4, 1, "", "get_x_values"], [4, 4, 1, "", "raise_expected_got"], [4, 4, 1, "", "remove_null"], [4, 4, 1, "", "render_collection"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "property", "Python property"], "4": ["py", "function", "Python function"], "5": ["py", "exception", "Python exception"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:property", "4": "py:function", "5": "py:exception"}, "terms": {"0": [4, 5], "001": 4, "01": 4, "05": [4, 5], "1": [4, 5], "12141511": 4, "1e": 4, "2": 4, "3": 4, "4": 4, "5": 4, "5e": 4, "9981846": 4, "A": 4, "For": 4, "If": 4, "One": 4, "Or": 4, "The": 4, "a_list": 4, "accept": 4, "ad": 4, "add": 4, "addit": [4, 5], "adjust": [4, 5], "after": 4, "alpha": [2, 4, 5], "an": 4, "annot": [0, 2], "annotate_custom_annot": [2, 4], "annotate_param": 4, "annotation_func": 4, "annotation_param": 4, "appli": [4, 5], "apply_and_annot": [2, 4], "apply_test": [2, 4, 5], "ar": 4, "arg": [4, 5], "argument": [4, 5], "arrai": 4, "assum": 4, "auto": 4, "ax": [0, 4], "ax_op_aft": 4, "ax_op_befor": 4, "bar": 4, "base": [4, 5], "befor": 4, "behavior": [4, 5], "being": 4, "benjamini": 5, "between": 4, "bonferroni": 5, "bool": [4, 5], "box": 4, "boxplot": 4, "brunner": 5, "calcul": 4, "call": 4, "callabl": 5, "can": [0, 4], "case": 5, "check": 4, "check_alpha": [4, 5], "check_data_stat_result": [2, 4], "check_is_in": [2, 4], "check_not_non": [2, 4], "check_num_comparison": [4, 5], "check_order_in_data": [2, 4], "check_pairs_in_data": [2, 4], "check_pvalu": [4, 5], "check_redundant_hu": [2, 4], "check_valid_correction_nam": [4, 5], "check_valid_text_format": [2, 4], "class": [4, 5], "classmethod": 4, "close": 4, "closest": 4, "collect": 4, "color": 4, "com": 4, "compar": 4, "comparison": [4, 5], "comparisons_correct": [0, 2, 4, 5], "comparisonscorrect": [2, 4], "comput": 4, "config": [2, 4], "configur": [0, 2, 4], "constructor": 4, "content": 2, "coord": 4, "coordin": 4, "corr_kwarg": 5, "correct": [4, 5], "corrected_signific": [4, 5], "correction_format": [2, 4], "correction_method": [4, 5], "correspond": 4, "creat": 4, "custom": 4, "custom_func": 0, "custom_long_nam": 0, "custom_short_nam": 0, "custom_test": 0, "data": [0, 4, 5], "datafram": 4, "def": 0, "default": [4, 5], "defin": 4, "dict": [4, 5], "displai": 4, "document": [4, 5], "each": 4, "earlier": 5, "either": 5, "empty_dict_if_non": [2, 4], "engin": 4, "equal": 4, "equival": 5, "error": 4, "error_typ": 4, "exact": 4, "except": 4, "exist": 4, "expect": 4, "extend": [1, 2], "facetgrid": 4, "fals": 4, "fig": [2, 4], "first": 4, "float": 5, "follow": 4, "for_": 4, "format": [4, 5], "format_annot": 2, "format_data": [2, 4], "formatt": [2, 4], "formatted_output": [2, 4, 5], "fraction": 4, "from": [0, 4, 5], "from_librari": [4, 5], "func": 5, "func_nam": 4, "function": [1, 2, 4, 5], "fwer": 4, "gener": 4, "get": 5, "get_annotations_text": [2, 4], "get_closest": [2, 4], "get_configur": [2, 4], "get_corrected_star": [2, 4], "get_correction_paramet": [4, 5], "get_empty_annot": [2, 4], "get_num_comparison": [4, 5], "get_offset_func": [2, 4], "get_validated_comparisons_correct": [4, 5], "get_x_valu": [2, 4], "got": 4, "group": 4, "group_data1": [0, 5], "group_data1_log": 0, "group_data2": [0, 5], "group_data2_log": 0, "gt": 5, "has_type0_comparisons_correct": [2, 4], "have": 4, "hide": 4, "hide_non_signific": 4, "hochberg": 5, "hold": 4, "holm": 5, "how": 4, "http": 4, "hue": 4, "hue_ord": 4, "i": 4, "import": 0, "index": 1, "initi": [0, 4], "instanc": [4, 5], "instead": 4, "int": 5, "interfac": 5, "interpret": 5, "invalidparameterserror": [2, 4], "is_signific": [4, 5], "is_vert": [2, 4], "keyword": 5, "kruskal": 5, "kwarg": [4, 5], "l": 5, "label": 4, "leven": 5, "line_height": 4, "line_offset": 4, "line_offset_to_group": 4, "line_width": 4, "link": 4, "list": 4, "loc": [2, 4], "log": 0, "log_ttest": 0, "mann": 5, "map": 4, "messag": 4, "method": [4, 5], "method_typ": 5, "mode": 4, "modul": [1, 2], "multipl": [4, 5], "multipletest": 4, "munzel": 5, "must": 4, "mylist": 4, "mynumb": 4, "n": 4, "name": [4, 5], "new_plot": [2, 4], "non": 4, "none": [0, 4, 5], "notat": 4, "np": 0, "num_comparison": [4, 5], "number": [4, 5], "numpi": 0, "object": [0, 4, 5], "one": [4, 5], "onto": 4, "option": 4, "order": 4, "orient": [2, 4], "origin": 4, "other": [1, 2], "otherwis": 4, "output": [0, 4], "overrid": 4, "p": [0, 4], "p_valu": 5, "packag": [1, 2], "page": 1, "pair": [0, 4], "paramet": [4, 5], "pass": [0, 4, 5], "per": 4, "perform": 4, "plot": 4, "plot_and_annot": [2, 4], "plot_and_annotate_facet": [2, 4], "plot_param": 4, "point": 4, "posit": 4, "print": 4, "print_labels_and_cont": [2, 4], "print_legend_if_us": [2, 4], "print_pvalue_legend": [2, 4], "properti": [4, 5], "provid": [4, 5], "pval": 5, "pval_annotation_text": [2, 4], "pvalu": [4, 5], "pvalue_format": [2, 4], "pvalue_format_str": [2, 4], "pvalue_threshold": [2, 4], "pvalueformat": 2, "rais": 4, "raise_expected_got": [2, 4], "rang": 4, "re": 4, "refer": 4, "remov": 4, "remove_nul": [2, 4], "render": 4, "render_collect": [2, 4], "replac": 4, "reset_configur": [2, 4], "result": [4, 5], "results_arrai": 5, "return": [0, 4], "return_result": [4, 5], "run": 5, "same": 4, "sampl": 5, "scipi": 0, "seaborn": 4, "search": 1, "see": 4, "sep": 4, "seri": 4, "set": [0, 4], "set_custom_annot": [2, 4], "set_pvalu": [2, 4], "set_pvalues_and_annot": [2, 4], "short": 4, "short_nam": [4, 5], "short_test_nam": 4, "show": 4, "show_test_nam": 4, "signific": 4, "significance_suffix": [4, 5], "simpl": 4, "simple_format_str": [2, 4], "simple_text": [2, 4], "singl": 4, "smallest": 4, "sort": 4, "sort_pvalue_threshold": [2, 4], "stackoverflow": 4, "standard": 4, "star": [0, 4], "stat": [0, 2, 4], "stat_nam": 5, "stat_str": 5, "stat_summari": 5, "statannot": 0, "static": [4, 5], "statist": [1, 2, 4, 5], "statresult": [2, 4], "stats_param": [0, 4, 5], "statsmodel": [4, 5], "statsmodels_api": 5, "stattest": [0, 2, 4], "str": [4, 5], "string": 4, "struct": 4, "submodul": 2, "subpackag": 2, "suffix": 4, "t": [0, 5], "take": 0, "test": [0, 2, 4], "test_descript": 5, "test_ind": 5, "test_long_nam": 5, "test_nam": 5, "test_pair": 5, "test_result_list": 5, "test_short_nam": [4, 5], "test_welch": 5, "text": [2, 4], "text_annot_custom": 4, "text_format": [0, 2, 4], "text_offset": 4, "them": 4, "thereof": 4, "thi": [4, 5], "three": 4, "threshold": 4, "top": 4, "true": [4, 5], "ttest_ind": 0, "tupl": 4, "two": [0, 4, 5], "type": 4, "union": 5, "us": [0, 4, 5], "use_fixed_offset": 4, "util": 2, "v": 4, "valid_valu": 4, "validate_test_short_nam": [2, 4], "valu": [0, 4, 5], "valueerror": 4, "verbos": [2, 4, 5], "version": 5, "w": 4, "wa": 4, "when": [0, 4], "whether": 4, "whitnei": 5, "wilcoxon": [4, 5], "within": 4, "work": 4, "write": 0, "x": 4, "y": 4, "yekuti": 5, "you": 0, "your": 0}, "titles": ["Extending to other statistical functions", "Welcome to statannotations\u2019s documentation!", "statannotations", "setup module", "statannotations package", "statannotations.stats package"], "titleterms": {"": 1, "annot": 4, "comparisonscorrect": 5, "content": [1, 4, 5], "document": 1, "extend": 0, "format_annot": 4, "function": 0, "indic": 1, "modul": [3, 4, 5], "other": 0, "packag": [4, 5], "pvalueformat": 4, "setup": 3, "stat": 5, "statannot": [1, 2, 4, 5], "statist": 0, "statresult": 5, "stattest": 5, "submodul": [4, 5], "subpackag": 4, "tabl": 1, "test": 5, "util": [4, 5], "welcom": 1}}) \ No newline at end of file diff --git a/docs/build/html/setup.html b/docs/build/html/setup.html deleted file mode 100644 index b51f32f..0000000 --- a/docs/build/html/setup.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - setup module — statannotations 1.0.0a0 documentation - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

setup module

-
- - -
-
-
- -
- -
-

© Copyright 2021, Florian Charlier.

-
- - Built with Sphinx using a - theme - provided by Read the Docs. - - -
-
-
-
-
- - - - \ No newline at end of file diff --git a/docs/build/html/statannotations.html b/docs/build/html/statannotations.html deleted file mode 100644 index 0d13e4b..0000000 --- a/docs/build/html/statannotations.html +++ /dev/null @@ -1,745 +0,0 @@ - - - - - - - - - statannotations package — statannotations 1.0.0a0 documentation - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

statannotations package

-
-

Subpackages

- -
-
-

Submodules

-
-
-

statannotations.Annotation module

-
-
-class statannotations.Annotation.Annotation(structs, data: str | StatResult, formatter: Formatter = None)
-

Bases: object

-

Holds data, linked structs and an optional Formatter.

-
-
-check_data_stat_result()
-
- -
-
-property formatted_output
-
- -
-
-print_labels_and_content(sep=' vs. ')
-
- -
-
-property text
-
- -
- -
-
-

statannotations.Annotator module

-
-
-class statannotations.Annotator.Annotator(ax, pairs, plot='boxplot', data=None, x=None, y=None, hue=None, order=None, hue_order=None, engine='seaborn', verbose=True, **plot_params)
-

Bases: object

-

Optionally computes statistical test between pairs of data series, and add -statistical annotation on top of the groups (boxes, bars…). The same -exact arguments provided to the seaborn plotting function must be passed to -the constructor.

-
-
This Annotator works in one of the three following modes:
    -
  • Add custom text annotations (set_custom_annotations)

  • -
  • Format pvalues and add them to the plot (set_pvalues)

  • -
  • -
    Perform a statistical test and then add the results to the plot

    (apply_test)

    -
    -
    -
  • -
-
-
-
-
-property alpha
-
- -
-
-annotate(line_offset=None, line_offset_to_group=None)
-

Add configured annotations to the plot.

-
- -
-
-annotate_custom_annotations(text_annot_custom)
-
-
Parameters:
-

text_annot_custom – List of strings to annotate for each pair

-
-
-
- -
-
-apply_and_annotate()
-

Applies a configured statistical test and annotates the plot

-
- -
-
-apply_test(num_comparisons='auto', **stats_params)
-
-
Parameters:
-
    -
  • stats_params – Parameters for statistical test functions.

  • -
  • num_comparisons – Override number of comparisons otherwise -calculated with number of pairs

  • -
-
-
-
- -
-
-property comparisons_correction
-
- -
-
-configure(**parameters)
-
    -
  • alpha: Acceptable type 1 error for statistical tests, default 0.05

  • -
  • color

  • -
  • -
    comparisons_correction: Method for multiple comparisons correction.

    One of statsmodels multipletests methods (w/ default FWER), or -a ComparisonsCorrection instance.

    -
    -
    -
  • -
  • -
    correction_format: How to format the star notation on the plot when

    the multiple comparisons correction method removes the significance -* default: a ‘ (ns)’ suffix is added, such as in printed output, -corresponds to “{star} ({suffix})” -* replace: the original star value is replaced with ‘ns’ -corresponds to “{suffix}” -* a custom formatting string using “{star}” for the original -pvalue and ‘{suffix}’ for ‘ns’

    -
    -
    -
  • -
  • -
    hide_non_significant: hide annotations for non-significant pair

    comparisons

    -
    -
    -
  • -
  • line_height: in axes fraction coordinates

  • -
  • line_offset

  • -
  • line_offset_to_group

  • -
  • line_width

  • -
  • loc

  • -
  • -
    pvalue_format: list of lists, or tuples. Default values are:
      -
    • For “star” text_format: -[[1e-4, “****”], [1e-3, “***”], [1e-2, “**”], [0.05, “*”], [1, “ns”]].

    • -
    • For “simple” text_format: -[[1e-5, “1e-5”], [1e-4, “1e-4”], [1e-3, “0.001”], [1e-2, “0.01”], [5e-2, “0.05”]].

    • -
    -
    -
    -
  • -
  • -
    show_test_name: Set to False to not show the (short) name of

    test

    -
    -
    -
  • -
  • test

  • -
  • text_offset: in points

  • -
  • test_short_name

  • -
  • use_fixed_offset

  • -
  • verbose

  • -
-
- -
-
-property fig
-
- -
-
-get_annotations_text()
-
- -
-
-get_configuration()
-
- -
-
-static get_empty_annotator()
-

This instance will have to be initialized with new_plot() before -being used. This behavior can be useful to create an Annotator before -using it in a FacetGrid mapping.

-
- -
-
-classmethod get_offset_func(position)
-
- -
-
-has_type0_comparisons_correction()
-
- -
-
-property is_vertical: bool
-
- -
-
-property loc
-
- -
-
-new_plot(ax, pairs=None, plot='boxplot', data=None, x=None, y=None, hue=None, order=None, hue_order=None, engine: str = 'seaborn', **plot_params)
-
- -
-
-property orient: str
-
- -
-
-static plot_and_annotate(plot: str, pairs: list, plot_params: dict, configuration: dict, annotation_func: str, annotation_params: dict = None, ax_op_before: List[str | list | None | dict] = None, ax_op_after: List[str | list | None | dict] = None, annotate_params: dict = None)
-

Plots using seaborn and annotates in a single call.

-
-
Parameters:
-
    -
  • plot – seaborn plotting function to call

  • -
  • pairs – pairs to compare (see Annotator)

  • -
  • plot_params – parameters for plotting function call

  • -
  • configuration – parameters for Annotator.configure

  • -
  • annotation_func – name of annotation function to be called, from: -* ‘set_custom_annotations’ -* ‘set_pvalues’ -* ‘apply_test’

  • -
  • annotation_params – parameters for the annotation function

  • -
  • ax_op_before – list of [func_name, args, kwargs] to apply on ax -before annotating

  • -
  • ax_op_after – list of [func_name, args, kwargs] to apply on ax -after annotating

  • -
  • annotate_params – parameters for Annotator.annotate

  • -
-
-
-
- -
-
-plot_and_annotate_facets(plot: str, plot_params: dict, configuration: dict, annotation_func: str, *args, annotation_params: dict = None, ax_op_before: List[str | list | None | dict] = None, ax_op_after: List[str | list | None | dict] = None, annotate_params: dict = None, **kwargs)
-

Plots using seaborn and annotates in a single call, to be used within -a FacetGrid. -First, initialize the Annotator with Annotator(None, pairs) to define -the pairs, then map this function onto the FacetGrid.

-
-
Parameters:
-
    -
  • plot – seaborn plotting function to call

  • -
  • plot_params – parameters for plotting function call

  • -
  • configuration – parameters for Annotator.configure

  • -
  • annotation_func – name of annotation function to be called, from: -* ‘set_custom_annotations’ -* ‘set_pvalues’ -* ‘apply_test’

  • -
  • annotation_params – parameters for the annotation function

  • -
  • ax_op_before – list of [func_name, args, kwargs] to apply on ax -before annotating

  • -
  • ax_op_after – list of [func_name, args, kwargs] to apply on ax -after annotating

  • -
  • annotate_params – parameters for Annotator.annotate

  • -
  • args – additional parameters for the seaborn function

  • -
  • kwargs – additional parameters for the seaborn function

  • -
-
-
-
- -
-
-print_pvalue_legend()
-
- -
-
-property pvalue_format
-
- -
-
-reset_configuration()
-
- -
-
-set_custom_annotations(text_annot_custom)
-
-
Parameters:
-

text_annot_custom – List of strings to annotate for each pair

-
-
-
- -
-
-set_pvalues(pvalues, num_comparisons='auto')
-
-
Parameters:
-
    -
  • pvalues – list or array of p-values for each pair comparison.

  • -
  • num_comparisons – Override number of comparisons otherwise -calculated with number of pairs

  • -
-
-
-
- -
-
-set_pvalues_and_annotate(pvalues, num_comparisons='auto')
-
- -
-
-property test
-
- -
-
-validate_test_short_name()
-
- -
-
-property verbose
-
- -
- -
-
-

statannotations.PValueFormat module

-
-
-class statannotations.PValueFormat.Formatter
-

Bases: object

-
-
-config(*args, **kwargs)
-
- -
-
-format_data(data)
-
- -
- -
-
-class statannotations.PValueFormat.PValueFormat
-

Bases: Formatter

-
-
-config(**parameters)
-
- -
-
-property correction_format
-
- -
-
-format_data(result)
-
- -
-
-get_configuration()
-
- -
-
-print_legend_if_used()
-
- -
-
-property pvalue_format_string
-
- -
-
-property pvalue_thresholds
-
- -
-
-property simple_format_string
-
- -
-
-property text_format
-
- -
- -
-
-statannotations.PValueFormat.get_corrected_star(star: str, res: StatResult, correction_format='{star} ({suffix})') str
-
- -
-
-statannotations.PValueFormat.sort_pvalue_thresholds(pvalue_thresholds)
-
- -
-
-

statannotations.format_annotations module

-
-
-statannotations.format_annotations.pval_annotation_text(result: List[StatResult], pvalue_thresholds: List) List[tuple]
-
-
Parameters:
-
    -
  • result – StatResult instance or list thereof

  • -
  • pvalue_thresholds – thresholds to use for formatter

  • -
-
-
Returns:
-

A List of rendered annotations if a list of StatResults was -provided, a string otherwise.

-
-
-
- -
-
-statannotations.format_annotations.simple_text(result: StatResult, pvalue_format, pvalue_thresholds, short_test_name=True) str
-

Generates simple text for test name and pvalue.

-
-
Parameters:
-
    -
  • result – StatResult instance

  • -
  • pvalue_format – format string for pvalue

  • -
  • pvalue_thresholds – String to display per pvalue range

  • -
  • short_test_name – whether to display the test (short) name

  • -
-
-
Returns:
-

simple annotation

-
-
-
- -
-
-

statannotations.utils module

-
-
-exception statannotations.utils.InvalidParametersError(parameters)
-

Bases: Exception

-
- -
-
-statannotations.utils.check_is_in(x, valid_values, error_type=<class 'ValueError'>, label=None)
-

Raise an error if x is not in valid_values.

-
- -
-
-statannotations.utils.check_not_none(name, value)
-
- -
-
-statannotations.utils.check_order_in_data(data, x, order) None
-
- -
-
-statannotations.utils.check_pairs_in_data(pairs: list | tuple, data: List[list] | DataFrame | None = None, coord: str | list | None = None, hue: str | None = None, hue_order: List[str] | None = None)
-

Checks that values referred to in order and pairs exist in data.

-
- -
-
-statannotations.utils.check_redundant_hue(data: List[list] | DataFrame | None = None, coord: str | list | None = None, hue: str | None = None, hue_order: List[str] | None = None) bool
-
- -
-
-statannotations.utils.check_valid_text_format(text_format)
-
- -
-
-statannotations.utils.empty_dict_if_none(data)
-
- -
-
-statannotations.utils.get_closest(a_list, value)
-

Assumes myList is sorted. Returns closest value to myNumber. -If two numbers are equally close, return the smallest number. -from https://stackoverflow.com/a/12141511/9981846

-
- -
-
-statannotations.utils.get_x_values(data, x) set
-
- -
-
-statannotations.utils.raise_expected_got(expected, for_, got, error_type=<class 'ValueError'>)
-

Raise a standardized error message.

-
-
Raise an error_type error with the message

Expected expected for for_; got got instead.

-
-
Or, if for_ is None,

Expected expected; got got instead.

-
-
-
- -
-
-statannotations.utils.remove_null(series)
-
- -
-
-statannotations.utils.render_collection(collection)
-
- -
-
-

Module contents

-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file diff --git a/docs/build/html/statannotations.stats.html b/docs/build/html/statannotations.stats.html deleted file mode 100644 index 7108e72..0000000 --- a/docs/build/html/statannotations.stats.html +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - - - - statannotations.stats package — statannotations 1.0.0a0 documentation - - - - - - - - - - - - - - - - - -
- - -
- -
-
-
- -
-
-
-
- -
-

statannotations.stats package

-
-

Submodules

-
-
-

statannotations.stats.ComparisonsCorrection module

-
-
-class statannotations.stats.ComparisonsCorrection.ComparisonsCorrection(method: str | callable, alpha: float = 0.05, name: str = None, method_type: int = None, statsmodels_api: bool = True, corr_kwargs: dict = None)
-

Bases: object

-
-
-apply(test_result_list)
-
- -
-
-document(func)
-
- -
- -
-
-statannotations.stats.ComparisonsCorrection.check_valid_correction_name(name)
-
- -
-
-statannotations.stats.ComparisonsCorrection.get_correction_parameters(name)
-
- -
-
-statannotations.stats.ComparisonsCorrection.get_validated_comparisons_correction(comparisons_correction)
-
- -
-
-

statannotations.stats.StatResult module

-
-
-class statannotations.stats.StatResult.StatResult(test_description, test_short_name, stat_str, stat, pval, alpha=0.05)
-

Bases: object

-
-
-adjust(stat_summary)
-
- -
-
-property corrected_significance
-
- -
-
-property correction_method
-
- -
-
-property formatted_output
-
- -
-
-property is_significant
-
- -
-
-property significance_suffix
-
- -
- -
-
-

statannotations.stats.StatTest module

-
-
-class statannotations.stats.StatTest.StatTest(func: Callable, test_long_name: str, test_short_name: str, stat_name: str = 'Stat', alpha: float = 0.05, *args, **kwargs)
-

Bases: object

-
-
-static from_library(test_name: str) StatTest
-
- -
-
-property short_name
-
- -
- -
-
-statannotations.stats.StatTest.wilcoxon(group_data1, group_data2, verbose=1, **stats_params)
-

This function provides the equivalent behavior from earlier versions of -statannot/statannotations.

-
- -
-
-

statannotations.stats.test module

-
-
-statannotations.stats.test.apply_test(group_data1, group_data2, test: StatTest | str = None, comparisons_correction: ComparisonsCorrection | str = None, num_comparisons: int = 1, alpha: float = 0.05, **stats_params)
-

Get formatted result of two-sample statistical test.

-
-
Parameters:
-
    -
  • group_data1 – data

  • -
  • group_data2 – data

  • -
  • test – Union[StatTest, str]: Statistical test to run. -Either a StatTest instance or one of: -- Brunner-Munzel -- Levene -- Mann-Whitney -- Mann-Whitney-gt -- Mann-Whitney-ls -- t-test_ind -- t-test_welch -- t-test_paired -- Wilcoxon -- Kruskal

  • -
  • comparisons_correction – Union[ComparisonsCorrection, str]: -(Default value = None) -Method to use for multiple comparisons correction. Either a -ComparisonsCorrection instance or one of (interfacing statsmodels): -- Bonferroni -- Holm-Bonferroni -- Benjamini-Hochberg -- Benjamini-Yekutieli

  • -
  • num_comparisons – int: (Default value = 1) -Number of comparisons to use for multiple comparisons correction.

  • -
  • alpha – float: (Default value = 0.05) -Used for pvalue interpretation in case of comparisons_correction.

  • -
  • stats_params – Additional keyword arguments to pass to the test -function

  • -
-
-
-
- -
-
-

statannotations.stats.utils module

-
-
-statannotations.stats.utils.check_alpha(alpha)
-
- -
-
-statannotations.stats.utils.check_num_comparisons(num_comparisons)
-
- -
-
-statannotations.stats.utils.check_pvalues(p_values)
-
- -
-
-statannotations.stats.utils.get_num_comparisons(p_values, num_comparisons)
-
- -
-
-statannotations.stats.utils.return_results(results_array)
-
- -
-
-

Module contents

-
-
- - -
-
- -
-
-
-
- - - - \ No newline at end of file From 0494b16c042599be5717f329394ec3aba0487198 Mon Sep 17 00:00:00 2001 From: getzze Date: Tue, 19 Nov 2024 15:35:16 +0000 Subject: [PATCH 10/15] test fix coverage --- .github/workflows/python-package.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 5cab929..18f9595 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -97,7 +97,9 @@ jobs: uses: actions/upload-artifact@v4 with: name: coverage-${{ matrix.python-version }}-${{ matrix.seaborn-version }} - path: "report/.coverage.*" + path: report/.coverage.* + if-no-files-found: error + include-hidden-files: true coverage: name: coverage From 8a7bd5e26c2ff766bb682985f28ff51a7a3c1a10 Mon Sep 17 00:00:00 2001 From: getzze Date: Tue, 19 Nov 2024 21:23:52 +0000 Subject: [PATCH 11/15] update installation --- README.md | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 5cd4591..4966777 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![Active Development](https://img.shields.io/badge/Maintenance%20Level-Actively%20Developed-brightgreen.svg)](https://gist.github.com/cheerfulstoic/d107229326a01ff0f333a1d3476e068d) -![coverage](https://raw.githubusercontent.com/trevismd/statannotations/master/coverage.svg) +[![Active Development](https://img.shields.io/badge/Maintenance%20Level-Actively%20Developed-brightgreen.svg)](https://gist.github.com/cheerfulstoic/d107229326a01ff0f333a1d3476e068d) +![coverage](https://raw.githubusercontent.com/trevismd/statannotations/master/coverage.svg) ![Python](https://img.shields.io/badge/Python-3.8%2B-blue) [![Documentation Status](https://readthedocs.org/projects/statannotations/badge/?version=latest)](https://statannotations.readthedocs.io/en/master/?badge=latest) [![DOI](https://zenodo.org/badge/296015778.svg)](https://zenodo.org/badge/latestdoi/296015778) @@ -19,7 +19,7 @@ Latest (v0.7) : supports pandas v2+ and seaborn v0.12+ - Bar plots - **Swarm plots** - **Strip plots** - - **Violin plots** + - **Violin plots** - Supporting `FacetGrid` - Integrated statistical tests (binding to `scipy.stats` methods): - Mann-Whitney @@ -54,9 +54,12 @@ Latest (v0.7) : supports pandas v2+ and seaborn v0.12+ ## Installation From version 0.3.0 on, the package is distributed on PyPi. -The latest stable release (v0.6.0) can be downloaded and installed with: +The latest stable release can be downloaded and installed with: ```bash pip install statannotations + +# with optional dependencies for multiple comparisons +pip install statannotations[extra] ``` or, with conda ![Conda (channel only)](https://img.shields.io/conda/vn/conda-forge/statannotations) @@ -69,8 +72,8 @@ or, after cloning the repository, ```bash pip install . -# OR, to have optional dependencies too (multiple comparisons & testing) -pip install -r requirements.txt . +# OR, with optional dependencies (multiple comparisons & testing) +pip install '.[extra,tests,dev]' ``` ## Usage @@ -109,9 +112,9 @@ annotator.apply_and_annotate() ## Documentation - Usage examples in a jupyter notebook [usage/example.ipynb](https://github.com/trevismd/statannotations/blob/master/usage/example.ipynb), -- A multipart step-by-step tutorial in a separate [repository](https://github.com/trevismd/statannotations-tutorials) +- A multipart step-by-step tutorial in a separate [repository](https://github.com/trevismd/statannotations-tutorials) — [First part here](https://github.com/trevismd/statannotations-tutorials/blob/main/Tutorial_1/Statannotations-Tutorial-1.ipynb), - also as a blog post on [Medium](https://levelup.gitconnected.com/statistics-on-seaborn-plots-with-statannotations-2bfce0394c00). + also as a blog post on [Medium](https://levelup.gitconnected.com/statistics-on-seaborn-plots-with-statannotations-2bfce0394c00). - *In-progress* sphinx documentation in `/docs`, available on https://statannotations.readthedocs.io/en/latest/index.html ## Requirements @@ -126,7 +129,7 @@ annotator.apply_and_annotate() ## Citation -If you are using this work, please use the following information to cite it. +If you are using this work, please use the following information to cite it. Bibtex ```tex @@ -156,17 +159,17 @@ Bibtex ``` Example ``` -Florian Charlier, Marc Weber, Dariusz Izak, Emerson Harkin, Marcin Magnus, -Joseph Lalli, Louison Fresnais, Matt Chan, Nikolay Markov, Oren Amsalem, -Sebastian Proost, Agamemnon Krasoulis, getzze, & Stefan Repplinger. (2022). +Florian Charlier, Marc Weber, Dariusz Izak, Emerson Harkin, Marcin Magnus, +Joseph Lalli, Louison Fresnais, Matt Chan, Nikolay Markov, Oren Amsalem, +Sebastian Proost, Agamemnon Krasoulis, getzze, & Stefan Repplinger. (2022). Statannotations (v0.6). Zenodo. https://doi.org/10.5281/zenodo.7213391 ``` ## Contributing -**Opening issues and PRs are very much welcome!** (preferably in that order). +**Opening issues and PRs are very much welcome!** (preferably in that order). In addition to git's history, contributions to statannotations are logged in -the changelog. +the changelog. If you don't know where to start, there may be a few ideas in opened issues or discussion, or something to work for the documentation. NB: More on [CONTRIBUTING.md](CONTRIBUTING.md) @@ -180,11 +183,11 @@ This repository is based on Additions/modifications since that version are below represented **in bold** (previous fixes are not listed). -**! From version 0.4.0 onwards (introduction of `Annotator`), `statannot`'s API -is no longer usable in `statannotations`**. -Please use the latest v0.3.2 release if you must keep `statannot`'s API in your +**! From version 0.4.0 onwards (introduction of `Annotator`), `statannot`'s API +is no longer usable in `statannotations`**. +Please use the latest v0.3.2 release if you must keep `statannot`'s API in your code, but are looking for bug fixes we have covered. -`statannot`'s interface, at least until its version 0.2.3, is usable in +`statannot`'s interface, at least until its version 0.2.3, is usable in statannotations until v.0.3.x, which already provides additional features (see corresponding branch). From ecd7ee791cb91085f0070be39f83445cbb1a7452 Mon Sep 17 00:00:00 2001 From: getzze Date: Tue, 19 Nov 2024 21:24:33 +0000 Subject: [PATCH 12/15] add typos --- .pre-commit-config.yaml | 15 ++++++++++++--- pyproject.toml | 21 +++++++++++++++++---- tests/test_utils.py | 2 +- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d99bbae..4c515e0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,16 +1,25 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v2.3.0 + rev: v5.0.0 hooks: - id: check-yaml # - id: end-of-file-fixer + # exclude: '^(.*\.svg)$' # - id: trailing-whitespace + # exclude: '^(.*\.svg|.*\.tsv)$' + - repo: https://github.com/abravalheri/validate-pyproject - rev: v0.18 + rev: v0.23 hooks: - id: validate-pyproject + + - repo: https://github.com/crate-ci/typos + rev: v1.27.3 + hooks: + - id: typos + # - repo: https://github.com/astral-sh/ruff-pre-commit -# rev: v0.5.5 +# rev: v0.7.4 # hooks: # # Run the linter. # - id: ruff diff --git a/pyproject.toml b/pyproject.toml index c33b074..7b34de9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,11 +45,13 @@ tests = [ # "coverage[toml]>=7.3", ] docs = [ - "sphinx", + "sphinx>=5.3", "sphinx-rtd-theme", ] dev = [ "ipython", + "pre-commit", + "mypy", ] [project.urls] @@ -57,11 +59,11 @@ Homepage = "https://github.com/trevismd/statannotations" # https://hatch.pypa.io/latest/config/metadata/ [tool.hatch.version] -path = "statannotations/_version.py" +path = "src/statannotations/_version.py" [tool.hatch.build.targets.sdist] only-include = [ - "/statannotations", + "/src/statannotations", # "usage", # "tests", # "docs", @@ -90,7 +92,7 @@ show_missing = true skip_covered = false [tool.coverage.run] -source = ["."] +source = ["src"] branch = true parallel = true # Cannot use, it results in 'no-data-collected' @@ -101,3 +103,14 @@ source = [ "statannotations", "**/site-packages/statannotations", ] + + +# https://github.com/crate-ci/typos/blob/master/docs/reference.md +[tool.typos.default] +extend-ignore-re = [ + "(?Rm)^.*#\\s*spellchecker:\\s*disable-line$", + "#\\s*spellchecker:off\\s*\\n.*\\n\\s*#\\s*spellchecker:on" +] + +[tool.typos.files] +extend-exclude = ["*.svg"] diff --git a/tests/test_utils.py b/tests/test_utils.py index 5cedbd1..b63539c 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -48,7 +48,7 @@ def test_larger_than_max(self): value = 31 self.assertEqual(30, get_closest(self.a_list, value)) - def test_btween1(self): + def test_between1(self): value = 12.1 self.assertAlmostEqual(12, get_closest(self.a_list, value)) From 0e83428229f3e88247a418f11892a27e2571d668 Mon Sep 17 00:00:00 2001 From: getzze Date: Tue, 19 Nov 2024 21:24:44 +0000 Subject: [PATCH 13/15] move to src --- docs/requirements.in | 1 - docs/requirements.txt | 48 ------------------- docs/source/conf.py | 7 --- docs/source/custom-test.rst | 2 +- .../statannotations}/Annotation.py | 0 .../statannotations}/Annotator.py | 0 .../statannotations}/PValueFormat.py | 0 .../statannotations}/_GroupsPositions.py | 0 .../statannotations}/_Plotter.py | 0 .../statannotations}/__init__.py | 0 .../statannotations}/_version.py | 0 .../statannotations}/compat.py | 0 .../statannotations}/format_annotations.py | 0 .../stats/ComparisonsCorrection.py | 0 .../statannotations}/stats/README.rst | 0 .../statannotations}/stats/StatResult.py | 0 .../statannotations}/stats/StatTest.py | 0 .../statannotations}/stats/__init__.py | 0 .../statannotations}/stats/test.py | 0 .../statannotations}/stats/utils.py | 0 .../statannotations}/utils.py | 0 21 files changed, 1 insertion(+), 57 deletions(-) delete mode 100644 docs/requirements.in delete mode 100644 docs/requirements.txt rename {statannotations => src/statannotations}/Annotation.py (100%) rename {statannotations => src/statannotations}/Annotator.py (100%) rename {statannotations => src/statannotations}/PValueFormat.py (100%) rename {statannotations => src/statannotations}/_GroupsPositions.py (100%) rename {statannotations => src/statannotations}/_Plotter.py (100%) rename {statannotations => src/statannotations}/__init__.py (100%) rename {statannotations => src/statannotations}/_version.py (100%) rename {statannotations => src/statannotations}/compat.py (100%) rename {statannotations => src/statannotations}/format_annotations.py (100%) rename {statannotations => src/statannotations}/stats/ComparisonsCorrection.py (100%) rename {statannotations => src/statannotations}/stats/README.rst (100%) rename {statannotations => src/statannotations}/stats/StatResult.py (100%) rename {statannotations => src/statannotations}/stats/StatTest.py (100%) rename {statannotations => src/statannotations}/stats/__init__.py (100%) rename {statannotations => src/statannotations}/stats/test.py (100%) rename {statannotations => src/statannotations}/stats/utils.py (100%) rename {statannotations => src/statannotations}/utils.py (100%) diff --git a/docs/requirements.in b/docs/requirements.in deleted file mode 100644 index 48631c4..0000000 --- a/docs/requirements.in +++ /dev/null @@ -1 +0,0 @@ -sphinx==5.3.0 \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 73d1833..0000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,48 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.12 -# by the following command: -# -# pip-compile requirements.in -# -alabaster==0.7.16 - # via sphinx -babel==2.16.0 - # via sphinx -certifi==2024.8.30 - # via requests -charset-normalizer==3.4.0 - # via requests -docutils==0.19 - # via sphinx -idna==3.10 - # via requests -imagesize==1.4.1 - # via sphinx -jinja2==3.1.4 - # via sphinx -markupsafe==3.0.2 - # via jinja2 -packaging==24.2 - # via sphinx -pygments==2.18.0 - # via sphinx -requests==2.32.3 - # via sphinx -snowballstemmer==2.2.0 - # via sphinx -sphinx==5.3.0 - # via -r requirements.in -sphinxcontrib-applehelp==2.0.0 - # via sphinx -sphinxcontrib-devhelp==2.0.0 - # via sphinx -sphinxcontrib-htmlhelp==2.1.0 - # via sphinx -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-qthelp==2.0.0 - # via sphinx -sphinxcontrib-serializinghtml==2.0.0 - # via sphinx -urllib3==2.2.3 - # via requests diff --git a/docs/source/conf.py b/docs/source/conf.py index 9e4921f..b44c9fa 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -10,13 +10,6 @@ # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # -import os -import sys -import sphinx_rtd_theme - - -sys.path.insert(0, os.path.abspath('../..')) - # -- Project information ----------------------------------------------------- diff --git a/docs/source/custom-test.rst b/docs/source/custom-test.rst index 6b9f882..e72b55a 100644 --- a/docs/source/custom-test.rst +++ b/docs/source/custom-test.rst @@ -1,4 +1,4 @@ Extending to other statistical functions **************************************** -.. include:: ../../statannotations/stats/README.rst \ No newline at end of file +.. include:: ../../src/statannotations/stats/README.rst diff --git a/statannotations/Annotation.py b/src/statannotations/Annotation.py similarity index 100% rename from statannotations/Annotation.py rename to src/statannotations/Annotation.py diff --git a/statannotations/Annotator.py b/src/statannotations/Annotator.py similarity index 100% rename from statannotations/Annotator.py rename to src/statannotations/Annotator.py diff --git a/statannotations/PValueFormat.py b/src/statannotations/PValueFormat.py similarity index 100% rename from statannotations/PValueFormat.py rename to src/statannotations/PValueFormat.py diff --git a/statannotations/_GroupsPositions.py b/src/statannotations/_GroupsPositions.py similarity index 100% rename from statannotations/_GroupsPositions.py rename to src/statannotations/_GroupsPositions.py diff --git a/statannotations/_Plotter.py b/src/statannotations/_Plotter.py similarity index 100% rename from statannotations/_Plotter.py rename to src/statannotations/_Plotter.py diff --git a/statannotations/__init__.py b/src/statannotations/__init__.py similarity index 100% rename from statannotations/__init__.py rename to src/statannotations/__init__.py diff --git a/statannotations/_version.py b/src/statannotations/_version.py similarity index 100% rename from statannotations/_version.py rename to src/statannotations/_version.py diff --git a/statannotations/compat.py b/src/statannotations/compat.py similarity index 100% rename from statannotations/compat.py rename to src/statannotations/compat.py diff --git a/statannotations/format_annotations.py b/src/statannotations/format_annotations.py similarity index 100% rename from statannotations/format_annotations.py rename to src/statannotations/format_annotations.py diff --git a/statannotations/stats/ComparisonsCorrection.py b/src/statannotations/stats/ComparisonsCorrection.py similarity index 100% rename from statannotations/stats/ComparisonsCorrection.py rename to src/statannotations/stats/ComparisonsCorrection.py diff --git a/statannotations/stats/README.rst b/src/statannotations/stats/README.rst similarity index 100% rename from statannotations/stats/README.rst rename to src/statannotations/stats/README.rst diff --git a/statannotations/stats/StatResult.py b/src/statannotations/stats/StatResult.py similarity index 100% rename from statannotations/stats/StatResult.py rename to src/statannotations/stats/StatResult.py diff --git a/statannotations/stats/StatTest.py b/src/statannotations/stats/StatTest.py similarity index 100% rename from statannotations/stats/StatTest.py rename to src/statannotations/stats/StatTest.py diff --git a/statannotations/stats/__init__.py b/src/statannotations/stats/__init__.py similarity index 100% rename from statannotations/stats/__init__.py rename to src/statannotations/stats/__init__.py diff --git a/statannotations/stats/test.py b/src/statannotations/stats/test.py similarity index 100% rename from statannotations/stats/test.py rename to src/statannotations/stats/test.py diff --git a/statannotations/stats/utils.py b/src/statannotations/stats/utils.py similarity index 100% rename from statannotations/stats/utils.py rename to src/statannotations/stats/utils.py diff --git a/statannotations/utils.py b/src/statannotations/utils.py similarity index 100% rename from statannotations/utils.py rename to src/statannotations/utils.py From a2bad814fc3fc9c53aa69d3b29f123e3aab2a46b Mon Sep 17 00:00:00 2001 From: getzze Date: Tue, 19 Nov 2024 21:44:24 +0000 Subject: [PATCH 14/15] enable end-of-file-fixer and trailing-whitespace --- .pre-commit-config.yaml | 8 +++--- CHANGELOG.md | 58 ++++++++++++++++++++--------------------- CONTRIBUTING.md | 16 ++++++------ usage/samples.tsv | 2 +- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4c515e0..2e4977f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,10 +3,10 @@ repos: rev: v5.0.0 hooks: - id: check-yaml - # - id: end-of-file-fixer - # exclude: '^(.*\.svg)$' - # - id: trailing-whitespace - # exclude: '^(.*\.svg|.*\.tsv)$' + - id: end-of-file-fixer + exclude: '^(.*\.svg)$' + - id: trailing-whitespace + exclude: '^(.*\.svg|.*\.tsv)$' - repo: https://github.com/abravalheri/validate-pyproject rev: v0.23 diff --git a/CHANGELOG.md b/CHANGELOG.md index 500025d..6b7c190 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,15 @@ ## v0.7 ### v0.7.0 #### Features -- Compatibility with pandas v2+ and seaborn above v0.12+ +- Compatibility with pandas v2+ and seaborn above v0.12+ (PR [#155](https://github.com/trevismd/statannotations/pull/155) by [getzze](https://github.com/getzze)) ## v0.6 ### v0.6.0 #### Features -- Add option to skip annotation of non-significant results - (PR [#95](https://github.com/trevismd/statannotations/pull/95) by +- Add option to skip annotation of non-significant results + (PR [#95](https://github.com/trevismd/statannotations/pull/95) by [sepro](https://github.com/sepro)) #### Fixes @@ -21,14 +21,14 @@ #### Additional testing and documentation: - PR [#84](https://github.com/trevismd/statannotations/pull/84) by [JasonMendoza2008 ](https://github.com/JasonMendoza2008) - - PR [#86](https://github.com/trevismd/statannotations/pull/86) by + - PR [#86](https://github.com/trevismd/statannotations/pull/86) by [mbhall88](https://github.com/mbhall88) - PR [#117](https://github.com/trevismd/statannotations/pull/117) by [tathey1](https://github.com/tathey1) ## v0.5.0 - Add scipy's Brunner-Munzel test -- Fix applying statannotations for non-string group labels (Issue +- Fix applying statannotations for non-string group labels (Issue [#65](https://github.com/trevismd/statannotations/issues/65)) - Get Zenodo DOI @@ -36,27 +36,27 @@ - Add MANIFEST.IN (PR [#56](https://github.com/trevismd/statannotations/pull/56) by [Matt Chan](https://github.com/thewchan)) - Limit supported Seaborn version to v.0.11.x -- Fix adding annotations with hue if data is passed as arrays - (PR [#64](https://github.com/trevismd/statannotations/pull/64) by +- Fix adding annotations with hue if data is passed as arrays + (PR [#64](https://github.com/trevismd/statannotations/pull/64) by [getzze](https://github.com/getzze)) ### v0.4.4 -- The label for Kruskal-Wallis test explicitly states that it is run pairwise +- The label for Kruskal-Wallis test explicitly states that it is run pairwise (PR [#40](https://github.com/trevismd/statannotations/pull/40) by [sepro](https://github.com/sepro)) - Fix broken link in readme (PR [#43](https://github.com/trevismd/statannotations/pull/43) by [orena1](https://github.com/orena1)) -- Fix custom annotations order with respect to the given pairs (Issue +- Fix custom annotations order with respect to the given pairs (Issue [#45](https://github.com/trevismd/statannotations/issues/45)) ### v0.4.3 -- The `correction_format` parameter allows changing how the multiple +- The `correction_format` parameter allows changing how the multiple comparisons correction method adjusts the annotation when changing a result to non-significant. - Fix the `show_test_name` configuration. -- Fix the `verbose` parameter - (PR [#37](https://github.com/trevismd/statannotations/pull/37) by +- Fix the `verbose` parameter + (PR [#37](https://github.com/trevismd/statannotations/pull/37) by [mxposed](https://github.com/mxposed)) ### v0.4.2 @@ -68,16 +68,16 @@ to non-significant. - Support for horizontal orientation ### v0.4.0 - - Major refactoring, change to an Annotator `class` to prepare and add + - Major refactoring, change to an Annotator `class` to prepare and add annotations in separate function (now method) calls. - Support for `violinplot` - - Fixes in rendering of non-significant tests results after multiple + - Fixes in rendering of non-significant tests results after multiple comparisons correction - - Fix the printout of the star annotation legend - - Fix the failure when providing a dataframe with categories as different + - Fix the printout of the star annotation legend + - Fix the failure when providing a dataframe with categories as different columns. - - Fix a bug where an incorrect xunits calculation resulted in wrong - association of points within a box, leading to erroneous max y position for + - Fix a bug where an incorrect xunits calculation resulted in wrong + association of points within a box, leading to erroneous max y position for that box. - Reduced code complexity, more SOLID. - Many unit and integration tests @@ -85,13 +85,13 @@ to non-significant. ## v0.3 ### v0.3.2 - Fix `simple` format outputs - - Fix `ImportError` when applying a multiple comparison correction without + - Fix `ImportError` when applying a multiple comparison correction without statsmodels. - - Multiple comparison correction is `None` by default, as `statsmodels` is an + - Multiple comparison correction is `None` by default, as `statsmodels` is an additional dependency. ### v0.3.1 - - Added support of functions returning more than the two expected values when + - Added support of functions returning more than the two expected values when used in `StatTest` - Fix version numbers in CHANGELOG @@ -99,19 +99,19 @@ to non-significant. (Explicitly Requires Python 3.6) - Refactoring with implementation of `StatTest` - ([#7](https://github.com/trevismd/statannotations/pull/5)), removing the + ([#7](https://github.com/trevismd/statannotations/pull/5)), removing the `stat_func` parameter, and `test_long_name`. - - Annotations y-positions based on plot coordinates instead of data - coordinates - (PR [#5](https://github.com/trevismd/statannotations/pull/5) by - [JosephLalli](https://github.com/JosephLalli), + - Annotations y-positions based on plot coordinates instead of data + coordinates + (PR [#5](https://github.com/trevismd/statannotations/pull/5) by + [JosephLalli](https://github.com/JosephLalli), fixes https://github.com/webermarcolivier/statannot/issues/21). - Add this CHANGELOG ## v0.2 ### v0.2.8 - - Fix bug on group/box named 0, fixes + - Fix bug on group/box named 0, fixes https://github.com/trevismd/statannotations/issues/10, originally in - https://github.com/webermarcolivier/statannot/issues/78. Independently - fixed in https://github.com/webermarcolivier/statannot/pull/73 before this + https://github.com/webermarcolivier/statannot/issues/78. Independently + fixed in https://github.com/webermarcolivier/statannot/pull/73 before this issue. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8d04ec8..a1f622d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,21 +1,21 @@ ## Contributing to statannotations -Thank you for your interest! This package is truly the work of multiple +Thank you for your interest! This package is truly the work of multiple developers and participating users and this mustn't change. -Contributions are appreciated in all their forms, such as the opening of new -issues when discovering a (possible) bug, suggestion/upvote new features, +Contributions are appreciated in all their forms, such as the opening of new +issues when discovering a (possible) bug, suggestion/upvote new features, participation to discussions, improvements of the documentation, etc. -If you wish specifically to submit code changes, please use the following +If you wish specifically to submit code changes, please use the following guide: -- [ ] If it is not an answer to an open issue, please consider opening one +- [ ] If it is not an answer to an open issue, please consider opening one first, even more if the changes are major and/or possibly controversial -- [ ] Make sure to have the dev dependencies installed: `packaging` and +- [ ] Make sure to have the dev dependencies installed: `packaging` and `statsmodels` - Fork the repository and make a new branch from the latest `dev` commit -- [ ] Make your code modifications, including unit testing if possible. +- [ ] Make your code modifications, including unit testing if possible. Please follow PEP8 guidelines. - [ ] Run the test suite and make sure previous (and new) tests pass - [ ] Update CHANGELOG.md to describe your changes -- [ ] Open a PR to the `dev` branch, containing at least what was added to the +- [ ] Open a PR to the `dev` branch, containing at least what was added to the changelog, as well as a reference to the issue if any diff --git a/usage/samples.tsv b/usage/samples.tsv index 6b0053f..4bb3b3c 100644 --- a/usage/samples.tsv +++ b/usage/samples.tsv @@ -335,4 +335,4 @@ 333 19VR007759 H1N1 6.0 0.0001313611643853 0.0002392413339425 9.427985028626784e-05 334 19VR008338 H3N2 2.0 4.380988263332443e-05 0.0 6.284963427963806e-05 335 19VR008902 H3N2 9.0 0.0002792880017874 0.0002257062873398 0.0003116800795392 -336 19VR009188 H3N2 27.0 0.0003723840023832 0.0004514879634044 0.0003561862042516 \ No newline at end of file +336 19VR009188 H3N2 27.0 0.0003723840023832 0.0004514879634044 0.0003561862042516 From 02aa6ac6f379ac43034677ede37860621082895e Mon Sep 17 00:00:00 2001 From: getzze Date: Tue, 19 Nov 2024 21:51:54 +0000 Subject: [PATCH 15/15] only exclude 'usage' from sdist --- pyproject.toml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7b34de9..f7e431a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,11 +62,9 @@ Homepage = "https://github.com/trevismd/statannotations" path = "src/statannotations/_version.py" [tool.hatch.build.targets.sdist] -only-include = [ - "/src/statannotations", - # "usage", - # "tests", - # "docs", +exclude = [ + # increases the size too much + "usage", ]